home

I made a blog

Recently, I was tasked with creating a small project and decided to use the opportunity to finish this blog project I started a while ago. I've seen a lot of other CS major blogs, and over time I've been keeping track of what features I would implement / remove if I were to make my own blog. Well, today's that day! Here's an overview of how I made this blog:

Markdown blog files

I am not a fan of writing blog posts in HTML and then pushing them to GitHub. When writing, I don't want to have to worry about HTML formatting or clutter the codebase with blog entries.

Additionally, what if I want to move my blog posts to another site / format one day? It would be a pain to have to restyle every post.

So, for this project, the blog posts will live in Markdown files separate from the repo. Why? I can easily write in Google Docs, export to a .md file, and have react-markdown take care of all the formatting. Markdown also supports great code formatters, which is particularly helpful for a CS blog:

// doesnt this look great, it even has syntax highlighting! await prisma.post.create({ data: { title: title, description: description, filepath: safeFileName, url: safeUrl } })

On top of all that, I added a web portal for uploading the file, meaning I never even have to touch the code / redeploy to add a new post. I used Auth.js with OAuth to password protect the upload page.

Resend email notifications

When I write a blog post like this one, how are people going to know about it? Am I expecting them to check my blog website from time to time? Or maybe I'll personally text everyone the link? Better yet, why don't I just post about it on LinkedIn?

Instead, I decided to just annoy people myself (should they choose) with email notifications. Users can submit their email on the index page, and upon uploading a new blog post I use the Resend API to automatically send email reminders to everyone who subscribed containing the link to the blog post. And don't worry, there's even an unsubscribe link in the email for when you get sick of it! Hooray!

Other details

For storing data (just the email list and blog post metadata), I'm using Apache Cassandra on four AWS EC2 instances across three different availability zones:

Cassandra

Just kidding, I'm using SQLite. SQLite's perfect here since it's super lightweight and doesn't need a separate database service running (it's just a file). I'm also using the Prisma ORM to query the database; I've never used it before, but it's super easy to get setup, and there's a dashboard for viewing all the records which was super helpful.

I've always used Vercel for hosting Next.js: they created Next.js, have a free tier, and it's easy to use. But I've learned it doesn't support a handful of features, including persistent volumes (which I need to store the SQLite DB + markdown files). So I went with Railway + Docker.

I opted to go with a very minimalistic design (I am not good at frontend) with Tailwind + Mantine UI.

Plans for the future

In the future, I want to use AWS S3 for storing the markdown files instead of just keeping them on the webserver. I also want to add a markdown editor in the web UI so that I can write, edit, and post directly from this site.

Thanks for reading this far

I've got a couple of blog post ideas and I'm looking forward to posting more in the future. Also please give me a better name idea than "Joseph's Blog".

Written on 4/13/2026

Enter your email for updates

Something went wrong.