Game-first entrance (iframe). The homepage embeds a custom 2D arcade game built in p5.js. Pick from 11 character classes (Warrior, Mage, Archer, Knight, Ninja, Paladin, Rogue, Berserker, Monk, Druid, Warlock — each with their own sprite sheet), arrow-keys to move, space to shoot, AddChai-branded power-ups boost fire rate, parallax scrolling backgrounds, three-heart health system, on-screen timer. The level ends with a boss battle. The iframe loads instantly, the game runs entirely client-side, and only when the player either wins or chooses to exit does the site reveal the agency layer behind it.
Leaderboard — Firebase Firestore. The game lazy-loads the Firebase Web SDK (v11.9.1) at score-submission time only — so the iframe doesn't pay the network cost upfront. On clear, the player submits name + completion time + score; the leaderboard view reads back ordered top scores from Firestore in real time. The "competition is shareable" loop runs entirely on Firestore reads/writes with no custom backend to babysit.
Retro OS chrome. Behind the game iframe is the agency site itself, presented as a virtual desktop. Brand sections (work, services, about, contact) live in OS-style windows with chrome (close / minimize / drag) that the visitor opens, drags around, and arranges. Visual language is intentionally retro — pixel-leaning typography, system-style window borders, dot-grid background — so the chrome reads as deliberate-design-decision, not budget Bootstrap. The whole shell is hand-built; no admin panel, no theme.
Spun-off side artefact: the typing scene. One of the OS-windows was a 3D scene where two puppeteer-style wooden hands type on a 3D QWERTY keyboard — type on your physical keyboard and the closest finger reaches over and presses the matching 3D key. Built with
Three.js, CCD inverse kinematics for the finger-to-key targeting, MeshPhysicalMaterial with clearcoat / sheen / wood-grain textures for the puppeteer look, HDR environment mapping for reflections, plus an EffectComposer post-processing chain (UnrealBloomPass for the neon-accent glow, SSAO for contact shadows). Each key has its own press / release sample with randomised playback rate and detune so the audio stays alive over long typing. It outgrew its window, so I detached it and shipped it as a standalone ASMR experience at typing-ai.netlify.app with its own public source repo.
Solo full-stack. No agency engineering team, no CMS — just a handful of well-organised vanilla JS modules, a p5.js game, a Three.js scene, and a Firestore project. The whole thing is small enough that I can ship a content update without a deploy pipeline.
addchai-game, typing-ai) so anyone can read the implementation