Notes on programming
Igor Konovalov — a fullstack developer in Belgrade. Experiments and notes on software, AI agents, and generative art.
- after-the-team
Two is the golden mean
The third of four posts about how my work changed with AI agents: why an ordinary scrum team will not get this speed even with the same agents, what is left of the ceremonies, and why I think the future belongs to small crews.
Read → - after-the-team
Half a year of work in a week and a half
The second of four posts about how my work changed with AI agents: the bench, the pet projects that brought the joy back, the first month in production, and what a day of two developers with agents looks like now.
Read → - after-the-team
Ten years of writing code by hand
The first of four posts about how my work changed with AI agents: the road from rope access and gypsum stucco into programming, the scrum teams, the burnout, and the people — the years when I still wrote the code myself.
Read → - d2-recon
Diablo II, days twelve to seventeen
Six days of the d2-recon preservation project with three of them worked: the core specs composed end to end past their bar, the skills phase reviewed, every one of 310 skill functions emulated, animation timing against 61 community claims, monster AI approved with a sixth phase behind it, a sweep that raised 158 statements, and a commit gate that had quietly stopped guarding.
Read → - voxel-engine
Voxel engine, days seven to twelve
Version 0.24 to 0.32 of the voxel engine: direct light from glowing rock with a denoiser, light that bounces through a probe volume, the mirror half of the packed brick that brought full detail back to 100 m, the edit line met at half of itself, our own upscaler and an FSR 2 port side by side, a generated gothic castle, and a shader compiler swap that took Windows from 76 seconds to 2.5.
Read → - d2-recon
Diablo II, days seven to eleven
Five days of the d2-recon preservation project: the combat run and two more simulation phases, quests, travel and the economy in scope, two real clients in one game, 99,450 emulated skill cases, the first run of the core specs composed end to end, and three nights the machine was asleep or out of memory while the lanes ran.
Read → - voxel-engine
Voxel engine, days two to six
Five days of the voxel engine, from version 0.3 to 0.24: the surface look chosen by eye, a night in which nine plans closed while I slept, collision, audio, an op log and a WebAssembly host, a new brick format that cut RAM by four, the primary-ray line met, the edit line raised, cavern reverb tuned by listening, and a world you can see from outside.
Read → - d2-recon
Diablo II, days five and six
Days five and six of the d2-recon preservation project: the agents ran an unattended queue of plans through two nights, every row of the research map but the newest is now a reviewed spec, the creation paths that waited for the core are done, combat simulation entered scope, and seven sessions the agents could not play, I played.
Read → - voxel-engine
Voxel engine, day one
A new project: a game-agnostic voxel engine in Rust, ray-marched in compute shaders. Day one took it from an empty repository to a streaming cave you can fly through and dig, with every budget the code could touch measured and three of them missed.
Read → - d2-recon
Diablo II, day four
Day four of the d2-recon preservation project, this time with pictures: the research map as a grid, special monsters with only 256 possible names, a unique and set target that would have taken about 450 sessions to reach, a map of the Blood Moor built from one number, and a harness that can now run several copies of the game at once.
Read → - d2-recon
Diablo II, days two and three
The d2-recon preservation project, days two and three: the room-seed draws reproduced exactly, monster pools from one number, a party rule settled with two copies of the game, magic find that is linear below 11, and a champion branch that is dead code. And the agent stopped being the only player.
Read → - d2-recon
Diablo II, day one
The first day of a preservation project: documenting Diablo II 1.14d precisely enough to rebuild it. A random number generator with 666 in it, a seed tree checked against 5,954 values from the running game, three million rendered sprites, and a file format an agent remembered from somewhere it could not name.
Read → - agents
What 207 commits are made of
One day, two conductors, two repositories: sixteen plans merged, fourteen releases and eight production deploys. What the commits actually were, who made them, what capped the speed, and what it cost.
Read → - agents
Approval is the go
A conductor that runs approved plans to a merged main with nobody watching: why the manual seams could go, a headless contract observed rather than read, a repository believed over a session, parking as the default answer, and what twelve days of runs cost.
Read → - agents
The viewer is a windshield, not a cockpit
A desktop market-analysis workbench with no buttons worth pressing: one local sidecar exposing one capability set twice, an agent as the control surface, a window that only draws, and a reversal taken one day after the decision it reversed.
Read → - agents
A budget with a measurement beside it
What makes a non-functional requirement bind: naming the unit, deriving the number, scoping it to what you control, admitting what it does not cover, and noticing when your instrument reports zero because it measured nothing.
Read → - agents
Every gate states its blind spot
What a green test suite licenses you to believe, written down: five visual gates, the questions each one cannot answer, an impossibility result kept as a permanent ignored test, and a blind spot created by the very thing that makes a baseline good.
Read → - agents
How 315 markdown files stay true
Documentation conventions decay silently in an agent-written repository. Eight gates that make prose rules executable, the rot each one was written against, and the stronger move: generating the reference instead of checking it.
Read → - agents
The harness, revised
Five changes to the agent-coding harness since July: a gate with a tier, lanes added by decision record, worktrees moving inside the repository, a vendored skill with a hash, and a transplant that took a day.
Read → - rust
Ritmolux: one core, two frontends
A real-time music visualizer in Rust: one shared engine feeding a standalone app and a foobar2000 component, driven by editable text presets, with a documentation site that is the reference.
Read → - agents
Running a real project as a team of agents
The agent-coding workflow I refined over one real project: externalized plans, specialist skills, fresh-context review, and guardrails enforced in code.
Read → - javascript
Arduino Node SocketIO Setup Tutorial
Tutorial on connecting Arduino to a webpage through Node.js and Socket.IO
Read → - generative-art
L Systems Generator
L-System fractal generator with 40+ preset shapes and full customization
Read → - generative-art
Mathematical Rose Revisited
New and improved version of Mathematical Rose Generator with auto-animation, randomizer, and PNG export
Read → - generative-art
Phyllotaxis
Phyllotaxis pattern recreation on canvas
Read → - generative-art
Mathematical Rose Walker
A simple walker reflecting a mathematical rose path
Read → - generative-art
Islamic Star Patterns in SVG
Islamic star patterns implemented in vanilla JavaScript and SVG
Read → - generative-art
Maurer Rose
JavaScript implementation of mathematical rose and Maurer rose curves
Read → - generative-art
Random Lines in SVG Shapes
Random lines drawn inside SVG shapes - hexagons, squares, and triangles
Read → - generative-art
Random walker with vector object (Lévy flight)
Random walker implementation using vector objects and Lévy flight
Read → - generative-art
Simple Random Walker
Simple random walker on canvas in pure JavaScript
Read → - generative-art
Elementary Cellular Automaton
Elementary Cellular Automaton implementation in JavaScript
Read → - generative-art
Game Of Life!
Conway's Game of Life implementation in JavaScript
Read → - personal
Hello World!
First blog post - Hello World!
Read →