Skip to content
MarshalMarshalSample client handoff

Marshal Guidelines

Websites, web apps, and brand for startups where quality is non-negotiable.

Introduction

Marshal
60% 28% 9% 3%

Marshal is a full-stack design and development studio. The identity is deliberately narrow: one mark, one accent, one typeface. Everything else is spacing, hierarchy and restraint — so a listing, a proposal and this document all read as the same company without a single decorative flourish.

The system is near-monochrome on a warm off-white ground. Colour is not used to decorate; it is used to mean something. The single accent appears on marks and status only, at roughly three percent of any composition.

Positioning

A full-stack design and dev partner for funded startups.

Founder-direct

The person on the intro call designs the screens and writes the code. The brand should never imply a larger organisation than there is.

Evidenced

Scope, price and dates are stated plainly. Nothing in the visual language should soften a commitment.

Quiet

Restraint is the differentiator. If an element is not doing work, it comes out.

What this document is

Live

Generated from the same tokens the site runs on. It cannot drift from the product.

Complete

Colour, type, geometry, components and downloadable assets in one place.

Yours

Handed over at the end of a project alongside the repository and the design files.

Lockup scale

64 pxMarshal
48 pxMarshal
36 pxMarshal
28 pxMarshal
22 pxMarshal
16 pxMarshal

The lockup is the mark plus the word, set in Geist SemiBold at 0.86× the mark height with a gap of 0.36× beside it. 16 pixels is the minimum; below that the word stops resolving and the mark goes on alone — which is exactly what the site’s navigation does.

On light and dark

PNG
Marshal

The default. The mark’s circle is #0A0A0A — the ink token exactly — so it needs no plate and casts no halo on the page ground or on white cards.

PNG
Marshal

On the ink field the word turns white and the mark keeps its own circle, which reads as a cut-out. Used on the closing CTA and on the featured pricing tier.

Clear space

Marshal
Rule

Keep 0.75 × the mark height clear on every side. It scales with the mark, so the rule holds from a favicon to a billboard.

In practice

The navigation pill is built to it: 6px of padding around a 28px mark is close enough that nothing else may enter the pill.

Misuse

Never stretch the mark. It is a circle.

Never put the mark on a plate. Its circle is the plate.

M

Never tint the mark with the accent.

Marshal

Never set the word in another face or weight.

There is no dark-surface variant. The mark’s circle is #0A0A0A, so on a near-black field it all but disappears — which is why this document sets it on a light plate wherever it appears. The brand currently only ever places it on light surfaces; if that changes, a knocked-out variant needs drawing.

The master is a 200 × 200 transparent PNG. That is enough for screen at every size the system uses, but a vector master is required before any print, embroidery or large-format application — see Exports.

Surfaces

Page

#F1F1EF

--color-page

The ground everything sits on. Warm off-white, never pure.

Card

#FFFFFF

--color-card

Raised surfaces: work cards, pricing, FAQ rows, the nav pill.

Raised

#FAFAF9

--color-raised

Hover state for white surfaces. A half-step, no more.

Deep

#E7E7E3

--color-deep

Recessed fields: tags, image wells, pressed controls.

Four surfaces, half a step apart. The page is a warm off-white rather than pure white so that cards can lift off it without a shadow. Depth comes from these four values and a 1px line — never from elevation.

Ink

Primary15.97:1

#0A0A0A

--color-primary

Headings and anything that must be read first.

Secondary5.67:1

#595956

--color-secondary

Body copy. The default reading colour.

Tertiary4.65:1

#666663

--color-tertiary

Metadata, captions, eyebrows. Still passes AA.

On ink19.80:1

#FFFFFF

--color-on-ink

Type on the black field.

On ink muted9.55:1

#B4B4B4

--color-on-ink-muted

Secondary copy on the black field.

Each ink was solved against the ground it is actually for: the first three against the darkest light surface they can land on, the last two against the ink field. Every figure is computed here rather than quoted, and every tier clears 4.5:1 — there is no ink in the system that cannot carry body copy.

Lines

Subtle

#EAEAE6

--color-line-subtle

Dividers inside a card.

Default

#DEDED9

--color-line

Card and section edges. The workhorse.

Strong

#CFCFC9

--color-line-strong

Hover edges and rules that need to be felt.

Control

#838380

--color-line-control

Interactive boundaries only. Solved to clear 3:1.

Three decorative weights and one that is load-bearing. Control is the only line that bounds something interactive, which is why it is solved to 3:1 while the others are free to be nearly invisible.

Accent

Ink15.97:1

#0A0A0A

--color-ink

Primary buttons, the CTA field, the featured tier.

Signal3.42:1

#8B5CF6

--color-signal

Marks only — status dots, rails, the aperture. Never type.

Signal text4.51:1

#754ED0

--color-signal-text

The same accent, darkened until it is safe to read.

The accent exists twice on purpose. Signal is the mark colour — status dots, the active rail, the aperture — and clears 3:1, which is all a mark needs. Signal text is the same hue darkened until it clears 4.5:1, and it is the only one of the two that may carry words.

Proportion

Page60%
Card28%
Ink9%
Signal3%

A composition is almost entirely ground and card. Ink appears where something must be decided, and the accent gets roughly three percent — a dot, a rail, an aperture. If the accent is doing more than that, something else has stopped working.

Accessibility

AaPrimary on Page17.51:1AAA
AaSecondary on Card7.03:1AAA
AaTertiary on Deep4.65:1AA
AaOn-ink on Ink19.80:1AAA
AaOn-ink muted on Ink9.55:1AAA
AaSignal text on Page4.94:1AA
AaSignal on Page3.74:1AA-L

Signal on Page grades AA-Large and no higher — enough for a mark, short of the 4.5:1 body text needs, which is exactly the line between the two accent tokens. The moment the accent has to carry a word, Signal text takes over. Every figure is computed from the palette at render time, so this table cannot fall out of step with the swatches above it.

Typeface

Geist. Quiet, precise, and free to use.

Geist is the system’s only face. It is a neo-grotesque with a tall x-height and unfussy terminals — it reads cleanly at 10px in an eyebrow and holds up at 34px in a headline, which is the whole range this brand needs. Geist Mono handles anything that should read as data.

Aa

Geist 400 · 500 · 600

Everything except machine detail.

Open source (SIL OFL). Bundled via next/font — no external request.

Aa

Geist Mono 400 · 500

Eyebrows, URLs, anything that reads as data.

Open source (SIL OFL). Bundled via next/font.

Both are open source under the SIL Open Font License and bundled through next/font, so they are self-hosted and cost no external request. Nothing here needs a licence purchased before you can ship it.

Type scale

HeroGeist · 600 · 34/42 · -0.8px · 2.125rem

A full-stack design and dev partner for funded startups.

Page headline and the closing CTA. One per screen.

SectionGeist · 600 · 20/26 · -0.3px · 1.250rem

Priced by the piece of work

Section headings and prices.

TitleGeist · 600 · 15/20 · -0.15px · 0.938rem

Real full-stack engineering

Card titles, value headings, the founder name.

ItemGeist · 500 · 14/20 · -0.1px · 0.875rem

Who will I actually work with?

FAQ questions and other tappable rows.

LeadGeist · 400 · 15/24 · -0.1px · 0.938rem

Websites, web apps, and brand for startups.

The line under a headline. Sets the tone.

BodyGeist · 400 · 14/21 · 0.875rem

Every proposal carries a fixed scope, a fixed price and a finish date.

Default paragraph.

SmallGeist · 400 · 13/19 · 0.813rem

Code, design files and accounts transfer to you at handover.

Card copy, list items, footnotes.

NavGeist · 500 · 12/16 · 0.750rem

Book intro call

Navigation and button labels.

BadgeGeist · 500 · 11/14 · 0.1px · 0.688rem

Most common

Pills, tags, the featured flag.

MetaGeist Mono · 400 · 11/14 · 0.4px · 0.688rem

tylerdvisuals.com

URLs and machine-ish detail.

LabelGeist Mono · 500 · 10/13 · 0.8px · 0.625rem

RECENT WORK

Uppercase eyebrows above a section.

The scale is hand-set, not derived from a ratio. Eleven steps, each with a job — if a new size is needed, the right move is usually to reuse one of these rather than add a twelfth. Headings carry −0.015em tracking; body sits at zero; the two mono styles open up.

Rules

Sentence case

Headlines and buttons are sentence case. Title Case reads as marketing; the brand is meant to sound assured, not promotional.

Three weights

400, 500, 600. No light, no black, no italics — hierarchy comes from size and space.

Measure

Body copy stops at roughly 68 characters. The hero column is narrower still, at 580px.

Tabular figures

Any number compared against another number — prices, ratios, sizes — uses tabular figures so the columns line up.

Buttons

Primary · Secondary · On ink
Book intro callSend a messageOn ink
Pill · Tag · Status
Fixed scope. Fixed finish dates.WebsiteMost common

Every control is a pill; every container is a rounded rectangle. That single distinction does most of the work of telling a reader what is clickable, which is why the radii below are worth protecting.

Surfaces

Card

Project title

Product

Card copy sits at 13px on 19, in the secondary ink.

Row · Divider
Who will I actually work with?
How do you price a project?
Ink field

Let us build something worth shipping

The ink field is the only place the system raises its voice.

Navigation

The navigation is a single floating pill: mark, three links, one action. It never grows a fourth link — anything else belongs in the footer.

Geometry

6px

--radius-sm

Small controls and inline chips.

10px

--radius-md

FAQ rows, dropdowns, tool clusters.

14px

--radius-lg

Cards. The default for anything that holds content.

20px

--radius-xl

The CTA field, and nothing smaller.

full

pill

Buttons, tags, avatars, the nav.

1120--container-content
580--container-copy
620--container-head
720--container-faq
820--container-founder

Five measures, each tied to a reading job. The content column at 1120 is the one everything aligns to; the rest are narrower on purpose, because the limit on a line of text is the eye, not the container.

In place

Fixed scope. Fixed finish dates.

A full-stack design and dev partner for funded startups.

Websites, web apps, and brand for startups where quality is non-negotiable.

Book intro callSend a message
Marshal

The whole system in one view: warm ground, one card, one ink field, one accent dot, and three type sizes. If a new screen needs more than this, the brief is probably wrong.

The mark

PNG

Mark

200 × 200 transparent PNG. Circle is #0A0A0A.

PNG

Mark on Page

How it sits on the default ground.

PNG

Mark on Card

On white surfaces — nav, cards, footer.

No vector master exists. The mark ships as a 200 × 200 transparent PNG, which is sufficient for every screen size this system uses. Before any print, signage, embroidery or favicon set beyond 200px, an SVG or AI original should be produced and added here — it is the one genuine gap in this handoff.

Tokens

Design tokens marshal-tokens.css

The Tailwind v4 @theme block. Drop it into globals.css and the whole system follows.

/* Marshal — design tokens
   Generated from the live system at marshal.studio. Tailwind v4 CSS-first:
   this block IS the config. There is no tailwind.config.js. */

@theme {
  /* surfaces */
  --color-page: #f1f1ef; /* Page */
  --color-card: #ffffff; /* Card */
  --color-raised: #fafaf9; /* Raised */
  --color-deep: #e7e7e3; /* Deep */

  /* ink */
  --color-primary: #0a0a0a; /* Primary */
  --color-secondary: #595956; /* Secondary */

Tokens as JSON marshal-tokens.json

For Style Dictionary, Figma variable importers, or any other pipeline.

{
  "name": "Marshal",
  "source": "marshal.studio",
  "color": {
    "surface": {
      "page": "#F1F1EF",
      "card": "#FFFFFF",
      "raised": "#FAFAF9",
      "deep": "#E7E7E3"
    },
    "ink": {
      "primary": "#0A0A0A",
      "secondary": "#595956",
      "tertiary": "#666663",

Type styles marshal-type.css

Each named style as a class, with the exact size, leading and tracking.

.type-hero {
  font-family: "Geist", sans-serif;
  font-size: 34px;
  line-height: 42px;
  letter-spacing: -0.8px;
  font-weight: 600;
}

.type-section {
  font-family: "Geist", sans-serif;
  font-size: 20px;
  line-height: 26px;
  letter-spacing: -0.3px;
  font-weight: 600;

These are generated from the same values this document displays, so a token file can never disagree with the swatch above it. Paste the CSS into globals.css and the whole system follows — Tailwind v4 is configured in CSS, so that block is the config.

Typefaces

Aa

Geist

SIL Open Font License · bundled via next/font · no purchase required

Aa

Geist Mono

SIL Open Font License · bundled via next/font · no purchase required

Unusually for a brand handoff, there is nothing to license here. Both faces are open source and already self-hosted in the build, so a new developer can clone the repository and get identical type with no font purchase and no external request.

Where the rest lives

Repository

Source, tokens and components. Transferred to you at handover.

Figma

The design file the build was made from, with components and variables.

Accounts

Hosting, domain and analytics, moved to your ownership.

Marshal hands over everything: code, design files and every account. This document is the map to it, not a substitute for it.