Design System · v1 · Phase 1 of 3

Osbert - a system for hospitality.

Revenue recovery infrastructure for local venues. This document defines every token, component, and tone of voice that powers the product. Warm, considered, commercially sharp - built so an operator opens it on a Tuesday morning and thinks "this gets it."

The Single Most Important Principle

Make recovered revenue impossible to miss.

$4,820
Recovered this week
01   Colour

A warm room, not a dashboard.

Cream is the calm workspace. Charcoal carries authority. Green signals money recovered - and only that. Amber asks for attention. Red is reserved for customer recovery. No saturated chrome, no electric SaaS blues.

Core · locked palette
Warm Cream
#F5F1E8
Main app background. The room the operator sits in.
Charcoal Black
#141414
Navigation, primary text, headings, the major numbers that aren't revenue.
Revenue Green
#1F6B45
Recovered revenue, primary CTAs, returned customers. Earned, not decorative.
Supporting UI
Card Cream
#FBF8F2
Soft Border
#D8CFC1
Muted Text
#6B675F
Attention Amber
#C9822B
Recovery Red
#9E2F2F
Derived tints & states
Cream / Hover
#ECE5D5
Cream / Sunk
#E4DCC8
Green / Hover
#174F33
Green / Tint
#EAF1EB
Amber / Tint
#FBEFD5
Red / Tint
#F4DEDB
02   Typography

Editorial warmth, operational clarity.

Newsreader gives the brand its hospitality voice - a contemporary serif that feels at home on a printed menu. Figtree is the operator's font: clean, humanist, unflinching at small sizes. JetBrains Mono carries the numbers - revenue is the hero, and it needs to land with weight.

DisplayNewsreader · Hero stats, marketing
$4,820 recovered
64px / 100% / -2.5%
weight 400
H1Newsreader · Page titles
Opportunities this week
40px / 108% / -2%
weight 500
H2Newsreader · Section heads
Customers worth bringing back
30px / 115% / -1.5%
weight 500
H3Figtree · Subsections, card titles
Recent grievances
20px / 130% / -0.5%
weight 600
H4Figtree · Block titles
Customer context
16px / 135%
weight 600
Body LargeFigtree · Lede paragraphs
Sarah hasn't booked in eight weeks. Her average spend is well above your venue median - worth a personal note.
17px / 155%
weight 400
BodyFigtree · Default UI prose
A regular is someone who comes back. Someone who is known. Someone who matters to a venue. The product honours that.
15px / 155%
weight 400
Body SmallFigtree · Helper, in-table secondary
Drafted Tuesday at 9:14am. Awaiting your approval before send.
13px / 150%
weight 400
LabelFigtree · Table heads, eyebrow
Estimated Value
11px / 140% / +8%
uppercase · weight 600
CaptionFigtree · Timestamps, fine print
Last visit 8 weeks ago · party of 2
12px / 140%
weight 400
Mono ValueJetBrains Mono · Inline figures
$1,240.00 · 14 covers · 87% open rate
18px · tabular nums
weight 500
Mono DisplayJetBrains Mono · Hero figures
$4,820
56px / 100% / -4%
weight 500 · tabular nums
03   Space, radius, light

Generous, soft, never bubbly.

A 4-pixel base with named tokens for the common moves. Radii get more generous as a surface gets more pill-like - buttons sit at 10px, badges at full pill, cards at 14px. Shadows are tinted warm - never cold grey - so depth still feels like the room.

Spacing scale · 4px base
4 · xs
--s-1
8 · sm
--s-2
12
--s-3
16 · md
--s-4
20
--s-5
24 · lg
--s-6
32
--s-8
40 · xl
--s-10
48
--s-12
64 · 2xl
--s-16
80
--s-20
96 · 3xl
--s-24
Radius scale
4pxinputs · table rows
6pxsmall chips
10pxbuttons
14pxcards · panels
20pxlarge panels
pillbadges · tags
Warm-tinted shadows
Subtle
Cards on cream
Medium
Modals & dropdowns
Strong
Overlays
Layout widths
1200px
Dashboard content
1080px
Marketing page
520px
Narrow form / modal
04   Iconography

One line weight, one library.

Every icon in Osbert comes from Lucide (lucide.dev) - a single stroke-drawn set rendered at a 2px line weight in currentColor. Icons mark actions, states and places - never decoration. In the app they render exclusively through the shared <ob-icon> component, which owns the registry: if an icon isn't registered there, it isn't in the product.

Registered set · lucide.dev
house
list
file-pen-line
heart-pulse
users
users-round
message-square-warning
messages-square
settings
plug
circle-check
circle-alert
circle-x
info
upload
cloud-upload
plus
refresh-cw
loader-circle
arrow-left
arrow-right
log-out
Sizes
13 · --icon-sm
buttons · inline text
16 · --icon-md
default · nav · alerts
24 · --icon-lg
empty states
48 · --icon-hero
result screens
Rules
Stroke, never fill.2px line weight at every size. No filled, duotone or emoji variants - one voice.
currentColor only.Icons inherit the colour of the text beside them. Never give an icon a colour its label doesn't have.
Through <ob-icon>, always.Feature code never imports Lucide directly. New icons are added to the registry in shared/components/icon.
05   Buttons

One green action per screen.

Primary is reserved for the moment that earns revenue: Approve, Connect, Save. Secondary carries everything else. Ghost lives in tables and rows. Destructive earns its red.

Default
Hover
Focus
Loading
Disabled
Primary
Secondary
Ghost
Destructive
Sizes & variants
06   Forms

Quiet inputs that get out of the way.

Operators read fast and type carefully. Inputs are warm-grey by default, lean charcoal on hover, and earn a green focus ring only when they're active. The textarea matters most - it is where a message gets edited before it goes out.

We'll show this in the From line.
Required before drafting messages.
Edit freely. We'll learn your preferences over time.
Auto-approve trusted drafts
Send without review when confidence is high.
Include grievance recovery
Surface flagged customers in your weekly review.

07   Status badges

The colour-coded language of the queue.

Operators scan these constantly. Each status earns a colour for a reason - amber moves toward action, green walks the journey from approval to return, red flags the careful work, neutral steps back. The strongest treatment is reserved for the moment a customer comes back.

Ready
Opportunity identified. Awaiting first draft.
Draft Ready
AI draft generated. Operator review required.
Approved
Venue has approved. Queued to send.
Sent
Message has gone out. Waiting on the customer.
Returned
Customer rebooked. Revenue recovered - the win.
Skipped
Operator chose to skip this opportunity.
Needs Care
Grievance customer flagged. Careful tone required.
Contacted
Grievance customer has been reached out to.
Resolved
Grievance closed out. Relationship repaired.
BLOCKING
Internal - open decision blocking progress.
08   Data display

The hero stat, the dense table, the empty room.

The Revenue Recovered card is the centrepiece. Tables are quiet by default and earn their hover. Avatars warm up customer records without being clinical. Empty states encourage - they never feel broken.

Hero stat card
Recovered this week
$4,820
↑ 38% vs last week from 7 returned regulars
Customers brought back
7
this week
Open opportunity
$11,400
14 awaiting review
Needs care
3
customer grievances
Table - default · hover · selected
Customer Last visit Avg spend Est. value Status
SM
Sarah Mendez
14 visits · party of 2
8 weeks ago $92 $184 Draft Ready
JR
James Rourke
First visit · 10 weeks ago
10 weeks ago $48 $96 Approved
EO
Emma O'Brien
6 visits · usually Friday
3 weeks ago $140 $280 Sent
TF
Tom Fielding
22 visits · big spender
2 weeks ago $210 $420 Returned
PL
Priya Laksmi
Complained · party of 4
1 week ago $68 $136 Needs Care
Avatars - warm, characterful initials
SM
JR
EO
TF
PL
AM
DK
RT
SM
JR
EO
Empty state
ø

No opportunities right now.

Quiet weeks happen. Check back after your next busy period - we'll surface regulars worth reaching out to.

09   Alerts & toasts

Calm, not alarming.

A toast should feel like a colleague leaning in to mention something. Alerts carry more weight but never shout. Each variant uses the smallest hint of its semantic colour against a cream surface.

i

3 customers are eligible this week.

We'll prepare drafts once you've confirmed your outreach tone in Settings.

Sarah M came back. $70 recovered.

The message you approved on Monday brought her in last night. Nice one.

!

POS sync paused 18 hours ago.

We're still showing data, but it's slightly stale. Reconnect Square to get back on track.

!

Emma's draft references a complaint.

This customer left a 1-star review last month. Switch to grievance tone before sending.

Toast notifications
Approved. Ready to send.
3 messages will go out at 10am tomorrow.
!
Draft saved - not yet sent.
Approve when you're ready.
!
Couldn't reach Stripe.
Trying again in 30 seconds.
10   Navigation

Charcoal sidebar, cream room.

The sidebar wears the brand's authority colour so the workspace beside it can breathe. Active items earn a soft green tinge and a thin accent stripe - the only place the colour appears in chrome.

11   Opportunity row

The repeating unit of the product.

The Opportunities list is what an operator returns to every morning. Each row pairs a known customer with a quantified ask and a clear next action. Opportunity type is signalled by a quiet vertical accent - not a heavy icon. The estimated value is mono and right-weighted; the badge is the eye-catch.

Customer
Opportunity
Last visit
Est. value
Status
SM
Sarah Mendez
14 visits · regular
Lapsed regular
8 weeks ago
$184
Draft Ready
JR
James Rourke
First visit · party of 2
First-visit follow-up
10 days ago
$96
Ready
TF
Tom Fielding
22 visits · big spender
High-value lapsing
5 weeks ago
$420
Approved
EO
Emma O'Brien
6 visits · Fridays
Birthday week
2 weeks ago
$140
Sent
12   Message draft panel

The approval moment.

Two columns: the message on the left, the customer's story on the right. The Approve button is the only green CTA. Edit, Send Test, Skip and Mark as Sent sit in calmer treatments. The whole panel should feel considered - never rushed.

From
Marco · The Wilder <hello@thewilder.co>
To
Sarah Mendez <sarah.m@gmail.com>
Subject
It's been a little while, Sarah

Hi Sarah,

It's been a little while since we've seen you - we noticed you haven't booked in for about eight weeks, and your usual Friday table has been on our minds.

This week is a great one to come back: we've just put a new tasting menu on, and your name is at the top of my list. If you'd like, I can hold a 7pm spot for you on Friday.

- Marco

13   Grievance card

A different emotional register.

A grievance card is not an opportunity card with a red badge - it has its own treatment. The accent is a single thin red rule on the left; the customer's words sit in a quiet quoted block to remind the operator a person wrote them. Actions are quieter - nothing is "approved" here, it's offered.

PL
Priya Laksmi
Needs Care Party of 4 · 1 week ago

"Service was extremely slow and our mains came out cold. We waited 40 minutes for water. We had been looking forward to this dinner for weeks."

From Google review · 2 stars · est. value to recover $140
TM
Tom Mercer
Contacted Booking issue · 3 days ago

"I had a reservation at 8 and was told there was no record of it when I arrived with my partner."

From email · awaiting reply · draft sent Tue 14:02
JD
Jamie Devine
Resolved Came back as our guest · last Saturday

"Honestly, I appreciated the message. We'll be back."

Relationship repaired · $210 recovered
14   Motion

Considered, smooth, never flashy.

Animation reduces friction and guides attention. It never performs. The dashboard's revenue counter is the one allowed moment of delight - a deliberate count-up that lets the operator feel the win.

Duration scale
Instant
0ms
state flips
Fast
100ms
hover · press
Normal
200ms
toggles · tabs
Slow
300ms
modals · sidebars
Deliberate
400ms
stat counter
Easing curves
Standard
cubic-bezier(0.32, 0.08, 0.24, 1)

Default for hover, focus, colour change.

Entrance
cubic-bezier(0.16, 0.84, 0.44, 1)

Toast in, modal open, stat reveal.

Exit
cubic-bezier(0.4, 0, 0.6, 1)

Toast out, modal close, dismissals.

Stat counter - the one moment of delight
Recovered this week
$0

On dashboard load, the revenue figure counts from $0 to its true value over 1400ms with deliberate easing. It happens once per session. Never on re-renders.

Specific component motion
Table row hoverBackground fade - Fast (100ms) · Standard easing. No transform.
Button pressInstant background shift, 0.5px down. No bounce.
Badge state changeCross-fade colours over Normal (200ms). Never resize.
Sidebar collapseWidth animates Slow (300ms) with Standard easing.
Toast entrance/exitSlide 12px from right + fade · Normal in, Fast out.
Modal open/closeBackdrop fades Slow; modal scales 0.98→1 + fades · Entrance easing.
15   Voice

Three voices, one venue.

The product writes on behalf of the venue - so tone is a feature, not a style guide. UI speaks like a capable colleague. Standard outreach is warm and unhurried. Grievance recovery is careful, human, and never automated-feeling.

i

Product UI

How the interface speaks to the operator. Smart, warm, direct. Like a colleague who knows the industry.

EMPTY STATE
No opportunities right now - check back after your next busy period.
AFTER APPROVAL
Approved. Ready to send when you are.
REVENUE EVENT
Sarah M came back. $70 recovered.
BLOCKING DECISION
We need a couple of answers before we can start. No rush - just flag these with your team.
w

Standard outreach

Default tone for re-engagement. Warm, genuine, no pressure. The venue speaks for itself.

LAPSED REGULAR
Hi Sarah, it's been a little while since we've seen you. We'd love to welcome you back - this week is a great time to book in.
FIRST-VISIT FOLLOW-UP
James, your first visit meant a lot to us. We hope to see you again soon.
r

Grievance recovery

Carefully different. Human, apologetic where appropriate. Never salesy. Must feel like a real person wrote it.

RESPONSE TO A COMPLAINT
Hi Emma, I wanted to reach out personally about your recent experience with us. What you described isn't the standard we hold ourselves to, and I'm sorry.
MAKING IT RIGHT
Tom, I heard about the issue with your booking last week. I'd love the chance to make it right - please let me know if you're open to coming back as our guest.
Tone rules - at a glance
Always
  • First-name address
  • One clear ask per message
  • Specific, not generic ("Friday at 7" not "soon")
  • The venue's actual signature
Never
  • Exclamation marks (except in success toasts)
  • Marketing words: "exclusive", "limited", "miss out"
  • Emoji in any outbound message
  • "Dear" or "valued customer"
Sometimes
  • A specific menu reference (if the operator opted in)
  • "Your usual" - if the customer has one
  • A held table offer - for high-value regulars
  • An apology - only in grievance flows