Introducing Scriba

by Carlos
projectsopen-sourceblogging

Why Another Blogging Platform?

One of my goals this year was to finally be able to work on coding projects I have left pending for so long. Even though I work as a software engineer I don't have many opportunities to code things that either I want to learn how they work, or tools that might make my life easier.

I started toying with the idea of making my own version of software that I have used over the years: databases (Redis, DynamoDB, InfluxDB, S3...I know...not strictly a database), deployment tools, observability services. I don't have a long-term plan for them, I just like coding and knowing how stuff works.

So, I thought a good idea was to write down all the projects I do, that way I can feel a certain level of "duty" to finish them and not just leave them in an eternal limbo. That's where Scriba comes into the picture.

For years I have been tinkering with the idea of making my own blogging engine, not because the world needs yet another blogging platform, but just because I wanted to do it for fun. My requirements were simple: I wanted something where I could just use the terminal to write new blog posts and publish them with a command line. But I also wanted a very "oh he's a computer nerd" feeling to it.

What Scriba Does

Scriba is a minimalist blogging engine that takes Markdown files and generates a clean, terminal-inspired blog. At its core, it's simple parsing logic that uses Deno's gfm library—just define a header with metadata for your post, write your content in Markdown, and that's it!

The workflow is as straightforward as it gets:

  1. Write your post in Markdown with YAML frontmatter
  2. Drop it in your posts directory
  3. Deploy with Docker Compose
  4. Your blog is live

A nice side-effect of using Fresh's SSR and rendering URLs in a YYYY/MM/DD/title format is that it's SEO-friendly. I searched myself on Google one day and was nicely impressed my blog was already indexed—I didn't have to do anything!

Why Simplicity Matters

I chose Markdown as the main format because...who doesn't like Markdown? It's simple, it's text, no need to click around and ask yourself "Where is X feature button again?". And let's be honest, nothing beats a good CLI interface—at least for us computer nerds.

The Git-compatible workflow was essential to me. I can keep track of my posts, any changes I make, and again...just use the CLI. What's not to love about Git?

Minimalism is something I love. While IDEs are very powerful, they can also be complicated. I'm sure I'm not alone when I say I prefer using CLIs, commands are easy to remember, configuring aliases for long commands is a breeze with the terminal. When it comes to blogging, I don't need much: images? sure! tables? sure! multiple clicks to access and format my posts? not really!

If you like monospace fonts, dark themes, and just something that gets out of the way, then maybe Scriba is for you. I want to start with a small set of features, and as I need more complicated features, I can add them (or you can add them! This is open source after all :) ).

Under the Hood

While I love Rust and want to really learn the language, I decided to go for Deno as the platform to build Scriba on (spoiler alert this will change). I have been primarily a backend engineer, so I wanted to learn the other side of the coin and use the right tool for the frontend job. Deno, Fresh, and TypeScript were clear choices.

I have used React at work for a while now, but the simple DevEx workflow in Deno appealed to me. I don't want to setup endless config files or tie a bunch of libraries together. Deno seemed like a good choice, I could just focus on writing my blog engine in TypeScript.

For styling, I really didn't know what to use. I tried many TUI-style frameworks, but none fulfilled what I was looking for. In the end I went for Tailwind + DaisyUI, but this was primarily driven by friction I had with Deno and Fresh when using other CSS frameworks. I'm not sure if it was my lack of frontend experience, but it seemed too cumbersome to make it work. I just wanted a defined style that I could use across the engine.

For deployment, I went with Docker to keep things simple. What's simpler than defining your environment variables for blog configuration and the path where your Markdown posts live? Just add a Docker Compose file pointing to your Markdown files, run it, and you have a full blog published! Scriba is completely self-contained in Docker, no web interfaces, complicated workflows, or even a mouse required.

The Tricky Parts

Right now, Markdown rendering happens whenever the website loads, which isn't super efficient, but again—simplicity. This is a hobby project, and let's be honest, I won't be posting daily. So far it's rendering great.

The trickiest part was definitely Deno+Fresh. I love Deno and think their aim at simplifying DevEx for web apps is amazing, but Node is the standard these days. I'm not a frontend engineer by any measure. I'm sure there are frontend engineers who have no issues with Deno+Fresh, but I hit my head against the wall more than a couple of times. I just wanted to write Markdown, run a command, and have it live on the internet. Styling took me longer than I'd like to admit.

I ended up going to Claude Code for help, and while it did a good job, I think the Deno+Fresh combo could do better. I tried to find documentation on integrating other CSS styling libraries and had little luck. Claude was able to help me to an extent, but I wish the experience was better. Or maybe it's just skill issues from someone who has never built anything from scratch with Deno.

Reflections and What's Next

After my experience with Deno+Fresh and thinking more about my actual goals with hobby projects, I realized I should just go full Rust on everything I build. I really want to learn Rust because I truly believe in the language, and the best way to get comfortable is to do everything in a single language. That's how I've picked up technologies at work that I wouldn't have been able to otherwise—deep immersion works.

So after I finish this post, I'll start migrating Scriba to Rust. I'm thinking of using a similar approach: an SSR website with Axum and some templating engine, but avoiding frontend Rust frameworks like Dioxus or Leptos for now.

What would you like to see in Scriba next? Auto-publishing? More customization? Let me know!

Try It Yourself

For now take a look at Scriba on my GitHub page and let me know your thoughts!