Found while VERIFYINGa05956c4on archi-dev-box rather than assuming it. GET /lnd-connect-info is correctly 401 with no cookies over the LAN address. But POST /bitcoin-rpc/ on :8334 still answered an unauthenticated caller with a real block height, and still carried `Access-Control-Allow-Origin: *`. The node looked patched. Half of it was not. The rendered /var/lib/archipelago/bitcoin-ui/nginx.conf was dated 2026-06-30 — the pre-fix version — even though the running binary carries the new template. a05956c4's commit message claimed the template "is re-rendered on every reconcile pass, so this ships atomically with the binary". That is false in one specific state, and this node was in it: 1. bitcoin-ui sits in the durable user-uninstalled marker. 2. reconcile returns on that marker BEFORE run_pre_start_hooks, which is what renders the config. 3. The container keeps running regardless, because it is owned by systemd via a Quadlet unit (archy-bitcoin-ui.service, active, restarted 17:25 after the daemon restart) — not by this reconciler. So a container systemd keeps alive, that the orchestrator has stopped reconciling, never receives a config fix shipped inside the binary. An OTA carryinga05956c4would have silently failed to close this on every node in that state, while the LND half closed correctly — the most misleading possible outcome. archy-electrs-ui is in the same state on this node, so it is not a one-app accident. A container that is actually running is a live attack surface whatever a marker says about it. Its security-relevant config is now reconciled even behind the marker, and it is restarted so nginx actually loads it. Deliberately narrow: - Nothing is created, pulled, built, started or resurrected. The "must stay removed" contract only ever gets weaker if a container is ALREADY running, which by definition means it was never removed. - A hook error is swallowed, not propagated: an app the user uninstalled must not be able to fail the reconcile pass for everything after it. - The pre-existing marker test still passes unchanged, which is what proves the removal contract survived. Verified: 11/11 reconcile tests and 9/9 bitcoin_ui tests pass, including a new regression test that pins the whole chain — stale conf in, gate present out, container restarted, nothing created. No node has been touched. The live exposure on archi-dev-box stands until this is deployed and the operator restarts archy-bitcoin-ui. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
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.rsis 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:
- Architecture
- Developer Guide
- App Developer Guide
- App Manifest Spec
- Nostr Git Source Hosting Plan
- Operations Runbook
- Troubleshooting
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.