archipelagoandClaude Opus 5 ec0cfd1b7d fix(container): unwire the companion reaper — absence is not uninstallation
Caught on archi-dev-box within minutes of deploying 3ac59a73: the reaper
removed archy-bitcoin-ui and archy-lnd-ui, whose backends ARE installed.
archy-bitcoin-ui was gone for 36 minutes, until the operator reinstalled
bitcoin-knots and `reconcile` put the companion back.

Not a logic error — the arithmetic did what it was told. The inputs were
false. Both backends' containers were missing because of the clean-exit
vanishing bug (8908fb4f), and both had already aged out of
running-containers.json, which only ever records what is CURRENTLY RUNNING.
So the two signals `installed_app_ids` combines are not independent: one root
cause falsifies both simultaneously. ORPHAN_GRACE could not help either — the
condition was persistent, not transient, which is exactly the case the grace
period cannot distinguish.

The asymmetry decides it. An un-reaped orphan costs a stale UI tile. A
wrongly-reaped companion costs a working screen and turns one lost app into
two — the reaper amplifies the very failure it was meant to tidy up after.

`reap_orphans` and its tests stay, documented as NOT TO BE WIRED until a
durable record of "this app is installed" exists to drive it. Inferring
installation from runtime state cannot answer that question, however many
runtime signals are combined.

The provisioning half is untouched and is the actual fix for "fedimint
installs but does not work": driving `reconcile` from installed_app_ids means
a companion is never stood up for an app nobody installed, so no NEW orphans
appear. The one genuine orphan on this node (archy-fedimint-ui, for an app
never installed) was correctly removed before this change landed.

Unit tests passed the reaper because they verify the set arithmetic, not
whether the "installed" signal is truthful. Only the device could show that.

Container suite 221/221.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 12:08:48 -04:00
2026-03-17 00:03:08 +00:00

Archipelago

Self-sovereign Bitcoin node OS and manifest-driven app platform.

Archipelago is a bootable personal server OS for Bitcoin infrastructure, self-hosted apps, mesh communication, decentralized identity, and federation. Apps are packaged as declarative manifest.yml files and run as rootless Podman containers managed by the Rust backend.

Debian 13 License Rust Vue.js Version

What is here

  • core/ - Rust workspace: backend API, container runtime, security, OpenWrt helpers, and performance/resource management.
  • neode-ui/ - Vue 3 + TypeScript frontend.
  • apps/ - app manifests and custom app container sources.
  • docker/ - supporting container build contexts for UI companion surfaces.
  • image-recipe/ - bootable image/ISO build inputs.
  • Android/ - Android companion app.
  • scripts/ - development, release, deployment, and validation tooling.
  • docs/ - architecture, app packaging, operations, API, and roadmap docs.

Platform model

Archipelago is built as a developer-ready app platform, not a fixed appliance:

  • Apps are declared in apps/<app-id>/manifest.yml.
  • The Rust parser in core/container/src/manifest.rs is the canonical schema.
  • The orchestrator compiles manifests to rootless Podman/Quadlet runtime state.
  • App data lives under /var/lib/archipelago/<app-id>/.
  • Secrets are generated or read from /var/lib/archipelago/secrets/ and injected through Podman secrets rather than static environment values.
  • Release and app catalogs are signed and verified against a pinned trust anchor.

Start with:

Quick start

Frontend

cd neode-ui
npm install
npm start

The dev UI runs at http://localhost:8100 with a mock backend on :5959.

Backend

cd core
cargo build
cargo test --all-features

Linux is the supported backend runtime and release-build target. macOS is fine for frontend work and many Rust compile/test loops, but host integration tests that touch Podman, systemd, networking, or image build paths require Linux.

App manifests

./scripts/validate-app-manifest.sh apps/filebrowser/manifest.yml
python3 scripts/generate-app-catalog.py
python3 scripts/check-app-catalog-drift.py --release --strict

scripts/generate-app-catalog.py requires Python with PyYAML installed.

Documentation map

The full, grouped index lives at docs/README.md. The most common entry points:

Doc Purpose
Architecture System layers, crates, data paths, security model
Developer Guide Local setup, code workflow, testing
API Reference JSON-RPC API overview
App Developer Guide How to package and test apps
App Manifest Spec Manifest schema and validation rules
Nostr Git Source Hosting Plan ngit/NIP-34 contribution workflow and maintainer model
Apps README Packaged app catalog overview
Image Recipe Bootable image build flow
Roadmap Shipped, in-progress, and planned work
Archive Historical plans, audits, and handoffs

Contributing

Read CONTRIBUTING.md before opening a pull request. For security issues, follow SECURITY.md and do not open a public issue.

License

Archipelago is licensed under the MIT License. Third-party notices are listed in NOTICE and generated license inventories in component release artifacts.

S
Description
No description provided
Readme MIT
3 GiB
2026-07-24 08:06:36 +00:00
Languages
Rust 42.1%
Vue 21.5%
TypeScript 15.2%
Shell 8.2%
JavaScript 5.5%
Other 7.5%