archipelagoandClaude Opus 5 3ac59a73b3 fix(container): companions follow installed apps, not available manifests
archi-dev-box was running archy-fedimint-ui and archy-lnd-ui with no
fedimint and no lnd container anywhere on the box. The Fedimint Guardian
UI sat on :8175 serving its "waiting for Bitcoin" page forever with
nothing behind it, which is what the operator reported as "fedimint
guardian installs but does not work" — there was nothing to install, the
UI was already up.

The boot reconciler drove companion provisioning from manifest_ids(),
which is every manifest the node can SEE: the whole apps/ directory plus
the signed-catalog overlay, 56 of them. The app reconciler has drawn this
line since phase 3 (ReconcileMode::ExistingOnly, "merely listing a
catalog manifest never installs an unqualified app"); the companion stage
never got the equivalent guard, so it stood up a UI for every app that
merely had a manifest and then self-healed it forever.

The other half is that reconcile() could only ever ADD. remove_for fires
only on the explicit uninstall RPC, so nothing ever subtracted: an
install that failed after its companion landed, or a container removed
by any other route, left a Restart=always unit alive permanently.

- installed_app_ids() replaces manifest_ids(): app ids whose container
  actually exists. Returns Option, because a caller that removes things
  on absence must not read "I could not look" as "nothing is installed".
  Container presence in ANY state is the whole test — it deliberately
  does not inherit the user_stopped/disabled filters, since a stopped app
  is still an installed app and treating it otherwise would tear its
  companion down and rebuild it on the next start.
- manifest_ids() is deleted rather than left unused. Its contract reads
  as "installed" to anyone skimming, which is the whole bug.
- reap_orphans() removes companions whose backend is not installed, after
  ORPHAN_GRACE (300s). The grace period is required, not defensive: this
  node runs ARCHIPELAGO_USE_QUADLET_BACKENDS=true and a Quadlet app is
  briefly containerless while restarting, so reaping on the first absent
  tick would cost a healthy companion a teardown plus a possible 900s
  image rebuild. A backend that reappears clears its clock.
- Reap failures are logged but kept out of the backoff input. Repair
  keeps a companion available; reaping only tidies one away, and a wedged
  reap must not back the repair path off to its 1h ceiling.

Every uncertain signal resolves toward not removing: no unit file and a
hung is-active reads as leave-it-alone.

Container suite 215/215.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 07:08:17 -04:00
2026-03-17 00:03:08 +00:00
2026-08-06 06:27:02 -04: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

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
Operations Runbook Production operations and recovery
Open Source Readiness Public-release cleanup checklist
Roadmap Shipped, in-progress, and planned work
Unified Task Tracker Launch hardening task list
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%