Transitioning My Second Brain from Org-Roam to the Web
How I publish interconnected Emacs Org-roam nodes directly to my Next.js digital garden without leaving an Org buffer.
Why Org-Roam as a Blog Source?
For a long time my blog lived exclusively inside Notion, while my actual daily thinking, technical notes, and architecture sketches lived inside Emacs using org-roam. That split created friction: every time I wanted to turn an evergreen note into an article, I had to manually copy, reformat, and fix links.
Now, this blog natively parses .org files via uniorg and resolves internal Org-roam ... links automatically—like my note on Building a Procedural Pixel Sakura Tree in TypeScript.
Frictionless Publishing Workflow
To promote any note from my Zettelkasten to the blog, I simply add the :blog: tag in the file header:
Running npm run sync:roam scans my ~/org-roam directory, copies only nodes tagged with :blog:, and gracefully unwraps links to private notes so broken links never leak to production.
Multi-Source Architecture
Instead of locking into a single CMS, the content engine aggregates three adapters into one unified TypeScript interface:
| Source | Format | Best For |
|---|---|---|
| Emacs Org-Roam | .org | Evergreen notes, bidirectional backlinks, literate code |
| Local Markdown | .md / .mdx | Quick standalone posts & repo documentation |
| Notion CMS | API | Drafting on mobile when away from Emacs |
The best publishing workflow is the one that meets your notes where they already live.