_____ ____ _____ _
|_ _/ __ \ / ____| | |
| || | | || | __ __ _| |_ _____ ____ _ _ _
| || | | || | |_ |/ _` | __/ _ \ \ /\ / / _` | | | |
_| || |__| || |__| | (_| | || __/\ V V / (_| | |_| |
|_____\____/ \_____|\__,_|\__\___| \_/\_/ \__,_|\__, |
__/ |
|___/
IQ Gateway resolves IQ on-chain content (manifests, table rows, signatures, SNS/ENS records) and serves it over HTTP with a multi-tier cache. One process serves Solana and every supported EVM network at once. Anyone can run their own; data is recoverable from chain so any gateway can serve any id. This deployment is one of multiple cooperating instances.
| mode | loading… |
| chains | loading… |
| uptime | loading… |
| rpc calls | loading… |
| cache entries | loading… |
| cache size | loading… |
The chain is picked per request: a base58 id (Solana sig/pubkey) routes to Solana; a 0x id routes to EVM. Add ?network= to reach an EVM L2; without it, EVM ids resolve to the default network below. Same routes, same response shapes — only the underlying fetch settings differ per chain.
| solana | base58 ids · ?network=solana · SNS / sol.site hosting |
| sepolia (EVM default) | chain 11155111 · ETH · 0x246A08D9fdD9b3990A88eD1f2DF1A87239839F07 |
| monad | chain 143 · MON · ?network=monad · 0x7ae06f87Cf93606DA2BD6A281afB28028cAE233D |
| monadTestnet | chain 10143 · MON · ?network=monadTestnet · 0x3379883538C068978e199472b5D127055c734867 |
| robinhood | chain 4663 · ETH · ?network=robinhood · 0x88af59e58C7E5DcbE7cc12972B90cff3fEEF7223 |
EVM networks deployed depend on this operator's config; check /health for the live chains list. ENS forward/reverse lookups run against Ethereum mainnet (needs ENS_RPC_ENDPOINT).
Set one record on your .sol via sns.id — a URL record pointing at this gateway — and your domain becomes browsable in three places:
<your-name>.sol in Brave with native SNS resolution enabled<your-name>.sol.site/file any browser, via sol.site DNS materialisation${0}/sns/<name> any browser, via this gateway directlyThe on-chain content is the same across all three. See HOW-IT-WORKS.md for the full spec + the SDK quirk we work around.
GET /sns/{domain}resolve sns → 302 to /site/<sig>/GET /sns/{domain}/{path}drill into a specific fileGET /site/{sig}serve the manifest's indexGET /site/{sig}/{path}serve a file from the manifestGET /meta/{sig}.jsonmetaplex-compatible json metadataGET /img/{sig}.pngraw image bytesGET /data/{sig}raw asset dataGET /view/{sig}rendered html view of a text inscriptionGET /render/{sig}png/svg render of a text inscriptionGET /table/{pda}/rowspaginated rows; ETag 304 + timestamp-gated refreshGET /table/{pda}/subscribeSSE: hello / row / ping every 30sGET /table/{feedPda}/thread/{threadPda}resolved op + replies in one callGET /user/{pubkey}/postsopportunistic signer indexGET /user/{pubkey}/assetsassets uploaded by a walletGET /gate/{tablePda}/check/{wallet}server-side token-gate checkGET /cache/infocache stats — entries, size, by-typeGET /cache/entriespaginated disk-cache index for explorersGET /cache/snapshotstreamed tar.gz of full cache (public; bootstrap a cold peer)EVM (0x ids, optionally ?network=): /data/{txHash}, /meta/{txHash}.json, /table/{dbRootId}/{tableName}/rows, /ens/{name} (forward/reverse). Same shapes as the Solana routes above.
full schema at /openapi.json · interactive at /docs
Pick the file path that matches your manifest's index (often gameboy.html, index.html, etc.). The sig in the URL value is the only thing the resolver needs — the rest is stripping fluff.
The whole stack is open source. Operator-agnostic by design: someone running their own instance pointed at the same chain serves the same content.
Containerized via the repo Dockerfile (chain-agnostic image). Unset IQ_CHAIN serves every configured chain at once; set it to lock to one. To bootstrap a cold cache from a peer:
Pulls the peer's full cache.db + blob dirs. Each entry is keyed by an on-chain identifier so you can verify any subset against chain. Skips the cold-start RPC storm.
| memory (LRU) | 500 entries, 5min TTL — hot path |
| disk (sqlite) | 10GB cap, evicts LRU when full — survives restarts. Keyed by network so chains never collide. |
| chain (solana / evm) | permanent — source of truth |
Negative results cached too (sentinel __none__) so junk lookups don't keep hitting RPC. In-flight dedup means N concurrent cold-cache requests for the same key share one upstream call.