No description
Find a file
Daniel Maksymilian Syrnicki 2a31a7927c
Some checks are pending
CI / validate (push) Waiting to run
CI / shellcheck (push) Waiting to run
fix(jellyfin): use compose default-substitution so validator passes
Without a .env in the jellyfin app dir, validate-catalog.py's
\`docker compose config\` step substituted \${MEDIA_PATH} → empty →
\`:/media:ro\` which compose rejects ("empty section between colons"),
failing CI on every post-Jellyfin commit. Local runs skipped the
check because the validator gates it on \`which docker\` and my dev
box has none.

Fix: use the default-substitution form \${MEDIA_PATH:-/nonexistent}.
Empty/unset MEDIA_PATH now expands to /nonexistent — valid volume
spec, CI green. Real install flow (form fill → .env with real path)
substitutes the user value as before. /nonexistent is obviously
wrong, so if a broken install path ever reaches \`docker compose up\`
the mount fails loudly rather than silently mounting something
random.

Doesn't affect the already-published 26.10-alpha catalog tarball —
that one works end-to-end for the Web UI install flow. This fix is
purely to un-red CI on subsequent pushes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 12:18:57 +02:00
.forgejo/workflows chore: bootstrap furtka-apps catalog repo 2026-04-20 14:14:50 +02:00
apps fix(jellyfin): use compose default-substitution so validator passes 2026-04-21 12:18:57 +02:00
scripts feat(jellyfin): add media-server app using new path-type setting 2026-04-21 11:40:29 +02:00
.gitignore chore: bootstrap furtka-apps catalog repo 2026-04-20 14:14:50 +02:00
CHANGELOG.md chore: release 26.10-alpha 2026-04-21 11:48:33 +02:00
README.md chore: bootstrap furtka-apps catalog repo 2026-04-20 14:14:50 +02:00

furtka-apps

Apps catalog for Furtka. Each release here ships a tarball that running Furtka boxes pull via the daily catalog-sync timer (see furtka.catalog in the core repo). Apps update on their own cadence, independent of Furtka's core OS release schedule.

Repo layout

apps/                  # one folder per app
  <name>/
    manifest.json      # JSON schema — see ./apps/README.md
    docker-compose.yaml
    .env.example       # if the app has user-facing settings
    icon.svg
scripts/
  build-catalog-tarball.sh    # bundle apps/ + VERSION into furtka-apps-<ver>.tar.gz
  publish-catalog-release.sh  # upload tarball + sha256 + release.json to Forgejo
  validate-catalog.py         # CI guardrail — manifest + compose syntax
  vendor/
    furtka_manifest.py        # copy of daniel/furtka furtka/manifest.py
.forgejo/workflows/
  ci.yml             # JSON + manifest + shellcheck on every push/PR
  release.yml        # tag push → build tarball → publish to Forgejo releases

Adding an app

See apps/README.md for the manifest schema, volume namespacing rules, .env.example guardrails, and the SVG sanitiser limits the Furtka UI enforces on icon.svg.

Shape of a new app PR:

  1. Add apps/<name>/ with all four files.
  2. python3 scripts/validate-catalog.py locally — must go green.
  3. Open a PR. CI runs the same validator + shellcheck.
  4. Merged to main — next catalog release will include it.

Cutting a release

Follows the same CalVer + tag-driven pattern as daniel/furtka:

# Bump CHANGELOG.md [Unreleased] → [<version>] section, commit:
git commit -m "chore: release <version>"
git tag -a <version> -m "Release <version>"
git push origin main
git push origin <version>

Tag push fires .forgejo/workflows/release.yml. Needs FORGEJO_RELEASE_TOKEN secret (PAT with write:repository on this repo).

Trust model

Releases are unsigned (SHA256 sidecar only). Boxes verify the sidecar against the downloaded tarball before extracting anything. Same posture as daniel/furtka core releases — PGP is a deferred cross-repo migration.

Relationship to daniel/furtka

  • The core repo still ships apps/fileshare/ as a seed inside the Furtka release tarball. That's the offline/first-boot fallback.
  • When a box has synced the catalog at least once, the resolver (furtka.sources.resolve_app_name) prefers the catalog copy.
  • Already-installed apps don't auto-reinstall on catalog updates — user hits "Reinstall" in /apps when they want the new version. Settings are merge-preserved.