Making a Claude Code skill reachable from any repository: a symlink for discovery, additionalDirectories for access, one cd -P at entry, and no relative paths.
About
I build AI systems and write up how I build them along the way. Most of what I publish starts with something that did not work as expected — the article is how I traced the real cause and got it working.
What this blog is
The fix is usually short. The part worth reading is how long it took to find the right place to look.
About half the articles are about this site. It runs on Astro, deploys to Vercel as static files, and has no CMS and no database — the articles are MDX files in a folder.
Everything here exists in English, 日本語 and 繁體中文. English is the source, and the other two ship alongside it.
About me
oharu · Tokyo
I build AI systems: retrieval over enterprise knowledge that was never organised for retrieval, agents that write and run their own queries, and the plumbing that holds them up in production.
Coming from finance rather than computer science turned out to be an advantage. Much of the job is working out what a client actually needs, which is often not what the request says, and then explaining the system back to them without the jargon. That second part matters more than it sounds. A system nobody can explain is a system nobody trusts.
I work in English, Japanese and Traditional Chinese, and most of my career has been on teams split across countries. That is the same reason this blog exists in three languages instead of one.
I studied finance in Taiwan and came to Japan after military service, with no computer science degree. I started in QA, taught myself into development, and moved into AI engineering in 2026.
Certifications
- Claude Certified Architect — Foundations
Things I have built
A retrieval assistant for a service desk. It searches years of past tickets, drafts the reply, and asks a clarifying question when the request is ambiguous instead of guessing. Next.js and SSE at the front, FastAPI and Bedrock Knowledge Bases behind it.
An agent that answers questions about a data warehouse in natural language: it writes the SQL, runs it on Athena, and explains what came back. The application drives the tool-use loop itself rather than going through Lambda or Bedrock Agents, and hands SQL errors to the model so it corrects them on the next turn instead of failing the request.
A Google Chat assistant on Vertex AI RAG Engine. Chat answers webhooks synchronously and has no streaming, so the bot rewrites its own message in place and the reader watches retrieval progress rather than a spinner. The corpus renews itself on a schedule, so a file edited in Google Drive becomes searchable without anyone republishing anything. Every answer carries a feedback control that reports into a data portal, which turns gaps in the knowledge base into something measured rather than guessed at.
Hobby projects: a set of Claude Code skills published as a versioned repo, and AdCraft AI, three agents that turn a product photo into an eight-second advert, a finalist at the AI Agent Hackathon with Google Cloud — 10 entries out of 113.
Selected writing
Chrome DevTools MCP and Playwright MCP expose different surfaces to a coding agent. What each gives you, and why an Astro blog kept one and denied the other.
How do Chrome DevTools MCP and Playwright MCP differ, and why I chose Chrome DevTools for my Astro blog
Pagefind navigated away while an IME conversion was open. isComposing is necessary but not sufficient: WebKit fires compositionend before the keydown.
How I made Japanese search work by intercepting Pagefind's Enter key in the capture phase
Get in touch
I like hearing from people who are building something. If you are putting an AI system into production on AWS, or you have a product that has to hold up in more than one language, I would be glad to talk. Wanting to compare notes on something I wrote is reason enough too.
Email reaches me fastest. If you have found a mistake in an article, a GitHub issue is the better channel for that.


