Language · We run it ourselves
The glue that runs on the server: deployment, backups, recovery and the small operations nobody wants to do by hand twice.
Shell scripts are the least admired code in any repository and the most read during an incident. That inverts the usual priorities: nobody optimises a deploy script, and everybody reads it on the worst night of the quarter.
01
A deployment written down is a deployment somebody other than its author can run. The alternative is a sequence of commands living in one person's history, which works until the night that person is unreachable — and that is the night it is needed.
02
Scripts are written to be re-runnable rather than to be run once. An operation that half-succeeds and cannot be repeated is worse than one that fails cleanly, because recovery then starts with working out how far it got.
03
Backups get a script for the same reason they get a schedule: a backup nobody has restored is a hypothesis. Writing the restore path down is what turns it into a procedure, and it is the half most estates skip.
04
It stays shell only while it stays legible. Branching on more than a couple of conditions, parsing anything structured, or needing to be tested is the signal to move it into a real program — we have both in our own repositories, and the boundary is a judgement made once rather than a slope somebody slides down.
05
None of this is on the site you are reading: this one deploys with a push and a single build script, and that difference is itself the argument on the hosting entry. Infrastructure work is real engineering and worth naming, and the best outcome is usually not needing it.
An entry that cannot point at something you can open, run or read does not compile. That is a property of the type, not a promise in a paragraph.
Invariant
Shell is a poor language for anything with structure. It has no types, error handling is a discipline rather than a feature, and quoting mistakes fail in ways that look like success — a script that silently does nothing is the characteristic bug. Past roughly a hundred lines or the first time it must parse something, the correct move is to stop and write a program, and treating that threshold as optional is how a deploy script becomes the least reviewed critical system in a company.