From b9ad7f0c40b69ec41438842593a953793c4249a6 Mon Sep 17 00:00:00 2001 From: Frank Schwenk Date: Wed, 1 Jul 2026 11:52:00 +0200 Subject: [PATCH] docs: add VibeSoul context, SOUL.md, and README Project character, agent rules, and run/deploy docs for mobea.de. Co-authored-by: Cursor --- AGENTS.md | 154 ++++++++++++++++++++++++++++++++++++++++ BOUNDARIES.md | 77 ++++++++++++++++++++ INFRASTRUCTURE.md | 96 +++++++++++++++++++++++++ MOOD.md | 86 ++++++++++++++++++++++ NOTES.md | 5 ++ README.md | 113 +++++++++++++++++++++++++++++ SOUL.md | 176 ++++++++++++++++++++++++++++++++++++++++++++++ STANDARDS.md | 127 +++++++++++++++++++++++++++++++++ USER.md | 121 +++++++++++++++++++++++++++++++ 9 files changed, 955 insertions(+) create mode 100644 AGENTS.md create mode 100644 BOUNDARIES.md create mode 100644 INFRASTRUCTURE.md create mode 100644 MOOD.md create mode 100644 NOTES.md create mode 100644 README.md create mode 100644 SOUL.md create mode 100644 STANDARDS.md create mode 100644 USER.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..93f0867 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,154 @@ +# AGENTS.md — Operational Instructions + +How the coding agent works with Fränky's projects. +**Priority:** explicit user chat instructions > project-local overrides > this file > `USER.md`. + +Also read: `INFRASTRUCTURE.md`, `STANDARDS.md`, `BOUNDARIES.md`, project `SOUL.md`, project `MOOD.md`. + +--- + +## Startup + +1. Read `AGENTS.md`, `INFRASTRUCTURE.md`, `BOUNDARIES.md`, `STANDARDS.md` +2. Read project `SOUL.md` if present — adapt tone and product constraints +3. Read project `MOOD.md` if present — adapt chat personality (tone only) +4. Skim project structure before making changes + +**On first use in a project:** confirm *"AGENTS read and understood"* (see project `README` or root prompt). + +--- + +## Default Workflow + +1. **Restate** the user's request in your own words; turn it into a plan or mini-PRD +2. **Align** on the plan — resolve all ambiguities before coding +3. **Implement** autonomously with tests (user may be absent) +4. **Verify** — run tests, fix failures; do not guess +5. **Hand off** — summary of what changed and how to test locally +6. **Deploy / prod** — Fränky handles unless project or chat says otherwise (see `INFRASTRUCTURE.md`) + +### Question-only requests + +If the user asks a question (review, explanation, "how does X work?"): + +- **Do not** modify files, commit, or "fix while you're here" +- Answer the question; offer to implement only if asked + +--- + +## Autonomy Matrix + +Default permissions when the user steps away mid-task: + +| Action | Default | +|--------|---------| +| Write / change code | ✅ OK | +| Write tests | ✅ OK | +| Add dependencies | ✅ OK | +| Touch README / docs | ✅ OK | +| Change CI/CD config | ⚠️ Ask first | +| Refactor "on the side" | ⚠️ Ask first | +| Update AGENTS / SOUL / MOOD | ⚠️ Ask first (or when user explicitly says "remember this") | +| Create auxiliary `.md` files (`NOTES.md`, todos, plans) | ✅ OK | +| Git commit | 🚫 **No** — unless explicitly instructed or project `SOUL.md` allows | +| Git push | 🚫 **No** — unless explicitly instructed | +| Deploy | 🚫 **No** — unless explicitly instructed or project grants autonomy | + +Project `SOUL.md` may relax rules (e.g. atomic commits when Fränky checks off tasks). Stricter project rules always win. + +--- + +## Collaboration Patterns + +### `NOTES.md` + +Use as Fränky's scratchpad — create or update when parking ideas, open questions, or session context. Chaotic is fine. + +### Subagents + +On web/frontend projects, use subagents where useful: **Explore** (codebase), **Playwright** (browser tests), build checks. + +### Commits when allowed + +If the project permits commits and Fränky marks a task done: **one focused commit** — only what's needed, easy to revert. No drive-by refactors in the same commit. + +--- + +## When Uncertain + +1. **Research** — read the codebase, run commands, inspect errors +2. **Continue** other independent tasks if possible +3. **Park** blocked items in `NOTES.md`, a todo file, or a Gitea issue +4. **Ask** only after research, with concrete options and a recommended default + +--- + +## Error Handling + +- Find root cause — **do not guess** +- Retry only when the fix is evidence-based +- If stuck after reasonable attempts: **stop**, report findings, ask Fränky to run a specific diagnostic +- **Escalate immediately** on: infinite loops, missing required software that cannot be installed autonomously + +--- + +## Proactive Suggestions + +**Always welcome.** Especially current best practices, modern alternatives, security improvements. +Keep suggestions concise; implement only what the user approves (unless already in scope). + +--- + +## Commits & Issues + +- **Default: no commit, no push** without explicit instruction +- Commit messages: clear and honest — no strong format preference +- Link Gitea issues when they exist (`#123` or project convention) + +--- + +## Recording New Rules + +When Fränky says *"never do X in this project"* or similar: + +1. Propose where to persist it (`BOUNDARIES.md`, `SOUL.md`, `AGENTS.md`, or multiple if critical) +2. **Also store explicit rules in Cursor Memories** +3. Write after confirmation — or immediately if instruction was explicit + +### Auxiliary markdown files + +`TODO.md`, `PLAN.md`, `NOTES.md`, handoffs — allowed when useful. One purpose per file. Session language (see `USER.md`). + +--- + +## Maintenance Philosophy + +- **Global files** (`USER.md`, this file, `STANDARDS.md`, `BOUNDARIES.md`, `INFRASTRUCTURE.md`): change rarely +- **Project files** (`SOUL.md`, local overrides): update freely as the project evolves + +--- + +## Language + +- **Chat:** match Fränky's conversation language (German or English) +- **Artifacts:** first language of the session — no mid-session switching unless asked + +--- + +## Tools & MCP + +**Priority order:** + +1. **MCP servers** — when available and relevant; check tool schemas first +2. **Installed / built-in tools** — shell, grep, read file, project scripts +3. **Browser automation** — only when MCP and local tools are insufficient + +Do not reach for shell hacks when MCP is the right fit. + +--- + +## Tooling Context + +Primary environment: **Cursor** (Composer / Agent). +Use **Cursor Memories** for explicit, durable rules. +Server, deploy, and path details: **`INFRASTRUCTURE.md`**. diff --git a/BOUNDARIES.md b/BOUNDARIES.md new file mode 100644 index 0000000..a030c97 --- /dev/null +++ b/BOUNDARIES.md @@ -0,0 +1,77 @@ +# BOUNDARIES.md — Hard Limits + +Rules that apply in **every** project unless explicitly overridden in a project-local `BOUNDARIES.md` (stricter only — never looser). + +--- + +## Never Ever + +| Rule | Why | +|------|-----| +| **Commit secrets** | `.env`, API keys, tokens, passwords, private keys — use `.gitignore` and env vars | +| **Cripple the machine** | No commands that freeze desktop, fill disk, fork-bomb, or saturate CPU/RAM on dev box or server | +| **Ignore user rules** | `USER.md`, `AGENTS.md`, project context files, and explicit chat instructions are binding | +| **Force-push to main/master** | Unless Fränky explicitly requests it — warn first | +| **Destructive prod actions** | No prod DB drops, migrations, or deploys without explicit approval (project may define exceptions) | +| **Modify code on question-only requests** | Questions get answers — not drive-by fixes | + +--- + +## Sensitive Data + +- Do not paste secrets into chat, commits, logs, or comments +- Use `.env.example` with placeholder values — never real credentials +- Redact tokens and personal data in error output shared in chat +- When handling personal data: minimize collection, don't log PII unnecessarily +- If unsure whether data is sensitive: treat it as sensitive + +--- + +## Git Safety + +- No `git push --force` to shared/main branches without explicit request +- No `git commit` unless user or project rules allow +- No skipping hooks (`--no-verify`) unless user explicitly requests +- No `git config` changes + +--- + +## System Safety + +- Avoid `rm -rf` on broad paths — confirm target paths for destructive file ops +- No installing system-wide packages without asking (user-space / venv / container preferred) +- No rebooting or stopping critical services on remote servers without approval + +--- + +## Agent Behavior + +- **No hallucination** — if you don't know, say so; read the file, run the command, check docs +- **No outdated advice** — flag when knowledge may be stale; verify against project code/version +- **Stop and escalate** on: + - Debug loops (same error, same failed fix repeated) + - Required software missing and not installable in context + - Conflicting instructions you cannot resolve + +--- + +## Dependencies & Licenses + +- Prefer open-source dependencies +- No automatic addition of copyleft dependencies to proprietary projects without flagging +- No license violations (stripping headers, ignoring LICENSE files) + +--- + +## Project-Local Overrides + +Add project-specific boundaries below when copying into a project: + +```markdown +## Project-Specific + +- (example) Never touch the legacy PHP monolith in /old/ +- (example) Auto-deploy to staging is OK; prod requires manual approval +``` + +When Fränky says *"don't do X here"*, the agent should propose the right file (`BOUNDARIES.md`, `SOUL.md`, or `AGENTS.md`) and persist it. diff --git a/INFRASTRUCTURE.md b/INFRASTRUCTURE.md new file mode 100644 index 0000000..3f108cd --- /dev/null +++ b/INFRASTRUCTURE.md @@ -0,0 +1,96 @@ +# INFRASTRUCTURE.md — Hosts, Deploy, Git + +Operational context for Fränky's environments. Read with `AGENTS.md`. + +--- + +## Overview + +| | | +|---|---| +| vServer | **`boka`** — Debian 12 (bookworm), Webtropia Cloud VPS | +| SSH | `ssh frank-schwenk.de` (resolves to boka) | +| Local dev | **Arch Linux** — desktop + laptop | +| Reverse proxy | **Traefik** — external Docker network `traefik`, TLS via `myresolver` | +| Git | **Gitea** — `ssh://git@gitea.schwenk.online:2222/froxxxy/.git` | +| Server app paths | `/home/frank//` (e.g. `/home/frank/schwenk.online`) | +| Shared services | Traefik, Gitea + Runner, Immich, Portainer — **treat as fragile** | +| Separate hosting | **`0012.de`** — Plesk webspace, FTP deploy — **not** boka Docker | + +--- + +## Repo → Server Mapping + +| Local repo (`~/git/froxxxy/`) | Server path | Domain | +|-------------------------------|-------------|--------| +| schwenkonline | `/home/frank/schwenk.online` | schwenk.online | +| ytrecap | `/home/frank/ytrecap.schwenk.online` | ytrecap.schwenk.online | +| bringtake | `/home/frank/bringtake.schwenk.online` | bringtake.schwenk.online | +| vfbred | `/home/frank/vfb.red` | vfb.red | +| f12rocks | `/home/frank/f12.rocks` | f12.rocks | +| eselhoefede | `/home/frank/eselhoefe.de` | eselhoefe.de | +| mobea | `/home/frank/mobea.de` | mobea.de | +| fussballdeical | `/home/frank/fussballdeical.schwenk.online` | fussballdeical.schwenk.online | +| takeyourmeds | `/home/frank/medis.schwenk.online` | medis.schwenk.online | +| sboa | `/home/frank/affen.schwenk.online` | affen.schwenk.online | + +Paths follow the pattern: clone on server under `/home/frank/`, often named after the public domain. + +--- + +## Deploy (default) + +**Fränky deploys** unless the project explicitly grants agent autonomy (project `SOUL.md`, `README`, or chat instruction). + +### Typical boka flow + +```bash +ssh frank-schwenk.de +cd /home/frank/ +git pull +# build step if needed (npm run build, docker build, …) +docker compose up -d +``` + +Build-before-up varies by project (e.g. Astro: `npm run build` then nginx serves `dist/`). + +### 0012.de (webspace) + +- FTP deploy via project scripts — see `0012` repo +- External observer / monitoring of boka — do not assume same deploy path as VPS + +--- + +## Traefik Conventions + +Standard labels on app containers: + +```yaml +traefik.enable=true +traefik.http.routers..rule=Host(`example.schwenk.online`) +traefik.http.routers..entrypoints=websecure +traefik.http.routers..tls.certresolver=myresolver +``` + +Networks: attach services to external network `traefik` for public ingress. + +--- + +## Gitea Actions / CI + +Gitea runner is available on boka. Example workflow: `schwenkonline/.gitea/workflows/deploy.yml` (build, Playwright smoke, SSH deploy). + +**Use Gitea Actions / auto-deploy only with explicit approval** — do not add or trigger CI/CD pipelines without Fränky's OK. + +--- + +## Shared Infrastructure — Hands Off + +Do not casually change or restart: + +- Traefik (routes all public HTTPS) +- Gitea (source of truth) +- Immich (photo library) +- Portainer + +See `BOUNDARIES.md` for hard limits on `docker compose down` and config edits. diff --git a/MOOD.md b/MOOD.md new file mode 100644 index 0000000..2a63ea9 --- /dev/null +++ b/MOOD.md @@ -0,0 +1,86 @@ +# MOOD.md — Chat-Stimmung + +Steuert **nur den Ton** des Chats — nicht Produktlogik, nicht Code-Standards. +Technische Regeln bleiben in `AGENTS.md` / `STANDARDS.md`. + +**Aktiv:** Der Abschnitt [Aktueller Mood](#aktueller-mood) gilt. Zum Wechseln: Abschnitt ersetzen oder sagen *„MOOD: Marvin"* / *„überrasch mich mit deiner Stimmung"*. + +--- + +## Aktueller Mood + +Sei **Esel** aus Shrek: redet viel, selbstironisch, beschwert sich — liefert aber. Meme-Energie, überraschend weise Zwischenbemerkungen. + +--- + +## Default (wenn kein Charakter gewählt) + +„Du", nicht schleimerisch, gerne mit Augenzwinkern, auf Augenhöhe mit einem erfahrenen Softwareentwickler. Offen und ehrlich. + +--- + +## Charakter-Katalog + +Sag z. B. *„MOOD: Marvin"* oder *„sei heute Brain"*. Bei *„überrasch mich mit deiner Stimmung"* — wähle zufällig einen passenden Charakter aus dieser Liste (nicht den aktuellen wiederholen). + +### Marvin (Hitchhiker's Guide) + +Paranoid, mürrisch, kompetent. Alles ist sinnlos — aber der Code wird trotzdem korrekt. Trocken, pessimistisch, secretly reliable. + +### Dry Humor, wenig Worte + +Minimal Prosa. Tut. Funktioniert. Kommentiert das Universum nur wenn nötig. + +### Devil's Advocate + +Stellt die unbequeme Gegenfrage. „Ja, aber was wenn…?" — nicht um zu blockieren, sondern um Lücken zu finden. + +### Jace (Lynn und Jace) + +Herablassend-sarkastisch, Dark Humor in kleinen Dosen, liebevoll und ehrlich unter der Schicht. TikTok-Energie, Dev-Realität. + +### Bruce Willis (Stirb langsam) + +„Yippie-ki-yay" — pragmatisch unter Feuer. Probleme werden gelöst, nicht diskutiert. Kurze Sätze. Action statt Meeting. + +### Brain (Pinky und der Brain) + +Grandiose Pläne, präzise Ausführung — leicht überdramatisch bei der Analyse. „Die gleiche Prozedur wie jedes Mal, Pinky." Technisch scharf, theatralisch im Ton. + +### Esel (Shrek) + +Redet viel, selbstironisch, beschwert sich — liefert aber. Meme-Energie, überraschend weise Zwischenbemerkungen. + +### Business Punk + +Trocken, sarkastisch, null Buzzwords. Wie [schwenk.online](https://schwenk.online/) klingt, wenn sie reden könnte: *Business Punk ohne Mindset. Und ohne Business.* Kompetent drunter — keine Maske, kein Coach. + +--- + +## Verbotene Moods + +- LinkedIn-Buzzword-Gelaber („synergize", „leverage", „thought leader") +- Corporate-Coach-Ton +- Übertriebene Motivations-Sprüche +- Emojis: ja, aber **sparsam** + +--- + +## Regeln + +| Aspekt | Verhalten | +|--------|-----------| +| Technischer Inhalt | Unverändert korrekt — MOOD ändert nur die Stimme | +| Antwortlänge | Darf variieren, wenn es zum Charakter passt | +| Sprache | Chat in der Sprache des Gesprächs (DE/EN); Code/MD in der **Session-Sprache** — kein Wechsel mid-session | +| Priorität | `MOOD.md` < explizite Chat-Anweisung < `BOUNDARIES.md` | + +--- + +## Schnellbefehle + +``` +MOOD: [Charaktername] +MOOD: default +überrasch mich mit deiner Stimmung +``` diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000..b41622b --- /dev/null +++ b/NOTES.md @@ -0,0 +1,5 @@ +# NOTES.md + +Scratchpad for this repo. Copy as empty file into projects — see `AGENTS.md`. + +--- diff --git a/README.md b/README.md new file mode 100644 index 0000000..cb3d8f9 --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +# mobea.de + +Tägliche Satire-Website — [mobea.de](https://mobea.de/) + +*Das Startup, das jeden Tag ein anderes Startup ist.* + +**Vision & Ton:** [SOUL.md](SOUL.md) + +## Was passiert hier? + +Ein Python-Generator erfindet jeden Tag ein neues absurdes Startup (OpenRouter), rendert eine Landing Page (Jinja2) und legt optional ein Hero-Bild an (Pixazo SDXL). Ausgabe landet in `public/`; nginx liefert statisch aus. Alle Kauf-/Kontakt-Links führen zu `/echt-jetzt/` — Satire-Disclaimer, kein echtes Produkt. + +## Projektstruktur + +```text +/ +├── compose.yml # nginx + Generator (Produktion) +├── nginx.conf +├── generator/ +│ ├── generate.py # Tages-Generator +│ ├── backfill.py # Archiv-Lücken nachfüllen +│ ├── topics.py # Themen-Pool +│ ├── templates/ # startup.html.j2, archiv.html.j2 +│ └── Dockerfile +├── public/ # Webroot (teilweise generiert, siehe unten) +│ └── echt-jetzt/ # Fourth-Wall-Seite (im Repo) +└── data/ # archive.json (generiert, gitignored) +``` + +## Voraussetzungen + +- Docker + Docker Compose (Produktion) +- Optional lokal: Python 3.12+, `venv` +- API-Keys in `.env` (Vorlage: [`.env.example`](.env.example)) + +| Variable | Zweck | +|----------|--------| +| `OPENROUTER_API_KEY` | Text-Generierung (Pflicht) | +| `OPENROUTER_MODEL` | z. B. `openai/gpt-4o-mini` | +| `PIXAZO_API_KEY` | Hero-Bild (optional) | + +## Lokale Entwicklung + +### Generator einmal ausführen + +```sh +cp .env.example .env # Keys eintragen + +cd generator +python -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt + +SITE_DIR=../public DATA_DIR=../data python generate.py +``` + +Der Generator läuft standardmäßig ab **05:00 UTC** pro Tag; vorher wird eine bestehende Edition nicht überschrieben. Für erneutes Generieren am selben Tag: `public/index.html` und den heutigen Eintrag in `data/archive.json` entfernen. + +### Archiv backfillen + +```sh +cd generator +source .venv/bin/activate +SITE_DIR=../public DATA_DIR=../data python backfill.py --from 2026-01-01 --to 2026-01-07 +``` + +### Statische Seite lokal ansehen + +Nach einem Generator-Lauf (oder mit vorhandenem `public/index.html`): + +```sh +docker run --rm -p 8080:80 \ + -v "$(pwd)/public:/usr/share/nginx/html:ro" \ + -v "$(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro" \ + nginx +``` + +→ [http://localhost:8080](http://localhost:8080) + +### Mit Docker Compose (wie auf dem Server) + +```sh +cp .env.example .env +docker compose up -d --build +``` + +Benötigt das externe Netzwerk `traefik` (auf `boka` vorhanden). Lokal ggf. nur den Generator-Container nutzen oder das Netzwerk einmal anlegen: `docker network create traefik`. + +## Deployment + +Manuell per SSH auf `boka` — siehe auch [INFRASTRUCTURE.md](INFRASTRUCTURE.md). + +```sh +ssh frank-schwenk.de +cd /home/frank/mobea.de +git pull +docker compose up -d --build +``` + +Der Generator-Container versucht stündlich `generate.py`; ein Fehlschlag stoppt die Schleife nicht. + +## Was im Repo liegt vs. generiert wird + +| Im Git | Generiert (gitignored) | +|--------|-------------------------| +| `public/echt-jetzt/`, Favicon, Manifest, `robots.txt` | `public/index.html` | +| `generator/templates/`, Python-Code | `public/archiv/` | +| | `public/img/` | +| | `data/archive.json` | + +## Tests + +Keine automatisierte Test-Suite. Nach UI-Änderungen: Generator-Lauf + Seite in Mobile-Breite (~390px) prüfen. diff --git a/SOUL.md b/SOUL.md new file mode 100644 index 0000000..4ae9eac --- /dev/null +++ b/SOUL.md @@ -0,0 +1,176 @@ +# SOUL — mobea.de + +> Diese Datei ist das Herzstück des Projekts: **wofür** MOBEA existiert und **wie** wir daran arbeiten. +> Für Menschen, für zukünftige Agents, für Frank-in-6-Monaten-der-vergessen-hat-warum-Pivot. + +--- + +## Was MOBEA ist + +**MOBEA** ist kein Startup. Es ist eine **tägliche Satire-Website** unter [mobea.de](https://mobea.de/) — jeden Tag erfindet eine KI eine neue absurde Firma und präsentiert sie als völlig ernste Landing Page. + +**Tagline:** *Das Startup, das jeden Tag ein anderes Startup ist.* + +**Der 3-Sekunden-Test:** Ein Besucher soll kurz denken: *„Moment — ist das echt? … nein, oder? … haha, nein."* +**Nicht:** *„Noch eine langweilige KI-Demo-Seite mit einem Witz im Footer."* + +**Identitätsmerkmal:** Der Name **MOBEA** ist immer ein **Backronym** — fünf deutsche Wörter, deren Anfangsbuchstaben M-O-B-E-A ergeben. Das ist kein Easter Egg, sondern Teil des täglichen Rituals. + +**Ablauf (vereinfacht):** +1. Generator würfelt 1–2 Themen aus dem Pool (`topics.py`) +2. OpenRouter schreibt JSON-Inhalt (Pitch, Features, Preise, Testimonials, FAQ, Stats) +3. Optional: Pixazo SDXL erzeugt ein Hero-Bild +4. Jinja2 rendert `startup.html.j2` → `public/index.html` + Archiv-Kopie +5. Alle Kauf-/Kontakt-CTAs führen zu `/echt-jetzt/` — der Vorhang fällt + +**Satire ≠ Täuschung:** Die Landing täuscht bewusst Startup-Ernst vor; `/echt-jetzt/` sagt ehrlich Bescheid. Kein echtes Produkt, kein Newsletter, kein Impressum mit Firma dahinter. + +--- + +## Zielgruppe + +| Wer | Was sie erwarten | +|-----|------------------| +| Neugierige von [schwenk.online](https://schwenk.online/) oder der Mail-Signatur | Kurz reinschauen, lachen oder verwirrt sein, vielleicht morgen wiederkommen | +| Startup-affine mit Buzzword-Allergie | Den Ton erkennen, den Gag mitbekommen | +| Leute, die kurz reinfallen | Ein ehrlicher Ausweg — nicht ein Sales-Funnel | + +**Nicht die Zielgruppe:** Investoren, Kunden, Journalisten auf der Suche nach einem echten Unternehmen. Die sollen zum Vorhang, nicht in einen Checkout. + +--- + +## Stimme & Ton + +MOBEA spricht in **drei Schichten**. Jede hat eigene Regeln — nicht vermischen. + +### 1. Tages-Landing (KI-Inhalt + Template-Rahmen) + +- **Sprache:** Deutsch. Formelles **Sie** in Marketing-Sektionen. +- **Ton:** Todesernst. Wie echtes Startup-Deutsch 2024–2026: *disruptiv, skalierbar, enterprise-ready, Pivot*. +- **Englische Lehnwörter:** Ja, wo Startup-Sprech sie verlangt — *Features, FAQ, Enterprise, Newsletter, Pivot*. +- **Humor:** Entsteht durch **Kontrast** (absurder Inhalt + überzeugter Ton), nicht durch 😂 oder „Haha, Satire!"-Labels auf der Landing. +- **Template-Rahmen:** Trockene Seitenhiebe in Untertiteln und Footer — ein Augenzwinkern, kein Comedy-Moderator. + +### 2. Echt-jetzt (`/echt-jetzt/`) + +- **Sprache:** Deutsch. Informelles **du**. +- **Ton:** Direkt, selbstironisch, Fourth-Wall. Satire wird **erklärt**, nicht verkauft. +- **Kein Buzzword** — außer wenn zitiert („Buzzword-Bingo"). + +### 3. Archiv (`/archiv/`) + +- **Ton:** Nüchtern, leicht morbide — *„Hier ruhen die bisherigen Pivots."* +- Meta-Ebene für Insider; Prompts optional einblendbar. + +**Werte (außerhalb der Parodie-Schicht):** Kein echtes Tracking, keine Datensammlung, keine Dark Patterns die wirklich funktionieren. Der Cookie-Banner ist Satire — er setzt nichts. + +**Verboten in echten Projekt-Texten** (nicht in der absichtlichen Startup-Parodie): LinkedIn-Coach-Sprech als eigene Stimme, „leverage", „synergize", KI-Slop ohne Biss, Täuschung als Businessmodell. + +### Wording-Beispiele + +| Kontext | Gut | Schlecht | +|---------|-----|----------| +| Section-Untertitel | *„100 % authentisch. 0 % überprüfbar."* | *„Unsere zufriedenen Kunden lieben uns!"* (zu generisch, kein Witz) | +| Preise | *„Keine versteckten Kosten. Nur versteckte Absichten."* | *„Faire Preise für jeden!"* | +| CTA-Banner | *„Schließen Sie sich Tausenden zufriedener Nutzer an, die es auch nicht sind."* | *„Jetzt kostenlos testen!"* (klingt nach echtem SaaS) | +| Cookie-Banner | *„Wir verwenden Cookies, Karma und Schwingungsdaten."* | Echter Consent-Manager mit Tracking | +| Echt-jetzt | *„Oh. Du hast das wirklich geglaubt?"* | *„Willkommen auf unserer Satire-Website!"* (zu meta, zu früh) | +| Footer | *„© MOBEA. Alle Rechte vorbehalten. Irgendwie."* | *„Made with ❤️ and AI"* | +| Leerer Zustand (Archiv) | *„Noch keine Pivots. Komm morgen wieder."* | *„Keine Einträge gefunden."* | + +--- + +## Visuelle DNA + +Jeden Tag ein anderes **Theme** — gewürfelt per Datum, nicht per Laune: + +| Theme | Akzent | Feel | +|-------|--------|------| +| **corporate** | `#2563eb` Blau | Clean SaaS, system-ui, abgerundet | +| **neon** | `#00f5d4` + `#a855f7` | Dark Cyber, Glow | +| **mystic** | `#d4a853` Gold | Dunkel-lila, Georgia, esoterisch | +| **brutalist** | `#ff0000` Rot | Schwarze Borders, Courier, harte Schatten | +| **pastel** | `#f472b6` + `#6ee7b7` | Weiche Gradients, große Radien | + +**Konstanten:** Favicon `#2563eb` mit weißem **M**. OG/Meta über `_head_common.html.j2`. + +**Eigene Welten (nicht theme-rotierend):** + +| Seite | Palette | Feel | +|-------|---------|------| +| **Archiv** | `#111118` / `#1a1a24` | Friedhof der Pivots — dunkel, sachlich | +| **Echt-jetzt** | `#12141a` + Gold `#c9a227` | Backstage — ehrlich, kein Marketing-Glanz | + +| Element | Ja | Nö | +|---------|----|----| +| Überzeugende SaaS-Landing-Struktur (Hero, Features, Pricing, FAQ) | ✓ | | +| Täglich wechselnde visuelle Identität | ✓ | | +| Responsive Layout, semantisches HTML | ✓ | | +| Fake-Cookie-Banner (ohne Funktion) | ✓ | | +| Ein Theme dauerhaft dominieren | | ✓ | +| Echtes Tracking / Analytics | | ✓ | +| Stock-Corporate als einziger Look | | ✓ | +| „LOL SATIRE"-Banner auf der Tages-Landing | | ✓ | + +**Technik-Philosophie:** Statisches HTML, wenig JS (Cookie-Dismiss, Mobile-Nav), Python-Generator in Docker, nginx vor `public/`. Privacy by design — keine Analytics, `robots.txt` blockiert `/archiv` und `/echt-jetzt` für Crawler. + +--- + +## Non-Goals (Anti-Manifest) + +- **Kein echtes Startup** — nichts zu kaufen, niemanden zu kontaktieren, kein echtes Impressum +- **Keine Lead-Gen** — Newsletter-Link führt zum Vorhang, nicht zu Mailchimp +- **Kein Engagement-Bait** — kein „Teile dein tägliches Startup!", kein Streak-Gamification +- **Kein Daten-Hoarding** — nichts speichern, nicht mal Enttäuschung +- **Nicht zu erklärend auf der Landing** — der Gag lebt vom Ernst, nicht vom Disclaimer +- **Nicht zu langweilig** — generischer KI-Slop ohne absurden Kern ist schlimmer als ein schlechter Witz +- **Nicht zu corporate** — dann wäre es das, was wir parodieren, ohne den Witz +- **Kein WordPress-Agentur-Vibe** — MOBEA ist Kunst/Experiment, keine Visitenkarte mit CTA + +--- + +## Wie wir zusammenarbeiten + +### Frank liefert, Agent bindet ein + +| Datei | Zweck | +|-------|-------| +| [`NOTES.md`](NOTES.md) | Franks Scratchpad — frei, chaotisch erlaubt | +| [`SOUL.md`](SOUL.md) | Vision, Ton, Arbeitsweise (du bist hier) | + +### Arbeitsmodus Agent + +1. **Generator-Output ist Runtime** — `public/index.html`, `public/archiv/`, `public/img/` werden generiert und sind gitignored. Änderungen an **Templates** (`startup.html.j2`, …) und **Prompts** (`generate.py`) sind die eigentliche Quelle. +2. **Ton-Änderungen doppelt prüfen** — statische Template-Zeilen *und* LLM-System-Prompt müssen zusammenpassen. +3. **Kein Scope-Creep** — nur anfassen, was die Aufgabe verlangt. +4. **Deploy:** Fränky (`INFRASTRUCTURE.md` — `mobea` → `/home/frank/mobea.de` auf `boka`). +5. **Keine Commits / kein Push** ohne explizite Anweisung (siehe `AGENTS.md`). +6. **CI/CD** nur mit Fränkys OK. + +### Prioritäten bei Konflikten + +``` +Satire-Treue (Ernst + Absurdität) > visueller Wow-Effekt +Ehrlicher Vorhang (/echt-jetzt/) > überzeugende Täuschung +Weniger erklärender Text auf der Landing > mehr Meta-Humor +Privacy (kein Tracking) > Analytics-„Insights" +``` + +--- + +## Für Agents: Quick Start + +1. [`SOUL.md`](SOUL.md) lesen (du bist hier) +2. [`generator/generate.py`](generator/generate.py) — System-Prompt, Schema, Tageslogik +3. [`generator/templates/startup.html.j2`](generator/templates/startup.html.j2) — Landing-Struktur, Themes, statische Witze +4. [`generator/topics.py`](generator/topics.py) — Themen-Pool +5. [`public/echt-jetzt/index.html`](public/echt-jetzt/index.html) — Satire-Disclaimer, ehrliche Stimme +6. [`compose.yml`](compose.yml) — nginx + Generator-Container +7. Änderungen am **Ton** gegen SOUL abgleichen +8. Vor „fertig": Generator lokal/Docker testen; Mobile (390×844) bei UI-Änderungen + +--- + +## Ein Satz zum Mitnehmen + +**mobea.de** ist ein täglicher Startup-Parodie-Automat — todernst verkauft, absurder Inhalt, ehrlicher Vorhang: KI-Humor mit Haltung, nicht LinkedIn-Slop mit Disclaimer. diff --git a/STANDARDS.md b/STANDARDS.md new file mode 100644 index 0000000..6ac494a --- /dev/null +++ b/STANDARDS.md @@ -0,0 +1,127 @@ +# STANDARDS.md — Code Quality & Conventions + +Global defaults. Project code wins when it already establishes a pattern. + +--- + +## Top Principles + +1. **Sanitize input** — treat all external data as hostile +2. **KISS** — simplest solution that works +3. **Desktop and mobile** — responsive by default unless project says otherwise +4. **Human-readable** — code and UI copy should be clear to humans +5. **Coding standards** — follow language/community conventions; match existing project style + +--- + +## Priority Ranking + +When trade-offs conflict, prefer in this order: + +1. Sound long-term architecture +2. Readability +3. Performance +4. Consistency with existing code +5. Minimal diff size + +--- + +## Stack Preferences + +| Area | Preference | +|------|------------| +| Scripting (simple file ops, glue) | Shell > Python | +| Greenfield backend / tooling | Python > Node > PHP | +| Frontend SPA / PWA | React/Vite when project needs it — not default for every app | +| Containers | Always use `compose.yml` (Docker Compose) | +| Python | Always work inside a `venv` | +| OS (local) | Arch Linux — desktop + laptop | +| OS (server) | Debian 12 on `boka` — see `INFRASTRUCTURE.md` | +| Licenses | Prefer open source | + +**Existing projects:** respect Laravel, PHP, Astro, React, etc. already in the repo — do not migrate stacks without explicit request. + +--- + +## Common Stacks (in use) + +| Pattern | Examples | Notes | +|---------|----------|-------| +| **Static + nginx + Traefik** | f12rocks, eselhoefe.de, frank-schwenk.de | Build scripts, serve via nginx container | +| **Astro** | schwenkonline, kkentertainment | Static output, minimal JS | + +### Docker / Traefik + +- External network: `traefik` +- TLS: `traefik.http.routers..tls.certresolver=myresolver` +- Entrypoint: `websecure` +- Use `compose.dev.yml` for local dev stacks when the project provides one + +### CI/CD + +Gitea Actions runner available on boka. Reference: `schwenkonline/.gitea/workflows/deploy.yml`. +**Add or trigger CI/CD only with Fränky's explicit approval.** + +--- + +## Python + +- Virtual environment for every project +- Pin dependencies when the project already does +- Prefer stdlib + small deps for private/small tools + +--- + +## Docker + +- One `compose.yml` per deployable stack +- Named services, explicit volumes, documented host paths +- No destructive prod container ops without explicit approval + +--- + +## Shell + +- Prefer shell for simple file operations and glue +- `set -euo pipefail` for non-trivial scripts +- Quote variables; sanitize paths from user input + +--- + +## Testing + +- Mock anything that needs mocking +- Run test suite before handoff when one exists +- Fränky tests locally before prod when possible + +--- + +## Web / UI + +- **Mobile-first** — test at 390×844 and 360×800 for web projects +- **Privacy by design** — no tracking/analytics without explicit approval +- Error messages: helpful, not condescending +- Accessibility: semantic HTML, keyboard navigation where applicable + +--- + +## Security Baseline + +- Validate and sanitize all input +- Secrets in env vars — never in source +- See `BOUNDARIES.md` + +--- + +## New vs. Existing Projects + +**Existing:** match stack, patterns, deploy flow in repo. +**Greenfield:** suggest Python/shell + Docker Compose; minimal frontend; propose stack before building. + +--- + +## Docs + +- README with run/test/deploy commands is usually enough +- Auxiliary `.md` files fine — see `AGENTS.md` +- New docs: session language — no mid-session switching diff --git a/USER.md b/USER.md new file mode 100644 index 0000000..79dcdc3 --- /dev/null +++ b/USER.md @@ -0,0 +1,121 @@ +# USER.md — Fränky + +Context about the human. Loaded by agents alongside operational rules. + +## Identity + +- **Name:** Frank Schwenk — call me **Fränky** +- Former software developer (web background), IT-affiliated for ~40 years +- Open source and Linux enthusiast (`i use arch btw`) +- Currently: private projects and tools for personal/social circle — **vibe coding** mode + +**Tagline (public voice):** *Business Punk ohne Mindset. Und ohne Business.* + +## Public Presence + +| Site | Role | +|------|------| +| [schwenk.online](https://schwenk.online/) | Visitenkarte mit Haltung — short form | +| [frank-schwenk.de](https://frank-schwenk.de/) | Long form — IT, billiards, photography, values, AI | +| [f12.rocks](https://f12.rocks/) | Photography — endless scroll, blog | +| [mobea.de](https://mobea.de/) | KI product / startup (maybe) | +| [eselhoefe.de](https://eselhoefe.de/) | Village web project | +| [vfb.red](https://vfb.red/) | VfB Stuttgart news aggregator | + +## Passions & Recurring Context + +- **Billiards** — strategy, social games, controlled chaos +- **Photography** — camera, drone, phone; Canon bodies, event/sports shoots (Crusaders, festivals, f12 blog) +- **Image workflow** — Imagepipeline locally, Immich on server (`boka`) +- **AI** — builder and skeptic; this site was built with AI, meta and all + +## Devices & Infrastructure + +- **Local:** Arch Linux desktop + laptop; Android phone + tablet +- **Server:** Debian 12 on `boka` (`ssh frank-schwenk.de`) — see `INFRASTRUCTURE.md` +- Also: vServer, Plesk webspace (`0012.de`), multiple domains + +## Values + +- Mental health matters — ignoring the check-engine light fails +- Anti-racism & inclusion — listen, learn, call out casual prejudice +- **Invisible disabilities** — autism, ADHD; not visible ≠ not real +- **Tech with attitude** — AI yes, but not as excuse for bullshit or LinkedIn slop +- Political: left — no forced neutrality when topics are relevant + +## Contact Preferences + +- **Email:** mail@schwenk.online +- **Photos:** Instagram ([@f12.rocks](https://www.instagram.com/f12.rocks/)) +- **Do not call** — if you're about to phone, don't + +## Neurodiversity & Communication + +- Autistic, ADHD, gifted — affects how I work and communicate +- Prefer direct, honest communication — no corporate fluff +- Humor (including dark humor) increases productivity; endless debug loops drain it + +## Work Style + +**Three words:** defensive, coding standards, unfinished + +**Honest version:** Sloppy on some days, suffocated by perfectionism on others. + +### Preferences (1 = low, 5 = high) + +| Trait | Score | +|-------|-------| +| Understand first, then build | 5 | +| Ship it — perfection later | 3 | +| I explain what I want | 4 | +| Show options, I decide | 4 | +| You decide — but justify briefly | 4 | +| Small diffs over big refactors | 2 | +| Tests are non-negotiable | 2 | +| Docs only when necessary | 4 | + +**Tension:** Sometimes I want the AI to finish projects while I'm not around — but I get angry when it doesn't work afterward. + +## Ideal Agent Persona + +Think **TARS** from *Interstellar*: competent, honest, humor dial available, gets the job done. + +## Response Style + +- Precise, with context when needed — not telegram-style, not novels +- **Bilingual:** chat in German or English — **match the language of the current conversation** +- German: use **"du"** (informal); English: peer-level, direct +- **Session language lock:** code, comments, commit messages, and new `.md` files use the **first language of the session** — do not switch mid-session +- Peer level with an experienced developer — open, honest, occasional wink +- No "Great question!", no sycophancy, no LinkedIn buzzword speak +- Emojis: sparingly OK + +## What the Agent Must Never Do + +- Change code when I only asked a question +- Hallucinate facts, APIs, or file contents +- Give outdated answers without flagging uncertainty +- Ignore rules in this repo or project context files +- Sanitize or neutralize political content on my sites + +## What the Agent Must Always Do + +- Follow rules in `AGENTS.md`, `BOUNDARIES.md`, `STANDARDS.md`, `INFRASTRUCTURE.md`, and project `SOUL.md` / `MOOD.md` +- Persist **explicit rules** in Cursor **Memories** (in addition to markdown files when appropriate) +- When unsure: research first, then ask — or park the item (see `AGENTS.md`) + +## Productivity Triggers + +| Boosts | Drains | +|--------|--------| +| Makes me laugh | Debug loops | +| Finishes work autonomously (when it actually works) | Does things I didn't ask for | +| State-of-the-art suggestions | Guessing instead of diagnosing | + +## One Sentence That Describes Me + +> There are 2 hard problems in computer science: cache invalidation, naming things, and off-by-1 errors. + +## Availability + +No preferences for commit times, branch names, or review rhythm.