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!

Hello, World!

by Carlos
intropersonal

Who is Carlos?

I'm a senior software engineer with 10 years of experience, and I've spent most of my career as a backend and distributed systems engineer. Currently, I'm working at Block where I focus on building the platforms that power our customer support tooling.

What really drives me in this field is my need to understand how things work at a fundamental level rather than just skimming the surface. I'm the type of person who reads the source code, digs into the implementation details, and genuinely enjoys when someone shows me a better way to approach a problem.

Right now I'm practicing Rust, which takes me back to the days when I was learning C and had to manually manage memory. I find myself drawn to systems programming, distributed systems, and performance optimization.

I believe in following best practices not because someone said so, but because more often than not, they prevent headaches down the road.

Why this blog exists

Honestly, this blog exists because my head is full of thoughts and I've been looking for a way to externalize them. Sometimes the best way to learn and solidify new concepts is by diving into them and putting them into practice.

I'm also a big believer in learning in public. Some of my best learning has happened when I've shared what I'm working on and gotten feedback, corrections, or just different perspectives from other people who care about the same things.

What you might find here

The content will probably be a mix of things. Sometimes I'll write about technical deep-dives when I've spent time understanding how something works and want to share that journey. Other times I'll walk through experiments or side projects I'm building, breaking down the decisions and trade-offs along the way.

You might also find me exploring new technologies or concepts, sharing first impressions and what I'm learning as I go. Occasionally, I'll probably reflect on software engineering practices or career lessons that have stuck with me.

And honestly, there will probably be random curiosities too, whatever happens to capture my interest and seems worth sharing.

What's next

The honest answer? I don't know exactly. I want this blog to evolve organically based on what I'm working on and thinking about. No posting schedules, no content strategy, just sharing when I have something worth putting out there.

If you're interested in similar topics or want to chat about any of the things I write about, feel free to reach out to me on my GitHub profile: ctorresmx.


This blog is powered by Scriba, built with Deno, Fresh, and a lot of markdown files. Because sometimes the best tools are the simple ones.