Skip to main content
.nigelsmith

Projects

Infrastructure I run, websites I've shipped, and a few games and tools in progress.

one host · four repos · ci/cd pipeline

Three games accessible by one SSH command.

Four Go services behind a single SSH port on one EC2 instance, and every save streamed to S3 so the box underneath is one I can throw away.

ndsmith — ssh-farm 🌾 — ssh play.ssharcade.dev — 120×40
ssh→lobby→the farm→plant→board~39s · loops

ssh play.ssharcade.dev

No account, no client, no install. If you have an SSH client you already have everything.

  • Farm

    online

    Plant, water, wait. A save that keeps growing while you are gone.

    select farm in the menu

  • Moon Miner

    online

    Work an asteroid belt on radar. Cycle views with V.

    select moonminer in the menu

  • Chess

    offline

    Play the board over the wire.

    awaiting first release

Your key is your account.

Same key, same saves, any game. The router hashes your public key and forwards that identity inward, so there is nothing to sign up for and nothing to remember — and no game ever sees the key itself.

$ git push origin main

Hover a stage for the commands it runs.

Five stages, one way, once per merge to main. Pick a stage to see the commands it runs, or read the release.yml walkthrough in the write-up.

The delivery path, in order: Commit — task branch → PR, never main. main deploys for real. Then Test — go vet ./..., go build ./..., go test -race ./.... Runs again on release. Never skipped. Then Publish — ghcr.io/…:latest, :sha-b8315db. Auth is the run's own token. Nothing stored. Then Deploy — docker compose pull, docker compose up -d. Runs on the box, not over SSH. Then Live — ● ONLINE, ~15s. Prober confirms the new version.
$0/mo
Marginal cost of the next game on the box
0s
Measured RPO in a kill-drill (60s budget)
~0s
Merge to live, tests included
0
Public port for the whole fleet