Zum Inhalt springen

Persönliches Projekt · Live

PromptPrinter

Ein KI-Chat, der vor dem Bauen die Fragen stellt, die dein Bau-Tool nie stellt, und daraus den fertigen Prompt für Lovable, Cursor, Claude Code & Co. macht.

PromptPrinter: Finn, der Delfin, feiert neben den Karten „Finn is listening“ und „Your Build Package“ Live · promptprinter.app

Über das Projekt

251TypeScript-Dateien
662Unit-Tests, alle grün
36SQL-Migrationen
1Entwickler

PromptPrinter ist mein eigenes SaaS-Projekt: kein Schulauftrag, sondern aus einer eigenen Idee entstanden, über Monate allein gebaut und seit August 2026 live unter promptprinter.app. Zielgruppe sind „Vibe-Coder“: Leute, die ihre Ideen mit KI-Bau-Tools wie Lovable, Cursor, Claude Code oder Bolt umsetzen.

Der Kern ist ein einziges Versprechen: keine Credits verbrennen. Bau-Tools legen sofort los, auch wenn die Beschreibung Lücken hat, und die kosten hinterher Nachbesserungsrunden, für die man wieder bezahlt. Finn, das Maskottchen und der Chat-Assistent der App, fragt deshalb vorher in einer gebündelten Rückfrage nach Ziel-Tool, Kern-Screens, Datenmodell, Login und Design-Richtung. Danach kommt der fertige, aufs Ziel-Tool zugeschnittene Prompt: ein Klick zum Kopieren.

Chats & Projekte

Chats

Eine Chat-Erfahrung

Idee beschreiben, eine Rückfrage beantworten, Prompt kopieren. Die Antwort streamt Token für Token herein, das Ziel-Tool ist pro Chat einstellbar, diktieren statt tippen geht auch.

Projekte

Vollwertige Arbeitsräume

Eigene Anweisungen, hochgeladene Dateien und mehrere Chats pro Projekt. Der Kontext fliesst automatisch in jeden Chat, gelungene Prompts landen per Klick in den Ergebnissen.

Funktionen

Streamender Chat mit Finn: die Antwort erscheint Token für Token über Server-Sent Events, abbrechbar mitten im Lauf; der Abbruch stoppt auch den Aufruf beim KI-Anbieter, nicht nur die Anzeige.
Ziel-Tool pro Chat: Lovable, Cursor, Claude Code, v0, Bolt & Co. als Ein-Klick-Auswahl plus Freitext, damit ein neues Tool keinen Code-Release braucht.
Projekt-Workspaces: Anweisungen, Dateien (privater Storage-Bucket) und mehrere Chats; der Kontext wird mit festem Zeichenbudget priorisiert injiziert statt blind angehängt.
Eigene KI-Keys (BYOK): Anthropic, OpenAI, Gemini oder ein OpenAI-kompatibler Endpunkt, AES-256-GCM-verschlüsselt gespeichert. Ein eigener Key hebt alle Limits auf.
Gespeicherte Prompts: was funktioniert hat, landet per Klick in einer durchsuchbaren Bibliothek, mit Markdown- und PDF-Export. Bewusst ohne Modell-Aufruf, also gratis.
Kompletter Auth-Flow: Login, Signup, Passwort-Reset und Konto-Löschung, abgesichert über Supabase Row Level Security und Cloudflare Turnstile. Dazu ein eigenes Hilfe-Center und echte Rechtstexte.
Sprachmodus, Command-Palette (⌘K), Onboarding-Tour, Dark Mode und ein eigenes Mobile-Layout: barrierefrei mit über 4,5:1 Kontrast in beiden Themes, per Test abgesichert.

Galerie

Alles auch auf Handy-Breite, mit eigenem Mobile-Layout statt gestauchtem Desktop:

Herausforderungen & Lösungen

Ich habe die App zweimal gezielt gegen mich selbst geprüft: als schonungsloser QA-Audit (61 Befunde) und als Sicherheits-Audit vor dem Launch (17 Befunde). Vier Funde, die wehgetan haben:

Sicherheit & Kosten

Ein offener Endpunkt, der echtes Geld kostet

ProblemDie Chat-Route lief ohne Anmelde-Prüfung: Anonyme Anfragen sprangen an der Kontingent-Logik vorbei und direkt auf meinen KI-Key. Der einzige Schutz war ein Limit pro IP: gelesen aus einem Header, den der Aufrufer selbst setzt. Durchgerechnet rund 400 € pro Stunde auf meiner Kreditkarte, von einem einzigen Rechner aus.

LösungAnmelde-Pflicht auf der Route, die IP-Ermittlung so umgestellt, dass sie nicht mehr vom Aufrufer bestimmt werden kann, und als Notbremse ein globales Tagesbudget für Modell-Aufrufe auf dem Server-Key.

Kernfunktion

Der wertvollste Chat starb zuerst

ProblemAb der 26. Runde antwortete ein Chat nur noch mit einem Fehler: dauerhaft, auch nach Neuladen, weil er aus den gespeicherten Daten entstand. Ursache war eine Obergrenze in der Validierung, die griff, bevor die serverseitige Kürzung lief. Betroffen war ausgerechnet der lange, iterativ verfeinerte Chat: die Kernschleife des Produkts.

LösungDer Client schickt nur noch den relevanten Ausschnitt des Verlaufs, der Server klammert zu lange Verläufe zusätzlich vor der Validierung. Bestandschats funktionieren sofort wieder, ohne Migration: plus Regressionstests, die genau diesen Fall festhalten.

Sicherheit

Eigene KI-Keys öffneten ein Tor ins interne Netz

ProblemWer einen eigenen Anbieter hinterlegt, gibt dessen Adresse an, und der Server ruft sie ab. Geprüft wurde nur „ist das eine URL“. Damit konnte jeder angemeldete Gratis-Nutzer den Server dazu bringen, interne Ziele abzurufen: Cloud-Metadaten, localhost, private Netzbereiche.

LösungEine eigene Prüfung erzwingt HTTPS, löst den Hostnamen wirklich auf und lehnt jede Adresse in privaten oder reservierten Bereichen ab. Ein erster fehlschlagender Test deckte dabei einen Sonderfall auf, den ich nicht auf dem Zettel hatte: die normalisierte Hex-Schreibweise IPv4-gemappter IPv6-Adressen.

Geschäftsmodell

Preise, die nie gegen die echten Kosten gerechnet waren

ProblemDie ersten Kontingente (200 bzw. 2000 Nachrichten pro Monat) waren als „grosszügig“ gesetzt: geschätzt, nie gegen die tatsächlichen Kosten pro Nachricht geprüft. Durchgerechnet hielt die Rechnung nicht: Jede Gratis-Anmeldung erzeugte strukturelle Kosten auf meinem Key.

LösungErst technisch: günstigeres Standardmodell, gekürzter Verlauf, halbierte Kontext-Budgets. Dann die ehrlichere Produktentscheidung: Free setzt einen eigenen Key voraus und ist dafür wirklich unbegrenzt und gratis. Pro (5,90 €/Monat) verkauft genau das, was es kostet: dass ich mich um den Key kümmere.

Entwicklungsreise

1 · Idee & Name

Beobachtung: Die Qualität dessen, was KI-Tools liefern, hängt direkt an der Qualität des Prompts: Gute Prompts zu schreiben ist aber Arbeit. „PromptPrinter“ als Metapher: Die App druckt Prompts wie ein Drucker Dokumente.

2 · Stack-Entscheidungen

Next.js 15 mit App Router und React 19, Supabase als Backend mit Row Level Security. Wichtigste Architektur-Entscheidung: Der Modellzugriff sitzt komplett in einer Datei. Anbieter wechseln oder ergänzen ist damit eine Änderung an genau einer Stelle: was sich später mehrfach ausgezahlt hat.

3 · Feature für Feature

Auth, Chat, Projekt-Workspaces, Dateien, Command-Palette, responsives Layout: jedes Feature einzeln gebaut, getestet und gepusht, mit einem festen Quality-Gate vor jedem Commit: Typecheck, Lint, Tests und Production-Build müssen grün sein.

4 · Branding: Finn

Vom abstrakten Logo zum Charakter: Finn, der Delfin, mit 14 Zuständen (neugierig, denkend, feiernd, wartend …) als eigenes State-System. Er begleitet durch Landing Page und App und ist bewusst so gebaut, dass jeder Screen auch ohne ihn funktioniert.

5 · Umbauen und weglassen

Der grösste Umbau: eine einzige Chat-Erfahrung statt getrennter Modi, Projekte als vollwertige Arbeitsräume. Und die unangenehmere Hälfte davon: ein Feature, das auf Knopfdruck zehn Dokumente auf einmal erzeugte, ersatzlos entfernt. Wer einen Prompt wollte, bekam einen Stapel. Danach ein „Wahrheits-Pass“ über alles, was es noch versprach, bis in die AGB hinein.

6 · Zwei Audits gegen mich selbst

QA-Audit mit 61 Befunden, danach ein Sicherheits-Audit mit 17 weiteren. Alle kritischen und hohen Befunde behoben, je als eigener Commit mit grünem Gate; jede Datenbank-Änderung live angewendet und als angemeldeter Nutzer verifiziert. Die Testsuite wuchs dabei von 259 auf 662 Tests.

7 · Launch

Seit August 2026 öffentlich erreichbar unter promptprinter.app: eigene Domain, echte Nutzer, echte Datenbank. Offen bleibt bewusst nur die Zahlungsanbindung: Pro läuft bis dahin als Vormerkung statt als Kaufabschluss.

Design-Philosophie

„Finn’s World“: eine ruhige, lichtdurchflutete Ozean-Atmosphäre aus Creme, Babyblau, Koralle und Navy statt generischem SaaS-Look, über einem zurückhaltenden Dev-Brand-Fundament in der Nähe von Linear oder Raycast.
Eigenes HSL-Token-System in Tailwind: Rohe Hex-Farben sind in Komponenten verboten, damit beide Themes garantiert mitwandern. Animationen mit Framer Motion, global auf prefers-reduced-motion gedrosselt.
Grundregel für das Maskottchen: Jeder Screen muss auch ohne Finn funktionieren. Er ist Begleiter, nicht Krücke.

Tech-Stack

Frontend

Next.js 15 (App Router) React 19 TypeScript (strict) Tailwind CSS Framer Motion next-themes react-markdown Radix UI

Backend & Daten

Supabase (Auth · Storage) PostgreSQL Row Level Security Route Handlers Server-Sent Events Zod Upstash Redis

KI-Anbieter

Z.ai / GLM Google Gemini Anthropic (BYOK) OpenAI (BYOK) OpenAI-kompatibel (BYOK)

Sicherheit

AES-256-GCM CSP mit Nonce SSRF-Schutz Rate Limiting Cloudflare Turnstile

Qualität & Betrieb

Vitest (662 Tests) Testing Library ESLint GitHub Actions Docker jsPDF