
April 30, 20265 min read
A small filesystem tweak that quietly fixed the worst part of running a bunch of open source projects: keeping the code, the docs, and the marketing site in sync.
I kept running into the same friction. I’d ship a feature in Coco, then five minutes later realize the README needed an update, the wiki needed a new page, and the marketing site at coco.griffen.codes had a stale install command sitting on the homepage. Three repos, three context switches, three chances to forget one.
For a while I just lived with it. Each project had a sibling folder layout on disk: coco/ next to coco-www/ next to whatever wiki notes I happened to have lying around. When I wanted to update docs after a code change, I’d close the editor, open another window, try to remember the gist of what I just shipped, and start typing. Half the time I’d skip the wiki entirely because the friction was just high enough to defer it.
Then agents got good. And the cost of that fragmentation went from “annoying” to “actively breaking my workflow.”
When you’re driving an agent through a coding task, context is everything. The model can only reason about what it can see. If your library lives in one folder and your docs live in a folder next door, the agent in your library session has no idea the docs exist. You either have to feed it a second copy of the docs as context (lossy, manual, easy to forget), or you have to spin up a second agent in the docs repo and play telephone between the two.
Both options waste the thing agents are actually good at: holding a lot of context at once and acting on it coherently.
The fix turned out to be embarrassingly simple. Inside each project’s main repo, I now keep two hidden folders:
.wiki/ – a clone of the project’s GitHub Wiki repo.www/ – a clone of the project’s marketing or docs website repoBoth are full git repositories in their own right, with their own remotes, branches, and history. They just happen to sit inside the parent repo’s working tree. A two-line addition to .gitignore keeps the parent repo from ever trying to track them:
# .gitignore
.wiki/
.www/
The trick that makes this work is GitHub’s wiki itself. Every GitHub Wiki is a real git repository under the hood, accessible at https://github.com/<owner>/<repo>.wiki.git. So setting up a new project workspace looks like this:
cd coco
git clone https://github.com/gfargo/coco.wiki.git .wiki
git clone https://github.com/gfargo/coco-www.git .www
echo ".wiki/\n.www/" >> .gitignore
That’s it. Now the library, the docs, and the marketing site all live inside one folder my editor and my agent can both see at the same time.
The first time I tried this on Strut, the difference was immediate. I shipped three small fixes: a config parsing bug, a new flag, and a tweak to the deploy step. Normally that’s three separate “remember to update the docs” todos that I’d file away and probably forget. Instead, after the last commit I just turned to the same Claude Code session and said: “Now look in .wiki/ and .www/ and update anything affected by what we just changed.”
It found the right wiki page, updated the flag reference, caught a stale example in the marketing site’s quickstart, and committed each change to its respective repo. No re-explaining what we’d done. No second agent. No telephone game.
The reason this works so well is that modern context windows are large enough to hold the whole project at once. Three bug fixes plus a wiki page plus a marketing landing page is well within range. So a single orchestrator agent that already knows what shipped can fan out into the sibling directories and make coherent updates across all of them in one pass.
That last part is the part I keep coming back to. The agent doesn’t need to be told what changed because it’s the agent that just changed it. All the context is right there.
The workflow I’ve settled into now looks roughly like this:
.wiki/ and update any affected pages..www/: update the homepage copy, the install command, the feature list, whatever’s drifted.The whole thing happens in one session. The release notes, the docs update, and the marketing copy all get written by the same model that wrote the code, with the same understanding of what actually changed.
There’s a bonus benefit I didn’t fully appreciate until I’d been using this setup for a few weeks. Because the wiki is a real git repo and the marketing site can pull from its API, I now have a single source of truth for documentation that flows in one direction.
The pattern: docs are written and versioned in the GitHub Wiki. The marketing site fetches them at build time (or on demand) from the GitHub Wiki API and renders them under /docs. Each rendered page includes a small “edit this page” link that drops the reader straight into the GitHub Wiki editor for that file.
That gives me three things at once:
Before this, the docs on the marketing site and the docs in the repo would inevitably drift. Now they can’t, because there’s only one of them.
I’ve been rolling this layout out across the projects I actively maintain. A few spots where it’s earned its keep:
A few things worth flagging if you want to try this:
AGENTS.md or CLAUDE.md explaining that .wiki/ and .www/ are nested repos for the wiki and marketing site goes a long way. Otherwise the agent may treat them as throwaway folders.The next thing I want to figure out is whether this layout makes sense to formalize as a template. Something like a griffen-project-template with the gitignore lines, the AGENTS.md notes, and a small bootstrap script that clones the wiki and www repos into place. If that ends up being useful I’ll write it up.
For now, the takeaway is just this: when you’re working with agents, the layout of your filesystem becomes part of the prompt. Putting the things that need to stay in sync inside the same workspace is one of the cheapest, highest-leverage changes I’ve made to my workflow this year. Give it a try if you’re juggling a library, a wiki, and a marketing site across three folders. The friction you stop feeling is real.
If you’ve found a different layout that works for you, I’d genuinely like to hear about it. Drop me a note.
Discussion
Comments are powered by Disqus. Sign in once, comment anywhere.
