Self-hosted Docker stack (embedded Supabase + storage + email) and local Ollama models
From the PR description
Summary
A single docker compose up brings up the entire app with no external accounts - a more automated alternative to the CLI-based approach in #44, plus local LLM support.
Self-contained stack
- Embedded Supabase in compose: Postgres + GoTrue auth + PostgREST + an nginx gateway. Schema auto-loads on first boot; no
supabaseCLI needed. - RustFS for S3-compatible object storage, replacing Cloudflare R2 (the backend already uses path-style S3, so it's drop-in).
- Mailpit catches auth emails (signup/confirmation) in a local inbox at
:8025. - Production-style image builds (not bind-mount +
npm installon start).
Local models via Ollama
- New provider speaking Ollama's OpenAI-compatible chat API, with the agentic tool-call loop and a graceful fallback for models that don't support tools.
- Models detected dynamically (
GET /models/ollama) and shown in every picker (chat, title, tabular) under a Local group - no API key. Anyollama/<tag>id is valid by prefix. - A Refresh button on the API Keys page re-detects installed models and re-checks key status, live to the pickers.
How this differs from #44
- One command, all-in-one - no
supabase start, no fork of the Supabase CLI stack. - Embedded Supabase + RustFS + Mailpit vs. relying on the CLI's Supabase + Storage.
- Adds local LLM (Ollama) support, which #44 doesn't have.
Test plan
-
docker compose up --buildbrings up all services; schema auto-applies (23 public tables) - End-to-end signup → Mailpit confirmation email → confirm → login
- Chat streams from
ollama/qwen3.6;phi3:minifalls back to no-tools -
GET /models/ollamareturns installed models (401 unauthenticated) - Ollama models selectable as chat + tabular review models
🤖 Generated with Claude Code
Our analysis
Self-hosted Docker stack with local Supabase, storage, email, and Ollama — read the full analysis →
Think the analysis missed something the PR description covers?
Capture this PR into my fork
Download a Markdown prompt that tells Claude how to port every
commit in this PR into your working tree. Run it via
claude -p < capture-pull-196.md from
inside the repo you want the changes in.