Projects — one landing, many repos
satelle's web service is adaptive: satelle serve (and the background
service) takes no multi-project flag. The root (/) is always a
connected-projects landing — a launcher listing every registered project —
and every repo, including the one you launched from, is served under its own
path prefix (/<slug>/). A single-repo setup is just the case with one project
on the landing.
The model
/→ the landing. The root is a launcher: one card per project with live story/task/doc counts, plus a panel for adding a project, opening help, and keeping the binary current. It is not any single repo's project page.- Every project →
/r/<slug>/. Each registered repo — the launch repo ([service].repoin the global config, set bysatelle service install) and every repo added withsatelle workspace add— is listed on the landing and served under/r/<slug>/. The slug is the repo directory's basename. Basenames must be unique across the workspace: seeding a second repo with a colliding basename is rejected. Legacy colliding partitions (if any) render under their fullrepo_keyso landing links stay unique. /projectsredirects to/(back-compat for older links).
So adding a project is additive: a new card appears on the landing and the
repo is served at its /<slug>/.
Adding another project to a running service
Use the workspace registry — do not re-run service install:
satelle workspace add /path/to/other-repo
The running service notices the registry change within a few seconds and starts
serving it at /<slug>/, with a fresh card on the landing — no restart.
satelle workspace remove <path> stops serving it; satelle workspace list
shows the registry.
When the UI looks stale
The web UI is a push-fed mirror: the CLI posts a snapshot as each mutating
verb finishes, and the service renders that copy. A push that never lands — the
service was restarting (satelle update cycles it), down, or unreachable — used
to leave the mirror on its last good frame forever, which reads as a stuck story
rather than a stale view.
The service now re-requests a snapshot for every project it renders: once at startup — which is what repairs the push a restart just swallowed — and then every five minutes, so a dropped push repairs itself within that bound without you doing anything. Two things you may still see:
-
A
stale · last update <time>chip on the landing row or the project header. That means the service could not re-request state — so the frame is presented as unconfirmed, never as current. Check that the service is running (satelle service status) and thatsatelleis installed beside it. -
Nothing changed after a mutation. Re-seed by hand from the repo:
satelle workspace addThat is the manual recovery path — the same verb you joined with — and it is always safe to re-run.
The per-repo database stays the source of truth throughout; the mirror is only a read-only copy of it.
When to use service install vs workspace add
satelle workspace add <repo>— register a project in the workspace registry and seed the push-fed serve mirror.[server] endpointis required to seed; it usually lives in gitignored.satelle/satelle.local.toml. When unset and a local serve is running at the service port,workspace addwrites that endpoint into local.toml and seeds in one command. Without a reachable serve it still registers but exits non-zero with the exact remedy. Later mutations push automatically. The project appears on the landing and is served at/r/<slug>/(basename of the repo path). A colliding basename with an already-seeded partition fails closed with a clear error — rename the directory and re-run.satelle service install— install or reconfigure the service itself (port, bind address, and which repo is the launch/working-directory repo). Re-running it with no--repopreserves the saved repo; passing--repo <repo>changes the launch repo. It does not move anything off/— the landing is always at/.
Where settings live
- Global, machine-wide:
~/.satelle/config.toml(override the directory withSATELLE_HOME). Holds[service](port/addr/launch repo),[workspace](the registered repo paths),[agent](the reviewer CLI), and[ui](light/dark theme, shared across repos). Safe to hand-edit. - Per-repo:
<repo>/.satelle/— that repo'ssatelle.toml, itssatelle.db(the source of truth for its stories/tasks/docs), and its authored markdown. Project data never leaves the repo.
Keeping the binary current
satelle update self-updates the installed binary to the latest release
(sha256-verified) and restarts the service. satelle update --check reports
whether an update is available without installing.
Mirrored from satelle’s built-in help. Read it in the binary with
satelle help projects, or see the canonical source in the
satelle repo.