--- # ts-CATALOG: canonical deployment characteristics for all DAM ts-* services. # Read by skill:ts-app-deploy to make smart, per-app decisions about # compose configuration (which DB service to include, what port to use, # what env vars to set, etc.). schema_version: 1 # Allowed enum values for each categorization field. # Keep these in sync if you add new categories. enums: db: - none - sqlite - postgres - mysql - mariadb architecture: - single - app_db - app_db_cache - multi_service first_run: - setup_wizard - auto - seeded - none test_status: - untested - in_progress - verified - broken apps: # ============================================================ # VERIFIED (end-to-end tested on the Mac mini) # ============================================================ - service: vikunja display_name: Vikunja image: vikunja/vikunja image_tag: "0.24" port: 3456 db: postgres architecture: app_db first_run: setup_wizard test_status: verified test_date: 2026-08-02 repo: https://gitea.damconsulting.llc/dam/ts-vikunja notes: | - PUBLICURL/FRONTENDURL must match access URL or 404 on root. - DB host must be 127.0.0.1 (not "db") due to network_mode namespace sharing. - DB password and JWT secret required. - When using Headscale, hardcode the hostname in serve.headscale.json. # ============================================================ # CATEGORIZED (educated guess from known docs/patterns). # Marked "untested" until verified on the Mac mini. # ============================================================ - service: adguard display_name: AdGuard Home image: adguard/adguardhome image_tag: latest port: 3000 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-adguard - service: appflowy display_name: AppFlowy image: appflowyio/appflowy_cloud image_tag: latest port: 8000 db: postgres architecture: multi_service first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-appflowy notes: | Has its own appflowy_server + gotrue components. Consider single postgres. - service: authentik display_name: Authentik image: ghcr.io/goauthentik/server image_tag: latest port: 9000 db: postgres architecture: app_db_cache first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-authentik notes: | Needs Redis in addition to Postgres. Check for worker/redis services. - service: babybuddy display_name: Baby Buddy image: linuxserver/babybuddy image_tag: latest port: 8000 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-babybuddy - service: bookstack display_name: BookStack image: linuxserver/bookstack image_tag: latest port: 80 db: mariadb architecture: app_db first_run: setup_wizard test_status: verified test_date: 2026-08-02 repo: https://gitea.damconsulting.llc/dam/ts-bookstack notes: | linuxserver image — see /config/www/.env in the running container for the actual env var names this image expects. Generate APP_KEY with the image's `appkey` command. - service: calibre-web display_name: Calibre-Web image: linuxserver/calibre-web image_tag: latest port: 8083 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-calibre-web notes: | Expects an existing Calibre library mounted as a volume. - service: focalboard display_name: Focalboard image: mattermost/focalboard image_tag: latest port: 8000 db: postgres architecture: app_db first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-focalboard - service: freshrss display_name: FreshRSS image: freshrss/freshrss image_tag: "8400" port: 80 db: sqlite architecture: single first_run: auto test_status: verified test_date: 2026-08-02 repo: https://gitea.damconsulting.llc/DAM/ts-freshrss notes: | Official freshrss/freshrss image. Single container, SQLite in named volumes. Env vars: TZ (PHP timezone), CRON_MIN (CSV of minutes for feed refresh cron). First-run: complete the web installer at the Tailscale URL. - service: gitea display_name: Gitea image: gitea/gitea image_tag: latest port: 3000 db: postgres architecture: app_db first_run: auto test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-gitea - service: grafana display_name: Grafana image: grafana/grafana image_tag: latest port: 3000 db: sqlite architecture: single first_run: auto test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-grafana - service: harbor display_name: Harbor image: goharbor/harbor-core image_tag: latest port: 8080 db: postgres architecture: app_db_cache first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-harbor notes: | Complex multi-service app. Likely needs separate chart or compose fragment. - service: home-assistant display_name: Home Assistant image: homeassistant/home-assistant image_tag: latest port: 8123 db: none architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-home-assistant - service: homepage display_name: Homepage image: ghcr.io/gethomepage/homepage image_tag: latest port: 3000 db: none architecture: single first_run: auto test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-homepage - service: immich display_name: Immich image: ghcr.io/immich-app/immich-server image_tag: release port: 2283 db: postgres architecture: multi_service first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-immich notes: | Heavy: needs postgres + redis + machine-learning service + large media volume. - service: invoiceplane display_name: InvoicePlane image: invoiceplane/invoiceplane image_tag: latest port: 80 db: mysql architecture: app_db first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-invoiceplane - service: jellyfin display_name: Jellyfin image: jellyfin/jellyfin image_tag: latest port: 8096 db: none architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-jellyfin notes: | Optionally benefits from GPU passthrough for hardware transcoding. - service: kavita display_name: Kavita image: kiza19/kavita image_tag: latest port: 5000 db: postgres architecture: app_db first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-kavita - service: lidarr display_name: Lidarr image: hotio/lidarr image_tag: latest port: 8686 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-lidarr - service: linkwarden display_name: Linkwarden image: ghcr.io/linkwarden/linkwarden image_tag: latest port: 3000 db: postgres architecture: app_db first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-linkwarden - service: mealie display_name: Mealie image: ghcr.io/mealie-recipes/mealie image_tag: latest port: 9000 db: postgres architecture: app_db first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-mealie - service: netdata display_name: Netdata image: netdata/netdata image_tag: latest port: 19999 db: none architecture: single first_run: auto test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-netdata - service: nextcloud-all-in-one display_name: Nextcloud AIO image: nextcloud/all-in-one image_tag: latest port: 11000 db: mariadb architecture: multi_service first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-nextcloud-all-in-one notes: | AIO manages its own DB internally. Be careful exposing ports. - service: node-red display_name: Node-RED image: nodered/node-red image_tag: latest port: 1880 db: sqlite architecture: single first_run: auto test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-node-red - service: overseerr display_name: Overseerr image: hotio/overseerr image_tag: latest port: 5055 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-overseerr - service: paperless-ngx display_name: Paperless-ngx image: ghcr.io/paperless-ngx/paperless-ngx image_tag: latest port: 8000 db: postgres architecture: multi_service first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-paperless-ngx notes: | Needs Postgres + Redis broker (Celery). Heavy document storage. - service: photoprism display_name: Photoprism image: photoprism/photoprism image_tag: latest port: 2342 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-photoprism - service: prowlarr display_name: Prowlarr image: hotio/prowlarr image_tag: latest port: 9696 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-prowlarr - service: radarr display_name: Radarr image: hotio/radarr image_tag: latest port: 7878 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-radarr - service: searchxng display_name: SearXNG image: searxng/searxng image_tag: latest port: 8080 db: none architecture: single first_run: auto test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-searchxng - service: shiori display_name: Shiori image: ghcr.io/go-shiori/shiori image_tag: latest port: 8080 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-shiori - service: sonarr display_name: Sonarr image: hotio/sonarr image_tag: latest port: 8989 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-sonarr - service: stirling-pdf display_name: Stirling PDF image: stirlingtools/stirling-pdf image_tag: "2.14.2-ultra-lite" port: 8080 db: none architecture: single first_run: auto test_status: verified test_date: 2026-08-02 repo: https://gitea.damconsulting.llc/DAM/ts-stirling-pdf notes: | Official stirlingtools/stirling-pdf image, pinned to 2.14.2-ultra-lite (arm64-compatible, smallest variant). Single container, no DB. Default admin (admin/stirling) is auto-created on first run — change the password immediately. DISABLE_ADDITIONAL_FEATURES env var opts out of OCR/Tesseract for minimal installs. - service: tautulli display_name: Tautulli image: hotio/tautulli image_tag: latest port: 8181 db: sqlite architecture: single first_run: auto test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-tautulli - service: trilium-notes display_name: Trilium Notes image: zadam/trilium image_tag: latest port: 8080 db: postgres architecture: app_db first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-trilium-notes - service: uptime-kuma display_name: Uptime Kuma image: louislam/uptime-kuma image_tag: "1" port: 3001 db: sqlite architecture: single first_run: setup_wizard test_status: verified test_date: 2026-08-02 repo: https://gitea.damconsulting.llc/dam/ts-uptime-kuma notes: | Single container, SQLite-backed. No external DB needed. Drop the db service entirely. Data volume path is /app/data/uptime-kuma (NOT /data). Only net_admin needed (not sys_module). USE NAMED VOLUMES (NOT BIND MOUNTS) FOR DATA - macOS Docker Desktop has gRPC-FUSE UID remapping that breaks chown inside containers. Named volumes work identically on macOS + Linux. TS_EXTRA_ARGS=--login-server=${TS_LOGIN_SERVER} required for Headscale. tailscale/config volume mount required for serve.json. - service: vaultwarden display_name: Vaultwarden image: vaultwarden/server image_tag: latest port: 80 db: sqlite architecture: single first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-vaultwarden notes: | WebSocket support required for live notifications. Use a single container. - service: woodpecker display_name: Woodpecker CI image: woodpeckerci/woodpecker-server image_tag: latest port: 8000 db: postgres architecture: app_db first_run: setup_wizard test_status: untested repo: https://gitea.damconsulting.llc/dam/ts-woodpecker