Casa Tookan Developers
Wallet App Manifest

Build a Casa Tookan app.

One wallet member in the web manifest you already have, and your site gets its name, icon, banner and splash in Casa Tookan.

At a glance

In one sentenceAdd a wallet member to the Web App Manifest you already have — the Wallet App Manifest, an open format any wallet can read. Casa Tookan then shows your site with its own name and icon, a splash screen while it loads, a card with your banner in Browse › Apps, and a notice when you need something it doesn’t offer.
Browse › My apps in Casa Tookan: the Dev Playground saved as an app, with its banner, icon, name and subtitle
Browse › My appsYour banner, icon, name and subtitle, once a player saves you.
Casa Tookan's sheet asking to connect to the Dev Playground
Signing sheetsYour name and icon on every request.
The Dev Playground running in Casa Tookan's browser, connected
Your app, connectedThe casa pill shows who is signed in.
You declareCasa Tookan shows
name, iconsYour name and icon in the address bar, and in the sheet where the user approves a signature
wallet.splashImageUrl, background_colorA splash screen while your app loads, until you call window.wallet.ready()
wallet.heroImageUrl, wallet.subtitle, start_urlA card in Browse › Apps when the user saves your app — it opens at start_url
wallet.chains, wallet.capabilitiesA dismissible notice when you require something Casa Tookan lacks; your app still opens
Casa Tookan, not CasaAlways write Casa Tookan / casatookan in full — Casa (casa.io) is an unrelated Bitcoin wallet. Inside Casa Tookan, a casa is one of the user’s profiles: a set of Bitcoin and EVM addresses they switch between. Your app sees the active casa.

The manifest

Casa Tookan reads the Wallet App Manifest, an open format any wallet can read: the W3C Web App Manifest your site most likely already has, plus one wallet member holding only what the standard has no member for.

{
  "name": "Orb Quest",
  "short_name": "Orbs",
  "description": "A card game played with your Counterparty assets.",
  "start_url": "/play",
  "scope": "/",
  "background_color": "#101820",
  "categories": ["games", "trading-cards", "counterparty"],
  "icons": [{ "src": "/icon-1024.png", "sizes": "1024x1024", "type": "image/png" }],
  "screenshots": [{ "src": "/shots/duel.png", "sizes": "1284x2778", "form_factor": "narrow" }],
  "wallet": {
    "version": "1",
    "subtitle": "Duel with your orbs",
    "heroImageUrl": "/hero-1200x630.png",
    "splashImageUrl": "/splash-200.png",
    "chains": { "required": ["bip122:000000000019d6689c085ae165831e93"], "optional": ["eip155:8453"] },
    "capabilities": {
      "required": ["provider.counterparty", "wallet.ready"],
      "optional": ["casatookan:identity.ceid"]
    },
    "extensions": {
      "casatookan": { "identity": { "level": 1, "reason": "One player per device" } }
    }
  }}

W3C standard in blue, unchanged · Added highlighted: the whole extension.

No wallet, no appA manifest without a wallet member, or whose wallet.version is not 1 / 1.x, does not make the site an app: no splash, no Apps card. Casa Tookan still shows the site under the manifest’s name and largest icon. Nearly every site has a manifest; only the ones that ask are shown as apps.

Where Casa Tookan finds it

  1. https://<your-domain>/.well-known/wallet-app.json — the same JSON, served on its own;
  2. else the <link rel="manifest"> in the <head> of your home page (https://<your-domain>/) — keep it in the served HTML, not added by script.

The first one with a wallet member is used whole: the two are not merged. Relative URLs resolve against the URL the manifest was fetched from.

W3C standard Members reused as is

MemberCasa Tookan’s useNotes
nameYour app’s nameMax 32 characters, else short_name (32 max) is shown.
iconsYour app’s iconThe largest raster icon with purpose any; maskable only as a last resort; never monochrome or SVG. See images.
start_urlWhere your app and its favorite openMust be on your domain, else ignored.
scopeWhich pages are the appW3C rules: the declared scope if on your domain and containing start_url, else the directory of start_url. Pages outside it are shown as your ordinary website.
background_colorSplash screen backgroundHex colors only.
descriptionYour app’s pageMax 170 characters, plain text, no emoji.
categoriesCategory and tagsUp to 5, 20 characters each, lowercase, no spaces. The first one that maps is the category: a Casa Tookan category as is, or utilities → utility, shopping → marketplace, photo → art-creativity.
screenshotsYour app’s pageform_factor: "narrow" for phones. Not shown by Casa Tookan yet.

Added The wallet member

FieldTypeNotes
versionstringRequired: "1". Any 1.x is read as 1, another major version is ignored.
subtitlestringMax 30 characters, no emoji. One line under the name.
heroImageUrlURLThe banner in Browse › Apps. See images.
splashImageUrlURLThe splash image; defaults to the icon.
chainsobjectrequired / optional: CAIP-2 ids — see chains.
capabilitiesobjectrequired / optional — see capabilities.
associationobjectProof that the domain is yours — see below.
extensionsobjectOne object per wallet. Casa Tookan reads extensions.casatookan and ignores the others.

Every field is read leniently: one that fails its check is ignored, the rest still applies.

Casa Tookan only extensions.casatookan

identity — what your app may ask of the player’s Casa Estates ID: level (0–3), a reason, and addresses, the most addresses per CAIP-2 chain it will ever ask for ([{ "chain": "…", "max": 1–5, "reason": "…" }]). See CEID.

association

Proof that the domain belongs to you, signed by any blockchain account:

"association": {
  "account": "eip155:1:0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
  "payload": "eyJkb21haW4iOiJvcmJxdWVzdC5nYW1lIn0",
  "type": "eip191",
  "signature": "0x…"
}
  • account — a CAIP-10 account;
  • payload — base64url JSON { "domain": "your-domain", "issuedAt": "…" };
  • type — the signature type: eip191 for EVM, bip322-simple for Bitcoin;
  • signature — the signature of the message defined in the specification.

Stored by Casa Tookan, not verified yet. It will be required for anything scoped to your domain.

Images

ImageMemberSizeFormat
Iconicons, purpose any1024 × 1024 (at least 512)PNG, opaque
Bannerwallet.heroImageUrl1200 × 630 (1.91:1), shown uncroppedPNG or JPEG
Splashwallet.splashImageUrl200 × 200PNG, transparency allowed
Screenshotsscreenshots, form_factor: "narrow"1284 × 2778 portrait, up to 3 shownPNG or JPEG

The same sizes as Farcaster mini apps: one set of files serves both. The icon sits on light and dark backgrounds and in round masks: give it its own background rather than transparency, and keep the art within the central 80 %. No SVG: many native image views can’t draw it. Without a banner, Browse falls back to your Farcaster manifest’s images (3:2 ones are cropped to 1.91:1), then to your icon over a blurred copy of itself.

Chains

CAIP-2 ids. Anything else is ignored.

ChainId
Bitcoin mainnetbip122:000000000019d6689c085ae165831e93
Ethereumeip155:1
Baseeip155:8453
Kaiaeip155:8217
Optimism · Arbitrum · Polygon · BNB Chain · Avalanche · Gnosiseip155:10 · 42161 · 137 · 56 · 43114 · 100
CounterpartyCounterparty is not a chain — it lives on Bitcoin. Require Bitcoin and the provider.counterparty capability.

Capabilities

CapabilityWhat your page gets
provider.ethereumwindow.ethereum (EIP-1193, announced over EIP-6963) on the casa’s EVM account.
provider.bitcoinsats-connect, Wallet Standard and window.unisat on the casa’s Bitcoin accounts (segwit, taproot, legacy).
provider.counterpartywindow.webXCP / window.web3xcp on the legacy address; Counterparty PSBTs are decoded and shown to the user before signing.
wallet.readywindow.wallet.ready() — see splash screen.
casatookan:identity.ceid Casa Tookan onlywindow.casaTookan.ceid — sign the player in with their Casa Estates ID: see CEID.
casatookan:tookans.spend Casa Tookan onlywindow.casaTookan.tookans.spend({ offer }) — sell an item for the player’s Tookans: a sheet shows the item, the price and the balance, and your page gets a signed receipt.
casatookan:identity.estate Casa Tookan onlyReserved, not available yet.

The provider.* capabilities and wallet.ready come from the specification’s open registry: names any wallet hosting apps can offer as they are. What only Casa Tookan offers carries its casatookan: prefix; other wallets ignore it. Former names are still honoured: casatookan.ready (now wallet.ready), identity.ceid and identity.estate (now prefixed).

A required chain or capability Casa Tookan lacks shows the user a dismissible notice — your app still opens. Optional ones are informative.

In the page

Injected before your own scripts. Signing goes through the standard providers above: there is no Casa Tookan-specific signing API.

window.wallet = {
  ready(),        // hide the splash screen — the neutral name
};

window.casaTookan = {   // Casa Tookan’s own
  isCasaTookan: true,
  version: '1',
  ready(),        // the same, by its former name
  ceid,           // Casa Estates ID sign-in
};

if (window.casaTookan?.isCasaTookan) {
  // running inside Casa Tookan: ceid is there
}

Call window.wallet?.ready() and your app works in any wallet that offers it; test for Casa Tookan only for what is its own. A window.wallet your own scripts define is left alone.

Splash screen

  • Shown from the start with wallet.splashImageUrl (or the icon) on background_color.
  • Declare wallet.ready and it stays until you call window.wallet.ready() — at most 10 s.
  • Without it, it goes once the page has been idle for 2.5 s after load.
  • Call ready() once your first screen is drawn, not before.

Casas

  • The user can switch casa while on your page: you get the providers’ usual accountsChanged (on window.ethereum and window.unisat).
  • Each casa has its own storage: localStorage, sessionStorage and IndexedDB are kept apart per casa, so a session stays with the casa that opened it.
window.addEventListener('load', () => {
  renderFirstScreen();
  window.wallet?.ready();
});

How Casa Tookan reads it

SituationWhat happens
When it is fetchedFrom your site directly, once per domain and per launch of the app: a change is seen at the next launch.
FormatServe application/json. An HTML page with status 200 (an SPA fallback) counts as “no manifest”.
404 / 410No manifest.
CORSSend Access-Control-Allow-Origin: * on every answer under /.well-known/, the 404s included. The phone app doesn't need it; Casa Tookan's web build (devapp.casatookan.com) and the validator below do. Without it a browser can't read the file, and can't tell a missing one from a network error.
Network error, timeout, 403, 5xx“Can’t tell”: Casa Tookan keeps what it knew and never downgrades an app over an outage. Don’t put the file behind a bot challenge.
Where/.well-known/wallet-app.json and your home page’s <link rel="manifest">, asked in parallel. A home page Casa Tookan can’t read (bot challenge, 403) counts as “no linked manifest”.
ImagesNot behind a bot challenge or a login either, and readable cross-origin (Access-Control-Allow-Origin: *). Publish a new image under a new URL: wallets may cache them.
Which pages are the appThose in your scope. Elsewhere on your domain, Casa Tookan shows your ordinary website, under your manifest’s name and icon.
A saved appOne favorite per domain, at your start_url, refreshed on each visit: a new name, banner or start_url is followed; a field you remove is removed; a manifest gone for good turns it back into a plain bookmark.

Farcaster mini apps

Casa Tookan also reads /.well-known/farcaster.json and hosts mini apps built on @farcaster/miniapp-sdk when the active casa owns a Farcaster account: context, Sign In With Farcaster, the wallet, haptics. Serve both manifests and they are merged field by field, the Wallet App Manifest first — you only need a Wallet App Manifest to override what differs in Casa Tookan, or to declare Bitcoin and Counterparty. A domain declared by farcaster.json alone is the app only at its homeUrl and below.

Not supported: adding the mini app and its notifications (no notification server), posting casts (handed to farcaster.xyz).

Playground

Edit a manifest and see, as you type, what Casa Tookan makes of it: the checks the app applies, your icon at every size, and the screens your users will see. It starts with a real one, the Dev Playground’s, live at ctserver.everdreamsoft.com/.well-known/wallet-app.json. Change its name, banner or colour, load your own domain, or paste your manifest. For the full specification checks, use the specification’s validator.

Images are loaded from your server and measured.

The Dev Playground serves icon-1024.png (1024 × 1024), hero-1200x630.jpg and splash-200.png (200 × 200): one set of files for the address bar, Browse, the app page and the splash. Open it in Casa Tookan from ctserver.everdreamsoft.com/playground.