A minimalist blogging platform built for people who just want to write, not wrestle with complex content management systems.
Scriba transforms simple Markdown files into a minimal, fast blog with a clean aesthetic. Write your posts in your favorite editor, commit them to Git, and deploy with Docker. No databases, no admin panels, no complexity.
- Markdown-first: Write posts in plain Markdown with frontmatter metadata
- Dynamic images: Images stored alongside posts, perfect for Docker workflows
- Git-based workflow: Version control your content alongside your code
- Docker deployment: Deploy anywhere containers run
- Fast & lightweight: Server-side rendering with minimal JavaScript
- SEO-friendly: Semantic URLs and proper metadata handling
- People who want a personal blog without the overhead
- Technical writers who prefer Markdown to WYSIWYG editors
- Anyone who values simplicity and performance over complex features
- Teams who want to run multiple blogs from the same codebase
Scriba believes that blogging software should get out of your way. Your content lives in simple text files. Your blog deploys like any other application. Your writing workflow integrates with your existing development tools.
No vendor lock-in. No proprietary formats. Just Markdown, Git, and Docker.
- Rust: Fast, safe, and reliable systems programming language
- Axum: Ergonomic web framework built on Tokio
- Askama: Type-safe templating with compile-time checking
- TailwindCSS: Utility-first CSS framework
- DaisyUI: TailwindCSS plugin
- Markdown + YAML: Content format with frontmatter metadata
- Docker: Containerized deployment
# Clone this repository
git clone https://github.com/ctorresmx/scriba.git my-blog
cd my-blog
# Build the project (this will compile CSS via build.rs)
cargo build
# Start development server
cargo runYour blog is now running at http://localhost:8000. The server will restart
when you make code changes (use cargo watch -x run for auto-reload).
Create Markdown files in the posts/ directory with YAML frontmatter. Posts are
automatically available at /{YYYY}/{MM}/{DD}/{slug} where the slug is generated from
the title.
→ See CONTENT.md for the complete content creation guide
Customize your blog with environment variables:
| Variable | Default | Description |
|---|---|---|
BLOG_NAME |
"Scriba" |
Site name displayed in header and footer |
BLOG_TITLE |
"Scriba" |
HTML title tag (appears in browser tab) |
BLOG_COPYRIGHT |
"Scriba" |
Footer copyright text |
BLOG_POSTS_DIR |
"./posts" |
Directory containing your Markdown posts |
BLOG_FAVICON_TEXT |
"Scr" |
2-3 character text for auto-generated favicon |
PORT |
8000 |
Server port |
# Minimal setup
BLOG_NAME="My Blog" \
BLOG_TITLE="My Personal Blog" \
BLOG_COPYRIGHT="© 2025 My Name" \
cargo run
# Full customization
BLOG_NAME="Tech Insights" \
BLOG_TITLE="Tech Insights - Deep Dives & Tutorials" \
BLOG_COPYRIGHT="© 2025 Jane Doe | Powered by Scriba" \
BLOG_POSTS_DIR="/content/posts" \
BLOG_FAVICON_TEXT="TI" \
PORT=3000 \
cargo run# Development server
cargo run
# Build for production
cargo build --release
# Run production build
./target/release/scriba
# Run tests
cargo test
# Check code quality
cargo check # Type check
cargo fmt # Format code
cargo fmt --check # Check formatting
cargo clippy # Lint code
# Auto-reload on changes (requires cargo-watch)
cargo install cargo-watch
cargo watch -x run# Quick Docker deployment
docker run -d -p 8000:8000 -v $(pwd)/posts:/app/posts:ro ghcr.io/ctorresmx/scriba:latest
# Or build and run locally
cargo build --release
./target/release/scriba→ See DEPLOYMENT.md for production Docker setups
Having issues? Check the troubleshooting guide for solutions to common problems.
Interested in contributing? Check out the contributing guide to get started.
AGPL v3 License - use it, modify it, share it. If you run a modified version as a service, you must share your changes.