Skip to main content
For the Next.js App Router

Your client edits the live site. You get a git commit.

copy-ink is a git-backed inline CMS for the sites you build and hand over. No database, no CMS server, no parallel admin site — and production renders plain text with zero editor JS.

npm install copy-ink

Mark the copy in your JSX

app/page.tsx
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

content/_index.yml
# 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.