How I Ended Up Starting a Blog
They say that being a programmer is a profession that involves lifelong learning.
As you continue to learn throughout your life, you accumulate a variety of knowledge beyond the fundamental concepts of computer science learned in college. This includes practical domain knowledge, new technologies, and personal insights. Eventually, it becomes overwhelming to rely solely on memory, and even concepts learned just a few months ago can start to fade.
This realization made me acutely aware of the need for personal knowledge management. Initially, I simply took notes in Word documents and backed them up on Google Drive, but after trying Notion, I eventually settled on Obsidian.
As I began to accumulate knowledge, my desire to share it grew as well. I’m more of a practitioner than a researcher, so my insights may not be groundbreaking. However, I believe that even widely known information can be valuable if it’s restructured in my own way. Additionally, while not extensive, I have been gathering experiences and insights from my work as a game server developer, which also provides great material for my blog.
There’s a saying: "You truly understand something when you can explain it to someone else." I once had to explain the basics of computer science to a non-major, and during that process, I realized there were many concepts I had only vaguely understood. It was an experience that helped me identify gaps in my knowledge and work to fill them.
Writing blog posts serves a similar purpose. Through the writing process, I can reorganize and refine my knowledge. Whether or not I have actual visitors, just the thought that someone might read my posts via Google search encourages me to write from another person's perspective. I believe this process will undoubtedly strengthen my understanding.
Nothing Feels Right
In fact, running a tech blog has been a long-held dream of mine.
I don’t consider myself a perfectionist, but I do have a stubborn side when it comes to certain areas, and blog platforms were one of them. I tried various platforms like Naver Blog, Tistory, Velog, Google Blogger, and even hosted my own WordPress site, but none of them felt completely right. I wanted to have full control over the blog’s UI and functionality, but existing platforms came with limitations, and even if customization was possible, it required a lot of time.
This was also a reason for my transition from Notion to Obsidian for personal knowledge management; I wasn’t comfortable being dependent on a platform that could potentially shut down.
In the End, I Had to Do It Myself
Ultimately, I had to create it myself.
When I actually set out to build my blog, I realized there were so many systems to implement: a text editor, a database for saving posts, tagging functionality, login integration, search capabilities, serving static files, and more.
I kept putting it off because it felt overwhelming until the trend of static blogs emerged. This approach involves writing documents in Markdown and converting them to HTML, allowing many people to host just static files. I tried it out, but I still found it difficult to customize as I wanted, and perhaps because I’m a backend developer, I didn’t like the feeling of having no backend.
While I didn’t end up making my blog a static blog, I did gain some insights. If I could serve Markdown files created in Obsidian directly as blog posts, I wouldn’t have to implement many features. By reading the files from the Obsidian vault and converting them to HTML, I could index the tags and content and serve them directly to users.
Unlike before, AI has advanced significantly and can generate code effectively. For this blog project, I was able to proceed with vibe coding using Claude Sonnet 4. By describing the desired layout and functionality, it automatically implemented the frontend CSS, HTML, JS, and backend Node.js features.
Of course, I couldn’t use the generated code directly. I had to review all the code and correct any misunderstandings.
Even so, I saved an immense amount of time compared to writing everything from scratch. Especially since Claude wrote all the frontend code, my only task was to tweak the CSS for better aesthetics.
How It Works
The actual process is a bit more complex, but I’ll provide a brief overview of the overall functionality here. In the actual service, features like throttling for change detection will be added.
Writing Blog Posts
I write blog posts in Obsidian. During this process, I input metadata such as tags, creation date, visibility, and upload a thumbnail image.
Conversion Process
Since Obsidian is also installed on the server and I subscribe to Obsidian Sync, changes are automatically synced. When the Node.js service on the server detects changes in the vault files, the conversion process begins.
Conversion Process:
- Translate documents originally in Korean to English.
- If the hash of the Markdown file hasn’t changed, skip it.
- Use OpenAI’s API (gpt-4o-mini) for translation.
- Convert Obsidian-style tags to Markdown format.
- Tags like image size settings are changed directly to HTML.
- Handle relative and absolute links appropriately.
- Convert Markdown to HTML.
- Using markdown-it.
- Register metadata such as tags, creation date, and thumbnails in memory.
- Using node-cache.
- Estimate reading time: reading-time.
- Read the content for search indexing.
- Using fuzzysort.
- Copy necessary static files to the service folder.
Once the conversion process is complete, the content and metadata are indexed in memory.
Backend Processing
Web requests are served through Express.
- List Page: Retrieve and send indexed posts.
- Post Page: Send the requested post.
- Search API: Search indexed posts using fuzzysort and return results.
Additionally, I implemented a few auxiliary features for SEO and optimization.
- Generate tags like hreflang and meta that match the posts.
- Create pages like sitemap and robots using the information in memory.
- Image resizing and caching.
Frontend Processing
For comments, I used Giscus, which utilizes GitHub Discussions.
I also added Google Analytics for user activity tracking, along with a cookie consent dialog.
Here’s to Writing Well
Actually, I started a blog about ten years ago. I decided to run an indie game review blog and put a lot of effort into it. However, after posting a few entries, I ended up abandoning it.
For some reason, that memory makes me feel a bit overwhelmed as I write my first post after finishing the coding. Looking at the empty categories feels daunting. However, I’m reassuring myself that this time will be different, and I plan to post consistently.