Drop per-job subdirs for phone-friendly Syncthing layout with stem-suffixed filenames; keep web state in meta/. Co-authored-by: Cursor <cursoragent@cursor.com>
4.4 KiB
SOUL.md — Project Character
Product Name
live.f12.rocks
One-Liner
Event photo pep pipeline: Syncthing drop -> 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 a Syncthing folder from a phone/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. Finished jobs sync back to the phone via the same Syncthing share.
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 syncing photos in) 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 in den Sync-Ordner legen, 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 in this repo — upload path is Syncthing (phone/folder setup is out of band).
- No beamer/projector product built into this repo.
- Not a DAM (digital asset manager) — no albums, tagging, search,
retention policies.
incoming/,variants/, andintermediates/are the whole data model. - No auto-deletion of incoming uploads. Ever. The worker only reads/copies.
- No Syncthing container in this compose — Syncthing runs on the host.
Infrastructure (project-local)
- Workdir on server:
/home/frank/live.f12.rocks - Data volume (Syncthing share):
${DATA_HOST_DIR}— prod default/home/frank/sync.schwenk.online/data/livef12, local override./data. Bind-mounted intoworkerandwebat/data(seecompose.yml). - Layout under the share:
incoming/— phone dropvariants/—{stem}_original.jpg,{stem}_rembg.png,{stem}_vN.pngintermediates/—{stem}_vN_*.png(incl._post_0…)meta/— web bookkeeping JSON (optional.stignoreon phone)processed.json
- Domain:
live.f12.rocks, routed via the shared externaltraefiknetwork, TLS viamyresolver(seeINFRASTRUCTURE.md). - rembg model cache lives in the named Docker volume
rembg_cache, not under the Syncthing share — container state, not event data.
Project-Specific Rules
- Never delete or move files under incoming/ from worker code — Syncthing
is the writer there. (reason: uploads are the one copy of the original
that exists outside a phone's camera roll)
- Keep every intermediate image under 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)