We have turned down more work than we have taken, which is the only reason the work we take gets the room it needs. Everything below is the arithmetic behind that sentence.
Eleven people at one long table: designers, a writer, an editor and one engineer who tells the rest of us when a drawing will not survive contact with a browser. Nothing leaves the room until somebody has argued against it and lost.
No account layer, no handover after the kickoff. The four below are who you meet in week one and who you are still speaking to at launch.
Founder and Creative Director
Principal Brand Designer
Editor and Type Lead
Engineering Partner
Not a timeline of wins. These are the five moments that changed a habit, which is the only kind of milestone worth writing down.
A side practice between two people who kept turning down good briefs to wait for the right one. The first wordmark we drew still hangs above the printer, mostly as a warning.
We stripped our own identity back to black, white and one grey, and the work got sharper for it. Constraint became the house style: structure first, contrast second, decoration almost never.
A ferry operator signed for twelve months and we hired three people to meet it. That was the year we learned to write our process down and to argue in the open rather than over a table.
We stopped handing over flat comps and started handing over rules. The work began outliving the projects that paid for it, which is the only measure of a system that matters.
We capped the year at nine engagements and published the number. Turning work down in public is uncomfortable exactly once, and then it is the easiest thing the studio does.

They argued us out of the project we asked for and into the one we needed. Four years on, the system is still on every hull.
Ida Sundqvist
Managing Director
Worked on
Identity and wayfinding

Two designers have joined us since launch and neither of them needed anyone to explain how the thing works. That is the whole review.
Tomás Ferreira
Founder
Worked on
Packaging system

We expected a design partner and got somebody who ran the launch with us, including the parts nobody enjoys.
Amara Boateng
Editor in Chief
Worked on
Editorial system
Even a half-written one. The version you have not tidied up tells us more than the version you have.
We answer every enquiry ourselves, including the ones we turn down.
A monochrome about page in eight sections: a studio bar navbar, a fact-led statement hero, a studio split with a photograph, a team grid on a soft band, a decade of milestones, an inverted client quote ledger, a two-path closing panel and a footer that lists the studio's addresses.
Composed from 8 blocks. Installing this page installs all of them, plus the pieces and primitives they use.
Built in the Auralis collection.
A monochrome about page in eight sections: a studio bar navbar, a fact-led statement hero, a studio split with a photograph, a team grid on a soft band, a decade of milestones, an inverted client quote ledger, a two-path closing panel, and a footer listing the studio's addresses. Eight blocks, one install.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
npx shadcn add "https://ui.beste.co/page/r/story1?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the page to components/beste/page/story1.tsx and everything behind it: the eight blocks it composes (navbar59, hero148, about63, about60, about62, testimonial45, cta80, footer116) and the button12 and badge7 components they use. Eleven files, no follow-up installs.
The installed file exports story1Demo alongside the page: the exact props behind the preview above. Spread it to get a working page in one line.
import { Story1, story1Demo } from "@/components/beste/page/story1";
export default function Page() {
return <Story1 {...story1Demo} />;
}Each section is a separate prop, so the usual next step is to keep the demo and replace one section at a time.
import { Story1, story1Demo } from "@/components/beste/page/story1";
export default function Page() {
return (
<Story1
{...story1Demo}
milestones={{
label: "Ten years",
heading: "What happened, in order.",
items: [
{ year: "2016", title: "Two people and a rented desk" },
{ year: "2019", title: "First packaging line, first factory visit" },
{ year: "2023", title: "The studio buys the building" },
],
}}
/>
);
}Every prop is the full prop object of the block that renders that section, so anything the block accepts is accepted here.
| Prop | Type | Default | Description |
|---|---|---|---|
navbar | ComponentProps<typeof Navbar59> | – | Studio bar |
hero | ComponentProps<typeof Hero148> | – | Fact-led statement hero |
studio | ComponentProps<typeof About63> | – | Studio split with a photograph |
team | ComponentProps<typeof About60> | – | Team grid |
milestones | ComponentProps<typeof About62> | – | A decade, in order |
testimonial | ComponentProps<typeof Testimonial45> | – | Client quote ledger |
cta | ComponentProps<typeof Cta80> | – | Two-path closing panel |
footer | ComponentProps<typeof Footer116> | – | Addresses and links |
className | string | – | Extra classes for the page's outer wrapper |
| Section | Block | Notes |
|---|---|---|
| Navbar | navbar59 | Sticky for the whole document |
| Hero | hero148 | Leads with facts rather than a photograph |
| Studio | about63 | Copy beside a full-height photograph |
| Team | about60 | Given bg-muted/50 by the page; fill the grid rows |
| Milestones | about62 | Reads as a ledger, so keep entries one line each |
| Quotes | testimonial45 | Rendered on the inverted band |
| Closing | cta80 | Two paths, not one button |
| Footer | footer116 | One column per address |
milestones removes that section entirely rather than rendering an empty one. Three of the eight blocks are about* variants, so dropping one still leaves a coherent page.sticky top-0 z-50 by the page and stays for the whole document, which works because the block carries its own opaque band.dark class, which swaps the theme tokens for that subtree, so the block's own cards, rules and muted labels follow the switch rather than staying light on a dark rectangle.className="bg-muted/50" on the team section after spreading team, so a className passed inside that prop is overridden.navbar59
Editorial single-row navbar — bold wordmark, quiet bold links, and an outline pill CTA. Collapses to a clean full-height mobile menu.
hero148
Photo-free hero that runs a display statement across the full width, drops the paragraph and pill CTAs onto one baseline beneath it, and closes with a ruled four-column row of studio facts.
about63
Image-led about split with a tall portrait, an offset statement heading, supporting copy, mono studio facts, and a seal CTA.
about60
Team section with an eyebrow, big heading, description and CTA above a responsive grid of people cards (portrait image, name, role).
about62
About section with a header and a vertical timeline of milestones on a left rail, each marked by a year, title, and description.
testimonial45
Three testimonials as ruled columns, each led by a grayscale client logo, followed by a large quote and an attribution block that names the person, the role and the project they hired the studio for.