Craft

This site is the specimen. Every typeface, color token, component, and animation below is pulled from the system you're looking at right now. One codebase. One designer. One engineer.

74 files · 53 components · 11 routes · 18 design tokens · 4 typefaces

Typography

Four typefaces. Each with a job. Serif carries weight, grotesk carries information, mono carries metadata, handwritten carries intention.

Instrument Serif--font-serif
Headlines & identity
5xlEverything is a system.
3xlEverything is a system.
xlEverything is a system.
Space Grotesk--font-sans
Body & interface
lgI'm an architect — of businesses, products, and the identity underneath both.
baseI'm an architect — of businesses, products, and the identity underneath both.
smI'm an architect — of businesses, products, and the identity underneath both.
Space Mono--font-mono
Metadata & system labels
xsDesign · Code · Architecture · Philosophy · Faith
[10px]Design · Code · Architecture · Philosophy · Faith
[9px]Design · Code · Architecture · Philosophy · Faith
Caveat--font-annotation
Annotations & marginalia
lgThe name is the brand
[15px]The name is the brand
[13px]The name is the brand
Color

18 tokens. No decorative color — every value has a structural role. Graphite is the system color. Domains get their own palette.

Core
paper
#ffffff
paper-warm
#f0f0f0
ink
#1a1a1a
ink-light
#555555
Graphite
graphite
#5c5c5c
graphite-light
#808080
graphite-muted
#4a4a4a
Dark Mode
dark-bg
#0a0a0a
dark-surface
#151515
dark-border
#222222
dark-text
#e0e0e0
Domains
philosophy
#7b68ae
building
#4a9b6e
faith
#c49340
systems
#5b7fa6
code
#3d8b7a
design
#a65b7b
Grid & Spacing

One container. One grid. The rhythm underneath every section.

max-w-5xl (64rem)
px-8
Content area
px-8
80px
Base grid unit · Design Layer overlay
Components

53 components across the site. These are the ones that define the interaction language — how things move, expand, and reveal.

Writing Card

Resting state → hover expansion. Image slides left, text shifts right. Height transitions from 88px to 240px.

Built Card

Same expansion pattern, different content density. Status dots, tech tags, metric reveals all stagger on hover.

Annotation

Positioned labels with hand-drawn arrows. Caveat font, #E94D26 at 70% opacity. 6 positions, 4 arrow directions.

Page Transition

Every route change: fade in + 6px upward slide. Pathname as key triggers remount.

Hero Parallax

Scroll-linked transforms on the hero photo: blur 0→12px, opacity 1→0.15, text fades at 80%.

Grid Overlay

80px grid at 3% opacity. Wave texture at 15% with soft-light blend. Both toggle with the Design Layer.

Motion

Framer Motion throughout. Four patterns cover every animation on the site. Nothing decorative — each one serves orientation.

Entrance
initial={{ opacity: 0, y: 12 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
Stagger
variants={{
  hidden: {},
  visible: { transition: { staggerChildren: 0.1 } }
}}
Scroll-linked
const { scrollYProgress } = useScroll({ target, offset })
const blur = useTransform(scrollYProgress, [0, 0.6], [0, 12])
Hover Expand
transition-[height] duration-[400ms]
ease-[cubic-bezier(0.25,0.1,0.25,1)]
h-[88px] group-hover:h-[240px]
Widgets

Four instruments reading real data. Your browser, this codebase, the type system, and the tools underneath. Nothing simulated.

Visitor Lens
Reading environment...
Type Tester
Display — Freight Big Pro

The invisible architecture

Body — System Sans

The invisible architecture

Mono — JetBrains Mono

The invisible architecture

Site Vitals
Measuring...
Live from your browser. Right now.
Colophon
Stack
Next.js 14TailwindFramer MotionSanitySupabase
Typefaces
Freight Big ProSystem SansJetBrains MonoFreight Text Pro
Colors
Accent
Surface
Graphite
Breakpoints
64076810241280
Design Layer

The asterisk in the bottom-right corner activates the design layer — grid overlay, annotations, version stamp, coordinates. On this page, it annotates the system that explains itself.

5 files
context.tsx — boolean toggle provider
toggle.tsx — asterisk button (bottom-right)
grid-overlay.tsx — 80px grid + wave texture
overlay-elements.tsx — tagline, stamps, markers
annotation.tsx — positioned labels with arrows
Elements
*Toggle trigger — fixed, always accessible
“Note”Annotation — Caveat, curved arrows
V.01Version stamp — bottom-left
32.7157° NCoordinates — placed near photos

This page is the argument.

Not a portfolio piece. Not a Dribbble shot. A working system — designed, engineered, and written by one person. The site you navigated to get here is the proof. This page just names the parts.

Next.js · Tailwind CSS · Framer Motion · Sanity CMS · TypeScript