Central release & workspace repo for the Mimir platform. This repo holds what the individual component repos shouldn't: the production deployment definition, the pinned release manifest, shared CI workflows, and the developer workspace.
mimir.code-workspace— multi-root VS Code workspace for all Mimir reposbootstrap.sh— clones all component repos as siblings (one-command setup)versions.yml— pinned versions per release channel (the release manifest)PLAN.md— project review, deployment architecture, and roadmapdeploy/— production deployment bundle:docker-compose.yml— pinned GHCR images, no source checkout neededinstall_server.sh— one-shot idempotent server setupmimir-update.sh+.service/.timer— 15-minute self-update loopmosquitto/mosquitto.conf— authenticated LAN listener + anon localhost
sudo mkdir -p /opt/mimir && sudo chown $USER /opt/mimir
git clone https://github.com/ryanlane/mimir-release.git /opt/mimir/mimir-release
bash /opt/mimir/mimir-release/deploy/install_server.sh # creates .env, exits
bash /opt/mimir/mimir-release/deploy/install_server.sh # installs + startsThe server is then accessible at http://mimir.local:8080 on your LAN — no IP address configuration required. Mimir advertises itself via mDNS automatically.
If your network uses VLANs or mDNS doesn't reach your displays, set PUBLIC_HOST
in deploy/.env to the server's LAN IP and re-run the installer.
From then on the server converges to versions.yml every 15 minutes.
mkdir -p ~/projects/mimir && cd ~/projects/mimir
git clone https://github.com/ryanlane/mimir-release.git
./mimir-release/bootstrap.sh
code mimir-release/mimir.code-workspace| Folder | Repo | What |
|---|---|---|
mimir-server |
ryanlane/Mimir-Platform | FastAPI API + React UI + discovery + compose |
mimir-display |
ryanlane/mimir-display | Raspberry Pi display client (Inky / HyperPixel / HDMI / RGB matrix) |
mimir-display-electron |
ryanlane/mimir-display-electron | Electron display client |
mimir-display-magtag |
ryanlane/magtag-circuitpython-display-mimir | MagTag CircuitPython client |
mimir-channel-photoframe |
ryanlane/image-frame-channel-mimir | Photo frame channel plugin |
mimir-channel-spotify |
ryanlane/spotify-status | Spotify status channel plugin |
mimir-docs |
ryanlane/mimir-documentation | Platform documentation |
- Tag a component repo (
vX.Y.Z) → its CI builds images/artifacts. - Open a PR here bumping
versions.yml. - Merge → the production server's update timer converges within ~15 min, then rolls the matching display-client release out to the fleet over MQTT.
Rollback = revert the pin-bump PR.
This repo includes a guarded helper that can read the latest tags, compute
the next versions, update versions.yml, and (optionally) push tags + manifest
changes.
cd ~/projects/mimir/mimir-release
task release:bump # dry-run preview
task release:bump:apply # interactive apply
task release:bump -- --apply
task release:bump:force # apply even if repos are dirty
task release:dirty # list dirty files causing apply blocksDirect script examples:
bash scripts/release_bump.sh --server-bump minor --display-bump patch
bash scripts/release_bump.sh --apply
bash scripts/release_bump.sh --apply --allow-dirty
bash scripts/release_bump.sh --apply --force-unchangedBehavior note:
- Dry-run can execute with dirty working trees (it prints warnings).
- Apply mode requires clean working trees in all participating repos.
- Use --allow-dirty (or task release:bump:force) only when you intentionally want to tag current uncommitted state.
- Before computing a bump, the helper checks whether each repo (mimir-server,
mimir-display) actually has commits since the tag currently pinned in
versions.yml. A component with nothing new is automatically skipped (its tag stays unchanged) rather than publishing a redundant, byte-identical release — so runningtask release:bump:applywhen only the server changed will bump and tag only the server. Pass--force-unchangedto bump/tag a component anyway (e.g. rebuilding after a base-image security patch unrelated to app code). An explicit--server-tag/--display-tagalways wins regardless of git history.task release:bump:apply -- --force-unchanged(orrelease:bump:force) forwards extra flags through.