The capability catalog

Everything here is optional, and what a capability actually is is worth reading first. A Pithy Worker starts with nothing composed and serves GET /health; each capability you add contributes routes, middleware, tables, bindings and English to that one Worker, and the ones you do not add are not there — no dead routes, no unused tables, no bill.

pithy add --list prints this same catalog from the CLI, marking what your project already has.

Identity and access

CapabilityWhat it gives you
authPasswordless identity — magic link, email one-time code, Google, Apple. Sessions, short-lived JWT access tokens, and a device registry. There is no password, ever
secretsEncrypted secret storage with a worker-only master key and automatic at-rest key rotation. Almost everything else composes it
turnstileA humanity check you stack on any route, with test keys wired automatically in dev and staging
auditA queryable trail of security-relevant actions — who did what, when, and whether it succeeded — attributed to the right actor
control planeThe inbound administration seam. Present and denying by default: with no connection registered, every admin route answers 403

Money

CapabilityWhat it gives you
paymentsFive rails — Apple, Google Play, Stripe, Lemon Squeezy and Paddle — resolving to one cross-rail entitlement. Buy Pro on iOS, be entitled on the web, with no hosted service holding your purchase history
ledgerA per-user balance for chips, gold, gems or credits. Atomic, idempotent, and overdraft-safe by a database constraint. Holds reserve a stake the moment a bet is placed
CapabilityWhat it gives you
storageYour users’ files in your own R2, with an owner, a quota and revocable share links. Uploaded bytes are treated as untrusted on the way out, so a user’s file cannot execute on your origin
mediaImages, video, audio and documents, with direct-upload URLs and opt-in AI alt text, transcription and text extraction
vectorSemantic search over your own Vectorize index, with filterable metadata treated as a schema decision rather than a query-time hope

Communication

CapabilityWhat it gives you
emailTransactional and lifecycle mail as durable, tracked jobs. Auth needs it for magic-link and one-time-code delivery
supportAn inbound support inbox in your own D1, classified on your own Workers AI binding, linked to the account your app already knows about
testersThe Google Play closed-test roster and its fourteen-day clock, run from your own event log

Games

CapabilityWhat it gives you
multiplayerAuthoritative turn-based sessions. The server holds the state no client can be trusted with, resolves it, and writes a durable result
matchmakingFour ways players find each other — a room code, an invite, a friend graph, an open skill-bucketed queue — and every one ends at a session id
ratingTwo numbers per player, per pool: a skill rating that moves both ways, and an experience total that only rises
leaderboardBoards and windows — daily, weekly, monthly, all-time — with closed windows staying in your own D1 for as long as you ask

Language

CapabilityWhat it gives you
i18nA translator seam every screen, error and email renders through, with each reader’s locale negotiated per request

Not shipped

CapabilityStatus
lakehousePlanned. Nothing ships yet, and the page says only that

How they fit together

Some capabilities require others, and the requirement is enforced at boot — which is what pithy add resolves before it wires anything. A manifest’s peer capabilities are not advice: createBackend refuses to assemble a capability whose peers are missing, naming the one that is absent, so a Worker missing one does not start at all.

CapabilityRequires
authsecrets, email
emailsecrets
payments, support, storage, media, turnstilesecrets

pithy add auth --with-prerequisites composes the whole graph, deepest first. Without the flag, a terminal asks once and anything headless is refused with the exact commands in order.

Others compose optionally, and get better together. Turnstile auto-gates auth’s magic-link and one-time-code send routes with zero configuration when it is present. Audit records auth/* events when composed. Matchmaking buckets its queue by skill when rating is there, and by region alone when it is not. Ledger settles multiplayer’s wagers. None of those is a hard dependency: each capability has a defined behavior when the other is absent, and it is documented on the page rather than left to be discovered.

Almost everything needs auth. Storage objects belong to an owner, ledger balances belong to a player, ratings bind to a player, and payments has no public routes at all. Adding auth first is nearly always right.

Every cluster reads the same way

Four pages, in the same order, so once you have read one you know how to read the rest.

PageAnswers
OverviewWhat it does, what it deliberately does not, and when you would reach for it
Add itWhat pithy add <name> writes, wires and runs
Provision itThe separate step that touches your Cloudflare account, where there is one
Use itThe routes, the client side, and the code you write
ReferenceConfig options, routes, error codes and tables — the page you come back to

Every package name is in the package index. Capabilities with more model to explain carry deep-dives beneath those. A page that reads as a task — sell a subscription on the web, let users upload files — lives under Build instead, because a capability page explains a part and a guide explains a job.

ESC