VANDAL
PORTAL
Five builds. One operator. This is not a portfolio page; it is a record. What was decided, what it cost, what is still broken, and what proves it happened.
The Instrument
Spec
WARP GRID: EIGHT COLUMNS, SIX AT 1024, FOUR AT 700. VISIBLE, ALWAYS.
RADIUS ZERO. SHADOW NONE. GRADIENT NONE. WORDMARK TYPESET, NEVER DRAWN.
ONE FILE. NO FRAMEWORK, NO BUNDLER, NO BUILD STEP. RUNS OFFLINE, RUNS FROM A USB STICK, RUNS WHEN THE TOOLCHAIN IS GONE. PAPER IS THE ARCHIVE FORMAT: PRINT STYLESHEET INCLUDED.
EVERY SUBSYSTEM IS WRAPPED IN guard(). KILL ANY ONE; THE DOCUMENT STILL READS. ONE RAF LOOP, SUBSCRIBERS ONLY, STOPS WHEN THE TAB HIDES. THREE TIERS: FULL, LOW, DOM — EACH A DESIGNED COMPOSITION.
PUBLISH THE BEHAVIOUR, WITHHOLD THE NUMBERS. SHIP THE INSTRUMENT, NOT THE PARAMETER TABLE.
NO RECEIPT IS STATED, NOT HIDDEN. A MISSING LEDGER IS PRINTED WHERE A LEDGER WOULD SIT.
CORRECTED 04 SEP 2026 — BONE AND ASH MOVED TO THE BRAND BIBLE VALUES (#E8E4DC / #8A847C). TWO CANONS INSIDE A SYSTEM ABOUT GOVERNANCE IS A GOVERNANCE FAILURE. THE BIBLE WINS.
STANDING DEFECT, THIS PORTAL — SEVERITY MEDIUM: ZERO REAL CAPTURES ACROSS FIVE CASES. EVERY PLATE RUNS AS NOTATION, AN EIGHT-COLUMN RULED FIELD WITH A CENTRED NO RECEIPT. THE GAP IS LISTED HERE, NOT HIDDEN.
VANDAL.EXE
A first-person graffiti game in a single HTML file. The claim: a complete, felt game can ship as one link. No install, no engine, no loading screen.
Declaration
ONE LINK.NO INSTALL.THE MARK THINS WHEN YOUR HAND MOVES FAST.THAT IS THE WHOLE GAME.
The Constraint
One HTML file. Yard, metro, paint physics, HUD, undo: everything arrives in a single response body and plays. No engine fetch, no asset manifest, no second request.
CAPTURES ARE A STATED GAP. THE PLATES RUN AS NOTATION UNTIL REAL FOOTAGE SHIPS. LISTED AS A DEFECT ON THE INDEX.
Key Findings
- 01
A seven-feature atmosphere pass was built, shipped, then deleted. The game read better without it. Restraint beat craft.
- 02
Paint that thins when your hand moves fast is the entire game. It is worth more than every visual feature combined, because it is the thing players feel in their wrist.
- 03
A train that holds at a platform is a better tutorial than any text. Players learn movement, range, and urgency by chasing the metro.
- 04
One file is a distribution strategy. The link is the install.
The Instrument
The Decision That Cost Something
I cut the atmosphere pass after building it completely. Seven perception-layer features: contact shadows under every structure, drifting light motes, lamp halos, god rays, a pulsing sun, a dragon shadow sweeping the ground, a breathing idle camera. All functional. All deleted.
What I chose against: the version of the game that screenshots better. What it cost: the stand-in-the-plaza-at-dusk shot, and hours of real craft I was proud of.
I would cut it again. Every one of those effects asked the eye to look at the rendering instead of at the paint. The game is the mark you make. Anything that competes with the mark is subtraction disguised as polish, even when it is beautiful, even when it works. Craft you can delete on purpose is worth more than craft you cannot.
Solo. Gurugram. A Dell laptop. Two months, April to May 2026. One HTML file, no build step, written on the machine and shipped as a link.
What Got Cut
| Feature | Verdict | Reason |
|---|---|---|
| Atmosphere pass (7 features) | CUT | Upstaged the paint; deleted after shipping |
| Multiplayer walls | CUT | Sync infrastructure for a solo-scale experience |
| Score/timer pressure | CUT | Vandalism with a leaderboard is a different, worse game |
| Character models | CUT | First-person; hands you would look at twice |
| Photo mode | CUT | The Snap button is the photo mode |
| Undo | KEPT — NON-NEGOTIABLE | Painting without undo is painting scared |
| Practice guides | KEPT | Grid plus trace word; respect for the craft |
Never on the table: the velocity-sensitive paint engine.
SIDE BY SIDE: WHAT WAS BUILT AND DELETED, BESIDE WHAT SHIPS. NO SCREENSHOT OF THE DELETED BUILD IS PUBLISHED ANYWHERE. THE LEFT PANEL IS DRAWN FROM THE FEATURE LIST. IF THE ORIGINAL FOOTAGE SURFACES, IT REPLACES THAT PANEL.
The Approach
The mark is computed from hand speed and can state, tuned until a fast stroke reads as fast and a slow one reads as deliberate. The velocity curve, the spray range, and the blur behaviour are not published.
The metro is a timer with a platform, not a path network. The yard is a grid with a few rules about which faces accept paint. Neither list is published: the feel is the product, and the feel does not transfer by reading.
Provenance & the Standing Defect
| Date | Commit | SHA |
|---|---|---|
| 22 AUG 2026 | initial: VANDAL.EXE graffiti game — standalone HTML/Three.js | a4b7804 |
| 30 AUG 2026 | update: latest VANDAL.EXE build | 9ee50c4 |
| 02 SEP 2026 | fix: remove build scaffold, static deploy only | 19353bb |
PRIVATE REPO. THE LEDGER IS STATED HERE AND CAN BE OPENED ON REQUEST. THREE COMMITS; THE GAME ITSELF WAS BUILT APRIL–MAY 2026, LOCALLY, BEFORE THE REPO EXISTED.
Persistence is fragile. Paint lives in canvas textures and progress in local storage; clear your browser data and the yard is buffed clean. Poetically correct for graffiti, and still a data-loss defect. A real save system needs accounts and a backend. I chose the link-that-plays over the account-that-saves.
wipe site data on the live build and the yard is gone; there is no recovery. The atmosphere pass is absent from BUILD 29, visible in the HUD: no control for it exists.
Colophon
Primitive: cloth(r,i), order 8, period 7. One boolean array read through the hero field, the valve instrument, this diagram, and the selvedge on the index spec block.
Contrast: bone on void 15.61:1; ash on void 5.35:1; crimson on void 5.54:1. Captures: NO RECEIPT, three plates running as notation. What this page cut: the stack string, the tuning table, and every screenshot it could not produce honestly.
BAJO
PLAYER
A zero-buffer Web Audio player with dual-deck crossfading, parametric EQ, real-time spectrum analysis, and offline playback. The claim: a browser can host a professional-grade audio tool in a single file.
Declaration
TWENTY TRACKS.ZERO BUFFER.PLAYS OFFLINE.ONE FILE.
The Constraint
Cold start on a slow connection was several seconds of silence before the first track. A player that pauses before it plays is broken at hello. And the browser suspends audio the moment it decides you are done listening; the UI kept advancing while the sound cut out.
Key Findings
- 01
Cold-start playback dropped from several seconds to under half a second on 3G by remastering every file for instant start. Distribution format is a design decision.
- 02
Audio never drops. A keepalive thread prevents the browser suspending audio mid-playback, killing the ghost-playback bug where the UI advances but sound cuts out.
- 03
The audio library got roughly two-thirds smaller with no audible quality loss. Master for the network, not the studio.
- 04
Player, EQ, visualizer, playlist editor, offline cache, and twenty tracks ship as one HTML file. No build step.
The Instrument
The Decision That Cost Something
I chose single-file architecture over a modular build system. No bundler, no framework, no package manager. The entire application lives in one long file.
What it cost: no hot module replacement, no tree-shaking, no component isolation. Every refactor is manual, and nobody else could navigate the file but me.
What it bought: zero build time, zero dependency drift, and the ability to reason about the whole application in one scroll. When audio dropped mid-playback I knew exactly where to look, because everything lives in the same scope. I would choose it again at this scale without hesitating. The tooling I declined exists to serve teams and codebases I do not have. The bug that mattered most, browser audio suspension, was found and fixed precisely because there was nowhere for it to hide.
Solo. Gurugram. A Dell laptop. Two months, July to August 2025. Twenty tracks I chose, one long file, no build step.
What Got Cut
| Feature | Verdict | Reason |
|---|---|---|
| M3U import/export | CUT → SHIPPED | Cut from the first scope; a twenty-track library does not need playlist files. Live and working in v3.0: press M3U on the player |
| Playlist sort | CUT → SHIPPED | Cut from the first scope; drag-reorder was meant to handle curation. v3.0 ships six order modes |
| Colour theme picker | CUT | A palette switcher makes the signature optional, the one thing a signature cannot be |
| Waveform seek bar | CUT | Requires full audio decode; blocks the main thread |
| Playback speed | CUT | Pitch-shifting would double the DSP budget |
| Social sharing | CUT | No accounts, no backend |
| Offline cache | KEPT — NON-NEGOTIABLE | A player that dies with the network is not a player |
Never on the table: instant playback, zero dropouts, EQ, visualizer, twenty tracks.
CORRECTED 03 SEP 2026 AGAINST THE LIVE V3.0 BUILD. AN EARLIER DRAFT OF THIS TABLE LISTED M3U EXPORT AND PLAYLIST SORT AS CUT. BOTH SHIPPED. THE BUILD WINS EVERY ARGUMENT WITH THE PAGE.
The Approach
Every track was remastered for instant start before the first line of player code was written. The encoding targets are not published. A keepalive keeps the audio thread awake through tab switches and lock screens; the mechanism is not published. The ten EQ bands land where they land because of listening, not measurement; the frequencies and gains are not published.
Provenance & the Standing Defect
| Date | Commit | SHA |
|---|---|---|
| 22 AUG 2026 | initial: BAJO music player — PWA with offline audio caching | 292f697 |
PRIVATE REPO. THE LEDGER IS STATED HERE AND CAN BE OPENED ON REQUEST. ONE COMMIT; THE TWO MONTHS OF WORK HAPPENED JULY–AUGUST 2025, BEFORE THE REPO EXISTED.
The library is capped at twenty tracks, hardcoded. No upload flow, no library management, no cloud sync. Correct for a personal player serving a fixed collection; a general-purpose service would need a backend and a database.
v3.0 plays exactly twenty tracks and not one more. Adding one means editing the file and redeploying.
Colophon
Primitive: cloth(r,i), order 8, period 7, shared across every surface of this portal. Contrast: bone on void 15.61:1; ash 5.35:1; crimson 5.54:1. Captures: NO RECEIPT, three plates as notation. What this page cut: the stack string and the encoding table.
GYRO
CANVAS 009
A handheld 3D music-video canvas in a single HTML file. The claim: one file can compete with multi-asset productions on visual impact.
Declaration
SIX BILLBOARDS.ONE HELICOPTER.THE CAMERA IS HELD,NOT SCRIPTED.
The Constraint
A handheld 3D scene on a phone GPU. Every light, every post pass, every billboard spends from the same frame, and the frame budget is not negotiable: the scene either holds its rate in a hand or it does not ship.
Key Findings
- 01
One HTML file can carry a gyroscopic 3D experience with multi-pass bloom, filmic tonemapping, and volumetric light. No build step, no bundler.
- 02
Deleting lights improved the lighting. A kicker, rim, and wet-floor triad composed better than the additive approach it replaced.
- 03
Handheld spring physics with velocity-driven aberration makes the scene feel operated, as if a camera person is present.
- 04
A searchlight that tracks whoever you are looking at turned set dressing into a narrative device.
The Instrument
The Decision That Cost Something
I cut the party lights and kept the strobe.
The original build had three orbiting point lights cycling purples and reds. They lit the scene and flattened it; every character got the same wash. Removing them dropped ambient illumination by nearly half and forced the strobe, skylight, and searchlight to carry the composition.
What it cost: the safe version, where everything is visible all the time, plus the hours spent tuning lights I would go on to delete. What it bought: characters now emerge from darkness instead of floating on a lit stage, and the crimson reads as an event.
I would do it again. Lighting is casting: everything you light is something you said yes to. Saying yes to everything is how scenes go flat.
Solo. Gurugram. A Dell laptop. One month, July 2026. One HTML file, no build step; the whole production opens from a URL.
What Got Cut
| Feature | Verdict | Reason |
|---|---|---|
| Three orbiting party lights | CUT | Lit the scene, flattened the composition |
| Orbit-style camera controls | CUT | Would have killed the handheld spring-physics feel |
| Off-the-shelf post-processing stack | CUT | Extra dependencies for what a small custom chain does better |
| Bloom threshold presets | CUT | One tuned setting beat four selectable ones |
| Desktop mouse-orbit fallback scene | CUT | A second composition to maintain; drag and sweep cover it |
| The strobe | KEPT — NON-NEGOTIABLE | The crimson has to read as an event |
Never on the table: handheld physics, aberration tied to camera velocity, the gyro-permission gate.
The Approach
A small custom post chain replaces the off-the-shelf stack. The passes, their order, and their thresholds are not published. Camera energy feeds the separation effect directly; the curve that maps one to the other is not published.
The beat is synthesized. A pulse with phase offsets stands in for listening, tuned until the illusion holds. The tuning is not published.
Provenance & the Standing Defect
| Date | Commit | SHA |
|---|---|---|
| 22 AUG 2026 | initial: migrate from local archive | e8602ef |
| 22 AUG 2026 | add root landing page | 84de3e8 |
| 22 AUG 2026 | move primary build to root; remove landing page | fe8ee7e |
PRIVATE REPO. THE LEDGER IS STATED HERE AND CAN BE OPENED ON REQUEST. THE FIRST COMMIT SAYS IT PLAINLY: MIGRATE FROM LOCAL ARCHIVE. THE CANVAS WAS BUILT IN JULY 2026; THE REPO OPENED A MONTH LATER.
The audio is faked. No beat detection, no frequency analysis. The beat is a synthesized pulse, and the syncopation is an illusion from phase offsets, not listening. It convinces, and it is not connected to anything. A real audio-reactive pipeline is the next build.
the beat is synthesized, and on a desktop browser the α, β, γ readouts sit at dashes. The instrument only fully exists in a hand.
Colophon
Primitive: cloth(r,i), order 8, period 7, shared across every surface of this portal. Contrast: bone on void 15.61:1; ash 5.35:1; crimson 5.54:1. Captures: NO RECEIPT, three plates as notation. What this page cut: the stack string, the pass order, the gyro thresholds.
NAGA
WAVE 01
An Active HUD Inspection System: a terminal experience treating a limited-edition watch like a declassified asset instead of a luxury product. The claim: positioning is a design deliverable.
Declaration
ONE OBJECT.ONE HUNDRED UNITS.DOCUMENTED LIKE EVIDENCE.PRICED LIKE A WEAPON.
The Constraint
A matte black watch on a black hero. The product and the ground share a value, so separation must come from light alone. And the traffic is mostly phones, where the showpiece cannot afford to run.
Key Findings
- 01
A watch that already communicates hostility in physical form does not need a boutique. It needs documentation. The site had to match the object.
- 02
For this product, technical documentation outsells lifestyle aspiration. Forensic beats aspirational.
- 03
The hardest visual problem was black-on-black. A matte black watch against a black hero image required inverting conventional product-photography thinking.
- 04
Scroll jank is a design failure. The decisive fix was synchronizing smooth scroll and animation on a single frame loop; it mattered more than any shader.
The Instrument
The Decision That Cost Something
I cut the showpiece on mobile.
The 3D deconstruction, seven real photographs suspended in space and exploded apart by scroll, is the best moment on the page. It is desktop-only. On phones, visitors get a static grid, and the pinned Blueprint section was removed entirely because it trapped mobile scroll.
What it cost: the majority of traffic never sees the most impressive thing I built. That is a real price for a portfolio piece.
I would do it again. A deconstruction that stutters is worse than no deconstruction. Parity of feel beats parity of features: a static image that scrolls perfectly reads as more considered than 3D that janks. The watch is hostile and precise; the page cannot be less disciplined than the object.
Solo. Gurugram. A Dell laptop. The source record gives no dates for this build. The commit ledger below is the only dated evidence attached to it, and the gap is printed there.
What Got Cut
| Feature | Verdict | Reason |
|---|---|---|
| Product carousel | CUT | Forensic documentation, not a gallery |
| Product grid | CUT | One object, not a catalogue |
| Lifestyle photography | CUT | The object documents itself |
| Pinned Blueprint section | CUT | Trapped mobile scroll |
| 3D deconstruction on phones | CUT | Stutter is worse than absence; static grid ships instead |
| Boot sequence | KEPT — NON-NEGOTIABLE | The terminal frame is the positioning |
Never on the table: the seven real photographs. Zero stock imagery.
The Approach
Smooth scroll and the animation system share one frame loop, which is why the page does not fight itself. The synchronization constants are not published. Black-on-black separation comes from a small lighting rig and a grading pass tuned for this one object; the rig and the grade are not published.
Provenance & the Standing Defect
| Date | Commit | SHA |
|---|---|---|
| 22 AUG 2026 | initial: NAGA 3D watch deconstruction — React + Three.js + Vite | e9825da |
| — | Build dates in the source record | NO RECEIPT |
PRIVATE REPO. THE LEDGER IS STATED HERE AND CAN BE OPENED ON REQUEST. ONE COMMIT. THE SOURCE RECORD CARRIES NO BUILD DATES FOR THIS PROJECT; THE LEDGER IS THE ONLY DATED EVIDENCE, AND THE ABSENCE IS PRINTED ABOVE.
The full experience is desktop-only; most visitors, on phones, get the static fallback. The page is heavy by house standards, and the 3D layer is a large payload held back until needed. A next pass would design a deliberately degraded mobile scene instead of a fallback.
the phone number in the live footer, +41 22 000 0000, is a placeholder. It connects to nothing, and it ships on a client-facing page.
Colophon
Primitive: cloth(r,i), order 8, period 7, shared across every surface of this portal. Contrast: bone on void 15.61:1; ash 5.35:1; crimson 5.54:1. Captures: NO RECEIPT, three plates as notation. What this page cut: the stack string, the scroll constants, the lighting rig.
NEURAL
ARCHIVE
A scroll-driven 3D gallery for Indian hip-hop releases: Roots, WAQT, Freeverse, MYSTIC. The claim: scroll-native 3D immersion works in a standard web app without sacrificing mobile performance.
Declaration
FOUR RELEASES.ONE TUNNEL.SCROLL IS THE CAMERA.EVERY TRACK PLAYS.
The Constraint
Scroll-native 3D on mid-tier phones. Immersion without an orbit control, without an enter-3D step, without a physics bill the frame cannot pay.
Key Findings
- 01
Deleting the physics engine made scrolling better. A camera on a fixed path beat simulated zero gravity, with zero physics overhead.
- 02
Ultra-transparent glass beat frosted glass. The artwork stays legible through the panels, which is the entire point.
- 03
Tuned smooth scrolling was the single largest perceived quality improvement over native scroll.
- 04
Forcing embeds to remount per track killed the wrong-song bug more reliably than any autoplay-parameter trick.
The Instrument
The Decision That Cost Something
I abandoned the physics-driven approach.
The initial spec called for a zero-gravity simulation: floating bodies responding to audio frequency data. It sounded impressive on paper. In practice it produced jittery movement on mobile, drained battery, and added serious weight to the bundle before any visual payoff.
The replacement was a camera on a fixed path with scroll-driven interpolation: trading the impressive sentence for the better feel. What it cost: the marketable feature. Physics-driven reads better in a portfolio than scrolls-perfectly, and I gave up the better sentence.
I would do it again. The feature that sounds best in a case study is rarely the one that feels best in the hand. The path is the experience; the physics was the pitch.
Solo. Gurugram. A Dell laptop. Built in 2025 for real releases by working artists, named and linked below as shipped.
What Got Cut
| Feature | Verdict | Reason |
|---|---|---|
| WebGL fluid smoke simulation | CUT | Crashed mobile GPUs and delayed first paint; cut, not deferred |
| Physics engine | CUT | Jittery on mobile; heavy before any visual payoff |
| FPS and memory overlays | CUT | Developer instrumentation, not product |
| Microphone audio analysis | CUT | Permission friction for marginal payoff |
| Backend persistence | CUT | The ledger records it: full-stack on 22 August, stripped static a day later |
| Scroll-driven camera path | KEPT — NON-NEGOTIABLE | The better experience beat the marketable feature |
| Play-any-track footer | KEPT | An archive that does not play is a PDF |
Never on the table: the camera path, the poster planes, the playable footer.
The Approach
Artwork palettes are derived per release with a clustering pass chosen because it keeps skin tones and print inks honest. The specific algorithm is not published. The camera follows a fixed path driven by scroll progress; the path and the interpolation are not published.
Provenance & the Standing Defect
| Date | Commit | SHA |
|---|---|---|
| 22 AUG 2026 | initial: Digital Atelier — full-stack music showcase with 3D gallery | cfd554a |
| 22 AUG 2026 | fix: regenerate package-lock.json from registry.npmjs.org | 084d5e9 |
| 23 AUG 2026 | fix: strip backend, fix outDir, clean registry | c975d73 |
PRIVATE REPO. THE LEDGER IS STATED HERE AND CAN BE OPENED ON REQUEST. IT RECORDS THE BACKEND BEING CUT: FULL-STACK ON 22 AUGUST, STRIPPED STATIC A DAY LATER. THE GALLERY ITSELF WAS BUILT IN 2025, BEFORE THE REPO EXISTED.
No backend persistence. Every piece of metadata is hardcoded in an asset manifest; adding a work means editing code. A production version, one a label or gallery could update themselves, needs a CMS or a database.
the archive holds the four releases named above and no more. Adding a fifth means editing code and redeploying. Open item, recorded 04 SEP 2026: verify the live build still shows the poster work this copy describes.
Colophon
Primitive: cloth(r,i), order 8, period 7, shared across every surface of this portal. Contrast: bone on void 15.61:1; ash 5.35:1; crimson 5.54:1. Captures: NO RECEIPT, three plates as notation. What this page cut: the stack string, the palette algorithm, the path constants. Credits: the four releases above, every artist named.