Real-Time Simulation Engine • Mobile Application • Blockchain-Ready RWA Infrastructure
StockBaller is a free-to-play fantasy football app for web and mobile, and the goal is simple: grow your portfolio. Every user holds SB Coins — paper currency, earned by playing daily, watching ads, or topping the weekly leaderboard, or bought outright — and spends them two ways: investing in player tokens, capped at 1,000 per athlete so early conviction pays, and playing matchdays through predictions, head-to-head challenges and parlays. Both settle on the same real match data — the stats that decide your matchday challenge also revalue your holdings. Win on matchday and you have more to invest; scout well and your portfolio compounds all season. The idea comes from NIL and image rights turning player value into a public, tradeable conversation — and from the entertainment that sports betting genuinely gets right.
The loop closes at the top: coins won on matchday and earned from the weekly leaderboard return as buying power. Because both halves draw on the same finite balance, every decision carries an opportunity cost — coins staked on a matchday parlay are coins not spent accumulating a breakout striker before the market notices him.
The obvious way to build an athlete market is to sell shares in the athlete. That route is closed, and understanding why is what determined the data model.
An athlete's name, likeness and branded identity are protected as personality rights — inalienable under European civil law, and in practice shared with their club through joint IP agreements. Consent cannot be assumed, and it certainly cannot be obtained at the scale of thousands of players. Financialising future earnings is harder still: FIFA banned Third-Party Ownership outright in 2015 after hedge funds took positions in young players' transfer rights. The compliant modern workarounds all hit the same ceiling:
| Precedent | Approach | Why it doesn't scale |
|---|---|---|
| Spencer Dinwiddie | Fractionalised his own $34M NBA contract into bond-like tokens | Regulatory friction restricted it to accredited investors |
| Finlete | SEC-registered Reg CF shares in MLB prospects' future earnings | Underwriting cost and disclosure cycles per athlete |
| Watford FC | Digital equity sale of club shares via Republic | Works at club level; individual athletes remain unaddressed |
The token is not keyed to a person. It is keyed to a performance data series — player identity is a label on a data object, not the asset being traded. Names and headshots are rendered from our licensed feed to identify that data, never sold as the asset itself. Ownership is separated from the athlete's labour contract entirely, which is what lets the model scale to thousands of players where per-athlete securities offerings cannot.
Data rights replace image rights as the licence that matters. StockBaller runs on API-Football's commercial tier, which permits commercial use, with a planned migration to Sportmonks as revenue supports the deeper feed.
This framing holds because nothing settles in real money. The moment it does, the live question becomes whether a performance-indexed token is a security — and answering that properly requires counsel that a self-funded solo developer cannot buy. That unanswered question is precisely what the free-to-play build exists to earn the right to ask.
I built StockBaller solo as Senior Product Engineer and Architect — the web and mobile clients, the real-time backend, the quant engine that prices every athlete, and the smart contract layer underneath. The commercial thesis is Performance Tokenisation (RWA 2.0): an asset class indexed to what players actually do on the pitch rather than to their likeness. It targets two frustrations at once. Fantasy Premier League alone fields more than 11 million managers across 200+ countries — all of whom lose everything they built each August to the annual reset. And sports betting is structurally unwinnable for most: at standard prices the bookmaker's margin means a bettor must win roughly 52% of their slips simply to break even, which is why only a low single-digit percentage are profitable over time.
The first version was built as a true RWA product: real money, on-chain settlement, and Chainlink CRE validating match telemetry so that every token price had a verifiable basis rather than a speculative one. What stopped it was not engineering — it was capital. Self-funded and solo, I could fund neither the liquidity a real market needs nor the licence an app store demands.
In early July 2026 I re-sequenced rather than abandoned. The engine stayed; real money became paper money. The free-to-play build exists to manufacture the two assets I was missing — evidence of demand, and proof the pricing model holds against a real season — which are precisely what unlock the liquidity and the licence. The contracts, oracle integration and vault logic all survive intact beneath the off-chain ledger.
Version one was not a sketch. It was a working RWA platform — ERC-1155 athlete tokens, on-chain settlement, and Chainlink CRE feeding validated match telemetry into the vault so that prices derived from performance rather than sentiment. Users would have traded it with real money. Two walls stopped that, and neither was technical.
A real-money market in athlete tokens capped at 1,000 shares needs a market maker with real money behind it, or holders cannot exit their positions and the order book dies. As a self-funded solo founder I could not seed that liquidity — and an illiquid market is worse than no market, because it fails after users have already committed.
App store policy does not permit cryptocurrency trading products from individual developers; they must ship under a registered business holding the relevant financial licences. That is not friction to design around — it is a locked door. Without a licence, the primary distribution channel for a mobile-first consumer product was unavailable at any price I could pay.
Both walls open with the same key: evidence. Liquidity needs investors, and investors need proof of demand plus a pricing model that survives contact with a real season. A licence needs a business case. So I kept the engine and swapped the currency, shipping a free-to-play build whose job is to manufacture exactly that evidence. The free-to-play app is not a smaller version of the product — it is the instrument that pays for the real one.
The system moved to a hybrid execution model. The client (React Native / Expo) talks to a NestJS WebSocket API managing an off-chain ledger of SB Coins. Behind that Web2 surface the infrastructure stays blockchain-ready: new profiles are silently assigned a non-custodial smart account, and every token swap is written to the off-chain ledger in a form designed to be mirrored on-chain.
This is the detail that made the pivot survivable rather than wasteful. None of the version-one work was discarded. The ERC-1155 contracts, the vault logic and the Chainlink integration all remain, decoupled from the consumer client rather than deleted from it — which is why the route back to real-money settlement is a reconnection rather than a rebuild.
The same reasoning produced the agent fleet. Version one needed a market maker with real capital; version two needs one with paper capital. The 100+ autonomous traders are the identical liquidity problem solved in the currency I could actually afford.
With no cryptocurrency surface in the consumer app, the store restriction no longer applies. Onboarding is an ordinary Google or email sign-in, with the smart account provisioned silently in the background — no wallet, no gas, no seed phrase, and nothing standing between a football fan and the product.
Version one targeted Base L2. Watching other ecosystems push harder on real-world assets, I chose not to commit. Because settlement is decoupled from the client, the contracts stay portable across EVM chains — a redeploy with per-chain oracle availability and gas retuning, not a rewrite. The decision stays open until there is traction worth negotiating with.
The free-to-play build sits outside the licensed perimeter by structure rather than by assertion: SB Coins are earned through daily play, rewarded video and leaderboard performance as well as bought, so a genuine free entry route exists; balances do not cash out; and prizes are in-game. That allows cohort retention, transaction velocity and economic stability data to be gathered now — the same evidence required to argue for regulated real-money pools under an FCA sandbox later.
One match event has to do a great deal at once: settle every open prediction on that fixture, revalue every portfolio holding a player who was on the pitch, recompute leaderboard standings, and push all of it to connected clients — across several concurrent fixtures. The architecture exists to make that fan-out survivable on a solo developer's budget.
Why a document store for money. The standard objection to MongoDB as a ledger is that financial writes need multi-table atomicity, which relational databases have always provided. Here that is answered by the data model rather than by the database: a user's coin balance and their holdings live in the same account document. The operations that must succeed or fail together are therefore one document write — atomic in MongoDB by default, with no multi-document transaction involved. It is also what makes double-spend protection tractable, since the balance check and the debit touch a single document rather than two. The document boundary is drawn around the transaction boundary.
Shares not held by any user sit in a per-athlete token pool, so the 1,000-share supply is always fully accounted for on both sides of the book.
Live scores are polled from API-Football on cron schedules, with football news pulled from RSS feeds on a slower cycle. The commercial tier allows roughly 7,000 calls per day — and that quota, not compute, is what bounds the system.
The arithmetic is unforgiving. Polling a single fixture once per second for ninety minutes would consume most of a day's allowance on its own, so call budget is treated as a scheduled resource: concentrated on fixtures that are actually live, and backed off everywhere else.
Load testing confirmed where the ceiling sits. Simulating concurrent WebSocket connections, neither the socket layer nor the container gave way first — the external API quota did. The binding constraint on this system is economic rather than computational, which for a self-funded build is both the honest finding and the more useful one.
The SQE turns match telemetry into the number every screen in the app depends on. Python services recompute an athlete's index as new data lands, benchmarked against a historical corpus of career profiles and adjusted weekly for age and match fitness. A sentiment pass over the news feeds produces a coefficient that nudges the result up or down.
The ×3 is not a fitted coefficient — it is a product decision. A faithful valuation model produces price movements too small to be entertaining. Tripling the performance term amplifies the swing so that a good scouting call feels like one. That is the right trade for a game and the wrong one for a real market, so it is worth stating plainly: this index is tuned for entertainment, not for accuracy.
The subscription tier goes further. A separate prediction model, trained on a corpus of 50,000+ historical career profiles and served from Vertex AI, produces the player projections sold as SQE Insight — the engine that is expensive to run is also the one users pay for.
This is what makes the pivot reversible, and it rests on one specific choice: users are onboarded through Openfort, which provisions a real smart account behind an ordinary email login and links it to the Web2 identity. Every player already has an on-chain address. It is not a placeholder to be created at migration time.
Everything else follows from that. Coin movements are written to the backend ledger first, against accounts that already exist on-chain. What is switched off is settlement, not the infrastructure — so reconnecting means replaying a ledger onto addresses that are already provisioned, rather than building an identity layer from scratch.
Wall 1 was liquidity, and it does not disappear because the currency is virtual. A market where nobody is quoting is a market where prices do not move — and a portfolio game with static prices is not a game.
So the same problem gets the same answer, in the currency I could actually afford: a fleet of over 100 autonomous agents runs in Python, quoting both sides of the book so there is continuous price action from a user's first session. They read live player ratings and news sentiment to decide where to quote. They are market makers, not a simulation of user behaviour — their job is to make sure the market is never empty when someone arrives.
The app is a single Expo / React Native codebase written in TypeScript, shipping to iOS, Android and web. State is held in Redux, which suits this product for a specific reason.
In most applications state changes because a user did something. Here it mostly changes because a match did. Socket pushes arrive as dispatched actions and run through the same reducers as user intent, so a price move caused by a goal and a price move caused by your own trade update the store along identical paths. That keeps the two from drifting — which matters when a portfolio screen is being revalued underneath someone while they are looking at it.
Before the free-to-play build went live, the pricing engine was exercised against a full simulated season. Since launch it has generated its own distribution of outcomes — and that distribution is the more useful evidence.
| Test | Method | Result |
|---|---|---|
| Season Simulation | Full 38-week cycle, 220 player profiles (11 squads × 20) | Prices tracked form coherently across a complete competitive season |
| Live Model Spread | Current season, live pricing | Portfolio outcomes ranging +29.4% to −82.4% |
| Economy Sinks | Simulated across a season horizon | Issuance absorbed without runaway coin inflation |
| Load Test | Concurrent WebSocket connections | External API quota bound before sockets or container |
This is the most useful number on the page, for two reasons. It confirms the economy carries genuine two-sided risk — holding the wrong players through a bad run costs you real ground, which is what separates a scouting game from a number that only goes up. And it is the ×3 amplifier visible in the data: tripling the performance term widens the distribution in both directions, not just the flattering one.
Coins enter the economy through daily play, rewarded video and leaderboard payouts, so they need somewhere to go. These sinks were simulated across a season horizon to check the economy stays sustainable rather than inflating:
| Sink | Rate |
|---|---|
| Trading Fee | 1% per swap, routed to automated liquidity pools |
| Head-to-Head Matchday Rake | 15% |
| Holding Decay | Weekly, indexed to age and match fitness |
A season simulation shows the engine behaves coherently over a full cycle. It does not show that users who pick well beat users who pick at random — separating skill from variance requires a random-selection control run against the same window, and that test has not been done.
So the honest reading is narrower than it first looks: the live spread is evidence of a functioning market with real downside. It is not yet evidence of a market that rewards judgement. Establishing that is the next piece of work, and it matters more than any other metric here — a scouting game that doesn't reward scouting is just a slot machine with a football skin.
A free football game carrying a bespoke quant engine, a 50,000-profile prediction corpus and a Vertex AI serving layer looks disproportionate — over-engineered for what it appears to be. It stops looking that way once you see which part people pay for. The game is not the product being sold. It is the distribution channel for the engine underneath it.
| Revenue line | What it is | Scales with | Regulatory weight |
|---|---|---|---|
| SQE Insight | Subscription to projections, valuations and player tips from the prediction model | Serious users | None |
| Rewarded video | Coins earned by watching ads in the mobile client | Daily actives | None |
| SB Coin sales | Buying paper currency outright to hold more positions | Committed spenders | Carries it |
Rewarded video and coin sales are live in the current build. SQE Insight is built but not yet switched on, which is the deliberate order: a subscription needs an audience that has already felt the difference good data makes, and creating that audience is precisely what the free tier is for.
The free tier does two jobs at once. It acquires users at close to zero marginal cost, and it demonstrates the value of the data by letting someone feel the difference between a good call and a guess — a far better argument for a projections product than any landing page. The players who take that seriously are precisely the ones who will pay for a sharper edge.
It is the structure a broker uses: give away the trading, sell the research. The most expensive component to build and run is also the one with the highest margin and no regulatory exposure — which is why it, rather than coin sales, is designed to carry the business.
Coin sales pull against the leaderboard — and that one is live. Because coins can be bought, a spender can hold more positions than a sharper player and win on absolute value. The clean answer is to rank on percentage return rather than portfolio size — the right metric for a scouting game regardless, since it compares differently-funded accounts fairly and makes the ranked competition measure judgement rather than budget.
The house will sell the picks. Once SQE Insight switches on, the platform runs the market, takes a rake on head-to-head, and sells the projections. That combination is legal, but a sophisticated user will notice it, and the incentives sit more comfortably if the subscription is priced as a data product rather than as an edge over other players. Naming it is better than waiting for someone else to.
The first tension is live and worth solving now; the second is far cheaper to design around before the subscription launches than to retrofit afterwards. And when it does launch, the number that matters is conversion from free play into paid — the first one an investor will ask for, and the one this entire free-to-play build exists to generate.
The instinct when compliance blocks you is to strip the ambitious layer out and ship something smaller. The better move was to keep the whole engine and switch off only the regulated edge — settlement. Because every user still holds a real smart account and every coin movement is logged against it, the route back to real money is a reconnection rather than a rebuild. Deferring is cheap; deleting is not.
Almost every significant decision here came from an external wall rather than a technical taste: image rights forced indexing on data instead of likeness, app store policy forced the crypto surface out of the client, liquidity cost produced the agent fleet, and a fixed API quota shaped the polling architecture. Architecture derived from constraint is more defensible than architecture derived from preference, because the reasoning survives contact with someone who disagrees with you.
The pricing model is deliberately wrong. Tripling the performance term makes price action entertaining at the cost of valuation accuracy — correct for a game, indefensible for a market. Being explicit about which of those you are building stops you optimising a model against a metric nobody in the product actually cares about.
Load testing was expected to expose a socket or container limit. It exposed the external data quota instead. On a self-funded build the binding constraint is usually economic rather than computational, and optimising the wrong layer is the easiest way to spend weeks buying nothing.
StockBaller started as a real-money athlete market and became a free-to-play game, and the interesting part is that almost nothing was thrown away in between. Compliance and capital turned out to be architectural problems rather than dead ends: separate the consumer experience from the settlement layer, and you can ship to mainstream football fans on an email login while every one of them quietly holds a real smart account over an ERC-1155 core that stays portable across EVM chains.
What exists today is a live free-to-play app with two horizons running on one currency, a quant engine pricing athletes off real match data, and a market kept liquid by a hundred autonomous agents — validated across a full simulated season and producing a live spread wide enough to prove the stakes are real. What comes next is an audit, a licence, and a controlled test of whether skill beats chance in this market. Each is a known step rather than an open question, which is the entire point of building the evidence machine before building the market.
Built for: Performance Tokenisation (RWA 2.0) — Sports Data & Telemetry | Hybrid Web2/Web3 Infrastructure | Prediction Markets
Live Platform: stockballer.app
Technologies: React, Node.js, NestJS, TypeScript, Socket.io, React Native (Expo), Python, Google Cloud Run, MongoDB, Railway, Solidity, Hardhat, ERC-1155, Openfort, Chainlink CRE
Contact: contact@stockballer.app — for system code review or architectural consulting