Every client site ends up with the same small problem. The build goes well, everyone signs off, and three weeks later somebody emails to ask whether the pricing page can say "from £4,000" instead of "£4,000". Thirty seconds of typing. An hour of somebody's day once you count picking it up, branching, pushing, and waiting on the deploy.
The usual answer is a CMS. That works. It also means a schema to keep, a bill to pay, a migration path to worry about, and a client learning an admin panel they will open four times a year.
Harbour goes the other way. Content is plain MDX in the repository, and the client edits it by asking
whichever AI agent they already have open: Claude Code, Cursor, Codex. The agent branches,
edits, and opens a pull request. Nothing lands on main without review. Here is an inline link text demo: example.com.
What the client does
They describe the change the way they would describe it to you.
Can you change the second stat on the homepage to 3.6 hours, and swap the last FAQ for one about our onboarding call?
The agent finds content/pages/home.mdx, makes the edit, opens a PR. You get a diff, and the client
gets a preview of their own change before anyone merges it. Nobody had to explain what a Block is.
That preview is worth setting up deliberately rather than assuming. Hosting platforms tend to put preview deployments behind a login by default, which leaves the client staring at a sign-in wall and quietly hands the review back to a developer.
What you keep
All of it. This is an ordinary Next.js monorepo:
- Content in
content/, as MDX and YAML - Sections from a registry of typed Blocks in
src/components/blocks/ - Design tokens in one file,
src/app/globals.css - CI that fails on a bad edit before anyone sees the page
Clone it, run pnpm dev, work the way you already work. The agent is not a parallel system you have
to keep in sync. It is another contributor pushing branches at the same repository.
Why the content can't hurt you
MDX compiles to JavaScript. So "the agent may only edit content/" guarantees nothing by itself. A
content file can contain code, and code can do anything.
Harbour handles that at the source. A remark plugin reads every content file during the build and rejects anything executable: imports, function calls, event handlers, raw HTML, unsafe URLs. It works as an allowlist, so syntax nobody thought of fails the build instead of slipping through. The lockdown post walks the rules one at a time.
So the deal is narrow. Your client writes the site in their own words, and the worst edit they can make is bad copy. Bad copy shows up in a pull request, where somebody reads it.
Where to start
Composing pages from Blocks covers how a page is put together.
The blocks gallery shows every section in the registry, rendered live. When you are
ready to hand the site over, the runbooks in docs/platforms/ cover connecting each agent.