Compare commits

...

5 commits

Author SHA1 Message Date
0fcdc878a9 chore: release 26.12-alpha
Some checks failed
Release / release (push) Successful in 28s
CI / shellcheck (push) Failing after 10m40s
CI / validate (push) Failing after 10m51s
2026-04-28 14:03:55 +02:00
1c14446434 feat(home-assistant): add smart-home hub to the catalog (closes #1)
All checks were successful
CI / validate (push) Successful in 17s
CI / shellcheck (push) Successful in 50s
Bridge-mode networking with explicit 8123:8123 port mapping. Image is
homeassistant/home-assistant:stable — upstream's recommended production
tag, same image as the Docker Hub link in #1.

One Docker-managed volume (`furtka_home-assistant_config`). No
manifest.settings — onboarding (admin user, home location, units) is
the standard Home Assistant in-browser flow on first visit to :8123,
same shape as Jellyfin and Uptime Kuma.

Cloud integrations (Hue Cloud, Tado, Sonos via account) work today.
Local-discovery integrations that need host networking, Bluetooth, or
Zigbee/Z-Wave dongle passthrough are explicitly deferred — listed as
a follow-up once the manifest schema grows a network_mode knob.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 12:17:11 +02:00
b1dadbc952 chore: release 26.11-alpha
All checks were successful
CI / validate (push) Successful in 5s
CI / shellcheck (push) Successful in 13s
Release / release (push) Successful in 5s
Catalog 26.11-alpha rolls up the Jellyfin compose default-substitution
fix (already on main as 2a31a79) into a tagged release so the
validator CI goes green on every post-Jellyfin commit.

No app additions or schema changes — core 26.11-alpha (auth) is the
substantive release this cycle, catalog just clears its CI red X.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 13:01:55 +02:00
57593d98a7 chore: retrigger CI
All checks were successful
CI / validate (push) Successful in 15s
CI / shellcheck (push) Successful in 36s
Forgejo Actions did not pick up the push of 2a31a79 (fix(jellyfin)
default-substitution) — no ci.yml task registered 10+ min after the
push landed. Empty commit forces a fresh webhook trigger so the
validator fix can go green. Same Forgejo hiccup also dropped
ci.yml for core 577c246 earlier.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 12:26:15 +02:00
2a31a7927c fix(jellyfin): use compose default-substitution so validator passes
Some checks are pending
CI / validate (push) Waiting to run
CI / shellcheck (push) Waiting to run
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
5 changed files with 96 additions and 2 deletions

View file

@ -6,6 +6,34 @@ Versioning: CalVer (`YY.N`) — same scheme as the core Furtka repo.
## [Unreleased]
## [26.12-alpha] - 2026-04-28
### Added
- **Home Assistant** (v1.0.0, image `homeassistant/home-assistant:stable`,
daniel/furtka-apps#1). Smart-home hub for lights, sensors, and locally
controlled devices. Bridge-mode networking with explicit `8123:8123`
port mapping for v1 — Cloud integrations (Hue Cloud, Tado, Sonos via
account) work, mDNS/Bluetooth/Zigbee-stick discovery deferred until a
manifest `network_mode` knob lands. One Docker volume (`config`),
no manifest settings — onboarding (admin user, home location, units)
happens in the browser on first visit to `:8123`.
## [26.11-alpha] - 2026-04-21
### Fixed
- **Jellyfin compose default-substitution.** Without an `.env` in the
jellyfin app dir the CI validator's `docker compose config` step
substituted an empty `${MEDIA_PATH}` into `:/media:ro` — which
compose rejects as `empty section between colons`. Changed the
spec to `${MEDIA_PATH:-/nonexistent}:/media:ro` so the CI syntax
check always sees a valid volume even with no env file. Real
install flow (form fill → .env with user path) is unchanged; a
broken install that reaches `docker compose up` with no
MEDIA_PATH now fails loudly on a nonexistent bind target instead
of silently mounting something random.
## [26.10-alpha] - 2026-04-21
### Added
@ -72,7 +100,9 @@ Versioning: CalVer (`YY.N`) — same scheme as the core Furtka repo.
the vendored `furtka.manifest.load_manifest` + cross-checks compose
volume references).
[Unreleased]: https://forgejo.sourcegate.online/daniel/furtka-apps/compare/26.10-alpha...HEAD
[Unreleased]: https://forgejo.sourcegate.online/daniel/furtka-apps/compare/26.12-alpha...HEAD
[26.12-alpha]: https://forgejo.sourcegate.online/daniel/furtka-apps/releases/tag/26.12-alpha
[26.11-alpha]: https://forgejo.sourcegate.online/daniel/furtka-apps/releases/tag/26.11-alpha
[26.10-alpha]: https://forgejo.sourcegate.online/daniel/furtka-apps/releases/tag/26.10-alpha
[26.9-alpha]: https://forgejo.sourcegate.online/daniel/furtka-apps/releases/tag/26.9-alpha
[26.8-alpha]: https://forgejo.sourcegate.online/daniel/furtka-apps/releases/tag/26.8-alpha

View file

@ -0,0 +1,38 @@
# Furtka Home Assistant — smart-home hub.
#
# Bridge networking + explicit `8123:8123` port mapping. Upstream's own
# docs lean toward `network_mode: host` because that's what mDNS-based
# discovery, Bluetooth, HomeKit, and Zigbee/Z-Wave dongles need. We're
# deliberately starting in bridge mode for v1: it keeps the catalog's
# network model consistent (every other app is bridged), and Cloud-only
# integrations (Hue Cloud, Tado, Sonos via account, etc.) work fine.
# Host networking + USB passthrough is a follow-up once the manifest
# schema grows a `network_mode` knob.
#
# Image pin: `homeassistant/home-assistant:stable` is upstream's
# recommended tag for production — release-train, not bleeding edge.
# Same image as the Docker Hub link Robert pointed at in the new-app
# request (#1).
#
# No HEALTHCHECK override needed: the upstream image's healthcheck is
# tame, and a temporarily-yellow status during the first-boot DB
# migrations is expected behaviour.
#
# No manifest.settings — Home Assistant's onboarding (admin user, home
# location, units) happens entirely in the browser on first visit, just
# like Jellyfin and Uptime Kuma. Nothing for the install form to ask.
services:
homeassistant:
image: homeassistant/home-assistant:stable
restart: unless-stopped
ports:
- "8123:8123"
environment:
- TZ=Europe/Berlin
volumes:
- furtka_home-assistant_config:/config
volumes:
furtka_home-assistant_config:
external: true

View file

@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<path d="M10 30 L32 10 L54 30 V52 H10 Z"/>
<circle cx="32" cy="36" r="5"/>
<path d="M32 10 V4 M22 22 L18 18 M42 22 L46 18"/>
<path d="M22 44 H42"/>
</svg>

After

Width:  |  Height:  |  Size: 341 B

View file

@ -0,0 +1,11 @@
{
"name": "home-assistant",
"display_name": "Home Assistant",
"version": "1.0.0",
"description": "Smart-home hub for lights, sensors, and locally controlled devices.",
"description_long": "Steuere Lampen, Heizung, Sensoren und Smart-Home-Geräte von einem zentralen Dashboard aus. Beim ersten Aufruf im Browser unter http://furtka.local:8123 wird das Admin-Konto angelegt und die Wohnung eingerichtet. Zigbee-/Z-Wave-USB-Sticks und automatische Geräteerkennung über mDNS/Bluetooth sind in dieser ersten Version noch nicht verdrahtet — die App läuft im Bridge-Modus auf Port 8123. Cloud-Integrationen (Hue Cloud, Tado, Sonos via Account) funktionieren ohne Einschränkung.",
"volumes": ["config"],
"ports": [8123],
"icon": "icon.svg",
"open_url": "http://{host}:8123/"
}

View file

@ -10,6 +10,15 @@
# the directory exists and isn't a system path, and docker-compose
# substitutes the value below at `docker compose up` time.
#
# The `${MEDIA_PATH:-/nonexistent}` default-substitution keeps
# `validate-catalog.py` (which runs `docker compose config` without any
# .env) from failing on the empty-string case: an empty MEDIA_PATH
# would expand to `:/media:ro` which compose rejects as "empty section
# between colons". /nonexistent is an obviously-wrong fallback so if it
# ever actually reaches `docker compose up` (which requires a broken
# install flow), the mount fails loudly instead of silently mounting
# something random.
#
# TODO(image-pin): `:latest` is shaky for production — pin to a digest
# (`jellyfin/jellyfin@sha256:...`) or a stable tag once we've verified
# one against the upstream registry. MVP drift risk accepted.
@ -29,7 +38,7 @@ services:
volumes:
- furtka_jellyfin_config:/config
- furtka_jellyfin_cache:/cache
- ${MEDIA_PATH}:/media:ro
- ${MEDIA_PATH:-/nonexistent}:/media:ro
volumes:
furtka_jellyfin_config: