-
26.17-alpha
Pre-releaseAll checks were successfulBuild ISO / build-iso (push) Successful in 18m3sCI / lint (push) Successful in 27sCI / test (push) Successful in 1m22sCI / validate-json (push) Successful in 25sCI / markdown-links (push) Successful in 13sRelease / release (push) Successful in 12m13sreleased this
2026-05-11 20:10:04 +02:00 | 2 commits to main since this releaseAdded
- App-to-app dependencies. Manifests gain an optional
requires
array; each entry names a provider app plus two optional hook scripts
that live in the provider's folder.on_installruns once via
docker compose execagainst the provider's running container while
the consumer is being installed (use case:mosquitto_passwda new
MQTT user for the consumer).on_startruns every boot during
reconcile, before the consumer's container starts (use case: make
sure the user still exists after a Mosquitto wipe). Hook stdout
parses asKEY=VALUElines and optionalFURTKA_JSON: {…}sentinel
lines, both validated against the existingSETTING_NAMEregex; the
values get merged into the consumer's.env(hook wins on conflict)
and the placeholder-secret check runs again over the merged file so
a hook returningMQTT_PASS=changemeis refused the same way an
unedited.env.exampleis. POST /api/apps/install/plan. New read-only endpoint that
returns the topo-sorted install order for a target app plus per-app
summaries (display_name, version, has_settings, installed flag). The
catalog UI calls this before opening the settings dialog so it can
show a confirm modal — "Installing zigbee2mqtt also installs
Mosquitto" — before anything mutates. Circular dependencies surface
as400 {error: "circular dependency: A -> B -> A"}; missing
providers as400 {error: "required app 'X' not found …"}./var/lib/furtka/install-plan.json(overridable via
FURTKA_INSTALL_PLAN). The HTTP install endpoint writes this before
it spawns the systemd-run background job so the runner knows the
full chain to pull → create volumes → fire hooks →compose upfor
in plan order. The runner consumes the file after reading so a stale
plan from a previous install can't accidentally steer the next one.
Changed
furtka reconcilenow visits apps in dependency order, not
alphabetical. Topo-sort overrequiresputs providers before
consumers so a consumer'son_starthook can talk to an already-up
provider. Within a tier, ties stay alphabetical so boot logs are
still deterministic across reboots. Apps with unresolvablerequires
(missing provider) are visited last; the per-app error-isolation in
reconcile then catches them without aborting the whole sweep.POST /api/apps/installrequiresconfirm_dependencies: true
when installing a named app would pull in transitive providers.
Without the flag, the endpoint returns409plus the full plan body
so the UI can render the confirm dialog without a second round-trip.
Lone-target installs (no transitive deps) keep the existing
one-click flow — no UX change forfileshare-style standalone apps.furtka app install <name>and the web UI now install transitive
dependencies automatically.furtka app install /path/to/dir
stays as today (single-app, dev/test workflow).compose_execandcompose_exec_scripthelpers in
furtka/dockerops.py. Both pass-T(no TTY) so they work from the
install runner and from reconcile; both raiseDockerErroron
non-zero exit or timeout.compose_exec_scriptstreams the script
body via stdin tosh -sso hooks don't need to be baked into the
provider's container image.
Notes
- Hook target service: v1 auto-picks the first service in the
provider's compose config. Works for Mosquitto, Postgres, Redis.
Multi-service providers (Authentik server+worker) will need an
optionalservicefield on the requirement entry; deferred until a
real case lands. - Hook timeouts:
on_install60 s,on_start30 s. Hardcoded for
v1 — revisit if a DB seed legitimately needs longer. - Removing an app is now blocked (
409 {dependents: […]}from the
API, exit 2 from the CLI) when other installed apps require it.
Downloads
-
Source code (ZIP)
3 downloads
-
Source code (TAR.GZ)
1 download
-
furtka-26.17-alpha.iso
4 downloads · 1.4 GiB
-
furtka-26.17-alpha.tar.gz
0 downloads · 72 KiB
-
furtka-26.17-alpha.tar.gz.sha256
5 downloads · 92 B
-
release.json
3 downloads · 173 B
- App-to-app dependencies. Manifests gain an optional