Open source · Apache-2.0

Change the SEO fieldssite copyemailsSEO fieldscontentacross your sitesin seconds.

stet is the copy layer for everything you ship: every sentence your products say — typed, versioned, and editable without a rebuild.

$ npx @getstet/stet initRead the docsRead the docs
Self-hosted is free, forever Plain Postgres — or no database at all Reviewers never need a seat
$ npx @getstet/stet initdetected next.js · postgres · en✓ wrote content/descriptor.json, content/defaults.json, app/api/stet/route.ts✓ 12 keys registered · first key renders now$ stet draft hero_headline --value "Copy changes go live in seconds."✓ draft v7 saved · nobody's live copy changed$ stet seo checkseo: 5 pages checked, 0 errors, 0 warnings✓ exit 0 · no network, no database — runs on a fork PR$ stet publish hero_headline✓ live v8 · one transaction · every version kept$
// committed to your repo — the site renders this when stet is switched off{"default": {"hero_headline": "Copy changes go live in seconds.","hero_body": "Every sentence your product says, typed and versioned.","pricing_tier_name": "Premium","seo_home_desc": "One copy layer for all your sites and apps.","welcome__subject": "You're on the list"}}
the editorScreenshot placeholder — the real capture lands when the editor design is official.

Works with your stack

Next.jsReactAstroSvelteVueNuxtRemixWordPressContentfulRailsDjangoPHPPythonNext.jsReactAstroSvelteVueNuxtRemixWordPressContentfulRailsDjangoPHPPython
Capabilities

One registry for everything your products say

Site copy, email slots, bot messages and SEO fields are the same kind of thing: a key with a shape, a limit and a home. One registry holds them all.

Site copy

Typed keys, limits, variables, snapshot fallback.

t("hero_headline")

Email slots

Editors own the words; your template owns the markup. Transactional mail stays host-fired.

slots("trial_ending")

Broadcasts

Audiences, a pre-flight gate, send records, a public archive.

audience: trial-ended (1,204)

Contacts

Consent and suppression in your own Postgres; webhook and delta sync.

contact.created → webhook

SEO

Titles, descriptions, canonicals, OG and JSON-LD, checked offline from the registry.

stet seo check

Agents

CLI and MCP. Agents draft; review decides. Scoped tokens, recorded authors.

stet mcp serve
Surfaces

Everything your products say

Platform overview

Site copy

Typed keys, limits, and a committed fallback.

Email slots

Editors own the words; your template owns the markup.

SEO

Titles, descriptions and JSON-LD, checked offline.

Agents

They draft through the CLI or MCP; review decides.

Custody

Every string stays in your repo. Leaving is a git clone.

In practice

Four things this replaces

Each one is a workflow a team already has; stet removes the deploy, the ticket or the spreadsheet behind it.

Effortlessly change the copy without any developer, and see it live the moment you publish. No deploy, no waiting, and one click puts the old wording back whenever you want it.

Already have a site full of words? stet finds every one of them and brings them in for you, so all you do is confirm what counts as copy — and your site carries on looking and working exactly as it did.

Let your AI agent write the first version, and everything it suggests waits quietly for approval with its name against it, so nothing reaches your visitors until a person has said yes.

The small SEO mistakes that quietly cost you traffic — a missing description, a duplicate title, a headline that runs too long — get caught in seconds on every change, long before anyone else sees them.

A person at a laptop, reading the screen mid-edit.
$ stet scanreading app/ · components/ · emails/app/page.tsx:14 "Never miss a post again."→ hero_headlineapp/page.tsx:19 "Mirror an X account into Telegram."→ hero_bodycomponents/Nav.tsx:8 "Pricing"→ nav_pricing34 literals · 29 look like copy · 5 skipped (aria, test ids)$ stet register --write✓ 29 keys written · leaves rewritten · callers untouched✓ content/defaults.json committed alongside
Three colleagues at a monitor, one pointing at a detail on screen.
$ stet seo checkreading content/descriptor.json + content/defaults.jsonerror pricing no SEO description — name the key that carries iterror home, /free share the title "stet — the copy layer"error /free canonical points at /pricing, which is noindexwarn footer_links[2] "Learn more" is a generic link labelseo: 5 pages checked, 3 errors, 1 warningexit 1 · warns never move the exit code
Process

From install to review-gated publishing

Four steps, and the last one is the point: publishing is a transaction, not a deployment.

Init

Detects the framework and the store; the first key renders in two minutes.

Adopt

stet scan finds the copy you already wrote; register covers the rest.

Edit

Developer mode or simple mode; reviewers arrive through a signed link.

Publish

One transaction, no deploy, one-click revert. Agents draft; review decides.

The shape of it

What you can count on

These hold from your first install, and they don't change as stet grows.

0
deploys per copy change
2min
install to first editable copy
$0
self-hosted, complete, Apache-2.0
$0
reviewers never need a seat
Editions

Open source from day one

Everything that makes stet work ships free. Cloud adds the managed service teams and professionals need — hosting, collaboration, review and custody.

Self-hosted

For developers running their own infrastructure. The whole mechanism — not a demo.

$0

Forever · Apache-2.0 · single-userForever · Apache-2.0 · single-user

Install

Includes:

  • Package, CLI, MCP server, dashboards
  • Environments & promotion · packs
  • SEO layer with offline checks
  • Your Postgres — or no database at all
Solo

For one person shipping one product.

$19/mo$190/yr

1 project · paid monthly1 project · works out to $15.83/mo

Join the waitlist

Everything in Self-hosted, and:

  • Hosted store & sign-in
  • Publish scheduling
  • 5 GB media · 1k hosted contacts
  • Docs + community support
Team Recommended

For teams where more than one person touches the words.

$39/mo$390/yr

3 projects · extra projects $10/mo3 projects · extra $10/mo · works out to $32.50/mo

Join the waitlist

Everything in Solo, and:

  • Owner · developer · editor roles
  • Review & approvals
  • Client review links — $0 per reviewer
  • 25 GB media · 10k hosted contacts
Business

For companies that need retention, audit and priority answers.

$149/mo$1,490/yr

10 projects · extra projects $10/mo10 projects · extra $10/mo · works out to $124.17/mo

Join the waitlist

Everything in Team, and:

  • Audit retention, 24 months
  • 100 GB media · 50k hosted contacts
  • Priority support
  • SSO/SAML attaches here

Building for clients? Extra projects are $10/mo — the ninth site costs like the third.Full pricing

FAQ

The honest answers

Is the free edition complete?

Yes — it is the product, single-user, not a trial. Cloud sells review, identity, the clock and custody, never the mechanism.

What if my site is Vue or Svelte?

The standalone and Cloud dashboards work with any host through the preview-URL primitive. What you hand-wrap is the embedded-component layer; stet scan's shapes are JSX, so template copy is adopted by register.

What about copy that already lives in a CMS?

stet import takes any JSON or CSV export through one mapping file. Per-CMS recipes, no connectors.

Can I leave?

The repo always holds a complete, buildable copy of every string; contacts export as CSV or JSON and never enter git. The eject promise is a public page.