This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Documentation

The projectious.work brand and design system — foundations, logo, interface patterns, collateral, and usage terms.

This documentation is rendered by the design system it describes. Every colour chip, type row, and code block on this site is produced from the same tokens the pages document.

Where to start

If you want to…Read
Use the palette correctly, including dark modeColour
Set text in the brand’s voiceTypography
Place the logo without breaking itLogo usage
Build an interfaceInterface
Produce a deck, signature, or social cardCollateral
Know what you are allowed to reuseGovernance
Pull the raw values into a projectTokens

How the system is organised

Foundations are the primitives — colour, type, spacing, shape, motion. Everything else composes from them.

Logo covers the mark, the four lockups, and the rules that keep them legible.

Interface applies the foundations to screens: components, code surfaces, dark mode, icons, and forms.

Collateral covers the artefacts that leave the product — decks, cards, signatures, social imagery.

Governance covers licensing, trademark, the pre-launch legal assessment, and asset provenance.

Source of truth

The canonical design documents live in brand/ in the repository — the HTML design-system documents, logo files, document templates, and the token exports. This site is the readable presentation of those sources, not a replacement for them.

1 - Foundations

The primitives — colour, typography, spacing, shape, and motion. Everything else composes from these.

Foundations are the values the rest of the system is built from. They are deliberately small in number and fixed: a component may choose which token to use, but it does not invent new ones.

1.1 - Colour

Three 12-step scales in two modes, their step roles, and the contrast rules that govern them.

The palette is three scales — midnight, orange, and slate — each expressed as a 12-step ramp in a light and a dark variant. The step numbering follows the Radix convention, which assigns every step a role. Using a step outside its role is the single most common way to break the system.

Core colours

These are the named aliases most projects reach for first. They are shortcuts into the scales, not a separate palette.

  • Primary
    #1d3352
    Text, headings, primary surfaces
  • Primary Light
    #2b4d78
    Hover states, dark-mode primary
  • Primary Dark
    #132440
    Dark backgrounds, navbar, code blocks
  • Accent
    #E05232
    CTAs, highlights, active states
  • Accent Light
    #ea7558
    Accent hover on dark, syntax strings
  • Accent Dark
    #b84228
    Accent pressed state
  • Accent Solid
    #cc4528
    Fill for solid controls with white text (4.72:1)
  • Secondary
    #546a82
    Supporting text, borders

Step roles

Every scale uses the same twelve roles in the same order:

StepsRoleUsed for
1–2App and subtle backgroundsPage and section surfaces
3–5Element backgroundsComponent fills, hover, active
6–8BordersSubtle, default, and strong borders
9–10SolidSolid fills and their hover state
11–12TextLow-emphasis and high-emphasis text

Midnight

Midnight light · step 9 #1d3352
1 App bg
2 Subtle bg
3 Elem bg
4 Hover bg
5 Active bg
6 Subtle brd
7 Border
8 Strong brd
9 Solid bg
10 Solid hvr
11 Lo text
12 Hi text
Midnight dark · step 9 #1d3352
1 App bg
2 Subtle bg
3 Elem bg
4 Hover bg
5 Active bg
6 Subtle brd
7 Border
8 Strong brd
9 Solid bg
10 Solid hvr
11 Lo text
12 Hi text

Midnight is the primary. It carries structure, text, and the calm end of the system. Step 9 (#1d3352) is the brand primary and is identical in both modes.

Orange

Orange light · step 9 #E05232
1 App bg
2 Subtle bg
3 Elem bg
4 Hover bg
5 Active bg
6 Subtle brd
7 Border
8 Strong brd
9 Solid bg
10 Solid hvr
11 Lo text
12 Hi text
Orange dark · step 9 #E05232
1 App bg
2 Subtle bg
3 Elem bg
4 Hover bg
5 Active bg
6 Subtle brd
7 Border
8 Strong brd
9 Solid bg
10 Solid hvr
11 Lo text
12 Hi text

Orange is the accent. It marks the primary action, the active state, and little else. Step 9 (#E05232) is constant across modes.

Do

Use orange for the single most important action in a view, active navigation state, and focus emphasis.

Don't

Use orange for large background fills, body text, or more than one competing call to action on the same screen.

Slate

Slate light · step 9 #546a82
1 App bg
2 Subtle bg
3 Elem bg
4 Hover bg
5 Active bg
6 Subtle brd
7 Border
8 Strong brd
9 Solid bg
10 Solid hvr
11 Lo text
12 Hi text
Slate dark · step 9 #546a82
1 App bg
2 Subtle bg
3 Elem bg
4 Hover bg
5 Active bg
6 Subtle brd
7 Border
8 Strong brd
9 Solid bg
10 Solid hvr
11 Lo text
12 Hi text

Slate is the secondary — supporting text, borders, and neutral surfaces. Step 9 (#546a82) is the brand secondary and is constant across modes.

Contrast rules

  • Never use pure #000 or #fff as text. Use step 12 of the relevant scale: #142438 on light, #c5daf0 on dark.
  • Step 9 is constant across modes. The solid accent does not shift when the theme changes.
  • Body text targets 4.5:1, large text (≥24px, or ≥18.66px bold) targets 3:1.
  • Verify against the actual surface. A step that passes on the app background may fail on an elevated panel.

Where an identity colour cannot carry text

Being the brand colour does not make a value a legible background. White on orange-9 (#E05232) measures 3.87:1 — fine as a mark or a border, but below the floor for button labels. Rather than dilute the accent, the system adds a separate fill for that job:

TokenHexWith white text
--color-accent#E052323.87:1 — identity only, not for text
--color-accent-solid#cc45284.72:1 — solid controls
--color-accent-dark#b842285.46:1 — hover and pressed

The same principle produced the code-comment token: when no existing step can do the job accessibly, name a new one rather than misuse a step.

Semantic colours are mode-specific

The callout hues are tuned for dark text on tinted light backgrounds. Used as foregrounds on the dark app surface they fall below AA, so dark mode has its own set:

RoleLightDarkOn #0e1720
Success#2f7d65#6cc0903.65:1 → 8.24:1
Warning#8b6508#e0a92a3.41:1 → 8.50:1
Danger#a8261c#f08b802.55:1 → 7.49:1
Info#3a5a82#8aacc82.55:1 → 7.59:1

Dark mode

Both modes are equally supported. See Dark mode for the implementation rules — theme switching, persistence, image treatment, and the always-dark code surface.

1.2 - Typography

Three typefaces, three jobs, and a fixed type ramp.

The system uses three typefaces, each with one job. All three are licensed under the SIL Open Font License 1.1 and served from Google Fonts, so there are no bundled font binaries to license or redistribute.

The three families

FamilyWeightsRoleLicence
Plus Jakarta Sans400 · 500 · 600 · 700 · 800Headings, display, buttons, navigation, wordmarkSIL OFL 1.1
Source Sans 3400 · 500 · 600Body copy, UI labels, captionsSIL OFL 1.1
IBM Plex Mono400 · 500Code, terminal output, dataSIL OFL 1.1

Loading them:

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Source+Sans+3:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap">

The ramp

Every row below is set in the family, size, weight, and line-height it documents — this is the live specimen, not a picture of one.

Display · 48/800/1.1
Redesigning work
H1 · 36/700/1.15
Agent-first consulting
H2 · 28/700/1.2
Composable infrastructure
H3 · 22/600/1.25
How the system fits together
H4 · 18/600/1.3
Working in the open
H5 · 15/600/1.35
Supporting detail
Body L · 16/400/1.65
Augmenting people's strengths through composable Cloud, Agile, and Agentic AI infrastructure.
Caption · 12/400/1.5
Figure 1 — pipeline stages and their policy gates.
Overline · 11/600/1.3
SECTION LABEL
Code · 13/400/1.6
createPipeline({ policy: "strict" })

Rules

  • Letter-spacing tightens to −0.3px above 20px. Large type set at default tracking reads loose and unresolved.
  • Overline is a label, not a heading. 11px, 600, uppercase, 0.08em tracking. Use it above a heading, never as one.
  • Body copy is 16px / 1.65. This is the reading size for documentation and long-form prose. Do not set body text below 14px.
  • Never set body copy in Plus Jakarta Sans, and never set headings in Source Sans 3. The split is what makes the voice recognisable.
Do

Pair an overline with an H2 to label a section. Keep the ramp intact — skip sizes rather than inventing intermediate ones.

Don't

Introduce a fourth typeface, use a weight outside the listed set, or fake a weight with font-synthesis.

1.3 - Space, shape, and motion

The 4px spacing base, the radius and elevation ladders, and the motion tokens.

Spacing

A 4px base with a nine-step scale. Every margin, padding, and gap resolves to one of these values.

TokenValueTypical use
--space-14pxIcon-to-label gaps
--space-28pxTight component padding
--space-312pxControl padding
--space-416pxDefault element spacing
--space-524pxCard padding, paragraph rhythm
--space-632pxComponent separation
--space-748pxSub-section separation
--space-864pxSection separation
--space-996pxPage-level bands

Content sits inside a 1100px measure. Wider viewports gain margin, not line length.

Radius

TokenValueApplied to
--radius-sm3pxTags, chips, small indicators
--radius-md6pxButtons, inputs, code blocks
--radius-lg9pxCards, panels
--radius-xl13pxLarge panels, modals
--radius-full9999pxPills, avatars

Radius is a signal of scale: the larger the surface, the larger the radius. Mixing radii on nested surfaces reads as a mistake — a 6px control inside a 9px card is correct; a 13px control inside a 6px card is not.

Elevation

Four levels. Shadows are soft and low-contrast; the system leans on borders and surface tint before it reaches for shadow.

TokenValueApplied to
--shadow-0noneFlat surfaces, default
--shadow-10 1px 3px rgba(0,0,0,0.06)Cards at rest
--shadow-20 4px 12px rgba(0,0,0,0.08)Hover, dropdowns
--shadow-30 8px 24px rgba(0,0,0,0.12)Modals, popovers

In dark mode, elevation is expressed by lightening the surface rather than deepening the shadow — a shadow on a near-black background is invisible.

Motion

Things slide into place. They do not bounce.

Durations

TokenValueUse
--duration-micro100msColour and opacity changes
--duration-standard200msHover, focus, small moves
--duration-expand300msHeight and width changes, accordions
--duration-page400msRoute and view transitions

Easing

TokenValueUse
--ease-outcubic-bezier(0.33, 1, 0.68, 1)Entering — arriving on screen
--ease-incubic-bezier(0.32, 0, 0.67, 0)Exiting — leaving screen
Radius ladder — 3 / 6 / 9 / 13 / full
sm 3px
md 6px
lg 9px
xl 13px
full
Elevation — shadow-0 through shadow-3
shadow-0
shadow-1
shadow-2
shadow-3
Motion — slides into place, never bounces
200ms · ease-out — entering
100ms · colour and opacity

Motion rules

  • All animation wraps in @media (prefers-reduced-motion: no-preference), or is disabled under prefers-reduced-motion: reduce.
  • CSS-only for HTML. For React, use Framer Motion with these same timing values.
  • Never animate text character-by-character.
  • Page transitions cap at 400ms.
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}
Do

Use --ease-out for anything appearing and --ease-in for anything leaving. Keep durations on the ladder.

Don't

Add spring or bounce easing, animate layout-shifting properties, or exceed 400ms for any single transition.

2 - Logo

The mark, the four lockups, and the rules that keep them legible.

The mark is a stencil peony bud — concentric petal cuts resolving to an accent centre. It reads as a single form at 16px and holds its internal structure at poster scale.

2.1 - Lockups

Four approved lockups, rendered live, and where each one belongs.

Four lockups are approved. Each has a defined context; using one outside its context is what makes a layout feel off-brand even when the colours are right.

All four are built with HTML and CSS rather than flattened artwork, so spacing comes from natural text flow and never needs re-kerning.

The four lockups

Two-line (default) and one-line
projectious · work Two-line · headers, slides, cards · min 120px
projectious · work One-line · navbars, footers, signatures · min 140px
Dot-replace and stacked
projectious work Dot-replace · compact horizontal · min 160px
projectious · work Stacked · app icons, avatars, slide corners · min 60px
LockupCompositionUse forMinimum width
Two-lineMark + “projectious” over “· work”Headers, slides, cards — the default120px
One-lineMark + “projectious · work” inlineNavbars, footers, signatures140px
Dot-replaceMark substitutes the dot in “projectious.work”Compact horizontal contexts160px
StackedMark above the wordmark, centredApp icons, avatars, slide corners60px

On light and dark

Every lockup has a light-surface and a dark-surface rendering. The mark’s inner cuts pick up the surface colour, so it never needs a plate or a knockout box.

The same lockup on both surfaces
projectious · work
projectious · work

The mark alone

The mark may stand alone only where the wordmark is already established nearby — an app icon on a page that names the product, an avatar in a signed-in context, a favicon.

Standalone mark — 96 · 64 · 48 · 32 · 24 · 16px

Minimum for the standalone mark is 24px. The 16px rendering exists for favicons only, where the browser supplies the name.

Product line

Product names extend the wordmark with the same dot construction and flow.

Product-line extensions
projectious · guard projectious · forge projectious · flow

Wordmark construction

The separator between “projectious” and “work” is a dot in the mark’s own geometry, not a typed period. It takes slate on light surfaces and midnight-11 on dark. Spacing is handled by flex layout so the wordmark reflows naturally — do not hand-kern it or convert it to a static image.

Do

Use the two-line lockup unless the space is explicitly horizontal. Let the flex layout handle spacing.

Don't

Rebuild a lockup by hand, change the order of mark and wordmark, or set the wordmark in a different typeface.

2.2 - Usage

Clear space, minimum sizes, monochrome variants, and placing the mark on colour and photography.

Clear space

Exclusion zone — 1x the icon height on every side
Nothing enters the dashed zone

Minimum clear space is 1× the icon height on all sides. Nothing — text, rules, image edges, other logos — enters that exclusion zone.

At a 40px mark, that is 40px of clear space in every direction. The zone scales with the mark, so it never needs recalculating per context.

Minimum sizes

Minimum sizes — 48 / 32 / 24 / 16px
48px
32px
24px — minimum
16px — favicon only
VariantMinimum
Icon (standalone)24px — 16px for favicons only
Stacked lockup60px
Two-line lockup120px
One-line lockup140px
Dot-replace lockup160px

Below these sizes the petal cuts collapse into a smudge. If the space is smaller than the minimum, use a smaller variant rather than scaling one down.

Monochrome

Four monochrome treatments are approved, for print, fax, embossing, and any single-colour reproduction:

Monochrome variants
Midnight
Black
White reversed
Grey
VariantMarkInner linesSurface
Midnight#1d3352WhiteLight
Black#000000WhiteLight
White reversed#ffffffSlateMidnight
Grey#9299a4WhiteLight

The white-reversed variant uses slate for its inner lines rather than the background colour, so the petal structure stays visible. All petal structure must remain legible in every monochrome variant — a solid silhouette is not an approved treatment.

On colour

Placing the mark on colour
Lighter than slate-5 -> light mark
Darker -> dark mark
On accent → white ring
On photography -> midnight backing
BackgroundTreatment
Lighter than slate-5Light-surface mark
Darker than slate-5Dark-surface mark
Accent (#E05232)Mark with a white ring border
PhotographySemi-transparent midnight backing behind the mark

The slate-5 threshold is the decision rule: measure the background, pick the side it falls on. On the accent, neither variant has enough separation on its own, which is why the ring exists.

On photography

Never place the mark directly on an unmodified photograph. Apply a semi-transparent midnight backing — a shape, a scrim, or a gradient — so the mark sits on a controlled surface. The backing is part of the logo treatment, not an optional enhancement.

Watermark

Watermark — uniform wash, no accent

For background use, the mark may run as a watermark at 8–15% opacity. It renders as a uniform wash: no accent colour in watermark mode, since a single coloured element at low opacity reads as a printing error.

Favicons

Icon-only, on a midnight tile, with 12% padding. Corner radius scales with size:

Favicon tiles — 12% padding, radius scales with size
48px / r8
32px / r4
16px / r2
SizeRadius
16px2px
32px4px
48px8px
180px36px
Do

Measure the background against slate-5 before choosing a variant. Keep the full clear-space zone even when layout is tight.

Don't

Recolour the mark outside the approved variants, add effects (shadow, glow, outline, gradient), rotate or skew it, or place it on a busy photograph without a backing.

2.3 - Files

Delivered formats, when to use each, and where to download them.

Formats

FormatContentsUse for
SVGVector sourcePrimary for web and print
PNG @1x16 / 32 / 48 / 64 / 128 / 256 / 512pxNative-resolution raster
PNG @2x2× pixel dimensionsRetina — required for web
PNG @3x3× pixel dimensionsSuper-retina — mobile
ICOMulti-resolution (16 + 32 + 48)Favicon
apple-touch180×180 PNGiOS home screen

SVG is the source. Raster exports exist for contexts that cannot take vector — prefer SVG wherever the medium allows it.

Variants

Each raster size ships in five variants:

  • icon-light — for light surfaces
  • icon-dark — for dark surfaces
  • icon-mono-black — single-colour black
  • icon-mono-white — single-colour white, reversed
  • icon-mono-gray — single-colour grey

Downloads

The logo files are served from this site and are also in the repository under brand/logo/.

AssetLink
SVG — lighticon-light.svg
SVG — darkicon-dark.svg
SVG — mono blackicon-mono-black.svg
SVG — mono whiteicon-mono-white.svg
SVG — mono greyicon-mono-gray.svg

3 - Interface

The foundations applied to screens — components, code surfaces, dark mode, icons, and forms.

Interface guidance applies the foundations to working software. Where a component appears here, its measurements are normative — a 40px input is 40px, not “about 40px”.

3.1 - Components

The component set as live specimens — buttons, inputs, cards, tables, navigation, feedback, overlays, and data display.

Every specimen on this page is live markup styled by the brand tokens, ported from brand/html/projectious-kitchen-sink.html. They follow your colour mode — switch the theme and they change with the documentation.

Measurements listed here are normative: a 40px input is 40px.

Buttons

Five variants, three sizes. Plus Jakarta Sans 600, 6px radius, 200ms transitions.

Variants — medium (40px)
Sizes — sm 32px · md 40px · lg 48px
On a midnight surface
VariantFillBorderTextContrastUse
Primarymidnight-9nonewhite12.75:1Default action
Accentaccent-solid #cc4528nonewhite4.72:1The single most important action
Outlinetransparent1.5px orange-9orange-115.13:1Secondary action
Ghosttransparent1px borderslate-9Tertiary, toolbars
Danger#a8261cnonewhite7.10:1Destructive action
Do

Use exactly one accent button per view. Give every button a verb — “Deploy”, “Save changes”.

Don't

Place two accent buttons side by side, or use a danger button for a reversible action.

Inputs

Default height 40px (sm 32, lg 48). Source Sans 3 at 13px, slate-7 border, and a 2px focus ring at midnight 15% alpha.

Text, textarea, select
States — default, focus, error, disabled
Default slate-7 border
Focus midnight-9 + 2px ring
Error Agent identifier is incomplete.
Disabled slate-4 bg, cursor not-allowed
Checkbox, radio, toggle, slider
On Off

Full rules — labels, validation, focus — are on Forms.

Cards

Radius 9px, padding 24px, 1px slate-4 border, shadow-1 at rest. Nested controls step down one radius.

Basic, with image, with actions
Validate & deploy
Runs policy checks before promoting to staging.
Image / diagram
Architecture
Nodes, flows, and policy gates.
Agent: auditor
Idle for 2 hours.

Tables

Header cells use the overline style. Striping uses the subtle background step, never a border-only rule. Wide tables scroll inside their own container.

Data table with sort indicator
PipelinePolicyAgentsStatus
validate-deploystrict2Healthy
nightly-auditadvisory1Degraded
release-trainstrict4Blocked

Table with search and filters

A toolbar above the table carries the search field and filter chips. Active filters are shown as removable chips so the current view is always legible — never leave a filter applied with no visible indication.

Search, filter chips, pagination footer
PipelinePolicyOwnerStatus
release-trainstrictplatformBlocked
nightly-auditstrictsecurityFailed

Multi-level headers

Grouped columns use a two-row header. The group row is centred over its span and separated by a vertical rule — the only place the system uses one.

Two-row header with column groups
PipelineThis weekLast week
RunsPassp95RunsPassp95
validate-deploy41298.1%4m12s38897.4%4m40s
nightly-audit771.4%18m03s785.7%17m22s
release-train1492.9%9m51s1291.7%10m08s

Grouped rows and totals

Row groups act as sub-headings inside the table. A totals row is separated by a 2px rule — heavier than the body rules, so it reads as a summary rather than another record.

Row groups, indented children, totals
WorkloadRunsCost
Platform
validate-deploy412€48.10
release-train14€12.60
Security
nightly-audit7€21.40
secret-scan96€9.05
Total529€91.15

Wide tables

A wide table scrolls inside its own container, never the page, and pins its first column so the row identity stays visible while scrolling.

Horizontal scroll with a sticky first column
PipelinePolicyOwnerRunsPassp50p95RegionStatus
validate-deploystrictplatform41298.1%2m01s4m12seu-centralHealthy
nightly-auditstrictsecurity771.4%11m40s18m03seu-westDegraded
Do

Right-align numeric columns and set them in IBM Plex Mono so digits line up. Show the active filter state and the result count together.

Don't

Add vertical rules between ordinary columns, let a wide table scroll the whole page, or apply a filter without a visible chip saying so.

Navbar — midnight in both modes, 3px accent rule
projectious.work Documentation Pipelines Agents
Breadcrumbs, tabs, pagination, sidebar
DocsInterfaceComponents
13px, secondary
OverviewRunsSettings
accent underline on active
current in midnight-9
Foundations
Logo
Interface
active: 600 weight

Alerts and feedback

Four semantic colours as a 4px left border on a tinted background. The hues are mode-specific — see Colour.

Alerts
Info
Pipeline requires at least one validation agent.
Success
All checks passed. Deployment ready.
Warning
Agent "monitor" has been idle for 2 hours.
Danger
Policy violation — deployment blocked.
Badges, progress, spinner
Default Urgent v0.1.0 Breaking

Modals and overlays

Modal radius 13px with shadow-3; scrim is midnight at 40% alpha. Focus is trapped while open and restored to the trigger on close; Esc always closes.

Dialog, dropdown, tooltip
Delete pipeline?
This removes the pipeline and its run history. This cannot be undone.
Re-run
Duplicate
Export logs
Last run 4 minutes ago12px, 3px radius

Data display

Avatar, stat card, tags
JD AS
1,284
Runs this week
▲ 12% vs last week
Composable Agent-first Humanistic
List and timeline
validate-deploy4m ago
nightly-audit2h ago
release-train1d ago
Policy check passed
09:14
Deploying to staging
09:16
Production
pending
Status indicators — always a dot plus a label
Healthy Degraded Failed Idle
Do

Pair every status dot with a text label, so meaning does not depend on colour perception.

Don't

Use a bare coloured dot, or rely on red/green alone to distinguish states.

Code and terminal

The code surface is always dark — see Code.

Terminal
$ tofu apply -auto-approve
Plan: 3 to add, 0 to change, 0 to destroy.
Policy check passed
Deploying to staging…

3.2 - Dark mode

Both modes are equally supported. The implementation rules that keep them in step.

Dark mode is not a variant of the brand — it is half of it. Both modes are designed, tested, and shipped together.

Implementation rules

  • Default follows prefers-color-scheme, with a manual override toggle persisted to localStorage.
  • CSS custom properties swap per theme. Components read tokens; they do not branch on the mode themselves.
  • Step 9 (solid accent) stays constant across modes. #E05232 is #E05232 everywhere.
  • No pure #000 or #fff as text. Use step 12 — #c5daf0 on dark, #142438 on light.
  • Images get a subtle overlay (black at low alpha) in dark mode, so a bright photograph does not punch a hole in a dark page.
  • Code blocks are always dark, regardless of mode. See Code.
The same card in both modes
Light mode
Body text is midnight-12; supporting copy is slate-11.
Deploy
Dark mode
Never pure white — midnight-12 from the dark scale.
Deploy

Surfaces

Elevation in dark mode is expressed by lightening the surface, not by deepening the shadow — a shadow against a near-black background is invisible.

LayerLightDark
App background#ffffffmidnight-dark-1 #0e1720
Subtle surfacemidnight-1midnight-dark-2 #131e2b
Raised surfacemidnight-2midnight-dark-3 #1a2b3e

Restating text on dark surfaces

The default heading colour is midnight-9, chosen so headings read correctly on light pages. That same value on a midnight surface is invisible — #1d3352 on #1d3352 is a contrast ratio of 1.00:1.

Any component that paints its own dark background must therefore restate its text colours. This applies to covers, dark boxes, footers, and overlays:

.surface--dark {
  --bs-body-color: #c5daf0;    // midnight-dark-12
  --bs-heading-color: #c5daf0;
  --bs-secondary-color: #97a8b8; // slate-dark-11, still AA
}
Do

Test every surface in both modes. Restate text colours on any component that sets its own dark background.

Don't

Ship a component that only works in one mode, or use pure black or white as a text colour in either.

3.3 - Code

The always-dark code surface and the syntax theme, with measured contrast for every token.

Code blocks are always dark

Code blocks stay dark regardless of colour mode. A code surface that flips with the theme forces the syntax palette to be designed twice and makes screenshots inconsistent between users. The surface is midnight-2 from the dark scale (#131e2b) in both light and dark mode.

The block you are reading is rendered by that rule:

// Agent pipeline definition
const pipeline = createPipeline({
  name: "validate-deploy",
  policy: "strict",
  agents: ["auditor", "deployer"],
});

Syntax theme

Because the surface is always dark, every syntax value is read from the dark scale. Contrast is measured against #131e2b:

TokenStepHexContrastWCAG AA
Identifiersmidnight-12#c5daf011.74:1Pass
Numbersorange-11#f098787.58:1Pass
Keywordsmidnight-11#8aacc87.06:1Pass
Operatorsslate-11#97a8b86.90:1Pass
Stringsorange-light#ea75585.76:1Pass
Commentscode-comment#72889d4.59:1Pass

Why comments have a dedicated token

Comments are the one syntax role with no scale step available to it.

Code comments are ordinary 13px text, so they need 4.5:1. The obvious candidate, slate-8, measures only 3.02:1 on this surface — and it is a border step, not a text step (see step roles). The next steps up are no better: slate-9 is 3.01:1 and slate-10 is 3.78:1, both also non-text roles. The first step that clears AA, slate-11, is already spoken for by operators, and reusing it would erase the distinction between a comment and an operator.

So code-comment (#72889d, 4.59:1) exists as a dedicated syntax token — the dimmest value that clears AA while staying visibly below operators. It is not a scale step and should not be treated as one.

Inline code

Inline code does not take the dark block treatment — it follows the surrounding surface. On light surfaces it sits on midnight-2 (light scale) with orange-11 text; in dark mode both values shift to their dark-scale counterparts. It uses IBM Plex Mono at 13px with a 3px radius.

Terminal output

Terminal blocks use the same dark surface. Prompts take the comment colour, output takes the operator colour, so a transcript stays readable without becoming a second syntax theme.

$ hugo --gc --minify
Start building sites …
Total in 842 ms

3.4 - Icons

Lucide as the icon library, and how icons are sized and coloured.

Library

The system uses Lucide — an actively maintained fork of Feather with over 1,400 icons.

PropertyValue
LicenceISC (functionally equivalent to MIT)
Commercial usePermitted
AttributionNot required in product UI; retain the notice in source
ModificationPermitted

ISC is one of the most permissive open-source licences available, which is why it was chosen over icon sets with attribution or share-alike terms. See the legal assessment for the clearance detail.

Sizes on the 4px grid — 16 / 20 / 24 / 32px
16
20 — default
24
32
accent — primary action
Icon with a label, and an icon button
Policy enforced

Usage

  • Stroke width 2, matching Lucide’s default. Do not thin or thicken strokes to “match” a layout.
  • Size on the 4px grid: 16, 20, 24, 32px. 20px is the default for inline UI.
  • Colour follows text. An icon beside a label takes the label’s colour. Standalone icons carrying meaning take --color-secondary; an icon marking the primary action takes the accent.
  • Icons are not decoration. Every icon must carry meaning the label does not already carry, or be marked aria-hidden="true".
Do

Pair icons with text labels wherever the meaning is not universally understood. Give standalone icon buttons an accessible name.

Don't

Mix icon sets, recolour icons to arbitrary hues, or use an icon as the only indicator of state.

3.5 - Forms

Input sizing, labels, focus, error, and disabled states.

Sizing

SizeHeight
sm32px
md40px — the default
lg48px

All inputs are set in Source Sans 3 at 13px.

Sizes — sm 32 · md 40 · lg 48
Small
Medium
Large

States

StateTreatment
Defaultslate-7 border
Focusmidnight-9 border + 2px focus ring, midnight at 15% alpha, 2px offset
Errororange-9 border + orange-1 background
Disabledslate-4 background, slate-8 text, cursor: not-allowed
Every state
Default
Focus
ErrorDescribe the problem in words.
Disabled

Labels

Labels use the overline style and sit above the field. Floating labels are not used anywhere in the system — they hide the label at exactly the moment the user is filling the field, and they break at long label lengths.

.field__label {
  font-size: 11px;
  font-weight: 600;
  line-height: 1.3;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--color-secondary);
}

Validation

  • Error text sits below the field, in orange-11 on light surfaces.
  • Never rely on border colour alone to signal an error — pair it with text.
  • Validate on blur, not on every keystroke; re-validate on submit.
Do

Keep labels visible at all times. Give every field an associated <label> and describe errors in words.

Don't

Use placeholder text as a label, signal errors with colour alone, or disable the submit button without explaining what is missing.

4 - Portfolio presentation

Truthful status, social-preview, diagram, and demo patterns.

Portfolio presentation must make maturity and limitations easier to see, not make prototypes appear more complete than they are.

These patterns are Projectious organization assets. Bernhard Gerlach’s personal LinkedIn profile is a separate identity: use his name, portrait, and first-person voice only with his approval. Do not turn a personal profile into an organization-brand channel or imply personal endorsement.

4.1 - Status treatments

Text-first maturity labels for truthful portfolio presentation.

Required pattern

Every project presentation must show a status as text. Color, icons, position, and motion may reinforce the label but must never replace it.

StatusUse whenSupporting cue
Usable projectDocumented users can complete the stated core task.Solid dot
Working prototypeA real implementation runs, with known limits.Half-filled dot
Applied researchEvidence or experiments are the primary output.Diamond
Supporting assetThe repository enables another project.Square
Idea / implementation startingScope exists; implementation is absent or partial.Ring
ArchivedWork is preserved but no longer maintained.Horizontal bar

Do not substitute broad claims such as “platform”, “production-ready”, or “enterprise” unless the owning repository publishes evidence for that claim. Prefer narrow artifact categories: CLI, process layer, applied research, prototype, library, or supporting asset.

Accessibility

  • Keep the full status label visible at all viewport sizes.
  • Pair every color with the status-specific shape in the table.
  • Use normal text contrast of at least 4.5:1 and large-text/UI contrast of at least 3:1.
  • Test light and dark variants independently.
  • Do not encode a status change with animation alone.

The source templates use high-contrast neutral text and reserve accent color for a supporting rule. Maintainers must rerun local validation after changing colors.

Project examples

Examples are prompts for maintainers, not permanent factual claims. Confirm each status and limitation with the owning repository before publishing.

ProjectNarrow categoryExample status lineRequired limitation
aiboxCLIUsable projectState supported hosts and providers.
processkitProcess layerWorking prototypeState current API/version constraints.
ai-market-researchApplied researchApplied researchState dataset date and methodology limits.
KubeClawPrototypeIdea / implementation startingState which flows are implemented.

4.2 - Social previews

Repository artwork that states category and maturity plainly.

Content model

Every 1280×640 preview contains only:

  1. Projectious organization mark and name.
  2. Project name.
  3. One narrow artifact category.
  4. One complete maturity label from the status vocabulary.
  5. An optional short limitation, never a marketing claim.

The editable source is brand/portfolio/social-preview-template.svg. Replace bracketed text, keep the status label intact, and save a project-specific SVG beside the template. Examples for aibox, processkit, ai-market-research, and KubeClaw demonstrate the content structure; they are not evidence of current maturity.

Export and validation

Run:

npm run portfolio:validate
npm run portfolio:export

The export script uses resvg when available and otherwise leaves the SVG source as the canonical reusable asset. Commit generated PNGs only when a repository needs them.

Source and generated exports use this repository’s split license. The Projectious name and marks remain subject to TRADEMARK.md. Record any third-party typeface, icon, logo, or screenshot in brand/PROVENANCE.md before use. The supplied templates contain no third-party logos or screenshots.

4.3 - Diagrams and demos

Evidence-first architecture, flow, screenshot, and demo framing.

Architecture and flow diagrams

  • Prefer left-to-right flow, explicit boundaries, and named protocols.
  • Distinguish implemented components from planned components with text: implemented, external, or planned.
  • Add a caption with repository, source path, commit or release, and capture date.
  • Never infer architecture from a social preview or marketing page.
  • Keep editable source beside the export and document the export command.

Suggested caption:

Source: owner/repository, docs/architecture.svg, release vX.Y.Z, captured YYYY-MM-DD. Planned elements are labelled.

Screenshots and demos

  • Show real output from a named build, commit, or release.
  • Frame the output without modifying product state or hiding errors.
  • State sample/synthetic data clearly.
  • Do not fabricate dashboards, terminal output, customer logos, or product UI.
  • Crop personal data, tokens, account identifiers, and unrelated windows.
  • Record capture command, viewport, theme, and date in provenance.

When there is no real output yet, use a text-first project card labelled Idea / implementation starting. A truthful absence is better than a fictional interface.

5 - Media

Motion, audio, video, photography, and presentation guidance.

Media guidance covers everything with a time dimension or a photographic surface — the places where the system meets material it does not fully control.

5.1 - Audio and video

Sonic identity and video production rules.

Audio identity

Four defined cues. All are short, tonal, and mid-register — the audio equivalent of “slides into place, doesn’t bounce”.

CueSoundLength
NotificationShort tonal chime, mid-register200ms
SuccessAscending C→E, warm sine wave
ErrorSingle low A2300ms
Podcast introAmbient pad, tension→warmth resolve3s

Error is a single low note, not a buzz or a descending pair — it marks the event without scolding.

Video rules

  • Demos run at real time. No fast-forward, no speed ramps. If a step is slow, that is information the viewer needs.
  • Transitions are a cut or a 200ms fade. No swoops, wipes, or 3D moves.
  • All video uses midnight surfaces.
  • Subtitles are always available.
  • Export at 1080p minimum, 4K when possible.
Do

Show the real thing at real speed. Caption everything.

Don't

Speed up a demo to hide latency, or use a transition that draws attention to itself.

5.2 - Photography and illustration

Sourcing rules, treatment, and the abstract illustration style.

Sources

Preferred: Unsplash and Pexels — royalty-free, no attribution required for commercial use. Commission custom photography where possible, from local European photographers.

Never use: watermarked Shutterstock or Getty imagery, or AI-generated imagery.

Every photograph must pass the test: “would a developer trust this?” Stock imagery of handshakes in glass lobbies fails it. A real desk, real hardware, or real people working passes it.

Treatment

  • Photographs in dark mode receive a subtle black overlay so they do not punch a hole in the page.
  • The logo never sits directly on an unmodified photograph — see Logo usage.
  • Never place text over a busy region. Add a scrim or crop to a quiet area.

Illustration

The illustration style is abstract system diagrams — nodes, flows, and pipelines drawn in the brand palette.

  • Midnight for structure, slate for supporting lines, accent for the single element that matters.
  • Dashed strokes indicate inferred or optional relationships.
  • Labels use Source Sans 3; never letter-space diagram labels.
  • Diagrams are line-based, not filled — the system reads as engineering drawing, not infographic.
Do

Draw the actual architecture. Use accent once per diagram, on the element the reader should look at first.

Don't

Use isometric 3D illustration, gradient-filled shapes, or generic “tech” clip art.

5.3 - Presentations

Slide templates, animation, and the core deck structure.

Core slides

Six slide types cover most decks:

SlidePurpose
TitleDeck opening — display type on midnight
Section statementA single sentence marking a new section
Three-upThree parallel points
QuoteA single quotation, attributed
Code showcaseCode on the always-dark surface
CTA closerThe one thing you want the audience to do
Core slide types — 16:10
Redesigning work
Cloud · Agile · Agentic AI
projectious.work
Bad software is a decision, not a constraint.
The agent-first approach
Define Build Deploy
"We run what we recommend."
// pipeline
createPipeline({
  policy: "strict"
});
Let's talk
projectious.work

The full deck

Twelve slide types cover a complete talk. Each is 16:10 and uses the same tokens as the product surfaces — no separate “presentation theme”.

Opening — title, agenda, section statement
Redesigning work
Cloud · Agile · Agentic AI
Agenda
01 Why agent-first
02 Architecture
03 Operating model
04 What it costs
Bad software is a decision, not a constraint.
Content — three-up, split, comparison
The agent-first approach
Define Build Deploy
Before
Manual gates, tribal knowledge, slow feedback.
After
Policy as code, repeatable runs, fast feedback.
Where the time goes
Review42%
Build31%
Deploy27%
Evidence — metric, quote, code, diagram
1,284
Runs this week
"We run what we recommend."
// pipeline
createPipeline({
  policy: "strict"
});
Architecture
DefineBuildDeploy
Closing — CTA and contact
Let's talk
projectious.work
Thank you
info@projectious.work
SlidePurpose
TitleDeck opening — display type on midnight
AgendaNumbered outline; current item in midnight-11
Section statementA single sentence marking a new section
Three-upThree parallel points
SplitBefore/after or contrast, one half on midnight
ComparisonA small table where numbers are the point
MetricOne number, large; the label in overline style
QuoteA single quotation with the accent rule, attributed
Code showcaseCode on the always-dark surface
DiagramLine-based system diagram, accent on the focal node
CTA closerThe one thing you want the audience to do
ContactThank-you and a single contact route

Rules

  • 16:10 aspect ratio.
  • Title slides and section statements use midnight surfaces; content slides use white or midnight-1.
  • projectious.work is visible on the title and closing slides.
  • One idea per slide. If a slide needs a paragraph, it needs to be two slides.

Animation

  • Slide transitions: cut or 200ms fade.
  • Build animations use --ease-out at --duration-standard.
  • Never animate text character-by-character.
  • Motion is for revealing structure, not for holding attention.

Templates

Document templates for LaTeX and Typst are in brand/templates/. Both embed brand identity and fall under the brand-asset licence terms — see Licensing.

6 - Collateral

Artefacts that leave the product — cards, signatures, and social imagery.

Collateral is where the brand travels without its context. These artefacts are often seen once, at small size, next to other companies’ material — so they lean harder on the mark and the wordmark than in-product surfaces do.

6.1 - Business card

The digital-first vCard, shared by QR code or link.

The primary format is digital — a vCard shared via QR code or direct link, not a printed card.

Digital vCard
projectious · work
Bernhard Gerlach
Cloud · Agile · Agentic AI
info@projectious.work
projectious.work

Layout

  • Midnight surface, mark top-left, name in Plus Jakarta Sans 700.
  • Role in Source Sans 3 400, in slate-dark-11.
  • Contact rows in IBM Plex Mono at 11px — addresses and handles are data, and monospace makes them scannable and unambiguous.
  • projectious.work always present.
  • Accent used once, on the QR frame or the primary contact method.

If a printed card is required:

  • 85×55mm, matte stock.
  • Single-colour midnight on uncoated white, or reversed white on midnight.
  • Use the monochrome mark — no accent on press unless a spot colour is budgeted.
  • Respect the 1× clear-space rule; do not bleed the mark to the trim edge.

6.2 - Email signature

A compact signature that survives every mail client.

The signature is built to work in clients with hostile CSS support — Outlook included. The source is brand/email/signature.html.

Signature — one-line lockup, four lines maximum
projectious · work
Bernhard Gerlach
Cloud · Agile · Agentic AI
projectious.work

Construction rules

  • Table-based layout. Flexbox and grid do not survive Outlook.
  • Inline styles only. Most clients strip <style> blocks.
  • Web-safe font fallbacks. Brand fonts will not load in most clients — the stack must degrade to a system sans without breaking the layout.
  • The mark is a hosted PNG, not an SVG and not a data URI. Include alt text; many clients block images by default.
  • No background images. Use a solid bgcolor attribute.

Content

One line each: name, role, projectious.work, and a single contact method. The one-line lockup is used here — the signature is a horizontal context.

Do

Test in Outlook, Gmail web, and Apple Mail before shipping a change. Keep the signature under four lines.

Don't

Add social icon rows, legal disclaimers, quotations, or “please consider the environment” footers.

6.3 - Social and OG images

Templates for LinkedIn, GitHub, blog headers, and Open Graph cards.

Priority

LinkedIn and GitHub first, blog second, Twitter/X as backup. The templates are sized for those surfaces in that order.

Template rules

  • Backgrounds are midnight or midnight-dark, or white with an accent top bar.
  • projectious.work is always visible.
  • Never place text over a busy background.
  • An accent glow circle at subtle opacity provides visual interest without competing with the text.
  • Typography hierarchy is unchanged: Plus Jakarta Sans for headlines, Source Sans 3 for body.
Open Graph card — 1200x630
Bad software is a decision,
not a constraint.
projectious.work · Cloud · Agile · Agentic AI

Open Graph

  • 1200×630px.
  • Headline at Display weight, capped at roughly 60 characters — longer headlines are truncated by most platforms anyway.
  • The mark sits bottom-left or top-left, never centred.
  • Test the rendering at 320px wide: most impressions are in a mobile timeline.
Do

Keep one message per card. Check contrast against the actual background, not the design canvas.

Don't

Fill the card with a screenshot, use more than one accent element, or rely on text smaller than 24px at 1200×630.

7 - Governance

Licensing, trademark, the pre-launch legal assessment, and per-asset provenance.

This section states what you may and may not do with the material in this repository. It is deliberately explicit: a design system that is source-available without clear terms is a liability for everyone who touches it.

7.1 - Licensing

A split licence — brand assets are proprietary, code and tokens are MIT.

The repository carries two categories of intellectual property under different terms. The full text is in LICENSE.md; this page summarises it.

Brand assets — proprietary, source-available

Everything representing the visual identity: logos, brand imagery, and the design-system documents under brand/.

PermittedDownload and view for personal reference, editorial reporting, or authorised partner use
ProhibitedModification, derivative works, sale, or commercial use — including merchandise or software featuring these assets — without prior written consent
No impersonationUse must not imply endorsement, affiliation, or ownership by anyone other than projectious.work

Document templates under brand/templates/ fall under these same terms: they embed brand identity (colours, fonts, tagline). You may use them as structural reference for your own templates, but not redistribute them with projectious.work branding intact.

Code, scripts, and tokens — MIT

Source code, automation scripts, and configuration files (.py, .js, .sh, .json, .yaml) are MIT-licensed: use, copy, modify, merge, publish, distribute, sublicense, and sell, provided the copyright and permission notice travel with the software.

The design tokensbrand/tokens/ — are in this category. The values are free to use; the marks are not.

What this means in practice

Do

Use the token files, the spacing scale, and the component measurements in your own work. Link to this documentation. Write about the brand editorially.

Don't

Ship the logo in your product, sell anything carrying the marks, or present modified brand assets as projectious.work’s.

For commercial inquiries or brand consent: info@projectious.work

7.2 - Trademark

Guidelines for referring to projectious.work and using its marks.

The names, logos, and icons associated with projectious.work are its trademarks. Full text: TRADEMARK.md.

Not permitted

  • Using the logo as your own, or as part of your own logo.
  • Using the brand name in a way that suggests partnership or official status without a signed agreement.
  • Registering domain names, social handles, or app names that include the trademarks in a confusingly similar way.

Permitted

  1. Linking to the official website.
  2. Press articles or blog posts about the project.
  3. Technical documentation that refers to the tools.

These are nominative uses — referring to the thing by its name. They do not require permission, and they do not grant any broader licence.

7.3 - Legal assessment

Pre-launch clearance review of the name, mark, fonts, icons, and imagery sources.

A pre-launch review of the elements that carry legal risk. Source: brand/html/projectious-legal-assessment.html.

Summary

#AreaVerdict
1Company name “projectious”Low risk
2Logo similarity — stencil peony budLow risk
3Font licensingLow risk
4Icon library — LucideLow risk
5Photography and imagery sourcesLow risk
6Other design elementsLow risk

Fonts

All three families are SIL Open Font License 1.1 and served from Google Fonts. OFL permits commercial use, embedding, and redistribution; it forbids selling the fonts on their own and requires that any derivative font use a different name. Since the fonts are linked rather than bundled, no font binaries are redistributed by this repository.

Icons — Lucide

ISC License, functionally equivalent to MIT: free commercial use, modification, redistribution, sublicensing. No attribution required in product UI — only the notice retained in source. Over 1,400 icons, actively maintained, a fork of Feather with a broader community.

Photography

SourceLicenceCostAttributionCommercialRestriction
UnsplashUnsplash LicenseFreeNot requiredAllowedNo reselling as-is; no competing stock service
PexelsPexels LicenseFreeNot requiredAllowedNo reselling; no implying endorsement

Both permit free commercial use without attribution for website imagery, marketing, social posts, presentations, and blog posts. The binding restriction is that you may not compile the images into a competing stock service.

Colour

Colours cannot be trademarked in the abstract — only in connection with specific goods and services in specific contexts (Tiffany blue for jewellery being the canonical example). The palette (#1d3352 midnight, #E05232 orange, #546a82 slate) uses common design colours and does not infringe any known colour trademark in the IT consulting space.

  • Run a registered-trademark search in the operating jurisdictions.
  • Keep the asset provenance inventory current as assets are added.
  • Retain licence notices in source for all third-party dependencies.

7.4 - Asset provenance

Per-asset source, licence, and attribution status for every third-party dependency.

The authoritative inventory is brand/PROVENANCE.md in the repository. Check it before adding an asset or shipping collateral.

Fonts

Loaded at runtime from the Google Fonts CDN — no font files are bundled.

FontLicenceAttributionRole
Plus Jakarta SansSIL OFL 1.1Not requiredHeadings, display
Source Sans 3SIL OFL 1.1Not requiredBody, UI
IBM Plex MonoSIL OFL 1.1Not requiredCode, data

Icons and photography

Neither is bundled in this repository. Both are cleared for future use:

SourceLicenceAttributionCommercial
Lucide IconsISCNot required in UIAllowed
UnsplashUnsplash LicenseNot requiredAllowed
PexelsPexels LicenseNot requiredAllowed

Original work

All logo files, design tokens, document templates, and design-system documents are original work, © projectious.work, under the brand-asset terms in Licensing.

Review status

Last reviewed 2026-07-26: no unlicensed, sensitive, or third-party binary assets are committed to this repository. Every physically present file is original.

8 - Tokens

Machine-readable exports of the design values, and how to consume them.

The token files are the machine-readable form of the foundations. They are MIT-licensed — the values are free to use, the marks are not. See Licensing.

Downloads

FileFormatUse
variables.cssCSS custom propertiesAny web project
tokens.jsonJSONBuild pipelines, Style Dictionary
tailwind.config.jsJSTailwind CSS projects

Source: brand/tokens/.

CSS

<link rel="stylesheet" href="variables.css">
.button--primary {
  background: var(--color-primary);
  border-radius: var(--radius-md);
  padding: var(--space-3) var(--space-4);
  transition: background var(--duration-standard) var(--ease-out);
}

What the tokens cover

  • Colour — the seven named aliases. The full 12-step scales are documented on the Colour page; the token file exports the named entry points.
  • Typography — the three font stacks.
  • Spacing — the nine-step 4px scale.
  • Radius — five steps.
  • Elevation — four shadow levels.
  • Motion — four durations, two easing curves.

Consuming them in SCSS

This site maps the tokens onto Bootstrap and Docsy variables in src/assets/scss/_variables_project.scss. That file is a worked example of wiring the brand into an existing component framework — including the full 12-step scales in both modes, which the CSS export does not carry.