SmallStack v0.13.0 → Changelog & source
Lightweight. Boring. Useful.

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.

Django 6.0 Python 3.12 SQLite + WAL Docker Kamal 2
01 One model

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/ HTML list, detail, edit, delete—with htmx tabs & filters.
/api/tickets/ REST endpoints with paginated JSON and an OpenAPI 3.0 spec.
/mcp JSON-RPC tools tickets_list, tickets_get, etc.—ready for Claude.
/search/ Full-text search page + a search_tickets MCP tool for retrieval (RAG).
02 Four shapes

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 / website

A polished admin app

Auth, profiles, light/dark themes with five palettes, table views, modal editors, search, filters, breadcrumbs.

/tickets/
b / api server

A REST API with tokens

OpenAPI 3.0 spec, Swagger and ReDoc, bearer-token auth, self-service token UI, threat-detection panel.

/api/
c / mcp server

An MCP server for Claude

OAuth + JSON-RPC, derived tools from your CRUDViews, doctor command, health and activity dashboards.

/mcp
d / scheduler

A background task runner

django-tasks with the inline worker by default. Cron jobs without Redis, Celery, or a second container.

$ make tasks
03 Two editions

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.

a / smallstack

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.

$git clone django-smallstack
b / smallstack-tabler

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.

$git clone smallstack-tabler
04 Day one

Boring infrastructure, already done. Eleven admin surfaces wired into the sidebar before you write a line.

The admin you'd build anyway, already built.

/explorer Explorer Every model, browsable.
/search Search new Full-text, per-model opt-in.
/mcp MCP admin Health, tools, traffic.
/api API admin v0.10 Threat panel.
/activity Activity Request log, paths, latency.
/tokens Tokens Mint, search, revoke.
/backups Backups SQLite snapshots + restore.
/status Status Public uptime page.
/users Users Roles, password resets.
/help Docs Markdown + slide decks.
/runbook Runbook new Versioned markdown docs.
05 Boring on purpose

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.

postgres + pgbouncer
redis + sentinel
celery + beat + rabbit
nginx + certbot
1 .sqlite3 database
WAL + IMMEDIATE tuned defaults
$4 / mo vps headroom
06 Knowledge base

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.

web REST MCP CLI one document, four ways in
# 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
07 AI-native

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 = True to Claude calling your tools.
  • Retrieval, tooenable_search = True gives Claude a search_tickets tool, 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.
08 Run it

Three commands to a running app.

Free, MIT-licensed, self-hosted in minutes. Managed hosting from $15 / month when you'd rather not.

$git clone github.com/emichaud/django-smallstack my-app
$cd my-app && make setup # creates venv, migrates, seeds admin/admin
$make run # serving on :8005
This site runs on SmallStack v0.13.0. github  ·  tabler  ·  docs  ·  pricing