See What Your Periphery Computes

v2.0.0 release notes →

The hardest part of building a peripheral vision simulator is explaining what it does. The pipeline (resolution falloff, frequency-selective blur, per-channel color decay, saliency gating) produces output that looks “blurry” to anyone who hasn’t used it. The math is doing something specific at each stage, but the result is smooth and continuous, which makes it hard to point at any one thing and say: this is what your peripheral color processing looks like.

v2.0 adds three modes that make the pipeline visible. They render the same math as discrete geometry (blocks, wedges, wireframes), sized and colored by the same cortical magnification function used in the research modes.

Minecraft.net rendered through Scrutinizer's default High-Key mode, showing eigengrau ghosting and lateral smash distortion increasing with eccentricity from the fixation point
Mode 0: High-Key (Default). Minecraft.net with fovea/parafovea overlay. Eigengrau tinting and chromatic aberration increase with eccentricity. V1 lateral smash warps peripheral text. The nav bar and right-side characters dissolve into chromatically pooled shapes.
Minecraft.net rendered through Scrutinizer's Minecraft Block Pooling mode, showing discrete blocks growing from 4px to 64px with eccentricity
Mode 4: Minecraft (Block Pooling). Same page, same fixation. Each block is sized to the MIP level at that eccentricity: 4 px near the fovea, 64 px at the edges. Color averaged per-channel in Oklab. The block boundaries follow the cortical magnification function.
Minecraft.net rendered through Scrutinizer's Minecraft Eyeball polar pooling mode, showing wedge-shaped sectors radiating from the fixation point
Mode 8: Minecraft Eyeball (Polar Pooling). Same CMF in polar coordinates. Ring spacing follows logarithmic cortical magnification. Sectors are radially elongated ~2:1, approximating Rosenholtz’s TTM pooling geometry.

Minecraft: the pooling you can point at

Mode 4: Minecraft (Block Pooling)

Each block represents one pooling region, the area your brain averages together at that distance from fixation. Near the center: 4px blocks (sharp detail). At the edges: 64px blocks (everything averaged into one color). The grid recomputes around your cursor. You can see the color asymmetry too: red-green boundaries merge between blocks while blue-yellow stays sharper, showing the same 5:1 decay ratio as Mode 0.

Mode 8: Minecraft Eyeball (Polar Pooling)

Mode 8 uses the same math in the shape the brain uses. Wedge-shaped sectors radiate from your gaze point and grow wider with distance, matching the geometry that Rosenholtz et al. (2012) predict for how peripheral vision pools information. Sectors are elongated about 2:1 along the radial axis, matching crowding measurements.

Update (2026-10-01): In v2.0.0 the shader computed spoke count from the biased ring width, which cancelled the radial elongation and produced ~1:1 sectors. Wave 3 validation caught the bug and v2.1 fixed it. The sectors approximate model pooling regions (Rosenholtz et al. 2012); they are not fit to measured neural geometry.

The block sizes are the MIP levels. The color averaging is the chromatic pooling. When someone asks “what does cortical magnification do?”, you switch to Minecraft and point.


Blueprint: wireframes from the live DOM

Mode 3: Blueprint (ARIA Wireframe)

The structure map’s alpha channel encodes ARIA role IDs (0–12). The shader maps each role to a color: buttons (green), inputs (amber), headings (red), navigation (purple). The fovea shows original content; the periphery transitions to typed wireframe on a dark blue background. No vision model is required. The DOM structure extractor reads semantic HTML and ARIA roles directly. Works on any page that follows web standards.


Density-gated crowding

v1.9 documented a gap: isolated letters and densely flanked letters at the same eccentricity received identical V1 distortion. In real peripheral vision, the isolated letter remains identifiable (Bouma 1970). v2.0 closes this gap with a sigmoid gate on the structure map’s density channel:

crowdingFactor = mix(0.3, 1.0, σ(20 · (density − 0.6)))

Here σ() is the sigmoid function, an S-shaped curve that rises smoothly from 0 to 1. Dense content (text clusters, UI grids) gets full crowding distortion. Isolated elements are spared down to a 0.3× floor. The threshold (0.6) and steepness (20) were calibrated against the crowding reference page. These are engineering fits and were not fitted to psychophysical data. The paper’s new Open Questions section lists this as unresolved: it is unclear whether strength modulation is a reasonable proxy for Bouma’s spacing-based rule.


Chromatic recalibration

The v1.9 chromatic decay constants came from detection-threshold fits to castleCSF (a contrast sensitivity function model by Ashraf et al. 2024 that predicts how sensitivity varies with spatial frequency, eccentricity, and color channel). Bowers, Gegenfurtner & Goettker (2025) measured chromatic and achromatic contrast sensitivity (detection thresholds) out to the far periphery. The updated constants are fits to their data:

The ratio narrows from 14.75:1 to 5.14:1. Blue-yellow is no longer “basically immune” to eccentricity. It falls off more slowly than red-green.


Also in this release


What’s next

Next: orientation-dependent blur (horizontal/vertical edges persist further than diagonal ones Shipped in v2.2), improved far-periphery color accuracy, and better crowding models. The crowding stage is the biggest open question. Current GPU rendering may not be able to fully capture how nearby elements interfere with each other in peripheral vision. The Open Questions section in the paper enumerates what we don’t know.

References cited: Bouma 1970 · Bowers, Gegenfurtner & Goettker 2025 · Brown et al. 2023 · Rosenholtz et al. 2012 (TTM) · Blauch, Alvarez & Konkle 2026 (FOVI) · Annotated Bibliography · Primer References