Portfolio · card deep-dive · v3 · 2026-04-12

Layout A with
every visual type

Follow-up to v1 (six layouts) and v2 (mandatory imagery, auto-tint, writing differentiation). This doc pins Layout A — top third strip as the card structure and asks: does it hold up across all six visual types, and what happens when the screenshot is a mobile app?

Two decisions baked in before this doc opens a single card: (1) Layout A is fixed — every card has a 160px top strip with content below. v2's concern about mixed-species grids is resolved because imagery is now compulsory on every card. (2) Numerals and monograms render in the card's register colour, not the signature gradient. The gradient is reserved for the gradient-mark type and featured cards — overusing it on text marks weakens the visual system and turns the page into soup.

§1 · visual types

Six visual types, one layout

Each pair shows a work card (royal) beside a writing card (violet). The strip is 160px tall, spanning full card width. Content below is identical across pairs so the only thing that varies is the imagery treatment. Same hover state across all six: background lift + border change to the card's register colour. No per-type one-offs.

Type 1 — Screenshot · auto-tinted via mix-blend-mode: color. Author drops in any screenshot, component forces it into palette.
SELECTED WORK · 02

The Weekly App

Meal-kit POC that turns Coles recipes into a consolidated trolley.

  • REACT
  • VITE
  • NETLIFY
Type 2 — Diagram · palette-locked strokes (royal-10 / violet-10). Mermaid + Excalidraw exports swap in at render time.
request killswitch vendor
SELECTED WORK · 01

Planner App

GTD planner with persistent SMS, four-layer spend protection, and a killswitch that works.

  • TYPESCRIPT
  • CLOUDFLARE
  • D1
CHOKE POINT
ESSAY · ARCHITECTURE

One module for every paid call

Convention-based spend discipline fails under pressure. Structural choke points don't.

  • architecture
  • reliability
Type 3 — Numeral · Fraunces display at 112px in the card's register colour. Changed from v2: solid colour, not gradient.
01
SELECTED WORK · 01

Planner App

When no screenshot or diagram fits the brief, the numeral carries the card on typography alone.

  • TYPESCRIPT
  • GTD
Type 4 — Gradient mark · the signature. Use sparingly (see §2).
SELECTED WORK · FEATURED

Design system retrofit

Tokens-first architecture applied across three projects. Gradient-mark carries the abstract weight.

  • TOKENS
  • REFACTOR
ESSAY · SIGNATURE

Royal Tonal in twelve steps

When the content IS the palette — gradient-mark is the only imagery that makes sense here.

  • colour
  • design
Open question on gradient-mark. Your feedback: when many cards show the gradient, visual identity weakens and the page becomes soup. Fix for text marks (numeral, monogram) is done — they use card colour now. But gradient-mark is the gradient. Proposed rule: gradient-mark is reserved for featured cards only and for posts where the gradient itself is the subject matter (see "Royal Tonal in twelve steps" above). This caps its appearance at roughly one per page and preserves it as a moment-of-emphasis mark, not a filler type. If you agree, gradient-mark drops out of the author's default-choice set and becomes a conscious reach.
Type 5 — Icon · lucide-react, 68px stroke in card register colour. Subtle radial tint backs the icon.
SELECTED WORK · 03

MOB analysis

Quarter-by-quarter breakdown of a two-year B2B sales cycle from raw Salesforce exports.

  • ANALYSIS
  • SQL
ESSAY · META

Writing as research

The posts that forced me to understand what I was actually claiming about the systems I was building.

  • craft
  • meta
Type 6 — Monogram · Geist Mono at 44px in card register colour. Lightest-weight option, works when nothing else fits.
PLN
SELECTED WORK · 01

Planner App

Short-code lockup — the fallback when diagram and screenshot both feel forced.

  • TYPOGRAPHY
R/W
NOTE · FRAGMENT

Read-write reciprocity

Monogram in violet only. Good for index pages where many cards need to feel like siblings.

  • notes
Consistency mechanics. Every type shares: (1) 160px strip height, (2) card-register palette — royal for work, violet for writing, gradient reserved for §2 edge cases, (3) identical border, radius, hover transition. Six visual languages, one system. The auto-tint on screenshots is the load-bearing trick — it means the author never has to negotiate with palette on arbitrary image input.
§2 · the gradient rule

Why text marks use card colour, not gradient

v2 rendered the numeral with background: var(--grad-rv); -webkit-background-clip: text. That looked great on a single card. It looked muddy on a 2×2 grid because every text mark became the same gradient, regardless of whether the card was work or writing. The register split collapsed into visual noise.

The rule now: text marks inherit the card's register colour. Work gets royal-10. Writing gets violet-10. Nothing in between. The gradient still exists — it lives on the gradient-mark type and on featured card borders (see v2 §4) — but it doesn't leak into every card that happens to use a numeral.

Before — numeral uses gradient fill (v2 behaviour). Work and writing numerals look identical from 2m away.
01
SELECTED WORK · 01

Planner App

Gradient fill. Pretty in isolation; works against register signal in context.

  • TYPESCRIPT
04
ESSAY · LESSONS

Four guardrails

Writing card — but the gradient is indistinguishable from the work card on the left.

  • postmortem
After — numeral uses register colour. Royal vs violet reads instantly, kicker and tags reinforce rather than compete.
01
SELECTED WORK · 01

Planner App

Royal-10 numeral — same colour family as the kicker and the arrow. The card reads as one thing.

  • TYPESCRIPT
04
ESSAY · LESSONS

Four guardrails

Violet-10 numeral. The writing register is now carried by three coordinated signals, not one gradient.

  • postmortem
§3 · mobile screenshots

When the "screenshot" is a phone

Layout A's strip is ~420px × 160px on a 2×2 landing grid (~2.6:1). A mobile screenshot is ~390 × 844 (~1:2.16). The strip is about six times wider than tall, relative to the phone. Cover-cropping shows ~18% of the screen; contain-sizing leaves a 72×156 phone floating in a sea of padding. Neither reads as intentional.

Six options below, each rendered as a real strip so you can judge them directly. Same fake phone markup in all of them — the only variable is how it's placed inside the frame.

Option M1 — Top slice. Phone positioned at the top of the strip, growing downward off-frame. Shows header + nav + first rows only.
SELECTED WORK · 01

Planner App

M1 — natural if the app bar is the most recognisable UI element.

  • TYPESCRIPT
  • CLOUDFLARE
ESSAY · BUILD

The app bar problem

Feels fine in isolation. Weakness: the phone looks cut off, not framed.

  • mobile
Option M2 — Contained device. Whole phone visible, centered, small. Radial glow frames it.
SELECTED WORK · 01

Planner App

M2 — the phone is honest about being a phone. Reads as "here is the product".

  • TYPESCRIPT
ESSAY · SHIPPING

Holding the phone

Weakness: the phone is small — UI detail reads as "something" but not "this specific thing".

  • mobile
Option M3 — Tilted, bleeds right. Phone rotated 10°, positioned right-of-centre, extending above and below the strip. Radial glow on left feels intentional.
SELECTED WORK · 01

Planner App

M3 — the tilt converts "cropped phone" into "composed phone". Most editorial.

  • TYPESCRIPT
  • MOBILE
ESSAY · FEATURE

Why tilt the phone

Weakness: applies one "art direction" gesture per card — starts to feel like a trick if every work card uses it.

  • design
Option M4 — Dual cascade. Two phones, counter-tilted, overlapping. Suggests a flow or a before/after.
SELECTED WORK · 01

Planner App

M4 — good for products with a two-screen story. Overkill for single-screen apps.

  • TYPESCRIPT
ESSAY · PATTERN

Before and after

Weakness: requires two screens that pair cleanly. The author has to do art direction, not just capture.

  • pattern
Option M5 — Meta split. Left half is a numeral or label; right half is a tilted contained phone. Hybrid of Type 3 (numeral) and mobile screenshot.
SELECTED WORK
01
SELECTED WORK · 01

Planner App

M5 — strongest editorial feel. Meta label anchors the card, phone supplies proof.

  • TYPESCRIPT
  • CLOUDFLARE
ESSAY
04
ESSAY · 04

Guardrails for mobile

Weakness: the numeral now duplicates the kicker number. Redundant if both are shown.

  • mobile
Option M6 — UI detail zoom. Not the phone — one UI fragment (button group, list, panel) rendered at the strip's aspect ratio. Reads as "here is the interesting bit".
SELECTED WORK · 01

Planner App

M6 — doesn't pretend to show the whole app. Shows the exact moment the card is about.

  • TYPESCRIPT
  • DETAIL
ESSAY · DETAIL

The shape of a list

Weakness: requires a crop decision per card. No automatic answer from "here's the screenshot".

  • craft
Option Author effort Honest to UI Grid rhythm Read
M1 · Top slice low partial clean Safe default. Reads as "cut off" when the app bar isn't load-bearing.
M2 · Contained none yes clean Honest but tiny. UI detail disappears at grid scale.
M3 · Tilted bleed medium partial clean Best balance. Composition signals "this is a product shot", phone reads as intentional.
M4 · Dual cascade high yes mixed Great for two-screen stories, heavy otherwise. Save for hero cards.
M5 · Meta split medium yes mixed Strong editorial feel, but duplicates kicker number if the meta shows the same digit.
M6 · Detail zoom high yes clean Highest craft ceiling, highest author cost — requires a crop decision per card.
My read: M3 (tilted bleed) as default, M1 (top slice) as fallback. M3 handles single-screen apps gracefully and turns the aspect-ratio problem into a compositional feature. M1 is the no-decisions escape hatch when M3's art direction feels wrong for a specific piece (e.g. a writing post where the phone is referenced but isn't the subject).

Recommendation

Lock Layout A (top third strip, content below) as the card spec. All six visual types render cleanly in it, the strip is big enough to carry meaningful imagery, and the content-below pattern is the most familiar scan order.

Adopt the text-mark colour rule: numerals and monograms use the card's register colour (royal-10 for work, violet-10 for writing). The signature gradient lives only on the gradient-mark type and on featured card borders. Treat gradient-mark as a deliberate reach — suitable for featured cards and posts where the palette is the subject, not as a filler for cards that have no better image.

For mobile screenshots, make M3 tilted bleed the default and M1 top slice the fallback. Document both in the imagery standards so the author has a one-sentence rule: "Mobile case study → tilted bleed. If the bleed composition fights the content, fall back to top slice."

Open question to resolve before closing this doc: