SqueekRunner / Game Whitepaper

From the wheel
to a big run.

Turning a living rhythm into a tiny game you want to play one more time.

Version 0.2 · Whitelist Raffle & Anti-Cheat Edition · November 8, 2026

01 / Abstract

Living rhythm. Personal best.

SqueekRunner is a free, client-first browser endless runner. The player controls a hamster: jumping over crates, collecting golden nuts, and trying to run farther. World speed responds to the RPM of Squeekchain's real hamster wheel, while newly confirmed Squeek block heights drop bonus nuts.

The game remains fully playable when the wheel is idle or telemetry is unavailable. Starting a casual run requires no account, wallet, or installation. For competitive players, an optional server-verified ranked mode allows runners to qualify for a provably fair testnet NFT whitelist raffle. This document describes our game; the underlying network design is documented in the official Squeekchain whitepaper v1.1.

02 / Concept

Feeling data in a jump.

A bare RPM reading tells a player very little on its own. But when the wheel speeds up and crates rush toward you faster, the link to the physical world becomes palpable. SqueekRunner turns telemetry into decisions: when to jump, where to use a double jump, and whether to risk a jump for a nut.

The core loop remains classic arcade: run → crash → score → one more try. Telemetry modulates the tempo within that loop. Baseline speed keeps the full game intact when the wheel is stationary; a separate DEMO mode lets players explore the mechanics without waiting for real-world motion or a new block.

03 / Context

Behind the wheel.

According to the Squeekchain v1.1 whitepaper, the physical WHEELY9000 wheel counts magnet passes across a sensor. One pass equals one unit of work. This is physical wheel work, not CPU hash computation. Work is aggregated into 10-minute rounds, submitted via signed Oracle/Reporter pathways, and settled by the Core contract.

RPM is instantaneous wheel tempo. A Squeek block is the result of accumulated work meeting target difficulty. A high RPM therefore does not mean an immediate block confirmation. For the game, these two signals are independent: RPM drives world speed, while confirmed height drives golden nuts.

The Squeekchain ecosystem includes SQK and a collection of 9,999 Squeeks with levels 1–10. Network rewards accrue to staking accounts. SqueekRunner only reads public telemetry; staking participation, NFT ownership, and token transactions are not required to play. In-game score and nuts are not SQK.

Facts verified against whitepaper v1.1 and technical inspection on November 7, 2026. Verified deployment: Sepolia, chain ID 11155111, installation sepolia-core-sepolia-20261103. This describes the verified release, not a guarantee that the external network will remain unchanged. Sources →

04 / Gameplay mechanics

Faster wheel — faster world.

The hamster stays near the left edge as the world scrolls forward. Space, ↑, click, or tap initiates a jump; a second press in midair triggers a double jump. Crashing into a crate without a shield ends the run. Pressing Space or tapping on the score screen immediately starts a new attempt.

target = base(distance) × multiplier(RPM) base(d) = 290 + 110 × clamp(d / 1800, 0, 1) multiplier(r) = 1 + 1.7 × clamp(r / 98.316, 0, 1) Δt = 1/60 s; α = 11834 / 1000000 ≈ 1 − exp(−Δt / 1.4) speed ← speed + trunc((target − speed) × α)

At 0 RPM the multiplier is 1. At the historically observed peak near 98.3 RPM it reaches 2.7 and caps there. This is a game-balance calibration, not a physiological limit of the hamster. Fixed-step smoothing approximates a 1.4-second time constant; when data drops out, speed glides smoothly back to baseline. The speed update above uses integer milli-pixels per second.

Gameplay advances at 60 fixed ticks per second. Jump inputs take effect on the next tick (up to 16.67 ms later), obstacle intervals round up to ticks, and pauses freeze simulation time. Runs end on collision or after 30 minutes of simulation. Integer physics and seeded obstacle randomness let the same recorded inputs and wheel samples deterministically reproduce the same score. In casual play, replays can be inspected locally; in ranked play, server-issued sessions, real-time duration enforcement, and independent server-side telemetry validation secure entries for the whitelist raffle.

Difficulty increases with distance: baseline speed ramps up and obstacle gaps tighten. Score is the integer floor of game distance multiplied by 10, plus collected bonuses. Game metres are not the measured physical distance of the real hamster.

MVP constants from src/config.ts; verified against configuration by a build test.
ParameterValue
Baseline speed → maximum290 → 400 px/s
Base ramp distance1800 game m
Calibration peak98.316 RPM
Maximum multiplier2.7×
EMA time constant1.4 s
Gravity1800 px/s²
Initial / air jump-630 / -550 px/s
Input buffer / coyote time120 / 90 ms
First obstacleAfter 2.4 s
Obstacle interval1.9 → 1.15 s, plus 0–0.5 s
Obstacle ramp distance1400 game m
Scale / points per metre24 px/m; 10 pts/m
Golden nut+150 points; shield 12 s
Post-shield invulnerability550 ms

The shield absorbs one collision. Pause is toggled with P or Escape; hiding the browser tab also pauses the run. Press Space or tap to resume.

05 / Data states

Quiet is part of the game.

  • LIVE. Fresh, healthy telemetry with RPM > 0. The wheel accelerates the world.
  • WHEEL IDLE. Fresh, healthy telemetry with RPM = 0. Normal baseline speed.
  • NO DATA. Stale, null measurement, COUNTER_FAULT, unavailable, malformed response, network error, or expired read. Target speed glides back to baseline. Numeric RPM is hidden; retained block height is explicitly labeled as last known.

measurement.rpmMilli / 1000 converts milli-RPM into RPM. coreStatus: ACTIVE can occur even at 0 RPM. These states describe the hardware and data pipeline, not the sleep or health of the animal.

DEMO mode runs a standalone simulator: a 26-second cycle with the first 6 seconds idle, followed by a smooth rise and fall in RPM. Block height increments every 16 seconds. The game displays a prominent DEMO badge, records are isolated from LIVE, and no network requests are sent to Squeekchain.

06 / Confirmed blocks

New block. One golden nut.

Bonuses depend solely on builder.anchor.blockHeight. Heights are transmitted as strings and parsed as BigInt to prevent precision loss beyond JavaScript's safe integer range.

  1. The first valid confirmed anchor establishes a baseline without a reward.
  2. An increase of one or more blocks spawns one nut and a "Squeek block #N!" notice. Multi-block jumps never cascade into a flood of rewards.
  3. An installationId change or height regression resets the baseline without a bonus; any uncollected previous nut is removed.
  4. builder.projected.blockHeight is optimistic and provisional. It is shown only as a visual hint and never spawns nuts.

At most one uncollected nut exists on screen at a time. Menu and pause periods do not accumulate rewards; the first response after resuming establishes a new baseline. Expired cached data cannot seed a new run's baseline. Previously collected points and shields are not rolled back on a chain reset.

Wheel measurement freshness and confirmed anchor settlement are decoupled: a fresh valid HTTP response can advance block height even while RPM is stale. Stale RPM never accelerates the game. Unconfirmed projections never participate in rewards.

07 / Architecture

From sensor to frame.

SqueekRunner data flow The wheel streams measurements to the API. Accumulated work passes through rounds and Oracle/Reporter into Core; confirmed anchors reach the API as well. The client validates responses; RPM drives speed, confirmed anchors spawn nuts, and scores save locally. WHEELY9000 · physical wheelmeasurements and accumulated work Rounds → CoreOracle / Reporter · confirmed anchor instantaneous RPM Public API · /v1/statusbrowser GET · CORS · no wallet Client: parser and freshness guardLIVE / WHEEL IDLE / NO DATA SqueekRunner · your runRPM → speed · anchor → nuthigh score → localStorage
Simplified diagram. The game client consumes API responses; it does not settle work or submit transactions.

The application is a client-first static bundle built with TypeScript, Vite, and Phaser. Landing, game, whitelist portal, and this document compile as four distinct HTML pages. The landing page loads a small telemetry widget; the game engine is loaded only on the game page. The whitepaper is fully readable without JavaScript.

Reads use GET https://api.squeekchain.com/v1/status with no query parameters and credentials: 'omit'. The verified read API returns CORS Access-Control-Allow-Origin: *, so no custom proxy or backend server is needed for casual play. The parser validates schema versions, enums, timestamps, milli-RPM, and uint64 heights; malformed responses fall back to NO DATA.

Subsequent polls are scheduled 1500 ms after the previous request completes. Timeout is 8000 ms. Errors trigger exponential backoff up to 60000 ms; longer Retry-After directives are honored. Per technical inspection, the status API rate limit is 30 requests/s per IP with a burst of 60; exceeding it yields HTTP 429. This is an external limit, not a service guarantee.

A successful read expires after 12000 ms. Measurement freshness and timestamps are validated independently: capped at 120000 ms or less if the API reports a lower staleAfterSeconds. Polling pauses while the tab is hidden; aborted requests never publish late responses.

The source interface is shared between LIVE and DEMO. Parser, block detector, speed calculations, record storage, and widget logic are unit-tested independently of Phaser. Scene subscriptions are torn down on both shutdown and destroy. No external CDN fonts, trackers, or analytics scripts are loaded; the only network request in the application during casual play is the Squeekchain read in LIVE mode.

For casual play and local scoreboards, SqueekRunner operates entirely client-side and serverless. To support the competitive whitelist raffle, an optional companion server deployed on Cloudflare Workers and Cloudflare D1 provides telemetry archival and deterministic replay verification. A Durable Object (TelemetryCollector) polls Squeekchain's /v1/status endpoint approximately every 10 seconds, retaining verified historical RPM and block heights in D1 for 48 hours. In ranked mode, the server feeds this delayed timeline to both the client and the verifier, re-simulating the player's inputs at 60 Hz to guarantee fair qualification. If the raffle server is unavailable, SqueekRunner continues to run seamlessly as a standalone client.

08 / Whitelist raffle

Earn your chance. Provably fair.

Alongside casual play, SqueekRunner hosts a whitelist raffle for SqueekRunner Hamsters, an experimental collection of 1,000 NFTs on Ethereum Sepolia testnet. Minting is completely free, requiring only testnet gas obtained from public faucets. The collection is partitioned into 700 player raffle spots (70%), 200 Twitter/X and community giveaway spots (20%), and 100 team and treasury reserve spots (10%).

SqueekRunner whitelist raffle verification flow Player requests a session with Turnstile. The server sends a seed and 5-second delayed telemetry. The player completes a real-time run without pause. The server re-simulates the run at 60 Hz and checks elapsed wall-clock time. If qualified, the player signs an EIP-4361 message to record one ticket per wallet. Merkle root and future Sepolia block hash determine the 700 winners. Player initiates ranked run · Turnstile challenge server issues single-use session, uint32 seed and start timestamp Real-time ranked run · no pause allowed synchronized 5s-delayed telemetry timeline · inputs recorded at 60 Hz Server headless re-simulation · Cloudflare Worker 60 Hz integer physics replay with authoritative server telemetry run duration validated against server wall-clock time (±15s window) EIP-4361 wallet signature · Sign-In with Ethereum gasless off-chain signature · strictly 1 wallet = 1 raffle ticket in D1 Provably fair cryptographic draw frozen Merkle root + future Sepolia block hash → 700 winners
Ranked raffle verification pipeline. The server independently verifies replay inputs and confirms real-time duration before issuing a raffle ticket.

The ranked verification pipeline

Qualifying for the raffle requires demonstrating genuine skill on the wheel without financial barriers or gas costs:

  1. Session initialization. When a player initiates a ranked run, the client requests a single-use session from the verification server (POST /v1/session). Protected by Cloudflare Turnstile, the server issues a unique uint32 PRNG seed and records the authoritative start timestamp.
  2. Synchronized telemetry timeline. In ranked mode, the game receives wheel RPM and confirmed block heights from GET /v1/telemetry with a 5-second broadcast delay. This ensures the client and the server verifier observe an identical historical sequence of wheel events. Ranked runs cannot be paused and must be completed in real time.
  3. Deterministic re-simulation. Upon a collision or completion, the client submits the recorded input ticks (POST /v1/run). The server executes the exact 60 Hz integer simulation engine (squeek-1), applying its own authoritative telemetry and block history while discarding client-supplied RPM or nut claims.
  4. Timing and score validation. The server verifies that the client score matches the re-simulated score and ensures the run took its genuine real-world duration (rejecting runs submitted faster than elapsed simulation time or more than 15 seconds late). If the run exceeds the qualifying threshold, the server issues a one-time run token.
  5. Cryptographic entry (zero gas). The player connects a Sepolia wallet and signs a Sign-In with Ethereum (EIP-4361) verification message. Signature verification is performed with viem. The server enforces strictly one wallet = one raffle ticket (POST /v1/entry).

Threshold calibration

The qualifying score is not an arbitrary target. The server records aggregate metrics from verified runs via GET /v1/stats, analyzing percentiles (p50 through p99) and score distributions across all wheel speeds. The qualification threshold is calibrated against real player data to ensure the milestone rewards dedicated runners while remaining reasonably achievable.

Provably fair cryptographic draw

Winner selection is auditable by any observer, eliminating black-box databases or opaque random number generation:

  • Snapshot and Merkle root. When entries close, the full list of qualified wallet addresses is frozen. An OpenZeppelin StandardMerkleTree is generated, and its root hash is published publicly to GitHub and community channels.
  • Future block commitment. Before the draw, a target Ethereum Sepolia block height is announced in advance. Because the target block lies in the future, its block hash cannot be predicted or manipulated by players or the team.
  • Deterministic shuffle. Once confirmed on Sepolia, the target block hash serves as the verifiable pseudorandom seed for a Fisher-Yates shuffle algorithm over the participant list, deterministically selecting the 700 winning addresses.
  • Independent verification script. A standalone open-source script allows anyone to input the published entry list, the commitment and the confirmed Sepolia block hash to independently reproduce and verify the exact winning allowlist.

09 / Honesty and limitations

Just a game. No financial promises.

  • Local records remain local. Casual runs and personal bests persist in localStorage, globally and keyed by starting block, isolated between LIVE and DEMO. The latest 100 block records are retained. If the starting block is unknown, the first confirmed height seen during the run is pinned. Local storage is client-editable; casual scores are not verifiable proofs of fair play and do not sync across devices.
  • Anti-cheat and ranked verification. To protect the whitelist raffle, ranked runs are validated by an independent server. The server issues a one-time session seed, feeds an authoritative 5-second delayed telemetry stream, and re-simulates all inputs tick-by-tick at 60 Hz with integer physics. Client-reported RPM and nut spawns are discarded. Ranked runs cannot be paused, must match elapsed server wall-clock time, and require Cloudflare Turnstile and an EIP-4361 wallet signature. Each wallet may claim at most one raffle ticket.
  • Residual cheating risks (honest disclosure). Because the client must receive the obstacle seed to render upcoming crates, a bot with knowledge of the seed could theoretically simulate physics offline to compute optimal jump inputs. Turnstile, real-time duration enforcement, cryptographic wallet signatures, IP-hash rate limits, and statistical qualification thresholds make automated farming costly and inconvenient, but cannot make it mathematically impossible. The organizers reserve the right to audit entry logs and disqualify obvious bot clusters or automated Sybil farming operations.
  • SqueekRunner Hamsters testnet collection. The SqueekRunner Hamsters collection consists of exactly 1,000 NFTs deployed exclusively on Ethereum Sepolia testnet. Minting is free (requiring only free testnet gas from public faucets). The collection is allocated as 700 player raffle spots (70%), 200 Twitter/X and community giveaway spots (20%), and 100 team and treasury spots (10%).
  • No SqueekRunner token, no payouts, no monetary value. SqueekRunner Hamsters NFTs and in-game golden nuts carry zero monetary value, offer no passive yield, represent no financial asset or equity, and make no promises of economic return. There is no SqueekRunner token, no paid mint, and no financial payout. In-game score and nuts are not SQK.
  • The API may go quiet. Fresh measurements are not guaranteed on every poll. Squeekchain work settlement proceeds independently from instantaneous RPM; network latency, counter faults, and installation changes can occur. Baseline speed preserves gameplay during telemetry outages.
  • Varying tempo means varying runs. LIVE runs occur at whatever RPM the wheel provides. A personal best is an arcade milestone, not a standardized esport competition.
  • Storage may be restricted. If localStorage is unavailable, casual high scores persist only in page memory for the current session. Landscape orientation is recommended for mobile players.

10 / Roadmap

Where we can run next. Plans, not promises

The items below represent potential directions for ongoing experimentation. They are exploratory ideas, not promised features, roadmap deadlines, or investment commitments.

  • Public verified leaderboard. An authenticated online scoreboard showcasing top scores from verified ranked replays, letting the community celebrate legitimate high-distance runs.
  • Holder cosmetic skins. Holders of SqueekRunner Hamster NFTs may be able to unlock alternative in-game hamster skins, accessories, or visual themes during runs.
  • Community mods and challenges. Custom obstacle packs, fixed-condition time trials, and alternative wheel telemetry modes while preserving the living connection to Squeekchain.

Already live: full arcade runner, double jump, LIVE and DEMO modes, block bonuses, deterministic 60 Hz simulation, server-verified ranked replays, and the whitelist raffle tooling (entries open after the threshold is announced). Run on the wheel →

11 / Sources

Where the facts come from.

Network facts are limited to the verified technical inspection of November 7, 2026, based on public documentation and the read API. Game balance figures come from src/config.ts and are verified against the table above by automated tests.

  1. Official Squeekchain Whitepaper — version v1.1, WHEELY9000, work, rounds, and network model.
  2. Public API Documentation — response contract and rate limits.
  3. Sepolia Deployment — published deployment parameters.
  4. Squeekchain Website — ecosystem context.

Project GitHub — link will appear once the repository is public. SqueekRunner claims no official partnership with or endorsement by Squeekchain.