What is this?

A generator of startups that do not exist. Every page is a company with a name, a slogan, a team, testimonials from satisfied customers in real towns, and sponsors that are themselves generated startups you can click through to.

The number in the URL is the whole thing

Look at the address bar: ?s=8675309. That number is the seed, and the entire page is computed from it. The same seed always produces the same startup — the same colors, the same team, the same jokes — which is what makes a link to one worth sending to somebody. There are a trillion of them.

Try https://restarted.io/?s=8675309, then change the last digit.

People have been collecting the funny ones since 2015. That is why the seeds still mean what they meant then, and why the arithmetic behind them has been reproduced bug-for-bug rather than fixed — several of the “bugs” are load-bearing, and correcting them would quietly repaint a decade of shared links.

Two eras, and the letter picks which one

Every startup can be rendered two ways, and the letter in front of the seed chooses:

Same seed, same startup — same name, same slogan, same people. Only the decade changes. Compare the classic one with the modern one, or use the link at the bottom of any generated page, which swaps eras and keeps the seed you were looking at.

The letter is what keeps both promises at once. A link anybody has shared since 2015 starts with ?s=, and that will always render the design it rendered then; the modern layout got its own letter rather than changing what the old one means. It is also why a first-time visitor lands on the modern one: where you arrive and what an old link does are now two separate questions.

The random number generator is a cautionary tale

There is no random number generator here in any real sense. Every decision on the page — which of 200 photographs, which of 30 typefaces, what shade of green — comes from taking the sine of a number and keeping the digits after the decimal point:

random(seed) = sin(seed) × 10000 − floor(sin(seed) × 10000)

This is a real and widely copied trick, and it is a bad one. A short list of why:

That last point is the reason this version does not call the platform's sin() at all.

Which sin(), exactly

Moving the generator off the browser and onto a server turns a question nobody wants into the only question that matters: whose sine? Get a single bit wrong in the last place and the page still renders — a different company, in different colors, with a different team. Every link anybody shared for a decade would break, and break quietly, looking exactly like a page that had always been that.

So the sine here is not the language's. It is the one Chrome actually used, extracted and carried along. Finding out which routine that was took longer than porting it:

That routine is now here twice. Once translated by hand into the language this server is written in, and once as the original C, compiled in alongside it. Every seed runs through both and the two answers are compared; if they ever disagree, the server says so, loudly, with the input that did it. In the time it has been running, they never have.

The translation is more delicate than it looks, and one detail is worth the digression. The algorithm gets its accuracy by tracking the rounding error of its own multiplications and carrying it along in a second, smaller number. A compiler optimization called FMA — fusing a multiply and an add into one instruction — skips the intermediate rounding step, which sounds strictly better and is instead catastrophic here: the error being tracked becomes zero, the correction terms cancel to nothing, and the extra precision the whole method depends on silently evaporates. Go permits that fusion, and does it on ARM and several other architectures but not on x86-64. So every multiplication is pinned in place, and a test cross-compiles for each of the affected architectures and reads the generated assembly to confirm no fused instruction survived. Which is a long way to go so that a joke about a startup called Sufferhub looks the same on your phone as it did on somebody's laptop in 2015.

Where it came from

Made in 2015 by Mike Bradley and Tiff Zhang, as a joke that got out of hand. It was originally a page of jQuery that rewrote a Bootstrap template in the browser; it is now rendered on the server, ships no JavaScript, and weighs a fraction of what it did. It generates exactly the same startups.

If you are a real company that shares a name with a generated one and would rather not be, there is a list for that — open an issue and the seed will skip your name.

The people are not real either

Nobody pictured on any generated page is a real person. The photographs are generated, and so are the names.

The names come from public name-frequency tables and the faces are generated images of people who do not exist. Each face is paired with names that suit it, which the original did not do — it drew the two independently, so a photograph regularly turned up under a name from the other side of the world.

The 2015 version used photographs of real people, and over the years several of them discovered they had been cast as the founder of a company that does not exist and asked to be taken out. Nobody should have to ask, so they are all gone and nothing here is a photograph of a real person.