Files
livef12rocks/SOUL.md
T
Frank Schwenk 90192cd284 feat: initial live.f12.rocks SFTP → gmic/rembg → web pipeline
Event pep stack with SFTPGo inbox, sequential worker, FastAPI gallery/remix, and Traefik-ready compose.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 21:32:10 +02:00

103 lines
4.2 KiB
Markdown

# SOUL.md — Project Character
## Product Name
`live.f12.rocks`
## One-Liner
Event photo pep pipeline: SFTP -> gmic/rembg -> web. Upload a photo at the
event, get back weird/fun filtered variants seconds later.
## Vision
At an event (f12 meetup/party), someone drops a photo into an SFTP inbox
from a laptop/camera rig. A worker rips the background off, runs it
through a random gmic filter/blend chain, and a handful of variants show
up on a shared web page almost immediately — no app install, no login, no
waiting for someone to "process the photos later". If a variant is fun,
remix it with different filters right there.
## Audience
Event organizers and attendees at f12 events, on their phones, often on
bad venue wifi. Nobody signs up, nobody logs in. Whoever has the link
(and whoever's uploading from the SFTP side) is the whole audience.
## Tone & Wording
- **Voice:** direct, casual, no explaining-the-obvious. It's a fun tool
for an event, not enterprise software.
- **Formality:** du. Short German labels in the UI (Ansehen, Remix,
Download, Varianten, Zwischenschritte).
- **Error messages:** say what broke, don't blame the visitor — most
errors here are gmic filter flakiness, not user error.
- **Forbidden words/phrases:** no corporate buzzwords, no "Erlebnis",
no fake enthusiasm ("Wow!", "Amazing!"). Keep it matter-of-fact.
### Wording Examples
| Context | Good | Bad |
|---------|------|-----|
| Success | `Remix erzeugt.` | `Dein Kunstwerk ist fertig! 🎉` |
| Error | `Foreground-Filter fehlgeschlagen: Timeout nach 120s` | `Etwas ist schiefgelaufen.` |
| Empty state | `Noch keine Jobs. Bild per SFTP hochladen, dann kurz warten.` | `Hier ist noch nichts los... lade doch was hoch! 😊` |
## Design
- **Palette:** dark background (`#14161a`), off-white text, one warm
accent color (`#ff5a1f`) for primary actions/links. No gradients.
- **Feel:** utilitarian, mobile-first, touch-friendly. Think backstage
tool, not a consumer photo app. Deliberately avoids the generic
"purple AI gradient + rounded blob" look.
## Non-Goals
- No web auth / accounts / login product — anyone with the link sees
everything, by design, for this event tool.
- No camera-to-phone client — upload path is SFTP only.
- No beamer/projector product built into this repo.
- Not a DAM (digital asset manager) — no albums, tagging, search,
retention policies. `inbox/` and `jobs/` are the whole data model.
- No auto-deletion of inbox uploads. Ever. The worker only reads/copies.
## Infrastructure (project-local)
- Workdir on server: `/home/frank/live.f12.rocks`
- Data volume: `${DATA_HOST_DIR}` (default `./data` locally, absolute
path `/home/frank/live.f12.rocks/data` on the server) — bind-mounted
into all three services (`sftpgo`, `worker`, `web`) at different
container paths, see `compose.yml` header comment.
- SFTP: host port `12121` -> `sftpgo:2022` (spec `121212` is not a valid
TCP port). SFTPGo web admin is never
exposed (internal-only, port 8080, no Traefik route).
- Domain: `live.f12.rocks`, routed via the shared external `traefik`
network, TLS via `myresolver` (see `INFRASTRUCTURE.md`).
- rembg model cache and SFTPGo host keys live in named Docker volumes
(`rembg_cache`, `sftpgo_state`), not under `./data` — they're
container state, not event data.
## Project-Specific Rules
```markdown
- Never delete or move files under inbox/ from worker code — SFTP is the
only writer there. (reason: uploads are the one copy of the original
that exists outside a phone's camera roll)
- Keep every intermediate image in jobs/<id>/intermediates/ — don't clean
them up automatically. (reason: useful for debugging bad filter picks,
disk is cheap compared to re-running gmic)
- gmic/rembg subprocess calls always run under `nice` (see NICE_LEVEL) —
the worker box needs to stay responsive for other things during an
event. (reason: explicit requirement, avoid CPU starvation)
```
---
## Agent Instructions
When updating this file:
- Keep rules **unambiguous** — formality of tone doesn't matter, clarity does
- Include **wording** for user-facing text; colors are optional
- When Fränky says *"in this project, never X"*, add it here or in `BOUNDARIES.md` (agent proposes which)