Back to articles

The vault is my CMS

May 17, 2026

TechObsidianSystems

I don't have a CMS. I have markdown files and a CI script that reads them. Here's how that happened and why Sunday is now the only deadline I track.

The vault is my Content Management System

I don't have a content management system. I have an Obsidian vault, a Python script, and a GitHub Action that runs when I push.

The simplicity is all there.

Last week I wrote 10 book notes in markdown. They are on the blog now. No upload, no CMS panel, no publish button. I edited files, committed, and the pipeline did the rest.

That was the point.

Nowadays it's easier to ask an LLM to summarize a PDF or EPUB in seconds. Sure, that can work, but it is not optimal for the human brain to absorb at that velocity. Information still needs application, judgment, and context.

The old system was good at storing ideas and bad at shipping them.


The problem I was ignoring

My book notes lived in the vault but the blog was a separate thing. If I wanted something on the site, I had to write it twice: once for myself, once for the public surface. Two files. Two formats. Two reasons to let it slip.

That is how you end up with a reading section that stays empty for months.

The real problem was not that I had no material. I had plenty. Notes on Meditations, Naval, 4-Hour Work Week, Psychology of Money, and more. Good notes. Useful ones. They just never crossed the boundary between private knowledge and published work.

Every time content has to change tools, shape, and context before it ships, friction wins.


What I changed

I stopped treating publication as a separate activity.

I added two required sections to each book note in the vault: ## Key Lesson and ## Notes.

Then I wrote generate_json.py. The script scans the book notes folder, parses frontmatter, validates required fields, extracts those two sections, and writes a books.json artifact.

A GitHub Action runs on push in the data repo. If parsing fails or required metadata is missing, the workflow fails and nothing new is published. If it passes, the blog fetches the JSON at build time.

The vault is the source. CI is sync and validation. The blog is rendering.

No extra layer between writing and publishing. If I update a note, I commit, and within minutes the change is live.


Why this works

The same file does two jobs.

When I review a book, I use the note as personal reference in Obsidian. When someone visits the blog, the same content becomes a public page with the lesson on top and full notes below.

I no longer decide whether to publish from scratch. I decide whether the note is good enough.

That distinction matters. A publish decision creates hesitation. A writing standard creates momentum.


The weekly habit that makes it real

I added a Sunday block: one hour, one question.

What in the vault is worth sharing this week?

Not starting cold. Not picking a random topic. Reviewing what already exists, finishing what is 80 percent done, and selecting what is ready.

If the vault has material, Sunday is a filter. If the vault is empty, Sunday exposes the upstream problem before I promise anything publicly.

I also use one hard rule: if I cannot pick one publishable note in 60 minutes, the bottleneck is not distribution. The bottleneck is writing quality during the week.

AI is good for writing and reviewing content, but without human review the depth of the topic is often superficial. It retrieves information well, but it does not add lived experience.


The tradeoff I accept on purpose

This system only works if I actually write.

CI cannot publish what does not exist. Sunday review cannot rescue an empty vault.

I also give up CMS comfort on purpose. No drag and drop blocks. No visual editing toys. No rich workflow UI.

But that is fine for my current bottleneck.

I know there are services that can replace this flow, especially for my requirements. In a world full of free-tier cloud tools, I still prefer one single point of failure, GitHub, instead of many integrations.

That is also why I moved from Notion to Obsidian. Cloud services are not evil, but many eventually become rent-based dependencies for basic knowledge workflows.

My constraint is not formatting freedom. My constraint is consistent output with low friction.

I would rather have a reliable markdown pipeline that ships than a powerful CMS that waits for perfect formatting.


Some Sundays nothing ships.

That is not failure. That is feedback that the week did not produce enough material worth publishing.

Every Sunday. One review. Whatever is ready ships.

That is the system.

© 2026 Giorgio Ozzola. All Rights Reserved.

RSS Feed

Inspired by Takuya Matsuyama

Version: 1.5.0