VELOCITY is one of 25 sites designed and built by Formwork to show what a modern web front-end can feel like. This one is the "grounded in what actually ships" reference — crisp, fast, motion-forward. Here is exactly how it was made.
The brief was an AI code-review startup, so the hero had to prove the product in the fold. Instead of a screenshot, the hero is a live pull-request review that types itself out: a real diff of a vulnerable SQL query appears line by line, VELOCITY "reviews" it, and an inline comment slides in explaining the injection and the fix. Everything else — near-black canvas, one electric-blue accent, JetBrains Mono everywhere — exists to make that panel feel like a real tool.
main.Because JetBrains Mono is monospaced, a convincing typewriter needs no per-character DOM surgery.
Each line is a real element; JavaScript measures its natural width with scrollWidth, then
animates the width from 0 to that value with a steps() timing function — so the
text uncovers character by character behind a blinking caret. The lines are chained with promises:
function typeLine(ln){
return new Promise(res => {
const inner = ln.querySelector('.code-inner');
const full = inner.scrollWidth; // natural content width
const chars = inner.textContent.length;
const dur = Math.min(460, Math.max(120, chars * 13));
inner.style.width = '0px';
ln.classList.add('typing');
requestAnimationFrame(() => {
inner.style.transition = `width ${dur}ms steps(${chars},end)`;
inner.style.width = full + 'px'; // uncover the line
});
setTimeout(() => { ln.classList.add('is-typed'); res(); }, dur + 40);
});
}
The whole scene is additive: the diff and the AI comment are real markup, hidden only by
a .js class. If the script or CDN fails, the finished review still renders — and a 6-second
failsafe reveals everything if the animation ever stalls.
.loaded class added on a
double requestAnimationFrame plus a 400 ms failsafe, so it never freezes in a background tab.prefers-reduced-motion disables the typing, the scan, and the
pulse, and forces every hidden element visible with !important.The site is fully static, so hosting is three commands:
git init -b main && git add -A && git commit -m "ship"
gh repo create formwork-velocity --public --source=. --push
gh api --method POST /repos/OWNER/formwork-velocity/pages \
-f 'source[branch]=main' -f 'source[path]=/'
Use relative paths (./main.js, not /main.js) — project Pages live under
/repo-name/. Drop an empty .nojekyll file so every asset serves verbatim.
That is the whole recipe: one self-typing panel, a scanning grid, restrained colour, strong mono type, and static hosting. The other 24 sites swap the central technique — shaders, kinetic type, 3D — but the discipline is the same.