Brand book
The design system behind agencyoperator.ai: the product you sign in to, and the Claude plugin that came before it, for designers who work for themselves. Tagline: Keep your campfire warm.
Agency Operator looks like Vercel's dashboard, on purpose: white cards on a light grey ground, flat, hairline borders, small type, one typeface, black buttons, no shadows. Monochrome: nothing is coloured unless it is a state or the Claude badge. It used to wear the Designer Mindset brand's orangered and big soft blocks; as of 23 September 2026 it has its own identity, and designermindset.net keeps the orange. If a page here looks loud, big or soft, it is wrong.
It covers two surfaces: the marketing pages and the members' product behind sign-in. They share the brand and differ in density, radius, navigation and states. surfaces.md says which is which, and which components belong to which. Read it before adding anything.
Content fundamentals
The words do more selling than the visuals. These rules were set through a lot of iteration and are not optional.
- Plain language, about grade 3. Short sentences, short words. Check with Flesch-Kincaid before shipping, not by eye. The live site scores 2.7 to 2.9.
- No em dashes. Use a full stop, a comma or a new line.
- Money as
$100K+, never $100,000. The one exception is a panel where the digits are the point. - "You" means designers who work for themselves: freelancers, solo designers, small studios. Say it, do not imply it.
- It is the business side of a design business. Getting clients is the first piece, not the whole thing.
- Contact, never chase. People are kept warm, not hunted.
- Show a portion, not the whole thing. Crop tables with a fade, blur the rest. The full walkthrough lives in the community.
- Never publish how it works inside. Describe what it does, never paste its instructions.
- Do not overclaim. The morning note names three people at most, so nothing may promise more. Earnings examples are labelled "examples, not promises".
Good: "Designers do not lose clients. They forget them."
Bad: "Leverage AI-powered pipeline automation to maximise revenue."
Visual foundations
Colour. There is none, on purpose. ink on page for text, muted for everything secondary. accent exists as a name and it is ink: the primary button, the active tab, bullets, step numbers. dark is the one dark surface a page may have, the closing callout. The only things that carry a hue are states, danger, warning and green, and the Claude badge. If you reach for a colour to make something matter, use weight or a border instead.
Separation. The hairline, border (#eaeaea), does the work that fills and shadows used to. Every card is page white with a 1px border. soft is for hover and quiet backgrounds only, never a card fill.
Ground. The product behind sign-in sits on canvas (#fafafa), a light grey, and every card, table and the header are white on it. That is Vercel's dashboard. Only headings and their one-line subs sit straight on the canvas; anything in a box is a white card, never a grey one, because grey on grey vanishes. Marketing pages stay on page white.
Claude colours are borrowed, not ours. claude, claude-tint and the claude-ink family only appear in the "Runs inside Claude" badge and strip. They signal the platform. They are never used as Agency Operator's own accent.
Dark. The product has a dark theme; members pick System, Light or Dark in the header or on Settings, and System is the default. It is the same system with the lights off, not a second brand: canvas goes to a soft black (#0a0a0a, not pure black), cards go one step up to page #111111, the hairline is #333333, and ink becomes a light grey. accent is still ink, so the primary button turns light, and its text is on-accent, never a hard-coded white. The states lighten so they still pass on dark. Marketing pages have no dark theme and stay white.
Type. One family, Geist, for everything; Geist Mono for code. The scale is anchored to 14px body, as Vercel's is, and it is small: 24 page title, 18 section, 14 card title, 28 for a metric number. Weights 400, 500 and 600, never 700. Labels are sentence case and untracked; nothing is uppercase. Marketing's hero may go to 32px and no further.
Shape. Rounder than Vercel, on purpose. radius-md (10px) for buttons, inputs, nav items and the board's cells; radius-card (14px) for cards, tables and panels. Only status pills, the Claude badge and progress bars are fully round. The nav is flat and square. Always the token, never a pixel value: the whole scale moved once already and nothing should be left behind next time.
Depth. None. There are no shadows anywhere; the shadow tokens resolve to none. Focus is drawn with outline, not box-shadow.
Space. Tight. Cards pad 16 to 20px, grids gap 12px, sections open with 32px above.
Layout. A flat white top nav with a hairline bottom edge, over the canvas, then the main column. In the product, one gutter sets the space from the browser edge to both the nav and the content, so the wordmark lines up with the cards: space-12 (48px) on desktop, space-8 (32px) under 1024px, space-4 (16px) under 640px. When the tabs don't fit, the nav scrolls sideways on its own; it never pushes Sign out off the screen or scrolls the page.
Iconography and marks
There is no icon set. Meaning is carried by small shapes in ink: 4px dots as list bullets, a 2px underline on the active nav item, numbered 24px discs on a hairline rail for steps.
There is no Agency Operator logo. The site uses a type-only wordmark, "AgencyOperator" in ink with ".ai" in muted, set in the wordmark style. The Claude and Notion marks on the site belong to those companies and are not part of this system.
Accessibility notes
The product tokens added later were picked to pass rather than to match: danger is deeper than a stock red and warning deeper than a stock amber so both clear 4.5:1 on page, on soft and on their own tint. field-border is the lightest grey that clears 3:1 on both grounds, because border and rule sit near 1.2:1 and vanish as a control edge.
Going monochrome removed every pair that used to fall under AA. accent is ink at 19.8:1, so white on the primary button and accent as text both pass by a mile, and green was deepened so the Shipped pill clears 4.5:1 on its own tint. There are no flagged exceptions left. Keep it that way: a new colour has to pass on every ground it is used on, or it does not go in.
Two surfaces, one brand
This system covers two things that look related and behave differently: the marketing pages (designermindset.net, the agencyoperator.ai site, campaign and landing pages) and the product, the members' web app behind sign-in.
It was built from the marketing stylesheet first, so for a while it only described half of what it claimed to. This page says which half is which, so the question does not have to be argued again.
What never differs
These are the brand. If a surface changes one of them, the surface is wrong.
- The neutral ramp:
ink, page, soft, muted, dark, on-dark. There is no brand colour. accent is ink. - Geist, for everything.
- Buttons are rounded rectangles at
radius-md. Only status pills and the Claude badge are pills. - Cards are white with a hairline border. No fills, no shadows.
- One primary action per view, and one dark surface per page at most. Nothing is coloured unless it is a state or the Claude badge.
- Claude's colours belong to the "Runs inside Claude" moments and are never ours.
- The content rules in the README. They apply to every word on both surfaces.
What legitimately differs
Density. Marketing gets one rung more room: a 32px hero, space-10 between sections. The product is dense: body-sm and caption carry most of it, space-3 and space-4 between things. The type scale is small on both.
Ground. The product sits on canvas grey with white cards on it; marketing sits on page white. Cards are white with a hairline on both, so a card looks the same wherever it lands.
Theme. The product has a dark theme as well as the light one; marketing is light only. Every token has a dark value, so a component that uses tokens and never a literal colour works in both without a second look.
Radius. The same everywhere: radius-card (14px) for anything bigger than a button, radius-md (10px) for the button itself. radius-block exists as a name and equals the card.
Navigation. Marketing uses a floating 268px sidebar against a 920px column, which suits a long page you scroll and jump around. The product has three destinations and uses a floating top bar. The *arrangement* is a surface decision. The *treatment*, flat with a hairline bottom edge and an underlined active item, is the brand and is shared.
States. Marketing has almost none: a hover, a visited link. The product needs focus, disabled, invalid, empty and loading on nearly everything. focus-ring, field-border, danger and warning exist for the product and mean nothing on a marketing page.
Which components belong where
| Group | Components | Surface |
|---|
| Actions | Button, Callout | Both. Callout leans marketing. |
| Content | Metric, Panel, StepFlow | Both. StepFlow is marketing in practice. |
| Navigation | NavItem, WeekStrip | NavItem both, arranged differently per surface. WeekStrip is product: it heads any page that shows one week at a time. |
| Status | Pill | Marketing. Its statuses are a public roadmap. |
| Brand | ClaudeBadge | Both. |
| Forms | Field, Textarea | Product. |
| Data | Table | Product. |
| Feedback | Alert | Product. |
| Teach | HowItWorks, SidePanel | Product. HowItWorks on every page that computes something a member sees; SidePanel for the reasoning behind a thing on the page, opened from the thing itself. |
A component's group is set on the first line of its preview.html, in the @dsCard comment. That is the only place it lives.
When you are about to add something
Ask which surface needs it, then ask whether the other one would want it too. If both, it belongs in a shared group and its guidelines say how density changes between them. If one, put it in that surface's group and say so in its card. Do not build the same thing twice under two names. That is how one system quietly becomes two.