Woodblock · indigo and vermillion, gouged black line, paper grain
Action-adventure 2D samurai brawler, late-Edo woodblock.
Writing, experiments, and field notes from Joel Citron — building enterprise AI systems by day, prototyping at the edge of the model after hours.
Began as a creative director in 2005, pivoted to development in 2008, and have spent the last decade-plus marrying the two — building enterprise attribution systems at AI Media Group, where I'm now CTIO.
The thesis hasn't changed: a design-trained engineer makes better technical decisions because they think about the human standing in front of the system, and a engineering-trained designer ships things the design-only crowd never finishes. acidlemon is where I write about both sides.
Woodblock · indigo and vermillion, gouged black line, paper grain
Action-adventure 2D samurai brawler, late-Edo woodblock.
Arcade window · depth, horizon, one eye closed and a lean
3D head-tracked rail shooter. Monitor as a window.
Fighter cabinet · steel on sun-warmed sandstone, khanda against battle-axe
2.5D weapon fighter, twelve researched cultures, one blade each.
Cyber-industrial · cyan and magenta panel light over Doom brick
Fully rendered first-person shooter. Classic Doom WADs convert straight into it.
Hellfront dust · silhouette command readability
Hybrid small-unit tactics and FPS possession. Command outdoors, clear indoors, Human and Cyber-Demon campaigns.
Neon rail · grounded graybox catcher
Cyberpunk kart racer with stunts, a track editor, and a first campaign. Build a course, Test Race, then race it.
Three.js · side-on stages · woodblock meets neon
3D side-scrolling beat 'em up. Sumi's samurai against enemies from Cyberhell, Clash and Space Runner 3D. Fully playable on a phone.
Neon back-street · 3D stage up top, DOM cards underneath
Card-tower roguelite deckbuilder. Three acts — Neon Underbelly, Chrome Spire, The Wound — end on the Cyber Kuro final boss. Endless Climb is unlimited seeded towers, each harder, with a replayable seed and your best tower saved on the device. Fully playable on a phone.
Three.js maze runner with post-processing shaders, outline pass, and effect composer.
First-person maze, simpler engine. Find the exit.
Three.js first-person shooter prototype. Mouse + keyboard.
Side-scrolling platformer, vanilla canvas. Arrow keys + space.
Browser-based action prototyping playground.
Personal real-estate tracking + analysis tool for the NJ market.
Operator-persona executive site — Astro + Tailwind, Metric Stage design system.
This site — Calibrated Gantry design system, bento grid, dark mode.
Lab note: a usage gate that routes agent jobs between model providers before a cap hits. Check the weekly and the 5-hour session usage, run only if both are at or under 90%, otherwise fall to the next provider, and fall to the next provider too when the check itself errors.
Lab note: the design for a nightly job that snapshots what an ad platform is actually serving, compares it with what was approved, and flags any change nobody on the team made. Written as the job I'd want, with the open problems.
Agentic measurement and ads agents (Lifesight, Snowflake AI Gateway for Advertising, Contentsquare's agent-traffic split) are arriving fast. Five pins before one gets to recommend or write a budget change: split humans from agents, own the events, check causality, human approval plus audit row, and no self-grading.
Post-deploy self-tuning for AI agents (Kore.ai Autoloop, Google's agentic Gemini, RSA Agent ID) is real progress. A loop that rewrites a live agent still needs pinned contracts, identity and authority, revoke, shadow-before-write, and audit.