Deterministic · fictional · reviewed
Every demo needs a company.
None of them should be real.
Complete brand identities — name, industry, tagline, palette, logo — for companies that don't exist. Hand one a handle and you get the same company back every time, forever. No model in the loop, nothing generated at request time, nobody's trademark in your screenshot.
Any string works — it's hashed, not searched. The same string always lands on the same company.
The placeholder problem
Your mockup is full of other people's companies.
Every demo, seed database and screenshot needs companies in it. The usual sources are all somebody's property, or so obviously filler that the work reads as unfinished.
Real logos in your deck
Dropping familiar logos into a customer list implies a relationship you don't have, and puts marks you don't own in front of a client.
Filler that looks like filler
"Acme", "Test Company 3", lorem names with no logo and no colour. The screen reads as a wireframe when you needed it to read as a product.
Fixtures that won't hold still
Randomly-generated names change on every seed run, so screenshots, tests and design comps disagree about what the company was called.
How it works
A handle is a permanent address, not a prompt.
Your handle is hashed to a 32-bit seed. The seed selects a human-reviewed entry from a committed corpus and drives the logo geometry. Nothing is invented at request time.
A corpus, not a model
Every name, industry and tagline was written and reviewed before it shipped. No language model sits in the request path, so nothing surprising can appear in your demo.
The parts match
Palettes are picked within the colour family the company's entry calls for, not at random — so a logistics firm doesn't turn up in yoghurt pastels.
Stable as the corpus grows
Adding companies remaps only a small fraction of handles, and a company's name and logo geometry never change under it. Visual changes ship as a new version, never silently.
Where it goes
Anywhere a screen needs a company in it.
Pass whatever id you already have — a tenant id, a fixture key, a row number — and get a company back.
Dev and staging databases
Seed accounts, tenants and vendors with companies that have logos. Reseed as often as you like; row 41 is the same company it was last month.
Comps, decks and case studies
Customer walls, integration grids, invoice headers, org charts — populated with brands that look considered, because they were.
Screenshots and tutorials
The company in step 3 is still the company in step 9, in every screenshot, on every re-shoot, for as long as the docs live.
The API
Two endpoints. No key.
The whole surface. Give either one any handle string; both are deterministic, and both say exactly how long you may cache them.
/v1/brands/{handle}
The company: name, slug, industry, tagline, description, palette, and the URL of its logo.
Cache-Control: public, max-age=3600
Taglines and descriptions are editorial and can be corrected, so this revalidates.
/v1/brands/{handle}/logo.svg
The symbol as SVG, drawn on an integer coordinate grid so the bytes are identical everywhere.
Cache-Control: public, max-age=31536000, immutable
A company's name and geometry are frozen, so the logo never changes under a handle.
$ curl https://demobrands.dev/v1/brands/acme-42
{
"id": "brand_000007",
"handle": "acme-42",
"name": "…",
"industry": "…",
"tagline": "…",
"palette": { "primary": "#5B4FE9", "secondary": "#20B8A6", "neutral": "#172033" },
"logo": { "symbol": "https://demobrands.dev/v1/brands/acme-42/logo.svg" }
}
Nothing to sign up for
Pick a handle. Keep the company.
It's a URL. Put a handle in it and the same company comes back tomorrow, next release, and in every screenshot you've already taken.
Try /v1/brands/acme-42Synthetic demo assets · 0 real companies · not cleared for commercial brand adoption