Client editing for Eleventy
Let clients edit your Eleventy site.
Eleventy is the quiet choice: templates, a data folder, a static build you understand end to end. The client asking to “change the words ourselves” is the one request that has always meant adding a system you did not want.
Tusk is a client editing layer for sites you already built. You keep the code, the repo and the hosting. Tusk marks the text, photos and downloads the client may change, and the client changes them on their own live page. Nothing of Tusk runs between a visitor and the site.
Where your Eleventy site needs to be
- No export. Tusk marks the elements in the Nunjucks, Liquid or Markdown templates the pages render from; the build pulls the published content before eleventy runs and writes it into _site after.
- Deploy on Cloudflare Pages, Netlify, Vercel or GitHub Pages. Each gives you a deploy hook, or rebuilds on commit.
Connecting it, step by step
- Add the Tusk MCP to your agent (Claude Code, Cursor, Codex, Windsurf), or mark by hand: one data-tusk attribute per element in the template, one data-tusk-list on a repeated block.
- Log in once, for this site: npx @tuskcms/mcp login --site <slug>.
- Say “Connect this site to Tusk CMS.” It marks the templates, adds prebuild pull and postbuild apply around eleventy, adds a passthrough copy for the pulled photos, sets up the deploy hook with you, publishes and verifies.
- Invite the client. Their Publish triggers your host’s rebuild.
The MCP config, for Claude Code, Cursor, Codex or Windsurf. Nothing to install: it runs from npm on demand.
{ "mcpServers": { "tusk": { "command": "npx", "args": ["-y", "@tuskcms/mcp"] } } }No MCP? Paste this one line into any AI tool that can read a URL and edit files:
Connect this site to Tusk CMS. Read https://tuskcms.com/llms-full.txt first and follow it exactly.
Start from a template
The Tusk starter is a GitHub template: a three-page business site in plain HTML, already marked up, with the build step and Vercel and Netlify config in place. Use the template, deploy it, say “Connect this site to Tusk CMS.”, and hand it to the client. Then reshape it into their site, or copy the marks and the build step into your Eleventy project.
Starting from a prompt instead? Ask your tool to build the site with the marks in from the start: the first-prompt version works in any builder.
What the client gets
- Their own login. They open an editor with a live preview of their real website beside the fields you marked, click a heading, a paragraph, a photo or a download, change it, and press Publish.
- Nothing of yours. No repo, no Eleventy, no code, no layout or styles. What you did not mark cannot be edited.
- History of the last 30 days, with any version restored as a draft, so a bad edit is never permanent.
- A Publish that reaches the live site through your own host, and a dashboard that tells you both whether it did.
What you keep
- The codebase, the hosting and the deploy. Tusk triggers a deploy hook you own, and that link, encrypted, is all it holds of your host.
- A static site that stays static: published content and images are written into your build by two zero-dependency scripts. The deployed site never calls Tusk.
- The retainer. The client pays you; you pay Tusk by site. Clients never pay for their login.
- The exit. Export gives you a site’s words, photos, fields and 30 days of versions as files; disconnect cuts every tie and the site keeps serving.
Questions Eleventy developers ask
Where do the pulled photos go?
tusk-pull.mjs writes them to public/tusk/. Add one passthrough copy so they reach the output: eleventyConfig.addPassthroughCopy({ "public/tusk": "tusk" }). The agent adds that line when it wires the build.
Global data files?
Mark the element in the template that prints the value, not the JSON. The file in _data stays as it is and holds the text the page falls back to; the build writes the client’s published words into the built page.
Does the output stay plain static files?
Yes. The build runs pull, eleventy, then apply over _site; the folder your host serves is ordinary HTML with the client’s words in it. Nothing fetches Tusk at runtime.
Also built with Astro, plain HTML, Claude Code? Tusk works the same way. All builders: Lovable, v0, Bolt, Replit, Claude Code, Codex, Cursor, Windsurf, Next.js, Astro, Framer, plain HTML, and any site with a build step or deploy hook.