- TypeScript 63.7%
- Python 34.9%
- CSS 0.6%
- JavaScript 0.5%
- Dockerfile 0.2%
- Other 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| docs | ||
| frontend | ||
| icons | ||
| tests | ||
| .dockerignore | ||
| .gitignore | ||
| civitai_lora_bridge.py | ||
| civitai_routes.py | ||
| Dockerfile | ||
| librarian_bridge.py | ||
| library_routes.py | ||
| lora_pairings_bridge.py | ||
| lora_pairings_routes.py | ||
| main.py | ||
| README.md | ||
| recipe_bridge.py | ||
| recipes_routes.py | ||
| requirements.txt | ||
| schemas.py | ||
Comfy Gallery
Curator inventory states
Curator keeps three model states separate:
- On Disk means at least one managed asset file is installed locally.
- Wanted is the durable keep/download intent stored in the configured
CIVITAI_SELECTED_FILE. The checkbox in Curator changes this state. - Liked reflects the latest cached Civitai favorites snapshot.
Refreshing Civitai likes only changes Liked. It does not change Wanted, download a model, or delete a local file. Downloads remain an explicit action, and an On Disk model removed from Wanted is presented for removal review rather than deleted automatically.
The Civitai Browser's Discover tab searches Civitai directly, independent of
the account's favorites/likes -- see
docs/civitai-search-api.md for the underlying
API's verified pagination, sort/filter, authentication, and rate-limit behavior.
ComfyUI output gallery and curator, including prompt-library editing, Civitai browsing, recipe management, and generation controls.
Delivery model
This repository owns the application source and container build. A push to main builds and publishes:
git.scruffydude.net/scruffydude/comfy-gallery:<short-sha>git.scruffydude.net/scruffydude/comfy-gallery:latest
The homelab repository owns runtime configuration and deployment. Its comfy_gallery Ansible role pulls the published image; it does not copy or build application source.
The curator still mounts the homelab checkout at runtime because prompt-library editing intentionally reads and commits files maintained there. That integration is runtime data access, not application delivery.
Local build
docker build -t comfy-gallery:dev .
The frontend can be developed independently from frontend/ with npm ci and npm run dev.
Bumper Studio
Curator includes a Bumper Studio for short Tunarr interstitials. It keeps the creative and broadcast steps separate:
- Open an image in Gallery and choose Bumper Studio. That selected asset becomes the source; it can also be used directly for a slow zoom bumper.
- Optionally launch an existing
video-i2vrecipe. Bumper Studio follows the run and automatically switches the source to its completed Inbox video. Duplicate/edit recipes to experiment with motion, dimensions, sampler settings, and compatible LoRAs. - Choose a channel message, text position, and one or more durations. A single render action creates each requested H.264/AAC duration variant in the staging pack for review and later publication to Tunarr.
Built-in messages include WE'LL BE RIGHT BACK, BE BACK SOON,
SIGNAL INTERRUPTED, EMERGENCY MAINTENANCE ACTIVATED, and
TRANSMISSION RESUMES SHORTLY; custom text is also supported.
Preset durations are 5, 10, 15, 30, and 60 seconds, with an optional custom
duration up to 120 seconds. Duration suffixes are added to each output name.
The render action is disabled unless the curator deployment provides:
GALLERY_BUMPER_ENABLED=trueGALLERY_BUMPER_BUILDER(defaults to/usr/local/bin/build-tunarr-interstitial)GALLERY_BUMPER_OUTPUT_DIR(the mounted root containing Tunarr pack directories)
The builder is invoked without a shell and source/audio paths must resolve through an existing curator root. Output and pack names are slug-normalized before files are written.
Interstitial Director handoff
When the curator has GALLERY_DIRECTOR_API_URL and
GALLERY_DIRECTOR_PUBLIC_URL configured, still images show a Create
interstitial action. Gallery uploads the selected image to Director without
moving or modifying the Gallery original, then opens the public Director URL
with the copied source preselected. The API URL should use the internal service
address; the public URL is the operator-facing authenticated route.