Add over-SSH installer for provisioning the Raspberry Pis #2

Merged
balint merged 2 commits from feat/pi-installer into main 2026-06-06 11:50:11 +01:00
Owner

Hardware testing starts now with more than one Pi to provision and re-provision as the code changes, so installing by hand doesn't scale.

What

  • make piinstall PI=<host> — run from the Mac, once per Pi. Rsyncs the working tree to the Pi and runs the installer over SSH. UPGRADE=1 opts into a full apt-get upgrade; DEST overrides the target dir.
  • scripts/pi_install.sh — the idempotent on-Pi steps: install libportaudio2 + libopus0, bootstrap uv, uv sync --extra pi --extra opus, and an import check so a missing native lib fails at install rather than first call.
  • DECISIONS.md — new project decision log, seeded with the deployment choices made here.

Notes

  • File selection uses git ls-files (tracked + untracked-but-not-ignored), so re-runs never clobber each Pi's own gitignored config.yaml and never ship .venv/caches.
  • uv installs to ~/.local/bin; the script puts it on PATH for its own run, but interactive uv run afterward may need a fresh login shell.

🤖 Generated with Claude Code

Hardware testing starts now with more than one Pi to provision and re-provision as the code changes, so installing by hand doesn't scale. ## What - `make piinstall PI=<host>` — run from the Mac, once per Pi. Rsyncs the working tree to the Pi and runs the installer over SSH. `UPGRADE=1` opts into a full `apt-get upgrade`; `DEST` overrides the target dir. - `scripts/pi_install.sh` — the idempotent on-Pi steps: install `libportaudio2` + `libopus0`, bootstrap `uv`, `uv sync --extra pi --extra opus`, and an import check so a missing native lib fails at install rather than first call. - `DECISIONS.md` — new project decision log, seeded with the deployment choices made here. ## Notes - File selection uses `git ls-files` (tracked + untracked-but-not-ignored), so re-runs never clobber each Pi's own gitignored `config.yaml` and never ship `.venv`/caches. - uv installs to `~/.local/bin`; the script puts it on PATH for its own run, but interactive `uv run` afterward may need a fresh login shell. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Testing starts on real hardware now, with more than one Pi to provision and
re-provision as the code changes. Driving each install by hand doesn't scale,
so `make piinstall PI=<host>` does it from the Mac: rsync the working tree to
the Pi and run the installer over SSH, repeatable per device.

File selection comes from `git ls-files` (tracked + untracked-but-not-ignored)
rather than a plain rsync so re-runs never clobber each Pi's own gitignored
config.yaml, and never ship .venv or caches. The on-Pi steps live in
scripts/pi_install.sh (matching the scripts/ convention) and are idempotent:
the two native libs the app links against, a uv bootstrap, `uv sync`, and an
import check so a missing system library fails at install rather than first
call. A full apt upgrade stays opt-in (UPGRADE=1) to keep re-runs fast.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The planning workflow calls for recording significant decisions where the
rationale survives even when the code doesn't show it. Seed it with the
deployment choices settled while building the Pi installer — transport,
file-selection, and the apt-upgrade-opt-in trade-off — so the next person
(or future me) doesn't re-litigate them.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
balint merged commit d35a11ef47 into main 2026-06-06 11:50:11 +01:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
balint/phone!2
No description provided.