Runbook — versioned markdown documents with a split editor, slide and step views, templates and search
Blogs — per-user channels with a private / members / public visibility ladder, a compact writing studio at /my/blogs/, and a system console under /smallstack/blog/
Publish a runbook page into a blog, optionally resyncing when the page changes
Newsletter — double opt-in subscribers, one-click unsubscribe, and a durable batched sender that resumes if the worker dies mid-send
Readers get/blog/, a sitemap and an anonymous JSON API
Feeds are a publishing surface — RSS/Atom/JSON per blog and site-wide, built as curated Feeds over scoped querysets; the same register_feed() serves a podcast or changelog, with enclosures via FeedItem(extra_kwargs=…)
post = service.publish_document(
document, blog, sync="auto"
)
issue = service.create_issue_from_post(post)
service.queue_issue(issue) # Delivery rows are the ledger
Production-ready containers with zero-downtime deployment.
Docker Compose with web, worker, and health checks
Kamal — deploy to any VPS with kamal deploy
Automatic HTTPS — Kamal provisions TLS via Let's Encrypt
Typical deploy under 60 seconds including build, push, and health check
$ kamal deploy
Building image...
Pushing to registry...
Starting container...
Container is healthy!
Releasing the deploy lock...
Finished all in 38.4 seconds
This site uses cookies to ensure you get the best experience. Learn more