Two ways to keep smart art direction without a paid AI service:
B) Local LLM engine — lib/ai/ollama.ts calls a self-hosted Ollama server
(opt-in via OLLAMA_URL), reusing the exact prompt + validation as the Claude
engine. Nothing leaves your infra. /api/suggest engine order is now
Claude -> Ollama -> keyword. Shared helpers exported from claude.ts.
A) Bigger on-brand palette — scripts/gen-lucide-icons.mjs generates a curated
30-icon Lucide set (lib/assets/lucide-icons.ts) from the lucide-static dev
dep, with Supabase-flavored tags. lib/assets/icon-library.ts combines seed +
Lucide into ICON_LIBRARY/ICON_MAP; the picker, keyword matcher, LLM catalog,
and /api/og icon resolver all use it, so a text prompt matches ~35 icons
(semantic reasoning comes free once the local LLM is on).
Docs: .env.local.example + README (Ollama option). App still runs with no AI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>