Why I built my own console
I run four machines and about thirty services on them. For two years I checked on all of it by opening a terminal and running the same handful of commands in the same order. It worked until the night I spent forty minutes on a broken photo library that turned out to be a full disk on a completely different box.
The tools that solve this already exist. I tried several. Every one of them wanted more memory than the services it was watching, and none of them told me the one thing I actually needed, which is whether anything is wrong right now. So I wrote Proxima. It is one page. If everything is fine, it is quiet.
Everything is named after something in the sky
Physical machines get planets. The virtual machines running on them get that planet's moons. Anything in the cloud gets a gas, because cloud instances come and go and the noble gases are the ones that do not react with anything.Argon is noble. Argonide, kryptonane and argonene are not real compounds; the suffix carries the role.
jupiter main workstation
├── io git and CI
├── europa notes and files
├── ganymede media
└── callisto spare
mars secondary box, usually off
├── phobos
└── deimos
argon general compute
argonide standby for argon
kryptonane database, stateful
argonene CI runner, dies after every job
This sounds like a joke and it partly is, but it has earned its place. The names are short, they are easy to say out loud, and the shape of the name tells you what kind of thing it is before you look anything up. If I say ganymede you know it is a virtual machine on jupiter. If I say argonene you know it is disposable.
Oh no, hydrogen is down, requests cannot get to callisto.
The console had to be dark
Not because dark mode is fashionable. Because I look at this thing at night, in a room with the lights off, and a white page at 2am is a physical event. But most dark interfaces get one thing wrong: they are grey. Flat grey feels like a settings panel that someone inverted.
So every neutral in Proxima leans slightly blue. The background is #0A0B12, not black. Panels are #12141F. The difference is small enough that you would not name it if you saw it, and large enough that the whole thing feels like a place instead of an absence of light.
Colour then has exactly two jobs, and they never overlap:
- State lives in pills. Green means fine, amber means look at this soon, red means it is broken, blue means this is just information. Every pill has a word in it as well as a colour.
- Data lives in charts, in a separate darker set of colours picked to stay readable on both the dark and light themes.
Red is the one I am strict about. It appears when something is genuinely broken and at no other time. Not for emphasis, not for a big number, not for a delete button that only opens a confirm dialog. That way, when red shows up, I move.
Requests per hour
One line per service
The first version of the services table showed everything at once. Image tag, ports, memory, CPU, restart count, uptime, last deploy. Eleven columns. It was complete and it was useless, because scanning it took longer than running the commands by hand.
Now a service is one line. Name, what it is, which host it is on, two or three facts, and a status pill. That is all. If I want the rest I click the row and it opens: the full detail grid, a note about what is wrong, and the buttons that act on it. The actions live inside the expanded row on purpose. A collapsed row offers exactly one thing to do, which is open it.
The rule I keep coming back to is that density should be something you ask for. A dashboard that dumps everything on you has moved its work onto your eyes.
None of this is clever. Tinted darks, one accent colour, strict colour meanings, hide detail until asked. Each piece shows up in half the tools I admire. What makes it a system rather than a mood is refusing the exceptions: no second bright colour because a chart looked dull, no red on a number that is merely large, no eleventh column because the data happened to be there.
At 2am I do not need more information. I need to already know where to look.
Names used in this note
A
- argon
- General compute in the cloud.
- argonene
- CI runner that is created for a job and destroyed after it.
G
- ganymede
- Virtual machine on jupiter that serves media.
J
- jupiter
- The main workstation and host for four virtual machines.
K
- kryptonane
- Stateful database instance.
The interface in this note is the same design system the rest of this site is built from. The components are documented in the design foundation, and the console itself is the overview page.