A walkable 3D city that is the stock market — every company is a building, its height is market cap, its windows are today's move. Today you read the market; here you walk through it.
A stock chart is an abstraction you have to learn to decode. A street is not. Profity World turns the market into a city you move through: each company is a tower, the tower's height is its market cap, the colour of its windows is the day's move, and you trade by walking into the building and up to a desk.
The whole argument is one sentence: when the entire street is red, you feel it before you've opened a single chart.
The hardest decision was what not to build. Profity World invents no new economy: it signs into the same Supabase project as Profity, calls the same server-authoritative trade function, reads live prices from the same quote function, and uses the same ranks, currencies, missions and cosmetics. Trade on the web app, walk into the world, and your portfolio is already there — anything else would be two half-games instead of one whole one.
The client is Three.js with two runtime dependencies and no framework, built with Vite. Around thirty ES modules split along clean seams — core (engine, input, palette), world (city, districts, buildings, terrain, arena), market, player, story, ui and net — because a 3D scene without enforced boundaries becomes one unreadable file very quickly.
The arena is multiplayer over Supabase Realtime — presence for who's in the hall, a broadcast every couple of seconds for how they're doing. What's deliberately not on the wire is the round itself and its clock: both are pure functions of the wall clock, so two players agree on the same tape without exchanging a byte.
That isn't an optimization, it's the fairness argument. A round nobody transmits is a round nobody can tamper with, and a hall with no host has nothing to lose when the host closes their laptop. Nothing in that layer writes to a table, which is what keeps arena results from ever touching the real league — and the live score is labeled unverified, because without a server replay it is worth exactly what a scoreboard among friends is worth.
Player-to-player trading of assets or money is the one requested feature I argued against building: alt accounts would move money, farm rank, and forge the leagues within a week. Cosmetics, walk-up duel challenges, profile cards and emotes give the social layer without handing anyone a wire transfer.
After the first broad art pass I sat down and actually played a full session — and it was noticeably worse than the commit log suggested. Seven blockers came out of that hour, and nearly every one had a diagnosis that contradicted the obvious guess:
The recurring lesson, and the one I now check first: when something looks unlit, suspect the surface before the lights. Three separate bugs in that session — the black interiors, the flat grey outer ground, the washed-out skyline — were all geometry or color-space mistakes wearing a lighting costume.
Profity World runs at profity-world.vercel.app — you can walk into the city as a guest, with no install and no account. Ten build phases are shipped, including the arena and story mode, and every fix above was verified by measurement rather than by feel: standable-position sweeps, zone-radius checks, traversal timings.
It's the most technically demanding thing I've built, and the clearest example of the pattern I keep returning to — reuse the backend that already works, and spend the effort on the part the user actually touches.