I Got Tired of Every Publishing Tool, So I Wrote My Own
At some point I made a list of options for a personal website.
-
WordPress: needs a database, a hosting setup, and roughly forty plugins before it does anything useful.
-
Jekyll or Hugo: fine, but now there's a build pipeline, a theme layer, a deployment step, and a config file with strong opinions about your life.
-
Ghost, Substack, every hosted option: someone else's UI between you and your content, and usually a monthly fee for the privilege of that arrangement.
Write → Website. No intermediate format, no export step, no CMS deciding what a post should look like.
So I wrote a Python script.
The first version was embarrassingly small. One markdown file, one Flask route, one webpage. The script read the file, ran it through a markdown parser, dropped it into a template. That was it. But it looked exactly like what I'd written - no imposed structure, no theme fighting back - and that was enough to keep going.
The next question was obvious:
What if my whole Obsidian vault worked? I live in Obsidian. Notes, references, half-finished ideas, linked databases - all of it. The vault already has a folder structure, and folders map to URL paths naturally: blog/My Post.md becomes /blog/my-post. So I built that. Then [[wiki links]] needed to actually resolve - a link to another note should become a link to that note's page, even across sections. Built that too.
And then it just kept going.
The vault kept asking for things. Obsidian has callout blocks (> [!tip]) - those should render on the web, not as raw blockquotes. Dataview queries (TABLE file.name FROM "blog") are live data - they should run server-side and produce a real HTML table. Canvas boards - visual node diagrams you pan and zoom in Obsidian - should be interactive on the page, not screenshots. Transclusion, footnotes, LaTeX, inline tags. Every feature I added was something already in my vault, something I used every day. Not a roadmap item. Just: this thing in my notes should work on the web.
A couple of months later, I had a website engine. I called it InkStone.

A Python/Flask server that turns an Obsidian vault into a website. The folder structure becomes the URL structure: you write in Obsidian, push to GitHub, the site updates. No build step, no export, no CMS. In development it watches file modification times and hot-reloads - edit a note, refresh the browser, see it.
It's open source and free, runs locally with python3 app.py, and deploys with Docker. If you write in Obsidian and want a website without a week-long setup, it's probably for you.
The code is on GitHub: airenare/InkStone.
Documentation is here on this very website - served, naturally, as an InkStone vault, and on GitHub as well. You can host your own docs website locally. Yep, just clone the repo, python3 app.py (don't forget to create a venv and pip install -r requirements.txt if that's your first time) -> http://127.0.0.1:8000 -> You have a live local documentation website. Search works if you need to look something up. Also, it's organized in sections and bite-sized posts with code and examples.
When you are ready to create your website, just set VAULT_PATH in .env to your vault folder, launch the python3 app.py and go to the web browser to see your creation come together in real time.
This post is published with InkStone. So is everything else on this site.