Docfooding: Eating our own documentation | Val Town Blog
Code and prose written on val.townDocfooding: Eating our own documentation<br>Pete MillspaughAug 5, 2026
The Val Town documentation site is now written and<br>hosted on Val Town. To reach parity<br>with our now-deprecated Astro+Cloudflare site, our docs needed to meet a high<br>bar of AX, DX, and UX.
AX: Agents read docs more than humans these days. Are we serving them<br>well?
DX: We knew Val Town would lower editing friction and tighten feedback<br>loops. But could we live without a static site framework?
UX: Docs must be fast and searchable, with all the table stakes features.<br>Will users like our new site?
Stack
The stack for our new docs is unusual. Notably, the entire app is<br>server-rendered. We do not load a client-side library like React, although we do<br>use JSX for components. We write vanilla CSS and old fashioned tags<br>for client-side JavaScript. We author pages in markdown and hand doodle the<br>illustrations (thanks, Jackson). Version control moved<br>from GitHub to Val Town, and hosting from Cloudflare to Val Town. We still use<br>Cloudflare’s edge caching.
As I’ll discuss below, there is no build step in Val Town, which is a huge<br>architectural departure from most static sites, and also the biggest tradeoff.<br>Whether we’re on the right side of that tradeoff, I’m honestly not sure—this is<br>experimental, and I’m writing this to hear what you think.
AX
Getting agent experience right, or at least to parity, was much simpler than<br>developer and user experience. Like the old site, we surface<br>llms.txt and<br>llms-full.txt for agents. Each page has a<br>“Copy as markdown” button for the human in the loop, and you can append .md to<br>any URL path to view the raw markdown. The old site’s structure is preserved, so<br>we inherit all that SEO and AEO juice, which, lately, has become a rather large<br>slice of our new customers pie (user funnel cake?).
DX
Val Town’s core tradeoff is not having a build step. Apps (“vals”) are live the<br>moment you save (in ~100ms), so the friction to edit is very low.<br>Philosophically, that’s grounded in Bret Victor’s<br>principle that creators need an<br>immediate connection to what they’re creating. We knew from<br>moving this blog to Val Town that we’d like how easy it is to<br>edit.
The problem is, most static sites rely on a build step to achieve nice DX<br>without sacrificing UX.
Consider CSS. I’m a big fan of scoped CSS, whether by CSS modules or<br>styled-components or somesuch. Those solutions typically rely on a build step to<br>generate unique classnames. In our docs app, we colocate CSS alongside<br>components, like Header.css next to Header.tsx, which makes for nice editing<br>but opens us to specificity footguns. And, to deliver those files without a<br>build step, we have a single /styles.css endpoint on our server that reads and<br>stitches together all those CSS files at request time when the browser parses a<br>in a page’s HTML. That stylesheet is cached both in<br>your browser with a Cache-Control header and on the edge via Cloudflare, but a<br>cache miss can be slow: up to ~500ms. Nice DX has a cost.
Overall, though, the DX is pretty nice. While building the site I jumped<br>between Claude Code, Townie, the val.town editor, and my local editor. With MCP<br>or CLI, we can pretty much work wherever we’re comfortable.
UX
Docs should be fast and searchable. For search, the old site used Pagefind—a<br>nice library that I still use for my personal site—which required a build step.<br>We replaced it with MiniSearch, which<br>the cmd+k bar lazy loads and is, IMO, about as good as Pagefind. Re speed, I’ll<br>admit that I’m not sure our site is quite as snappy as the old Astro one.<br>Pages are small and relatively quick to load, save for vals embedded in iframes,<br>but for uncached pages the file retrieval and markdown parsing on the server<br>takes a beat. It could be helpful to do some pre-fetching, say, for any pages<br>linked in the page you’re viewing.
Forgoing a framework is also just fun. Documenting from scratch feels like an<br>invitation to be “on brand” and playful. Links on the new docs site are green<br>for internal pages, blue for val.town and val.run URLs, and orange for external<br>sites. Of course, we could have applied custom styles to our previously<br>frameworked site, but, idk, we didn’t. Coding in Val Town is supposed to be<br>productive, but also fun. We’d like the user experience of reading our docs to<br>leave that impression. We hope you like it.
Eat our docfood
Jim, whose blog post I linked up top, writes that our priority should be “UX<br>over AX over DX.” I worry that our new docs may not be faithful to that order,<br>but dogfooding has its own benefits. We want to push against and feel Val Town’s<br>platform limits.
As before, the code is all public for<br>our new site, and we’d love your critique to pick out<br>the no-nos and gotchas.
Edit on val.town<br>Share on TwitterShare on BlueskyShare on Hacker News
We're hiring!<br>Are you an infra engineer who cares about the joy of programming?<br>View position →