jarvising · entry 003 jarvising.com

in·side the rig

/ɪnˈsaɪd ðə ˈrɪɡ/ noun phrase; here, a teardown in scroll Entry 003

A flagship-class gaming PC taken apart in scroll: seventeen chapters from inside the processor out to the whole machine, then an exploded atlas you can search, isolate and pull apart piece by piece.

A gaming PC pulled apart on a pale lab floor: the front panel with its three fans, the side panels and the radiator with its tubes lifted clear of the open tower, the graphics card and power supply still inside. Open the teardown → WebGL · about three minutes
sound optional · keyboard works

Generic, no brands, on purpose. The machine is modelled on a real flagship build at its published dimensions, but no manufacturer, product line, model name, logo or trade dress appears anywhere: not in the copy, the search, the textures or the model files.

An Adapt Progress Evolve Limited project by Jack Stovell (registered in England and Wales, company no. 10047328, VAT GB362654684) · Source: github.com/StovBuilds/jarvising · src/rig/

What it does

This is the flagship teardown of the Enigma family, at machine scale. It starts where a frame of a game starts, inside the processor: a city of logic blocks at night, an instruction pulse running its streets, then the cache stacked above it. The camera pulls out of the silicon, through a short black dip, and lands a few millimetres off the heat spreader of the real chip in its socket.

From there it works outward, one system per chapter: memory, the motherboard's lanes, the SSD streaming the world in, the PCIe link, then a second abstract world inside the graphics processor where four lanes of work build a frame, and its graphics memory beside it. Then heat, which is where performance ends up: the card's heatsink, the liquid loop carrying the processor's heat to the radiator, the power supply opening up, and the case's airflow drawn as moving air. The last chapters step back through the glass to the whole machine.

Then it comes apart. The atlas is the tool the whole piece ends in: 104 modelled pieces in eight systems you can filter, a search that knows the synonyms (type "memory", "vrm" or "radiator"), hover to identify, click for a plain-English panel with what the part does and why it matters, isolate, and a staged explode slider whose stops mean something: case open, systems, components, every piece. Products with parts inside have their own deep dive, where the slider explodes only that product and the rest of the PC turns to ghost.

A second copy layer, ?mode=brand, shows how a sponsored version would read, with a placeholder partner and a disclosure line. It names no real company; that is the point of it.

Etymology

First attested as lab page 011 on jstov.uk on 7 September 2026, built in four slices over two days; moved here on 29 September with every brand taken out. Below, the build replays itself: every frame is the piece rebuilt from git at that commit and photographed at the same point in its scroll.

The brief, as writtenJack's words, cut
Create a premium interactive web experience that takes the viewer from inside a high-end gaming PC to the complete machine. […] The goal is not a one-off 3D animation. The goal is a reusable PC anatomy platform […]. Start where the frame begins. End with every physical piece that made it possible.

From Jack's master brief, version 0.1, 7 September 2026, sections 1 and 2, as copied into the jstov repo. Cuts are marked; the one inside a sentence drops the name of the private 3D kit the platform was to be built on. The brief's reference build, which named its products, is not quoted.

  • Promise logged15:08 UTC
  • First commit15:36 62f976e
  • Slice 1 live17:21 UTC
  • Logged to live2 h 13 min

Day one, from the records: the commitment ledger (opened 15:08:18, closed 17:21:03), git log on jstov and the commits that wrote the state log. The first code on record arrived by accident: another lane's git add -A swept the half-written folder into its own commit at 15:36:38, and a lint fix followed at 15:40:57. The state log's heading for the start says ~15:45; the commit that saved it says 15:36:44. Slices 2 and 3 shipped the same evening; slice 4, the Blender parts and the mobile and accessibility passes, closed at 07:02 the next morning.

The rig piece as ported to jarvising at commit cab6ce5: the processor in its socket, memory modules beside it, lit in amber.

The latest frame, 29 Sep 2026. With JavaScript on, drag across the picture or use the slider to replay all six.

  1. d7f0a12jstov: the work in progress, swept in by accident, plus its lint fix
  2. 441d38ajstov: slice 1 — lighting, cameras, glass, the atlas
  3. 9fc8438jstov: slice 2 — the cinematic half
  4. cd8a6a8jstov: slice 3 — every product opened up, deep dive, dark lab
  5. b1524e5jstov: slice 4 — Blender hero parts, mobile, accessibility
  6. cab6ce5Ported to jarvising.com as entry 003, every brand removed

Frames rendered by tools/render-build-frames.mjs in software WebGL at ?tier=HIGH, pinned at ?p=0.21 (the package) and ?p=0.72 (moving the heat). The jstov frames come from that commit's own rig files mounted alone, with every product name scrubbed out of the sources before the build (the build refuses to run if one is left) and system fonts standing in for one font package; the lab's red accent is shown as it was. A commit adding the socket vocabulary as data (3b60ba1) changed nothing these beats show and is left out.

How it was made

Real millimetres, generic parts. Every part is built in code from boxes, cylinders, fin stacks and swept tubes at the published dimensions of a real 2026 flagship build: the full-tower case, an E-ATX board, a nearly four-slot graphics card, a 360 mm liquid cooler, a 1600 W supply. One frame for everything (millimetres, +Y up, +Z to the case front, +X to the glass), scaled by a thousand into metres for the camera. The names were never needed: a cooler reads as a cooler because of its shape.

One part tree, one explode engine. Each piece is a node with a stable id, and 104 ids live in one registry. The copy file must describe every id and the builders must emit every id, so a typo on either side is a type error rather than a hole in the atlas. The explode is data: each node carries a stage from one to four, a direction, a distance and a lag, and the slider's four quarters are the stages. Children ride on their parents, so a graphics-card fan gets the card's travel plus its own.

Two abstract worlds at remote origins. The processor city and the graphics lanes are built in the same scene, far below the machine, and the camera jumps between worlds inside short black dips placed exactly on chapter boundaries. The camera flies four segments of keys stamped with scroll progress, sampled by a Catmull-Rom on those stamps so unevenly spaced keys keep an even pace.

Flows as particles. Memory requests, storage blocks, power, coolant and air are point clouds riding curves through the real geometry, each with its own style, switched on and off by chapter. Heat is a sprite field that swells over the chip and the card's power stages.

Blender for the hero parts. The fan rotors at five sizes, the graphics-card shroud, the pump block and the heat spreader come from a scripted Blender parts library, one small GLB of 16 meshes named <part>__<material>. At load the page swaps them into the tree by id before anything is indexed; if the file is slow or missing, the procedural parts stand. ?lib=0 forces that.

Accessibility and mobile. Focus rings, accessible names, a live caption region, a slider that speaks its stage, focus moved into the panel when a control opens it, Escape unwinding credits, then selection, then deep dive, and a plain list of every product for screen readers. Reduced motion stops the drift, the auto-rotate and the eased camera. On a phone the atlas panels fold into bands above and below the machine.

No brands, enforced. The first version named its parts. This one does not: parts are named for what they are, specs are given as classes rather than one product's numbers, the accent that used to be red on black is now amber, and tools/brand-scrub.mjs fails CI if a maker's or product's name appears in the piece's source, its page, its frames' manifest or the strings inside its GLB. The replayed frames below were rebuilt from sources run through the same scrub first.

Built with Claude Code from Jack's master brief and storyboard. The three small helpers the lab version borrowed from a private kit (a device-tier guess, a soft sprite texture and the camera-key sampler) were rewritten here from how they behave; the sampler was checked against the original's output on random keys until they agreed to rounding error.

How to make your own

  1. Start with a registry of ids. Every inspectable piece gets a stable id in one list. Make the content and the builders both typed against it, so the compiler tells you when a part has no words or the words have no part.
  2. Build in real units, in one frame. Pick millimetres and one axis convention, write the layout constants down once, and make every builder a pure function that returns a node. Scale the whole machine once, at the root.
  3. Make the explode data, not animation. Give each node a stage, a direction, a distance and a lag. The slider's stops are the stages, so "case open" and "every piece" are positions, not timelines. Parent children under their node and the travel adds up for free.
  4. Stamp camera keys with scroll progress. A list of [p, x, y, z] rows per segment, sampled with tangents from the neighbouring keys over their time span. Put a ?p= pin in from day one; software GL never settles otherwise.
  5. Hide world changes in the dark. Micro worlds can sit far from the machine in the same scene. Dip to black for a few per cent of scroll on the boundary and move the camera while nobody can see it.
  6. Swap geometry in by id. Author better meshes in a script, name them after the node ids, keep them in the primitive's own local frame, and drop them in before you index the tree. Keep the primitives as the fallback.
  7. Probe instead of guessing. Expose the scene and a raycast helper on window. The two worst frames here were the camera sitting inside a part, found in one probe after two wrong theories.
  8. Scrub what you do not own. If the piece depicts real products, keep a denylist of names in CI and run it over text, textures and model files alike. A model file's node names are as public as the page.

The explode engine, whole (the full piece is in src/rig/ on GitHub):

// each node moves within its own quarter of the slider; children ride along
const ease = (t) => t * t * (3 - 2 * t);

function stageProgress(amount, stage, lag = 0) {
  const w0 = (stage - 1) / 4, w1 = stage / 4;
  let t = (amount - w0) / (w1 - w0);
  if (lag > 0) t = (t - lag) / (1 - lag);   // siblings leave in waves
  return ease(Math.min(1, Math.max(0, t)));
}

function applyExplode(nodes, amount) {
  for (const n of nodes) {
    n.object.position.copy(n.home);
    if (n.explode) {
      const { stage, dir, dist, lag } = n.explode;
      const d = new THREE.Vector3(...dir).normalize();
      n.object.position.addScaledVector(d, dist * stageProgress(amount, stage, lag));
    }
    applyExplode(n.children, amount);
  }
}

Directions are in the machine's frame and distances in millimetres; the node's home is captured once at build time, so the engine can never lose the assembled position.

See also

Entry 001, Enigma: the same idea at the scale of one machine you can type on.

Entry 002, Cortex: a fleet’s memory as a living 3D war table, handed on as a library.

← all entries