Orvantis Intelligence

The house · how it was built

Everything you are looking at was written.

No photography, no stock, no generated rasters. Every visible thing on this site — the field of six thousand points, the aperture, the grain, the letterforms’ entrance — is authored in code. This page explains how, specifically enough that another designer could rebuild it.

01 — Concept

A headquarters, filmed

Orvantis Intelligence helps organizations adopt AI quietly. The site had to make that argument by demonstration: no hype, no gradients screaming “AI”, no dashboard screenshots. The direction we committed to is a headquarters you walk through at night — seven full-viewport chapters, framed by a thin HUD (chapter index, Accra coordinates), shot in near-monochrome where light is the only color.

The palette is four values of one atmosphere plus a single beam: obsidian, graphite, moon silver, porcelain — and aurum, spent like money. If aurum appears more than a few times per viewport, it stops being a beam and becomes a theme. We rationed it: the sigil core, the chapter numerals, the ligature hairline, focus rings, one italic phrase in the opening sentence.

Obsidian#07090D
Graphite#11151C
Moon silver#AEBECD
Porcelain#E8ECF1
Aurum#B89B5E
02 — Identity

The sigil, the wordmark, the voice

The mark is an aperture: four concentric arcs, each deliberately incomplete, around a small aurum core. Incompleteness is the point — an iris mid-open, an organization mid-adoption. Each arc is a plain SVG <circle> whose visible portion is cut with stroke-dasharray and rotated into position, so the whole mark is about ten lines of markup and scales from a 16-pixel favicon to the preloader without redrawing.

Anatomy

  • Four arcs, radii 12 / 18 / 24 / 30 — a fifth would read as a target, three as a spinner.
  • Every arc is broken; the gaps rotate at different phases so no two openings align.
  • The core is the only filled shape and the only aurum — attention lands there by default.
  • As preloader, the arcs sweep in staggered, then all rotate open together and dissolve onto the field: the aperture opens, the film begins.

The wordmark is set in Newsreader at display optical size, with one engineered moment: a hairline aurum swash drawn as an absolutely-positioned SVG path across the full measure of the word, and an italic a seated among roman letters — a single character borrowed from the italic file, which variable fonts make free.

Newsreader · display · 380 & italic 330

The future settles in.

Geist · interface & body · 400

Quiet adoption means systems that enter an organization the way good infrastructure does — studied first, trusted early, invisible eventually.

Geist Mono · labels & coordinates · 400

CH. 03 — Approach · 05.6037° N — 000.1870° W

All three families ship as self-hosted variable woff2 — four files, ~330 KB, the whole typographic system. font-display: swap plus a preload on the two critical files keeps first paint honest.

03 — Signature

The intelligence field

The site’s one big idea: a fixed WebGL canvas behind everything, holding 6,400 points (3,200 on small screens) that reorganize as you read. Chapter 00 is chaos — a slow spiral galaxy. By Practice the points have gathered into constellations of thought-clusters. By Approach they lock into a lattice. Disorder becomes structure as the argument for disciplined adoption unfolds. No library — raw WebGL 1, one draw call, about 370 lines.

Three formations, one buffer each

Every point owns a position in all three formations, uploaded once as static vertex attributes. The CPU never touches them again; the morph happens entirely in the vertex shader, driven by a single uniform uPhase that scrolls from 0 → 2:

// vertex shader — the whole choreography
float p1 = ease(clamp(uPhase, 0.0, 1.0));       // chaos → constellation
float p2 = ease(clamp(uPhase - 1.0, 0.0, 1.0)); // constellation → lattice

// per-point lag so formations knit rather than snap
float lag = aSeed.y * 0.28;
p1 = clamp(p1 * (1.0 + lag) - lag, 0.0, 1.0);

vec3 pos = mix(aChaos, aConst, p1);
pos = mix(pos, aLattice, p2);

The lag line is what makes the morph feel biological: each point starts moving at a slightly different scroll position (seeded per-point), so the field knits into its next shape instead of tweening in lockstep.

Parting around the cursor

After projection, each point knows its own screen position in normalized device coordinates. We push it radially away from the cursor with a Gaussian falloff — aspect-corrected so the “hand” is circular on any viewport:

vec2 sd = vec2((ndc.x - uMouse.x) * uAspect, ndc.y - uMouse.y);
float len = max(length(sd), 0.0001);
float push = uMouseF * exp(-(len * len) / 0.085);
ndc += vec2(sd.x / uAspect, sd.y) / len * push;

Because the push happens in screen space after the camera, it costs nothing and works identically at every dolly distance. uMouseF eases toward 0 when the pointer leaves, so the field closes behind you like water.

Scroll as camera

A keyframe table maps document positions to phase and dolly (camera distance); scroll interpolates between rows, and the render loop eases toward those targets at different rates — position slower than intent, which is what makes the motion feel weighty rather than bouncy:

// main.js — keypoints; field.js eases toward these each frame
{ y: 0,                  phase: 0,    dolly: 3.1  }  // arrival · chaos
{ y: centerOf(thesis),   phase: 0.55, dolly: 2.65 }
{ y: centerOf(practice), phase: 1.0,  dolly: 2.9  }  // constellation
{ y: centerOf(approach), phase: 2.0,  dolly: 2.45 }  // lattice
{ y: centerOf(corr),     phase: 2.0,  dolly: 4.1  }  // pull away

When the field cannot run

Under prefers-reduced-motion, or when WebGL is unavailable, the same canvas gets a static long-exposure render drawn once with 2D arcs — nine hundred faint orbital streaks and a scatter of resolved stars, seeded deterministically so it composes identically on every visit. The metaphor survives with zero motion.

04 — Atmosphere

Grain, vignette, and the grammar of motion

Film grain is one CSS rule: an SVG feTurbulence texture encoded as a data URI, tiled at 8% opacity above everything, stepped through three positions per second so it shimmers like print stock rather than swimming like video noise:

.grain {
  background-image: url("data:image/svg+xml,…feTurbulence
    type='fractalNoise' baseFrequency='0.82'…");
  opacity: 0.08;
  animation: grain-shift 0.9s steps(3) infinite;
}

The vignette is two stacked gradients — a radial pool centered slightly above the fold and a top/bottom letterbox — which keeps every chapter feeling lit from within the frame. Motion everywhere follows one grammar: 0.9–1.4 s durations, exponential-out easing, headline words rising through overflow masks like end credits, sections dollying ±26 px and settling as they cross center. Nothing bounces; nothing arrives faster than a held breath.

The wordmark’s first-load entrance follows the same grammar: four masked chunks rise in 130 ms steps while the preloader’s aperture rotates open, then the aurum swash draws itself across the word via pathLength="100" and a dash-offset animation, and “INTELLIGENCE” tracks in from a whisper of extra letter-spacing. Pure CSS — it still runs with JavaScript disabled, and disappears entirely under reduced motion.

05 — Toolchain

How it was made, honestly

This site was designed and engineered by Fable 5 (Anthropic’s model) working as designer-engineer, directed by Hannah Kwakye — art direction, brief, taste, and final cut are hers. That division of labor is the thesis of the whole collection: AI does not replace taste, it amplifies the designer who has it.

06 — Iteration log

Three passes before done

Pass 1

Design critique

  • Screenshots at 390/834/1440 showed the dim-silver text tokens drifting below AA contrast on obsidian — retuned --silver-dim to 72% and moved every text-bearing “faint” usage up a step; hierarchy kept, compliance earned.
  • The wordmark simply existed when the aperture opened — no arrival for a chapter named Arrival. Flagged the hero entrance as the site’s weakest beat.
  • The chapter rail read as decoration at 38% alpha; active-state aurum was the only legible entry. Lifted inactive numerals to the dim tier.
  • The tablet shot caught the hero lockup drifting off-center: “INTELLIGENCE” was still an inline span, overflowing the wordmark’s line and colliding with the chapter rail. One display: block restored the centered lockup at every width.
Pass 2

Elevation

  • Built the credit-roll entrance: four masked wordmark chunks rise in step as the preloader iris opens, the ligature hairline draws itself, the subline tracks in — one continuous 3-second opening shot instead of a loader then a page.
  • Held the arrival copy behind an intro body class so sentence and “Begin” land after the title, then removed the class so scroll-back reveals stay instant.
  • Added a restrained pool of light behind the title — two faint radial gradients, silver then aurum — so the hero reads as lit rather than pasted.
  • Wrote /guide and /process as full editorial pages in the same language: HUD, dimmed field, grain, chapter-label rhythm.
Pass 3

Ship quality

  • Walked every route at three viewports and scrolled every chapter — zero console errors, all links resolve (anchors, sibling routes, registry URLs for the Launch and the Lab, the hub) — and proofread every word against the voice rule: sparse, assured, no hype.
  • Verified reduced-motion end to end: preloader skipped, long-exposure render in place of the field, reveals instant, credit-roll suppressed. Verified the no-WebGL path takes the same fallback.
  • Exercised the correspondence letter: Netlify attributes, honeypot, required fields, and the ?sent=1 success state that swaps the form for a reply.
  • Audited this guide’s own claims against the code — added the promised content-visibility: auto to the doc sections, and gave the doc pages’ HUD a soft scrim so scrolling body text never collides with the brand.
07 — Deploy

Shipping

The site deploys to Netlify from a static directory — publish = ".", immutable cache headers on assets/, conservative security headers on everything. The correspondence letter is a native Netlify Form: detected at deploy time from the data-netlify attribute, protected by a honeypot field, answered inline via a ?sent=1 redirect. No serverless functions, no client-side form library — the platform does the work.

Orvantis is the second of twenty-six sites in this collection, and its headquarters: AI Operations Launch™ and Next Builders Lab™ are its first engagement and its education arm, each built as its own world.