castmd: Vibe Coding a Chrome Extension for LLMs
How I rebuilt a forgotten Chrome extension into castmd — converts any web page to Markdown, JSON, or Claude XML for feeding LLMs — using vibe coding with Claude Code.
Here's a thing that happens when you work with LLMs every day:
You find a doc you want to share with Claude. You copy-paste it. The model hallucinates on your nav bar. You paste again, cleaner. You spend 4 minutes manually stripping noise. You do this five times a day. You stop noticing it's a problem.
I stopped noticing it for a year and a half.
In October 2024 I built a Chrome extension called md·convert over a weekend. It copied pages as Markdown. It kind of worked. I shipped it, used it a few times, forgot about it.
Then in April 2026 I looked at my clipboard history and realized I'd been doing the same annoying manual cleanup every single day. The extension I'd built was sitting right there, not doing its job.
So I sat down with Claude Code and just rebuilt it.
The vibe was: kill the friction
I didn't write a spec. I described what was broken and we started fixing things. Fast feedback loops, ship when it feels right.
The first product decision: the output was garbage. Paste a technical article and you'd get the words but lose everything that gave them meaning — no bold, no code snippets, no links. Just flat text the model had to reinterpret.
When you know exactly who's reading the output and why, the right fix is obvious. This is a tool for feeding models. Every decision should serve that use case.
The feature that changed the positioning: three output modes
Originally there was one output: Markdown. Paste anywhere.
Then I thought about the actual use cases:
- Feeding Claude → you want Anthropic's
<document>XML wrapper, the format their API is designed for - Building a pipeline or RAG system → you want structured JSON with title, URL, Markdown, token count
- Just chatting → plain Markdown is fine
So I added a three-way toggle: MD · JSON · XML.
The XML mode was the real insight. Anthropic has a specific format for multi-document prompting that nobody else outputs. It's zero extra effort — a string wrapper around the Markdown. But the button label changes to "Copy for Claude." One label change that says everything about what the tool is for.

Token counting because models have context windows
After every conversion: token estimate + a row of model compatibility chips.
Green = fits. Strikethrough = over limit.
This feature took 20 lines of code. It's the one I get the most "oh that's smart" reactions to. Usually the best product decisions are like that — obvious in hindsight, invisible until someone does it.
One button. Every open tab converts and concatenates into one Markdown document.
The use case: you've been researching a topic across 11 tabs. You want to dump the full context into one Claude conversation. Previously: close each tab, copy each page manually, paste one by one. Now: one click, one paste.
I built this because I needed it. I use it every day. That's the whole product brief.
The name problem
md·convert is a terrible product name. I knew this and kept not fixing it.
I ran it through a naming framework — scoring on memorability, LLM-era feel, emotional resonance, domain availability. md·convert scored 48/100. It says what it is, not what it does. A utility name, not a product name.
After ~30 candidates, castmd emerged. The verb sold it: cast. You cast something out. You broadcast. You send. It has action and intent in a way that "convert" never will.
Then the tagline wrote itself:
Cast any page. Feed any model.
Two imperatives. Subject implied. The whole product in seven words. Good names feel inevitable after you find them.

What vibe coding actually means
People use it to mean "AI writes the code while I watch." That's not it.
The useful version: you develop strong intuitions about what's broken and what good looks like, and you use AI to close the gap as fast as possible. The AI accelerates execution. The product sense is still yours.
castmd started as a weekend project with no opinion about its output. It became something I actually use by developing a very specific opinion: this is for feeding models, and everything else is noise.
That opinion — not the code — is the product.
castmd is open source and free: castmd.cc4.marketing
GitHub: github.com/blacklogos/castmd