Sports platform2026ballerz.com

Ballerz

A basketball league you play with the NFT characters you already own — draft them, simulate the games, read the write-up the next morning.

The client

A community-owned collection of 9,769 hand-drawn basketball characters, each carrying four permanent skill ratings and a team, with a companion set of 20,647 items that can be equipped to them. The holders bought the project outright in 2024 and run it themselves. An earlier site already listed the collection; this build is the game on top of it.

The problem

The collection had every ingredient a sports game needs — 9,769 characters, four rated skills each, 47 team affiliations, an equipment set — and nowhere to use any of it. Owning one meant owning a picture with numbers on it. There was no roster to field, no opponent, no season, no standings, no record that survived last week, and nothing that made one character's stat line matter against another's. Everything downstream of ownership had to be designed and built: a simulation engine that respects the ratings already stored against each character, a league structure to hold it, an identity layer, and enough surface area — catalog, profiles, leagues, arcade, guide — that someone has a reason to open it on a day with no game on.

What was built

01

The arcade intro

A first-time visitor is routed into a seven-screen attract sequence styled as a coin-op cabinet — title screen, where the collection came from, what the four ratings mean, the teams, the equipment, squad building, tip-off. It advances on arrow keys, swipe or the on-screen controls, and stamps a localStorage flag on mount so returning visitors land straight on the dashboard and are never routed back in.

A cold visitor has no idea what any of this is or why four numbers on a character should matter, and a conventional marketing hero would have to explain it in a paragraph nobody reads. Making the explanation the first level of the game teaches the rules in the voice of the product itself.

02

The dashboard

The returning-visitor home page is a single non-scrolling console at desktop widths: a hero card that rotates through recent results every eight seconds, a quick-play panel, a news column of generated recaps, a top-performers carousel that cycles Today / Last 7 Days / All Time, and a persistent score bar for the featured matchup pinned to the bottom edge.

Sports products live or die on whether there is something new when you open them. Fixing the layout to the viewport means every panel is a live surface rather than a scroll position, and the page reads as a scoreboard instead of a marketing page.

03

Browsing 30,000 collectibles

One browser serves both catalogs — 9,769 characters and 20,647 items — from static JSON shipped with the app. Search, sortable stat columns, grid or table layout, and a slide-in filter drawer covering team, role, archetype, rarity and market listing. Filters are URL-synced; picking two teams takes the result set from 163 pages to 8 without a round trip.

This is the collection's front door: someone deciding what to buy and someone deciding who to field both start here. It has to stay instant at full catalog size and let a visitor narrow 30,000 items to a shortlist in three taps.

04

The league map

All 47 teams on one screen — 42 pinned to a US map by their real city, with Alaska projected into a bottom-left inset, plus five special squads in a chip row. Each marker raises on hover with an average-rating and roster-size tooltip and links through to the team. Below it, power rankings sortable by conference, roster size and each of the four stats.

Team affiliation was fixed into every character when it was created, but had never been visible as a league. Putting the teams on a map turns an ownership trait into a standings table people can argue about — and gives all 47 of them a page worth linking to.

05

Every game gets written up

When a match goes final it enqueues a job that generates an illustrated hero image, writes a full sportswriter's account of the game from the box score — leading scorer, shooting splits, plus-minus, game score, how the closing possessions went — lints the copy, and publishes it under a standing byline. The match page carries it alongside a game centre, box score, virtualised play-by-play and team stats.

A simulated game produces a score and a table of numbers, which nobody re-reads. A written recap makes the result a story worth sharing, and gives the league an archive that reads like a season instead of a log file.

06

Play without owning anything

A complete game inside the site, playable without signing in. Five rounds: spin a slot machine for a random team and body type, draft one character from the pool that combination offers, place them in a position slot on the court. Each reel gets one re-roll. The five then run a full 82-game season against the league, and the result comes back as a record, per-game scoring averages, best and worst margin, and a rank title. Signing in puts the run on the all-time board.

It answers 'what does owning one of these actually do' in ninety seconds, for someone who owns none. The constraint is the point — a random team and body each round means drafting around what you are given, which is exactly the decision a real roster owner makes.

07

The wallet is the account

There are no passwords and no user table. Signing in issues a nonce, the visitor signs it in their wallet, and the signature is verified on-chain against mainnet before a seven-day session cookie is issued. Ownership is then checked against the live chain rather than a stored list. Not captured — this flow is behind a sign-in and was described rather than screenshotted, per the capture rules.

The product's whole premise is that your assets are your team, so the asset ledger has to be the source of truth for identity. It also means there is no account database to breach and nothing to store beyond a public wallet address, which is what the sign-in screen tells the visitor in plain language.

Measured

Built with

Visit BallerzNext3KtoGO
MAKE IT
YOURS
Start a project