Everything the homepage, case-study template and contact page are built from. Palette and type come from the logo: an angular geometric wordmark, red/olive/gold stripes on a black or white field. We kept the four colours, made paper the default light surface, and added one display face with the same cut-corner energy.
Homepage → Case study → Contact →
DM Sans at 300 for lede paragraphs, 400 for body, 500 for labels. Optical size axis on: small text renders wider.
Rules. Display is always uppercase above 36px, mixed case below. Weight is a voice: 500 speaks, 700 states, 900 shouts — mix them within one headline (see "Selected WORK"). Body never exceeds 68ch. Labels are 11–13px, 0.14–0.16em tracking, uppercase. Numerals in display, always.
Why these. Big Shoulders' narrow, cut-corner letters echo the logo's angular A and R without copying it. DM Sans is neutral enough to disappear next to it, and has the Ghanaian cedi sign.
References: Adinkra stamp repetition, kente warp stripes, Bogolan mud-cloth grids, market signwriting, screen-printed posters. What we keep is the logic — hand-made repetition, misregistration, bold flat colour — never the motifs themselves.
12 columns, gutter clamp(16px, 2vw, 32px), page margin clamp(20px, 4vw, 56px). Max content width: none — type scales with vw and caps in px.
Spacing scale 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 · 88 · 120 · 150 · 180. Section padding clamp(72px, 10vw, 150px).
Breaking the grid, deliberately. Work pieces may rotate ±2°, offset vertically by 40–140px, and hang 8–16px hard shadows in a logo colour. Brush marks ignore the grid entirely. Rules: at most one rotated element per viewport, and text never rotates.
Mobile collapses to 4 columns, 16px gutter, 20px margin; rotations drop to ±1°, offsets to 24px.
Fixed, mix-blend-mode: difference so it inverts over any surface. Wordmark text, not image (the logo lives in hero and footer). Active link underlined in red. Hides on scroll-down, returns on scroll-up (300ms).
Pill, 44px min height. The dot is the signature: it's the logo's colour stripes reduced to one point. Hover: fill swaps ink↔paper (300ms), dot scales 1→1.4 with overshoot. Magnetic ±6px within 40px radius.
Underline is a 1.5px border, not text-decoration. Hover: underline slides out left and back in from right (400ms, expo), colour → red. Nav links: text splits and rolls up (the classic), 350ms.
Four treatments: Tilt + hard shadow, Duotone + halftone, Colour block with one radius corner, Browser frame. Never two of the same treatment adjacent.
14px red dot, mix-blend difference, lerp 0.18 (slightly behind the pointer — a brush following a hand). Over links: 40px paper ring. Over work: 88px gold disc with a verb. Hidden on touch devices and when a native cursor is needed (inputs).
One idea: a hand making marks, then a machine finishing them. Entrances are drawn or wiped (organic, decelerating); interactions are crisp and mechanical (short, springy). Two easings only: expo.out / cubic-bezier(.2,.9,.2,1) for arrivals, cubic-bezier(.7,0,.2,1) for wipes and exits. Lenis lerp 0.08. Yellow M-tags on the homepage point to each entry below (press n on the homepage to show them).

A four-partner design and engineering studio in Accra. Every mark here was drawn fresh when you arrived.


Tap opens the line to a two-line description and a "Start →" link. No hover states on touch; the row inverts on press instead.
navigator.hardwareConcurrency ≤ 4): SVG strokes, CSS duotone, no ripple. Tier 3 (no WebGL / save-data): static SVG strokes, plain images. Detect once on load; never switch mid-session.font-display: swap with size-adjusted fallbacks so the hero doesn't reflow. Hero LCP under 2.5s on 3G: the headline is text; strokes are inline SVG (no request). Work images: AVIF, 1600w, lazy below the fold, blur-up in a logo colour. Three.js loaded only on Tier 1, after first paint. Cap DPR at 1.5.