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.
/.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.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.What each part of the manifest changes for the user.
| You declare | Casa Tookan shows |
|---|---|
name, iconUrl | Your name and icon in the address bar, and in the sheet where the user approves a signature |
splashImageUrl, splashBackgroundColor | A splash screen while your app loads, until you call window.casaTookan.ready() |
heroImageUrl, subtitle, homeUrl | A card in Browse › Apps when the user saves your app — it opens at homeUrl |
chains, capabilities | A dismissible notice when you require something Casa Tookan lacks; your app still opens |
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.
app| Field | Type | Notes |
|---|---|---|
name | string | Required. Max 32 characters. |
iconUrl | URL | Recommended. See images. |
homeUrl | URL | Recommended, on your own domain. Where a saved app opens. |
heroImageUrl | URL | Recommended. The banner in Browse › Apps. |
splashImageUrl | URL | Defaults to iconUrl. |
splashBackgroundColor | hex | #RGB, #RRGGBB, or with alpha. |
subtitle | string | Max 30 characters. One line under the name. |
description | string | Max 170 characters. |
primaryCategory | string | games · collectibles · finance · social · utility · marketplace · art-creativity · education · developer-tools |
tags | string[] | Up to 5, max 20 characters each. |
chains | object | required / optional: CAIP-2 ids — see chains. |
capabilities | object | required / optional — see capabilities. |
identity | object | Reserved: { "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 — plannedProof that the domain belongs to you, in the shape of Farcaster’s accountAssociation:
header — base64url JSON { "type": "casatookan", "address": "…" }, a casa address (legacy Bitcoin, or EVM);payload — base64url JSON { "domain": "your-domain" };signature — base64url signature of header + "." + payload by that address: BIP-137 for Bitcoin, EIP-191 for EVM.Stored by Casa Tookan, not verified yet. It will be required for anything scoped to your domain.
| Image | Field | Size | Shape |
|---|---|---|---|
| Icon | iconUrl | 1024 × 1024 PNG, opaque | 1:1 |
| Banner | heroImageUrl | 1200 × 630 | 1.91:1, shown uncropped |
| Splash | splashImageUrl | 200 × 200 | 1: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.
CAIP-2 ids. Anything else is ignored.
| Chain | Id |
|---|---|
| Bitcoin mainnet | bip122:000000000019d6689c085ae165831e93 |
| Ethereum | eip155:1 |
| Base | eip155:8453 |
| Kaia | eip155:8217 |
| Optimism · Arbitrum · Polygon · BNB Chain · Avalanche · Gnosis | eip155:10 · 42161 · 137 · 56 · 43114 · 100 |
provider.counterparty capability.| Capability | What your page gets |
|---|---|
provider.ethereum | window.ethereum (EIP-1193, announced over EIP-6963) on the casa’s EVM account. |
provider.bitcoin | sats-connect, Wallet Standard and window.unisat on the casa’s Bitcoin accounts (segwit, taproot, legacy). |
provider.counterparty | window.webXCP / window.web3xcp on the legacy address; Counterparty PSBTs are decoded and shown to the user before signing. |
casatookan.ready | window.casaTookan.ready() — see splash screen. |
identity.estate | Reserved, 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.
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
}
splashImageUrl (or the icon) on splashBackgroundColor.casatookan.ready and it stays until you call window.casaTookan.ready() — at most 10 s.ready() once your first screen is drawn, not before.accountsChanged (on window.ethereum and window.unisat).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();
});
| Situation | What happens |
|---|---|
| When it is fetched | From your site directly, once per domain and per launch of the app: a change is seen at the next launch. |
| Format | Serve application/json. An HTML page with status 200 (an SPA fallback) counts as “no manifest”. |
404 / 410 | No 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 app | One 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. |
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).
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.