Why I Replaced Notion With 40 Markdown Files
- Migrated 600+ Notion pages to 40 markdown files in a weekend
- ripgrep searches the whole archive in under 80 milliseconds
- Claude Code reads the folder natively, no API or plugin
- Total monthly cost dropped from 16 EUR to 0 EUR
I paid Notion for five years and called it my second brain. It turned out to be a rented brain, and the rent kept going up. Last weekend I exported everything, ran it through a cleanup script, and committed 40 markdown notes into a private git repo. I work faster now. Search is instant. My notes outlived the last app I trusted and they will outlive the next one.
Why Notion started failing a solo studio
The offline mode has been "coming soon" since I opened my account in 2019. On a train from Berlin to Hamburg I tried to edit a client brief and got a spinner for forty minutes. That was the first crack. The second was search. I had roughly 600 pages across six years of projects, and finding a specific paragraph took three to four seconds, assuming Notion guessed the right workspace. `ripgrep` on my laptop does the same job in 80 milliseconds against ten times the text.
The third crack was the AI rollout. I was paying 16 EUR a month and somehow I was also the beta tester. Every few weeks a new panel appeared, a toolbar shifted, a sidebar grew a button I did not ask for. I want my notes to be boring. Boring is the feature.
Export sealed it. I tried to pull a single project out as a backup and got a zip of HTML files with Notion-specific class names, broken internal links, and image URLs pointing at an S3 bucket I did not own. My data was mine in the way a hotel room is yours. You can sleep there, you cannot take the walls.
The 40-file structure that holds my markdown notes
I did not plan the number. I counted at the end. Forty files covers five active client projects, three RAXXO products, a studio operations folder, and a small personal layer. The tree looks like this.
studio/
inbox.md
weekly-review.md
clients/
acme-rebrand/
brief.md
notes.md
deliverables.md
nord-coffee/
brief.md
notes.md
products/
blueprint/
roadmap.md
pricing.md
support-log.md
center-this-div/
ideas.md
feedback.md
ops/
invoices.md
contracts.md
taxes-2026.md
notes/
reading.md
writing.md
tools.md
Every project gets a folder. Every folder has at most four files. The flat `inbox.md` at the root is where anything goes when I do not want to decide yet. The `weekly-review.md` is one long reverse-chronological log, one heading per week, bullets underneath. No database, no templates, no toggles. Plain headings and bullets, because that is all I ever used in Notion anyway.
The rule I follow: if a file grows past 500 lines, I split it. If a folder grows past six files, I split the project. Cheap discipline that keeps the tree readable by eye.
How I ported six years of data
Saturday morning, coffee, laptop. The process took about nine hours spread over two days.
Step one, export. Notion's markdown export is rough but usable. I selected each top-level page and hit "Export as Markdown & CSV". I ended up with a folder full of files named things like `Client Projects 8a7f2b9c.md`. Every filename carried a UUID suffix. Every linked page was a relative path with another UUID.
Step two, cleanup. I wrote a 30-line shell script that stripped the UUID suffixes, flattened the nested folders, and rewrote internal links to the new filenames. I ran it, read the diff, ran it again. No magic, just `find`, `sed`, and a text editor.
Step three, the hard part. I read every file. Yes, all of them. Six years of notes is less than you think when most of it is repeated quarterly plans and dead project ideas. I deleted roughly 70 percent of what I exported. Old meeting notes from clients I no longer work with. Draft posts that never shipped. Three separate attempts at a content calendar that lived one week each. The delete key was the real tool.
Step four, `git init`. Private repo on GitHub, one commit with the whole tree. I pushed it, pulled it to my second machine, and that was the migration. No migration service, no CSV intermediate, no paid tier.
Tools I use to read, write, and search these markdown notes
The whole stack fits on one screen.
- **ripgrep** (`rg`) for search. `rg "invoice" ops/` finds every mention of invoices in ops files in milliseconds. I aliased `rgn` to `rg --type md` so I never grep binaries by accident.
- **bat** for reading in the terminal with syntax highlighting. `bat clients/acme-rebrand/brief.md` when I am already in a shell.
- **glow** for when I want the file rendered as pretty markdown without opening an editor. Mostly I use bat.
- **VS Code** for editing, with three extensions: Markdown All in One, Paste Image, and nothing else. No Notion-style blocks, no slash commands, no AI autocomplete. Plain text in a monospace font.
- **Claude Code** for anything that needs reasoning across files. This is the part that surprised me. Claude reads a folder of markdown files natively. No plugin, no API integration, no "connect your Notion workspace" dance. I point it at `studio/` and ask "what did I promise Acme for Q2", and it reads the brief, the notes, and the deliverables, and gives me the answer with file paths as citations.
That last one is why I will not go back. Notion's AI could only see what Notion let it see. Claude Code sees the actual files, the same way I do.
Daily workflow, one command at a time
Mornings start with the inbox. I open `inbox.md` in VS Code. It usually has six to twelve lines I dropped in the day before from my phone, my laptop, or a voice memo I transcribed. I read each line, decide which project folder it belongs to, cut and paste it into the right file, and delete it from inbox. Takes eight minutes on a normal day.
Then I run one command.
rg "TODO" studio/ --type md -n
That gives me every open TODO across every file, with line numbers. I triage. Most days I close three, add two, and move on. No dashboard, no widget, no synced database. A grep and a decision.
Fridays I open `weekly-review.md`, add a new heading for the week, and write five bullets. What shipped. What slipped. What the next week needs. I copy any unfinished TODOs forward by hand, because the friction of doing it manually is the feature. If a task is not worth retyping, it is not worth doing.
Once a quarter I archive. I create a `_archive/` folder, move any client project that is fully closed into it, and commit. The active tree stays small. The history stays complete.
What I lost, what I gained
Honest accounting matters here, so I will not pretend the move was free.
What I lost. Databases. Linked views. Calendar embeds. The "gallery" view for moodboards. The ability to share a single page with a client via a public link. Real-time collaboration, which I never used anyway because I work alone. Comments on specific blocks.
What I gained. Files I can read in 2045. Search that finishes before I finish pressing enter. Portability, because the whole studio fits in a 4 MB git repo that clones in two seconds on any machine I own. Version history through git, which is better than Notion's undo because I can diff two commits from three months apart and see exactly what I thought then versus now. No vendor lock. No subscription. No forced AI features. No load spinner on a train.
The biggest gain is one I did not expect. When my notes are files, every tool on my machine can read them. Claude Code. grep. cat. A tiny script I wrote in 20 minutes that counts words per project per month. Notion kept my data hostage to Notion's features. Markdown gives it back to every tool I will ever use.
I do miss the gallery view. About once a month. The rest of the time I do not think about Notion at all, which is the highest compliment I can pay a tool I replaced.
Bottom Line
Markdown files in git are not a productivity hack. They are the default state of text, and every SaaS app is an argument for why you should pay to escape that default. After five years I stopped paying. Forty files, one repo, zero monthly cost, and a system that will outlast whatever app is trendy in 2030.
Back to all articles