Jonas Krauss

Portfolio

Schreibdran Abenteuer

KI-gestütztes Text-Adventure in der Fantasy-Welt von „Als die Götter erstarrten“ — Next.js, Supabase-Minimal-Stack und LLM-Integration über das Kilo Gateway. Ein kreatives Hobby-Projekt.

Herausforderung

Ein interaktives Text-Adventure zu bauen, das nicht auf vorgefertigten Story-Bäumen beruht, sondern jede Szene dynamisch aus einem Sprachmodell generiert. Die Aufgabe: Eine Fantasy-Welt glaubwürdig erzählen, auf die Entscheidungen der Spielenden reagieren und dabei konsistent bleiben — ohne dass ich jede Verzweigung manuell schreiben muss. Und das Ganze so betreiben, dass es ohne teure Cloud-Dienste läuft.

Ansatz

Das Abenteuer ist ein eigenständiges Next.js-Frontend (schreibdran3, Turborepo mit shared + web) gegen eine schlank selbst gehostete Supabase-Instanz:

  1. Charakter-Setup — Spielende legen Name, Geschlecht, Beruf, Hintergrund, Motivation und Stärken/Schwächen an. Das Profil wird als Spielkontext in die Prompts eingebettet und beeinflusst den Erzählton.
  2. LLM-gestützte Szenen — Der Geschichtsverlauf wird aus dem LLM generiert. Jede Entscheidung wird per char_auth_key (Anon-Key) als Gast gespeichert; wer sich registriert, behält den Charakter dauerhaft.
  3. Dynamische Verzweigung — Statt fester Pfade generiert das Modell die nächste Situation abhängig von den bisherigen Entscheidungen. Der Verlauf bleibt über Session + Message-Tabellen erhalten.

Self-Hosted statt Cloud

Ursprünglich lief das Abenteuer gegen Supabase Cloud und das Vercel AI Gateway. Beides wurde auf eigene Infrastruktur migriert:

  • Supabase-Minimal-Stack (/opt/prod/schreibdran-supabase): schreibdran-db (Postgres 15.8), schreibdran-auth (GoTrue, Anon-Sign-ins, GOTRUE_DB_NAMESPACE=auth) und schreibdran-rest (PostgREST mit RLS). Traefik routet /auth/v1 und /rest/v1 auf die Dienste.
  • Kilo Gateway — Anthropic-kompatibler Endpoint statt Vercel AI Gateway: Modell z-ai/glm-5.3-flash, authToken (Bearer) statt apiKey, und max_tokens ≥ 4000 — das GLM-„Thinking“ frisst sonst das Budget vor dem Text-Block. NEXT_PUBLIC_SUPABASE_URL/ANON_KEY sind Build-Args (werden zur Build-Zeit ins Client-Bundle gebacken).

Ergebnisse

  • Voll funktionsfähiges Text-Adventure unter adventure.jonaskrauss.de
  • Konsistente, dynamische Szenen — jeder Spieldurchlauf ist anders
  • Gast-Spiel sofort möglich, Registrierung optional für dauerhaft gespeicherte Charaktere
  • Komplett selbst gehostet: kein Supabase Cloud, kein Vercel AI Gateway — volle Kontrolle über Daten und Kosten

Tech Stack

  • Frontend: Next.js (App Router), React, TypeScript, Tailwind CSS
  • Backend/DB: Supabase-Minimal-Stack (Postgres 15.8, GoTrue, PostgREST)
  • KI: Kilo Gateway (Anthropic-kompatibel), Modell z-ai/glm-5.3-flash
  • Tooling: Turborepo, pnpm, Docker, Traefik (Let's Encrypt), Docker-Compose