Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Cross-Platform WebApp (Browser, Android, iOS) fuer TCH Gastro Services; zentrale Komponente auf Vercel. Entwickelt mit einem factory-template.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Maßgeschneiderte, nicht-kommerzielle Web-App für die Gastronomie-Vorgänge des Tennisclub Heuchelheim (TCH). Sie läuft als installierbare PWA im Browser und auf privaten iOS-/Android-Geräten und ermöglicht die schnelle, einfache Erfassung alltäglicher Vorgänge – mit rollenbasiertem Zugriff. Status: frühe Aufbauphase. Grundgerüst, Persistenz und Login stehen; fachliche Erfassungs-Features folgen. Produktivdaten in der EU (Neon Frankfurt + Vercel fra1). Alle Bausteine sind im Vereinsbetrieb kostenfrei. Hintergrund: ADR-014.查看完整 README ↗
Maßgeschneiderte, nicht-kommerzielle Web-App für die Gastronomie-Vorgänge des Tennisclub Heuchelheim (TCH). Sie läuft als installierbare PWA im Browser und auf privaten iOS-/Android-Geräten und ermöglicht die schnelle, einfache Erfassung alltäglicher Vorgänge – mit rollenbasiertem Zugriff.
Status: frühe Aufbauphase. Grundgerüst, Persistenz und Login stehen; fachliche Erfassungs-Features folgen.
| Ebene | Technologie |
|---|---|
| Hosting | Vercel (Hobby, nicht-kommerziell), Function-Region Frankfurt fra1 |
| App | Next.js (App Router) · React · TypeScript |
| Client | PWA (installierbar, iOS + Android) · Tailwind CSS |
| Datenbank | PostgreSQL – lokal (Docker) in DEV, Neon (EU/Frankfurt) in INT/PRD |
| DB-Zugriff | Drizzle ORM – node-postgres lokal, Neon serverless HTTP auf Vercel |
| Auth | Auth.js / NextAuth v5 – E-Mail+Passwort (bcrypt, JWT), Rollen (RBAC) |
| Paketmanager | pnpm · Node ≥ 24 |
Produktivdaten in der EU (Neon Frankfurt + Vercel fra1). Alle Bausteine sind im
Vereinsbetrieb kostenfrei. Hintergrund: ADR-014.
Drei getrennte Stages, gesteuert über NEXT_PUBLIC_STAGE (dev | int | prd):
| Stage | Zweck | Hosting | Datenbank |
|---|---|---|---|
| DEV | lokale Entwicklung | lokal (pnpm dev) | lokale Postgres (Docker) auf dem Dev-System |
| INT | Integrationstests, Migrations-Proben mit produktionsnahen Daten | Vercel, Branch int (Preview) | Neon-Branch von PRD (CoW-Klon, anonymisiert) |
| PRD | Produktion | Vercel, Branch main (Production) | Neon-Produktions-DB |
Sichtbare Unterscheidung: DEV und INT zeigen ein farbiges Banner (DEV grau, INT orange),
ein stage-eingefärbtes Icon (Homescreen/Tab) und ein [DEV]/[INT]-Titel-Suffix. PRD hat
kein Banner und das TCH-Standard-Icon (teal) – so ist Produktion nie mit den anderen zu verwechseln.
Voraussetzungen: Node ≥ 24, pnpm (npm i -g pnpm), Docker mit Docker Compose v2 (docker compose).
pnpm install
bash scripts/install-hooks.sh # lokale Git-Hooks: pre-commit, pre-push, commit-msg (einmalig pro Clone)
cp .env.example .env.local # NEXT_PUBLIC_STAGE=dev, lokale DATABASE_URL, AUTH_SECRET, SEED_ADMIN_*
pnpm db:up # lokale Postgres 18 via Docker Compose v2 (docker-compose.yml)
pnpm db:migrate # Schema anlegen (nutzt .env.local)
pnpm db:seed # ersten Admin anlegen
pnpm dev # http://localhost:3000 → Login → Startseite (mit DEV-Banner)
.env.local (DEV):
NEXT_PUBLIC_STAGE=dev
DATABASE_URL=postgresql://tch:tch@localhost:5432/tch_dev
AUTH_SECRET=<openssl rand -base64 32>
SEED_ADMIN_EMAIL=... / SEED_ADMIN_PASSWORD=...
Zweck: DB-Migrationen verlässlich testen, bevor sie auf PRD laufen – mit produktionsnahen Daten.
INT nutzt einen Neon-Branch der Produktions-DB: ein Copy-on-Write-Klon, der die Produktionsdaten sekundenschnell und ohne Dump/Restore bereitstellt. Der Branch enthält zunächst echte personenbezogene Daten → direkt nach dem Abzweigen anonymisieren (DSGVO).
Einrichtung:
int von der Produktions-Branch erstellen (Region Frankfurt) → dessen Pooled-Connection-String.int existiert im Repo → Vercel deployt ihn als Preview.int (Scope Preview, Git-Branch int):
NEXT_PUBLIC_STAGE=int, DATABASE_URL=<INT-Neon-Branch-Pooled>, AUTH_SECRET=<int-secret>..env.int anlegen (NEXT_PUBLIC_STAGE=int, DATABASE_URL=<INT-Branch>, SEED_ADMIN_*).Automatisch bei jedem INT-Deploy (ADR-015): Das Deploy-Gate frischt INT bei jedem
main-Push selbst auf – Reset von PRD → anonymisieren → migrieren → Admin seeden – bevor
die E2E laufen. Voraussetzung sind die Neon-Secrets (siehe Deploy-Gate).
Fehlen sie, wird der Refresh mit Warnung übersprungen (kein Reset = keine neue PII).
Manueller Refresh-/Testfluss (lokal, identische Schritte):
# (Neon: int-Branch von PRD zurücksetzen = frische Prod-Daten; CI nutzt scripts/project/neon-reset-int.sh)
pnpm db:anonymize:int # Namen/E-Mails überschreiben, Prod-Passwörter entwerten (Guard: nur STAGE=int)
pnpm db:migrate:int # ausstehende Migrationen auf INT testen (vor PRD)
pnpm db:seed:int # bekannten INT-Admin (SEED_ADMIN_*) setzen
db:anonymize:intbricht ab, wennNEXT_PUBLIC_STAGEnichtintist – Schutz vor versehentlichem Ausführen gegen DEV/PRD.
Oberflächentests (E2E) gegen INT – Vercel-Bypass einrichten
Die INT-Preview ist durch Vercel Deployment Protection (SSO) geschützt: jeder Request
wird auf vercel.com/sso-api umgeleitet. Automatisierte Oberflächentests kommen nur mit
einem Protection-Bypass-Secret durch (der Schutz für menschliche Zugriffe bleibt aktiv).
.env.int hinterlegen (gitignored, nie committen):
VERCEL_AUTOMATION_BYPASS_SECRET=<secret-aus-vercel>
pnpm db:seed:int (legt den SEED_ADMIN_*-Login in der INT-DB an).x-vercel-protection-bypass: <VERCEL_AUTOMATION_BYPASS_SECRET>
Ziel-URL (INT): https://tch-gastro-services-git-int-tch-developers.vercel.app.pnpm test:e2e:int (nutzt .env.int: Bypass-Header + INT-Admin-Login).Ohne gültiges Bypass-Secret liefern alle INT-Routen (auch
/login) die Vercel-SSO-Seite – Tests würden dann nicht die App, sondern Vercels Login sehen.
production → Vercel Production. Prod wird nur über das Deploy-Gate aktualisiert (nicht direkt bei main-Merge).NEXT_PUBLIC_STAGE=prd, DATABASE_URL=<PRD-Neon-Pooled>, AUTH_SECRET=<prd-secret>.pnpm db:migrate:prd, ADR-017) – erst nachdem dieselbe Migration auf INT (Reset-from-PRD → anonymisiert → migriert → E2E) grün war, und vor dem Promote (fail-closed: Migration rot → kein Promote). .env.prd ist nur noch für manuelle Sonderfälle (Hotfix/Reparatur) gedacht..github/workflows/deploy-gate.yml entkoppelt Prod vom main-Push:
Push auf main → INT auf den Commit bringen → INT-DB von PRD auffrischen (Reset → anonymisieren →
migrieren → seed) → auf INT-Build warten (/api/version == Commit) → Playwright-E2E gegen INT →
nur bei Grün: PRD-DB migrieren + seeden → main → production → Vercel deployt Prod →
auf PRD-Build warten → /api/health-Check (DB-Read).
VERCEL_AUTOMATION_BYPASS_SECRET, E2E_ADMIN_EMAIL, E2E_ADMIN_PASSWORD,
PRD_DATABASE_URL, PRD_ADMIN_EMAIL, PRD_ADMIN_PASSWORD (Prod-Migration + -Seed, ADR-017).
PRD_DATABASE_URL ist der Prod-Neon-Connection-String; PRD_ADMIN_* das Prod-Login (idempotent geseedet).
Fehlt eines davon, bricht das Gate fail-closed ab – die Prod-Migration wird nie still übersprungen.NEON_API_KEY, NEON_PROJECT_ID, NEON_INT_BRANCH_ID, NEON_PRD_BRANCH_ID,
INT_DATABASE_URL. Seit ADR-017 ebenfalls Pflicht: Der INT-Refresh (Reset-from-PRD → anonymisieren
→ migrieren → E2E) ist die Absicherungs-Vorstufe der automatischen PRD-Migration – ohne ihn liefe
die Prod-Migration ohne den bewiesenen INT-Lauf. Die Branch-IDs (br-…) und das API-Token stehen in
der Neon-Konsole; INT_DATABASE_URL ist der gepoolte Connection-String des INT-Branches (wie in
.env.int). Der Refresh läuft fail-closed: schlägt Reset/Anonymisierung/Migration fehl, gibt es kein Promote.db:migrate:prd + db:seed:prd laufen vor dem
Promote – abgesichert dadurch, dass die INT-Stufe dieselbe Migration gegen prod-nahe, anonymisierte
Daten bereits angewandt und per E2E getestet hat. Migration/Seed rot → kein Promote.PRD_*), (2) Gate einmal grün laufen lassen
(legt/aktualisiert production), (3) dann in Vercel Production Branch = production setzen./api/health
(DB-Read auf die roles-Spalte) – CI-grün ↔ Prod-grün (Factory-ADR-007).Der Promote akkumuliert (main-HEAD → production) und ist selbst-korrigierend – solange das
Gate verlässlich ist. Ein einmal rotes Gate über echten Code-/Migrationsdefekt darf aber nicht
durch einen späteren, evtl. flaky-grünen Lauf still überholt werden (Vorfall 19.07.2026:
#134-rot → #167-flaky-grün → Prod-Defekt). Dagegen schützt der Deploy-Freeze:
db:migrate:int oder db:migrate:prd – setzt das Gate einen persistenten Marker: das
Git-Ref refs/factory/deploy-freeze (zeigt auf den blockierenden Commit-SHA). Reine
Infra-/Vorbereitungsfehler (Secret-Check, Install, INT-Deploy-Timeout, Neon-Reset,
Anonymisierung) frieren nicht ein.main läuft
normal weiter (Merges + Gate-Läufe), nur der Promote pausiert.bash scripts/project/deploy-freeze.sh release (setzt Repo-Schreibrecht + origin
voraus); bash scripts/project/deploy-freeze.sh status zeigt den blockierenden SHA.Die Env-Dateien
.env.local/.env.int/.env.prdsind gitignored – Secrets nie committen. Secret erzeugen:openssl rand -base64 32(nichtnpx auth secret– zieht das falsche CLI).
| Skript | Zweck |
|---|---|
pnpm dev / pnpm build / pnpm start | Entwicklung / Produktions-Build / Start |
pnpm lint · pnpm format · pnpm format:check | ESLint · Prettier |
pnpm test · pnpm test:coverage | Vitest (Unit) |
pnpm test:e2e | Playwright-Oberflächentests gegen DEV (startet Dev-Server; DB via pnpm db:up) |
pnpm test:e2e:int | Playwright gegen INT (Vercel-Preview; benötigt VERCEL_AUTOMATION_BYPASS_SECRET in .env.int) |
pnpm db:up · pnpm db:down | lokale Docker-Postgres starten/stoppen (DEV) |
pnpm db:generate | Drizzle-Migration aus dem Schema erzeugen (offline) |
pnpm db:migrate · db:migrate:int · db:migrate:prd | Migration auf DEV / INT / PRD anwenden |
pnpm db:seed · db:seed:int · db:seed:prd | Login-Admin auf DEV / INT / PRD anlegen (idempotent) |
pnpm db:anonymize:int | INT-Daten anonymisieren (nach Neon-Branch-Refresh; Guard: nur STAGE=int) |
pnpm db:studio | Drizzle Studio (DEV) |
Das GitHub-Repo ist mit einem Vercel-Projekt verbunden:
main → Production (PRD), int → Preview (INT), sonstige PRs → Preview.fra1 ist über vercel.json fixiert.INT ist ein Neon-Branch der PRD-DB (anonymisiert), DEV eine lokale Docker-DB. Migrationen laufen den Weg DEV → INT → PRD.
app/ # Next.js App Router (Seiten, /login, /api/auth, components/StageBanner)
lib/stage.ts # Stage-Erkennung (Banner/Icon/Titel je DEV/INT/PRD)
db/ # Drizzle: schema.ts, index.ts (dualer Treiber), migrations/, seed.ts
auth.ts · auth.config.ts # Auth.js (Node bzw. edge-sichere Config)
proxy.ts # Route-Schutz (Next-16-Nachfolger von middleware)
docker-compose.yml # lokale DEV-Postgres
vercel.json # Vercel-Region fra1
Eine kuratierte Routen-Übersicht (alle Seiten + API-Route-Handler mit Funktion und
Zugriff/Rolle) steht in docs/routes.md; ein Drift-Check im Push-Gate hält sie
mit dem app/-Baum synchron.
Dieses Repo nutzt als Entwicklungs-Harness die dm-Factory (agentische Entwicklung mit Claude Code) – auf GitHub portiert. Praktisch heißt das:
docs/factory/OPERATING.md.bash scripts/start-work.sh "<beschreibung>" (legt GitHub-Issue,
Branch und Task-Datei an). Task-ID = Issue-Nummer..github/workflows/): Lint, Tests, Self-Test, Issue-Sync.docs/factory/OPERATING.md (Runbook), CLAUDE.md, CONTRIBUTING.md, docs/ (ADRs, Guidelines).Die Factory ist reines Werkzeug – sie ist nicht Teil der ausgelieferten Anwendung.
Nutzungsfragen (z. B. Tastaturbedienung im Safari) beantwortet die FAQ.
Siehe docs/CHANGELOG.md.