Documentation

SmallStack supports web apps, API backends, and automation systems. Pick your solution type and we'll point you to the right docs.

Browse All SmallStack Docs

Web Applications

A typical SmallStack web app has three page layers. Each can use your own custom theme or SmallStack's built-in theme. Choose the setup that fits your project.

Public Pages

Landing pages, marketing, non-authenticated content

Your public-facing pages — homepage, pricing, about, etc. Most projects use a custom theme here for brand control.

Custom Theme SmallStack Theme
User Pages

Authenticated user-facing features — dashboards, profiles, settings

Where logged-in users interact with your app. Custom themes work here too, or use SmallStack's sidebar layout for fast development.

Custom Theme SmallStack Theme
Staff & Admin Pages

Admin tools, data management, operational dashboards

Internal pages for staff and admins. SmallStack's built-in theme is the practical choice here — there's little value in reskinning admin tools.

SmallStack Theme

API & Frontend Frameworks

SmallStack Built-in API

CRUDView's enable_api = True generates REST endpoints from your models automatically. Great for simple reads, writes, and extending existing views — no extra packages required. Reliable, flexible, and zero config.

When You Need More

For complex APIs with serialization, pagination, filtering, versioning, or OpenAPI schemas, add Django REST Framework, Django Ninja, or Bolt. These packages complement SmallStack and work alongside the built-in API.

Frontend Tutorials

Step-by-step guides for building frontend apps that consume SmallStack's API.

Integrations & Feeds

Webhooks — Inbound & Outbound

Flip enable_webhooks = True for signed outbound delivery when a model changes, and receive verified inbound events with @webhook_handler. Four extension seams make Zapier, n8n, Stripe, and Slack plug-ins — not core forks — with stable event_id dedupe and bulk dead-letter replay. Choose which events an endpoint receives from a checkbox picker that annotates every option in plain English, and malformed patterns are rejected when you save instead of silently matching nothing.

RSS / Atom Feeds

Publish a curated Feed over your own scoped queryset as RSS 2.0 or Atom 1.0 (the blog and the status page are the shipped examples), or register an external feed source and let the collector pull it into a model on a schedule. First-party publish and consume, both directions.

Scheduler & Automation

Background Tasks & the Worker

A built-in task framework for queue processing, email sending, and operational automation. No Celery or Redis required — tasks run from the database with a simple worker process, and that worker ships in the Kamal deployment alongside the web process.

Recurring Jobs & the Control Console

Recurring @scheduled jobs are declared in Python — cron, interval, or once — with no crontab and no external beat process. They run on the same database-backed worker, with a themed schedule UI at /smallstack/scheduler/, REST and MCP tools, and a per-minute tick.

Each job opens onto a control console: Run now leads the page, the cadence editor sits beside a live next-five-runs preview, and a fire that has come and gone reads as overdue so a stalled worker can't hide behind a future-looking date.

Human-in-the-Loop

Approvals — A Person Says Yes First

Some actions shouldn't happen until a human signs off: refund the order, publish the schedule, let the agent run the risky operation. Declare a kind with @approval_kind, file a request with request_approval(), and a person decides in the themed console — or in your own page, via the {% approval_card %} embed. Your code reacts through a per-kind callback, a signal, a webhook event, or a polled REST/MCP status. What "approved" means stays yours: approvals never write your models for you.

The AI pattern is built in. An agent calls the request_approval MCP tool and polls get_approval until a human decides — so an autonomous workflow can pause on a real decision instead of guessing. Every transition is race-safe, audited, and fans out to in-app notifications and branded email.

Notifications — Bell & Inbox

One notify() call becomes a topbar bell badge and an inbox row that deep-links back to the page that matters. Use it for anything a signed-in user should notice on their next visit; pair it with a branded email when they need to hear about it while away. It never raises — a notification failure can't break the action that caused it — and it skips the actor, inactive accounts, and duplicate recipients on its own.

Observability

Logs You Can Read Without a Shell

Log lines are written to the database as well as the stream, so they stay readable from inside the app — the answer when the container is locked down or the platform gives you no shell. The staff viewer at /smallstack/logs/ filters by level, logger, and time, searches messages and tracebacks, and expands a row to its full traceback and structured extra fields. The baseline is WARNING; when you need more, open a capture window that turns the level up for a fixed period and closes itself.

Every request carries an X-Request-ID that is injected into each log line emitted while handling it, so "here's my request ID" is a one-search answer. Background jobs and scheduled ticks get a trace_id bound automatically. And it's all machine-drivable: /api/logger/ for CI or a dev panel, five MCP tools so an agent can turn capture up, reproduce, correlate, and turn it back down, and manage.py logs from the shell.

Activity, Uptime & Status

Request-level activity logging with a staff dashboard — paths, latency, who did what — plus pluggable uptime monitors that roll up onto a public status page at /status/. Register a service and a monitor and your subsystem gets a card; open a maintenance window so a deploy doesn't count against your own SLA.

Reference & Setup

Project Fundamentals

Setup, configuration, database, and deployment docs that apply to every SmallStack project.

All Documentation

Browse the full SmallStack reference — every feature, component, and configuration option.