Docs Design

Contents

Free and Pro

The owner, 2026-11-03: Gamewright sells two plans, Free and Pro; the AI is always the person's own (bring your own key, as Bookwright); the desktop Studio stays free to download on every plan. The market and the reasoning are in docs/research/pricing-2026-11.md.

What a plan charges for

Only what Gamewright itself runs and keeps for a signed-in person on the web Studio, each a thing the host already has and can count:

Feature (Admission) Kind Free Pro Held where
web_games: games kept in the browser Studio cap 3 50 POST /api/games (#roomOnPlan)
storage_mb: their space on Gamewright's computer cap 500 MB 5,000 MB POST /api/games; writes while over (#refuseWrite)
computers: computers paired to do the web Studio's work cap 1 5 POST /api/runners/pairing, and again as a code is used at /runner/pair (#roomForComputer)
frame_checks: L3 and up drawn on Gamewright's computer flag on pack.verify at the socket (#refuseFrames); every other run in the daemon (holdFrames, from the grant)

Every plan keeps the desktop Studio, every template and sample, export to every system and the web with its store page, commercial use of what is made, checks L0 to L2 everywhere and every check on the person's own computer (the desktop Studio, or a paired one), and the Director on their own Anthropic key or Claude Code. Nothing is resold: model time is billed by the person's provider.

Each cap is measured against the host's own count where the thing is made: the games in the person's folder, its size, their paired computers. Nothing is counted twice, so nothing drifts, and games made before the plans need no backfill. Games on a computer of theirs are kept there and never count.

What is not a feature, and why: the upload size (one 6 MB limit in the engine, desktop included), version history (undo is kept without a limit, inside the space), publishing and share links (not built), exports from the web Studio (the Studio doesn't offer them), the judge (L4, off on the host) and the browser rung (L5, no browser in the host's image).

How it is built

  • core/src/host/plans.ts (HostPlans) wraps Admission's client (admission-client.ts, copied from Admission's packages/client, its commit in the first line). Without ADMISSION_KEY there are no plans, and the quotas the owners set in the console apply to everyone, as before.
  • The customer is the person's user id (u_…), from their session, never from a request.
  • A person's own quotas from the console stand over their plan's (an owner's grant).
  • The owners (ADMIN_EMAILS) are told to Admission as they sign in and as the Studio starts (owner()): their plan is the best one, unlimited.
  • When Admission can't be reached the client answers from its last snapshot: a paying person is never blocked, a stranger gets Free. The snapshots are kept in the host's database (admission_snapshots, snapshotsIn), so a restart during an outage still has them. A check it can't answer at all is a 503, "Gamewright can't check your plan right now", and frame checks wait while a person's plan is unknown.
  • Frame checks are held in two places: the socket refuses pack.verify at L3 and up, and each daemon's grant (host/grant.ts) carries frames, the refusal, while the person's plan keeps them off the host; runLadder then refuses any run of L3 and up (the Director's playtest, try and plan tools included). A change's clip (changes.clip) is a preview, not a check, and draws on every plan.
  • A pairing code is checked against the plan when it is made and again when it is used, one at a time for its person, so codes made while there was room never pair past it.
  • Opens of a person's games run side by side; a create or delete of theirs waits for the opens under way, and opens wait for it, so a deleted game is never started again or left to come back to.
  • Your plan (/app/account, pages.ts accountPage): the plan and what pays for it (renews, ends, a trial, a failed payment), what it keeps against what the person has, Upgrade (monthly or yearly, to Stripe Checkout) or Manage billing (the portal), and the games kept here, each with Download (GET /api/games/<id>/download: the game's own files as a zip under its folder, each opened as /api/file opens one, never through a link; the desktop Studio opens it) and Delete, so a person at a limit can always make room, and no game is kept here only. The Studio's welcome links it on the web, beside Your computers. Stripe sends people back to PUBLIC_URL/account, on gamewright.diy.
  • Deleting an account, by the person on Your plan (their address typed out; never an owner's) or by an owner in the console, is one step (AdminConsole.deleteAccount): the person is erased in Admission first, ending any subscription at once, then their daemons, their folder and the account go. While Admission can't be reached, nothing is deleted.
  • Who can join is the owners' choice in the console: Open (anyone, by a code mailed to their address; their account is made then, on Free), Invite-only, or Closed.
  • The Studio shows a refusal's words as the host says them, with no status code before them, so a limit reads as the plan and the way past it.
  • Refusals say what the plan keeps, what Pro does, and the way on: "Your Free plan keeps 3 games here. Pro keeps 50: upgrade on Your plan. Or delete one you no longer need on Your plan, or keep games on a computer of yours."

The site

/pricing and the home page's plan cards read web/app/plans.ts, which says what Admission sells. They show with GAMEWRIGHT_PRICING=live, set once Pro is on sale in live mode.

Going live

  1. Sign-ups open (the console's Settings, Who can join: Open), so anyone can make the account Pro is bought on; invite-only would leave the pricing page's Start with Pro at a closed door.
  2. The product gamewright in Admission with these features and plans, test prices, a test key (ADMISSION_KEY in the main checkout's .env), and the whole flow proven in test mode.
  3. The owner confirms Pro's live price ($12 a month or $120 a year proposed, as Bookwright).
  4. Live prices, Pro set Live, a live key as the Fly secret ADMISSION_KEY on gamewright-app; the host deployed.
  5. Gamewright's section on atypic.ai's products and terms (its src/lib/facts.ts), merged the hour Pro goes on sale; then GAMEWRIGHT_PRICING=live and the site deployed.

From docs/design/plans.md in the Gamewright repository.