The first fully on-chain bingo game built for Solana. Compete in live 8-player races, challenge yourself in solo modes, or join marathon pots that last for hours. Every ball drawn is provably fair via Switchboard VRF. Your wallet. Your winnings. No middleman.
Join our seed round. Building the future of on-chain gaming on Solana.
Connect your Solana wallet to view your in-game stats, check your .skr domain, and verify your Seeker Genesis Token perks.
No middleware. Every ticket, win, and shell is read directly from the chain.
Every ball draw, ticket, and payout lives in a Solana program. No servers, no house, no custodians.
Ball sequences derived from Switchboard VRF randomness. Verify every game on-chain.
6-minute Flash rooms, 55-minute Standard rooms, and 6-hour Marathon modes for every play style.
Three solo challenges: Tidal Rush, Pattern Cascade, and Buried Treasure — each with unique mechanics.
Pay in SOL, USDC, JUP, or SKR. SKR holders get 15% fee discount via Token-2022 metadata.
Built exclusively for Solana Seeker — the web3 phone with native Seed Vault, .skr domains, and SKR token integration.
Built for Solana Seeker and Solana Mobile. Direct install via APK. Optimized for Seed Vault integration.
🔒 Download v1.5.0 b146Connect your wallet — or enter an access code — to unlock the full download and complete changelog.
◎ Connect WalletLive build history. Every shipped feature, fix, and security audit.
tokenBalances on success: joining a room, joining a tournament, starting/settling a solo game, shop purchases, Daily Ranked registration, and all challenge operations. Balance displays update immediately after any spend or receive.settleChallenge now invalidates the player profile cache so the profile screen reflects the updated stats immediately.useSettleSolo now explicitly invalidates the solo session React Query cache on success, in addition to the WebSocket-driven update. Belt-and-suspenders ensures the result screen appears even if the WebSocket misses the event.useBuyCardPack now verifies the payer's token account exists before sending the transaction, showing a clear error message instead of a cryptic on-chain failure.useRegisterReferral now invalidates the profile cache on success so the +500 π bonus shows in the profile immediately.useDailyPool was deriving the player's SKR ATA using the standard SPL Token program, but SKR is a Token-2022 token. Fixed to use TOKEN_2022_PROGRAM_ID for ATA derivation, precheck, and transaction accounts.useRegisterReferral now invalidates the profile cache on success so the +500 π bonus appears in the profile immediately instead of waiting for the 30-second poll.acceptChallenge and joinChallengeRoom were returning the room's PDA (base58 string) instead of its numeric room ID. Navigating to /game?roomId=<pda> caused BigInt(pda) to throw, breaking the entire game screen for challenge matches. Also fixed the ChallengeResultSection lookup in the game screen which was comparing PDA vs numeric ID (always false).join_success SFX call from join.tsx, the now-unused playSfxEvent import was also cleaned up. Unused playSfxEvent import in useRevealChest similarly removed.useRoomPlayers now subscribes to the room account via WebSocket. New players joining the waiting room now appear in the player list immediately.useRevealChest.onSuccess was playing chest_open in addition to useSoloGame's callback. join.tsx was playing join_success in addition to useJoinRoom.onSuccess. Both duplicates removed.useSoloSession now subscribes to the session account via WebSocket, matching the pattern established for useRoom in b122. VRF fulfillment and settle confirmation now propagate instantly instead of waiting up to 2 seconds.useRoom now subscribes to the room account change event in addition to polling every 10 seconds. Game-state transitions (waiting room filling, game starting, settlement) now propagate to the UI immediately instead of waiting up to 10 seconds.daubColor now applies to the multiplayer bingo board cell text color and shadow. Previously only solo modes and daily challenge honored the card theme selection.useCardTheme was loaded in the game screen but BingoBoard hardcoded t.gold for marked cells. Now the theme's daubColor is threaded through.require('react-native').StyleSheet.create({"{...}"} pattern with a standard ES import and removed redundant as const casts. No runtime behavior change.t={"{t as any}"} and theme={"{t as any}"} pattern eliminated from game, shop, profile, and more screens. All components correctly type t: TropColors, so the casts were pure noise. TypeScript still passes with 0 errors.useActivityFeed and calling refetchFeed() on every pull-to-refresh even though the activity feed UI component was never rendered anywhere. Removed the dead import and the unnecessary API call.ShopHeader, CardPackSection, UpgradesSection, and ConnectWalletSheet replaced all inline Montserrat-Bold / Montserrat-Regular strings with t.fUI / t.fUIReg theme tokens.utils/friends.ts was creating its own TldParser. Switched to the shared singleton from utils/tldParser.ts to avoid duplicate caches.useActivityFeed hook from the Lobby. The ActivityFeedSection component was never rendered, so each pull-to-refresh was firing a Helius API call for data that was never displayed.ShopHeader, CardPackSection, UpgradesSection, and ConnectWalletSheet all had inline Montserrat-Bold / Montserrat-Regular strings. Now use t.fUI / t.fUIReg theme tokens.displayIdx (the client animation counter) to match timerMarks, ensuring lives decrease in sync with the ball reveal animation instead of computing from the raw on-chain count.utils/friends.ts was creating its own TldParser instance instead of using the shared one. All .skr domain lookups now share a single cached instance.useBallDraw, once in the game screen effect). Removed the duplicate call from the game screen.useBuyCardPack invalidated the wrong React Query key. Profile card count now refreshes immediately after buying packs.useBallDraw (account subscription) and once in the game screen effect. Removed the duplicate. Haptics remain.[count, active]) and a one-shot ref guard.useBuyCardPack was invalidating playerProfile but the actual cache key is ['profile', wallet]. Profile card count now updates immediately after a pack purchase.WinShareCard and RoomCard coin symbol text now use the theme font token instead of hardcoded Montserrat-Bold.useJoinRoom and useCreateRoom were invalidating rooms but the actual cache key is allRooms. The room list now updates immediately after joining or creating a room.useJoinRoom and useCreateRoom invalidated the wrong React Query key (rooms vs the actual allRooms key), so the list only refreshed after the 10-second auto-poll interval.