# Platform concepts (for agents)

Cassette is a discovery platform for web games: it lists games, shows them in a sandboxed frame, and offers players
usernames, a library and a wallet front end. It doesn't host third-party builds and doesn't sell games. Each developer
hosts their own build and sells through their own storefront contract. Publishing is free.

| Term | Meaning | You do |
|---|---|---|
| **Game** | A listed web game with a unique `slug` (`/g/<slug>`) and a manifest (`cassette.json`). Cassette stores a pointer: the play URL on the developer's host (or `ar://<id>` for an Arweave build), mirrors, and the build hash | register it: `listGame` / `publishBuild` relayed (`https://cassette.gg/agents/publish-game.md`) |
| **Studio** (profile) | The developer account. One per human, owned by the human's wallet | the human approves your link once |
| **Operator** | A key your agent makes and holds (protocol.md §2). Publishes the studio's games; operates the storefront's listings and seller record. Can't move money, refund, or change ownership, payout or refund policy | pairing: `POST /v1/agent-links` (protocol.md §3) |
| **Storefront** | The developer's own contract (ERC-1155 on Polygon) that sells licences and items, created from Cassette's admin-less factory and owned by the human's wallet. An immutable clone: Cassette has no role in it and can't change, pause or refund it | a sign link the human signs (`https://cassette.gg/agents/publish-game.md`, step 7) |
| **Seller record** | `/.well-known/cassette.json` on the developer's origin: who sells (name, business or private, contact), the storefronts, and the adopted documents with their sha256; its hash is on chain | `https://cassette.gg/agents/set-up-seller.md`; on chain with `setSellerRecord` |
| **Documents** | The developer's terms of sale, refund policy, privacy notice, imprint (business) and cancellation form, generated from templates and adopted by the human | `https://cassette.gg/agents/set-up-seller.md` (the human adopts by signing) |
| **Licence** | A paid game's token (at most 1 per player) in the developer's storefront | `pricing.type: "paid"` |
| **Item** | A purchasable thing in a game (skin, coins), a listing in the developer's storefront | `items` in the manifest |
| **Paywall** | The game's own sales page (`paywall.js`), on the developer's origin: it reads the storefront and asks for payment | copy `paywall.js` (`https://cassette.gg/agents/add-paywall.md`) |
| **Username** | `@name` (3-20 chars `a-z 0-9 _`) owned by the player, passed into every game as `cassette.user.username` | from the play-frame bridge (`paywall.md`) |
| **Session token** | Short-lived Cassette-signed proof of **who** the player is, for your backend. Identity only, never access | from the bridge; verify against `GET /v1/jwks` (`https://cassette.gg/agents/verify-ownership.md`) |

- **Pricing** types: `free`, `free-with-items`, `paid`. Prices are USD with at most 2 decimals and are paid as the same
  amount of USDC on Polygon; players add USDC to their wallet themselves (a card top-up inside Cassette is coming). Players pay the developer's storefront from the game's paywall:
  inside Cassette with the Cassette wallet, elsewhere with their own wallet. Buying needs no Cassette account.
- **Refunds:** each sale stays in the storefront (escrow) for the developer's self-refund window (template 6 hours,
  0–14 days); the buyer can refund themselves inside it. After it, anyone releases the payment to the developer. The
  developer can refund any sale at any time. Cassette's opt-in abuse registry can only switch off self-refund (`https://cassette.gg/agents/handle-refunds.md`).
- **Fees:** no fee to publish. A referral fee, set in the developer's own storefront: 0% during launch, and only on sales
  Cassette referred.
- **Hosting:** in the developer's own account: Cloudflare Pages, Netlify, Vercel, GitHub Pages, their own domain, or
  IPFS through their own pinning account (a mirror for a game that sells: its seller record needs a stable origin), or
  Arweave, coming soon (permanent, no account; the developer pays the storage; Cassette never pays for or sponsors it).
  Prefer a host the human is already logged into (`https://cassette.gg/agents/host-game.md`, "Detect first").
  `hosting.type: "hosted"` (Cassette serves the build) is legacy, for Cassette's own games only.
- **Access:** the game's paywall and the developer's backend read the storefront on the chain. Cassette doesn't gate a
  storefront game. Removing a game from Cassette removes it from discovery only.
- **Devices:** games declare `capabilities` (`phone`, `tablet`, `desktop`, input types, `multiplayer-*`, `offline`,
  `audio`). Explore pages filter by the visitor's device.
- **Community listings:** games found on the public web are listed by the platform's crawler; authors can claim them
  (`https://cassette.gg/agents/claim-listing.md`).
- **Legacy:** Cassette's own games may still use the legacy Checkout, Licenses and Items contracts and hosted builds.
  Don't use that path for a developer's game.

Read API: `https://cassette.gg/v1/*` (no key). Contract addresses: `GET https://cassette.gg/v1/config` → `deployment`
(`storefrontFactory`, `storefrontRouter`, …). Writes: signed by your key and relayed gas-free, or signed by the human
through a sign link (`https://cassette.gg/agents/protocol.md`).
