How I Started My Blog
They say that being a programmer is a profession that requires lifelong learning.
As you continue to learn throughout your life, you accumulate various types of knowledge: foundational computer science concepts learned in college, domain knowledge gained from practical work, new technologies, and personal insights. Naturally, it becomes difficult to manage all this knowledge just by relying on memory, and sometimes even what I learned a few months ago starts to fade.
This realization made me acutely aware of the need for personal knowledge management. Initially, I simply took notes in a Word document 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 also grew. I’m more of a practitioner than a researcher, so my knowledge may not be groundbreaking. However, I believe that even widely known information, when restructured in my own way, is worth sharing. Additionally, my experiences and insights gained from working as a game server developer, though not extensive, are gradually building up and provide good material for my blog.
There’s a saying: "You truly understand something only 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 that there were many concepts I had only vaguely understood. Explaining them helped me identify gaps in my knowledge and fill them in.
Writing blog posts is similar. The process of writing allows me to reorganize and refine my knowledge. Whether or not there are actual visitors, just the thought that someone might read my writing through a Google search encourages me to write from another person's perspective. I believe this process will undoubtedly strengthen my knowledge.
Nothing Seems Right
In fact, running a tech blog has been a long-held aspiration of mine.
I don’t consider myself a perfectionist, but I do tend to be particularly stubborn about certain areas. The choice of blogging platform was 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 completely satisfied me. I wanted to control the UI and functionality of my blog, but existing platforms came with limitations, and even if customization was possible, it required a lot of time.
This was also the reason I moved my personal knowledge management from Notion to Obsidian; I was uncomfortable being dependent on a platform that could potentially shut down one day.

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 functionality, 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 this as well, but I found it challenging to customize it to my liking. Perhaps because I’m a server developer, I didn’t like the feeling of having no backend.
While I didn’t end up making my blog a static one, I did gain some insights. If I could serve Markdown files written 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 well. I was able to use Claude Sonnet 4 for this blog project, allowing me to proceed with vibe coding. By simply describing the desired appearance and functionality, it automatically implemented the frontend CSS, HTML, JS, and backend Node.js features.
Of course, I couldn’t use the generated code right away. I had to review all the code and correct any misunderstandings of the intended functionality.
Even so, I saved an enormous 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 a bit to make it look nicer.
How It Works
The actual process is more complex, but I’ll briefly explain the overall operation here. In the actual service, features like throttling for change detection are 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 Markdown file's hash value 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 directly converted to HTML.
- Handle relative and absolute links appropriately.
- Convert Markdown to HTML.
- Using markdown-it.
- Register metadata such as tags, creation date, and thumbnail 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 post and its 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 post.
- 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.
To track user engagement, I integrated Google Analytics, which also led to the addition of a cookie consent popup.
I’ll Do My Best
In fact, I once started a blog about ten years ago. I decided to run an indie game review blog and worked hard to set it up. However, after posting a few articles, I lost interest and quit.
For some reason, that memory makes me feel a bit overwhelmed as I write my first post after completing the coding. Looking at the empty categories, I feel a bit daunted. But I reassure myself that this time will be different, and I plan to post consistently.