# FabledCurator Self-hosted media curation — gallery, ML tagging, and subscription-driven downloading in one app. Part of the FabledSword family. Combines what was [ImageRepo](https://git.fabledsword.com/bvandeusen/ImageRepo) (gallery, ML, importer) and [GallerySubscriber](https://git.fabledsword.com/bvandeusen/GallerySubscriber) (gallery-dl wrapper, subscriptions, credential capture) into a single product. ## Status Pre-v1. Not yet functional. ## Quick start For local development and testing, just: ```bash docker compose up -d # UI: http://localhost:8080 ``` That uses sane dev defaults baked into `docker-compose.yml` and the dev override (`docker-compose.override.yml`, auto-merged) — local builds, DEBUG logging, exposed Postgres + Redis ports on the host. No `.env` required. For a production-like deployment, override the dev defaults via shell env or a `.env` file (see `.env.example` for the variable names) and use: ```bash docker compose -f docker-compose.yml up -d # (skips the override so containers pull registry images) ``` ## Deployment posture FabledCurator is designed to run inside a self-hosted homelab environment over plain HTTP. If you want TLS, terminate it at your reverse proxy. The app does not generate certificates, redirect to HTTPS, or set HSTS. ## CI / Forgejo setup The repo's workflows expect: - **Runner label `python-ci`** — a Forgejo runner with Python 3.14, ruff, and Node 22 pre-installed. Both `ci.yml` and `build.yml` use this label. The runner image (`runner-base:python-ci`) is built from `CI-Runner/CI-python/` in the operator's workspace; `make push` from that directory builds and pushes a new image when toolchain pins change. - **Repo secret `RELEASE_TOKEN`** — a Forgejo PAT with the following scopes: - `write:package` + `read:package` — for `docker push` to `git.fabledsword.com` - `write:release` — for future release-cutting workflows - `write:issue` — for future issue-management automation Generate at https://git.fabledsword.com/user/settings/applications. The injected `GITHUB_TOKEN` cannot be used because it lacks `write:package`. ## License Personal project; use at your own discretion.