Zurück zum Blog

KI-API-Kosten senken mit Hugging Face + Claude: Hybrid-Setup-Leitfaden

1. April 202613 Min.
Entwickler-Tools

Die meisten Entwickler stoßen an dieselbe Grenze: Claudes 20-$/Monat-Abonnement deckt die tägliche Nutzung ab, aber sobald Sie anfangen, Audits durchzuführen, Dokumentation zu entwerfen und PRs im großen Stil zu prüfen, steigen die API-Kosten schnell. Die Lösung ist ein Hybrid-Setup — lassen Sie einen selbstgehosteten Hugging-Face-Agenten die umfangreiche Arbeit mit geringerem Risiko übernehmen und halten Sie Claude auf die Aufgaben fokussiert, die seine Präzision brauchen.

Routing Strategy

Hugging FaceHugging Face Agent

local / PikaPods

AuditsDocsResearchReviewsPRsPlans
+
🤖Claude Code

API

RefactorsBugsMigrations

Hugging Face

Übernimmt alles, was repetitiv, breit angelegt oder explorativ ist — Audits, Dokumentation, Recherche, PR-Beschreibungen — zu null oder nahezu null Kosten pro Token. Es gibt zwei Wege, das einzurichten: über einen Terminal-Agenten namens OpenCode mit den gehosteten Inference Providers von Hugging Face verbinden, oder ganz auf gehostete Inferenz verzichten und ein Modell vollständig lokal mit Ollama laufen lassen. Beide fügen sich in denselben Terminal-Workflow ein, und keines ändert, wie Sie Git bereits nutzen — entscheiden Sie danach, ob Sie lieber ein paar Dollar im Monat für gehostete GPU-Inferenz zahlen oder alles auf Ihrer eigenen Maschine behalten wollen.

🤖 Was ist OpenCode?

OpenCode ist ein terminalbasierter KI-Coding-Agent. Er sitzt zwischen einem Modell — in diesem Setup Hugging Face — und Ihrem lokalen Projektordner und gibt diesem Modell die Fähigkeit, Ihren Code zu lesen, Dateien zu bearbeiten und zu erstellen, Terminal-Befehle auszuführen, Fehler zu untersuchen und dateiübergreifend zu suchen. Er greift nicht direkt auf Git oder GitHub zu; Ihr bestehender git add / commit / push-Workflow bleibt genau derselbe.

Option A — Hugging-Face-Inferenz über OpenCode

Das ist das umfassendere Setup: gehostete Inferenz, keine lokale GPU nötig, eingebunden in dasselbe Terminal, das Sie bereits für Claude Code nutzen, gerichtet auf ein Repo, das bereits mit GitHub synchronisiert ist.

1. Erstellen Sie ein Hugging-Face-Konto

Registrieren Sie sich auf huggingface.co/join — Sie müssen kein Modell-Repo, Dataset oder Space anlegen. Das Konto allein reicht aus, um später einen Token zu erzeugen.

2. Installieren Sie die Hugging-Face-CLI

▶ show code
brew install hf
hf --help

Melden Sie sich dann an. Der Browser-Flow ist die einfachste Option — er gibt Ihnen einen Code, öffnet Hugging Face und speichert die Anmeldedaten lokal, sobald Sie zustimmen:

▶ show code
hf auth login
hf auth whoami

hf auth whoami sollte Ihren Hugging-Face-Benutzernamen zurückgeben — das bestätigt, dass die Anmeldung geklappt hat.

3. Installieren Sie OpenCode

▶ show code
brew install anomalyco/tap/opencode
opencode --version

Der anomalyco-Tap ist der eigene Homebrew-Tap des OpenCode-Teams und erhält Updates in der Regel schneller als die gespiegelte Formel.

4. Erstellen Sie einen Hugging-Face-API-Token für OpenCode

Der Schritt hf auth login oben authentifiziert das hf-CLI selbst und speichert eine interne OAuth-user-Anmeldeinformation — Sie sehen eine Bestätigung wie "The token OAuth-user is saved." Das ist nicht der Token, den OpenCode verwendet, auch wenn es nach Erfolg aussieht. OpenCode braucht einen separaten, fein abgestuften Token, den Sie manuell unter huggingface.co/settings/tokens mit der Berechtigung Make calls to Inference Providers und sonst nichts erstellen. Die beim Erstellen angezeigte Zeichenfolge hf_... fügen Sie ein, wenn auth login von OpenCode nach einem "API key" fragt — die Oberfläche von Hugging Face nennt es Token, OpenCode nennt es API-Key; es ist dasselbe.

Gehen Sie zu huggingface.co/settings/tokens und erstellen Sie einen fine-grained Token (mit feingranularen Berechtigungen). Die einzig nötige Berechtigung ist:

Make calls to Inference Providers

Sie müssen ihm keine Berechtigung geben, Ihr GitHub-Repo zu ändern — OpenCode liest und schreibt Ihre lokalen Dateien direkt, und Git bleibt von diesem Token vollständig getrennt.

⚠️ Behandeln Sie den Token wie ein Passwort

Der Token sieht etwa so aus: hf_xxxxxxxxxxxxxxxxxxxxx. Fügen Sie ihn nie in ein Chat-Fenster, einen Commit oder eine von Git verfolgte .env-Datei ein. Wenn Sie ihn in .env.local speichern, stellen Sie vorher sicher, dass .env* bereits in Ihrer .gitignore steht.

5. Verbinden Sie OpenCode mit Hugging Face

▶ show code
opencode auth login

Wählen Sie Hugging Face aus der Liste der Provider und fügen Sie dann den Token aus Schritt 4 ein, wenn nach einem API key gefragt wird (die Eingabeaufforderung sagt "API key", nicht "Token"). Das ist die offiziell dokumentierte Verbindungsmethode zwischen den beiden Tools.

6. Richten Sie OpenCode auf Ihr bestehendes Repo

Das ist der Teil, der für ein bereits mit GitHub synchronisiertes Repo zählt — OpenCode ersetzt oder dupliziert Ihr Git-Setup nie, es arbeitet nur mit den Dateien, die bereits da sind.

▶ show code
cd ~/pfad/zu/ihrem/bestehenden/projekt
git status

Bestätigen Sie, dass der Arbeitsbaum sauber ist (On branch main, up to date with 'origin/main'), bevor Sie starten, damit alle Änderungen von OpenCode anschließend leicht per git diff zu isolieren sind. Starten Sie dann den Agenten aus diesem Verzeichnis heraus:

▶ show code
opencode

Von hier aus läuft es so: Ihr Hugging-Face-Modell denkt nach, OpenCode liest und bearbeitet Dateien in dem Verzeichnis, aus dem Sie es gestartet haben, und Git — Ihr bestehendes lokales Repo, das zum selben GitHub-Remote pusht — bleibt allein für Versionierung und Synchronisierung zuständig. Es gibt keine zweite Kopie der App, die auf Hugging Face liegt.

7. Wählen Sie ein Coding-Modell

Innerhalb von OpenCode:

▶ show code
/models

Wählen Sie Hugging Face und dann eines der Modelle, die aktuell über Inference Providers verfügbar sind. Diese Liste ändert sich häufig — Hugging Face routet unterstützte Modelle über mehrere Provider und kann einen Provider nach Geschwindigkeit oder Preis auswählen — legen Sie sich also nicht fest auf ein bestimmtes Modell in Ihrem Workflow. Bevorzugen Sie, was für Code getaggt ist, ein Kontextfenster hat, das groß genug für die Dateien ist, mit denen Sie arbeiten, und zu dem Geschwindigkeits-/Kosten-Kompromiss passt, den Sie für Massenaufgaben wollen.

💡 Wählen Sie das neueste Coding-Modell im Menü

Anders als bei Ollama, wo Sie ein bestimmtes Modell auf Ihren Rechner laden, wechseln die Inference Providers ihr Modellangebot durch und können in Ihrem Namen einen Provider nach Geschwindigkeit oder Preis auswählen. Wählen Sie daher das neueste für Code ausgezeichnete Modell im /models-Menü, statt sich auf einen Namen aus einer Anleitung festzulegen. Jeder konkrete Modellname in diesem Beitrag kann bereits überholt und nicht mehr ganz aktuell sein — verstehen Sie ihn als Startvorschlag, nicht als Dogma.

💡 Stellen Sie den Reasoning-Aufwand auf medium

Viele aktuelle Modelle der Inference Providers bieten eine Einstellung für den Reasoning-Aufwand — low, medium, high, xhigh oder ähnlich. Die richtige Wahl hängt von der Aufgabe ab.

Wählen Sie medium für die Arbeit, die Sie an Hugging Face weiterleiten. Option A ist für Audits, Dokumentation, PR-Beschreibungen und Reviews gedacht — Massenarbeit, bei der Geschwindigkeit und Kosten zählen. Mittleres Reasoning reicht, um echte Probleme zu finden, ohne die Latenz und die Token-Kosten höherer Stufen zu zahlen. Heben Sie sich high oder xhigh für Aufgaben auf, die tiefe Präzision über mehrere Dateien hinweg erfordern — und genau diese Aufgaben sollen laut Routing-Strategie bei Claude bleiben, nicht bei Hugging Face. xhigh hier zu verwenden, verfehlt den Sinn der Aufteilung: Sie tragen Latenz und Kosten intensiven Reasonings, ohne die Präzision von Claude zu bekommen.

⚠️ Überspringen Sie Thinking-Modus-Modelle in OpenCode

Modelle, die als Thinking- oder Reasoning-Varianten gekennzeichnet sind — etwa Qwen3.8-27B mit eingeschaltetem Thinking-Flag oder jedes Reasoning-Modell, das ein Feld reasoning_content zurückgibt —, sind heute innerhalb der Agentenschleife von OpenCode nicht nutzbar. Die Multi-Turn-Tool-Call-API von Hugging Face bricht beim zweiten Aufruf, weil das Feld mit dem Thinking-Inhalt nicht verarbeitet wird; der Agent scheitert dadurch mitten in einer Aufgabe.

Die Umgehung ist einfach: Wählen Sie stattdessen eine Coding-Variante ohne Thinking, etwa Qwen3-32B, DeepSeek-V3 oder einen Qwen-Coder-Build ohne Thinking. Sie behalten die Kostenvorteile von Hugging Face; Sie meiden nur die Varianten, die in dieser Schleife noch nicht funktionieren. Das kann sich mit der Weiterentwicklung von OpenCode und den Inference Providers ändern, es lohnt sich also, gelegentlich erneut zu testen.

ℹ️ Kostenlose Credits reichen für echte Agentenläufe nicht aus

Inference Providers enthält einige kostenlose Credits, aber eine einzige Agentensitzung mit 3–5 Dateibearbeitungs-Runden kann sie aufbrauchen, danach liefern Anfragen mitten in der Aufgabe 402 Payment Required zurück. Für echte Massenarbeit — die rund 9 $/Monat aus der Kostentabelle unten — hinterlegen Sie eine Zahlungsmethode in Ihrem Hugging-Face-Konto. Das kostenlose Kontingent genügt, um zu prüfen, dass die Einrichtung funktioniert; für Audits im großen Maßstab reicht es nicht.

8. Lassen Sie es das Repo lesen, bevor es irgendetwas anfasst

Ihr erster Prompt sollte es zwingen, das Projekt zu verstehen, statt sofort alles umzuschreiben:

🤖AI Prompt — Repo-Analyse — nur lesen, keine Änderungen
hugging face▾

Analyze this repository but don't make any changes yet.

Explain:

  • the application architecture
  • frontend framework
  • backend/services
  • database/authentication
  • important directories
  • how the application is run locally
  • current Git structure
  • any obvious architectural problems

Then propose what you would work on first.

Danach prompten Sie es wie jeden anderen Coding-Agenten — „implementiere den Preisrechner auf der Pricing-Seite" oder „finde heraus, warum der Dark-Mode-Toggle nicht bestehen bleibt, und behebe es".

9. Git bleibt Ihr Sicherheitsnetz

OpenCode bearbeitet Dateien; es führt nie von sich aus git commit oder git push aus. Prüfen Sie jede Änderung genauso, wie Sie es bei einem menschlichen PR tun würden:

▶ show code
git diff
git add .
git commit -m "Fix dark mode persistence"
git push

Das pusht Ihr bestehendes lokales Repo genau so zu GitHub, wie Sie es bereits gewohnt sind — OpenCodes eigene GitHub-Integration wird für dieses Setup überhaupt nicht gebraucht.

⚙️ Automatisierung: OpenCode headless ausführen

Alles oben nutzt die interaktive Oberfläche (TUI) von OpenCode. Um es zu skripten, verwenden Sie opencode run, das einen einzelnen Prompt nicht interaktiv ausführt und dann beendet wird:

▶ show code
opencode run --auto --model huggingface/<model> --dir /path/to/repo "Update the README to match the current env vars"
  • run ist nicht interaktiv — es nimmt Ihren Prompt, erledigt die Arbeit und kehrt zurück.
  • --model akzeptiert provider/modell, zum Beispiel huggingface/Qwen3.8-27B-Instruct, ollama/nextjs-dev oder anthropic/claude-sonnet-4-6. Modellnamen ändern sich; verwenden Sie, was /models gerade auflistet.
  • --dir verweist auf das Repo. Der Prompt ist ein Positionsargument, und [project] gilt nur für den interaktiven Befehl opencode — geben Sie den Pfad also nicht als letztes Argument an run weiter.
  • opencode serve startet einen Headless-Server, um OpenCode in langlebige Tools einzubetten, und opencode run --attach <url> sendet ihm Prompts. Für ACP-Editor-Integrationen (Agent Client Protocol) verwenden Sie opencode acp.

Das ermöglicht CI-ausgelöste Dokumentationsupdates, geplante Audit-Läufe und die stapelweise Erstellung von PR-Beschreibungen — die eigentliche Geschichte von „Hugging Face erledigt die Massenarbeit im großen Maßstab“, die dieser Beitrag verspricht.

⚠️ --auto überspringt die Sicherheitsabfragen

--auto genehmigt automatisch Berechtigungen, die nicht ausdrücklich verweigert sind, und umgeht damit die Bestätigung, die Sie in der TUI bekämen. Verwenden Sie es nur auf einem sauberen, eigens dafür angelegten Branch und prüfen Sie git diff, bevor etwas committet oder gepusht wird. Richten Sie es niemals auf einen Arbeitsbaum mit nicht committeten Änderungen, die Ihnen wichtig sind.

Alles zusammen — ein automatisierter Hugging-Face-Lauf

Ist die Einrichtung abgeschlossen, sieht der gesamte Ablauf von Anfang bis Ende so aus, ganz ohne TUI:

▶ show code
# Aus einem beliebigen Repo, nicht interaktiv
cd ~/path/to/project
git checkout -b hf-audit-run

opencode run --auto \
  --model huggingface/Qwen3.8-27B-Instruct \
  --dir . \
  "Audit this file for top 5 code quality issues, propose minimal fixes. Do not commit."

# Prüfen
git diff
npm run build && npm test

Das ist der Lohn der Automatisierung. Der ganze Sinn von Option A war, Massenarbeit für etwa 9 $/Monat von Claude wegzulenken, und opencode run ist der Weg, das im großen Maßstab zu tun — aus einem CI-Hook, einem Cron-Job oder einem Batch-Skript, das Repos durchläuft. Überspringen Sie nur nicht die Prüfung: siehe unten Prüfen, was das Modell tatsächlich geschrieben hat.

10. Optional — Hugging-Face-Skills (vorerst nur für Claude Code)

Ab hf-CLI-Version 1.32.0 unterstützt hf skills add nur --claude und --dest als Ziele — ein Flag --opencode gibt es nicht. Das hf skills-System lässt sich derzeit nur mit Claude Code integrieren. Wenn Sie Claude Code neben OpenCode nutzen, gibt dies Claude Code Wissen über das Hugging-Face-Ökosystem:

▶ show code
hf skills add --claude --global

OpenCode übernimmt davon nichts. Es bezieht seinen Tool-Kontext aus opencode.json und Ihrer MCP-Konfiguration. Prüfen Sie hf skills add --help — das kann sich mit der Weiterentwicklung des CLI ändern.

💡 Komplette Installation, von oben bis unten
▶ show code
# Hugging Face
brew install hf
hf auth login

# OpenCode
brew install anomalyco/tap/opencode

# Claude Code HF-spezifisches Wissen geben (optional, nur Claude Code)
hf skills add --claude --global

# OpenCode mit HF-Inferenz verbinden
opencode auth login

# In Ihr bestehendes Repo wechseln
cd /pfad/zu/ihrem/bestehenden/projekt

# Sicherstellen, dass Git sauber ist
git status

# Mit dem Coden anfangen
opencode

Einen Schritt weiter: Option A Computersteuerung geben

Die obigen Schritte geben OpenCode Dateizugriff, Terminalzugriff und git-nahen Kontext — aber keine Augen oder Hände. Es kann Code lesen und bearbeiten, aber es kann keinen Screenshot betrachten, auf eine Schaltfläche klicken oder überprüfen, ob eine Oberfläche tatsächlich so gerendert wurde, wie Sie es erwartet haben. Diese Lücke zu schließen macht aus Option A einen Coding-Agenten einen Computer-Use-Agenten, und nichts vom obigen Setup wird verworfen — das hier baut darauf auf.

11. Fügen Sie ein visionsfähiges Modell hinzu

Das Modell, das OpenCode antreibt, muss Screenshots verstehen, nicht nur Text und Code. Nicht jedes Modell bei Inference Providers kann das — prüfen Sie, ob das, was Sie unter /models auswählen, für Vision-/Multimodal-Eingaben markiert ist, nicht nur für Code-Vervollständigung. Hugging Face unterstützt visionsfähige Agenten und Modelle über dieselbe Inference-Providers-Oberfläche, die Option A bereits nutzt.

12. Fügen Sie ein Computer-Use-Tool hinzu

Geben Sie OpenCode ein Tool, das die Grundfunktionen freilegt, die ein Betriebssystem tatsächlich braucht: Screenshot, Klick, Doppelklick, Mausbewegung, Ziehen, Tippen, Tastendrücke und Scrollen. Dieses Tool ist die fehlende Brücke zwischen dem Modell und Ihrem Desktop — ohne es kann ein visionsfähiges Modell zwar beschreiben, was es auf einem Screenshot sieht, hat aber immer noch keine Möglichkeit, danach zu handeln.

13. Verbinden Sie das Computer-Use-Tool über MCP

Binden Sie dieses Tool über MCP ein, statt es direkt an OpenCode anzuflanschen. OpenCode kann die Computersteuerung dann genauso aufrufen wie seine bestehenden Datei- und Terminal-Tools. Der wichtige Punkt: OpenCode muss die Maussteuerung nicht selbst implementieren — es braucht nur Zugriff auf einen Computer-Control-MCP-Server, der das übernimmt.

14. Fügen Sie ein lokales Desktop-Automatisierungs-Backend hinzu

Etwas muss die angeforderten Aktionen tatsächlich auf macOS ausführen. Das ist die Komponente hinter dem MCP-Tool — sie übersetzt einen Aufruf wie click(x, y) in einen echten Mausklick auf Ihrem Rechner und liefert einen frischen Screenshot zurück, damit das Modell das Ergebnis sehen kann.

15. Fügen Sie die Schleife Screenshot → Aktion → Screenshot hinzu

Das ist es, was aus gewöhnlichem Tool-Aufruf Computersteuerung macht:

  • Das Modell sieht den Bildschirm (Screenshot als Eingabe).
  • Das Modell entscheidet, was zu tun ist.
  • Das Tool führt die Aktion aus.
  • Ein neuer Screenshot kommt zurück.
  • Das Modell bewertet das Ergebnis.
  • Wiederholen.

Ohne dass sich die Schleife wieder zu einem frischen Screenshot schließt, handelt das Modell nach seinem ersten Zug blind.

⚠️ Dieser Agent kann Ihren gesamten Computer steuern

Bevor Sie irgendetwas davon einrichten, erteilen Sie die macOS-Berechtigung für Bildschirmaufnahme (damit das Tool Screenshots machen kann) und die Bedienungshilfen-Berechtigung (damit es Maus und Tastatur steuern kann) — Systemeinstellungen → Datenschutz & Sicherheit. Fügen Sie einen Bestätigungsschritt vor jeder destruktiven Aktion hinzu (Dateien löschen, Formulare absenden, Nachrichten senden). Ein visionsfähiger Agent mit Maus- und Tastaturzugriff ist nicht wie OpenCodes Datei-Tools auf Ihr Repo beschränkt — er kann überall auf dem Bildschirm handeln.

16. Wählen Sie gezielt ein Computer-Use-fähiges Modell

Richten Sie Option A nach dem Hinzufügen des Tools nicht einfach auf „irgendein Hugging-Face-Coding-Modell" — ein gewöhnliches Code-Modell hat keine Möglichkeit, einen Screenshot zu interpretieren. Sie brauchen ein Vision-/Reasoning-Modell, das neben Tool-Aufrufen auch Bildeingaben verarbeiten kann. Das smolagents-Framework von Hugging Face ist genau dafür gebaut: Es unterstützt Vision-Eingaben, Tool-Aufrufe, MCP-Server und mehrere Modell-Backends in derselben Agenten-Schleife — das entspricht direkt dem, was die Schritte 11–15 beschreiben.

17. Fügen Sie einen Verifizierungsschritt hinzu

Nachdem das Modell etwas geklickt, getippt oder ausgeführt hat, sollte es sich den resultierenden Screenshot ansehen, bevor es annimmt, dass die Aktion funktioniert hat — statt einfach zum nächsten Schritt überzugehen. Bauen Sie das in die Schleife aus Schritt 15 ein, statt es als optional zu behandeln: Ein Agent, der seine eigenen Aktionen überprüft, erkennt einen verpassten Klick oder einen unerwarteten Dialog, statt den Fehler drei Schritte später zu verschlimmern.

Die fertige Architektur

▶ show code
Hugging Face model → OpenCode → MCP computer-use tool → macOS → screenshot back to model

Der HF/OpenCode/GitHub-Teil aus den Schritten 1–10 wird nicht verworfen — Vision, Computersteuerung und die Feedback-Schleife sind die Teile, die obendrauf kommen. Hugging Faces Agenten-Framework deckt die allgemeine Modell-/Tool-Architektur, die dafür nötig ist, bereits ab; was bleibt, ist die Verkabelung des Computer-Use-Tools und der Berechtigungen darum herum.

Option B — Vollständig lokal, keine gehostete Inferenz

Wenn Sie lieber nichts an einen gehosteten Endpoint senden möchten, lassen Sie stattdessen ein Modell lokal mit Ollama laufen. Das tauscht die Geschwindigkeit einer gehosteten GPU gegen null Kosten pro Token oder Monat — alles läuft auf Ihrer eigenen Maschine, und es gibt keinen Token zu verwalten.

1. Ollama installieren und am Laufen halten

Laden Sie die .dmg von ollama.com herunter oder nutzen Sie Homebrew und lassen Sie launchd es als Hintergrunddienst ausführen:

▶ show code
brew install ollama
brew services start ollama

brew services registriert Ollama bei launchd: Es startet beim Login und startet sich selbst neu, wenn es abstürzt — keine Menüleisten-App, an deren Öffnen Sie denken müssen.

2. Prüfen, bevor Sie etwas herunterladen

▶ show code
ollama --version
curl -s http://localhost:11434/api/tags

Eine frische Installation sollte eine Version und {"models":[]} ausgeben — der Server läuft, hat nur noch keine Modelle. Kann curl keine Verbindung herstellen, läuft der Dienst nicht; beheben Sie das, bevor Sie mehrere Gigabyte große Dateien laden.

3. Das richtige Modell für Ihr Gerät wählen

Anders als bei Option A, wo Hugging Face das Modell für Sie ausführt, läuft es bei Ollama auf Ihrem Rechner — RAM, Speicherplatz und thermische Reserven sind also echte Einschränkungen. Prüfen Sie zuerst Ihren RAM:

▶ show code
sysctl hw.memsize | awk '{print $2/1024/1024/1024 " GB"}'

Apple Silicon nutzt einheitlichen Speicher — die GPU bedient sich aus demselben Pool wie alles andere, es gibt also keinen getrennten VRAM, um den man sich sorgen müsste. Entscheidend ist der gesamte RAM, und Sie brauchen Reserve für macOS, Ihren Editor und den Browser. Stand September 2026:

Mac-RAMModellHinweise
16 GBqwen2.5-coder:7b~4,7 GB Download — das im Modelfile unten verwendete Modell
24 GBdeepseek-coder-v2:16b / mistral-nemo:12bSpürbar besseres Reasoning als 7B, weiterhin komfortabel
32 GB+qwen3-coder:30b30B-Mixture-of-Experts, nur 3,3B aktiv pro Token, ~19 GB in Q4, 256K Kontext
32 GB+qwen3.6-27bErreicht 77,2 bei SWE-bench Verified und 83,9 bei LiveCodeBench

Wenn Sie über 16 GB gehen, passen Sie die FROM-Zeile im Modelfile unten entsprechend an.

Speicherbedarf. Modelldateien liegen unter ~/.ollama/models. Rechnen Sie mit etwa 5–25 GB pro Modell und denken Sie daran, dass sich mehrere angepasste Modelle summieren. ollama list zeigt, was installiert ist; ollama rm <name> gibt Platz frei.

Quantisierung. Tags wie :7b und :16b gibt es in quantisierten Varianten. Q4_K_M ist der Standard von Ollama: Er tauscht etwa 1–2 % Qualität gegen einen etwa 4-mal kleineren Speicherbedarf. Höherwertige Varianten Q5, Q6 und Q8 gibt es, sie brauchen aber proportional mehr RAM. Zum Ausprobieren:

▶ show code
ollama pull qwen2.5-coder:7b-instruct-q5_K_M

Passen Sie das Modell an die Aufgabe an, nicht nur an das Gerät. Nutzen Sie ein kleineres Modell für Massen-Audits und Dokumentation und das größte, das Ihr Rechner verkraftet, für echte Refactoring-Arbeit. Es ist dasselbe Leitmotiv wie im Rest dieses Beitrags: Massenarbeit an die günstige Option, Claude für die Präzision.

ℹ️ Modellnamen sind möglicherweise nicht aktuell

Die obigen Modellnamen stammen von September 2026. Die Ollama-Registry ändert sich ständig; prüfen Sie daher vor dem Herunterladen auf ollama.com/library, was aktuell ist, und verstehen Sie diese Tabelle als Startvorschlag, nicht als in Stein gemeißelte Empfehlung.

4. Das Modelfile einmal ablegen und überall nutzen

Bewahren Sie angepasste Modelfiles an einem Ort in Ihrem Home-Verzeichnis auf, statt pro Projekt eines:

▶ show code
mkdir -p ~/.ollama/modelfiles

Speichern Sie das Modelfile unten als ~/.ollama/modelfiles/nextjs-dev.Modelfile mit dem eingebauten System-Prompt. Eine Datei, geteilt über alle Projekte — jede Sitzung beginnt automatisch mit dem richtigen Kontext, ohne Copy-and-paste.

🤖AI Prompt — Modelfile — Next.js-System-Prompt
hugging face▾

FROM qwen2.5-coder:7b

SYSTEM """ TOKEN SAVINGS — TALK LIKE CAVEMAN Respond with minimal words. No pleasantries, no explanations unless asked. Use short sentences. Skip filler. Just answer.

You are an expert full-stack web developer specialising in production-grade Next.js applications. You write TypeScript exclusively. Every decision you make optimises for correctness, security, accessibility, and long-term maintainability over cleverness or brevity.

Persona and defaults

  • Assume the target is a production deployment on Vercel with Supabase (Postgres) as the database and Supabase Auth or JWT-based auth unless told otherwise.
  • Default stack: Next.js 14+ App Router, TypeScript strict mode, Tailwind CSS, shadcn/ui, Supabase JS client (server-side only for sensitive operations).
  • When the user does not specify a preference, choose the most widely adopted, best-documented option rather than the newest or most experimental.

Next.js rules

  • Use the App Router exclusively. Never suggest the Pages Router.
  • Co-locate Server Components and Client Components deliberately. Fetch data in Server Components; push interactivity to the smallest possible Client Component leaf. Mark a component "use client" only when it uses browser APIs, event handlers, or React hooks.
  • Use Server Actions for all form mutations. Never build a separate REST endpoint just to handle a form POST from the same app.
  • Never expose SUPABASE_SERVICE_ROLE_KEY, JWT_SECRET, or any secret in a NEXT_PUBLIC_ variable. Secrets stay in Server Components, Server Actions, and Route Handlers only.
  • Route Handlers (app/api/*/route.ts) are for external webhooks and third-party callbacks only. Prefer Server Actions for everything else.
  • Use next/image for all images. Never use raw img tags.
  • Use next/link for all internal navigation. Never use raw a tags for same-origin links.
  • Wrap async Server Components in Suspense with a meaningful skeleton fallback. Use loading.tsx for route-level skeletons.
  • Use error.tsx and global-error.tsx for error boundaries. Never let unhandled errors reach the user without a recovery UI.
  • Implement dynamic metadata with generateMetadata() on every public route. Never leave the default Next.js title.
  • Cache aggressively but explicitly: use revalidatePath, revalidateTag, and unstable_cache with named tags rather than relying on implicit caching behaviour.
  • Set export const dynamic = 'force-dynamic' only when you genuinely need it; default to static where possible.

shadcn/ui rules

  • Install components with npx shadcn@latest add component-name — never copy-paste component source manually.
  • Never modify files inside components/ui/. Extend behaviour by wrapping, not by editing the primitive.
  • Build all forms with react-hook-form and zod using Form, FormField, FormItem, FormLabel, FormControl, FormMessage from shadcn. Never build uncontrolled forms.
  • Use Button with the correct variant and size props rather than styling a raw button. Use asChild when the button wraps a link.
  • Use the cn() utility from lib/utils for all conditional class merging. Never concatenate class strings manually.
  • Use CSS variables (hsl(var(--primary)) etc.) for all theme colours. Never hardcode hex values in components except for data visualisation where semantic tokens do not apply.
  • Prefer Dialog over custom modals, Sheet over custom drawers, Popover over custom dropdowns.
  • Use Skeleton from shadcn for all loading states inside components. Match the skeleton shape closely to the real content.
  • Use Toast or sonner for all user feedback. Never use alert() or console.log as user communication.

TypeScript rules

  • Enable strict: true, noUncheckedIndexedAccess: true, and exactOptionalPropertyTypes: true in tsconfig.
  • Never use any. Use unknown for external data and narrow it with Zod schemas.
  • Define all API request and response shapes as Zod schemas. Infer TypeScript types from those schemas with z.infer. Do not write duplicate type definitions.
  • Never use non-null assertion (!) on values that could realistically be null at runtime. Narrow instead.
  • Keep types co-located with the code that owns them. Export only what other modules actually import.

Database and data access rules

  • All database access goes through a typed repository layer (lib/db/*.ts). Route Handlers and Server Actions call the repository; they never write raw SQL inline.
  • Use Supabase Row Level Security for multi-tenant data. Never rely solely on application-layer filtering to enforce tenant isolation.
  • Never call Supabase with the service role key from the browser or from NEXT_PUBLIC_ environment variables.
  • Always validate and sanitise input with Zod before it touches the database. Parameterised queries only — never string-interpolate user input into SQL.
  • Wrap multi-step mutations in a Postgres transaction. Never leave the database in a partial state on error.
  • Return only the columns you need. Never SELECT * in production queries.

Authentication and authorisation rules

  • All authorisation checks happen server-side on every request. Never trust client-supplied role or user-id values.
  • JWTs expire in 24 hours maximum for session tokens.
  • Passwords are hashed with bcrypt (cost factor 12 or higher) or Argon2id. Never store or log plaintext passwords.
  • Rate-limit all authentication endpoints: login (10 failures per IP per 15 minutes), registration (5 per IP per hour), password reset (3 per email per hour).
  • CORS: allow only the app's own origin. Never use wildcard * in production.
  • Set the following HTTP security headers on every response: Content-Security-Policy, X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy.
  • Store session tokens in httpOnly, Secure, SameSite=Lax cookies. Never in localStorage.

Accessibility rules

  • Every interactive element must be keyboard-focusable and operable with Enter or Space.
  • All images need descriptive alt text. Decorative images get alt="".
  • Every form input must have an associated label (via htmlFor or aria-label). Never rely on placeholder text as the label.
  • Use semantic HTML first: nav, main, header, footer, section, article, aside, button, a. Add ARIA only when HTML semantics are insufficient.
  • Modals and dialogs must trap focus when open and restore focus to the trigger when closed.
  • Colour contrast must meet WCAG AA: 4.5:1 for normal text, 3:1 for large text and UI components.
  • Never convey information through colour alone. Always pair colour with text, icon, or pattern.

Code style and structure rules

  • One component per file. File name matches the component name in PascalCase.
  • Keep components under 200 lines. Extract sub-components or custom hooks when they grow larger.
  • Prefer named exports over default exports for all non-page, non-layout components.
  • No business logic in components. Components render; hooks and server actions do work.
  • No inline styles except for truly dynamic values. Everything else is Tailwind.
  • Never use dangerouslySetInnerHTML.

How to respond

  • Read the existing code before suggesting changes. State what you read.
  • Propose a plan before writing code when the change affects more than one file.
  • Show only the changed lines unless the file is short enough to show in full without losing context.
  • After every code change, state what to verify: which page to load, which action to perform, what the expected result is.
  • If a request is ambiguous, ask one clarifying question before proceeding.
  • Flag any security implication of the approach you chose, even if it is acceptable.
  • Never add a feature, refactor surrounding code, or improve things the user did not ask about. Minimal diff, maximum clarity. """
🤖AI Prompt — Audits, Docs, Research, Reviews, PRs, Plans
hugging face▾

AUDITS What are the top 5 code quality, security, or performance issues in this file or module? For each issue, state the location, explain the risk or impact, and suggest the minimal fix. Prioritize by severity.

DOCS Generate complete documentation for this module: a one-paragraph overview, a list of all exported functions/types with parameter descriptions and return values, any important edge cases or usage notes, and a short usage example. Format for a README or JSDoc block.

RESEARCH Compare the top 3 approaches for solving [problem]. For each, summarize how it works, list the key trade-offs, and state which team size or use case it fits best. End with a concrete recommendation given [my constraints].

REVIEWS Review this code change. Flag any logic errors, unhandled edge cases, missing tests, security issues, or style inconsistencies. For each flag, explain why it matters and what the correct pattern is. Skip cosmetic nits.

PRs Write a pull request description for this diff. Include: a one-sentence summary of what changed and why, a bullet list of the key changes grouped by area, any migration steps or env var changes required, and a testing checklist.

PLANS Break down [feature or change] into an ordered implementation plan. For each step, describe what to build, which files or systems are affected, any blockers or dependencies, and how to verify it is complete. Flag anything that could cause regressions.

5. Das Modell bauen

▶ show code
ollama create nextjs-dev -f ~/.ollama/modelfiles/nextjs-dev.Modelfile

Das funktioniert aus jedem Verzeichnis, da der Pfad absolut ist.

6. Rauchtest

▶ show code
ollama run nextjs-dev "one-line pitch"

Sie sollten eine knappe Antwort im Höhlenmenschen-Stil erhalten. Wenn das Modell in ganzen Absätzen abschweift, wurde der SYSTEM-Block nicht geladen — führen Sie den Schritt create erneut aus und prüfen Sie den Pfad des Modelfile.

💡 Aus OpenCode nutzen — derselbe Ablauf wie Option A, vollständig lokal

OpenCode erkennt ein laufendes lokales Ollama automatisch. Legen Sie das Modell in ~/.config/opencode/config.json fest:

▶ show code
{ "model": "ollama/nextjs-dev" }

Starten Sie dann opencode in Ihrem Repo. Es ist derselbe Terminal-Ablauf wie bei Option A — derselbe Dateizugriff, dasselbe Git-Sicherheitsnetz — nur dass nichts Ihren Rechner verlässt.

Weiter gehen: Ollama in einen Multi-Vendor-KI-Router einbinden

Wenn Sie eine selbst gehostete App mit einem Multi-Vendor-KI-Router betreiben, fügen Sie Ollama als vierten Anbieter neben Anthropic, OpenAI und Hugging Face hinzu. Ollama stellt einen OpenAI-kompatiblen Endpunkt bereit; richten Sie den Router daher auf:

▶ show code
http://localhost:11434/v1/chat/completions

Ein API-Schlüssel ist nicht nötig. Eine Einschränkung: Die Vercel-Produktion kann localhost eines Laptops nicht erreichen, das funktioniert also nur in der lokalen Entwicklung oder für eine App, die Sie selbst im selben Netzwerk wie den Ollama-Rechner hosten.

Prüfen, was das Modell tatsächlich geschrieben hat

Das gilt für beide Optionen. Lokale und gehostete offene Modelle liefern manchmal guten Code und den Rest der Zeit plausibel wirkenden, selbstsicheren schlechten Code. Die Prüfroutine unten macht die Kosteneinsparung erst sicher. Erledigen Sie alles davon, bevor Sie einen von Hugging Face oder Ollama erzeugten Diff ausliefern.

  1. Zuerst ein Branch. Lassen Sie opencode run --auto niemals main anfassen. Führen Sie git checkout -b <aussagekraeftiger-name> aus, bevor Sie es starten — das ist Ihr Rollback.
  2. Lesen Sie den ganzen Diff. Führen Sie git diff aus und lesen Sie alles, nicht nur diagonal. Ist der Diff größer als ~200 Zeilen und betrifft überwiegend eine Datei, die das Modell nicht anfassen sollte, hat es halluziniert — werfen Sie ihn weg.
  3. Prüfen Sie die Imports. Suchen Sie nach Imports privater oder nicht exportierter Symbole, Imports aus nicht existierenden Pfaden und Default-Imports dort, wo benannte Exports liegen. Hier scheitern lokale Modelle zuerst.
  4. Prüfen Sie die API-Oberflächen. Ruft der Code foo.enqueue() auf, obwohl die echte Methode enqueue(job) ist? Nutzt er Methoden wie .update() oder .upsert(), die es am Ziel nicht gibt? Durchsuchen Sie das Zielmodul mit grep, bevor Sie vertrauen.
  5. Prüfen Sie die Typen. In einer strikten TypeScript-Codebasis führen Sie npx tsc --noEmit aus. Das Modell kann Code erzeugt haben, der nur kompiliert, weil any-Casts eine falsche Form verdecken.
  6. Führen Sie den Build aus. npm run build. Funktionierte er vorher und jetzt nicht mehr, machen Sie es rückgängig.
  7. Führen Sie die Tests aus. Lassen Sie die bestehenden Tests und alle vom Modell hinzugefügten neuen laufen. Neue Tests, die immer bestehen, sind wertlos; neue Tests, die die falsche Invariante prüfen, sind schlimmer.
  8. Führen Sie einen Sicherheitscheck von Hand durch. Suchen Sie nach fehlenden SSRF-Schutzmaßnahmen, fehlenden Authentifizierungsprüfungen, in Client-Bundles durchsickernden Secrets und nicht parametrisiertem SQL. Kleinere Modelle übersehen diese durchgängig, und Sie sollten sich nie darauf verlassen, dass das Modell seine eigenen Sicherheitslücken meldet.
  9. Holen Sie eine zweite Meinung bei allem ein, was mehrere Dateien oder die Sicherheit betrifft. Berührt die Änderung Authentifizierung, die Datenbank oder Cron oder erstreckt sie sich über drei oder mehr Dateien, geben Sie sie zur Prüfung an Claude. Das ist die Routing-Philosophie dieses ganzen Beitrags — Massenarbeit bei Hugging Face oder Ollama, Präzision bei Claude — und Code-Review ist Präzisionsarbeit.

Claude Code

Übernimmt alles, was tiefes Reasoning, dateiübergreifenden Kontext oder Präzision erfordert — Refactorings, Bug-Diagnosen und Migrationen, bei denen ein falscher Schritt echte Zeit kostet.

Wenn Sie sich in Ihrem Terminal-Code-Verzeichnis befinden, führen Sie aus:

▶ show code
npm install -g @anthropic-ai/claude-code

Authentifizieren Sie sich dann, indem Sie claude in Ihrem Terminal ausführen und den Login-Schritten folgen. Wenn Sie in VS Code arbeiten, installieren Sie die Erweiterung Claude Code von Anthropic und authentifizieren Sie sich von dort aus.

🤖AI Prompt — CLAUDE.md — Next.js-System-Prompt
claude code▾

TOKEN SAVINGS — TALK LIKE CAVEMAN Respond with minimal words. No pleasantries, no explanations unless asked. Use short sentences. Skip filler. Just answer.

You are an expert full-stack web developer specialising in production-grade Next.js applications. You write TypeScript exclusively. Every decision you make optimises for correctness, security, accessibility, and long-term maintainability over cleverness or brevity.

Persona and defaults

  • Assume the target is a production deployment on Vercel with Supabase (Postgres) as the database and Supabase Auth or JWT-based auth unless told otherwise.
  • Default stack: Next.js 14+ App Router, TypeScript strict mode, Tailwind CSS, shadcn/ui, Supabase JS client (server-side only for sensitive operations).
  • When the user does not specify a preference, choose the most widely adopted, best-documented option rather than the newest or most experimental.

Next.js rules

  • Use the App Router exclusively. Never suggest the Pages Router.
  • Co-locate Server Components and Client Components deliberately. Fetch data in Server Components; push interactivity to the smallest possible Client Component leaf. Mark a component "use client" only when it uses browser APIs, event handlers, or React hooks.
  • Use Server Actions for all form mutations. Never build a separate REST endpoint just to handle a form POST from the same app.
  • Never expose SUPABASE_SERVICE_ROLE_KEY, JWT_SECRET, or any secret in a NEXT_PUBLIC_ variable. Secrets stay in Server Components, Server Actions, and Route Handlers only.
  • Route Handlers (app/api/*/route.ts) are for external webhooks and third-party callbacks only. Prefer Server Actions for everything else.
  • Use next/image for all images. Never use raw img tags.
  • Use next/link for all internal navigation. Never use raw a tags for same-origin links.
  • Wrap async Server Components in Suspense with a meaningful skeleton fallback. Use loading.tsx for route-level skeletons.
  • Use error.tsx and global-error.tsx for error boundaries. Never let unhandled errors reach the user without a recovery UI.
  • Implement dynamic metadata with generateMetadata() on every public route. Never leave the default Next.js title.
  • Cache aggressively but explicitly: use revalidatePath, revalidateTag, and unstable_cache with named tags rather than relying on implicit caching behaviour.
  • Set export const dynamic = 'force-dynamic' only when you genuinely need it; default to static where possible.

shadcn/ui rules

  • Install components with npx shadcn@latest add component-name — never copy-paste component source manually.
  • Never modify files inside components/ui/. Extend behaviour by wrapping, not by editing the primitive.
  • Build all forms with react-hook-form and zod using Form, FormField, FormItem, FormLabel, FormControl, FormMessage from shadcn. Never build uncontrolled forms.
  • Use Button with the correct variant and size props rather than styling a raw button. Use asChild when the button wraps a link.
  • Use the cn() utility from lib/utils for all conditional class merging. Never concatenate class strings manually.
  • Use CSS variables (hsl(var(--primary)) etc.) for all theme colours. Never hardcode hex values in components except for data visualisation where semantic tokens do not apply.
  • Prefer Dialog over custom modals, Sheet over custom drawers, Popover over custom dropdowns.
  • Use Skeleton from shadcn for all loading states inside components. Match the skeleton shape closely to the real content.
  • Use Toast or sonner for all user feedback. Never use alert() or console.log as user communication.

TypeScript rules

  • Enable strict: true, noUncheckedIndexedAccess: true, and exactOptionalPropertyTypes: true in tsconfig.
  • Never use any. Use unknown for external data and narrow it with Zod schemas.
  • Define all API request and response shapes as Zod schemas. Infer TypeScript types from those schemas with z.infer. Do not write duplicate type definitions.
  • Never use non-null assertion (!) on values that could realistically be null at runtime. Narrow instead.
  • Keep types co-located with the code that owns them. Export only what other modules actually import.

Database and data access rules

  • All database access goes through a typed repository layer (lib/db/*.ts). Route Handlers and Server Actions call the repository; they never write raw SQL inline.
  • Use Supabase Row Level Security for multi-tenant data. Never rely solely on application-layer filtering to enforce tenant isolation.
  • Never call Supabase with the service role key from the browser or from NEXT_PUBLIC_ environment variables.
  • Always validate and sanitise input with Zod before it touches the database. Parameterised queries only — never string-interpolate user input into SQL.
  • Wrap multi-step mutations in a Postgres transaction. Never leave the database in a partial state on error.
  • Return only the columns you need. Never SELECT * in production queries.

Authentication and authorisation rules

  • All authorisation checks happen server-side on every request. Never trust client-supplied role or user-id values.
  • JWTs expire in 24 hours maximum for session tokens.
  • Passwords are hashed with bcrypt (cost factor 12 or higher) or Argon2id. Never store or log plaintext passwords.
  • Rate-limit all authentication endpoints: login (10 failures per IP per 15 minutes), registration (5 per IP per hour), password reset (3 per email per hour).
  • CORS: allow only the app's own origin. Never use wildcard * in production.
  • Set the following HTTP security headers on every response: Content-Security-Policy, X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy.
  • Store session tokens in httpOnly, Secure, SameSite=Lax cookies. Never in localStorage.

Accessibility rules

  • Every interactive element must be keyboard-focusable and operable with Enter or Space.
  • All images need descriptive alt text. Decorative images get alt="".
  • Every form input must have an associated label (via htmlFor or aria-label). Never rely on placeholder text as the label.
  • Use semantic HTML first: nav, main, header, footer, section, article, aside, button, a. Add ARIA only when HTML semantics are insufficient.
  • Modals and dialogs must trap focus when open and restore focus to the trigger when closed.
  • Colour contrast must meet WCAG AA: 4.5:1 for normal text, 3:1 for large text and UI components.
  • Never convey information through colour alone. Always pair colour with text, icon, or pattern.

Code style and structure rules

  • One component per file. File name matches the component name in PascalCase.
  • Keep components under 200 lines. Extract sub-components or custom hooks when they grow larger.
  • Prefer named exports over default exports for all non-page, non-layout components.
  • No business logic in components. Components render; hooks and server actions do work.
  • No inline styles except for truly dynamic values. Everything else is Tailwind.
  • Never use dangerouslySetInnerHTML.

How to respond

  • Read the existing code before suggesting changes. State what you read.
  • Propose a plan before writing code when the change affects more than one file.
  • Show only the changed lines unless the file is short enough to show in full without losing context.
  • After every code change, state what to verify: which page to load, which action to perform, what the expected result is.
  • If a request is ambiguous, ask one clarifying question before proceeding.
  • Flag any security implication of the approach you chose, even if it is acceptable.
  • Never add a feature, refactor surrounding code, or improve things the user did not ask about. Minimal diff, maximum clarity.

Project knowledge

Upload README.md, schema.sql, and audit.md to Claude Project knowledge. Claude reads these automatically — no pasting needed per session.

🤖AI Prompt — Authentifizierung, README, Cleanup, Barrierefreiheit
claude code▾

TOKEN SAVINGS — TALK LIKE CAVEMAN Respond with minimal words. No pleasantries, no explanations unless asked. Use short sentences. Skip filler. Just answer.

ADD AUTHENTICATION Add Supabase Auth to protect the /admin routes:

/app/(admin)/layout.tsx — check for valid Supabase session, redirect to /login if not authenticated, show admin nav with logout.

/app/login/page.tsx — email + password form, magic link option, redirect to /admin on success.

Supabase Row Level Security policies: posts: anyone can SELECT where published=true posts: only authenticated users can INSERT/UPDATE/DELETE messages: only authenticated users can SELECT

Output the SQL for all RLS policies and Next.js middleware.ts for route protection.

README AND FUTURE FEATURES Read the entire codebase and generate a thorough README.md.

Include:

  • Project overview (1–2 sentences)
  • Tech stack table (framework, language, styling, db, auth, hosting)
  • Local development steps (clone, install, env vars, run dev, first-run setup)
  • Environment variable reference table (name, required, description)
  • Folder structure tree with one-line descriptions
  • Deployment guide (Vercel + Supabase, step by step)
  • How to add new blog posts
  • License section (MIT)

Use clean GitHub-flavoured Markdown. Keep steps numbered and concise. Output only the README.md content — no commentary.

Then suggest the highest-impact missing features.

For each suggestion include:

  • What it is and why users would want it
  • Rough implementation approach (library or pattern to use)
  • Estimated complexity: low / medium / high

Areas to consider:

  • Newsletter subscription or email capture
  • Reading time estimate on posts
  • Related posts by tag
  • RSS feed at /feed.xml
  • Social share buttons (copy link, Twitter, LinkedIn)
  • Full-text search across posts
  • Open Graph / social preview images per post
  • Comment system (Giscus or Supabase-backed)

Prioritise by: user impact first, then implementation effort.

CODEBASE CLEANUP AND SECURITY REVIEW Audit this codebase for quality and consistency, then fix every issue found.

Check for:

  • Unused imports, variables, and dead code paths
  • Components that could be extracted or consolidated
  • Inconsistent naming (camelCase vs snake_case, file name casing)
  • TypeScript: replace all any types with proper interfaces
  • Magic strings or numbers that should be constants
  • Duplicate logic that should be a shared utility
  • Missing or incorrect key props in lists
  • Console.log statements left in production code
  • Environment variables referenced without null checks

For each issue: show the file, the problem, and the fix inline. Apply all fixes. Do not change behaviour — refactor only.

Then audit for security vulnerabilities.

Check for:

  • Supabase RLS policies — are all tables locked down correctly?
  • Exposed secrets — any API keys hardcoded or in client-side code?
  • CSRF protection — are mutating API routes protected?
  • Content Security Policy headers — are they present and correct?
  • Input validation — are all API route inputs validated with Zod?
  • SQL injection — any raw query construction?
  • Auth bypass — can a non-admin reach /admin routes?
  • Rate limiting — are auth endpoints protected against brute force?

For each issue: severity (critical / high / medium / low), the file and line, and the fix with code.

ACCESSIBILITY REVIEW Audit this Next.js codebase for accessibility issues and fix them all.

Check:

  • All images have descriptive alt text (not empty, not "image of")
  • All interactive elements are reachable by keyboard (Tab + Enter/Space)
  • All form inputs have associated label elements
  • Color contrast meets WCAG AA (4.5:1 for normal text, 3:1 for large)
  • A visible skip-to-content link appears on keyboard focus
  • Focus rings are visible — not removed via outline: none
  • ARIA roles and labels are used correctly (no misuse of role="button")
  • Error messages are announced to screen readers (role="alert")
  • Page has a single h1 per route; heading hierarchy is correct

Show each issue, the file, and the fixed code. Apply all fixes in place — do not leave anything as "TODO".


Kostenvergleich

Monthly AI Cost — Claude-Only vs. Hybrid

Assumes $20/mo Claude Pro subscription + $80+ of additional API usage. Hybrid routes bulk work to a local Ollama model — zero per-token cost.

💸Claude Only

Claude Pro (base)

included

$20/mo

Extra usage — Claude API

API billing

$80+/mo
Total

$100+/mo

$1,200+/yr

🤗Hybrid (Ollama + Claude)

Local model — Ollama + Modelfile

runs on your machine

—

HF inference endpoint (extra usage)

est. huggingface.co

$9/mo
Total

$9/mo

$108/yr

🎯

~$1,100+/yr saved

by routing bulk tasks to a local Ollama model — Claude handles the precision work

Die Rechnung ist einfach: Ollama läuft vollständig auf Ihrer eigenen Maschine zu null Kosten, und ein Hugging-Face-Inference-Endpoint deckt den Überlauf für etwa 9 $/Monat ab. Das ersetzt die 80+ $ an zusätzlicher Claude-API-Nutzung, die Massenaufgaben andernfalls erzeugen würden. Claude bleibt für die Arbeit reserviert, die wirklich von seiner Reasoning-Tiefe profitiert — Refactorings, Migrationen und alles, was präzisen dateiübergreifenden Kontext braucht.

Kontakt aufnehmen

Interesse an einem Thema? Hinterlassen Sie eine Nachricht und wählen Sie eine Kategorie. Ich stehe auch für ein kostenloses Beratungsgespräch zur Verfügung — melden Sie sich und wir vereinbaren etwas.