How I turned my external brain's search from keyword matching into semantic search

A while back I wrote about turning Obsidian into an external brain for Claude Code. The idea: Claude Code loses its memory across sessions, so I have it read and write a Markdown vault to carry knowledge forward. It’s still running fine.

But the more I used it, the more one weak spot stood out: recall was keyword search, full stop.

Step two of the read procedure I described in that post was “search the vault for keywords related to the question.” That step misses more than I expected. Daily logs, for instance, are named like メモ/2026-06-23.md — the date is the filename — so if I don’t remember when something happened, I can’t find it. “What did I do that one time” is exactly the query I most want to work, and it doesn’t, unless I remember the date. It’s also fragile to word choice. Search for “don’t grant too much permission” and it won’t match a note that says “許可” (permission) and “射程” (scope) instead — even though they’re saying the same thing.

続きを読む →

Permissions have a range

Last time, I wrote about how I let Claude Code back up my dotfiles and it leaked a GCP key to GitHub. I closed that post by saying: assume mistakes will happen, put the safety net at the git layer, and carve the lesson into an external memory called mistakes.md so it gets ahead of the next one. Cheap tuition, I said.

The very next day, it pulled the same stunt again. Not the key leak this time — the unconfirmed push.

続きを読む →

I Hardened My Homegrown Content-Ingestion Tool with Adversarial Review

I built and use a tool that automatically turns YouTube videos, web articles, and local voice memos into Obsidian notes. It’s called obsidian-import, and what it does is simple: you hand it a URL or an audio file, it transcribes or extracts the body text, has claude -p (Claude Code’s one-shot execution mode) summarize and tag it, and writes the result out as a Markdown note.

I’d been using it happily, until one day it hit me: this tool ingests external content, feeds it to an AI, and writes files to disk. From entry to exit, untrusted input runs straight through the whole pipeline. As an attack surface, that’s about as exposed as it gets — not a great design. I decided to sit down and put it through a proper security review.

続きを読む →

I let Claude Code handle my config backups, and it leaked a GCP key to GitHub

Last time, I wrote about turning Obsidian into Claude Code’s external memory. Riding that momentum, I decided to back up Claude Code’s own scattered settings next — the global config under ~/.claude/, each project’s .claude/, and my own scripts in ~/scripts/. None of it was under version control, so it would all vanish if the machine died.

I consolidated it into dotfiles and had Claude Code automate the whole thing. It promptly leaked a GCP service account key to my own GitHub repo. Here’s the screwup, the recovery I did on the spot, and the guardrails I built so it never happens again.

続きを読む →

Giving Amnesiac Claude Code an External Brain with Obsidian

The most wasteful thing about using Claude Code, in my opinion, is that it loses all its memory the moment a session ends. Whatever tripped it up last time, whatever preferences I mentioned, whatever assumptions the project runs on — the second I start a new conversation, I’m explaining everything from scratch again. It’s brilliant, but it feels like calling a call center where you’re a stranger every single time.

続きを読む →

Testing obsidian-import's MarkItDown conversion against real files

In a previous post I wrote about youtube-to-obsidian. Since then I’ve wanted to turn PDFs and slide decks into notes the same way, so I wired in Microsoft’s MarkItDown to handle them. It’s no longer YouTube-only, so I renamed the repo to obsidian-import.

Now I can pull long academic PDFs, 100-plus-slide decks, lengthy blog posts, and TED talks into Obsidian as summary notes without reading or watching the whole thing. Instead of sitting through a one-hour video, I can skim a well-organized note in a few minutes. The input efficiency is on a different level.

続きを読む →

I open-sourced my YouTube-to-Obsidian converter and turned it into a general-purpose tool

Last time, I built a pipeline that automatically converts YouTube cooking videos into Obsidian recipe notes. It was just two scripts dropped straight into ~/scripts/, but it got me through 43 cooking videos. Since then I worked with Claude Code on a code review, added tests, set up CI, published it on GitHub, and eventually rebuilt it from a recipe-only tool into a general-purpose one. Here’s how that went.

Code review and fixes

First I had Claude Code review the existing scripts. The main issues it flagged:

続きを読む →

I Built a Pipeline That Turns 40 YouTube Cooking Videos into Obsidian Recipe Notes

My YouTube “watch and cook later” playlist had ballooned to 43 videos. I kept saving cooking videos and never actually using them — every time I stood in the kitchen I’d end up pulling out my phone and reopening YouTube, wondering “wait, how did that recipe go again?” I’ve lost count of how many times I’ve done that. I already manage my recipes in Obsidian, so if I could just convert the contents of these videos into Obsidian notes, the problem would go away. I gave it a shot with Cowork (the desktop version of Claude), and the process turned out to have more twists and turns than I expected — worth writing down.

続きを読む →

Life Update

Now that the blog is finally back from the dead, I figured I’d write a life update while I’m at it. Covering eight years in one post is a bit much, so here are a few of the bigger things that happened, roughly in order.

I changed jobs twice more

Since my last post, I’ve changed jobs two more times. Just counting the number might make me look fickle, but the criteria I use to pick a company have stayed consistent the whole time. One is: “how much benefit can this company realistically bring to Japan as a country?” The other is: “can I genuinely get behind what this company is trying to do, as if it were my own cause?” I’ve only moved when I could nod confidently on both counts. The jobs kept changing, but the yardstick never did.

続きを読む →

I Let Claude Casually Fix My Blog After 8 Years of Neglect

Turns out my last update was back in 2018. Eight years. I’d left it sitting there for eight years. When I finally opened my own blog again, it wasn’t even rendering properly anymore. The build was permanently broken, every photo in every post was gone, and the code blocks were a mess. I thought this was my castle. Turned out it was a ruin.

I couldn’t just leave it like that, so I threw a lazy request at Claude Code: “CircleCI’s failing, can you fix it with GitHub Actions?” It ended up doing about three times more than I expected, so I’m writing it down.

続きを読む →