devmachine

How it works

What a new machine starts with

setup and machines add write a new machine with one package, essentials. It installs nothing itself; it pulls in the packages almost every server wants:

PackageWhat it gives the machine
basethe everyday tools, and a shared tmux setup
gitgit
firewalla firewall that lets SSH, HTTP and HTTPS in
ssh_hardeningpassword logins kept off on every sync
caddyCaddy, to publish sites with HTTPS
devmachine-appwhat the macOS app reads from the machine

--no-essentials starts the machine with none of it.

On a Mac

essentials runs only on Linux: a firewall, SSH hardening and Caddy have no macOS version, and sync refuses the package on a Mac. So when the machine turns out to be a Mac, setup and machines add start it with base and devmachine-app instead, and with the package manager package (mac-brew or mac-ports) that installs Ansible there. They print one line that says so:

studio is a Mac and essentials runs only on Linux, so it starts with base and devmachine-app instead.

The system is not known until the CLI connects, which is after the machine’s packages are chosen, so the swap happens at that moment. It only replaces the default: with --no-essentials the Mac starts with the package manager package alone. Only what the pinned package release has goes in, as with essentials itself.

Why a default, and not a question

Nearly everyone wants these. A question at setup is one more thing a new user has to understand before they have seen anything work, and a list they must remember to add is a list they forget. So the choice is to leave them out, not to put them in.

Why Docker is not in it

Docker is large and runs a daemon all the time, and plenty of machines never run a container. Add it with devmachine packages add docker when you want it.

Why the macOS app’s package is in it

The macOS app does not read a machine over plain SSH. It calls three small scripts through devmachine run --package devmachine-app:

  • context — the sessions running in a workspace, for the session list;
  • stats — memory, disk, load, containers and ports, for the health view;
  • caddy-logs — the tail of Caddy’s log.

Without the package, the app finds nothing to call and shows no sessions. Nothing in the app tells you a package is missing on the server side, and the app may be installed months after the machine was set up — long after anybody remembers there was a package to add. Shipping it with every new machine means the app just works, whenever it arrives.

The cost is low. The three scripts only read: they change nothing on the machine, open no port, and run nothing in the background. They only run when something calls them. They also work on a machine without Docker (stats reports no containers instead of failing).

A machine set up before

A machine set up before essentials held devmachine-app gets it on its next sync after devmachine packages pin moves it to a package release that has it. A machine started with --no-essentials does not: add it with devmachine packages add devmachine-app --machine <name> if you use the app.