<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:base=""><id>https://pithy.sh/</id><title>Pithy</title><subtitle>A backend kit. For Cloudflare. That&#x27;s it.</subtitle><updated>2026-09-24T20:45:00Z</updated><link rel="self" href="https://pithy.sh/atom.xml"/><link href="https://pithy.sh"/><logo>https://pithy.sh/static/images/logo-2026-09-18T21-31-35-487Z.png</logo><entry><id>https://pithy.sh/blog/a-seam-never-a-sibling/</id><title>A seam, never a sibling</title><published>2026-06-09T12:00:00Z</published><updated>2026-09-21T23:06:21Z</updated><link rel="alternate" href="https://pithy.sh/blog/a-seam-never-a-sibling/"/><content type="text">One rule about what a capability may import, and what it buys — including why a management client gets its own request variable rather than borrowing the user&#x27;s.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/four-things-you-never-have-to-solve-on-d1/</id><title>Four things you never have to solve on D1</title><published>2026-06-09T12:00:00Z</published><updated>2026-09-21T23:06:22Z</updated><link rel="alternate" href="https://pithy.sh/blog/four-things-you-never-have-to-solve-on-d1/"/><content type="text">Parameter budgets, transient faults, SQLite&#x27;s missing types and pagination that holds still under writes. Solved once in core, so every capability inherits them.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/toolchain-and-customized-lint-rules/</id><title>The toolchain, and customized lint rules</title><published>2026-06-09T12:00:00Z</published><updated>2026-09-21T23:06:24Z</updated><link rel="alternate" href="https://pithy.sh/blog/toolchain-and-customized-lint-rules/"/><content type="text">TypeScript 7, Bun, Turborepo, tsdown, Vitest and Biome — including what the losing options still do better. Then the part that surprised us: GritQL plugins enforcing rules a type system cannot.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/fifty-seven-round-trips-or-one/</id><title>Fifty-seven round trips, or one</title><published>2026-06-10T12:00:00Z</published><updated>2026-09-21T23:06:26Z</updated><link rel="alternate" href="https://pithy.sh/blog/fifty-seven-round-trips-or-one/"/><content type="text">Migrations composed per capability and ordered once — and a driver change that took 78% of a test suite&#x27;s wall time back.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/typed-kv-and-metadata-that-repairs-itself/</id><title>Typed KV, and metadata that repairs itself</title><published>2026-06-10T12:00:00Z</published><updated>2026-09-21T23:06:27Z</updated><link rel="alternate" href="https://pithy.sh/blog/typed-kv-and-metadata-that-repairs-itself/"/><content type="text">Keys built from a schema, values validated both ways, and a list that quietly repairs the metadata the Cloudflare dashboard throws away.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/an-error-that-knows-who-is-reading-it/</id><title>The error that knows who is reading it</title><published>2026-06-11T12:00:00Z</published><updated>2026-09-21T23:06:28Z</updated><link rel="alternate" href="https://pithy.sh/blog/an-error-that-knows-who-is-reading-it/"/><content type="text">One error type, one schema, and a wire shape with nowhere to put the things a caller must never see.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/cli-is-a-product-surface/</id><title>The CLI is a product surface</title><published>2026-06-12T12:00:00Z</published><updated>2026-09-21T23:06:30Z</updated><link rel="alternate" href="https://pithy.sh/blog/cli-is-a-product-surface/"/><content type="text">Citty, picocolors and clack — chosen for cold start, size and how they fail — plus why every command owes &#x60;--json&#x60; to an agent driving it.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/what-one-command-writes-and-what-it-refuses-to-guess/</id><title>What one command writes, and what it refuses to guess</title><published>2026-06-12T12:00:00Z</published><updated>2026-09-21T23:06:31Z</updated><link rel="alternate" href="https://pithy.sh/blog/what-one-command-writes-and-what-it-refuses-to-guess/"/><content type="text">&#x60;pithy add&#x60; installs a package, writes bindings across every environment, runs migrations — and refuses, loudly, in the two places where guessing would be worse than stopping.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/creating-it-once-is-the-easy-half/</id><title>Creating it once is the easy half</title><published>2026-06-14T12:00:00Z</published><updated>2026-09-21T23:06:33Z</updated><link rel="alternate" href="https://pithy.sh/blog/creating-it-once-is-the-easy-half/"/><content type="text">Fifteen Cloudflare resource kinds, provisioned per environment — and the reaper, because eight orphaned secrets sat on a real account with nothing able to reclaim them.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/rolling-a-secret-and-the-failure-you-cannot-undo/</id><title>Rolling a secret, and the failure you cannot undo</title><published>2026-06-16T12:00:00Z</published><updated>2026-09-21T23:06:35Z</updated><link rel="alternate" href="https://pithy.sh/blog/rolling-a-secret-and-the-failure-you-cannot-undo/"/><content type="text">Encrypted secrets with a master key that never leaves your Worker — and a rotation ordered around the one outcome no retry can repair.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/a-capability-with-no-tables-no-routes-no-bindings/</id><title>A capability with no tables, no routes, no bindings</title><published>2026-06-19T12:00:00Z</published><updated>2026-09-21T23:06:37Z</updated><link rel="alternate" href="https://pithy.sh/blog/a-capability-with-no-tables-no-routes-no-bindings/"/><content type="text">Turnstile is the smallest thing in the kit: no state, no migrations, no middleware you did not ask for. What it demonstrates is how capabilities cooperate without importing each other.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/mail-that-survives-a-worker-restart/</id><title>Mail that survives a Worker restart</title><published>2026-06-19T12:00:00Z</published><updated>2026-09-21T23:06:38Z</updated><link rel="alternate" href="https://pithy.sh/blog/mail-that-survives-a-worker-restart/"/><content type="text">Transactional and lifecycle email as durable, tracked jobs — with a suppression list you never wire up and can still read like any other table.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/who-did-that-and-did-it-work/</id><title>Who did that, and did it work</title><published>2026-06-19T12:00:00Z</published><updated>2026-09-21T23:06:39Z</updated><link rel="alternate" href="https://pithy.sh/blog/who-did-that-and-did-it-work/"/><content type="text">A queryable audit trail in your own D1, written by capabilities that never import it — and by the CLI, attributed to the actual person holding the token.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/token-first-auth-and-what-happens-when-one-is-stolen/</id><title>Token-first auth, and what happens when one is stolen</title><published>2026-06-20T12:00:00Z</published><updated>2026-09-21T23:06:41Z</updated><link rel="alternate" href="https://pithy.sh/blog/token-first-auth-and-what-happens-when-one-is-stolen/"/><content type="text">Sign-in that treats a phone and a browser as the same problem, refresh rotation that survives a race, and a replayed token that takes its whole family down with it.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/logs-you-can-query-not-lines-you-can-read/</id><title>Logs you can query, not lines you can read</title><published>2026-07-15T12:00:00Z</published><updated>2026-09-21T23:06:43Z</updated><link rel="alternate" href="https://pithy.sh/blog/logs-you-can-query-not-lines-you-can-read/"/><content type="text">One logger seam, two adapters, and every record carrying the build that produced it — so the first question you ask at 2am has an answer in the dashboard.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/uploads-that-never-touch-your-worker/</id><title>Uploads that never touch your Worker</title><published>2026-07-16T12:00:00Z</published><updated>2026-09-21T23:06:45Z</updated><link rel="alternate" href="https://pithy.sh/blog/uploads-that-never-touch-your-worker/"/><content type="text">Direct-upload URLs, one media record whatever the backend, and AI enrichment that runs as a Workflow because captioning is slow and fails.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/your-leaderboard-history-is-yours-to-keep/</id><title>Your leaderboard history is yours to keep</title><published>2026-07-17T12:00:00Z</published><updated>2026-09-21T23:06:46Z</updated><link rel="alternate" href="https://pithy.sh/blog/your-leaderboard-history-is-yours-to-keep/"/><content type="text">Boards whose window is a CRON expression, closed windows that stay in your own D1 in plain SQL, and routes that deny by default when auth is absent.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/server-holds-what-no-client-can-be-trusted-with/</id><title>The server holds what no client can be trusted with</title><published>2026-07-23T12:00:00Z</published><updated>2026-09-21T23:06:52Z</updated><link rel="alternate" href="https://pithy.sh/blog/server-holds-what-no-client-can-be-trusted-with/"/><content type="text">Authoritative turn-based sessions on a Durable Object, three example games on a reusable pattern, and a wagering stack with provably-fair dice.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/a-connected-cast-not-scattered-rows/</id><title>A connected cast, not scattered rows</title><published>2026-07-24T12:00:00Z</published><updated>2026-09-21T23:06:54Z</updated><link rel="alternate" href="https://pithy.sh/blog/a-connected-cast-not-scattered-rows/"/><content type="text">Seed data where the same three people own connected records in every table — and three independent layers standing between a fixture and your production database.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/four-ways-to-find-an-opponent/</id><title>Four ways to find an opponent</title><published>2026-07-27T12:00:00Z</published><updated>2026-09-21T23:06:56Z</updated><link rel="alternate" href="https://pithy.sh/blog/four-ways-to-find-an-opponent/"/><content type="text">Room codes, invites, a friend graph and a skill-bucketed queue — all ending at one session id, on two Durable Objects the CLI wires for you.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/two-numbers-because-one-cannot-do-both-jobs/</id><title>Two numbers, because one cannot do both jobs</title><published>2026-07-27T12:00:00Z</published><updated>2026-09-21T23:06:57Z</updated><link rel="alternate" href="https://pithy.sh/blog/two-numbers-because-one-cannot-do-both-jobs/"/><content type="text">A skill rating that moves both ways and an experience total that only rises — plus three algorithms, and a deploy that fails if you wire a 1v1 rating to a four-player game.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/a-balance-that-cannot-go-negative/</id><title>A balance that cannot go negative</title><published>2026-07-29T12:00:00Z</published><updated>2026-09-21T23:06:59Z</updated><link rel="alternate" href="https://pithy.sh/blog/a-balance-that-cannot-go-negative/"/><content type="text">Atomic, idempotent movements with overdraft prevented by a database constraint — and holds, which are what make wagering safe.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/a-users-file-cannot-execute-on-your-origin/</id><title>A user&#x27;s file cannot execute on your origin</title><published>2026-07-29T12:00:00Z</published><updated>2026-09-21T23:07:00Z</updated><link rel="alternate" href="https://pithy.sh/blog/a-users-file-cannot-execute-on-your-origin/"/><content type="text">Files in your own R2 behind one seam — with server-derived keys, uploaded bytes treated as hostile on the way out, and a daily Workflow that reconciles both directions of orphan.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/filters-that-silently-return-less/</id><title>The filter that silently returns less</title><published>2026-07-29T12:00:00Z</published><updated>2026-09-21T23:07:01Z</updated><link rel="alternate" href="https://pithy.sh/blog/filters-that-silently-return-less/"/><content type="text">Vectorize returns partial results without telling you when a metadata index came after the vectors. Making filterable fields a schema decision is how you stop finding that out in production.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/front-end-knows-what-the-backend-composed/</id><title>The front end knows what the backend composed</title><published>2026-07-29T12:00:00Z</published><updated>2026-09-21T23:07:02Z</updated><link rel="alternate" href="https://pithy.sh/blog/front-end-knows-what-the-backend-composed/"/><content type="text">One virtual module per capability, projected from the Worker&#x27;s own config at build time — and a capability you did not compose resolving to &#x60;{ enabled: false }&#x60; instead of failing the import.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/nothing-reads-unvalidated-input/</id><title>Nothing reads unvalidated input</title><published>2026-07-29T12:00:00Z</published><updated>2026-09-21T23:07:03Z</updated><link rel="alternate" href="https://pithy.sh/blog/nothing-reads-unvalidated-input/"/><content type="text">Every route declares what it accepts and who may call it, on the route line. Two gates make that structural rather than a habit — and the second one had to resort to a probe.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/screens-that-arrive-already-wired/</id><title>Screens that arrive already wired</title><published>2026-07-29T12:00:00Z</published><updated>2026-09-21T23:07:04Z</updated><link rel="alternate" href="https://pithy.sh/blog/screens-that-arrive-already-wired/"/><content type="text">Sign-in, OTP, paywall, pricing, subscription — scaffolded into your repo as source you own, and only the ones your Worker actually composes.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/six-copies-of-a-one-liner/</id><title>Six copies of a one-liner, and the field none of them could see</title><published>2026-07-29T12:00:00Z</published><updated>2026-09-21T23:07:05Z</updated><link rel="alternate" href="https://pithy.sh/blog/six-copies-of-a-one-liner/"/><content type="text">Durable jobs on Cloudflare Workflows, and a duplicated line that reported adding five bindings it had silently declined to write.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/buy-on-ios-be-entitled-on-the-web/</id><title>Buy on iOS, be entitled on the web</title><published>2026-07-30T12:00:00Z</published><updated>2026-09-21T23:07:07Z</updated><link rel="alternate" href="https://pithy.sh/blog/buy-on-ios-be-entitled-on-the-web/"/><content type="text">Four payment rails converging on one entitlement in your own D1 — through an idempotent projection that makes a dropped call free and a replayed webhook harmless.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/present-and-denying-by-default/</id><title>Present and denying by default</title><published>2026-07-30T12:00:00Z</published><updated>2026-09-21T23:07:08Z</updated><link rel="alternate" href="https://pithy.sh/blog/present-and-denying-by-default/"/><content type="text">A management client reaching into your Worker with no data plane between — asymmetric keys you can revoke, 60-second scoped tokens bound to their own body, and rotation that cannot lock you out.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/when-a-missing-provider-must-deny/</id><title>When a missing provider must deny</title><published>2026-07-30T12:00:00Z</published><updated>2026-09-21T23:07:09Z</updated><link rel="alternate" href="https://pithy.sh/blog/when-a-missing-provider-must-deny/"/><content type="text">Two seams in core, built the same way and defaulting opposite ways — because one of them is a gate and the other is a record.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/support-is-the-employee-you-cannot-hire/</id><title>Support is the employee you cannot hire</title><published>2026-07-31T12:00:00Z</published><updated>2026-09-21T23:07:11Z</updated><link rel="alternate" href="https://pithy.sh/blog/support-is-the-employee-you-cannot-hire/"/><content type="text">An inbound inbox in your own D1, classified on your own Workers AI binding, with every sender linked to the account and purchases you already know about.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/twelve-testers-fourteen-days-and-no-screen-that-tells-you/</id><title>Twelve testers, fourteen days, and no screen that tells you</title><published>2026-07-31T12:00:00Z</published><updated>2026-09-21T23:07:11Z</updated><link rel="alternate" href="https://pithy.sh/blog/twelve-testers-fourteen-days-and-no-screen-that-tells-you/"/><content type="text">Google Play&#x27;s closed-test requirement, run from your own event log — with every count honestly labeled an estimate, because no API exposes the real one.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/worker-says-unknown/</id><title>The worker says: unknown</title><published>2026-08-03T12:00:00Z</published><updated>2026-09-21T23:07:13Z</updated><link rel="alternate" href="https://pithy.sh/blog/worker-says-unknown/"/><content type="text">A string written out in four places, a name truncated against a limit that does not exist, and what both have in common.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/ada-and-ada-are-the-same-person/</id><title>Ada@ and ada@ are the same person</title><published>2026-08-11T12:00:00Z</published><updated>2026-09-21T23:07:15Z</updated><link rel="alternate" href="https://pithy.sh/blog/ada-and-ada-are-the-same-person/"/><content type="text">Two primitives that look too small to be worth writing about — and the bugs they cause, which never look like they are about email addresses or version numbers.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/zero-of-twenty-five-conversations/</id><title>Zero of twenty-five conversations</title><published>2026-08-13T12:00:00Z</published><updated>2026-09-21T23:07:16Z</updated><link rel="alternate" href="https://pithy.sh/blog/zero-of-twenty-five-conversations/"/><content type="text">One schema, two consumers, and why a strict enum is correct for the Worker that wrote it and wrong for the client that reads it.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/blog/schemas-are-the-documentation/</id><title>The schemas are the documentation</title><published>2026-08-15T12:00:00Z</published><updated>2026-09-21T23:07:18Z</updated><link rel="alternate" href="https://pithy.sh/blog/schemas-are-the-documentation/"/><content type="text">One rule about Zod, enforced nineteen times by nineteen copies of the same walk. They drifted, and the worst of them passed by not looking.</content><author><name>Jim Scott</name><email>jim@pithy.sh</email></author></entry><entry><id>https://pithy.sh/modules/</id><title>Modules</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/"/><content type="text">Capabilities that compose into your own Cloudflare Worker. Add the ones you need; nothing you skip costs you anything.</content></entry><entry><id>https://pithy.sh/modules/audit/</id><title>Audit</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/audit/"/><content type="text">A queryable trail of every security-relevant action, attributed to the right actor.</content><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/auth/</id><title>Auth</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/auth/"/><content type="text">Passwordless sessions, mobile and web both first-class. Magic link, email OTP, Google, Apple.</content><category term="Games"/><category term="Solo Builders"/><category term="Mobile apps"/><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/controlplane/</id><title>Control plane</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/controlplane/"/><content type="text">Let a management client reach into your own Worker, with no data plane in between.</content><category term="Enterprise"/><category term="Solo Builders"/></entry><entry><id>https://pithy.sh/modules/email/</id><title>Email</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/email/"/><content type="text">Every send is a durable job: scheduled, retried, tracked. No mail ever sent inline.</content><category term="Solo Builders"/><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/lakehouse/</id><title>Lakehouse</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/lakehouse/"/><content type="text">An analytical tier for event and telemetry data — one schema object derives the ingest stream, the table and the query types.</content><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/leaderboard/</id><title>Leaderboard</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/leaderboard/"/><content type="text">Rank your players. Submit a score, read the standings — daily through all-time.</content><category term="Games"/></entry><entry><id>https://pithy.sh/modules/ledger/</id><title>Ledger</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/ledger/"/><content type="text">A per-user balance for your app&#x27;s economy — chips, gold, gems, credits. Correct by construction.</content><category term="Games"/><category term="Mobile apps"/><category term="Solo Builders"/></entry><entry><id>https://pithy.sh/modules/matchmaking/</id><title>Matchmaking</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/matchmaking/"/><content type="text">Room codes, invites, friends and matched queues. Every path lands players in one session.</content><category term="Games"/></entry><entry><id>https://pithy.sh/modules/media/</id><title>Media</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/media/"/><content type="text">Store, track and enrich images, video, audio and documents. Config picks the backend.</content><category term="Solo Builders"/><category term="Mobile apps"/></entry><entry><id>https://pithy.sh/modules/multiplayer/</id><title>Multiplayer</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/multiplayer/"/><content type="text">Authoritative sessions on Durable Objects. The server holds what no client can be trusted with.</content><category term="Games"/><category term="Mobile apps"/></entry><entry><id>https://pithy.sh/modules/payments/</id><title>Payments</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/payments/"/><content type="text">Five payment rails resolving to one cross-rail entitlement, in your own Worker and your own D1.</content><category term="Games"/><category term="Solo Builders"/><category term="Mobile apps"/></entry><entry><id>https://pithy.sh/modules/rating/</id><title>Rating</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/rating/"/><content type="text">Skill and experience per player, per pool. Elo, Glicko-2 and TrueSkill ship built in.</content><category term="Games"/></entry><entry><id>https://pithy.sh/modules/secrets/</id><title>Secrets</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/secrets/"/><content type="text">One encrypted store per environment, a worker-only master key, and automatic at-rest rotation.</content><category term="Solo Builders"/><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/storage/</id><title>Storage</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/storage/"/><content type="text">General file storage in your own R2 bucket, with an owner, a quota, and a link you can take back.</content><category term="Solo Builders"/><category term="Mobile apps"/><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/support/</id><title>Support</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/support/"/><content type="text">An inbox that lands mail in your own D1, classifies it on your own AI, and knows who sent it.</content><category term="Solo Builders"/><category term="Mobile apps"/><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/testers/</id><title>Testers</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/testers/"/><content type="text">The roster, the invitations and the fourteen-day clock Google Play makes you run.</content><category term="Games"/><category term="Mobile apps"/><category term="Solo Builders"/></entry><entry><id>https://pithy.sh/modules/turnstile/</id><title>Turnstile</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/turnstile/"/><content type="text">A humanity check that stacks on any route. It answers is this a human, never who is this.</content><category term="Solo Builders"/><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/vector/</id><title>Vector</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/vector/"/><content type="text">Semantic search over your own content. Workers AI embeds, Vectorize indexes, D1 keeps the text.</content><category term="Solo Builders"/><category term="Enterprise"/></entry><entry><id>https://pithy.sh/modules/i18n/</id><title>i18n</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/modules/i18n/"/><content type="text">Language for your app — negotiated per request, rendered through one seam. No tables, no bindings, no error codes of its own.</content><category term="Games"/><category term="Solo Builders"/><category term="Mobile apps"/><category term="Enterprise"/></entry><entry><id>https://pithy.sh/for/</id><title>Solutions</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/for/"/><content type="text">The same kit, recomposed for what you are building.</content></entry><entry><id>https://pithy.sh/for/enterprise/</id><title>Enterprise</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-20T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/for/enterprise/"/><content type="text">An audit trail, encrypted secrets with automatic rotation, a humanity check, and a management plane that never holds your data.</content></entry><entry><id>https://pithy.sh/for/games/</id><title>Games</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-20T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/for/games/"/><content type="text">Authoritative sessions, matchmaking, skill rating, leaderboards and an economy — on Durable Objects and your own D1.</content></entry><entry><id>https://pithy.sh/for/mobile/</id><title>Mobile apps</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-20T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/for/mobile/"/><content type="text">Sign in with Apple and Google, StoreKit and Play Billing resolving to the same entitlement as the web, token-first sessions, and the Play closed-test clock nobody warns you about.</content></entry><entry><id>https://pithy.sh/for/solo/</id><title>Solo builders</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-20T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/for/solo/"/><content type="text">Payments on five rails, a support inbox, transactional mail and a scaffolded front end — the work a single person cannot hire out.</content></entry><entry><id>https://pithy.sh/compare/</id><title>Alternatives</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/"/><content type="text">Already on something else? These pages lay out where Pithy is the better call — and where the tool you already have is the one to keep.</content></entry><entry><id>https://pithy.sh/compare/supabase/</id><title>Supabase vs Pithy</title><published>2026-08-18T12:00:00Z</published><updated>2026-08-18T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/supabase/"/><content type="text">Supabase is a managed Postgres platform. Pithy is a composable kit that runs entirely inside your own Cloudflare account. Here is the honest side-by-side.</content></entry><entry><id>https://pithy.sh/compare/algolia/</id><title>Algolia vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/algolia/"/><content type="text">Algolia is a hosted search product with latency nobody else matches. Pithy has semantic search as one capability. Compared on search alone.</content></entry><entry><id>https://pithy.sh/compare/appwrite/</id><title>Appwrite vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/appwrite/"/><content type="text">Appwrite is an open-source backend you can self-host or buy managed. Pithy is a kit that composes onto Cloudflare&#x27;s primitives inside your own account. Both answer ownership; they answer it differently.</content></entry><entry><id>https://pithy.sh/compare/auth0/</id><title>Auth0 vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/auth0/"/><content type="text">Auth0 is the enterprise identity platform. Pithy has auth as one capability among many. Compared on auth alone — and on whether the compliance surface you are buying is one you actually need.</content></entry><entry><id>https://pithy.sh/compare/aws-amplify/</id><title>AWS Amplify vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/aws-amplify/"/><content type="text">Amplify is a TypeScript-first framework that provisions AWS services for you — Cognito, AppSync, DynamoDB, S3, Lambda. Pithy is a kit that provisions Cloudflare primitives. Same idea, different cloud, different amount of it.</content></entry><entry><id>https://pithy.sh/compare/clerk/</id><title>Clerk vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/clerk/"/><content type="text">Clerk is a hosted identity product with the best drop-in components in the category. Pithy has auth as one capability among many. Compared on auth alone — and on whether you need a second vendor for it.</content></entry><entry><id>https://pithy.sh/compare/cloudinary/</id><title>Cloudinary vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/cloudinary/"/><content type="text">Cloudinary is a media pipeline with transformations nobody else matches. Pithy has media and storage as capabilities. Compared on media alone.</content></entry><entry><id>https://pithy.sh/compare/colyseus/</id><title>Colyseus vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/colyseus/"/><content type="text">Colyseus is an open-source Node framework for authoritative game servers, with rooms, state synchronization and matchmaking. Pithy has turn-based sessions as one capability. Compared on multiplayer alone.</content></entry><entry><id>https://pithy.sh/compare/convex/</id><title>Convex vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/convex/"/><content type="text">Convex is a reactive backend where TypeScript functions run against a document store that pushes changes to clients. Pithy is a kit that composes onto Cloudflare&#x27;s own primitives. Here is the honest side-by-side.</content></entry><entry><id>https://pithy.sh/compare/firebase/</id><title>Firebase vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/firebase/"/><content type="text">Firebase is Google&#x27;s managed backend, and the fastest way to ship a mobile app there has ever been. Pithy is a kit that runs inside your own Cloudflare account. Here is the honest side-by-side.</content></entry><entry><id>https://pithy.sh/compare/lootlocker/</id><title>LootLocker vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/lootlocker/"/><content type="text">LootLocker is a hosted game backend for leaderboards, progression and player economy. Pithy has those as capabilities in a Worker you own. Compared on the game services alone.</content></entry><entry><id>https://pithy.sh/compare/nakama/</id><title>Nakama vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/nakama/"/><content type="text">Nakama is an open-source game server with accounts, storage, realtime multiplayer, matchmaking, leaderboards, tournaments, parties and chat. Pithy has the asynchronous half in a Worker you own.</content></entry><entry><id>https://pithy.sh/compare/nhost/</id><title>Nhost vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/nhost/"/><content type="text">Nhost is Postgres and Hasura with auth, storage and functions around them — GraphQL-first and self-hostable. Pithy composes onto Cloudflare&#x27;s primitives with SQL and HTTP. Both are open source.</content></entry><entry><id>https://pithy.sh/compare/photon/</id><title>Photon vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/photon/"/><content type="text">Photon is real-time networking for games — Fusion, Quantum and Realtime — priced on concurrent users. Pithy has turn-based multiplayer as one capability. Compared on multiplayer alone.</content></entry><entry><id>https://pithy.sh/compare/playfab/</id><title>PlayFab vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/playfab/"/><content type="text">PlayFab is Microsoft&#x27;s complete backend for live games — identity, economy, matchmaking, dedicated servers, LiveOps and analytics. Pithy has the game capabilities in a Worker you own. Compared honestly.</content></entry><entry><id>https://pithy.sh/compare/pocketbase/</id><title>PocketBase vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/pocketbase/"/><content type="text">PocketBase is one Go binary with SQLite, auth, files, realtime and an admin UI. Pithy is a kit that composes onto Cloudflare&#x27;s primitives. Both are SQLite; almost nothing else is the same.</content></entry><entry><id>https://pithy.sh/compare/revenuecat/</id><title>RevenueCat vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/revenuecat/"/><content type="text">RevenueCat is the best hosted answer to cross-platform purchases. Pithy has payments as one capability. Compared on subscriptions alone — and on where your customers&#x27; purchase history lives.</content></entry><entry><id>https://pithy.sh/compare/rolling-your-own/</id><title>Rolling your own vs Pithy</title><published>2026-08-25T12:00:00Z</published><updated>2026-08-25T12:00:00Z</updated><link rel="alternate" href="https://pithy.sh/compare/rolling-your-own/"/><content type="text">The most common alternative, and sometimes the right one. What you actually take on when you write the backend yourself, and where a kit earns its place.</content></entry></feed><!-- Atom Feed generated by https://leed.ai -->