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>
Catalog 26.10-alpha adds Jellyfin (first app to use the core-26.10
path-type setting for host-bind-mounted media libraries) and bumps
the vendored manifest schema to match core. Requires boxes to be on
core 26.10-alpha or newer — the 26.9 manifest parser rejects the
path type.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirror of the core repo's apps/README.md update. Keeps the two copies
in lockstep since app authors may land on either one.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
First app to use the core-26.10-alpha `path` setting type. User picks
their existing media folder (MEDIA_PATH=/mnt/media) in the install
form; core installer validates the path server-side; compose mounts
it read-only at /media. Docker-managed volumes hold /config and
/cache; admin account is created from the first browser visit to
:8096. No HW transcoding yet — that's a later schema extension.
Also bumps the vendored manifest schema in scripts/vendor/ to match
core 26.10-alpha — catches up both the missing `open_url` field (gap
since 26.6-alpha) and the new `path` setting type. No changes needed
to validate-catalog.py itself.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Catalog 26.9-alpha cuts the IT-Tools addition from b2b4793 into a
tagged release so boxes pick it up via on-box sync.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Client-side utility collection (password/UUID/QR generators, hashes,
Base64/JWT, JSON/YAML formatter, regex tester, cron parser, etc.) from
corentinth/it-tools. No state, no volumes, no settings — runs fully in
the browser and serves on port 8080. Good smoke-test target for the
catalog-sync path.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Both apps grow an `open_url` manifest field so the core UI can render
an Open button that deep-links into the app. fileshare uses smb:// to
trigger the OS file manager; uptime-kuma uses http://{host}:3001/ for
the browser. No image or compose changes.
- fileshare 0.1.1 → 0.1.2
- uptime-kuma 1.0.0 → 1.0.1
louislam/uptime-kuma:1 with one data volume and port 3001. Admin
account bootstrapped from the first browser visit to :3001 — no
Furtka settings form needed. Catalog release 26.7-alpha.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Initial layout: apps/fileshare/ (seeded from daniel/furtka apps/), CI
(JSON + manifest validator + shellcheck), release pipeline (tag-driven,
mirrors core repo), vendored manifest schema for offline validation.
The core repo (daniel/furtka) at 26.6-alpha keeps apps/fileshare as a
seed so offline first-boot still has an installable app; this catalog
becomes authoritative once a box has synced at least once.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>