Entschieden und festgehalten: jede Akte trägt Kurzvermerke und Dokumente, die Fallakte zusätzlich ihre Abschnitte. Die Trennung aus docs/05 bleibt damit bestehen. Eine Vorlage ist jetzt eine geordnete Liste von Bausteinen. Manche nehmen eine Eingabe entgegen, andere liefern festen Text mit Platzhaltern. Damit tragen dieselbe Struktur ein Vorfallsbericht, der fast nur aus Eingaben besteht, und ein Sonderarbeitsvertrag, der fast nur aus Paragraphen und Unterschriftenzeilen besteht. Eine neue Dokumentart bleibt ein Datensatz, kein Deployment. Der Schwärzungs-Parser gibt Segmente zurück, nicht den vollen Text mit einem Sichtbarkeits-Flag: was der Client ausblenden müsste, hat er dann schon. Die Balkenlänge wird auf ein Raster von acht Zeichen gerundet, sonst verrät sie, wie lang der geschwärzte Name war. Ein Test vergleicht den TypeScript-Parser gegen die SQL-Funktion strip_redactions aus der Migration. Laufen die beiden auseinander, findet die Suche einen Begriff, den die Ansicht verbirgt — und der Treffer allein verrät ihn dann.
AfiS-Aktensystem
Fallakten-, Personalakten- und Ermittlungsverwaltung für die Abteilung für innere Sicherheit eines SCP-RP-Servers. Anmeldung und Berechtigungen laufen vollständig über Discord.
Los geht's
- Ordner in ein leeres Git-Repository legen
- Discord-Application anlegen, Bot einladen, Server Members Intent aktivieren
- Claude Code im Projektordner starten
Gehostet wird als ein Dockge-Stack auf dem Homeserver. Die fertige compose.yaml und die
Einrichtungsschritte stehen in docs/11-betrieb.md. Die .env wird nicht im Repository
gepflegt, sondern im .env-Reiter von Dockge; .env.example ist nur die Vorlage.
Claude Code liest CLAUDE.md von selbst. Die Fachdokumente liegen in docs/, der Bauplan
in TASKS.md.
Erste Anweisung an Claude Code
Lies CLAUDE.md und alle Dateien in docs/. Fass in fünf Sätzen zusammen, was gebaut wird, und nenn mir alles, was in den Dokumenten widersprüchlich oder unklar ist, bevor du anfängst. Baue noch nichts.
Danach Phase für Phase aus TASKS.md. Siehe docs/12-arbeiten-mit-claude-code.md.
Aufbau
CLAUDE.md Projektanweisung, wird automatisch gelesen
TASKS.md Bauplan in neun Phasen
docs/ Fachdokumente, dazu 13-entscheidungen.md
compose.yaml Der Dockge-Stack
.env.example Vorlage für den .env-Reiter in Dockge
web/ Next.js 15, App Router
worker/ discord.js, Rollen-Abgleich
pdf/ Playwright, PDF-Erzeugung
packages/db/ Prisma-Schema, Migrationen, Seed
docker/ Dockerfiles für web, worker und pdf
Lokal entwickeln
Node 22 und pnpm 9.
corepack enable && pnpm install
docker run -d --name afis-db -e POSTGRES_DB=afis -e POSTGRES_USER=afis \
-e POSTGRES_PASSWORD=afis -p 5434:5432 postgres:16-alpine
cp .env.example .env
# DATABASE_URL und DIRECT_DATABASE_URL auf localhost:5434 zeigen lassen
pnpm --filter @afis/db run build # erzeugt den Prisma-Client
pnpm db:deploy && pnpm db:seed
pnpm dev
Prüfen wie die CI:
pnpm lint && pnpm typecheck && pnpm test
pnpm test:e2e
pnpm test legt sich eine eigene Datenbank afis_test an und lässt die
Entwicklungsdatenbank in Ruhe. Grund in docs/13-entscheidungen.md.
Betrieb kurz gefasst
| Verwaltung | Dockge, ein Stack namens afis unter /opt/stacks/afis/ |
| Erreichbarkeit | Cloudflare Tunnel, kein offener Port am Router |
| Aktualisieren | Dockge → Stack → Update, Migration läuft automatisch mit |
| Backup | zwei Dauerläufer mit Cron: nächtlicher Dump plus restic offsite |