I gave Claude a memory. Here's how.
The thing that annoyed me most about Claude, for months, was that it forgot me every time.
New chat, new Claude. I'd spend the first five minutes every session re-explaining the same context, what I'm working on, what tools I use, that I'm based in New Zealand, that I code mostly in Python, that I did legs yesterday and my hamstrings are wrecked. You know, the things a smart mate would just know about me.
So I built one. A personal wiki Claude can read. I called it HIKI, because it's a wiki and my surname is Hitchman. It's not clever. It's just mine.
The shape of it
Here's the whole thing as a diagram in words:
- A folder of markdown files on my Mac mini at home, one file per topic.
workouts.md,ai.md,microsoft.md, etc. - A small Python server on that Mac mini that serves the folder as a set of MCP tools.
- A Cloudflare Tunnel so my Mac mini is reachable from the internet without me poking holes in my home router.
- A tiny Cloudflare Worker in front, handling OAuth so random people on the internet can't just read my workout log.
- Claude (on any device, any app) connects to that Worker as an MCP server. And now Claude knows me.
Total lines of code: a lot less than you'd think.
Why markdown, not a database
The whole thing runs on flat markdown files. Not Postgres. Not a vector database. Not even SQLite.
This felt wrong at first. Surely a real engineer would use a real database. But then I asked myself what I actually needed, and the answer was "a file I can hand to an LLM". Which is what a markdown file is. The LLM does the searching. The LLM does the filtering. The file system just has to be a file system.
If the model can read the whole file in context, you don't need a fancy retrieval layer. You just need a file.
This is a theme for me. Most "AI infrastructure" is solving problems you don't have yet. Start with a file.
The Mac mini, embarrassingly
There is a Mac mini on a shelf in my living room. It's the M2 base model. It hums quietly to itself. It hosts HIKI and will eventually host other things too. I looked at deploying to a cloud VM and the math didn't work out, my Mac mini has been paid off for years, uses almost no electricity, and doesn't care about my traffic volume (which is one user, me).
Is it "production-grade"? No. Do I care? Also no. This is a personal project. Personal projects are allowed to run on a Mac mini in your lounge.
The Cloudflare Tunnel trick
The bit I was most worried about was exposing the Mac mini to the internet. I don't want to open ports on my router. I don't want a static IP. I don't want to think about NAT.
Cloudflare Tunnel solves this. You install cloudflared on the Mac. It makes
an outbound connection to Cloudflare. Cloudflare then routes inbound requests to your
tunnel, which forwards them to your local Python server. From the internet's perspective,
there's a hostname, hiki.matthitchman.com, that happens to live on a shelf
in my house.
No port forwarding. No firewall config. No VPN. It just works. This was the moment I realised Cloudflare is secretly the coolest company in computing.
OAuth, which I didn't want to write
The tunnel made the server reachable, but I didn't want it readable by anyone on the internet who typed the URL. The Claude MCP spec wants OAuth. I do not want to write OAuth.
So I didn't. I put a Cloudflare Worker in front of the tunnel that handles OAuth using a
small open-source library called MCPVault. The Worker checks the token, then forwards to
the tunnel. That's the whole story. The Worker lives at mcp.matthitchman.com.
It's maybe 100 lines of TypeScript.
What broke
Plenty.
- First version had the Python server returning the wrong content-type. Claude just silently ignored everything. Took me an hour to spot because there were no errors, just no tools.
- OAuth redirect loop because I'd pasted the wrong callback URL. Classic.
- One markdown file had a broken YAML frontmatter block. The MCP server crashed every time Claude tried to list tools. Fixed with a
try/exceptthat now skips broken files and logs them. - At one point Claude confidently told me I hadn't been to the gym in three weeks. I had. The clock on the Mac mini had drifted. That was a fun afternoon.
None of these were hard. All of them took longer than I wanted. This is what "shipping" really looks like, 80% of it is boring plumbing that you didn't know you'd need to care about.
Does it actually work?
Yes. A typical day:
- I tell Claude "log today's workout: push day, bench 3x8 at 80kg". HIKI appends it to
workouts.md. - Two weeks later I ask "how's my bench been trending?". Claude reads
workouts.mdand tells me. - I mention a new AI tool I tried. Claude offers to log it to
ai.md. I say yes. - Next conversation, Claude remembers I've used that tool. Opinions it expressed before are consistent.
It's embarrassingly useful. It's also the most fun side project I've had in years. I keep thinking of new record types to add. Reading lists. People I meet. Books. Hot takes.
Should you build one?
Probably. If you:
- Use Claude (or an MCP-compatible client) a lot
- Hate re-explaining yourself
- Can run a small Python server somewhere, a Mac mini, a $5 VPS, even a Raspberry Pi
- Are willing to spend a weekend on it
I'll write up the how-to in more detail in a future post, including the exact Cloudflare Tunnel setup and the MCPVault Worker config. For now, this is the shape of the thing.
Questions welcome, matt@matthitchman.com.
Matt