murattunalı.

The effects we removed: this site ships WebGL, not grain.

Murat Tunalı PUBLISHED: READING: 6′ REMOVED Process

This site runs on WebGL, WebGPU and a pruned Three.js; the question was never whether to have effects, but whether each one pays for itself in a measurement.

The easiest version of a portfolio article counts the effects that were built. This one does the opposite: it counts the ones that were deleted. A misreading has to be closed first — this site carries three real computed layers. The sky on the home page is drawn with Three.js, the page transition and the signature field run on WebGPU compute pipelines, and where a device has no WebGPU, WebGL takes over. So effects were not rejected. Some effects were deleted after being measured, and every deletion came with a number.

Grain was rejected twice, came back once, then was deleted

The grain texture layer was first rejected during a micro-detail round, on the grounds that the cleanliness of the paper is part of the identity. Then an art-language contract brought it back. Then a later round deleted it — but the deletion did not come with fewer guards: five guards stayed, same count, all turned to face the other way. What is measured now is not “is there grain” but “is there still texture” — because the texture now comes from the computed surface itself.

  1. computed field visible → luminance sigma 7.03
  2. field hidden → luminance sigma 2.48 (remaining poster)
  3. reduced-motion mode → luminance sigma 1.93 (poster)
  4. bare porcelain → luminance sigma 0.58 (paper light only)

The measurement misled twice, and both cases are on the record: picking a fixed region of paper landed on a spot that now carries text, while asking which element sits under the cursor never saw the non-clickable decorations at all. Paper is now measured with the content hidden; the question is whether the paper carries a texture, not where things sit.

Deleting an effect exposed the real defect behind it

The most expensive lesson of the round arrived after the grain was gone. A guard had been green for two rounds, and the reason it was green had nothing to do with what it measured: the “difference” it saw between two screenshots came not from the canvas but from the grain’s own 0.7-second drift. With the grain deleted the difference fell to zero and the guard went red. There was a real defect behind it.

The defect was this: the canvas blend multiplied colour and alpha separately, and the compositor showed the result against the square of the alpha. A band with alpha below 0.05 and a scan line at 0.012 were not on screen at all — only the quotation marks, at alpha 0.3, were visible. That layer had not been drawing since 28 August and nobody had noticed. The blend was separated; the measurement went from 0 to 1.23 on the old strip and to 2.10 across the full scene. Deleting one effect also surfaced a guard that had been lying for two rounds.

Removing a button repaired the site’s own claim

The site used to have a sound switch: opt-in, off by default, three symbols. It was removed. The side gain measured during removal turned out to be larger than the decision itself — the switch wrote its preference to browser storage, and the site’s privacy text says that local storage is not used. In other words, for any visitor who turned sound on, the page’s own claim was broken. The verification suite could not see it, because the guard measured without ever turning the sound on. Removing the button closed the inconsistency at its root; the approved strings stay in the dictionary.

Code that loses its driver gets deleted

The sky on the home page had an edge-navigation gesture: as the cursor entered a band at the edge of the screen, the view turned that way. The first version rotated at 28 degrees per second, a report came back saying it was far too fast, and it was slowed fourfold. Then the whole gesture was cancelled. The camera roll went with it, because its only driver was the pan speed — code that loses its driver is dead code. Its guard was not deleted but turned into an absence guard, and it measures the other direction too: no drift should remain at the edge, yet the cursor parallax must still be alive.

A measurement can reject an idea after it has been built

Rather than drawing the stars one by one, moving to a pre-rendered texture atlas seemed sensible. The atlas was written and measured: 310.3 milliseconds against 311.0. Gain: zero. The profile explained why — the cost was not in the stars but in the noise function of the fog. The code was deleted.

In the same phase the smooth-scrolling library was retired as well. The reason was not only its size: the project used its coarse-pointer distinction in fourteen separate places and that library was not among them, and no recorded deliberate decision could be found. The vendor bundle went from 51.1 kilobytes to 33.5, and desktop scrolling went back to the browser itself.

Two ideas eliminated before they were built

A peak scene had been planned for the method page: let the visitor deliberately break one of the page’s own guards and watch the result. The idea was eliminated before implementation, because the ethical core of that page is that the violation is opt-in. An unrequested, continuous broken state is something the accessibility criteria explicitly oppose.

The second idea was built and reverted: spreading the signature scene’s machine reading across the whole page. It was built, shown and rejected — the placement broke legibility. A revert is not a record of failure but a record of a round; on the next attempt the scene became an atlas plate.

A guard that breaks its neighbour also gets deleted

It is not only effects that get deleted. A performance guard was written, it measured correctly, and it was removed: because it ran with the processor throttled fourfold, it tied its own verdict to the machine’s load at that moment and it broke a neighbouring guard. The neighbour was green across six runs and red in the two runs that included the new guard, and the correlation was checked one to one. A guard that breaks another guard is a net loss; the gain it offered is recorded in the decision ledger, but the code is not.

Three.js was not deleted, it was pruned

The counter-example belongs on the record too, because the actual rule is visible there. The three-dimensional world on the home page needed an expensive dependency, and that dependency was taken — but not as it came. The library was pruned to the modules actually used, and its compressed size is locked under a budget ceiling — go over it and the verification suite turns red. It loads on the home page only, and only after the page has loaded and the main thread is idle. Under reduced motion, on low-memory devices and with data saving on, it does not load at all.

So this list is not an argument against effects. What the deleted ones had in common is that the measurement never repaid their cost. What the remaining ones have in common is that they do.

The strongest effect turned out to be the one we removed.

Murat Tunalı

Founder. Twenty years of enterprise IT infrastructure + web development.

Next post

SCHEMA: BLOGPOSTING + PERSON + BREADCRUMBLIST — AUTHOR, DATE AND READING TIME FEED THE SCHEMA