How I built a launch directory that runs like a race season

Two days, one Rails base I already had, three.js on the front and Blender scripts behind it: a Product Hunt-style directory with a grid, a podium and a rule that paying never moves you up.

6 min readBuild logs

LaunchGP is a launch directory where every product is a car. A weekly Grand Prix ranks launches by votes on a 3D track, a permanent Endurance mode ranks products by traffic, verified revenue and maker activity, and a podium earns a dofollow link. I built the first version in two days on a Rails base I already had, with three.js in the browser and Blender scripts generating the cars. The rule that shaped everything: money buys visibility, never a position.

Why another launch directory?

I had just finished a round of directory submissions for my own products, seven of them, ten or so directories each. Every one worked the same way: a form, a badge for the footer, a page with an upvote button, and a launch day that is over by the evening. The listing is useful for the link. The launch itself is a lottery decided by who has the bigger audience that morning.

I wanted the thing I kept wishing those sites were: a directory with a calendar, where a quiet product can show up every week, where consistency after launch counts for something, and where the people paying for placement cannot buy the result.

Motorsport already has the vocabulary for that. A grid, a race every week, points over a season, a podium, sponsors on the track who are visible and never on the leaderboard.

What does a round look like?

A Grand Prix runs from Monday to Monday. The grid has 32 cars: six front slots that are sold for the week, six seats kept for pass holders, and twenty free seats. The running order during the week is the vote count, nothing else. When the flag drops, the top ten score points and the first three stand on a podium.

Seats How a car gets one Its link during the week
P1 to P6 Bought for that week, no badge needed sponsored
P7 to P12 Reserved with a Season or Month Pass dofollow once the badge is verified
P13 to P32 Free, with the LaunchGP badge on the site dofollow once the badge is verified

The podium is where the link comes from. A car on the podium keeps a dofollow link from LaunchGP for good. A free car gets one during its race week. A paid slot links with rel="sponsored" the whole time, because it is a paid link, and I did not want to pretend otherwise.

After its Grand Prix, a product moves into Endurance: a permanent circuit where distance comes from traffic, verified revenue and the maker's own activity, in classes by revenue range so a new product is not racing a ten-thousand-dollar one. The top ten of each class hold a dofollow link while they hold the spot. Launch week is one day of attention; Endurance is the next year of it.

Which rule does everything else follow?

Money buys visibility, never points, positions, distance or class.

That sentence is in the repo's instructions, and most of the design decisions are consequences of it. A front slot starts the car at the front of the 3D track, where the camera lingers, and it needs no badge. It does not move the car up the running order. A car can buy P1 and sit seventh all week, and nothing is wrong: the order is by votes.

Sponsorships are the same. A round can be named ("Round 3 · Sponsored by ..."), the gantry over the start line has two banners, the circuit has eight billboards, and the Endurance track sells a footbridge and a Ferris wheel hub by the month. Picking a sign on the sponsor page flies the camera to it and outlines it, so the buyer sees exactly where their logo lands. None of it touches a classification.

Votes have rules too, from day one: an account is required, new accounts count after twenty-four hours, one network counts once per car, and vote swaps between makers on the same grid are voided. Fair play is cheaper to build on day one than to bolt on after the first argument.

How are the track and the cars made?

The part people ask about is the 3D. Every page with a track is a small vanilla TypeScript module and three.js; there is no React in the project. The Grand Prix circuit, the Endurance circuit and the garage are GLB files generated by Python scripts in Blender from a data file: the track centerline, the grid boxes, the grandstands, the signs and their camera positions all come out of the same script, so when the grid grew from 26 to 32 cars the circuit was rebuilt with one command.

The cars are remixes of low-poly models published under CC BY 4.0 (credited in the footer). The scripts reposition the wheels, add a driver and a helmet, hide a seat in the cockpit, and print the car number on the nose. The livery (stripes, a twin band, a split, an arrow, a wave) is not a texture: a small shader paints the pattern from the car's position, so any colour pair a maker picks works on every model without re-exporting anything.

Each maker has a garage: their Grand Prix car on the left, their Endurance class car on the right, the driver between them, and four frames on the back wall where their screenshots hang. Any image dropped there becomes a 1280×720 JPEG in the browser before it is uploaded.

What did the base save me?

The first version took two days because it did not start from zero. Auth (password, magic link, Google), checkout with Stripe, the blog, legal pages, the newsletter and the ops metrics endpoint came from the Rails base I built for Nexin and reused for Copix and Crush on You. I have written about that fork-and-delete approach in the Copix build log.

The new work was the racing: rounds, entries, votes, points, the finalisation job that runs at lights out and at the flag, the Endurance advance job, the sponsorship catalogue, the badge verification, and the 3D. Prices, slot counts, points tables and class ranges live in one catalogue file, and the code reads from it, so nothing about money is hardcoded in a view.

What did I get wrong on the way?

The first Season Pass was a count: four entries, use them whenever. That sells the same seat twice as soon as two pass holders want the same week. The second version reserves seats: a pass picks its rounds at checkout, each round has six pass seats, and a reservation can move to another round until forty-eight hours before the start. The constraint is in the database now, not in the copy.

The first badge instructions said "paste it anywhere on the page". Makers already have a row of directory badges in their footer, so the badge is now the same 250×54 as the others and the instructions point at that row.

And the first free-car link was dofollow from the moment the car entered. It is now ugc until the badge is verified on the maker's site, and dofollow only after.

Where does it stand?

The directory is open at launchgp.io: free seats for products with the badge, front slots and sponsorships for the week you choose, and a Pit Report by email on Monday, Wednesday and Friday. Per-category Grands Prix are on the list for when there are enough cars to fill them.

If you are deciding where to launch, the comparison in Product Hunt launch for solo founders still applies, and the checklist in how to launch a SaaS is what I run through before every one of my own.


LaunchGP, if your launch deserves more than one morning

A note on fit first. If you have a large audience and one big launch day planned, a directory that spreads attention over a season will feel slow, and LaunchGP will not sell you a better finishing position at any price.

LaunchGP lists your product as a car in a weekly Grand Prix and a permanent Endurance mode. Votes decide the order, podiums and class leaders earn dofollow links, and paid slots and sponsorships buy a place on the track, never on the results.

See LaunchGP

Frequently asked questions

What is LaunchGP?

A launch directory for software products run as a motorsport season. Every product is a car. A weekly Grand Prix ranks launches by votes, and a permanent Endurance mode ranks products by traffic, verified revenue and maker activity. Podiums earn a dofollow link.

How is a launch directory different from Product Hunt?

Same job, listing new products and sending them visitors and a link, but LaunchGP runs on a calendar: one round a week, a grid of 32 cars, points over a season, and a second mode that rewards consistency after launch week instead of one big day.

Can you pay for a better position on LaunchGP?

No. Paid front-row slots and sponsorships buy visibility: a car that starts at the front of the track and a sign on the circuit. The running order and the results come from votes only, and paid links are marked as sponsored.

How long did it take to build?

Two days for the first version, on top of a Rails base I had already built for another product. The 3D track and the cars took most of the second day.

How do free entries work?

Twenty seats per round are free. A free car needs the LaunchGP badge on its site, in the footer next to the other directory badges, and the site is checked again before the round starts.

The software I build and run

Everything on this blog is tested on these first. Each one was built alone, shipped in public and used every day, by me first.

Keep reading