Casa Tookan · documentation

Build a Casa Tookan app

How a website presents itself as an app inside the Casa Tookan browser: the casatookan.json manifest, what the page gets, how the manifest is read — and a validator.

In one sentenceServe /.well-known/casatookan.json with at least a name: 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.
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.

At a glance

What each part of the manifest changes for the user.

You declareCasa Tookan shows
name, iconUrlYour name and icon in the address bar, and in the sheet where the user approves a signature
splashImageUrl, splashBackgroundColorA splash screen while your app loads, until you call window.casaTookan.ready()
heroImageUrl, subtitle, homeUrlA card in Browse › Apps when the user saves your app — it opens at homeUrl
chains, capabilitiesA dismissible notice when you require something Casa Tookan lacks; your app still opens

The manifest

At https://<your-domain>/.well-known/casatookan.json. Only version and app.name are required; every other field is read leniently — one that fails its check is ignored, the rest still applies.

{
  "version": "1",
  "app": {
    "name": "Orb Quest",
    "iconUrl": "https://orbquest.game/icon.png",
    "homeUrl": "https://orbquest.game/play",
    "heroImageUrl": "https://orbquest.game/hero.png",
    "splashImageUrl": "https://orbquest.game/splash.png",
    "splashBackgroundColor": "#101820",
    "subtitle": "Duel with your orbs",
    "description": "A card game played with your Counterparty assets.",
    "primaryCategory": "games",
    "tags": ["cards", "counterparty"],
    "chains": {
      "required": ["bip122:000000000019d6689c085ae165831e93"],
      "optional": ["eip155:8453"]
    },
    "capabilities": {
      "required": ["provider.counterparty", "casatookan.ready"],
      "optional": []
    }
  }
}

version is "1": any 1.x is read as v1, another major version is ignored.

Fields of app

FieldTypeNotes
namestringRequired. Max 32 characters.
iconUrlURLRecommended. See images.
homeUrlURLRecommended, on your own domain. Where a saved app opens.
heroImageUrlURLRecommended. The banner in Browse › Apps.
splashImageUrlURLDefaults to iconUrl.
splashBackgroundColorhex#RGB, #RRGGBB, or with alpha.
subtitlestringMax 30 characters. One line under the name.
descriptionstringMax 170 characters.
primaryCategorystringgames · collectibles · finance · social · utility · marketplace · art-creativity · education · developer-tools
tagsstring[]Up to 5, max 20 characters each.
chainsobjectrequired / optional: CAIP-2 ids — see chains.
capabilitiesobjectrequired / optional — see capabilities.
identityobjectReserved: { "level": 0–3, "reason": "…" }, for a future per-app, per-device identity (anti-Sybil). Accepted today, not acted on.

URLs must be http(s) — use https.

association — planned

Proof that the domain belongs to you, in the shape of Farcaster’s accountAssociation:

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

Images

ImageFieldSizeShape
IconiconUrl1024 × 1024 PNG, opaque1:1
BannerheroImageUrl1200 × 6301.91:1, shown uncropped
SplashsplashImageUrl200 × 2001:1

The icon sits on light and dark backgrounds: give it its own background rather than transparency. 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.
casatookan.readywindow.casaTookan.ready() — see splash screen.
identity.estateReserved, not available yet.

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.casaTookan = {
  isCasaTookan: true,
  version: '1',
  ready(),   // hide the splash screen
};

if (window.casaTookan?.isCasaTookan) {
  // running inside Casa Tookan
}

Splash screen

  • Shown from the start with splashImageUrl (or the icon) on splashBackgroundColor.
  • Declare casatookan.ready and it stays until you call window.casaTookan.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.casaTookan?.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.
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.
A saved appOne favorite per domain, at your homeUrl, refreshed on each visit: a new name, banner or homeUrl 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, casatookan.json first — you only need a casatookan.json to override what differs in Casa Tookan, or to declare Bitcoin and Counterparty.

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

Validator

Applies the same rules as the app. Paste your manifest, or load it from your domain — that needs your server to send Access-Control-Allow-Origin; Casa Tookan itself doesn’t.