Remote Doers / Ocean

Brand Guidelines · v1.0

Remote Doers Ocean

The colour system, type scale and application rules — derived from the live product and measured against it, not sketched alongside it.

PaletteOcean
Primary#1D6FE0
Named colours10
Derived tints53
Scroll
Primary #1D6FE0Ink #08172APaper #FFFFFFHighlight #8FE9FFHover #A9C8FFBadge #FFD98ASecondary #CFF2FFRating #F5A623Canvas #EFF7FFAlt canvas #E4EEFF
01 — Overview

Ten colours,
each with one job.

Every colour is tied to a role in the interface rather than a decorative mood. That is what stops the palette drifting as the product grows — change the value, and everything playing that role changes with it.

Canvas & Paper · 60% Ink · 25% Primary · 10% 5%

Ocean is a light identity. Surfaces do the work; Primary is punctuation, not a field colour. Aim for roughly this split on any given screen.

02 — Core

Primary, Ink and Paper
carry the identity.

Primary

Links and primary buttons

#1D6FE0COPY
RGB29, 111, 224 CMYK87, 50, 0, 12 Token--bk-primary
Ink

Headings, body text, outlines

#08172ACOPY
RGB8, 23, 42 CMYK81, 45, 0, 84 Token--bk-ink
Paper

Cards and reversed text

#FFFFFFCOPY
RGB255, 255, 255 CMYK0, 0, 0, 0 Token--bk-paper
03 — Accents & surfaces

Five accents,
two surfaces.

Accents fill blocks and badges and always carry Ink type on top — all five clear AAA that way. Surfaces are the tinted section grounds that alternate down a page.

Highlight

Slogan chip, feature blocks

#8FE9FFCOPY
RGB143, 233, 255 CMYK44, 9, 0, 0 Token--bk-mint
Hover

Button hover fill

#A9C8FFCOPY
RGB169, 200, 255 CMYK34, 22, 0, 0 Token--bk-pink
Badge

Badges and the stat circle

#FFD98ACOPY
RGB255, 217, 138 CMYK0, 15, 46, 0 Token--bk-yellow
Secondary

Secondary buttons

#CFF2FFCOPY
RGB207, 242, 255 CMYK19, 5, 0, 0 Token--bk-lime
Rating

Review stars

#F5A623COPY
RGB245, 166, 35 CMYK0, 32, 86, 4 Token--bk-star
Canvas

Hero and section background

#EFF7FFCOPY
RGB239, 247, 255 CMYK6, 3, 0, 0 Token--bk-cream
Alt canvas

Alternating sections

#E4EEFFCOPY
RGB228, 238, 255 CMYK11, 7, 0, 0 Token--bk-lilac
04 — Accessibility

Contrast, measured.

Every colour pair the product actually renders, checked against WCAG 2.1. Thirteen pass. Two need attention, and they are called out rather than buried.

Aa Paper on Primary Primary button label, scroll-to-top arrow 0:1 AA
Aa Ink on Canvas Headings on the hero and section backgrounds 0:1 AAA
Aa Ink on Paper Headings on cards 0:1 AAA
Aa Body grey on Canvas Body copy, 18px 0:1 AA
Aa Body grey on Paper Body copy inside cards 0:1 AAA
Aa Primary on Paper Coloured heading word, inline links 0:1 AA
Aa Primary on Canvas (128px) The accent word in the hero 0:1 AA
Aa Primary on Canvas (18px) Body-size links on a tinted section 0:1 AA Large
Aa Ink on Highlight Text on highlight blocks 0:1 AAA
Aa Ink on Badge Text in badges and the stat circle 0:1 AAA
Aa Ink on Hover Button label on hover 0:1 AAA
Aa Ink on Secondary Secondary button label 0:1 AAA
Aa Ink on Alt canvas Headings on alternating sections 0:1 AAA
Aa Paper on Ink Sign-up button, dark footer 0:1 AAA
Aa Rating on Paper Review stars, 22px glyphs 0:1 Fail

Bars are drawn against 7:1 — the AAA threshold for normal text. "Large text" means 24px, or 18.66px bold and above.

05 — The two exceptions

Both fix with
one value.

Rating stars fall well short

At #F5A623 on white the review stars measure 2.03:1. Graphical elements need 3:1. Darkening by 13% lightness clears it and is near-impossible to tell apart at 22px.

★★★★★
#F5A623
2.03:1 · fails
★★★★★
#CF8409
3.02:1 · passes
★★★★★
#A56A08
4.50:1 · text-safe

Primary is 0.09 short at body size

Primary on Canvas measures 4.41:1 — fine for the 128px hero word, just under the 4.5:1 needed at body size. Either keep Primary off 18px links on a Canvas section, or darken it fractionally and stop thinking about it.

Read more
#1D6FE0
4.41:1 · large only
Read more
#1D6DDD
4.53:1 · passes
06 — Typography

Three faces, clear
division of labour.

Syne400 – 800 · Headings & UI
Less chat, more
problem solving
Inter300 – 700 · Secondary UI & long copy

Section tags, dropdown items, accordion labels, blockquotes, counters and form fields. Inter is the workhorse — it never competes with Syne for attention.

Display serifRegular · Oversized headings only
Solving

Scale

Hero heading128 / 0.98display serif
Section heading96 / 80display serif
Heading 260 / 1.2Syne 700
Card heading32 / 1.13Syne 700
Body18 / 1.55Syne 400
Button18 / 600Syne 600

Rules

Headings sit in Ink. One word may take Primary — that is the only colour a heading gets.
Body copy is #555753, never pure Ink, so hierarchy holds without extra weight.
Sentence case everywhere except buttons and eyebrow labels.
Oversized headings need the condensed display serif — a wider substitute costs a line and breaks the hero.
07 — In application

The system
on the page.

Homepage hero — Canvas ground, Ink heading with a single Primary word, Ink sign-up button, Primary scroll control.
Live page, not a screenshot — pinned to Ocean
Feature cards — supporting tints derived from Primary and Highlight, Ink headings, grey body copy.
Live page, not a screenshot — pinned to Ocean
08 — Components

Buttons, badges, blocks.

Live, not screenshots — hover anything.

Buttons

Badges & chips

Highlight Badge Alt canvas Virtual Assistant

Radius & weight

Pill buttons80px18px / 600
Cards & blocks20–30px
Chips5px

Blocks on surfaces

Canvas

The default section ground. Ink headings, grey body.

Alt canvas

Alternate with Canvas to separate sections without drawing rules.

Highlight

One feature block per screen. Any more and it stops highlighting.

09 — Supporting tints

0 derived tints.

Beyond the ten named colours the interface uses a long tail of soft washes — card fills, hover states, section grounds. None are chosen by hand: each is remapped onto the hue of the nearest named colour, which is what stops a rebrand leaving stray colours behind.

#020A11was #010212
#F3FDFFwas #F3FFF8
#DFF2F0was #F2DFDF
#F5FFFEwas #FFF5F5
#C8E6FFwas #C8FFEC
#EFF8F7was #F8EFEF
#F6FBFFwas #FFFBF6
#1D252Bwas #281D2B
#F0F8F7was #F8F0F0
#DDEDFFwas #E3FFDD
#AFECFBwas #AFFBCE
#DAD9FCwas #EBD6FF
#1B2127was #251B27
#E2EBF7was #E1E0F9
#D4E0F0was #D3D1F3
#EDF2F4was #F0F4ED
#D3DEE2was #DAE2D3
#E5EBF3was #F2E5F3
#AFCEF8was #ADA8FF
#CDE2F2was #C9CDF6
#EBF1F8was #EAEAF9
#F6FFFEwas #FFF6F6
#B5CFFFwas #FEB5FF
#C5DBFAwas #C4C0FF
#EEF5FDwas #F1FDEE
#F5F8FFwas #FFF5FF
#D0F6FFwas #D0FFE3
#F1F2F6was #F1F6F6
#F7FEFDwas #FEF7F7
#161B20was #1E1620
#EFF9FBwas #FBF2EF
#9BB0FFwas #9BFFFF
#1D232Awas #281D2A
#EDFAFFwas #F5FFED
#D6E7FCwas #D5D3FF
#A1C3FFwas #FDA1FF
#F6F9FEwas #F6F5FF
#EFF7FFwas #F2FFEF
#EDF2FAwas #EDECFB
#F8FDFFwas #FBFFF8
#EAF0F9was #E9E8FB
#F4FCFFwas #F4FFF9
#6B9CF6was #F46BF6
#E9FFFFwas #F9FFE9
#394C4Fwas #374151
#69E4DEwas #5EB0EF
#ECF1F1was #EBEFF2
#E3EEEFwas #E2E8F0
#14EBE0was #0091FF
#E4EEFDwas #E4E2FF
#E9F5F8was #E9F8EF
#E2EDFFwas #FEE2FF
#DEEBFCwas #DDDBFF

Generated, not curated. Don't pick from this grid by hand — add a colour to the named palette and let the tints follow.

10 — Where the system stops

Two things colour
tokens can't reach.

Worth knowing before someone files them as bugs. Both are inherent to recolouring a product that was drawn in another palette.

01

Raster artwork

Illustrations are bitmaps, so they can't read a colour variable. They're rotated with a filter instead — -28.9° for Ocean, saturation pulled to 0.788 so secondary hues fade rather than clash. One rotation can only be right about one hue: the primary. Photographs and the wordmark are deliberately excluded, since hue-rotating skin tones looks broken.

02

Textured backgrounds

Four section and testimonial backgrounds are JPEG textures with the colour baked into the pixels — reachable by neither the tokens nor the artwork filter, so they keep their original tint. You can see it below: the lilac testimonial card on an otherwise all-blue page. Fixing it means re-exporting those four files.

03

And one it deliberately leaves alone

The form-validation red is excluded from the palette by design. Rotating it with the brand turned the error message cyan on a blue identity — off-brand is survivable, an error message that doesn't read as an error is not. It stays #FF4D44 whatever the palette does.

Both limitations in one view — the lilac texture behind the centre card, and the rating stars at 2.03:1 against their background.
Live page, not a screenshot — pinned to Ocean
11 — Implementation

Ocean, as code.

Drop this on :root. Every rule in the stylesheet already reads these tokens, so nothing else needs editing. The 53 supporting tints derive themselves from these ten values.

/* Ocean — Remote Doers */
:root {
  --bk-primary: #1D6FE0;
  --bk-ink: #08172A;
  --bk-paper: #FFFFFF;
  --bk-mint: #8FE9FF;
  --bk-pink: #A9C8FF;
  --bk-yellow: #FFD98A;
  --bk-lime: #CFF2FF;
  --bk-star: #F5A623;
  --bk-cream: #EFF7FF;
  --bk-lilac: #E4EEFF;
}

Changing the palette later

Edit the ten named values and the tints re-derive themselves. Don't hand-edit the tint list — it's generated by tools/gen_brand_kit.py and will be overwritten.

12 — In short

Do and don't.

Do

Let Canvas and Paper hold the page. Ocean reads as calm and light.

Don't

Flood a section with Primary. It stops being an accent and the hierarchy collapses.

Do

Put Ink type on every accent block. All five clear AAA with Ink on top.

Don't

Put white type on an accent. They're light colours; white disappears.

Do

Give one word of a heading the Primary colour, at heading size.

Don't

Use Primary for body-size text on a Canvas section — it measures 4.41:1.

Do

Alternate Canvas and Alt canvas to separate sections without drawing rules.

Don't

Introduce a colour that isn't in the palette. Add it as a named token instead.

Do

Keep Ink as a deep navy — it's what stops Ocean feeling like default blue-on-black.

Don't

Swap Ink for pure black. The whole palette is tuned against that navy.