# Web Brutalism — style guide for coding agents

> Generated from the Aesthetary record for **Web Brutalism**.
> Research: **Partly sourced** · Build guidance: recorded in 6 of 8 research dimensions.
> 11 sources attached.

## How to use this

Paste this file into your agent as context before asking it to design or build something in this visual language. It states what is established, what is our interpretation, and what nobody has established. Treat all three differently.

**The most important section is "Not researched yet".** Its purpose is to stop you and your agent inventing rules that sound right and are not recorded anywhere.

## What this language is

**Defining:** No border radius, default system fonts, default blue links, visible structure

**Recognise it by:** Undisguised document structure — no border radius anywhere, no shadow, hard unmodulated contrast, system fonts used at conspicuous sizes, and layout that follows the markup rather than concealing it. The diagnostic condition is legible intent: the removals are emphatic and somebody is meant to notice them, which is why the register usually overshoots plainness into something loud. Utilitarian arrives at a similar surface without having decided anything. Anti-Design breaks the structure; this exposes it intact.

**Family:** Raw & Anti-Design
**Era:** contemporary
**Native medium:** screen

**Scope:** The visual register of the purist strand of brutalist web design: bare, near-unstyled HTML exposed as material. Zero radius, harsh contrast and oversized system type are Aesthetary's reading; Neo-Brutalism stays separate.

## What it is arguing

The conventions of contemporary web design are a costume, and removing them is an argument. Showing the document's real structure — undecorated, unrounded, unsoftened — is a position about honesty, taken by someone who could have done otherwise.

**It refuses:** Refuses rounded corners, soft shadow, decorative easing, and the whole grammar of comfort that marks a page as professionally designed.

## What it is not

Commonly confused with these. Getting the difference right matters more than getting the surface right:

- Utilitarian
- Anti-Design
- Neo-Brutalism

## Established rules

Grouped by what kind of claim each is. A requirement of the language and our own interpretation are not interchangeable.

**How to read each rule.** Every rule states two separate things, and neither stands in for the other:

- **Kind of claim** (the heading): From our catalogue entry · Source attached · Documented · Source attached · From our catalogue entry · Our reading · Documented · Source attached.
- **Evidence** (how it is established): Graded by our research brief · No source attached (`DOCUMENTED`) · From our catalogue entry (`SUPPORTED`) · Our reading (`CURATORIAL`) · Not researched yet (`UNKNOWN`) · No grade recorded (no grade in the record). Where a claim has its own canonical label, the Evidence line gives that label instead of the grade.
- **Product area**: which of the twelve areas the rule belongs to (Layout, Typography, Color, Imagery, Surface, Interface, Motion, Motif, Technique, Form, Hierarchy, Density), mapped from its raw area label in bold. "Context" means the rule is about the Aesthetic (its name, origin, lineage) rather than a part of the design. "Not mapped" means the raw area has no single area yet.
- The code in brackets is the `grade` field at `implementationConstraints.tokenRules.value.rules[].provenance.grade` in https://aesthetary.com/data/web-brutalism.json. "From our catalogue entry" means: Stated in Aesthetary’s existing catalogue entry. An outside source is named only where one is linked to the claim.

### From our catalogue entry · Source attached

_Carried over from Aesthetary's original catalogue entry. The reasoning behind it was never recorded._

- **layout** — Composition: document flow made visible.
  - Kind of claim: From our catalogue entry · Source attached · Evidence: From our catalogue entry · Source attached · Product area: Layout

### Documented · Source attached

- **typography** — Typography: the system's own faces at scale, its sans stack or its monospace.
  - Kind of claim: Documented · Source attached · Evidence: Documented · Source attached · Product area: Typography

### From our catalogue entry

_Carried over from Aesthetary's original catalogue entry. The reasoning behind it was never recorded._

- **form / motif / surface / technique** — Form / motif / surface / technique: zero radius; zero elevation.
  - Kind of claim: From our catalogue entry · Evidence: From our catalogue entry · Product area: not mapped

### Our reading

- **hierarchy** — Rank by raw scale and rule weight. Type sizes jump rather than step; a heading is three times the body, not 1.4.
  - Kind of claim: Our reading · Evidence: Our reading · Product area: Hierarchy
- **motion** — Instant state changes, no easing. Transitions are a comfort device and the register refuses comfort.
  - Kind of claim: Our reading · Evidence: Our reading · Product area: Motion
- **color** — Colour: the browser's own defaults, light ground, black text, blue links; reading it as harsh contrast is ours.
  - Kind of claim: Our reading · Evidence: Our reading · Product area: Color

## Found in research

What research established from sources Aesthetary opened and checked. Each line names its area, how it is known, and where it is scoped. "Seen in the work" means the source documents particular works or products rather than the Aesthetic as a whole.

- **Surface** — The material shown is the web's own: HTML and, to a lesser extent, CSS left raw, paralleling brutalist architecture's bare building materials.
  - Evidence: Documented · Source attached · Claim: `kcc:surface-1` · Covers purist strand (O'Brien's 'l'Internet brut').
- **Surface** — This aspect of brutalism is sometimes expressed as bare-bones, almost naked HTML with raw or nonexistent styling; excluding applied texture or grain is Aesthetary's inference.
  - Evidence: Documented · Source attached · Claim: `kcc:surface-2`
- **Motion** — Documented animation belongs to the antidesign strand ('unnecessary distracting animations'), which the approved scope excludes.
  - Evidence: Documented · Source attached · Claim: `kcc:motion-1` · Covers antidesign / 'anti-ist' strand, out of scope.
- **Motion** — Deville's Brutalist Websites collection lists 'Motherfucking Website'.
  - Evidence: Documented · Source attached · Claim: `kcc:w2-motion-1` · Covers Deville's collection also includes antidesign-leaning sites; the listing places this page in the brutalist canon, not specifically in the purist strand..
- **Motion** — That page explicitly rejects decorative animation: hover-animated banners and 'bobbing' buttons driven by scroll plugins.
  - Evidence: Documented · Source attached · Claim: `kcc:w2-motion-2` · Covers One exemplar; the page calls itself satire..
- **Motion** — The thesis describes design using few features beyond websites' default appearance, and names animations and customised cursors as distracting features.
  - Evidence: Documented · Source attached · Claim: `kcc:w2-motion-3`
- **Motif** — The practitioner guidelines allow decoration when needed and reject decoration for its own sake, which leaves ornament conditional rather than forbidden.
  - Evidence: Documented · Source attached · Claim: `kcc:motif-1` · Covers Copeland's guidelines, not Deville's purists.
- **Motif** — The architectural parent is defined by bare materials over decorative design.
  - Evidence: Documented · Source attached · Claim: `kcc:motif-2` · Covers architecture, not the web strand.
- **Technique** — Pages are built from the purest markup elements available, with little or no custom styling.
  - Evidence: Documented · Source attached · Claim: `kcc:technique-1` · Covers purist strand as described by Deville.
- **Technique** — The build stays legible from the source: a novice can follow how the page is put together.
  - Evidence: Documented · Source attached · Claim: `kcc:technique-2`
- **Technique** — Default, unstyled HTML is itself readable on all devices; styling is added only to solve a specific problem.
  - Evidence: Documented · Source attached · Claim: `kcc:technique-3` · Covers Copeland's guidelines, which are behavioural rather than visual.
- **Technique** — Several exemplars never set out to be brutalist: their style was a result of the limitations of HTML and CSS at the time, not an artistic choice.
  - Evidence: Documented · Source attached · Claim: `kcc:technique-4` · Covers separates the historical exemplars from later deliberate practice.

## Positions by area

The overall position recorded for each area. "No overall position recorded" means rules exist for the area but no position above them; the rules still apply. It is not the same as "Not established", which means nobody has researched the area.

- **Layout** — Specified
- **Typography** — Specified
- **Color** — Specified
- **Surface** — Specified
- **Interface** — Specified
- **Motion** — No overall position recorded
- **Technique** — Specified
- **Imagery** — Outside this language. The area does not apply; this is not a gap in the research.

## Design grammar — web primitives

A starting grammar for a website in Web Brutalism: the plainest markup, the document's own structure left showing, the browser's light ground, black text and blue links, system fonts at conspicuous sizes, nothing softened and nothing eased.

Three kinds of line: **On the record** names a rule this record holds (its wording is under Established rules) and states what it becomes on the web. **Web translation** is Aesthetary's choice for the web, derived from the rules it cites; change it if you have a reason, keep the cited rule. **Not specified by the source** means the research reached this but the sources say nothing about it; **Not researched yet** means the research has not reached it yet. Either way, follow the instruction and do not invent a rule. Structured version: `designGrammar` in data/web-brutalism.json.

### Colour

| Role | Value | Contrast | Use | Kind |
| --- | --- | --- | --- | --- |
| ground | `#FFFFFF` | — | The page: a light ground. | On the record |
| ink | `#000000` | 21:1 | Text: black. | On the record |
| link | `#0000EE` | 9.4:1 | Links and focus: the browser default blue. | On the record |

- **On the record · Documented** · `claim:kcc:definition` → Use the browser's own defaults: a light ground, black text, blue links. Choose no palette.

### Typography

Family: none chosen: the platform decides. Stack: `system-ui, -apple-system, "Segoe UI", Roboto, sans-serif`

| Role | Size | Weight | Line height | Case | Tracking | Measure | Use |
| --- | --- | --- | --- | --- | --- | --- | --- |
| heading | 3.1875rem | 700 | 1 | not specified | not specified | — | Headings: three times the body. |
| body | 1.0625rem | 400 | 1.5 | not specified | not specified | — | Everything else. |

- **On the record · Documented · Source attached** · `typography`, `token_rule:typography-4` → Use the system's own faces, its sans stack or its monospace; choose no typeface.
- **On the record · Our reading** · `token_rule:hierarchy-13` → Make a heading three times the body size; sizes jump rather than step.

### Grid and layout

No grid: the layout follows the markup and lets the document's flow show.

- **On the record · From our catalogue entry · Source attached** · `token_rule:layout-3` → Stack content in source order; let the document flow be visible.
- **Not specified by the source** — The sources do not specify a column system. _Instead:_ Do not add a grid to tidy the page; if one is needed, state it as a decision.

### Shape and geometry

Tokens: radius `0` · shadow `none` · border `2px solid #000`

- **On the record · From our catalogue entry** · `token_rule:surface-8` → border-radius: 0 and box-shadow: none, everywhere.
- **Web translation** — Draw boundaries as heavy 2px black lines. _Why:_ Rank by rule weight; a heavy line is a rule the reader is meant to notice. (`token_rule:hierarchy-13`)

### Imagery

- **Not specified by the source** — The sources do not specify imagery. _Instead:_ If images appear, show them as the browser would: no frame, no filter.

### Exposure

The removals are the point, and they are meant to be noticed. Soften one corner and the position collapses.

- **Web translation** — Make the removals emphatic: no radius, no shadow, no easing, visible structure. _Why:_ Our translation of the record's recognition signature into this web primitive; the record states it as the look, not as a rule. (`gestalt`, `intent`)
- **Web translation** — Refuse rounded corners, soft shadow, decorative easing and the grammar of comfort. _Why:_ Our translation of the record's argument (intent) into this web primitive; the record argues it, it does not state it as a rule. (`intent`)

### Which Brutalism

Three camps share the name, by its coiner's account, and which of them the record covers is contested. This grammar is the purist camp; the anti-ist camp is Anti-Design.

- **On the record · Our reading** · `claim:dcc:wb-r1` → Build the purist register: raw HTML shown as material, unconcerned rather than broken.
- **On the record · Documented** · `claim:kcc:technique-1`, `claim:kcc:technique-3` → Build from the purest markup elements available, with little or no custom styling; add styling only to solve a specific problem.
- **Web translation** — Keep contrast, visible focus, underlined links and labels. _Why:_ The purist camp shows the material without breaking it; so does Aesthetary. (`claim:dcc:wb-r1`)

### Components

Anatomy, tokens and states below are Web translation: Aesthetary's specification for the screen. Each value line after them says whether it restates a rule this record holds.

#### Button

The browser's own button, left almost alone: a black box, system type, no rounding, no easing.

- Anatomy: 2px solid black border; system font at body size; no radius, no shadow
- Tokens: border `2px solid #000` · radius `0` · shadow `none` · transition `none`
- State, default: White field, black border, black label.
- State, hover: Inverts to black field, white label. Instantly.
- State, focus: 3px blue outline (the default link blue).
- State, active: Stays inverted.
- State, disabled: Border and label struck through, not faded.
- Accessibility: Contrast is 21:1 in both states.
- Accessibility: Disabled is shown by a strike-through, not only by fading.
- **On the record · From our catalogue entry** · `token_rule:surface-8` → border-radius: 0 and box-shadow: none.
- **On the record · Our reading** · `token_rule:motion-14` → Change state instantly: transition: none.
- **Web translation** — Invert black and white on hover instead of tinting. _Why:_ The palette is the browser's defaults (light ground, black text, blue links); an inversion stays inside it where a tint would add a colour. (`claim:dcc:color-5`)

#### Card

Not a card: a block with its outline left showing, stacked in document order.

- Anatomy: 2px black outline; heading at raw scale; plain paragraph; underlined link
- Tokens: border `2px solid #000` · radius `0` · padding `1rem`
- State, default: Outlined block.
- State, hover: The outline thickens to 6px.
- State, focus: 3px blue outline.
- Accessibility: Links stay underlined.
- Accessibility: Blocks follow source order, so reading order and visual order agree.
- **On the record · From our catalogue entry · Source attached** · `token_rule:layout-3` → Let the layout follow the markup: blocks stack in document order.
- **Web translation** — Leave each block's outline visible. _Why:_ Document flow made visible: the boxes the browser draws are shown, not hidden. (`token_rule:layout-3`, `gestalt`)

#### Input

A native field with a heavy black border and its label as plain text above.

- Anatomy: 2px black border; system font; label as plain text
- Tokens: border `2px solid #000` · radius `0` · font `system`
- State, default: 2px black.
- State, focus: 3px blue outline.
- State, error: Black field, white message: "Error: …".
- State, disabled: Struck through.
- Accessibility: A visible label on every field.
- Accessibility: Error text, not colour.
- **Web translation** — Use the system font for entry text. _Why:_ Our translation of the record's typography block into this web primitive; the block is a catalogue phrase, not a rule. (`typography`)
- **On the record · From our catalogue entry** · `token_rule:surface-8` → No radius on the field.

#### Navigation

A list of underlined links, left as a list.

- Anatomy: links underlined, default blue; separated by a slash or a line break; current page as plain bold text, not a link
- Tokens: link `#0000EE` · underline `always` · separator `/`
- State, default: Underlined blue.
- State, hover: Black background, white text.
- State, focus: 3px blue outline.
- State, current: Bold black text, no link.
- Accessibility: Underlined links need no colour to be found.
- Accessibility: aria-current on the current page.
- **On the record · Documented** · `claim:kcc:definition` → Leave links underlined in the browser's default blue.
- **On the record · Our reading** · `token_rule:hierarchy-13` → Rank by raw scale and rule weight, not by colour.

### Motion

Durations, easing and the rest of this specification are Web translation: Aesthetary's choice for the screen.

- Durations: state 0ms
- Easing: state `none`
- Transforms: none
- Entrance: none
- Hover: An instant swap.
- Reduced motion: Nothing changes: there is no motion to reduce.
- **On the record · Our reading** · `token_rule:motion-14` → Change state instantly, with no easing.
- **On the record · Documented** · `claim:kcc:w2-motion-3` → Add no decorative animation: a thesis on brutalist web design names animations and custom cursors as distracting features.
- **Not specified by the source** — Whether the purist strand specifies motion or its absence is an open question. _Instead:_ Treat the instant swap as our reading; do not cite it as the strand's rule.

### Deliberately not added

- **Imagery** (imagery): Unknown.
- **A column system** (gridLayout): The record holds document flow, not a grid.
- **Whether the purist strand specifies motion** (motion): An open question on the record; the instant swap is our reading.
- **Interface conventions** (components): The research record does not establish them. The four components are contemporary translations of documented rules.

## Coverage — what has been looked at

One row per research dimension a research pass considered. "Not researched yet" (`UNKNOWN`) means exactly that; a dimension can carry an Aesthetary recommendation and still be unresearched, and those are different things.

| Research dimension | Evidence | Resolved by | Carries a rule |
| --- | --- | --- | --- |
| Composition | Specified · From our catalogue entry | follows the recorded claim | yes |
| Typography | Specified · From our catalogue entry | follows the recorded claim | yes |
| Hierarchy | Specified · Our reading | Aesthetary decided | yes |
| Colour | Specified · From our catalogue entry | follows the recorded claim | yes |
| Density | Not specified by the source | Aesthetary decided | no |
| Imagery | Not specified by the source | — | no |
| Form / motif / surface / technique | Not specified by the source: form, motif · Specified: surface, technique | follows the recorded claim | yes |
| Motion | Open question | Aesthetary decided | yes |

Unresearched: Motion. Where a rule appears for one of these it is Aesthetary's implementation recommendation, not a property of the language, and its Evidence line above says so.

## Not researched yet

Nobody has established a position for this language on:

- Motif
- Form

**Do not fill these in.** An absent position is absent research, not permission and not a blank for you to complete. If the work needs a decision in one of these areas, make it on other grounds and do not attribute it to this language.

## Grade your own work

20 checks: 9 mechanically testable, 9 needing a person to look, 0 needing a source Aesthetary does not hold, 2 with no recorded position. 2 further research dimensions produced no rule (Density, Imagery). This rubric is silent on them. Scores do not add up. A failure against a required rule and a departure from something we invented are not the same result, and no total should let them cancel.

### Recognition — does this read as the intended Aesthetic?

- **[visual_human · recognition signature · Evidence: No grade recorded]** Strip every logo, word and borrowed image out of your work, then show it to someone who knows the collection. Do they land on this Aesthetic? The signature to hold is: Undisguised document structure — no border radius anywhere, no shadow, hard unmodulated contrast, system fonts used at conspicuous sizes, and layout that follows the markup rather than concealing it. The diagnostic condition is legible intent: the removals are emphatic and somebody is meant to notice them, which is why the register usually overshoots plainness into something loud. Utilitarian arrives at a similar surface without having decided anything. Anti-Design breaks the structure; this exposes it intact.
  - _If it fails:_ The work may be competent and still read as a different Aesthetic, or as none. Nothing below matters until this passes.

### Fidelity — are its defining rules present?

- **[unassessable · no recorded position · Evidence: Not researched yet (`UNKNOWN`)]** Nothing is recorded as a requirement of this Aesthetic. There is no rule here that your work must hold — which means nothing you do can fail this dimension, and nothing you do can satisfy it either. That is missing research, not freedom: our research brief does record failure modes to avoid, listed under avoidance below. They are recorded judgement, not requirements.
  - _If it fails:_ Not applicable. An empty dimension is an absence of research, never a pass and never a failure.

### Implementation — were those rules translated appropriately into this medium?

- **[visual_human · From our catalogue entry · Source attached · Evidence: From our catalogue entry · Source attached]** Your work may depart from this — but knowingly, not by accident. Composition: document flow made visible.
  - _If it fails:_ A defensible departure, and you should be able to say why you made it.
- **[visual_human · Documented · Source attached · Evidence: Documented · Source attached]** Your work may depart from this — but knowingly, not by accident. Typography: the system's own faces at scale, its sans stack or its monospace.
  - _If it fails:_ A defensible departure, and you should be able to say why you made it.
- **[visual_human · Our reading · Evidence: Our reading]** Your work may depart from this — but knowingly, not by accident. Rank by raw scale and rule weight. Type sizes jump rather than step; a heading is three times the body, not 1.4.
  - _If it fails:_ A defensible departure, and you should be able to say why you made it.
- **[visual_human · From our catalogue entry · Evidence: From our catalogue entry]** Your work may depart from this — but knowingly, not by accident. Form / motif / surface / technique: zero radius; zero elevation.
  - _If it fails:_ A defensible departure, and you should be able to say why you made it.
- **[visual_human · Our reading · Evidence: Our reading]** Your work may depart from this — but knowingly, not by accident. Instant state changes, no easing. Transitions are a comfort device and the register refuses comfort.
  - _If it fails:_ Nothing. No one has researched the dimension yet, and this is only what Aesthetary would do. Departing from it costs you nothing.

### Avoidance — known failure modes, neighbour drift, cloning

- **[mechanical · recorded failure mode · Evidence: No grade recorded]** Check your work against this: No border radius.
  - _If it fails:_ A failure mode recorded in our research brief: recorded judgement about what weakens this Aesthetic, not a requirement of the language.
- **[mechanical · recorded failure mode · Evidence: No grade recorded]** Check your work against this: No shadow or elevation.
  - _If it fails:_ A failure mode recorded in our research brief: recorded judgement about what weakens this Aesthetic, not a requirement of the language.
- **[mechanical · recorded failure mode · Evidence: No grade recorded]** Check your work against this: No easing or transition.
  - _If it fails:_ A failure mode recorded in our research brief: recorded judgement about what weakens this Aesthetic, not a requirement of the language.
- **[mechanical · recorded failure mode · Evidence: No grade recorded]** Check your work against this: No webfont chosen for warmth.
  - _If it fails:_ A failure mode recorded in our research brief: recorded judgement about what weakens this Aesthetic, not a requirement of the language.
- **[mechanical · recorded failure mode · Evidence: No grade recorded]** Check your work against this: No muted palette.
  - _If it fails:_ A failure mode recorded in our research brief: recorded judgement about what weakens this Aesthetic, not a requirement of the language.
- **[mechanical · recorded failure mode · Evidence: No grade recorded]** Check your work against this: No decorative whitespace.
  - _If it fails:_ A failure mode recorded in our research brief: recorded judgement about what weakens this Aesthetic, not a requirement of the language.
- **[visual_human · recorded failure mode · Evidence: No grade recorded]** Have you made any of these changes? Each one moves the work into a neighbouring Aesthetic: Against Utilitarian: argued versus unexamined. Inherited verbatim. Against Anti-Design: exposure versus breakage. This keeps structure legible; Anti-Design deliberately breaks alignment and legibility. Anti-signature: soften one corner and the position collapses. Break the alignment and it becomes Anti-Design.
  - _If it fails:_ You have built the neighbour. That may be fine — but name which Aesthetic you are in.
- **[mechanical · declared closure · Evidence: No grade recorded]** Check your work against this: Not open: radius.
  - _If it fails:_ This one is closed, not open. The record says generation must not go here.
- **[mechanical · declared closure · Evidence: No grade recorded]** Check your work against this: Not open: shadow.
  - _If it fails:_ This one is closed, not open. The record says generation must not go here.
- **[mechanical · declared closure · Evidence: No grade recorded]** Check your work against this: Not open: easing..
  - _If it fails:_ This one is closed, not open. The record says generation must not go here.
- **[visual_human · neighbour drift · Evidence: No grade recorded]** Could your work be mistaken for Utilitarian? That language is: Plain by default rather than plain as a statement — the distinction from Web Brutalism
  - _If it fails:_ Not necessarily wrong, but you are closer to Utilitarian than to this Aesthetic.
- **[visual_human · neighbour drift · Evidence: No grade recorded]** Could your work be mistaken for Neo-Brutalism? That language is: Heavily styled, where Web Brutalism is unstyled
  - _If it fails:_ Not necessarily wrong, but you are closer to Neo-Brutalism than to this Aesthetic.

### Accessibility — the Aesthetic preserved without its inaccessible practice

- **[unassessable · no recorded position · Evidence: Not researched yet (`UNKNOWN`)]** Does this Aesthetic conflict with any usability floor? Nobody has recorded one for it.
  - _If it fails:_ Nothing — and that is the problem. An unrecorded conflict is not an absent one. Hold AA on reading matter and decide the rest on other grounds.

**Not covered at all:** Density: Not specified by the source; Imagery: Not specified by the source. These research dimensions produced no rule, so there is no check. Treat them as unscored, never as passed and never as failed.

## Rules for the agent

1. Do not invent rules for any area listed under **Not researched yet**.
2. Do not treat an absent position as permission to do anything you like — say that the language has no position, and decide on other grounds.
3. Keep our interpretations separable from the language's own requirements. If asked to justify a choice, cite which kind of claim it came from.
4. If you need something this record does not contain, say so rather than producing a confident answer from the aesthetic's name.
5. When you self-score against "Grade your own work", score only checks marked `mechanical`. Declare `visual_human` and `evidence_dependent` checks unjudged rather than guessing, and never score an `unassessable` one.
6. Evidence "Not researched yet" (`UNKNOWN`) is never a failure. It means nobody researched the dimension, so departing from what is written there costs nothing and must not be reported as a defect. "No grade recorded" is not a grade either: do not treat it as our decision or as an outside source.
7. In **Design grammar**, a "Web translation" line is our choice for the web and may be changed with a reason; the rules it cites may not. Never present a translation as a property of the language.

## Provenance

- Record: `web-brutalism` · status `draft` · research `partly_researched`
- Full structured record: https://aesthetary.com/data/web-brutalism.json
- Human-readable record: https://aesthetary.com/a/web-brutalism.html
- This file is a snapshot. The record may have changed since; check the page above.

_Aesthetary is an alpha. Where a page says nothing, nobody has done the work yet._
