obOB STUDIO
← All works
game★ flagship

Apex Grand Auctions

Bid, build, and bankroll a supercar empire.

Loading Apex Grand Auctions

Tip: click Fullscreen for the best experience.

The fifteen-second clock

Every lot in Apex Grand Auctions runs the same way. A car from the 100-car database comes up, the reserve is set at 40 percent of its book value rounded down to the nearest thousand, and a 15-second clock starts. Eight AI collectors each get one chance per second to raise you. Your side of it is three buttons. +$10,000, +$50,000, +$100,000. Plus a number field for anything larger. Every bid pushes the clock back up, though never past 15, so a lot can run well past its nominal time if two bidders both want it. Four seconds after the hammer, the next car loads.

Read the build notes ↓

About this project

A car-tycoon simulation: bid against AI rivals for 100+ procedurally generated supercars (each a rotating 3D model rendered on a 2D canvas), then run a garage, workshop, and factory. Local hot-seat multiplayer and fully synthesized audio via the Web Audio API.

Built with

JavaScriptCanvas 2DWeb Audio API

How to play

Drag on the car
Spin the wireframe model with a mouse or a finger; it goes back to auto-rotating the moment you let go.
🔄
Cycle the auction viewer's spin speed between normal, fast and stopped.
🎨
Toggle the neon glow around the wireframe lines on and off.
+$10,000 / +$50,000 / +$100,000
Raise the current high bid by that amount and push four seconds back onto the clock.
Custom bid field + PLACE BID
Bid any amount above the current high bid, which adds five seconds to the clock.
Top nav buttons
Switch between the six screens: Live Auction, Encyclopedia, Garage & Loans, Workshop, Car Factory and Leaderboard.
Player pills (header)
Hand the seat to another human player in a 2-4 player hot-seat game, which swaps the balance, garage and factory shown.
Click a car card / 🔍
Open the inspection modal, with its own rotating wireframe, full specs and the generated history text.
PLACE BLIND BID / PASS AUCTION
Answer the sealed-container event with a single secret number, or walk away, inside a 25-second countdown.
RESET PROGRESS
Wipe every player's money, garage, loans and factory after a confirmation prompt and reopen the lobby.

Build notes.

The fifteen-second clock

Every lot in Apex Grand Auctions runs the same way. A car from the 100-car database comes up, the reserve is set at 40 percent of its book value rounded down to the nearest thousand, and a 15-second clock starts. Eight AI collectors each get one chance per second to raise you. Your side of it is three buttons. +$10,000, +$50,000, +$100,000. Plus a number field for anything larger. Every bid pushes the clock back up, though never past 15, so a lot can run well past its nominal time if two bidders both want it. Four seconds after the hammer, the next car loads.

The estimate box lies on purpose. The game takes the car's real value, shifts it by up to 25 percent in either direction, and then shows a ten percent band around that shifted number. Overpaying is meant to be possible.

Drawing cars without a 3D engine

There is no WebGL here and no three.js. One class holds 18 hand-placed vertices. Floor pan, hood line, roof, trunk, four wheel hubs. Rotates them around Y and then X, and projects them onto a 2D canvas with a factor of 280 divided by (6 + z). The wheels are circles drawn at the transformed hub points and scaled by depth. The floor grid runs through the same projection at a fixed height.

There are three body shapes, not 100. Coupe, GranTurismo and Hypercar differ in roof height, cabin length and trunk height, and the hypercar gets two extra vertices for a rear spoiler. Which one you see is picked from the car's own numbers: over 240 mph gets the hypercar, over 1500 kg gets the GT. Line colour comes from rarity. Gold for Legendary, red for Exotic, green for Rare, cyan for everything else. The encyclopedia and garage cards are just an emoji; the live wireframe only shows up on the auction stage, in the inspection modal, and in the workshop preview.

Eight rivals, and the bit of them I got wrong

The rivals have budgets from $900,000 to $12,000,000 and an aggressiveness value from 0.35 to 0.85. Aggressiveness does two jobs: it sets how often a bidder acts on any given second, and how far over book value they will chase a car. On top of that each one has a taste rule. Whale Winston pays a 25 percent premium for Legendary and Exotic. Vintager Victor wants anything built before 1980. Drift Ken wants over 600 hp. Modder Max only cares about Junk and Common.

The part I got wrong is an earlier taste system that is still sitting in the code. Each rival also carries a style string. "Hyper", "Sports", "Muscle" and so on. Which gets compared against the car's rarity. The rarities are Junk, Common, Rare, Exotic and Legendary. Only "Junk" overlaps. Modder Max is the one bidder that check ever fires for; every other rival falls straight through to a 40 percent coin flip. The named rules carry all the actual personality.

Two things that took longer than they should have

The rivals used to re-top every player bid inside the same second, which made bidding feel pointless. You clicked +$50,000, and half a heartbeat later Whale Winston was back on top. The fix is four lines: while a player holds the high bid, each NPC skips its turn 60 percent of the time. You get a breath, and it reads as hesitation rather than as a handicap.

The encyclopedia grid has a card entrance animation, and the grid re-renders on every keystroke in the search box. So all 100 cards replayed their rise-in on every single letter typed. It was horrible to look at. The grid now sets a flag on itself after the first mount and never plays the animation again.

Dragging the car to spin it uses pointer events with touch-action switched off on the container, so on a phone the drag rotates the model instead of scrolling the page out from under you.

What to try

All the sound is synthesised at runtime. There are no audio files anywhere in the project. A bid is a sine wave sliding from 600 to 1200 Hz over a tenth of a second. A sale is a four-note C major arpeggio. The last five seconds of a lot tick at 200 Hz while the timer circle goes red.

The workshop is the one place where the maths is entirely in your hands. A custom build costs a flat $2,500,000, and the car it hands back is valued at 2,500,000 plus $300 per horsepower minus $200 per kilogram. Push both sliders to 1800 hp and 800 kg and you get a $2,880,000 car. Push them the other way and you have paid two and a half million for something worth less than that.

Nothing is saved. Refresh the page and you are back at $1,000,000 in an empty lobby with the setup screen asking how many of you there are.