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>
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user