Django,
fully assembled
One repo, four shapes. Declare a model and ship it as a website, a REST API, an MCP server, and a scheduled task runner— on a single SQLite file, behind one zero-downtime deploy.
The same class declaration produces an HTML interface, a REST endpoint, an MCP tool, and full-text search. Add a field, get a column, a JSON key, a tool argument, and a search index—everywhere at once.
Four surfaces from one declaration.
A CRUDView bound to a model
derives its own list, detail, create, update, and delete tools—then exposes them on the
surfaces you opt into.
# apps/tickets/views.py class TicketCRUDView(CRUDView): model = Ticket list_columns = ["id", "title", "status"] enable_api = True # REST + OpenAPI enable_mcp = True # tools for Claude enable_search = True # full-text + RAG tool
tickets_list, tickets_get, etc.—ready for Claude.
search_tickets MCP tool for retrieval (RAG).
Each shape is a coherent set of patterns, not a checklist of dependencies. Mix and match; one project can be all four at once.
Ship the shape your idea wants to be.
A polished admin app
Auth, profiles, light/dark themes with five palettes, table views, modal editors, search, filters, breadcrumbs.
A REST API with tokens
OpenAPI 3.0 spec, Swagger and ReDoc, bearer-token auth, self-service token UI, threat-detection panel.
An MCP server for Claude
OAuth + JSON-RPC, derived tools from your CRUDViews, doctor command, health and activity dashboards.
A background task runner
django-tasks with the inline worker by default. Cron jobs without Redis, Celery, or a second container.
Same engine, two starters. smallstack-tabler is a downstream fork that tracks this repo and swaps the chrome.
Two starters for two shapes of work.
For CRUD & headless work
Django admin's base CSS, customized per palette—no extra framework. Light/dark with 5 palettes; HTMX in every CRUDView. The sweet spot for internal admins, REST APIs, and MCP servers.
When the UI is the product
Forks & tracks smallstack; swaps the chrome for Tabler. Dashboards, charts, kanban, calendar—anywhere a public-grade UI matters as much as the data.
Boring infrastructure, already done. Eleven admin surfaces wired into the sidebar before you write a line.
The admin you'd build anyway, already built.
Most apps don't need the cluster they were architected for. SmallStack is built around that admission—lightweight, boring, and useful for years without a rebuild.
Unapologetically SQLite.
One file. Five years of customers. Zero rebuilds.
New in v0.13.0. Operational docs that live in the app—versioned, searchable, and reachable from every surface.
A runbook your app remembers.
Runbook ships in core. Write Markdown in the browser, keep an immutable version on every save, and find anything with full-text search. Set retention policies, export a runbook to a portable ZIP, restore any past version—nothing is ever destructive.
# the same doc, straight from your shell — the rb CLI rb find "postgres upgrade" # → ops/postgres-major-upgrade v7 rb cat ops/postgres-major-upgrade # …or let Claude call search_runbook_documents # versioned · searchable · OAuth + bearer
Every app ships with the skill files Claude Code needs to understand it. Open the repo, start vibing.
Vibe-code with Claude—and serve it, too.
Two sides of the same idea. SmallStack is readable by AI (skill files for the theme, CRUD, MCP, deployment) and serves AI—through a first-class MCP server that exposes your existing models as tools.
- CLAUDE.md at the root: your project's onboarding doc.
- 20+ skill files teaching the stack one pattern at a time.
- Ten-minute MCP walkthrough from
enable_mcp = Trueto Claude calling your tools. - Retrieval, too—
enable_search = Truegives Claude asearch_ticketstool, the lowest-friction RAG.
# Two flags: act on data, and find it. class TicketCRUDView(CRUDView): model = Ticket enable_mcp = True enable_search = True # That's it. Claude Desktop sees: # • tickets_list (search + filter) # • tickets_get (by id) # • tickets_create / update / delete # • search_tickets (full-text → RAG) # All authenticated by OAuth + bearer.
Three commands to a running app.
Free, MIT-licensed, self-hosted in minutes. Managed hosting from $15 / month when you'd rather not.