Mark the copy in your JSX
import { Copy } from 'copy-ink'
export default function Page() {
return (
<main>
<h1><Copy field="heroTitle" /></h1>
<p><Copy field="hero.subtitle" /></p>
</main>
)
}
It reads YAML from your repo
# Edited in the browser, committed to git.
heroTitle: "Hello!"
hero:
# The comment you wrote survives your client's first save.
subtitle: "We make things."
Zero editor JS in production
<Copy> emits the string and nothing else — no wrapper element, no class, no style. The editor bundle only loads after a client has signed in.
Git is the database
Content is YAML in your repo: diffable, reviewable, revertable. A save is one commit that triggers your normal deployment.
Comments survive
Edits round-trip through the YAML Document API, so the explanatory comments you wrote in a content file are still there after your client's first save.
Typed fields
copy-ink types scans your JSX and generates autocompleted field strings, scopes, collections and locales.
No repo access for the client
They sign in with GitHub OAuth; commits come from a GitHub App installation scoped to contents: write on one repository.
Edits on the real page
Your client clicks the text they want to change, edits it in a popover, and hits Publish. There is no parallel admin site to keep in sync.