prosebook

Every word in your app, written well.

prosebook keeps the copy in one typed catalog and holds every string to your writing rules, with a lint, a judge, and a CLI an agent can drive.

npx prosebook lint
Read the docs

Run the command in any codebase. Nothing is installed or set up, and no file is written.

Try a message

Edit the text. The lint runs as you type, with the rules of a strict project.

The catalog

sync.about:
kind: description
surface: hint
context: Under the sync setting, a line about what sync does.
en:

The app

t('sync.about')

Unlock seamless, powerful sync across all your devices!

  • banned-word"unlock" claims an improvement without naming it
  • banned-word"seamless" promises a feeling rather than saying what happens
  • banned-word"powerful" is marketing: say what it does

Built for agents

Agents write most copy now. prosebook gives an agent a guide to read, a CLI to drive, and checks for the habits that give generated text away.

A guide to read first

Every project gets a writing guide, generated from the config, with where an entry goes and the guidelines no rule can check.

A CLI to drive

Finding, linting, extracting and renaming all run from a shell, and every problem states the fix.

Slop, named

Built-in guidelines name the habits of generated copy, such as instructions on a button or a sentence that leans on what only the writer saw.

A judge for meaning

A decision model holds each entry to the guidelines no rule can check. Only changed entries are asked again, and a language model can suggest the rewrite.

A tone to start from

A preset gives the copy a tone. The tone goes into the writing guide, the translation prompt and the judge's notes, with the lint rules that fit.

prosebook.config.ts

extends: 'friendly'

Warm and direct, for apps people choose to use.

WRITING.md

  • state on errorWe couldn't save your list. Check your connection, then try again.Oops! Something went wrong.
  • state on emptyYou haven't saved any recipes yet. Tap the heart on a recipe to add the recipe here.No saved recipes.
  • state on toastRecipe savedYay! Your recipe has been saved!

One typed catalog

The words live in YAML, each with the context a translator needs, and the code holds only keys.

Typed keys

A misspelled key or a missing argument is a type error, and completing a key shows the text behind the key.

Translations that keep up

Change a source text, and each translation made from the old words is marked stale.

Edits on the page

In dev, hold Alt to see the key behind each string. Alt-click a string to rewrite the entry in place.

This page runs the inspector too. Hold Alt over any text.

Also included

Extract

Hardcoded JSX text moves into the catalog, a sentence at a time.

Docs

The README and the guides are held to the same rules and guidelines.

Native targets

One catalog generates Rust, Swift and Kotlin, and the string resources of Android and Apple.

4.8 KBthe runtime, gzipped

Small builds

No parser ships, and a build keeps only the messages the code reads.

Pull request diffs

The copy a pull request changes is posted as a comment, word by word.

Pseudo-locale

Accented, padded text shows the strings the catalog missed.

Setup

Three commands add prosebook to a project, write a first entry, and generate the typed modules.

npm install prosebook
npx prosebook init
npx prosebook generate
Frameworks
React · React Native · Preact · Vue · Svelte · Solid
Bundlers
Vite · Next.js · webpack · Rspack · Metro · Bun · Astro
Native
Rust · Swift · Kotlin · Android · Apple