Discover
Scans deployable infraspec apps and shows health, endpoints, services, containers, secrets, snapshots, and metrics targets.
Detect a failing service, rehearse a fix, deploy it, and upgrade the platform without taking your apps down.
signal-sideband was the kind of app that makes a local platform earn its keep: one allocation stayed alive, the other kept restarting, and the fix needed a new image plus careful route and dependency handling. Norn turns that from a pile of tabs into one flow.

First, the dashboard shows the real shape of the app: repo state, update availability, health, instances, endpoints, Postgres, KV, object storage, event topics, secrets, and live logs. It is not just "is a container running?" It answers what the service is, what it depends on, and whether the deployed commit is behind the repo.
Before touching runtime state, run a preflight:
norn preflight signal-sideband HEADPreflight goes through validation, source prep, Docker build, and tests. When the fix is ready, deploy queues into the same durable worker lane as webhooks and rollbacks:
norn deploy signal-sideband HEAD
The live deploy panel and CLI both stream the pipeline. Norn records detailed stage evidence in deployment_steps, while the operations ledger stays compact enough for drain checks, metrics, and incident review.

If an API restart interrupts read-only work, Norn can retry it. If a mutable stage has already started, such as snapshot, migration, Nomad submit, health, forge, or cleanup, Norn fails visibly for operator review instead of blindly replaying side effects.
Norn upgrades itself separately from the apps it runs. The platform lane builds a candidate release, checks it on an alternate port, promotes the release, and restarts only the Norn API process. Nomad, Consul, Postgres, Garage, Redpanda, and hosted app allocations keep running.
norn operations --active
norn platform preflight HEAD
norn platform upgrade HEAD
norn smoke platform
For proxy-fronted hosts, the same release path can switch a managed upstream instead of restarting launchd:

That gives the platform a clean answer to "can I upgrade Norn while this app is deploying?" Active operations are the drain source. Finished releases remain visible and rollbackable.
Each app declares its needs in an infraspec.yaml: processes, ports, health checks, tests, services, secrets, migrations, volumes, cron schedules, functions, metrics, and endpoints. Norn reads the spec and coordinates the runtime pieces.
name: signal-sideband
repo:
url: git@github.com:antiartificial/signal-sideband.git
branch: main
autoDeploy: true
build:
dockerfile: Dockerfile
test: go test ./...
processes:
web:
port: 8080
command: ./sideband serve
health:
path: /healthz
scaling:
min: 2
drain:
signal: SIGTERM
timeout: 30s
metrics:
enabled: true
path: /metrics
media-worker:
command: ./sideband media-worker
scaling:
min: 1
infrastructure:
postgres:
database: signal_sideband
kv:
namespace: signal-sideband
objectStorage:
bucket: signal-sideband-media
kafka:
topics:
- signal.received
- signal.replayed
secrets:
- SIGNAL_NUMBER
- DATABASE_URL
- GARAGE_ACCESS_KEY
endpoints:
- url: sideband.slopistry.com
volumes:
- name: signal-sideband-media
mount: /var/lib/signal-sidebandThe same model covers web services, workers, cron, and functions:


Routes are inspectable before and after deployment:

When the fix is not obvious, the operator surfaces stay close:


norn status
norn app signal-sideband
norn preflight signal-sideband HEAD
norn deploy signal-sideband HEAD
norn deploy steps <deployment-id>
norn operations --active
norn events --app signal-sideband
norn endpoints signal-sideband
norn platform proxy-plan
norn smoke platform
Norn is local-first infrastructure with enough memory to be trusted: specs declare intent, workers execute operations, stages leave evidence, upgrades respect active work, and the dashboard/CLI tell the same story.