Three commands.
One running app.
You'll clone the repo, run two make targets, and land on a working dashboard with auth, an API, an MCP server, and a sample admin — under five minutes total.
Get the repo on disk.
SmallStack is a starter, not a framework. You clone it once and own the result — fork it, rename it, push to your own remote.
$ git clone https://github.com/emichaud/django-smallstack my-app $ cd my-app
upstream remote so you can git merge upstream/main
when new versions ship — that's how this very site is kept current.
One target. Everything wired.
make setup creates the virtualenv with
uv, applies migrations, and seeds a dev superuser so you can
log in immediately. No copy-pasting .env.example.
$ make setup # Resolve packages with uv ✓ 66 packages installed # Apply migrations ✓ Applying contenttypes.0001_initial... ✓ Applying accounts.0001_initial... ✓ Applying mcp_server.0001_initial... # … # Create dev superuser (admin / admin) ✓ Superuser admin created
.venv/data/db.sqlite3admin / admin (dev only — rotate before deploy)uv and make. Install uv
with curl -LsSf https://astral.sh/uv/install.sh | sh if you don't have it.
Open the dashboard.
The dev server runs on port 8005 with a
background task worker inlined — no second process.
$ make run ✓ Django version 6.0, using settings 'config.settings.development' ✓ Starting development server at http://localhost:8005/ ✓ Inline worker: 0 tasks pending # Ctrl+C to quit
localhost:8005/ — your marketing sitelocalhost:8005/smallstack/ — the staff dashboard (log in as admin)localhost:8005/api/docs/ — interactive Swagger UIlocalhost:8005/mcp — MCP JSON-RPC endpoint (point Claude here)What are you building?
Each path is a focused walkthrough — one shape, the patterns it uses, the docs that go with it.
Build a CRUD page
Add a model, declare a CRUDView, register a nav item. Five minutes to a list, detail, edit, and delete UI.
Expose a REST API
Flip enable_api=True, get JSON endpoints, an OpenAPI spec, Swagger docs, and bearer-token auth.
Ship an MCP server
Flip enable_mcp=True, point Claude Desktop at /mcp, watch tools register. Ten minutes total.
Schedule a task
Background work runs inline by default — no Redis, no Celery. Add a task, register a cron, watch it fire.
Ready when you are.
When it's time to deploy, kamal setup && kamal deploy
takes you from local to a zero-downtime production server with TLS, in about ten minutes.