Skip to content

Design workbench

Lab

Each section shows one redesign decision in isolation, with the site from before next to what workstreams P31 to P37 applied. Switch the variant in the bar below and the whole page responds.

Updated on 13/09/2026. The proposals on this workbench left the drawing board between 09 and 10/09, and the two decisions that were holding things up were made. Between 12 and 13/09 the site gained what sections 12 to 16 tell: the entrance curtain, the dust with two constellations, the sound, the memory and the reworked reading. Sections 01 to 11 say what was decided and what changed afterwards - a reverted decision gets recorded, not erased.

- words · about - min read, at 265 words per minute.

Variant
Typography
Scale
Rendering
Motion

01 Color

The palette doesn't change in any workstream. It was measured in OKLCH, passes the four gates and is the part already solved. It's here for checking.

--background

the page's paper

16.94:1 in light, 16.34:1 in dark

--foreground

the text

-

--accent

system accent

4.5:1 minimum, measured in both themes

--tinta

the figure's stroke

5.97:1 on the parchment

--pergaminho

the diagram's sheet

-

--border

the border

3.26:1 on the background

The four pillars, 90° apart from each other in OKLCH, with constant L and C. Fixing lightness and chroma and varying only the hue is what ensures that none of the four weighs more than the others.

science

hue 275°

technology

hue 185°

art

hue 5°

philosophy

hue 95°

02 Typography P31

Use the "Typography" and "Scale" bars above. The first switches the family of this whole page; the second switches the size and the floor.

Switching only the family didn't solve it, and the measurement says why. The number the eye reads isn't the font-size: it's the x-height in pixels, which combines family and size into a single value. And there's a second number, which is the most serious: the fraction of the page's text below 16 px.

page body x-height text below 16 px
ciechanow.ski - IBM Plex Sans 19.2 px 10 px 0%
razaoinadequada.com - Rubik 18 px 10 px 36%
paco.me - Söhne 16 px 9 px 15%
joshwcomeau.com - Wotfard 16 px 8 px 40%
the site, /posts/ 17 px 8 px 50%
this workbench, before this fix 17 px 8 px 57% - 136 of 237 elements

It was me repeating the defect. I built this workbench with the same scale you complained about: 136 of the 237 text blocks were at 14 px - the labels, the measurements, the table cells. The paragraph was never the problem; the problem is everything around it. That's why the "Scale" bar opens on Comfortable, and not on Current.

Measured on 09/09/2026: of the seven references, six use sans-serif in the body, and the two you pointed out as good - linear.app/now and razaoinadequada.com - use Inter and Rubik. The site is the only one with serif in the body and display serif in the title.

family x-height ÷ cap height circumflex clearance where
Newsreader - today's body 0.654 - the smallest 0.517 - the largest -
Instrument Serif - today's title 0.708 0.441 -
Inter 0.748 0.373 linear.app/now
Rubik 0.743 0.394 razaoinadequada
Source Serif 4 0.739 0.505 serif, if you want to keep one
IBM Plex Sans 0.738 0.452 ciechanow.ski
Public Sans 0.712 0.317 - the smallest more settled accent

The x-height divided by the cap height tells the apparent size of the lower-case letters. Newsreader has 0.654, the smallest in the set: at 17 px it draws lower-case letters 14% smaller than Inter at the same nominal size. It's the measurement behind "everything too small".

The circumflex clearance is how far the accent rises above the e, divided by the x-height. This was the criterion that failed EB Garamond, Cormorant Garamond and Bodoni Moda in this house - and Newsreader has 0.517, the worst number in the table. The defect that barred three families is in the one that stayed.

The scale exists and is fluid. What P31 fixes is the step: today the cards' h3 measures 16 px against a 16 px body, and a subheading the same size as the text isn't a subheading.

--passo-0 Four elements label · 13-14 px
--passo-1 Four elements body · 16-17 px
--passo-2 Four elements highlight · 18-20 px
--passo-3 Four elements h4 · 19-22 px
--passo-4 Four elements h3, card title · 24-34 px
--passo-5 Four elements h2, page title · 30-46 px
--passo-6 Four elements hero display · 42-84 px

today

Verification system

The house harness requires a test before the code and frozen evidence. A verdict that a machine checks.

title 16 px · body 16 px · step 0 px

proposed

Verification system

The house harness requires a test before the code and frozen evidence. A verdict that a machine checks.

title --passo-3 · body --passo-1 · step ≥ 3 px

Decided and applied - P31, 09/09/2026 (A-58). None of the candidates made it in: the prose stayed in Newsreader, and what changed was the scale and the division of the voices. Body with a floor of 19 px at 390 and 20.2 px at 1440, a step of 4 px between label and body; Space Mono for the interface (date, tag, button) and Instrument Serif only in the display.

Later, on 13/09/2026. The posts' reading column had been calibrated for Literata at 17 px (36 rem, 68 characters) and nobody redid the math when the prose became Newsreader at 20 px: it was 552 px and 63 characters, with title and dek under their own ceilings of 469 and 462 px - the owner: "why is everything so squeezed?". Today the column is 39 rem (624 px, 71 characters) and the whole composition, table of contents included, is centered on the screen. See section 16. The eight family candidates remain on this workbench as a record; none made it in, and the site is still the only serif in the body among the references, by decision.

03 Box versus rule P32 · P37

The strongest finding of the sweep, and the one that took two measurements. A fence is its own background or a border on three sides: the card. A rule is a border on one or two sides: the line that separates, and doesn't count. The first measurement lumped the two together, and that's why it flagged clean pages.

Counting only fences, per 100 elements: /about/ has 29.4 and /projects/ has 9.1, against 1.4 on linear.app/now, 2.3 on joshwcomeau and zero on overreacted.io. The home page measures 0.7 and is cleaner than the two references. The proposal swaps the card for a row on the rule - a notation the project already has.

today: card

Cadastra

AIvengers

Verification harness for front-end teams. Test before code, frozen evidence, auditable verdict.

  • VTEX IO
  • Node
  • Playwright

Personal

eltonleao.dev

A personal site as a system: four subjects, a complete graph, and a suite that doesn't let the design rot.

  • Astro
  • OKLCH
  • Canvas

fences in this sample: 8

proposed: row on the rule

Cadastra

AIvengers

Verification harness for front-end teams. Test before code, frozen evidence, auditable verdict.

VTEX IO · Node · Playwright

Personal

eltonleao.dev

A personal site as a system: four subjects, a complete graph, and a suite that doesn't let the design rot.

Astro · OKLCH · Canvas

fences in this sample: 0 - the horizontal line separates, and separating isn't fencing

Decided and applied - P32 and P37, 09/09/2026 (A-59, A-61). The card became a row on the ruled page. Fences per 100 elements: /projects/ from 9.3 to 0.2, /links/ from 9.1 to 0.0, /about from 2.8 to 0.9. The seven measured routes ended up below 1.0, and /about/ lost 124 pills and the four progress bars.

Later, on 13/09/2026. The featured card on /projects/ still had a hidden defect: it asked for sm:flex in the markup and display: block in the scoped style, and the scoped one won - the thumbnail stacked above the text at any width and the page measured 6 378 px for eight projects. It became a ruled row with the plate on the right: 5 406 px. And the pillar filter stopped being a chip with a dot: it's the four alchemical symbols with the hero's selection ring, and "all" is the complete K₄ - see section 16.

04 Fading versus lighting up P33

Move the pointer over the four. Today the site takes presence away from what doesn't matter: 59 texts on the home page use partial opacity, and fading takes the contrast down with it. In The Starry Night luminance represents kinetic energy - what has energy shines. The proposal inverts the operation: nothing dims, the active one lights up.

today: the others dim

  • science
  • technology
  • art
  • philosophy

opacity drops to 0.45 on the three not pointed at

proposed: the active one lights up

  • science
  • technology
  • art
  • philosophy

opacity constant at 1; the luminance of the one pointed at rises

Decided and applied - P33, 09/09/2026 (A-62). Texts with partial opacity on the home page: from 59 to 0, and zero on the other routes. The displacement in response to a gesture follows a single ratio, --k4-cascata = 0.45, in four steps from 14 to 1.3 px; /posts/ went from 27 to 66 transitions, and no animation runs on its own outside the hero.

Later, on 13/09/2026. The "the active one lights up" rule got the most literal example on the site: the header wordmark, when pointed at, performs the hero's encounter in miniature - the four nodes light up in the pillars' colors, the edges draw themselves again in accent, and a glow crosses the word in the reading direction. At rest it stays monochrome. And the "nothing runs on its own outside the hero" rule got a caveat measured in the hero itself: it sleeps when nobody is looking - see section 09.

05 The list item P36

Each item on /posts/ carries eight text blocks. overreacted.io carries three, joshwcomeau four, danluu two. The four tags are already stated in the filter, a few pixels above - repeating the filter inside each row is saying it twice.

today: 8 leaves, 1310 px

01 philosophy

I thought I knew what leading was

Seven years later, the conclusion is that almost everything I called leadership was, in fact, well-dressed anxiety.

  • leadership
  • tech-lead
  • systems-thinking
  • journal

order · category · title · summary · date · 4 tags = 8 leaves

proposed: 4 leaves, in a column

I thought I knew what leading was

philosophy

Seven years later, the conclusion is that almost everything I called leadership was, in fact, well-dressed anxiety.

title · category · date · summary = 4 leaves, and the title stays at --passo-4

Decided and applied - P36, 10/09/2026 (A-67). The item dropped from 7 or 8 leaves to 4: index and category merged into a mark above the title, the tags and the thumbnail left, and the item got a 47.5 rem column. The sample above shows the proposed order; the applied one put the mark before the title, because in two columns the merged text spilled over it.

Later, on 13/09/2026. The mark gained one more piece of data, and not a leaf: the reading time ("philosophy · 12 Apr, 2026 · 13 min read"), by the same count as the article - only the prose words, at 265 per minute (`utils/leitura.ts`). It stays at four leaves.

06 Reading apparatus P34

Nine of the thirteen essay references have a live figure inside the text, and four have a sidenote. The site's article has the progress bar, and nothing else. The sidenote lives in the margin that is already empty - the reading column does not narrow to make room for it.

The house harness has three states, not two: PASS, FAIL and UNKNOWN. The third is what separates a verification system from verification theater.

UNKNOWN blocks just like FAIL. "I couldn't measure it" never becomes "passed", because the day it does, the whole suite stops meaning anything.

And PASS requires RED first. A criterion born green isn't acceptance: it's a guard. It proves that something didn't break, not that something was done.

Decided and applied - P34, 10/09/2026 (A-66). The article got a table of contents generated from its own headings, without JavaScript, and the sidenote became markdown syntax, > [!aside]. The cypress is the thin continuous rule (section 08). The live figure inside the text was not delivered, and remains declared as pending.

Later, on 13/09/2026. The table of contents got an active section (aria-current="location" on the last section whose heading has passed the top third of the screen, with a stroke on the left - the same device as the cypress), the article's opening became kicker, title, dek and meta, the body went from full white to tone 1, and the drop cap stopped leaking into the quotes. See section 16.

07 The Starry Night, as structure P33 · P35

Until this section, the reference to the painting appeared on this workbench 21 times in text and none in drawing. It was the same flaw you pointed out on the site: "I'm not really feeling the reference". A palette isn't a reference to the painting.

The turbulence field

These aren't drawn spirals. It's a vector field - the technique the research found in every Van Gogh work on the front end -, and the spiral is what appears when the flow happens. The potential is a sum of Gaussians and the velocity is its curl, which makes the flow incompressible by identity: no visible source or sink.

what the painting has the number how it comes in here measured
Swirls on the canvas 14 the field's centers of rotation 14
Kolmogorov cascade energy falls from the large to the small amplitude ∝ σ4/3 -
Flow with no source or sink zero divergence velocity = curl of the potential 1.5 × 10−8
Luminance = kinetic energy what shines is what moves stroke brightness ∝ velocity 508 strokes

The field is generated at build time, so this is static SVG: zero JavaScript at runtime, and the sem-js gate still stands. In the hero, P35 swaps the orbit of the 160 particles that already exist for this same field - no WebGL and not one extra particle.

POC: the field as the section background

This is the POC of what you asked for. The field fills the background of the whole section - 1440 × 989, the real proportion -, and the hero composition stays on top, intact: the ellipse with the engravings, the K₄ figure, the four glyphs, the labels and the text.

The four large vortices sit exactly over the four pillars, converted from the K₄ box to the section box. The sky isn't a texture behind the figure: it's organized by it.

science technology art philosophy

Four elements, a single work

PHILOSOPHY - to give the ground and the grammar: the repertoire that makes any question navigable

1316 brushstrokes · 14 centers, 4 over the pillars · the composition on top didn't change

The hero in this style

Same technique, tied to the hero's real geometry - viewBox -430 -226 860 452, the four nodes at the measured coordinates, the six edges. What changes isn't the figure: it's what is behind it.

The brushstroke has the painting's length. The Starry Night is 92 cm wide and the brushstrokes in the sky run from 3 to 8 cm - between 3.3% and 8.7% of the canvas. The first version of this used strokes of 27.9%, three to eight times too long: that wasn't a brushstroke, it was a streamline, and it read as aggressive. Now the median is 7.4%, and the density forms by overlap, as in impasto.

The proposal, and it isn't decorative: the four large vortices sit exactly on the four pillars. The sky isn't a texture behind the figure - it's organized by the figure. The four subjects are what stir the field, and the ten smaller vortices are the cascade descending from them. Four large plus ten small are the painting's 14.

science technology art philosophy
446 brushstrokes of 4% to 11% of the width, which is the painting's range · 14 centers, 4 of them on the pillars · the field moves, the figure doesn't

Here the field is static SVG because the workbench is a workbench. In the real hero P35 doesn't do it this way: there the field becomes a pure function that the 160 particles that already exist in orbe.mjs query every frame - they stop traveling an elliptical orbit and start to flow. Same particle ceiling, no WebGL, and the cost is arithmetic instead of bytes.

The sky churns, the village doesn't

The painting has three stacked regimes, and the contrast between them is what makes the sky look alive. This resolves the contradiction the measurement had left open: no good reading site has continuous motion, and this site's hero has 36 infinite animations. All sky would be noise; all village would be dead.

sky circular, agitated, cascading
mountains undulating, horizontal, slow
village still, geometric - it's the text

Juxtapose, don't blend

The painting's blues and yellows weren't fused on the palette: they were placed side by side, and the eye does the mixing. The site's plates use mix-blend-mode, which does the opposite - and that's where the grayish smudge that E-21 recorded comes from.

today: blended

the painting: juxtaposed

What happened to this section - P35, still open (A-65). The field entered the hero as a law of motion, and not as a drawing: the dust started flowing through the fourteen centers, with a correlation of 0.995 between brightness and speed. The painted background of the POCs above was never approved, and the hero took another path - the dust gained mass, sky and shape, and the plates came to cover the hero. That's what section 09 tells.

08 The two decisions that were holding things up

Neither of the two was technical, and while they were open the workstreams didn't leave aberto. They were drawn here to be chosen by eye.

Made on 09/09/2026, by delegation from the owner ("you can keep making the decisions, I'm going to sleep", A-65): the cypress is the thin continuous rule, delivered in P34; Projects on the home page becomes a link, delivered in P36. The two options are still drawn below, with the chosen one marked.

The cypress - P34

In The Starry Night one element crosses the three regimes and connects the earth to the sky. The site doesn't have one: the hero ends, the page begins. The vertical carries the reading progress, so it isn't ornament. The piece is still to be decided.

A - thin continuous rule · chosen

hero
text

B - the relation thread coming down

hero
text

Projects on the home page - P36

The two sections add up to 3623 px of the page's 5047, and the hero already presents the whole site. Projects takes 2035 px and comes before Writing, which takes 1588 px, on a site whose thesis is the text.

A - both sections, Writing first

hero · 987 px
Writing · 1588 px
Projects · 2035 px

B - only Writing, and Projects becomes a link · chosen

hero · 987 px
Writing · 1588 px

09 The hero after the workbench P40 · P41

Between 11 and 12/09/2026 the hero changed more than in all the workstreams above combined, and almost all of it is motion in canvas - which a workbench without JavaScript can't show. That's why only what changed, the measured number and where the evidence is come in here. The real hero is on the home page.

what changed how it works measured record
The plate covers the whole hero each combination of pillars has its own image, without text, and only the active one loads opacity 0.26 in light and 0.28 in dark A-68
The dust obeys Newton lit pillars are masses, and the grains attract each other ~0.9 ms per step with 160 grains A-70
The dust's sky is the whole hero the canvas leaves the figure and covers the hero ceiling of 320 grains at rest A-71
The unmoved mover the four pillars orbit the center, and the lit ones draw closer one revolution every 120 s A-72
The dust forms the brain with all four lit, 2 200 grains are born in a big bang at the center and draw a subtle brain; between two lit ones the dust makes the bridge, and no thread connects the pillars density in the silhouette 44 times that outside, against 1.2 for the sky without a brain A-73
The void gets a plate with nothing selected, the background is The Monk by the Sea, by Friedrich the only combination that had no image A-74

Still open: P41 remains open - the ink of the patches still has to form the hemispheres, technology has to move to Wernicke's area and the lit pillars have to spin like electrons (the tremor that came along was removed on 12/09/2026, at the owner's request: it was imperceptible and cost frames) -, and so does P35. Evidence in docs/evidencia/hero-inteiro/, newton/, ceu/, p40/, p41/ and vazio/.

What changed between 12 and 13/09

what changed how it works measured where
The hero sleeps when nobody is looking sets data-hero-dormindo on <html> when neither the figure nor the plates touch the window, when the tab goes to the background, or while the entrance curtain is up; the CSS pauses every hero animation and the frame loop stops page scrolled: from 0.352 to 0.037 s of CPU per second, from 62 to 1.6 recalculations/s global.css, k4.mjs
The brain's targets are lazy the 2 520 targets were drawn at module evaluation; now each grain reads its own through a getter, and the polygons' edges are indexed by y band draw from 615 to 18 ms, identical hash; the 2.2 s long task at startup is gone cerebro.mjs, orbe.mjs
The center returns to the void with the brain assembled, clicking the center goes back to "Everything is 1" instead of drawing a pair; the center group moved to the end of the SVG to win the diagonals' clicks 96 of 96 points of the center; before, the diagonals took 81 Sistema.astro, k4.mjs
The pillars' phrases rewritten by the owner, in his own voice: "always look for the black swan", "what I build has to work without me", "all I know is that I need to make this...", "what is the right question, after all?" art's has 111 characters: two lines at 1440, five at 390 pilares.ts
Tried and discarded: the tour over the real hero the entrance walkthrough actually ran as a veil with a cutout of light over the real figure, with the cursor touching the real pillars; the owner didn't want it - "I want the tutorial screen minimalist" - and the whole tour came out the same day the real hero alone, with a 4x slower CPU and no GPU, runs at 78 ms per frame; the tour added no cost of its own section 12

10 What this workbench measures about itself

A page that demands numbers from others declares its own. Measured with the same script, at 1440×1000: 32 fences and 36 rules in 476 elements, or 6.7 fences per 100.

Remeasured on 12/09/2026, after this update, with the collection from caixa.test.mjs - the same one that closes out the site's routes: 30 fences and 99 rules in 3 177 elements, or 0.9 per 100. The element count doesn't match the one from 09/09, and it wasn't reconciled: this collection counts every element in the document, including the fields' strokes, and the one from 09/09 wasn't saved, so there's no knowing what it counted. The fences, which don't depend on the base, are almost the same: 32 before, 30 now.

It's high for a reading page and right for this one: 10 of the 32 are color samples, which are rectangles of color; 6 are the home page's proportion diagram; and 6 are the card and the tags in the "today" column - that is, the defect on display. Two fences were a habit of mine and came out: the bordered pill around the workstream label, which is the same vocabulary that P32 orders removed from /about/, and the gap trick over a colored background, which draws a rule but counts as a fence.

What it costs, and what isn't measured. The six typography candidates add up to 341 KB of font that the site doesn't load. And orcamento.test.mjs measures only the home page: this route doesn't go through the weight gate. That's acceptable on a working noindex workbench and would be unacceptable on a public route - when a family is chosen, it comes in through astro.config.ts, with a declared subset, and the other five come out of here.

And the two fields cost HTML: about a thousand short strokes put the page at 471 KB of markup on 09/09, and on 12/09 dist/laboratorio/index.html measures 669 KB - it went up from 300 KB when the brushstroke shrank to the painting's scale, because a short stroke means more strokes. Here it's the right price, and generating at build time is what keeps the sem-js gate standing. In the hero, P35 does not do it this way: there the field is a pure function evaluated at runtime over the 160 particles that already exist, and the cost is arithmetic, not bytes.

What it reads now, in this browser

From here down nothing is a recorded number: it's read at runtime from the CSS, the fonts and the modules - and that's why it changes with the theme, the window and the browser of whoever is looking. Without JavaScript the tables keep the dash.

token computed value contrast on the background WCAG (4.5:1 text · 3:1 border)
--foreground - - -
--tom-1 - - -
--tom-2 - - -
--accent - - -
--border - - -
--hairline - - -
--pilar-ciencia - - -
--pilar-tecnologia - - -
--pilar-arte - - -
--pilar-filosofia - - -

The contrast is calculated from the computed value, converted from OKLCH to linear sRGB by the space's own math (OKLab → LMS → RGB) - and not through canvas.fillStyle, which returns black for oklch() and gave two agents two rounds of false numbers today.

loaded face weight style status
----

The home page's client modules, read from disk at build time: 74 files, 1341.5 KB in source (before bundling, minifying and compressing - the bundle is smaller, but the order of magnitude and the proportion between them are these).

module in source share
orbe.mjs 179.8 KB 13%
k4.mjs 105.4 KB 8%
espaco.mjs 91.3 KB 7%
meu-ceu.mjs 62.1 KB 5%
atomo-nucleo.mjs 52.2 KB 4%
ceu-pessoal.mjs 50.7 KB 4%
trilha.mjs 48.7 KB 4%
mini-nave.mjs 44.9 KB 3%
voz.mjs 40.4 KB 3%
constelacao.mjs 39.2 KB 3%
constelacao-pessoal.mjs 35.6 KB 3%
controle-poderes.mjs 29.1 KB 2%
ovos.mjs 28.1 KB 2%
metricas.mjs 27.9 KB 2%
afinacao.mjs 24.3 KB 2%
cerebro.mjs 19.7 KB 1%
estoque.mjs 19.4 KB 1%
ceu-sonoro.mjs 19.2 KB 1%
grafo.mjs 19.1 KB 1%
grifo.mjs 19.0 KB 1%
lembretes.mjs 18.1 KB 1%
atomo.mjs 17.1 KB 1%
portas-de-poder.mjs 16.5 KB 1%
arsenal.mjs 16.3 KB 1%
palavras-do-inventario.mjs 16.1 KB 1%
mapa-do-site.mjs 15.8 KB 1%
desfecho.mjs 15.8 KB 1%
celebracao-dos-poderes.mjs 15.5 KB 1%
descoberta.mjs 12.9 KB 1%
pagina.mjs 12.7 KB 1%
epoca.mjs 10.8 KB 1%
disco-da-voyager.mjs 10.8 KB 1%
simbolos.mjs 10.1 KB 1%
inventario-local.mjs 9.2 KB 1%
orbita-viva.mjs 9.2 KB 1%
paleta.mjs 9.1 KB 1%
perto-do-post.mjs 8.2 KB 1%
marvin-no-site.mjs 8.0 KB 1%
posicao-pelo-pilar.mjs 7.9 KB 1%
aberturas.mjs 7.8 KB 1%
painel-de-descobertas.mjs 7.1 KB 1%
orbita.mjs 7.1 KB 1%
figuras-do-ceu.mjs 6.9 KB 1%
faisca.mjs 6.7 KB 0%
compartilhar.mjs 6.6 KB 0%
mancha.mjs 6.6 KB 0%
marcos.mjs 5.7 KB 0%
album.mjs 5.6 KB 0%
modelo.mjs 5.4 KB 0%
previa.mjs 5.4 KB 0%
parametro-tudo.mjs 5.3 KB 0%
campo.mjs 5.3 KB 0%
conjunto.mjs 4.6 KB 0%
poderes.mjs 4.2 KB 0%
tempo-de-leitura.mjs 4.2 KB 0%
sem-webgl.mjs 4.1 KB 0%
tutorial.mjs 3.9 KB 0%
cabeca-do-marvin.mjs 3.8 KB 0%
tinta.mjs 3.8 KB 0%
atomo-worker.mjs 3.7 KB 0%
caderno.mjs 3.6 KB 0%
destravar-audio.mjs 3.4 KB 0%
luz.mjs 3.4 KB 0%
miniaturas.mjs 3.2 KB 0%
forma.mjs 2.3 KB 0%
aureo.mjs 2.2 KB 0%
chaves.mjs 2.2 KB 0%
favoritar.mjs 2.1 KB 0%
ceu-compartilhado.mjs 2.0 KB 0%
diario.mjs 1.8 KB 0%
trecho.mjs 1.8 KB 0%
ultimo-controle.mjs 1.4 KB 0%
sinal-da-leitura.mjs 1.4 KB 0%
mapa-da-pagina.mjs 0.8 KB 0%

11 The neighbor's television

In Amélie, she puts together a tape of loose scenes and leaves it at the door of the neighbor who never leaves home. This set does the same: it draws a scene from the list on each visit and only fetches the video when someone turns it on - until then, what's on the screen is the cover frame. The list lives in src/data/tv.ts, and adding a scene is adding a line.

Later, on 13/09/2026. The tape has eight scenes, the panel's two knobs really turn the tuning (they were decorative and aria-hidden), and the switch has tube static with the cut landing in the middle of the static. The owner's playlist was left out because it's private, and a private list= brings down the whole embed - measured with and without the parameter in the same session. The television also lives on /sobre, at the very end, without a caption. Still open: the owner wants to try GIFs playing on their own, one after the other, in place of the videos.


Cute Lamb Needs Attention Lee Walters

12 The entrance curtain

The home page opens with a curtain, and it exists for three reasons that aren't ornament: sound is only born inside a gesture (the autoplay policy doesn't recognize pointermove; the click that opens the curtain is the gesture that unlocks the AudioContext); the figure takes time to assemble, and the curtain is its time; and motion is a system preference, but the site offers the local door.

phase what happens measured decision
opening "we are made of star stuff" alone on the screen, condensing into smoke, 3.4 s of reading fades out in 1.5 s while the body comes in Sagan is one of the owner's pillars; that's why it opens alone and doesn't compete with anything
loading the K₄ draws itself as a gauge: nodes (fonts), edges (the live figure), ellipse (the first click's plates decoded). No phrases: the owner tried reminders on top and backed off - "it gets confusing" readiness gate: 3 consecutive frames below 20 ms, 4 s ceiling; readiness with an 8 s ceiling. Warm cache: ready at 2.4 s, before the phrase ends it isn't a clock, it's a measurement - "only when you're 100% sure everything is loaded"
question watch or skip, two buttons of the same weight; anyone who has already seen it gets "watch again" with skip suggested the question waits for the opening phrase to fade out: at 5.0 s a tutorial that blocks gets abandoned (NN/g); entering stays one click away the whole time
walkthrough four minimal acts over the figure with the real alchemical symbols and the names: four pillars; two lit and a third is born; the whole is greater than the sum of its parts; in the dust, some grains twinkle. Phrase first, animation after, rest, clean screen between acts. Click advances, Escape skips, "skip what you already know" with the curtain hiding the hero, 16.7 ms per frame with a 4x slower CPU the six-act version with dots and lines was confusing: the replica didn't look like the hero. The miniature is now the real figure
settings sound, motion and language in three columns - label, control, hint - with the enter button contrast in the light theme: from 4 in 5 texts failing (3.45 to 4.31) to 7 in 7 passing (5.76 to 14.06) the cause was color-mix(..., transparent), which is opacity by another name

What the curtain doesn't do. It isn't a gate: a click enters, Escape enters, and there's an emergency opener in the inline script for the interval when the module hasn't arrived yet - measured on 13/09/2026 with the network at 400 KB/s, the enter button stayed drawn for 13 s with no listener, and the report was "everything is white". It doesn't exist without JavaScript. And it doesn't decide anything on its own: sound starts off, motion starts as the system asked. The ?cortina address reopens it, and it leaves the bar via replaceState on entering.

13 The dust and the two constellations

Among the sky's 320 grains, 26 hide one of the owner's references. When clicked, a sheet opens; when it closes, the grain flies to the constellation on its side and becomes a star. Virgo on the left, Cancer on the right - the sun sign and the rising sign, and nobody needs to know that to play. The split is semantic, written into the catalog: Virgo is the mind that analyzes and orders, Cancer is home, memory and what one feels.

the rule how it works measured origin
The egg moves against the current the dust follows the field's turbulence in curves; the egg moves in a line, slowly, in the direction opposite to the local wind, with a tiny sway - the one crossing the river, among those going with it 22 of 26 against the current, median cosine -0.98 between displacement and wind; 1.7 px/s against the dust's 2.3 units/s "the constellations' dust needs to move a little differently from the others, think"
The egg is loose from the pillars it doesn't enter the pillars' field, the shape, the bridge or the flow; only the pointer attracts it, lightly science lit for 20 s: mean distance from the eggs to the pillar from 549 to 551 px (before, it shrank - that was the orbit) "they should stay loose in the universe around"
The egg never leaves the screen it's born in the visible rectangle with 12 px of slack, and is held at the edge with a damped bounce; the scatter destination also stays in the visible area 0 outside at 1440x900, 1280x720 and 390x844, three visits each, after 10 s at 1440x900 one of the 26 was born below the fold on every visit - "otherwise there's no way to find it"
Three tiers of star found: golden, four-pointed, breathing in a 3.6 s cycle; vacant (find assigned, not found yet): empty ring; background star (no find): thin dot luminance of the found one 203.9 against 200.4 for the dust's peak; the vacant one 36.8. Before, the found one was at 0.42 alpha and the brightest dust at 0.94 - the find was dimmer than the dust white was tried and rejected - "not sure I liked it"; the four-pointed shape is the one from Hevelius's maps, the same language as the final engraving
Each constellation closes its own the stars are projected from the real coordinates, upright, centered on the ellipse's vertical center; when it closes, the Hevelius engraving (1690) appears for an instant and then only on hover boxes centered at 576/576 px at 1440x900 and 514/514 at 1280x720, against the ellipse Cancer has 18 stars and the Praesepe as a tiny cluster; it's the faintest in the zodiac and the drawing owns that
Scatter the button below the closed constellation sends the stars back to the sky: uniform direction over 360°, an arc going around the figure, 3.6 s with a trail three rounds: no direction with less than 8% of the grains, median from 416 to 508 px, 0 grains in the ellipse in any frame the first version only pushed to the opposite side: "it has to be for all of them"
The egg doesn't compete for clicks 24 px margin around the pillar's disc and the buttons, 8 px around the label; a click on top of the lettering belongs to the pillar 26 of 26 eggs opening the sheet over three visits; before, 21 of 26 - the box of the pillar's whole group with 24 px became a 205x190 px dead zone "the easter eggs can't compete with the main clicks"

Test mode: /?ovos paints the eggs red and exposes each one's position in the canvas's data-ovos-xy; /?ovos=25 opens the visit with the first 25 finds already found, without saving anything.

14 The sound

Silence is the default, and nothing plays without a gesture. The rule applies to the pillars' chord, to the finds' chimes and to the soundtrack. Everything that sounds is in the same tuning: each pitch is a partial of the harmonic series over the same 55 Hz - interface sound out of tune with the rest reads as an effect pasted on top. There is a single room (SALA in afinacao.mjs: 2.8 s of tail, cutoff at 2 400 Hz).

what how it sounds why measured
grain under the pointer short note, rotating among 550, 660, 770 and 880 Hz variation against fatigue; floor of 0.18 s between repeats peak 0.039 - it whispers. It never creates the audio context: it only sounds for someone who has already clicked something
find perfect fifth rising, 440 to 660 rising is gain peak 0.157 - it speaks
flight to the star glide from 330 to 880 in 2.4 s, with breath, landing on 880 the pitch follows the path; the sound arrives before the image the landing on 880 falls consonant on top of the constellation's chord, without adjustment
constellation closes the 4:5:6:7 chord, entries 160 ms apart it's the chord that only exists with all four together peak 0.335 - it sings. Someone who comes back with everything found doesn't hear it: that would be autoplay
scatter five steps descending, 880 to 440 descending is loss -
the soundtrack "Says", by Nils Frahm (Spaces, 2013): the first three minutes on a loop, Opus at 96 kbps (2.1 MB) and AAC for Safari, with the beginning raised by up to 20.5 dB because the original opens at -49 dB starts on the sound click, plays through the whole journey, survives a refresh from the same point (sessionStorage) and turns down when a video plays over it (midia:tocando / midia:parou, with a running balance) volume 0.42; 90 s measured on the production build with scrolling and a click on a pillar: zero pauses. A commercial work without a usage license: the owner's decision, with the credit on /creditos

A single AudioContext per page, closed on pagehide - measured on 13/09/2026, the curtain's one stayed running until the end, and voz.fechar() was born because of that.

15 The memory, and what you left here

Everything the site remembers stays in the person's browser - the site is static, there's no server, nothing leaves here. There are ten keys - eight in `localStorage` and two in the tab's session. The table below reads yours now, in this browser; without JavaScript it shows only what each key is.

key what it stores where it's erased now, here
eltonleao.caderno.v1 the pillar pairs already discovered in the hero - the notebook none in the interface: the notebook is only erased by "forget everything" below -
eltonleao.ovos.v1 the finds in the dust, by each one's id the scatter button, below the closed constellation -
eltonleao.sistema.v1 the reading stock per pillar, which fills the footer signature "reset the reading", in the footer signature -
eltonleao.som.v1 sound on or off the sound button, on the curtain or under the figure -
eltonleao.volume.v1 the music volume, from 0 to 1 the slider in the header, drag it to 0 -
eltonleao.movimento.v1 reduced motion on this site only the motion button, on the curtain or under the figure -
eltonleao.idioma.v1 the language chosen at the curtain's door, before anything else none in the interface; ?zerar or "forget everything" below -
eltonleao.completo.v1 whether the figure has already been whole once - the sheet at the end of the hero, which only shows up on its own once none in the interface; ?zerar or "forget everything" below -
eltonleao.cortina.v1 whether you have already entered in this tab - the curtain doesn't come back in the same session closing the tab, or ?cortina in the address -
eltonleao.trilha.v1 the music position, so a refresh picks up where it left off closing the tab -

Your reading stock, now

subject read in the archive the footer node
science - - -
technology - - -
art - - -
philosophy - - -

A text counts when it stays visible for twenty continuous seconds with the tab in the foreground - opening, scrolling and clicking don't count. The same text doesn't count twice, and a text from two subjects fills both. When all four nodes fill up, the footer signature starts pointing to how this site is organized.

No scoreboard, and not out of taste. The fifteen non-empty combinations of four pillars are the face structure of the K₄: four vertices, six edges, four triangles and the whole. The figure already draws that object - it is the notebook, and no medal needs to exist. The reading stock only counts what was visible for continuous seconds with the tab in the foreground: it doesn't count opening, scrolling or clicking, because a scoreboard that rises with clicks measures clicks.

16 Reading and the lists, afterwards

Sections 03, 05 and 06 describe what was decided between 09 and 10/09. On 13/09 the three surfaces were redone again, and what the measurement found this time wasn't the line or the leading:

principle source the page, before now
measure of 45 to 75 characters, ideal ~66 Bringhurst 2.1.2; Butterick 71 characters at 624 px - within same
line height grows with the measure Bringhurst 2.2.1 1.70 - within same; paragraphs 29 px apart (they were 25, at the lower limit)
white space proportional to what it separates Bringhurst ch. 8; Tschichold kicker, title, dek with 16 px between each, for a 46 px title - outside 24 / 28 / 28 px
table of contents visible without competing with the text NN/g, Table of Contents table of contents 48 px from the column and cypress 20 px from the table of contents: a wall - outside 80 px gutter; active section marked
wide screen: keep the measure, use the margin Medium, Substack, iA; Bringhurst 8.3 offset composition: center at 838 on a 960 screen - outside centered composition, table of contents included; tables bleed up to 10 rem into the margin
the projects listing section 03 featured item with a thumbnail stacked at any width: 6 378 px for eight projects ruled row with the plate on the right: 5 406 px; table with the name as the link
the pillar filter section 03 and the hero chips with a dot and a name; on click, the filter hid itself (the chips also have data-pilar) and there was no way to clear it the four alchemical symbols with the hero's selection ring; "all" is the complete K₄; three ways to clear

WebGL is off

This site needs your graphics card

The space in this site - the Swordfish, the flight between galaxies, the sky you build - is drawn by the graphics card, through WebGL. It is off in this browser, and without it those parts don't show up. The writing is still readable.

How to turn it on

Addresses like chrome://settings don't open from a link: copy and paste them into the address bar.