Changelog
What changed on the street, and when. Every Stimpunks site publishes one of these.
Subscribe to this page — the feed is generated from it, so the two cannot disagree.
2026-09-24 — The Map: the whole street in white card, and a Where am I? on every page
- New street furniture by the front door: The Map, the whole street as a model in white card on a cutting mat. Every shopfront stands where it stands, on the side of the road it falls on, with the rooms behind rooms standing behind them; the garden’s gate is halfway down; the campground’s field is off the top of the board past the treeline and the road out of town is off the bottom past the last streetlight. Every building, tent, sign and tag on it goes to the place it stands for.
- Every page now has a Where am I? at its foot, next to the liner notes. It opens the map at the page you were on, with a flag on it saying you came from there. Nothing is stored and no script is involved: the page’s own name is the address of its place on the model.
- Nothing on the model is painted. Every room here has its own light and its own colours, and a map that painted them all would be telling you they belonged to one set. So it is one white card, and each room is left to be itself when you get there.
- Nothing on it was placed by hand. The model is built out of the street itself — the front page’s row of shopfronts in the order they stand, the campground’s board and the road’s signs — so it grows when the street does, and a new room cannot open without going up on it, because the build refuses until it has. On a phone both sides of the road are kept, because which side a room is on is the point of a map.
- Two new typefaces: Architects Daughter, by Kimberly Geswein, for the lettering on the model, and Albert Sans, by Andreas Rasmussen, for everything you read. Both are on the Foundry’s shelves and in the Mopery’s font picker, with their designers named.
- Changed:
map.html,data/map.jsonandtools/make-map.py(all new),og/map.png(new),fonts/,index.html, every page’s sign-off (tools/signoff.py),love.css(§49 is the map; small screens and print are §50 and §51 now),data/quests.json,liner-notes.html, the Foundry and the Mopery’s picker.
2026-09-24 — The Collection Collection: the house brings the furniture, the light is theirs
- A new shopfront on the street: The Collection Collection, a dark gallery of our people’s collections. Every collection stands in a cabinet of its own under a lamp of its own, and no two lamps are alike: a daylight lamp over Ryan’s pens, paper and ink, because a warm bulb lies about the colour of an ink, and a strip light inside his perfume cupboard’s door, because light spoils perfume.
- A cabinet with nothing in it yet stands with its lamp off, and its label is exactly as easy to read as a lit one. Ryan’s pens, paper and ink are in, under their daylight lamp, and his perfume cupboard is still dark, waiting for its photographs. Norah and her husband’s leather swatches and stamping tools, Chelsea’s house plants and Helen’s books and rocks each have a cabinet with their name on it, say that Ryan relayed them, and stay empty until they send something. Their lamps are theirs to choose.
- The house describes every photograph so that nobody has to. Writing a title, a description and a caption for every picture is work, and work is what stops people sending a picture at all. So Claude writes them, looking at each photograph, and every cabinet says so on its label. It describes only what it can see and never names a maker or a model from what a thing looks like; an owner’s own words win wherever they give any. This is the opposite of the polaroid wall on purpose: a description of a person is theirs to write, and a description of a pen is not a description of anybody.
- Nothing is counted, priced, valued or ranked, and nobody asks how many.
- Every photograph is stripped before it reaches the site. A new tool takes phone photographs in, turns them the right way up, removes the location and every other scrap of metadata a phone writes, makes them smaller without cropping them, and leaves a record that stops the room building until somebody has described each one and looked at the whole frame for a person or an address. The room’s own tool refuses a photograph that still carries any metadata, a filter on any photograph, and two cabinets with the same lamp.
- The photographs are not under this site’s Creative Commons licence, so that anything can still come down when its owner says so.
- Two new typefaces: Gloock, by Duarte Pinto, for the room’s name and every label’s heading, and Hanken Grotesk, by Alfredo Marco Pradil and Hanken Design Co., for everything you read. Both are on the Foundry’s shelves and in the Mopery’s font picker, with their designers named.
- Changed:
collection-collection.html,data/collection.json,tools/make-collection.pyandtools/intake-collection.py(all new),og/collection-collection.png(new),fonts/,index.html,love.css(§48 is the new room; small screens and print are §49 and §50 now),liner-notes.html,adventurers-guild.html,foundry.html,the-mopery.html,LICENSE,.gitignore,tools/make-og.py,tools/make-guild.py,tools/make-webp.py,tools/check-contrast.py,tools/check-classes.py,tools/structured.py,tools/make-sitemap.py,sitemap.xml,llms.txt,feed.xml.
2026-09-23 — The feed keeps a busy day in order
- Entries from the same day used to arrive in any order. Every one of them carried the same time, noon, so a reader had nothing to sort them by. On a day with more than ten, stimpunks.org’s feeds page showed ten of them in an order of its own and left out the newest.
- Now the top entry of a day keeps noon and each one under it is a minute earlier, so every reader lists them in the same order as this page. The dates are still true. The minutes are only the order, and not a claim about when anything was written.
- Nothing reappears as new. Each entry keeps the identifier it was published under.
- Changed:
tools/make-feed.py,feed.xml.
2026-09-23 — The street is Stimpunks.World now
- The site lives at stimpunks.world, and it is called Stimpunks.World. We had been calling it Stimpunks World for a while, as it grew past one street into rooms behind rooms, a campground past the treeline and a road out of town, so the domain was registered to match and the name moved with it: every page title, the feed, the favicon, the share cards, and the wordmark on the front door, whose pink second line now says .world.
- Every old link still works. stimpunks.love stays ours and sends you, page for page, to the same place here. The certificate covers both.
- Your feed reader should not see anything twice. Each changelog entry keeps the identifier it was published under, so moving house did not turn a week of entries back into news.
- The older entries below still say stimpunks.love where that was where the street was at the time. We did not go back and rewrite them to match.
- Changed: every page’s head (title, canonical, Open Graph, structured data),
index.html’s wordmark, every share card inog/,sitemap.xml,llms.txt,feed.xml,robots.txt,site.webmanifest,favicon.svg,_redirects,/.well-known/(the agent skill moved tostimpunks-world, and the old path redirects),data/arrivals.json,data/foundry.json, and the tools that write any of them.tools/make-feed.pykeeps its guids on the old domain.
2026-09-23 — Samefood Cafe: your favourite, the way you have it
- A new shopfront on the street: Samefood Cafe, for samefoods and safe foods, and for understanding food aversion rather than correcting it. The kitchen knows its regulars: it keeps what each of them has, the way they have it, and is ready for the day their samefood changes with the season. The menu is whatever the regulars ask for, a dish goes on when somebody asks, and nothing comes off because somebody else got bored of it. Samefoods have seasons, and the room says so.
- Nothing touches unless you want it to, and that is the room. Separation is offered, never imposed: the house’s divided plate keeps different foods apart and the ramekins keep red things off everything, and a bowl is one person’s dish, the way they eat it, touching as much as they like — some of us need everything apart and some of us do not mind at all. It is drawn from directly above the table, under one even light that is the same at every hour, so every object sits in its own soft ring of shade. Every plate on the page is the same plate — the menu, the book and every tray — which is Covenstead’s mismatched china turned inside out, one door along.
- The menu is three entries from our glossary, Samefood, Safe food and Food aversion, each with one short line from somebody who has written about it: C.L. Lynch at NeuroClastic, Kari Burroughs Kraakevik at Thinking Person’s Guide to Autism, and Matthew Broberg-Moffitt. Two were read against their own pages; the two from the book could not be, and the room says so beside them.
- On the counter: Color Taste Texture, by Matthew Broberg-Moffitt, with its details read off Open Library’s record, and a way to find it in a library as well as a shop.
- The regulars’ samefoods are on trays of their own, written down exactly as they were given and not tidied, sorted, ranked or added up. Ryan’s, Helen’s and Ronan’s are the first, each with a bowl of their samefood of the moment — ramen with fresh green onions, pesto pasta, chicken nuggets; more are being collected in our community’s Discord. Every list comes down when its person asks, and every food drawn on the plate in the window is off one of them.
- We default to structure, separation and predictability, and every guest is accommodated individually — never regarded as fussy, picky or too much, just quietly and professionally accommodated. Nobody’s way imposes on anybody else’s plate: Ronan has red things in a ramekin of their own, so his ketchup comes that way, and the room’s tool holds his food, and nobody else’s, to it.
- Two new typefaces: Fredoka for the café’s name and headings, and Inclusive Sans, drawn so that no letter can be taken for another, for everything you read. Both are on the Foundry’s shelves and in the Mopery’s font picker, with their designers named.
- Changed:
samefood-cafe.html,data/samefood.jsonandtools/make-samefood.py(all new),og/samefood-cafe.png(new),fonts/,index.html,love.css(§47 is the new room; small screens and print are §48 and §49 now),liner-notes.html,adventurers-guild.html,foundry.html,the-mopery.html,data/quests.json,data/foundry.json,data/foundry-faces.json,sitemap.xml,llms.txt,tools/make-og.py,tools/make-guild.py,tools/make-sitemap.py,tools/check-contrast.py,tools/check-classes.py,README.md,CLAUDE.md,DECISIONS.md.
2026-09-23 — The Small Hours gets a jukebox, and one song printed in full
- The Small Hours plays both of Josephmooon’s albums, So Far So Good and Hand in Heaven, every track, streamed from the band’s own site and hosted nowhere here. Josephmooon is the music project made for the lyrics of Ronan Boren, a Stimpunk, and Stimpunks helped produce it. Every button says how long its song runs before the press, measured off the file itself; only one song plays at a time; and the two album buttons say how many songs and how long before they start several.
- “Up All Night” is on the counter with its words printed in full, a song about Autistic insomnia, with its credits: Ronan Boren, all lyrics; Bill Paige, vocals and guitar; Ronnie Nice, guitars, keyboards, bass, drums and programming; Ian Nice, piano, keyboards and backing vocals. That is permission rather than quotation: every other room quotes a line or two of a song or none, and this is the one song on the street published whole, because Stimpunks holds permission to distribute it and its lyrics.
make-small-hours.pyrefuses a lyric without a written-down permission, the words are excluded from this site’s licence inLICENSE, and the agent skill’s “no lyrics” line now names the one exception. - A recording from somebody else’s server needed its own origin list.
love-embed.jshas anAUDIO_ORIGINSarray beside its frame list and builds the players;make-csp.pyreads it into a newmedia-src, path and all, because without one the policy falls back to'self'and the jukebox would be a row of buttons that press and play nothing. The privacy page lists the band’s site among the services a press can reach. - Changed:
small-hours.html,small-hours.js(new),data/small-hours.json,tools/make-small-hours.py,love-embed.js,tools/make-csp.py,_headers,love.css§4 and §44,privacy.html,LICENSE, the agent skill,liner-notes.html.
2026-09-23 — Four new turnings off The Outskirts, each lit a way the road had not been
- Turning 04, Dance, Punks: a silent disco on an old airstrip, lit by nothing but the headsets. Three channels that are our Dance, Punks playlist started in three places — the room says so, and never calls it shuffle — and tuning is silent while the headset is off. The volume is on the player, so the loudness this whole street hands the visitor is handed to every dancer. The three channel colours are held at least 1.5 to 1 apart in brightness so they stay three headsets in greyscale, and nothing on the runway strobes or moves at any setting. Each channel’s opening song was pressed and heard starting where it says.
- Turning 05, The Small Hours: an all-night diner seen lit from the dark car park, for bodies that keep other hours. Crip time in Alison Kafer’s words, a clock with no hands, a menu with no prices, and no sleep advice anywhere, for a reason one of its quotations gives. The sign does not read your clock. The crayons passage in our Sleep entry is Sarah Kurchak’s, and this room nearly credited it to somebody else from memory: our entry links the book without naming its author, so every author here was resolved against a library record.
- Turning 06, The Repeater: a radio mast on the ridge at the far end of the road, where everything is a silhouette against the glow of everybody else’s light. Our Shared-Signal Space entry is its argument, a log confirms every kind of contact and counts none, and a line you can leave open is a quiet noise made in your browser that sends nothing and listens to nothing. The Autistic Rhizome was first credited here to Helen Edgar alone; our own entry shows DGH Neurodivergent Consultancy named it, and both are credited now. That article’s own address now serves a holding page, so the room links our entry instead.
- Turning 07, Nothing For Sale: a free market in a lay-by, lit by a ring of cars that pulled up nose-in and left their headlights on, so everything in the middle throws one shadow for every car. Solidarity, not charity; tables of free things of ours, each checked against its own page; no proof of need; nothing counted. Our mutual aid grants are pointed to rather than laid out, because they have an application and a waiting list and a table would promise otherwise.
- A new tool for each, and every refusal in them was broken on purpose and fired. Two were wrong on their first run and were narrowed rather than excepted: the disco’s animation check refused its own section’s comment describing the refusal, and the lay-by’s charity check refused the room’s sentence explaining what charity is.
check-jukebox.pyhad not been able to run since Laughingstock opened. That room’s data file carriesactsas well assets, the branch foractscame first, and the comics were read as videos with no artist, so the whole run refused before checking anything.setsis tested first now, and the disco’s three opening songs are in its lists. The diner’s jukebox is not, because none of it is on YouTube.- Syncopate is under the Apache License 2.0, not the OFL, and the first draft of two credits said otherwise; the pulled record caught it. Looming Rocks’ board, description and house rules still said six concerts when the bill has ten, and say whole concerts now rather than a number.
- Changed: four new pages, scripts, data files and tools;
love.css§1, §4 and §43–§46 (Small screens and Print are §47 and §48);the-outskirts.html;looming-rocks.html;fonts/;data/foundry.json;data/foundry-faces.json;data/quests.json;tools/make-guild.py,make-og.py,make-sitemap.py,check-contrast.py,check-classes.py,check-jukebox.py;liner-notes.html; four new share cards.
2026-09-23 — The Lightbulb Picture House: every screening is a relaxed screening
- A new shopfront on the street: The Lightbulb Picture House, a picture house showing films about autism, ADHD and neurodiversity, most of them made by the people they are about. It is named for Thriving Autistic’s short film Lightbulb Moments: Being Autistic, which is on its first screen.
- Two screens, both our own playlists: Animated Introductions to Autism, ADHD, and Neurodiversity and More on Autism, ADHD, and Neurodiversity. Each plays whole and runs until you stop it, and every film on them was checked on its own watch page before it went up.
- The rack has a card for every film on Screen One, in the order it plays: who made it, where it was published, how long it runs, a line of ours about it written from the film rather than from its title, and what is in it, said before you press — a panic attack, a bullying scene, jokes about suicide, a sponsor segment. Where one of our own pages already carries the film or the idea, the card links to it.
- Every screening is a relaxed screening. The house lights stay up, the captions come on by default, and you can move, stim, sit on the floor, come in late and leave early. The drawing of the auditorium is lit all over, with a floor cushion in the aisle and a pair of ear defenders on a seat.
- Nothing in the building is blue. A lightbulb theater lit blue would be Light It Up Blue, the awareness campaign autistic people have spent years refusing, and Amy Sequenzia says why on the page. The bulbs are warm, the ornament over the screen is the gold infinity, and
tools/make-picture-house.pyreads the room’s palette and refuses a blue — along with the vocabulary of awareness in our own voice, a film with no note of what is in it, and a pronoun for any maker, because none of the films says what theirs are. - Two new typefaces: Limelight, an Art Deco fascia face, for the name and the headings, and Outfit for everything you read. Both are on the Foundry’s shelves and in the Mopery’s font picker. At MAX GLITTER the popcorn in the second row pops; no bulb ever flickers.
- Changed:
lightbulb-picture-house.html,data/picture-house.jsonandtools/make-picture-house.py(all new),og/lightbulb-picture-house.png(new),fonts/,index.html,love.css(§42 is the new room; small screens and print are §43 and §44 now),liner-notes.html,adventurers-guild.html,foundry.html,the-mopery.html,data/quests.json,data/foundry.json,data/foundry-faces.json,sitemap.xml,llms.txt,tools/make-og.py,tools/make-guild.py,tools/make-sitemap.py,tools/check-contrast.py,tools/check-classes.py,tools/check-jukebox.py,README.md,CLAUDE.md,DECISIONS.md.
2026-09-23 — Laughingstock: a comedy club where only the comics stand in the light
- A new shopfront on the street: Laughingstock, a comedy club down a ramp rather than a flight of stairs. It leads with our own writing from the Campfire Learn Together Being Disabled Can Be Pretty Funny: comedy is a form of knowledge, and disabled comics take the stage on their own terms, in their own voice, controlling the frame.
- The stage is our own Disabled Comedy playlist, put on whole and running until you stop it, and beside it is the bill — every set on that playlist, one press each, the comics named on every one and the runtime said before you press. Josh Blue, Tina Friml, AJ Wilkerson, Benny Feldman, Steve Way, Ahren Belisle and Fiona Cauley. Nothing plays until you press play.
- The light comes from behind you, and the only thing that stands in it is what the comics said. One follow spot throws a hard-edged pool onto a brick wall, and each of Josh Blue’s and Tina Friml’s lines stands in an oval of that light with their name under it. Everything of ours — the write-up, our notes, the house rules — is out in the dark with the audience. Nobody is drawn on the stage: a mic, a stool, a glass of water, and a ramp up to it.
- House rules: no cover and no two-drink minimum, nobody in the front row made part of the act without asking, talk to the comic and not to whoever came in with them, bombing is allowed, nobody is called brave, and nobody headlines.
tools/make-laughingstock.pyrefuses the vocabulary of inspiration and of ranking in the room’s own voice, and skips the comics’ own lines, so that “I suffer from people” is allowed to say suffer. - Two new typefaces: Yellowtail, a sign-writer’s script, for the neon and the comics’ names, and Bricolage Grotesque for everything you read. Both are on the Foundry’s shelves and in the Mopery’s font picker, with their designers named. At MAX GLITTER the water on the stool goes sparkling; the neon never flickers.
- Changed:
laughingstock.html,data/laughingstock.jsonandtools/make-laughingstock.py(all new),og/laughingstock.png(new),fonts/,index.html,love.css(§41 is the new room; small screens and print are §42 and §43 now),liner-notes.html,adventurers-guild.html,foundry.html,the-mopery.html,data/quests.json,data/foundry.json,data/foundry-faces.json,sitemap.xml,llms.txt,tools/make-og.py,tools/make-guild.py,tools/make-sitemap.py,tools/check-contrast.py,tools/check-classes.py,tools/check-jukebox.py,README.md,CLAUDE.md,DECISIONS.md.
2026-09-23 — Dead Tired Society: the big lights off, the door ajar, and nobody in the light
- A new shopfront on the street: Dead Tired Society, peer support by and for people in burnout and people on the far side of it. The name is a play on Dead Poets Society, and the name is the only thing taken from the film — no line, no scene, no character.
- It is a borrowed room after hours with the big lights off and the door left ajar, and the only light is the corridor’s, lying across the floor through the gap. Every word on the page stays in the shade on purpose: masking is performing under a light, and this is the room where nothing has to. Nobody is drawn in the picture of it, because nobody in there is on display.
- By the door there is a row of pegs for what people carried in — masking, minority stress, epistemic injustice, justice sensitivity, moral injury and neuronormativity, and more named further along the wall. Each says what is hanging on it, gives one short line from somebody who has written about it, credited to them, and adds a line of ours. Every line was read off our own glossary, and where a source was named only by title or initials the authors were looked up rather than guessed.
- Standing orders nobody is standing for, and a talking piece you can pass, because passing is a whole turn. What you type into it goes nowhere and is not kept.
- What it will not do is written on the page and enforced by its tool: no advice nobody asked for, no tips, nobody praised for resilience, no timeline, nothing counted, nobody at the front. It is not a meeting and says so, and points at our community and at mutual aid. Near the top, a line for anybody whose night is worse than tired, pointing at our Help and Coping pages.
- Two new typefaces: Sorts Mill Goudy for the society’s name, and Lexend for everything you read, which was drawn to ease reading fatigue. Both are on the Foundry’s shelves and in the Mopery’s font picker, with their designers named.
- Changed:
dead-tired-society.html,dead-tired.js,data/dead-tired.jsonandtools/make-dead-tired.py(all new),og/dead-tired-society.png(new),fonts/,index.html,love.css(§40 is the new room; small screens and print are §41 and §42 now),liner-notes.html,adventurers-guild.html,foundry.html,the-mopery.html,data/quests.json,data/foundry.json,data/foundry-faces.json,sitemap.xml,llms.txt,tools/make-og.py,tools/make-guild.py,tools/make-sitemap.py,tools/check-contrast.py,tools/check-classes.py,README.md,CLAUDE.md,DECISIONS.md.
2026-09-23 — The Guild signs off once
- The Adventurer’s Guild ended with two lines of links once every page got its sign-off: its own, on the desk beside the credits, and the shared one under it. The desk’s line is gone. The desk keeps its credits and the dial; the way back to the street is the link at the top of the page, as it is in every room.
- Changed:
adventurers-guild.html.
2026-09-23 — Lighter pictures, where that is measurably true
- Fifty-six of the street’s JPEGs are WebP now, and the pictures on those pages weigh about 29% less — 2.4MB across the scans, prints, engravings, photographs and thumbnails. The biggest single waste went with it: the Pebble Board’s video thumbnails were stored 1280 pixels wide and are never drawn wider than 170, and they are 512 now, which still covers a phone screen at three times density.
- Twenty-four stayed JPEG, each for a reason written down. Every file was converted at the lowest quality that measured as faithful to its source, and swapped only if that saved at least a tenth. Most of Doré’s and Tenniel’s engravings did not clear that bar: fine hatching is the one thing lossy formats are worst at, and at the same fidelity WebP was no smaller than the JPEG, sometimes larger. Converting them anyway would have meant a heavier file or a softer engraving, chosen for the format’s sake.
data/webp.jsonholds every decision and its numbers. - The first attempt measured the wrong thing and was undone. It compared colour as well as detail, and WebP always stores colour at half resolution, as most JPEGs do — so on small, bright thumbnails it concluded no quality was good enough and left the oversized ones exactly as they were. It had deleted JPEGs under that rule, so everything went back to the last commit and ran again measuring detail, which is what the eye looks for.
- Nothing about the pages changed but the files. WebP goes into the same image tags, so no room’s layout moved; AVIF was often smaller still, but serving it safely means wrapping every picture in a new element, and at least one room’s layout depends on its images not being wrapped. The share cards and icons stay PNG, because link previews and home screens do not all read anything else. Every picture on the affected pages was loaded and checked afterwards, and the photographs still carry no location or device data.
- Changed: images in
raven/,oracle/,alice/,pebbles/andphotos/,data/mopery.json,data/oracle.json,data/rabbit-hole.json,data/pebble-board.json,data/webp.json(new), the pages those generators write,og/oracle-deck.png,tools/make-webp.py(new),tools/make-og.py,README.md,CLAUDE.md.
2026-09-23 — Honest sitemap dates, three videos unsquashed, and a consent date for every voice
- The sitemap stopped saying the whole street changed every time it was rebuilt. Every page’s
lastmodused to be the day the sitemap was generated, which tells a crawler that everything is new whether or not anything is — the exact mistake the specification names. Each page’s date is now the day of the last commit that touched it, read out of the repository’s history, and the tool refuses to run where there is no history to read rather than guessing. - Three videos on the Pebble Board were squashed. Every play button takes the shape its player will have, and three of the board’s videos are older and four-by-three: their thumbnails were being stretched to fill a sixteen-by-nine box, every face in them a third wider than it is. They are fitted now, with the board’s own night either side, which is what the player shows once you press it. Not cropped: those frames have no bars to cut, and taking a quarter off a music video to fill a box would be the same fault the other way round.
- Every recorded voice on the street now has a consent date, the readings in Hear Queer Here included. The yells and the Faery Yurt’s recordings always carried one; the readings did not, which is why the privacy page had to word its promise around them. They were agreed to on the day each recording landed, and that date is now read off the commit that added each file rather than typed.
make-readings.pyrefuses a recording without one, as the other two audio tools do, and the privacy page makes the plain promise it could not make before. - Changed:
sitemap.xml,tools/make-sitemap.py,love.css(the Pebble Board’s section),data/readings.json,tools/make-readings.py,privacy.html.
2026-09-23 — Structured data, and a note for any agent reading the street
- Every page describes itself in JSON-LD, the format search engines and agents treat as fact. Everything in it comes out of that page’s own head — its title, its description, its address — so it cannot say anything the page does not. The publisher is marked with the same identifier Star Stuff uses, so two of our sites describe one Stimpunks Foundation rather than two. The licence is on the site, not on each page, because the photographs of people are excluded from it. The missing-address page gets none: it has no address to describe.
- There is a skill for agents, at
/.well-known/agent-skills/stimpunks-love/SKILL.md: how to read, quote and cite this site. It says where the indexes are, why the site gives no count of its rooms and what to do if you need one, that the rooms are different on purpose, that two of them must not be summarised as advice or a fortune, and what the licence covers — including that the photographs are not to be reused. The counting check reads it, so it obeys the site’s own rule. /.well-known/api-cataloglists every machine-readable resource (RFC 9727), and every response now points at it. It uses only link relations that are actually registered, which is why the sitemap and the skill are not in it under relations they do not have — Star Stuff found out the hard way and published the correction. Both files are generated: the skill’s sha256 is computed from its bytes on every run, and the catalogue refuses to name a file that does not exist. Both refusals were tested by breaking them.- Changed: every page’s head,
llms.txt,_headers,.well-known/api-catalog,.well-known/agent-skills/(new),tools/structured.py,tools/make-structured.pyandtools/make-agent-files.py(new),tools/make-foundry.py,tools/make-sitemap.py,tools/check-counts.py,README.md,CLAUDE.md.
2026-09-23 — Every page signs off, in its own voice, with a way back to the top
- Every page now ends with the same short line: back to the top, the liner notes, Your Room, the changelog, the privacy page, the feed, and whose street this is. Somebody looking for how to leave, who made this, or what happens to them finds it in the same place wherever they are, which is what the privacy page in particular needed.
- It is not the front page’s footer, on purpose. The street ends on its chalk pavement and keeps it; our own notes have said since the Guild opened that the street’s footer reaching into a room would be the one piece of the street’s look in a world that has its own. So the line brings no colour, no typeface and no ground: it is set in whatever the room already uses, the way the job markers are, and reads as the room signing off. The pavement takes its links from the same list, so the two cannot disagree.
- Back to top is a plain link, and it moves the keyboard too. It jumps rather than scrolls, at every dial setting, and the next Tab after it lands on the skip link at the top of the page rather than on whatever followed the line. It works with scripts off.
- One room needed its own. The Zibaldone’s link colour is a rubric red chosen for paper, and the line lies on the dark desk below the sheets — 1.07 and 1.74 there. It takes the laid paper’s own colours on the desk now. Every other room’s links already cleared their own floor.
- It does not print. A link on paper goes nowhere and “Back to top” at the foot of a sheet is false — and it pushed issue #2 of the zine onto a second sheet the day it arrived, which
check-print.pycaught. - Changed: every page,
love.css§4, the Zibaldone’s section and Print,tools/signoff.pyandtools/make-signoff.py(new),tools/make-foundry.py,tools/check-contrast.py,tools/check-print.py,README.md,CLAUDE.md.
2026-09-23 — A privacy page, which is short because there is very little to say
- The privacy page says what this site knows about you, and all of it. No cookies on any response; two settings in your own browser, both things you asked it to remember; nothing from any other service until you press play, with each player’s own policy linked; and the ordinary logs our host keeps. Netlify’s analytics is not switched on. It names who publishes the site, where to write, what your rights are, and that every change to it will be dated here.
- Every sentence on it was checked against the site rather than written from what a privacy page usually says. The storage keys were read out of the scripts, the absence of cookies off live responses, the embed services out of the one list the site frames, and each outside policy link was requested. One draft sentence did not survive: it said every recording on the street had a dated consent record, and the readings in Hear Queer Here, read by the people who made that room, do not carry one. The sentence says what is true instead.
- It is linked from the front door’s footer, the liner notes, the Polaroid Wall and the security policy, is in the sitemap, and has a share card. It carries no job marker: the page somebody reads to find out what happens to them is not a stop on a walking tour.
- Changed:
privacy.html(new),index.html,liner-notes.html,polaroids.html,SECURITY.md,tools/make-sitemap.py,tools/make-guild.py.
2026-09-23 — Sentences that had stopped being true, somewhere to report a hole, and a real favicon.ico
- The site was still counting its rooms in places the counting check could not see. The Playhouse opened by giving its own number on the street, Your Room said it was linked beside a number of others, the Arcade’s description gave its number too, and the favicon’s own source said its stripes were the rooms, one each.
check-counts.pylooked only for a number in front of a noun; it now also catches the number after one, and the total left hanging at the end of a sentence with the noun understood. Its first run refused a count of tilted leaves in our own notes, and the pattern was narrowed rather than the sentence excepted. It reads the favicon,netlify.tomlandSECURITY.mdnow as well. llms.txtsaid every typeface was under the SIL Open Font License. Four are Apache 2.0, which the Foundry found out by reading each family’s own record. The line is generated from that record now instead of typed, so it names both licences and will name a third if one ever arrives.- A comment in
netlify.tomlsaid the domain redirect was still switched off. It was switched on on 2026-09-19. - There is a way to report a security hole.
/.well-known/security.txt, per RFC 9116, and aSECURITY.mdsaying what this site actually is and what is worth reporting. The contact is GitHub’s private vulnerability reporting, switched on for this repository today, because an issue on a public repository discloses a report the moment it is filed.make-security.pywrites the file and refuses from thirty days before its expiry date, because a lapsed security.txt is invalid rather than merely old. /favicon.icoexists. Browsers and crawlers ask for it whatever a page’s head says, and until today every one of those requests got the missing-address page. There is an Apple touch icon, and the manifest carries 192, 512 and maskable icons for installs. Every one is rendered fromfavicon.svgbymake-icons.py, at each size directly rather than scaled down, and the manifest’s list is written by the same tool, so an icon cannot be declared without being drawn.- The security header upgrades anything insecure it meets. Nothing on the site loads over plain http today;
upgrade-insecure-requestsis there so that a link pasted into a room tomorrow gets upgraded instead of blocked as mixed content. - The Faery Yurt’s two photographs reserve their room before they load. Helen Edgar gave a standing yes today to maintenance that changes nothing a visitor can see, and this is the first of it: both photographs were measured before and after, at desktop and phone width, and render identically. Anything that changes how her room looks is still hers to decide, and the liner notes say so.
- Changed:
playhouse.html,your-room.html,arcade.html,faery-yurt.html,favicon.svg, every page’s head,love.csscomments,netlify.toml,_headers,site.webmanifest,SECURITY.md(new),.well-known/security.txt(new),favicon.ico,apple-touch-icon.pngand three manifest icons (new),tools/make-icons.pyandtools/make-security.py(new),tools/check-counts.py,tools/make-sitemap.py,tools/make-csp.py,tools/make-guild.py,tools/make-foundry.py,tools/check-contrast.py,README.md,CLAUDE.md.
2026-09-23 — A focus ring you can see in every room, and the headings, links, tables and pictures a screen reader walks
- On fourteen pages the focus ring was very nearly invisible somewhere. The ring is 4px of yellow, chosen for a street that is near-black, and it is right there. The pale rooms were never given one of their own: on the Guild’s manila it measured 1.01, and it was no better than 1.31 on the Garden, Covenstead, both zines, the Zibaldone’s paper and the Hermitage’s daylight, on the white cards in Pink Pony Club and the Playhouse, on Club Chronic’s flyers, on the Pebble Board’s cards, on the Den’s track cards and on the pebbling cabinet’s overcast shore. Somebody moving through those rooms by keyboard was moving an indicator nobody could see.
- Each room chose its own, which is the point. There is no new street-wide ring: every room that needed one takes the ink it already writes in, set in its own section beside its own link colour — the clerk’s ink, the loam, the tea-dark brown, photocopier black — and where a room has a dark panel inside a pale one, or a pale card on a dark floor, the panel decides. The Hermitage needed four, because its cave is velvet, its television is glass and its coffee table is cedar. Every one clears 3:1 against every ground it lands on, and the dial keeps its yellow in every room because it is always a dark box.
- Nothing had ever measured a focus ring, so there is a tool that does.
check-focus.pyrenders every page, focuses every control and measures the ring against what it is drawn on. It measures a gradient at every one of its stops and passes only the worst, and it was wrong twice before it was right: it first counted the dark room behind the Latibulum’s plaster as a ground the ring might stand on, then composited the Den’s three layers of shag onto the room instead of onto each other. Both were fixed in the tool, and the Guild’s ring was removed on purpose to prove it still fails. - Three pages skipped a heading level, and all three were generated. Looming Rocks’ running order and the Hermitage’s campfire went from h2 to h4, and the Doomscroll’s headlines were h3 with each poem’s title as an h2 inside them — upside down. Fixed in the generators, and every heading’s computed style was compared before and after, so nothing moved on the page.
check-headings.pyrefuses a skipped level now. - Links that did not say where they went. The Latibulum’s dictionary link said here; it says whose dictionary now. Club Chronic’s twelve flyers each said Go, which a screen reader moving from link to link hears as twelve identical words — the flyer still says Go, and the rest of the sentence is there for the ear. And one card on the Pebble Board was a link with no name at all.
- Every table has a caption and every column header says it is one. Twenty-two tables across the liner notes, the photograph promises and Your Room. The captions are visually hidden, because each table already sits under a heading saying the same thing to anybody who can see it.
- Pictures reserve their room before they arrive. Sixty-nine images on the Pebble Board, in the Mopery, in the Rabbit Hole and on Enid’s wall had no width or height, so the page jumped as each one landed. The generators read the size off the file’s own header now, through one small shared reader checked against every image in the repository, and every picture was measured before and after so that none of them changed shape. The two photographs in the Faery Yurt are Helen Edgar’s markup and were left alone.
- Changed:
love.css§3 and the section of every room that needed its own ring,pink-pony-club.html,zine-table.html,zine-issue-2.html,latibulum.html,liner-notes.html,polaroids.html,your-room.html, the pages the generators below rebuild,tools/check-focus.py(new),tools/check-headings.py(new),tools/imgsize.py(new),tools/make-looming.py,tools/make-hermitage.py,tools/make-doomscroll.py,tools/make-club.py,tools/make-pebble-board.py,tools/make-mopery.py,tools/make-rabbit-hole.py,tools/make-polaroids.py,tools/make-og.py,README.md.
2026-09-23 — An address that is not on the street, and the Gentle default when storage is blocked
- A missing address has a page now. Until today any URL nobody built got Netlify’s own teal “Page not found”, with the right status and no way back to the street.
404.htmlis fog: a house-number plate on a post with no house behind it, rooftops going back into the air until they are gone, and the ways out — the street, the garden for our other sites, a person to tell. It still sends a 404, it is markednoindex, and every path on it starts with a slash because it answers at any depth. - Fog is lit from everywhere, and nothing else on this street is. Every other world is lit from somewhere or from nowhere; fog scatters light until it arrives from every side at once, so nothing casts a shadow, nothing has a lit face, and the only thing that tells near from far is how pale a thing has gone. That is what keeps it off the Adventurer’s Guild, which is lit from nowhere and has no depth at all. Nothing moves in it at any setting.
- It has no share card, no job marker and no place in the sitemap, and each tool says why by name. It has no address of its own to unfurl, post a job at or list.
make-og.py,make-guild.pyandmake-sitemap.pyexempt it explicitly, so every other page still refuses to ship without all three. - One sentence on it was false in its first draft and a measurement caught it. It said a capital letter or a stray space was enough to land here. Netlify folds both back to the right page; what actually lands here is a dropped letter, or the full stop or bracket a link picks up when it is copied off the end of a sentence. The dev server is no guide to this, because the disk it serves from ignores case.
- The render checkers were looking at a different page from the one that ships. A root-absolute path loaded from a
file://probe points at the root of the disk, socheck-contrast-live.pyandcheck-gentle.pywould have measured the 404 unstyled — and an unstyled page passes everything. Both probes now resolve those paths against the repository, andcheck-ids.pystopped counting/love.jsandlove.jsas two scripts. - The dial’s default ignored a device asking for less motion whenever storage was blocked. The snippet every page runs before first paint read the stored setting first and fell back to Regular if that threw, which some private windows do — so a visitor who had asked for reduced motion got the louder version, which is the precise failure the dial exists to prevent. It reads the device’s preference first now and only lets a stored choice override it. The CSP hash moved with it, and
make-foundry.pyreads the snippet off the front page instead of keeping its own copy, which it would have put back on its next run. - The web manifest was still counting rooms. Its description said how many there were, which is the sentence
check-counts.pyexists to refuse — and it had never looked at the manifest, which is shown when the site is installed. It is on the tool’s list now, read as code rather than prose, because a JSON file is nothing but quoted strings and skipping quotation there skips the whole file. - Changed:
404.html(new),love.css§2 and §39 (Small screens and Print are §40 and §41 now), every page’s pre-paint snippet,_headers,site.webmanifest,tools/check-counts.py,tools/check-contrast.py,tools/check-contrast-live.py,tools/check-gentle.py,tools/check-ids.py,tools/check-classes.py,tools/make-foundry.py,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py.
2026-09-22 — Looming Rocks Amphitheatre, and a stage lit from the ground up
- Turning 03 in The Outskirts is a venue. Looming Rocks Amphitheatre is an open-air stage at the foot of two enormous rock faces: six full concerts, a lighting desk that walks the bill without loading anything, and a great deal of stone that was here long before the stage was. It earns that road rather than the campsite — crowds, volume and staying out late is exactly what the road is for.
- The light is thrown upward and nothing else on this street does that. Floods stand on the ground and point up the rock, so a face is brightest at its foot and goes dark towards the top, and there is nothing overhead at all. That is the exact inverse of Sithen one turning back, lit by a full moon from directly above, and of the Lagoon two turnings back, flat frontal light across water at eye level. Three rooms on one road, three directions of light, and vertical was the one nobody had taken.
- And what glows is not the lamp. The lichen fluoresces — it takes light you cannot see and gives back light you can — which is emission rather than reflection, and the third kind of transmitted light here after Swaying Sweetgrass (through grass) and The Feed (through a mask). The lamps are violet; what comes back is cyan-green. That green is the pair to watch: the Lagoon’s acid is a yellow-green one turning along the same road, and the two are far apart in blue on purpose.
- The stage is the Hermitage’s set on a rock face, and it keeps that set’s promises. While the stage is dark, tuning is silent and nothing is fetched; once something is playing, tuning changes the picture. The desk names the act it is about to move to and how long that runs before the press, which matters more here than at the campfire: these are full concerts, the shortest nearly an hour and the longest over two.
looming.jsis a separate file fromhermitage.json purpose — the two sets look alike and are not the same object, and a shared widget would be the harmonising instinct arriving through a script tag. The running order is a<details>and opens and closes with no script at all. - A refusal was copied from the herbarium and did not survive the move. That room catches a guessed Latin binomial with a shape test — one capitalised word, one lowercase word — which works on a page of short labels and, run over prose, matches the start of nearly every sentence. Its first run here refused “Rocks that”, “Once something” and “Ferrell sings”. Excepting those phrases would have been the mistake this repo has already written down three times, so the pattern was narrowed structurally instead: sentence starts are ignored, and it only reads sentences that are about lichen at all. Verified in both directions — a real binomial in a lichen sentence is caught; a band name in a note is not.
- The room stopped explaining which half of itself was invented. A first draft had a section headed what the rocks are, and which half of that is made up. Ryan cut it: this is a street named after a genderqueer, shape-shifting road, and a disclaimer explaining that the sentient rocks are fiction is a page apologising for being the thing it is. His own intro is the room’s opening now. What still needs saying is the part about somebody else’s property, and that is a different job living in the credits.
- The real venue is credited as somebody else’s. Red Rocks Amphitheatre, near Morrison, Colorado, owned and operated by the city of Denver, formed by two sandstone monoliths with a third between them, seating 9,525 — and every recording here was made there. Stimpunks has no connection to it and is not endorsed by it. Every id was checked on its own watch page before it went up: status,
playableInEmbedand length, all of them OK and embeddable, runtimes measured rather than typed. Ten acts, fifteen hours of stage time, six of them posted by the artist or the band themselves — which is the most durable shape of upload this site carries. - The count and the range are generated, because both were typed by hand and both were wrong within the hour. The page said six full shows and a shortest of 57 minutes; four more arrived and neither line knew. They come out of the data file now, and so does the grammar around them — a line reading “1 of them … themselves” is a hand-typed total wearing a disguise, which is the mistake the Jungle Room made with its dead cams. A note claiming one of the new acts was the shortest on the bill was wrong too, by ninety seconds, and was caught by sorting the runtimes rather than by rereading the sentence.
- The room was missing from
check-jukebox.py’s list for a day, which is the gap that tool’s own docstring warns about in as many words: a new set of facades belongs inLISTSin the same commit that opens the room, because a checker reporting “all tracks checked” while silently not knowing about a room reads as coverage and is worse than not running at all. It is registered now, with a branch for this file’s shape. It is also the list with the most to lose per row: a dead id here is not a three-minute disappointment, it is somebody clearing two hours for a video that has gone. - The card overflowed its own box on the first build and the tool caught it, reporting the drawing running to 652 on a card 630 tall. Trimmed rather than cropped. Two new faces, both OFL, designers resolved; Bevan is the fourth heavy slab on this street and is told apart by era and making rather than by weight — routed, pressed, carpentered and, here, painted on a board out in the weather.
- Changed:
data/looming-rocks.json,tools/make-looming.py(new),looming.js(new),looming-rocks.html,the-outskirts.html,love.css§1 and §38 (Small screens and Print renumbered to §39 and §40),fonts/,data/foundry.json,data/foundry-faces.json,data/quests.json,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py,tools/check-contrast.py,tools/check-classes.py,liner-notes.html, and one new share card.
2026-09-22 — Covenstead moves onto the street, and changes worlds doing it
- It was turning 03 in The Outskirts and it is a shopfront now. Ryan’s call, and the reasoning is about what each area is for rather than about decoration: the campgrounds are for people who want to be somewhat apart from each other, at peace in nature, with the street still in reach; the road out of town is for night revelry in crowds and for anybody who wants to be as far off as they can get. A covenstead is neither — a group that meets regularly wants a premises with a door on a street where people already are.
- Helen Edgar’s observation sharpened the split, and it is worth keeping as a test: everything out on that road could sit on the campsite if it had planning permission. So the question to ask of anything placed in either area is would this be just as happy on the campsite? — and if the answer is yes, it is probably not an Outskirts room.
- It changed worlds when it moved, which is the part that mattered. A room relocated with the same stylesheet would be telling you the areas do not mean anything. Out there it was a dark kitchen lit by several lamps that did not match — the only room on the street lit by more than one source. On the street it is daylit, warm and domestic: one window, mid-afternoon, limewash, and the good china out.
- And the argument moved with it rather than being dropped. The device carrying several people who do not match, meeting anyway is now the china — nobody’s cup is anybody else’s cup. That is load bearing and is written into the section, the data file and the card’s alt text: if the crockery is ever made to match, the room has lost its subject and kept its wallpaper.
- Three pale rooms already existed and the light is what tells them apart. The Hermitage is a landscape under low morning sun with solar infrastructure on it; the Garden is midday from overhead through leaves, everything tinted green; the Guild has no light source at all and is lit like a photocopy. This is an interior with one window in the side of it. Its wall is warm and slightly pink where both the other daylit rooms are green-white — if this limewash ever cools towards green it has become the garden with furniture in it.
- A repaint leaves dead
var()behind and nothing warns. Replacing the palette orphaned the job marker, which went on stroking a custom property that had stopped existing — and CSS drops an unknown one and paints nothing, so the kettle rendered with no line at all. Not an error anywhere, andcheck-contrast.pyhad nothing to say because the pair was gone rather than wrong. Caught by grepping the old names, which is now the written rule: markers, card CSS and generator drawings all sit outside the section you are editing. - And the card was redrawn rather than recoloured, for the same reason the room was. It is a dresser shelf with eight pieces of crockery on it, every one a different shape as well as a different glaze — three identical outlines in three inks would be a matching set that had been painted over, which is the opposite of what the room is about.
- The quest dropped from class III to class I, since the walk is now along the street rather than out past the last streetlight, and its posted text no longer describes a road. The Outskirts says out loud that a turning moved and where it went, rather than quietly having one fewer.
- Changed:
covenstead.html,love.css§5 and §37,data/covenstead.json,the-outskirts.html,index.html,data/quests.json,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py,tools/check-contrast.py,liner-notes.html,CLAUDE.md, and that room’s share card.
2026-09-22 — Covenstead, and the only room here lit by more than one lamp
- Turning 03 is open, and The Outskirts now has a road behind every board. Covenstead is a meeting place with the door shut and the kettle on: a greeting with the goodbye built into it, counsel that stayed counsel, a law the tradition argues about, and the practice of watching your own first thoughts.
- It is the only room on this street lit by more than one source, and that is the argument rendered as physics rather than decoration. Every other world here has exactly one light — a lamp, a screen, a fire, a moon, a headlight, the sun, or nothing. A covenstead is where a group meets, so everybody brought their own: one pool is candle-amber, one a cold bulb, one a rose shade, all at the same height because everybody is sitting down. That is also what keeps it off the warm interiors, the collapse this street has now refused six times — every one of those is one flame turning everything amber together. If the three lamps ever drift into the same hue this has become the burrow with more chairs in it.
- Indoors was the one axis that area had left. Turning 01 is a screen standing in water and turning 02 is a ring standing in a field, both outdoors and both at night. And it is not The Mopery, the other room full of furniture and argument: that is a cold building you stand up in, with an institution’s books in it.
- Terry Pratchett’s words are on that page, and they are the point of it. The first draft named First Sight and Second Thoughts and linked out for the words, on the reasoning that they are quoted properly elsewhere on our own sites. Ryan said that was too limiting, and he was right — these sentences are the tenets, the way the Rede’s couplet is, and a page describing them at second hand was sending a reader elsewhere for the thing it was about. They are quoted in full now, and every quotation names its author, its work and its year and links to the edition.
- The room sets its own quotation cap rather than borrowing the Zibaldone’s, and the difference is what the two rooms are for. That one is a quote bank, where the danger is drift — nobody decides to republish a book, they add one good line at a time until the page is the work — so thirty words is right there. This room quotes a handful of named passages the commentary is about, and the sentence defining First Sight runs to thirty-five words. Sixty fits a defining sentence and refuses a scene: the long Miss Level exchange the shorter lines come out of runs to several hundred words and stays a link, because our own philosophy page is the better thing to read and is there to be linked rather than raided. The tool refuses a quotation arriving without an author, a work and an edition to point at.
- The Rule of Three is argued about inside the tradition, and the room says so rather than settling it. It is not a universal article of faith: there are Wiccans who read it as an over-elaboration on the Rede, others who consider it a modern innovation built on Christian morality. A page stating it flat, as the witch law, would be deciding a live argument inside somebody else’s religion on their behalf, from the outside, for atmosphere — and the flattened version is always the one that travels. The tool refuses a tenet marked contested that does not say what is contested about it.
- Rede means counsel, not commandment, and that is the hinge. Middle English for advice; the best-known couplet was first publicly recorded in a 1964 speech by Doreen Valiente and has stayed counsel for sixty years rather than hardening into a code somebody can be expelled for breaking.
make-covenstead.pyrefuses a tenet written as an order — which is the exact opposite of the rule one turning up the road, wheremake-sithen.pyrefuses advice outright. Two rooms in one area holding opposite rules about the same vocabulary, for the same underlying reason. They must not be made to agree. - Nobody is initiated and nothing is counted. No degrees, no levels, no test at the door, no record of how often you came. The tool refuses gating vocabulary, and that guard was nearly published untested: the first attempt at breaking it used a sentence containing “you must”, which the order guard caught first, so the refusal that fired was not the one under test. Re-run with three sentences carrying no order vocabulary at all — it fires on each. A verification that shares an assumption with the thing it verifies is not a verification.
- Ten contrast pairs and no ornament entry, which is a first here. Every other room has at least one colour allowed to be faint because it only draws something. All three lamps carry text in this one, so all three are held to the body bar on both grounds.
- The unlit-board section no longer claims a board is standing there. With every turning open, that paragraph described a state the page no longer has. It now says the state is kept rather than retired — two of those boards stood lit and empty for a while, and an area has that state whether or not it is currently using it.
- A cross-room class leak was caught before the checker saw it: this page was drafted wearing Sithen’s
mound__art. Renamed to its own. Two new faces, both OFL, designers resolved — deliberately plain ones, because the witches this room is partly built on are practical and unglamorous and a page about that set in something carved would be arguing against itself in the typeface. - Changed:
data/covenstead.json,tools/make-covenstead.py(new),covenstead.html,the-outskirts.html,love.css§1 and §37 (Small screens and Print renumbered to §38 and §39),fonts/,data/foundry.json,data/foundry-faces.json,data/quests.json,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py,tools/check-contrast.py,tools/check-classes.py,liner-notes.html, and one new share card.
2026-09-22 — The Outskirts had a wrong side of town in it, and this street does not have one
- The Outskirts shipped carrying the ordinary real-world reading of an edge-of-town, and it was wrong here. Three lines: premises that were never going to get planning permission, a bullet saying out-of-town is where everything gets pushed that a town has decided is not respectable, and a fair amount of that is us, and a Covenstead described as a group the town would rather not think about. Ryan caught it. All three are gone.
- The objection is structural rather than a matter of taste. Our town is stimpunks.love and it accepts everybody, so it has no outside to push anybody to. A street named after a character who turns up wherever somebody needs shelter and rearranges himself for whoever has arrived cannot also have a wrong side of himself. The framing was imported from real towns, where it is perfectly true, into the one place on this site whose whole premise contradicts it.
- It got past everything because it arrived sounding sympathetic. This is where the disreputable ends up and we are the disreputable reads as solidarity, and on most pages it would be. Here it quietly builds a category of people this site would rather not look at, and then generously puts us in it — which is a thing to remember, because no checker on this street can see an argument that is wrong only in context.
- The road is a direction and not a verdict. What replaces the bullet says so outright: nothing out there was sent out there, a fort stands in a field and a screen stands in water because that is where they are, and out is not the same as out of favour. The words that area actually wants are about hours and room — things that keep their own time and want space around them — never about being unwelcome somewhere else.
- Written into CLAUDE.md rather than only fixed, because the next turning will invite exactly the same sentence: Covenstead is still to build, and a coven is a group the town would rather not think about is the first line anybody would reach for. The correction is recorded where the next person will meet it, which is what this repo does with a correction that came from Ryan rather than from a tool.
- The dated entry below is left as it was. It describes what was built that day, including the phrase now removed, and rewriting it to match today would be falsifying the log — the rule
check-counts.pyalready states about this page. - Changed:
the-outskirts.html(page description, card description, lede, one house rule and the Covenstead board),CLAUDE.md,llms.txt, and that area’s share card.
2026-09-22 — Sithen, and the room that does not open its own door
- Turning 02 off The Outskirts is open. Sithen is a fairy fort seen from the outside under a full moon: a ring of earth and whitethorn you can walk all the way round, a catalogue of rules nobody will say out loud, and a door this room does not go through.
- Staying outside is the design, and it solves three collapses at once. A faerie mound is structurally The Latibulum, thematically the Faery Yurt and narratively The Rabbit Hole — no room here has had to dodge three at once, and they are all the same move: warm interior, underground, lit by one small flame. A fairy fort is an outdoor object, and the inside is the part the tradition is careful never to show you. There is no interior here and no flame. If a door is ever opened it becomes a subroom with its own world, the way The Den hangs off the Jungle Room — not this page with rooms added to it.
- The room it could most easily have become is the campgrounds, the other cold night ground on this site. Two things hold it off, and both are structural: there is no green in it anywhere — that field is blue-green spruce, lichen and moss, and grass under a full moon has a brightness rather than a colour, so every value here sits on one grey-violet line — and the campgrounds is an open field with posts standing about in it while this is one object that you circle. Moonlight is also from directly overhead where the road outside is lit from one low angle, so nothing in here has the area's single bright edge.
- The name was checked rather than assumed, and that was the point of checking. Scottish Gaelic sìthean, a hillock inhabited by fairies, cited to Colin Mark’s Gaelic–English Dictionary (Routledge, 2003) by way of Wiktionary. One of the two novel series that pointed us here uses this exact spelling for the fae court, so a room taking the name while claiming to owe those books nothing would have been advertising a debt it does not otherwise have. The word is older than both, and the room says so rather than leaving anybody to assume either way.
- The two novel series are credited as the pointer and nothing is drawn from them — Ryan’s call. Laurell K. Hamilton’s Merry Gentry books and Seanan McGuire’s October Daye books are named and linked in the room as the reason it exists; not one court, character, politics or cosmology of either is used, because those are living authors’ invented worlds. The refusal is enforced rather than remembered:
make-sithen.pywill not build the page if a rule’s source names either series or either author. The friendly edit here is real and it will arrive — the folklore is thin in exactly the places a novel is rich, so the most useful material lying around is the one thing this room may not pick up. - “Knowe” is deliberately not in that guard. It is a genuine Scots word for a knoll, older than any novel that uses it, and refusing it would be the tool handing a living author a word that is not theirs — the mirror image of the mistake it exists to prevent. The guard names the series and the authors, which is what actually identifies a borrowing.
- The page is in two halves and says which is which. The documented half is earthworks and a motorway — ringforts, the thirty to forty thousand identifiable in 1991, the whitethorn taboo, and the 1999 campaign that saved a thorn bush from the M18 at Latoon in County Clare. The folklore half is traditional and every rule names its source. Everything under what it is like is ours, written for this room and not claimed to be in the tradition, because a reader cannot tell those apart by tone.
- That reading is why the room is on this site at all. The fae taboos are a catalogue of consequential rules nobody will state out loud, where breaking one is punished and no one explains — the ordinary weather of neurotypical convention for a great many autistic people. And the accommodation comparison writes itself: a whole country reroutes a motorway around a tree on the strength of this matters and I am not going to justify it, and the same country asks a Disabled person for a letter before it moves a desk.
- Nothing on that page tells anybody how to behave, and the tool refuses the vocabulary of advice in the second person. A page about unwritten rules that ended in tips for following them would be a social skills curriculum with thorns on it. It also refuses a rule with no plain reading, a rule with no source, a charm set as verse, and an HTML entity in any field. All nine refusals were broken on purpose and watched to fire.
- Two new faces, and the pairing is one this street has never had. Italiana is very thin and very high-contrast — the only thin thing here, which is most of why it arrived, since every other display face we hold is heavy. Literata carries the body deliberately without atmosphere: a fae room is under constant pressure to set its text in something uncial and unreadable, which is the Doomscroll’s blackletter problem arriving in a hill. Both OFL, both designers resolved rather than typed, and
check-faces.pyrefused the build until the Mopery and the Foundry held them. - The marker is drawn in the moon and not in the room’s own thorn colour, because that colour measures 3.69 on the field and a marker is held to the body threshold — the Jungle Room’s quills rule. A sprig nobody can pick out of the dark is a control nobody can use.
- Rank III already covered this. Yesterday’s renaming from “past the treeline” to “off the street” meant a second turning on the new road needed no further change to the guild — which is what that rewording was for.
- Changed:
data/sithen.json,tools/make-sithen.py(new),sithen.html,the-outskirts.html,love.css§1 and §36 (Small screens and Print renumbered to §37 and §38),fonts/,data/foundry.json,data/foundry-faces.json,data/quests.json,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py,tools/check-contrast.py,tools/check-classes.py,liner-notes.html, and one new share card.
2026-09-22 — The Outskirts, and a drive-in screen standing in black water
- The street has an edge at each end now. The Outskirts is the second area — past the last streetlight rather than past the treeline — and the road out is reached from a piece of street furniture at the far end of the front page, the way the campgrounds and the garden are. It is seedy edge-of-town: the mystical, the eldritch and whatever only opens after dark.
- It is lit by headlights, which is a light nothing else here uses. The campgrounds is the room this could have collapsed into and the separation is physical rather than tonal: that field is lit by nothing — open, evenly dim, the sky still on it, and you can see to the treeline. This is one low, level, close beam from off the page, so a sign has a bright face and no back and the road goes black an inch past it. A campground sign is routed into wood by a machine and maintained; a sign out here was painted once by whoever owned the premises. Alfa Slab One against Bowlby One SC, which is where that difference actually lives. And it is not Danny the Street, which is the other road on this site: that is a road seen from directly above under sodium, with no shadows because nothing stands up in it. This is a road seen from on it, at eye level. Same subject, opposite position.
- Two of its turnings are signs with no road behind them, named and not built — Sithen, a faerie mound, and Covenstead, a coven’s meeting place. The campgrounds already settled that an area has this state and a website usually pretends it does not. The post is dashed and the words are not dimmed, which is the whole care in the rule: a board you cannot read is not a subtler board, it is a broken one. They are not links, not disabled controls, and not hidden.
- Black Leather Lagoon is the first turning off it, and it is an appreciation of The Cramps: a drive-in screen standing in black water, our Halloween playlist on the screen, and a rack of their records on posts out in the shallows. Turning 01 in a new area, which is exactly where the Faery Yurt already proved an area does not get a house style — the road in is cold, dead, khaki and hand-painted, and this is wet, lit, acid green and printed.
- The room it must not collapse into is Club Chronic, and that is the hardest call since The Den. Both are music rooms, both dark, both an appreciation over a rack of records, and both hold the same pair of runtime rules. The club is a wall — flat, frontal, no light source anywhere in it, no depth, a hundred rectangles of paper pasted onto black. This has a horizon: one bright rectangle out in the water and everything else lit off it. There is no paper in here at all. Anton against Chivo, and the type is the front line: the obvious face for a monster bill is a condensed gothic, which is precisely the face the one room this must not resemble has owned since it opened.
- Nothing in it flickers, at any setting. A drive-in screen is a flickering object — nearly its definition — and building one without the flicker took more work than building one with it. That is Club Chronic’s rule about strobes arriving in the room most likely to talk itself out of it, and the room says so in its own door policy so nobody finishes it later.
- The year beside a record is the record’s year and not the upload’s, and that is the most useful thing this room turned up. Every one of these is an auto-generated upload from a licensor’s catalogue, and each carries a “Released on” line giving the date of the reissue that was licensed — 1984 for most of this rack, which is a compilation, and 2014 for three. Taking it at face value would have printed 1984 beside a 1978 single, in the one field a reader has no way of checking. The years were resolved separately against MusicBrainz, and
make-lagoon.pyrefuses a song that arrives without one. A tenth song was dropped rather than published with a year nobody had checked. - And a song was pulled by the check for a reason nothing here had met. Can Your Pussy Do the Dog? answers
LOGIN_REQUIREDrather thanOK: it is age-gated, so it plays perfectly for a signed-in adult and would have rendered a refusal inside our frame for everybody else. That is neither a dead video nor an embedding permission — it is a third thing. Playing is not the same permission as embedding, once more: playing is not the same permission as playing without an account, on a street whose whole promise is that nothing is asked of you before the press. - Not one line of any of those songs is on the page, and
make-lagoon.pyrefuses a note shaped like verse — several short hand-broken lines, which is what a lyric looks like in a JSON string and what a sentence never does. A room built out of one band, whose words are half of why anybody loves them, is exactly where this street’s rule would have been broken affectionately. It also refuses a ranked rack (no best, no greatest, no countdown), a half-credited cover, and an HTML entity in any field. All eight refusals were broken on purpose and watched to fire before the tool was believed. - The Napa show is on the page and is not told the usual way. In June 1978 the band played a free concert for patients at the state hospital in Napa. That tape is almost always written up as a joke at the patients’ expense — you cannot tell the lunatics from the band — which is psychiatric patients used as the punchline that certifies how wild somebody else is, and we are a Disabled people’s organisation. The room says what it will stand behind, and leaves the gap visible: whether anybody in that room had a good evening is not ours to narrate.
- This is the unusual case of a room built on something no page of ours has ever written about, so every word of the appreciation is the room’s own and the sources are named on it: the band’s history and the covers off Wikipedia, ids, runtimes and channels off YouTube, release years off MusicBrainz.
- Rank III stopped saying “past the treeline”, because a class defined by geography cannot name one edge and mean both. Not a fourth class: IV would encode a false ordering, since the field and the road are opposite directions rather than different distances. That sentence lived in the tool, in the data file, in the guild’s own house rules, on its card and in
llms.txt, and none of those is in the file that changed — the same shape as last night’s sentence about The Chappell living in the dancefloor’s copy. - Three new faces, and each cost two other rooms an edit. Bowlby One SC, Creepster and Chivo, all OFL, all with their designers resolved rather than typed.
check-faces.pyrefused the build until the Mopery’s picker and the Foundry’s shelves held them, which is exactly what that tool is for. Creepster sets the h1 and the bill line and nothing else, ever — the Doomscroll’s rule about blackletter, in the room whose subject matter asks for it on every line. - Two colours are ornament and say so with their numbers. The road’s dead khaki (4.04 and 3.51) and the lagoon’s poster red (3.35 and 3.05). The khaki shipped on the topline note and under every turning for as long as it took to measure it, and both were moved to the fine print’s own colour; the lagoon carries a lighter red beside the dark one precisely so the room is never tempted to let the dark one speak.
- Verified as rendered, not as markup. Zero iframes and zero requests to YouTube on load; one press produced one iframe at the right playlist at 549×306 with the correct referrer policy and the other nine buttons untouched. The pressed container is a bare
<div class="facade">, so the room’s styling is applied from the container rather than the button — the fault that shipped Swaying Sweetgrass’s players at 0×0. Both pages pass the live contrast sweep and all three dial settings with nothing moving. - Changed:
data/lagoon.json,tools/make-lagoon.py(new),the-outskirts.html,black-leather-lagoon.html,love.css§1, §5, §34 and §35 (Small screens and Print renumbered to §36 and §37),index.html,fonts/,data/foundry.json,data/foundry-faces.json,data/quests.json,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py,tools/check-contrast.py,tools/check-jukebox.py,tools/check-classes.py,adventurers-guild.html,liner-notes.html, and two new share cards.
2026-09-22 — The decks on the dancefloor, and a playlist that turned out to be broken at the top
- Pink Pony Club has decks now — whole playlists off our own channel, as against the jukebox’s ten single tracks. Neuroqueer Is a Noun and a Verb and Queercore are both on them, and the second one took a detour worth writing down.
- Queercore’s embed rendered YouTube’s “Video unavailable” plate instead of a player — a button somebody presses and presses, which is the one thing this street refuses outright. Diagnosed with a control rather than guessed. The plain embed failed twice; the same playlist started at its first visible video played; and the Neuroqueer playlist, framed identically, played. Its page said thirteen unavailable videos were hidden — the page hides them and the embed does not, and one was sitting at position 1. The first five visible videos all answered status OK and
playableInEmbedtrue, so the order was the fault and not the videos. - It was not worked around, and that is why it got fixed. Storing a known-good starting id would have worked that afternoon, and it would have been an id that drifts plus a playlist still opening on a dead video for anybody reaching it on YouTube. It was held instead — nothing rendered — and reported with the diagnosis. Ryan removed the dead entry from the playlist the same day, and it was re-checked exactly the way it was diagnosed: header 83 → 82, hidden 13 → 12, plain embed plays, control still plays. Both decks are live.
- The episode stays in the data file rather than being quietly dropped, because the lesson has no other home: a playlist can be perfectly healthy and still fail to embed because of what sits at the top of it, and nothing in this repo can see that.
love-embed.jsonly asks whether a URL is on an allowed origin, andcheck-jukebox.pyasks watch pages about single videos — it says in its own source that a playlist is not one video. heldsurvives as a state, and it earned its keep on its first day. It is the Jungle Room’s dark cam arriving on a dancefloor: the entry keeps its place in the data with the date and the diagnosis on it, and nothing renders, because the room does not carry a control that cannot work.make-jukebox.pyrefuses a hold with no reason written down — a hold nobody can explain is deleted by the next person to read the file — and refuses a tray with everything held, which would be a heading over an empty box.- That tool had no refusals at all before today. It now also refuses a runtime on a playlist — the pair of rules
make-club.pyandmake-chappell.pyalready hold — a frame this site will not build, and a frame with nolist=in it, which is not a playlist at all. The origins are read out oflove-embed.jsrather than restated. - And this room was carrying a sentence about the room next door that yesterday’s work made false. It said every button in there says how long the thing runs before you press it — true until The Chappell got a chancel, whose whole point is that it cannot say. Nothing caught it, because it is a claim about one room living in another room’s copy, and no generator owns that. Corrected here, and worth remembering: when a room’s promise changes, the rooms that describe it are not in its tool.
- The decks are not a second jukebox. Same cream tray, same white card, same dark red rule, same small plum credit line — every colour already a pair
check-contrast.pyholds, so they introduced nothing to measure. What separates them is proportion: the jukebox packs narrow cards into columns and the decks never have more than one across, because a record you put on is not a thing you scan. If they ever grow a second column they have become the jukebox with longer titles in it. - No new origin and no CSP change, and no random start: these have an order we chose, where Club Chronic’s stage opens a five-hundred-track list somewhere random because nobody reaches the end of it. Verified as rendered: zero iframes on load, and one press produced one iframe at the right playlist at 516×288 with the other deck still a button and the ten jukebox buttons untouched.
- Changed:
data/jukebox.json,pink-pony-club.html,love.css§6,tools/make-jukebox.py.
2026-09-22 — The Chappell gets a chancel, and the one button in it that cannot say how long
- The Chappell now plays its whole playlist — our own, from our own channel, the one the arcade was lifted from — at the east end of the nave, after the thirteen niches you visit one at a time. No random start, and that is a decision rather than an omission: Club Chronic opens a five-hundred-track list somewhere random because nobody is going to reach the end of it, and these thirteen were put in an order, so starting in the middle would be this site overruling the person who chose it.
- It is a chancel and not a fourteenth niche. Same ground, same gold, same cream serif, same glass — every colour already a pair
check-contrast.pyholds — so the east end introduced nothing to measure. What makes it the chancel is size and solitude: a deeper arch and no siblings beside it. If it ever grows a colour of its own, this room has started having two of everything. - Adding it would have made two published sentences false, which is the whole reason this took more than an embed. The room’s consent banner said every button says how long the thing is before you press it, and a playlist cannot — a list we keep adding to has no length, and a number there is wrong the next time it changes and authoritative meanwhile. The banner now says every button that plays one thing says how long, and that the one playing the whole playlist says instead that it runs until you stop it.
- And
make-chappell.pyholds both halves of that rule now, which is the pair of rulesmake-club.pyalready holds, arriving where a room’s whole organising promise is the half it has to break: it requires a runtime on every track and refuses one on the playlist.make-jungle.pyrefuses a runtime on a live camera andmake-den.pyrequires one on a song; they are the same promise and must not be made to agree. It also reads the framed origins out oflove-embed.jsrather than keeping a copy, and refuses a frame with no list id — a “playlist” that is not one is a lie about what the button plays. - The share card told the same lie and was chased down twice. The card’s serif line and its alt text both claimed every label says how long. Updating the page’s
descriptiondid nothing, becausemake-og.pybuilds the card fromog:description— two meta tags one line apart, and the first edit landed on the wrong one and looked like it had worked. Both are corrected and the card and its alt are regenerated from the fixed one. - No new origin and no CSP change.
youtube-nocookiehas been on this street since it opened, so this one is genuinely just a frame. - Verified as rendered. Zero iframes on load; one press produced one iframe at exactly the playlist URL, unmodified, at 543×304, with the thirteen niche buttons untouched.
club.jsis not loaded on that page at all, so nothing can quietly move its starting point. - Changed:
data/chappell.json,the-chappell.html,love.css§12,tools/make-chappell.py, and that room’s share card.foundry.htmland one other card carrymake-og.py’s own reordering and a re-encode, which is tool churn rather than a change.
2026-09-22 — Apple Music on the stage, and a service that states both permissions itself
- The playlist is on Club Chronic’s stage a fourth time, on Apple Music, and this one is a real screen. Unlike Qobuz the day before, Apple publishes an embed, so it gets a facade like the other players rather than a door.
- Apple says both halves of this street’s oldest rule out loud, on two hosts.
music.apple.com— the address the playlist actually lives at, and the one Ryan sent — refuses every frame twice over, withX-Frame-Options: DENYandframe-ancestors 'none'; the console refuses it in as many words.embed.music.apple.comsends noX-Frame-Optionsand its policy has noframe-ancestorsdirective at all. Same company, two hosts, opposite permissions — playing is not the same permission as embedding, stated by the vendor rather than discovered by us. Both were framed side by side to see it. - Ninety-second previews, measured rather than assumed. Signed out, three different songs by three different artists each reported a 1:30 total, and real songs do not all happen to be exactly ninety seconds. The deck says so in its own copy, the way the Spotify deck says what signing in changes.
- A fourth framed origin, which is one edit and one re-run.
embed.music.apple.comwent intolove-embed.js’sORIGINSandmake-csp.pyrebuiltframe-srcfrom it. The header was not touched by hand, because that line is generated and a hand edit to it is put back silently on the next run — which is exactly how videopress once shipped working locally and refused live. - And
make-club.pystopped keeping its own copy of that list. It held a two-item tuple with a comment saying three places were deliberate; it was a hand-kept copy of something with a single source of truth, and it would have refused a deck the browser was perfectly willing to frame. It readslove-embed.jsnow, which is whatmake-csp.pyandmake-sweetgrass.pyalready did. A copy was removed rather than added to. - The player is sized from the container, never from the button. Apple’s playlist embed is 450px and wants a 16:9 box even less than Spotify’s does — artwork, a transport and a scrolling track list stacked together, so 16:9 crops the list off the bottom.
love-embed.jsreplaces a pressed facade with a bare<div class="facade">and anything the button wore evaporates, which is how Swaying Sweetgrass once shipped its players at 0×0. - Verified as rendered. Zero iframes on load; one press produced one iframe at the embed host at 561×450,
referrerpolicyintact, and the other thirty-eight facades untouched. Apple’s player shows a grey placeholder for about ten seconds before it initialises — that is its loading state and not a fault, which is worth knowing before somebody “fixes” it. A console error namingmusic.apple.comturned out to be left over from the probe page and was chased down rather than reported: a clean load of the room has no iframe on it at all. - Changed:
love-embed.js,_headers(generated),data/club.json,club-chronic.html,love.css§20,tools/make-club.py.
2026-09-22 — A door on the stage, because Qobuz publishes no embed
- The playlist is on Club Chronic’s stage a third time, on Qobuz — and it is a door rather than a screen. Ryan asked for an embed. Qobuz does not publish one, so what the stage carries is a way out, shaped like one and labelled as one.
- It frames perfectly, and that is the trap. No
X-Frame-Options, noframe-ancestors, nothing anywhere for a checker to catch — and what renders inside the frame is a catalogue teaser: the Qobuz logo, a TRY FOR FREE button, the cover mosaic, one Listen on Qobuz button, and a track list whose rows are plain text with no play control on any of them. Qobuz’s own share dialog offers a URL, copy, Facebook, Twitter and email, and no embed code, which is as close to an authoritative answer as that question has. A link dressed as a window promises the one action it cannot do — the rule The Jungle Room and Swaying Sweetgrass already hold, arriving where nothing in the machinery would have stopped it. - The door is deliberately not given the facade’s box. The Jungle Room’s link-outs take 16/9 because they stand in a grid of screens and have to line up with them. On a stage a 16:9 plate IS the shape of a player, so this one is not given an aspect ratio at all, and its border is dashed where every facade in that room is a solid bootblack plate inside a solid marker ring.
- No new framed origin, and the Content-Security-Policy did not move. This street frames three services; a door is not one of them, so
love-embed.js’sORIGINSandframe-srcare untouched. Nothing reaches Qobuz until somebody follows the link, which is a stronger promise than the facade makes, not a weaker one. - The page says 500 tracks and 25h 52m and neither is stored here.
make-club.pyrefuses a runtime on a playlist, for the reason it has always refused one: a list somebody keeps adding to has no length, and today’s total is wrong next week and authoritative meanwhile. - Three new refusals, all of them shapes somebody halfway through a change would leave behind. A deck that is both a door and a screen; a door carrying start points nothing will ever read; and a deck with no note at all, which is a bare link with a heading over it.
- The door introduces no colour the room had not already measured —
--pasteon--bootblackis a facade’s own label pair, and the sub-line is in that same ink on purpose rather than in a quieter grey nobody had checked. Anton shouts and Barlow does not, which is how this room makes that distinction anyway. Verified as rendered rather than as written: zero iframes on the page, a real focusable<a>at 567×88 withaspect-ratio: auto, and the sub-line measured standing on bootblack rather than assumed to inherit. - Changed:
data/club.json,club-chronic.html,love.css§20,tools/make-club.py.
2026-09-22 — Club Chronic drops the needle, and the word it will not use
- The stage’s YouTube deck now starts somewhere random in the playlist and plays on in order from there. Ryan asked whether the embed could be set to shuffle. It cannot, and the room says so in its own copy rather than borrowing the word: that is not shuffle: the player has no such button.
- Three levers were measured before anything was built, because two of them look like they work. Framed from a served page so the referrer was real:
shuffle=1is inert;index=is inert on both thevideoseriesand thelistType=playlistform; only/embed/<id>?list=moves the starting point. The first pass of that measurement read the posters and would have reportedindex=as working — the poster is the playlist’s first entry whatever the player then does, so all four were re-checked with muted autoplay. The Playhouse’s lesson in a different room: the DOM was right and the screen was wrong. - The only lever that exists takes an id, so the file holds ids rather than a count — and that cost was stated before it was paid. A random start therefore needs the playlist mirrored here, and the mirror drifts by design: a song added to the playlist cannot be picked until somebody pulls again, and a song removed becomes a start point the list no longer has. Neither is visible on the page.
pull-club.py --checkis the only thing that sees either. - The obvious continuation token is the wrong one, and taking it mirrors a hundred rows of nearly four hundred while reporting success. A playlist page carries two: the section list’s sits at the tidy
continuationEndpoint.continuationCommand.token, and the video list’s — the only one that pages the songs — is buried inside acommandExecutorCommand. The tool now takes any token it finds anywhere inside the node. A short list is not an error anywhere, which is why it also refuses rather than carrying on when it cannot read the page at all. - The playlist’s own header claims a number YouTube will not serve — The Chappell’s discrepancy, met again and written down rather than rounded off. The hidden rows are not marked unplayable, they are simply absent, so the guard against private entries dropped none of them.
- Nine songs are in that playlist more than once and each is one start point. Checked rather than assumed: every repeat has its own
setVideoId, so the list genuinely holds those songs twice and one of them three times. A start point is a video rather than a position —/embed/<id>?list=opens at the first occurrence whichever one you meant — so a second copy cannot be reached and would only double that song’s odds.make-club.pyrefuses a repeat, and the refusal says which of those two things it means. love-embed.jsis still the only thing on this site that builds a frame.club.jsbuilds nothing: it rewrites the button’sdata-embed-srcbefore the press reaches the document, and the shared builder then does exactly what it always did with exactly the attributes it always read. The ordering is the whole trick — this listener is on the button and that one is on the document, so this runs at the target and that runs on the way up. It fails back to the top of the list, never to nothing.- “Nothing plays until you press play” was re-verified rather than reasoned about. Zero requests to youtube on load, with a control to prove the recorder was awake; one press produced one iframe at
/embed/<id>?list=, rendered 561×313 rather than 0×0, with itsreferrerpolicyintact; three presses gave three different tracks; and the Spotify deck was untouched, still a button, still carrying no start points it could not use. - New:
club.js,tools/pull-club.pyand its--check. Changed:data/club.json,club-chronic.html,tools/make-club.pyand this README. Not changed: the Content-Security-Policy, which already covers a script of our own, andlove-embed.js.
2026-09-22 — Danny the Street, and the credit that was only in a marquee
- The street’s own name has a page: Danny the Street. Ryan’s brief — an about page for the character this site is built out of, its origin and its history in comics and on television, with our Danny taking they/them. Where the name came from, what Danny has been since, the television version, the pronoun question, and which parts of Danny are ours to take.
- The credit already existed and only sighted readers could get it. The front page has said DANNY IS THE STREET since it opened, in a marquee that is
aria-hiddenbecause it scrolls and is decoration — so the one place the architecture is credited was unreachable by a screen reader, on a site whose two surviving careful habits are contrast and attribution. There is now a paragraph under the loudness dial, in text, above the shopfronts it explains, and it declares its own link colour: the street has no base link rule at all, which is the hole The Doomscroll and the Playhouse both fell down. - It is the road surface seen from directly above, under one sodium lamp, and the collapse to watch is the front page itself. A first: every earlier separation on this street was between two rooms, and this one is between a room and the page it hangs off. Both are a street at night. §5 is seen from the pavement, at eye level, looking into lit windows, with everything in it standing up and a typeface per shopfront. This is a plan — kerbs down both sides of the page, a broken centre line through the middle of it, nothing standing up anywhere, one typeface and one hue.
- One hue, because a sodium lamp has one wavelength in it. Low-pressure sodium is effectively monochromatic, so under it nothing has a colour of its own — only a brightness. That is what keeps this off the warm rooms, and by now the warm family has arrived seven times: the Faery Yurt, The Latibulum, The Den, the Hermitage’s cave, The Mopery and Swaying Sweetgrass are all lit by a flame or by the sun, and in every one of them things keep their own colours. Sodium takes colour away, and there is nothing in here to sit on. If a second hue ever appears in §33 the lamp has been changed for a different kind of lamp.
- The campgrounds is the other outdoor night, and the separation is the sky. The field is cold blue with the sky still on it. Under a lamp you cannot see up at all: the light is a lid and the dark past the kerb is absolute. The Rabbit Hole is the other hard grey and is cold, wet and vertical; this is warm, dry and flat.
- One new face, and it is the road’s own. Overpass, by Delve Withrington, Dave Bailey and Thomas Jockin for Red Hat, is drawn from the lettering on American highway signs — the only family on this street whose whole reason for existing is being painted onto or bolted above a road, read at speed, from a long way off, by somebody who is doing something else at the time. It sets the nameplate, the road legends and the dates. The prose is the base’s Space Grotesk, which makes this the only room here with a display face and no text face of its own — the exact inverse of the Garden, which has two text faces and no display face, because a garden has labels and no signage. Under the SIL Open Font License.
- Nothing on that page was written from memory, because half of what everybody remembers about Danny is somebody’s retelling. The debut issue and date, the creators, the pun on Danny La Rue, the Polari, the Men from N.O.W.H.E.R.E. and every later form were read rather than recalled; so were the air date, writer and director of “Danny Patrol”. The spelling of Dannyzens came off DC’s own page, because it varies everywhere else. And an unsourced origin story for the character that is still circulating was left off deliberately — the herbarium’s refusal to guess at a binomial, arriving in a fandom.
- The one quotation was chased to the original and the chase is published. Morrison’s line about genderqueer and non-binary not existing as words in the late 1980s is quoted from the Uproxx interview it was given to — but uproxx.com renders its article text through JavaScript and hands a fetch nothing but navigation, so it was read against the Internet Archive’s capture of 23 July 2025 and the page says so. Swaying Sweetgrass’s rule: do not let an unchecked quotation sit among checked ones looking identical.
- The pronouns are three different answers and the page keeps them apart. The comics write Danny as he, in 1990’s vocabulary; the television version is genderqueer and uses they/them; the Danny in our marquee uses they/them, which is a decision about this site rather than a correction of anybody’s canon. On a site run by and for neurodivergent and Disabled people, they is what we would default to for a person whose pronouns we had not been told.
- Nothing of DC’s is reproduced and the page says so where somebody will read it. No panels, no artwork, no dialogue: every drawing on that page and on its share card is of a road, which is a thing nobody owns. What the page is, is a namesake credit — the habit the liner notes keep for every song, typeface and borrowed phrase, applied to the borrowed thing holding the whole building up.
- No ambient layer at any setting, which is Club Chronic’s rule in the quietest room that has ever held it: the lamp is on at Gentle because it is the light in here rather than an effect, and nothing else moves, because nothing on a street at four in the morning does. There is no transform in §33 either — a painted road legend is stretched along the road, and a scale is exactly what
check-gentle.pyreads out of the computed matrix and cannot tell from a page tilting itself. The legends are letter-spaced and left alone, which is the call The Foundry made in the room where a slant is a control. - New:
danny-the-street.html, §33 of love.css, Overpass self-hosted at two weights, a share card drawn as tarmac with a street nameplate bolted to it, and a drain in the gutter with a job in it. Changed:index.html, the liner notes,data/quests.json,data/foundry.json,fonts/_sources.json,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py,tools/check-contrast.pyandtools/check-classes.py’s own cross-reference. Small screens and Print renumbered to §34 and §35.
2026-09-22 — One Space Grotesk, and a bold the bench had been hiding
- Space Grotesk was stored three times over, byte for byte. Same sha256, same 22320 bytes, and
fonts/_sources.jsonrecorded the same gstatic URL for all three, because the family ships as a variable font and Google serves one file for every weight. On the shared base that every page on the street loads, that cost about 45KB. It is one file now, declared three times against the weight axis, the way §1 already handles Cabin, Karla and the rest. The Feed was preloading the copy that got deleted, which would have 404’d on a published page; it preloads the one that survives. - And then the interesting half: identical bytes are not an absent bold. The obvious reading of three identical files is that a weight-700 declaration renders the same drawings as the 400 — and The Foundry had been built on exactly that reading since it opened, grouping each family’s variants by the sha of the file they point at and keeping one. It is the wrong question. A variable font carries a weight axis inside the file, and the browser instances it at every
@font-facedeclaration: same bytes, genuinely different outlines. The rule was throwing away bolds that work. - Measured rather than argued about, because the premise sounded right. Rendered out of one file at 64px: Cinzel’s 700 lays down 68% more ink than its 400, Work Sans’ 600 45%, Space Grotesk’s 700 41%, Nunito’s 39%. Not one pair on the shelves came out the same. Twelve families had a weight the street holds and the bench was keeping in a drawer — Cabin, Cinzel, EB Garamond, Faustina, Jost, Karla, Mulish, Nunito, Quicksand, Rubik, Space Grotesk and Vollkorn — and every one of them is offered now.
tools/check-weights.pyis the check the sha was standing in for. It renders the published picker — never the generator, which ischeck-quests.py’s rule — and refuses two offerings of one family that come out the same drawings, a weight love.css does not declare, and a declared weight the room does not offer. Advance width alone cannot decide it: Courier Prime and Space Mono are monospaced, so their 400 and 700 share an advance to the hundredth of a pixel while the bold lays down about 40% more ink. It measures ink and advance and calls two the same only when both match.- It found a bug in itself on the first run, which is why it was broken on purpose first.
@font-faceis lazy, so nothing is downloaded until a page sets it — and a canvas asked to draw a font it has not got silently draws the fallback instead. The first draft measured before loading anything, so every face on the street would have measured identically and been reported as the same drawings. It loads, waits, then measures, and still asks whether each face actually arrived. Fed a static face declared at two weights, it correctly calls the second one a control that does nothing; that is the protection the sha was giving, and it is still there. - Nunito’s bold was not in the record at all. love.css declares that one file at 400 and 700;
fonts/_sources.jsonlisted only the 400, and nothing compared the two. The new checker reads the stylesheet the browser actually obeys, so that class of drift now refuses rather than sitting there. - Two things found and deliberately not changed. Jost is still stored twice —
jost-400.woff2andjost-500.woff2are byte-identical, the same duplication Space Grotesk had — and it is logged here rather than swept into a commit about something else. And the campground sets its emphasis in Alfa Slab One because Bitter’s bold “was byte-identical to its regular”: that reasoning is the one corrected above, so the decision rests on a premise that turns out to be false. It is a room’s own design decision and not a bug, so it stays until somebody who owns that room says otherwise.
2026-09-22 — The Foundry, and the first room whose content is the typefaces
- A type foundry on the street: The Foundry. Ryan’s brief — a font play storefront, your own text or text out of The Playhouse, The Mopery and The Zibaldone, every setting the type has, and a way to print it. A grey iron workshop under a dirty roof with a bench in it. Every other room on this street uses a typeface; this is the one where they are the thing in the window.
- It is the first mid-grey ground here, and that is the whole separation. Every other world on the street is either a night ground with light applied to it or a sheet of paper with the room cropped away. This is the middle — the colour of the metal — and the only pale object in it is one proof lying on a bench. The four paper rooms are the obvious collapse and each one is held off by something structural: The Mopery is a cold building you stand up in whose type is impressed into the page, the guild is manila lit like a photocopy from nowhere, The Doomscroll is one unbroken roll of warm foxed newsprint, and The Zibaldone is bound leaves with a gutter and a fold. There is no fold in here and nothing is bound.
- It is the third daylit room, and north light is what a workshop was built for — the glazing faces away from the sun so the work has no glare on it, which means flat, cool, directionless daylight and no lit face on anything. The Hermitage has a low morning sun with long sideways shadows; the Garden’s light has come through leaves and tints every pale surface green. A furnace would have been the obvious build and would have made this the seventh warm room on a street that already has six. The only warm value in here is brass, and brass is a metal rather than a light.
- Nothing about any typeface was typed.
tools/pull-foundry.pyreads every family’s own record out of github.com/google/fonts — family name, designer, licence, copyright, repository, classification — and cross-checks the licence against which directory of that repository the family lives in. It refuses a family it cannot resolve rather than publishing a face with nobody’s name under it. It is kept out of the pre-deploy sequence withcheck-jukebox.pybecause it needs the network, andmake-foundry.pyneeds nothing but the file it writes. Do not merge them. - The first thing it found was that four of these families are not OFL, and three published pages said they were. Permanent Marker, Rock Salt, Special Elite and Ultra are under the Apache License 2.0. love.css’s §1 comment said “every family here is OFL-licensed”, the liner notes said “all are licensed under the SIL Open Font License” and again “the typefaces keep their own OFL licence”, and the Mopery’s generated credit line said it a fourth time. All four are corrected and every face now carries its own licence on the shelves. A licence nobody has checked since the file was added is a claim rather than a fact, which is the whole argument for a tool that goes and reads.
- The Mopery’s picker had quietly lost eighteen families, and
tools/check-faces.pyis why it cannot again. That room says in its own copy that the picker holds every typeface on this street andllms.txtsays the poem can be set in any face on it; both had been false for a long time, because adding a file tofonts/and adding an<option>in a room two doors away are two edits in two places and only one of them is obviously required. The picker is generated now, from the same record The Foundry’s shelves are built from — when something has to agree in several places, make the others read it rather than write it out again, which islove-embed.js’sORIGINSlesson. The new checker reads both rooms’ published markup and never the generators, in both directions, and it was broken on purpose before being believed. - An italic is not a slant, and the bench is built to show you rather than tell you. A real italic is a second alphabet, cut separately, with different letters in it. A machine slant is the upright pushed over by something that has no idea what it is looking at. Both are offered and both are labelled, and the italic is disabled where this site holds no italic file — because the browser answers a request for one it has not got by inventing it, nothing looks broken, and the room has told you a lie about somebody’s typeface. Measured rather than assumed: on Rye, a requested italic renders at the roman’s own advance widths; on Cardo, which has a real italic,
oblique 12degcomes out at 399.65px against the italic’s 377.42px, so the slant really is the roman pushed over. - The slant is a font setting and never a transform, deliberately.
check-gentle.pyreads rotation and skew out of the computed matrix and cannot tell a leaning page from a leaning letter, so askewX()here would be reported — correctly — as this room’s decoration outranking somebody’s Gentle setting. There is no transform anywhere in §32, which is the callarcade.jsmade withleft/topand the Oracle Deck made with its lozenge. - A weight is offered only where the bytes differ. Seven of these families ship as variable fonts, so love.css declares one file against two or three weights — and a bold that renders the same drawings as the regular is a control that does nothing, which is
make-chappell.py’s typo that never becomes a video arriving as a dropdown. The puller records a sha for every variant and the bench groups by it. Hashing the whole shelf also turned up Space Grotesk stored three times over, byte for byte, on the shared base that every page loads; that is logged separately rather than fixed in this commit. - Four ink and paper pairs, each printing its own measured ratio on its own control, and the tool refuses one under 4.5:1. This is the one room on the street where somebody other than us picks the colour of the text, which makes it either the place contrast quietly stops being ours to keep or the place it becomes a thing you can watch being kept. There is no colour picker and there is not going to be one.
- The light moved rather than the palette. The north light was a fixed full-height wash to begin with, which composites the floor to
#596267— and against that the room’s link brass measures 3.14 and its fine print 3.34, both under the bar. Worse, fixed, that composite could arrive under any paragraph on the page depending on how far somebody had scrolled, which is the shape The Rabbit Hole’s scrolling ground already taught this stylesheet. It is 340px tall and absolute now: the light comes in at the top of the room and the page scrolls out from under it, which is also what happens in a building. A light that follows the viewport is not a light, it is a veil in front of the reader. The only words standing in it are the topline’s, and they are bone at 5.19 for that reason. - The proof prints and the room does not, and what prints carries a colophon naming the family, the person who drew it, the licence and every setting it was pulled at — because printing somebody’s typeface is exactly where the credit should travel with it. It comes out black on white whatever pair is on the screen: paper colour is a screen decision and a printer would spend your toner on it. Measured rather than asserted: the rendered PDF is one page with two fonts embedded in it, the proof’s face and the colophon’s, which is how you can tell the shelves did not print.
- Nothing here describes a typeface, and that is a refusal rather than an omission. A line of appreciation beside every family on this street would mean inventing type history at scale in the format most likely to be believed — the herbarium’s refusal to name a pressed plant to species, arriving where there is one to write for every face. What the room says truthfully is who drew it, what licence it travels under and which room here sets it, and that last claim is checked against love.css:
make-foundry.pyrefuses a line the stylesheet does not support. A derived version got it wrong on its first run, because the street letters each door in that room’s own face. - Nothing is counted. Not the faces, not the proofs pulled, not the sizes tried, and there is no favourite and no ranking of one designer’s work against another’s. This is the room most likely to want to boast about how much type it holds, and the generator refuses the sentence as well as the habit.
- Two new faces. Stardos Stencil sets the nameplate and the headings and nothing else — a stencil letter is a hole rather than a mark, a shape cut out of metal so it can be used again, which is the idea of type arriving four centuries early and in the wrong material, and it is what gets painted on a workshop’s crates. Anton is the street’s other condensed display face and is Club Chronic’s: solid, on a black wall, under a marker. Work Sans is the prose and is a workhorse on purpose, because a room whose content is other people’s typefaces cannot have a voice that argues with the window. Both under the SIL Open Font License.
- New:
foundry.html,foundry.js,data/foundry.json,data/foundry-faces.json,tools/pull-foundry.py,tools/make-foundry.py,tools/check-faces.py, §32 of love.css, Stardos Stencil and Work Sans self-hosted, a share card drawn as a galley with its letters mirrored the way cast type is, and a single sort lying on the workshop floor with a job on it. Changed:index.html,the-mopery.htmlandtools/make-mopery.pyso the nook’s picker is generated, the liner notes,data/quests.json,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py,tools/check-contrast.pyandtools/check-classes.py’s own cross-reference. Small screens and Print renumbered to §33 and §34.
2026-09-22 — The Healing Checkpoint, room 429, and the first room lit from the floor
- The guild’s bed exists: The Healing Checkpoint, room 429. Ryan’s brief — a guest room for the Adventurer’s Guild, patterned after the Healing Checkpoint, leading with an appreciation of rest built out of our own Rest entry. A save room: an arched alcove with a spring in the floor, a bed in it, and nobody at the desk.
- It is a shopfront on the street AND a back stair out of the guild, and the two doors are the argument. A room saying rest is owed rather than earned cannot be reachable only by walking through the place that hands out the work — that would make it structurally something you get to after the jobs. So the front door is on the street, where anybody arrives at it having done nothing, and the guild’s unattended counter is the back way up. It is the first room here with two entrances. No job sends you to it; the one job that lives in it is a question about a status code.
- The light comes UP, and that one physical fact is the whole separation. Every other world on this street is lit from somewhere else and no two from the same place — the Jungle Room from above through leaves, the Zibaldone from one side at desk height, Swaying Sweetgrass from behind and a hundred feet off, The Feed through a mask in front of a lamp, The Garden from directly overhead, the guild from nowhere at all. Here it comes out of the floor: every top surface is dark, every underside carries a rim, the shadows run up the walls, and the room gets lighter towards your feet.
- The warm enclosed family is the collapse to watch and by now it has arrived six times. The Faery Yurt, The Latibulum, The Den, the Hermitage’s cave and The Mopery are every one of them lit by a flame you could put your hand over. There is no flame in here; the light is under water and you could put your hand in it. All five are brown, amber or candle-gold, and there is no warm ground anywhere in room 429 at all — only one warm ink, which is what pale stone looks like with a cold light on it. The guild is its other door and its exact opposite: manila, square, ruled, hairlined, lit like a photocopy from nowhere. There is not a straight edge in the checkpoint anywhere. A board and an inn share a building and nothing else.
- The generator refuses instrumental rest, which is a refusal nothing else here makes.
tools/make-checkpoint.pysweeps its own data and the published page for the vocabulary of rent — earn, deserve, recharge, productive, bounce back, so you can — with a negation window so the room can still say out loud that it will not. Star Stuff’s zine No. 58 refuses rest so you can produce in as many words andotterly.jsalready holds that line for one cabinet; this is where the whole street says it. The friendly edit here arrives from somebody being kind, because every wellness page on the internet is written the other way round, and one encouraging sentence would turn rest from a thing owed into an investment. - Nothing in it is counted and nothing is stored. No total, no streak, no visits, no local storage, no server — the pebbling cabinet’s refusal of a tally arriving where a counter is the most obvious improvement anybody could propose, and one link above a job board that does keep a list in your own browser. A checkpoint that remembered you would be keeping a record of how often you needed one. The trope’s other two promises are refused in the room’s own copy: it restores nothing, because you are not a health bar, and there is no hard part waiting on the other side.
- The tally check was copied wrong and its first run caught it.
make-guild.pynarrowedpointsyears’ worth of care ago — “a book it points at” is the verb — and this file reproduced the flat version from the identical shortcut. What refused it was save point, which is what a healing checkpoint is. The narrowed pattern was taken over rather than the phrase excepted, which ischeck-counts.py’s first-run lesson arriving a fourth time. Every refusal was then broken on purpose before being believed — a long quotation, an off-site trail entry, an entity in a field, a missing checked date, and an instrumental sentence planted in the page itself. - Five Retry-After slips, and they send nothing anywhere. 429 Too Many Requests is Nottingham and Fielding’s, RFC 6585, April 2012, and it says the rate is wrong rather than that the sender is, which is a thing a great many Disabled people have spent a great deal of energy trying to explain to somebody holding a deadline. Each slip is a
<details>that works with scripts off;checkpoint.jsonly adds a copy button, which ships hidden so a page without JavaScript shows no dead control. It is the spoon drawer’s shape — it hands out the sentences and not the thing itself — and the Zibaldone’s clipboard, for the Zibaldone’s reason. The answer lands on the slip you pressed, not at the top of the page, which is the Playhouse’s lesson, and it was measured rendered at 653×28 rather than asserted from the DOM. - Two new faces, and the crowding is written down rather than hoped about. Quicksand is display only — the third geometric sans here, kept apart from Jost and Josefin Sans by job and by its semicircular terminals, which is what lets it carry a room whose every corner is a long radius. Rubik is the text face, and The Latibulum is the collision: that room’s Nunito is a humanist rounded face paired with a slab, and this is a grotesque with eased corners and flat-cut terminals. Two warm-shaped text faces kept apart at the stroke, which is the only place they could be. Both under the SIL Open Font License.
- Nothing flashes at any setting, which is Club Chronic’s rule holding in the room whose entire subject is not being jolted. The steam over the water drifts at MAX with a translate and a scale — rotation and skew are all
check-gentle.pycan read — and is gone at Gentle. The light in the floor is not the dial’s and is on at every setting: it is not an effect, it is where the light in the room comes from, and a Gentle that unlit the room rather than quieting it would be the lite-version mistake with a torch. - Two things on the Rest entry are named here and deliberately not copied onto this street: Kristina Daniele’s poem, and three illustrations of Disabled people resting by Jonathan Soren Davidson and Campbell Royales for Disabled And Here. A page built out of somebody else’s page should say what it did not take. The three lines it does quote are Fergus Murray’s and Tricia Hersey’s, each under the thirty-word limit the tool enforces and the room prints, each naming the page and the day it was read off the mirror. Tricia Hersey and The Nap Ministry are credited in the room’s own copy rather than in a footnote, which is what the guild promised when it said the bed was not built yet.
- Added:
healing-checkpoint.html,checkpoint.js,data/checkpoint.json,tools/make-checkpoint.py, §31 oflove.cssand a share card of its own. Changed:index.html,adventurers-guild.html, the liner notes,data/quests.json,tools/make-guild.py,tools/make-og.py,tools/make-sitemap.py,tools/check-contrast.py, andtools/check-classes.py’s own stale cross-reference. Small screens and Print renumbered to §32 and §33.
2026-09-22 — Ivy and stars instead of a fence, because Helen asked
- The boundary in The Garden’s two plots was a woven fence this morning and is winding ivy with stars caught in it now. Helen Edgar’s call, on a drawing of her own gardens: my first thought is fenced in though. Her sites, her say — the same rule the Faery Yurt has kept since it was pitched.
- She was right about more than the picture. A fence says KEPT OUT. Ivy says THIS IS AS FAR AS WE CAN SEE. That line was never marking the edge of where anybody may go; it marks the edge of what we know, which is why the drawing stops there in the first place — we do not get to draw the roots of somebody else’s garden. The second reading is the only correct one on a page about somebody else’s work, and the picture had been quietly making the first one.
- The refusal underneath it is unchanged and still bites.
below_the_fence()isbelow_the_ivy()andFENCE_YisIVY_Y; the walker still refuses a coordinate past the line, re-broken on purpose with a frond pushed under it. The rename was scoped to the one section that owns those names — the fence in §20 oflove.cssbelongs to another room and was left alone — which is the rule this repository has now written down three times and broken twice. - The stars are glimmers and not a sky. This room is midday and stays midday: nothing is lit by them, no ambient layer was added to the page, and the street’s one daylit garden is not quietly turned into a night one. They are limewash white carried by an outline, because white on that path measures 1.07 and what has to separate is the edge — the ghost pipe’s answer in Queering.Earth’s bed, arriving in a star. No new colour anywhere in it. Threads, glimmers, and soft, weird spaces is More Realms’ own line about itself, which is where the word comes from; they are not the meadow’s fireflies, which are many small lights carrying a dark field.
- Every ivy leaf is turned by baked coordinates rather than by a transform, because
check-gentle.pyreads rotation out of a computed matrix and a room must not ask a checker to take its word for something —arcade.js’s call about its sprites andquest.js’s about its sparks, arriving in a leaf. - The correction is written down in five places —
make-garden.py,data/garden.json, the room’s own copy, the liner notes and here — for the reason the one colour of hers this repository ever changed is written in four. Except that this one runs the other way, from a contributor to us, and a correction in that direction is worth recording at least as loudly as one we made to her work.
2026-09-22 — The garden next door, which is not a bed and could not be made one
- Autistic Realms and More Realms are in The Garden, over the fence. Ryan’s call. They are Helen Edgar’s own sites — the grounded one and the wilder ground beyond it — and they are named, linked and credited to her on the face of the page rather than in a footnote.
- A bed is a site WE publish, so neither of these could be one. The garden’s roster is
data/arrivals.json, whose order is stimpunks.org’s own feeds page, and the only way to plant one of hers would have been to write it into that file — which would put it on The Feed as one of our wires and claim her work as ours in the one place this room may not invent anything. So the two refusals inmake-garden.pynow face each other: a bed that is not on the roster is refused, and a plot that is on it is refused, and no edit to the garden’s own data file can move a site across that fence. - You can see over the fence and not into the ground, and the drawings say so before the words do. Every bed shows its soil and most of them show what is under it. A plot shows a woven hurdle across the foot of the frame and nothing below it, because we do not get to draw the roots of somebody else’s garden — the tool walks every coordinate and refuses one that reaches under, which is the soil-line walker with the ink filter taken off. It was broken on purpose first, with a frond pushed under the rail, a circle whose edge dipped below and a relative path that walked down; it caught all three. And nothing over there casts a shadow, although everything in the beds does: the sun has not moved, the floor a shadow would land on is on the far side of the fence.
- A plot must say what of it is already in this garden, and the tool refuses one that does not. Without that line the section is a list of a friend’s websites on a page about ours. With it, it is the other half of every
withline in the beds above: those say who helped us, and this says whose garden that help walked out of. So the link rule widens by exactly our own roster — a plot may point at its own ground or at ours, and a third garden is still refused. - A plot’s name is not on a limewashed board, and that is the whole visual difference. Every bed’s label is a stake driven into our own ground, and nobody gets to go and put a label in somebody else’s garden, so the name over there is simply written down. The rule under a plot is double where a bed’s is solid — two rails repeating the hurdle, as a bed’s heavy plank repeats the plank along its soil — and the plots stand as narrow columns side by side, which is the fourth geometry this site has for a list of places. No new colour anywhere in it; the fence, the plants and every word are in the room’s own inks on the room’s own path.
- One habit each, across the fence as well as along the path. Autistic Realms is a nurse tree, planted to take the weather off whatever is growing under it until that can stand in its own light — her argument rather than our metaphor, since her page puts feeling accepted and understood before the flourishing. More Realms is a crozier, a fern still coiled, the one thing in either garden that grows by unwinding rather than by reaching, after that site’s own phrase for how it moves. The drawing dedup now spans both sets, because two drawings alike is two drawings alike whichever side of the hurdle they stand on — which is also what keeps the crozier off the Monotropic Map’s tendril.
- What each of them is was read off its own pages, in the Knowledge System mirror rather than from memory, and the phrases in quotation marks are theirs and are marked as theirs. Counts, ranking and dates are refused in a plot exactly as in a bed, and the ranking refusal matters more here: ranking a neighbour’s garden against ours would be worse than ranking our own beds. Changed:
data/garden.json,tools/make-garden.py,the-garden.html, §28 and the small-screen block oflove.css, and the liner notes.
2026-09-22 — The Rabbit Hole, and the first room that carries a song without its words
- A new storefront, and it is not a room: The Rabbit Hole. Ryan’s brief. Every other door on this street opens onto somewhere you can stand; this one opens onto a shaft with no floor at the bottom of it. It leads with our own glossary entry, Rabbit Hole, and the argument is that one: for monotropic minds the rabbit hole is not a detour, it is the destination, and three hours you did not mean to spend is not a failure of discipline. It carries all seven of that page’s embedded videos, six wood engravings from 1865, a feed your head section, and a trail out.
- The glossary entry prints the whole lyric and this room prints none of it, which is the one place a room here deliberately does less than the page it came from. Song lyric reproduction is a minefield in the United States in a way prose is not — music publishing enforces on quotation where prose publishing shrugs, the licensing is separate from the recording, and one line is a far larger fraction of a song than of a novel — which is the reasoning that already makes the Zibaldone refuse a song outright. The friendly edit here is real and it will arrive: a room whose spine is one song, whose source page has the words on it already, and whose section headings are phrases from it, reads thin without them, and whoever pastes them back will be right about the page and wrong about everything else. So
tools/make-rabbit-hole.pyrefuses a lyric field and any value shaped like verse — several short hand-broken lines, which is what a lyric looks like in a JSON string and what a sentence never does. The recordings are offered instead, with Grace Slick’s own published account of writing it, and the two headings that are her phrases are credited to her where they stand. - The Latibulum is the hardest collapse this street has had, harder than any subroom, because these two rooms are literally both holes in the ground. Every earlier version of the temptation came with a structural excuse attached — it is only a subroom, an area should look like an area, they are both cosy — and this one needs no excuse at all: the floor plan is the same. What keeps them apart is that the burrow is somewhere you arrive and the hole is somewhere you keep going. The burrow has a floor, walls, furniture, a lamp at knee height and a shelf; it is horizontal, it is at rest, and almost every word in it sits dark on lit plaster. This has no floor, no walls to lean on and no furniture whatsoever; it is vertical, the light is above and behind you and there is less of it the further down you read, and every word is pale on the dark. The burrow is earth and is brown. There is no brown in this room at all — it is wet slate — and if these greys ever warm up, the two rooms have become one and it is this one that moves.
- The ground darkens down the document, which is a shape of ground the contrast tools had not met. The Zibaldone’s rule is a flat
background-colorunder the gradient, and its flat colour is the darker end; here it is the lightest end, because that room sets dark type on pale paper and this one sets pale type on a dark wall. In both cases the flat colour is the worse case for the type standing on it, which is the actual rule and is what makes the live checker’s answer the pessimistic one. And because the gradient runs the height of the document rather than of a sheet, the colour under a word depends on how far somebody has scrolled — so every block that carries text sits on a flat panel of its own and the wash carries nothing but the header’s lines. - Two grounds, two link decisions, made at the room. Brass measures 6.74 and up on all three dark grounds and 1.83 on the paper mats the engravings sit on, so a single room-level link colour would have shipped an illegible provenance line under every plate. That is the hole The Doomscroll left and the Playhouse had been carrying since it opened — a colour nobody decided leaves no pair for
check-contrast.pyto hold — caught this time before the room shipped rather than by somebody looking at the page. - Six engravings by John Tenniel, 1865, public domain, shown rather than linked because each scan says so. Tenniel was born in 1820 and died in 1914 and the book came out in 1865, so they are out of copyright everywhere, and every file used carries an explicit public domain statement on Wikimedia Commons — which is exactly what the Mopery’s Library of Congress facsimile did not have and the reason that one is still a door and not a window. The 1865 edition captioned none of its illustrations, so unlike that room’s Doré plates there is nothing printed to quote: every word beside an engraving here is ours, which engraving sits beside which paragraph is our reading and the room says so, and the generator refuses a plate with no sentence of ours, no rights page, or no file on disk. Nothing was cropped, tinted or filtered, and every file was re-encoded with no metadata carried over.
- One performer is not named on their own upload and the room does not guess. The trailer edit describes itself as an edited remix of the Jefferson Airplane recording and credits no remixer in its title, its description or on its channel, so the plate says what the upload says and says the hand is unnamed there — which is the herbarium’s refusal to guess at a binomial, applied to a credit. And the running order is the glossary page’s own, which interleaves the videos with the quotations they sit under, so it is an argument somebody made rather than a playlist to re-sort — the rule the Jungle Room keeps about its cams. Three of the seven are published by a rights holder and four are re-uploads on individuals’ channels; each plate says which, because that changes how long a link lasts, and the generator refuses a track that does not say.
- The room carries our own entry’s warning as well as its argument. Be wary of the holes you rabbit, and the reason: the appetite a recommendation engine farms is the same appetite, and what changes is who chose the next thing. So there is no autoplay in there, no next-up, and nothing that decides for you what comes after — seven things, all named, and nothing reaches YouTube until you press it.
- Nothing in that room moves at any setting, and it has no transform in it anywhere. Not a tilt, not a rotation, no flicker and no strobe; at MAX GLITTER the wash of daylight from the mouth of the hole is a little stronger and that is the whole of it. A rotation is indistinguishable from a tilt to
check-gentle.py, which can only read the computed matrix, so a room with no transform in it cannot get that argument wrong — the callarcade.jsand The Oracle Deck both already made. The trail’s stepping indent is a padding for the same reason. New:data/rabbit-hole.json,tools/make-rabbit-hole.py,rabbit-hole.html,alice/with six 1865 scans in it, §30 oflove.css(Small screens and Print renumbered to §31 and §32), Playfair Display and Jost self-hosted, the room added tocheck-jukebox.py’s lists in the same commit that opened it, a share card drawn as a hole rather than as a place, and an engraver’s block on the shaft wall with a job on it.
2026-09-22 — The Zibaldone, and a quote bank that refuses to become a book
- A new storefront, asked for by somebody in our community: The Zibaldone. The request was a quote bank — quotes for any state of mind and emotion, seeded by us and added to by anybody. It is built as a commonplace book, which our own glossary has had an entry for since 2022, and named for the Italian miscellany notebook: a zibaldone is a heap of things. Montaigne kept one and invented the essay out of it; the Meditations is one.
- A quote bank is the most dangerous shape of page this site has built, and the danger has no moment anybody could catch. Nobody decides to republish a book. They add one good line, then another, each individually reasonable, and a year later the page is the work instead of pointing at it. So
tools/make-zibaldone.pyrefuses a quotation over thirty words, the number lives in the tool, and the room prints it — because “we quote lightly” is not something a page can promise and not enforce. Where the line is not enough, the book is linked. - No song lyrics, refused structurally rather than by care. Ryan’s reply to the person who asked: song lyric reproduction is an intellectual property minefield in the US. Music publishing enforces on quotation where prose publishing shrugs, the licensing is separate from the recording, and one line is a far larger fraction of a song than of a novel. This street already says that nothing musical is hosted here, and a quote bank is exactly where that promise would have been broken in the way that looked most harmless. The first thing that check ever refused was a false positive — the word song matched Whitman’s Song of Myself — and the pattern was narrowed rather than the poem excepted, which is
check-counts.py’s own first-run lesson happening for the third time. - Every line names its printing, not its title, and says how it was checked and when. A title is not a source: these texts differ between printings, and a quotation nobody can trace is the thing The Doomscroll dropped a poem over. The Emily Dickinson is the proof it matters — it is in the Second Series of 1891, edited by Mabel Loomis Todd and T. W. Higginson, not the first, and the only thing that found that out was reading the title page above the poem instead of remembering it. The Thoreau is the other proof: the version everybody quotes has somebody marching to a beat, and he wrote neither word. The public domain lines were grepped out of the transcriptions each card names; the contemporary ones were read off our own published pages.
- A translated work has to clear the public domain twice — a trap this repository had not met before.
make-doomscroll.py’s test is the author dead more than seventy years, everywhere rather than in one country; but a translation is a copyrightable work of its own, so a Roman emperor in a modern English is a modern book. The Meditations here is Meric Casaubon’s 1634, and he is credited on the card. Seneca is not in the room at all and the data file says why: our glossary quotes him on words becoming works, that wording is a modern translation the entry does not name, and the public domain one does not read that way. A gap somebody has already checked is worth more than a line nobody can place. - There are no faces in that room, and that is the whole answer to “any state of mind”. The obvious build is a grid of moods you pick from, and the obvious drawing for a mood is a face — which on a Disabled people’s site is the emotion flashcard autistic people spend their childhoods being drilled with. The Playhouse settled this for its sound board and the answer is the same here: each card says what it is for in a sentence about a situation, and the tool refuses an emoji in that field. Nothing is ranked, counted or voted on either, checked with
make-guild.py’s negation window so the room can still say so out loud. - The quotations are set in type and only the margins are handwritten. The room varies the face per entry, which is what was asked for — EB Garamond for the oldest, Newsreader for the nineteenth century, Lora for the living — and Kalam is the hand and never carries a quotation, refused by the tool. A passage in a handwriting face is an access failure wearing atmosphere, which is the lesson The Doomscroll’s blackletter already carries one room over. The margin note on every card is ours, and the tool refuses a quotation mark in it, because margins that could hold quotations would quietly become a second uncited quote bank running down the side of the cited one.
- The room it could collapse into is every other paper room on this street, and the separation is that all of those are PRINTED. The Mopery is a cold building you stand up in, with type punched into the page by a press. The Doomscroll is one unbroken machine-set roll of cold grey newsprint with nothing cut and nothing rotated. The zine table is a photocopy made in a hundred copies to give away. This is one object at arm’s length, seen from above, written into by hand, and bound — there is a fold down the left of every sheet, and the fold is what makes it a book rather than a page. And where the guild is lit like a photocopy and the garden’s light has come through leaves, this is the one room lit by something in the room with you: a lamp on the left, at desk height, which is why the paper has a tooth and the fold has a shadow in it.
- The attribution slip is TASL plus the three fields a quotation also needs, and it sends nothing anywhere. Creative Commons’ Title, Author, Source, Licence is the right skeleton for a photograph, where the thing you point at is one file at one address; a quotation comes out of a work, in a printing, and the person copying it found it somewhere else again — and that last field is the one that catches a misquotation, because most of them are copied in good faith off something already wrong. There is no form action and no endpoint: the button writes a block of text to your clipboard and you send it however you already talk to us. Its fields are generated from the same list the cards are checked against, so the day somebody adds a field to an entry cannot be the day the form stops asking for it.
- A colour under the bar, and a tilt with no reset, both caught before it shipped. The pencil grey carried every citation, margin note and provenance line and measured 4.43 on a pasted leaf;
check-contrast.pyrefuses a colour it has never seen, which is how it surfaced, and it was darkened.check-gentle.pythen found all seven leaves still lying at their pasted angles at Gentle::where()guarantees a tilt cannot be out-ranked but does not conjure a rule to outrank it, and §3’s reset names the shared tilt classes and nothing else. The room resets its own now, which is the fault that shipped on the Faery Yurt’s windowsill. New:data/zibaldone.json,tools/make-zibaldone.py,zibaldone.html,zibaldone.js, §29 oflove.css(Small screens and Print renumbered to §30 and §31), EB Garamond, Newsreader, Lora and Kalam self-hosted, the only pale shopfront in the row, a share card that is a page lying on a desk, and a steel nib laid down beside the book with a job on it.
2026-09-22 — The Garden, and a palette that splits at the soil line
- A gate in the wall, and a garden behind it: The Garden. Ryan’s brief. Our knowledge garden as a place you can walk: an intro to what knowledge gardening is and how this one is tended, one bed for every site we publish, the Garden Spider, and everything needed to start a garden of your own. Every bed links straight out, because each of those sites is already its own room — so it is not a door in the grid but an opening, and it is the one place on a night street where the sun is up.
- The roster is not in the garden’s own data file. Which sites exist, in what order, with what names and addresses, is read out of
data/arrivals.json— the same list The Feed runs on, whose order is stimpunks.org’s own feeds page. So a bed cannot be invented, a site cannot be quietly left out, and re-sorting the garden would mean overruling a decision made somewhere else, which is the rule the Jungle Room keeps about its cams.data/garden.jsonholds nothing but our own writing about each site. - The Feed is the room this one could collapse into, and both rooms list every site we run. So the division is structural rather than tonal: a board is a timetable — a title, a date, a destination and the minute it was set — and this is a planting plan: what a site is for, whose hands are in it, and nothing that changes when somebody publishes. Hence no network in
tools/make-garden.py, no pull step beside it, and a refusal of dates in a bed, because that is the edit that would turn one room into the other. - The drawings are told apart by FORM, which is the campground’s grammar inverted on purpose. Out in the field every pitch gets one lit colour of its own — the yurt emits, the hermitage catches, the meadow carries — and that runs out at about the fourth pitch, because there are not many kinds of light. There are as many kinds of growth as you like: a rhizome, an umbel in flower, a plant with no chlorophyll in it, a frame with seedlings under glass, a runner rooting a new plant beside itself, a dry seed head, a scramble over the path, a tendril. Each one says something true about its site, and every habit is also written out in a sentence beside its bed, because the drawings are decoration a screen reader never reaches and the habit is the argument.
- No bed says how much a site holds, and nothing is ranked. No glossary-term count, no sheet count, no biggest or busiest. A number like that is wrong within the week and authoritative-looking meanwhile — the fault The Feed spends a paragraph avoiding — and a garden measured by volume is an inventory. Both are refused in the generator, the ranking one with
make-guild.py’s negation window so the room can still say that it does not rank anything. - Green on that earth measures 1.38, and no brown can fix it.
check-contrast.pyput the two greens at 1.38 and 2.14 against the soil, and because they are only 1.55 apart from each other no soil colour clears 3:1 against both at once — so there was no palette fix available and the drawings changed instead. The palette splits at the soil line the way a plant does: green above it, pale below it, so every root, rhizome, mycelial thread, spilled seed and blanched shoot is drawn in the path’s own colour, which is also what a shoot looks like before it reaches the light.make-garden.pywalks every coordinate of every green element and refuses one that crosses the line — broken on purpose first, with a stem pushed two pixels under and a leaf circle whose edge dipped below, and it caught both. - The two rooms it could collapse into are the two other daylit ones, and the separation is physics. The Solarpunk Hermitage’s light lands on a warm plaster wall, with everything standing in front of it and the shadows falling sideways off a low sun. The Adventurer’s Guild has no light source at all, lit like a photocopy, with nothing casting anything. Here the sun is overhead and has come down through leaves: every pale surface is tinted green, and every shadow is small, hard and directly underneath the thing that made it. And the palest thing in the room is not the ground — a limewashed board is brighter than the path it lies on, where both neighbours put their panels darker than their paper.
- It sets no display face at all, which is the room’s one claim about type. Every other world here has something that shouts — a woodtype, a condensed grotesque, a fat slab, a blackletter, a pixel face — and a garden has no signage in it, only labels. So Faustina sets the garden’s own name and the label on every bed in the same breath, Mulish carries the notes, and the loud things in the room are the plants. Both are under the SIL Open Font License.
- The Garden Spider is an orb weaver and not a mascot, and its panel is careful in our own words rather than softer ones: a spider is a guide to the garden and never a replacement for it, its best answer is an entrance, it can be wrong, and every trail it puts you on ends at a page a person wrote. Those lines are from our Ask page, quoted from ourselves, with the ethics pages linked beside them and a way to reach a human instead.
- Every bed says whose hands are in it, on the face of the bed. Half of these sites were made with Helen Edgar of Autistic Realms; Star Stuff is a collaboration with More Realms; the Cavendish model is David Thornburg’s by way of Steve Silberman’s NeuroTribes; monotropism is Dinah Murray, Wenn Lawson and Mike Lesser’s; the pebbling locution is Amythest Schaber’s. The generator refuses a bed with nobody on it, and refuses a link inside a note that points somewhere that is neither ours nor that bed’s own site —
make-hermitage.py’s rule about the Star Stuff table. Thewithline is the exemption, and that is the whole reason it exists. - The leaf shadow is still at Gentle, drifts at Regular and drifts further at MAX. The light is never taken away, because the light is not the wobble — the campground’s own call about its grass. Both are keyframes, so §3 kills them at Gentle with
!important; nothing flashes, pulses or strobes at any setting, which is Club Chronic’s rule holding in the brightest room on the street. New:data/garden.json,tools/make-garden.py,the-garden.html, §28 oflove.css(Small screens and Print renumbered to §29 and §30), a gate on the street, Faustina and Mulish self-hosted, a share card whose row of labels is read off the beds, and a plant label lying on the path with a job on it.
2026-09-21 — The Feed, and a board that says when it was set
- A new storefront: The Feed. A dark station concourse with a freestanding split-flap indicator board standing in it for every site we run, read off their own RSS feeds. Ryan’s brief. The object is a Solari di Udine machine and the one in there is drawn from nothing in CSS; it makes no sound.
- It cannot be live, so it says the minute it was set. None of those hosts sends a browser the header that would let our page read its feed, and the ways round that are a proxy we do not run and a third-party reader we would be handing visitors to without asking. So
tools/pull-arrivals.pyreads the feeds,tools/make-arrivals.pydraws the board, every plate carries the minute its own wire was read, and the hall carries the minute the board was set — both generated from the same file the rows come out of. This ismake-jungle.py’s refused runtime upside down: a live camera has no length to give and publishing one would be a number that goes quietly wrong, and a board has a time it was set, so leaving that off would be the identical fault the other way up. - A row is a title, a date and a destination, and the tool refuses one carrying a summary. A departures board does not read you the contents of the train — which is the metaphor and also what keeps that page from republishing everybody else’s writing onto one surface it does not own. That edit is a friendly one and it will arrive: the rows look bare, somebody helpfully pastes the opening lines back in, and the board has become a reader. Refused rather than merely not done, the way
make-sweetgrass.pyrefuses a reading marked as a screen. - Nothing is ranked and no site’s activity is added up. No busiest, no quietest, no rows-per-week, nothing saying which of our sites has been getting on with it. A board that showed that would turn publishing into a race between our own people, most of whom are Disabled and several of whom are one person — the pebbling cabinet’s refusal of a tally, arriving between sites rather than inside a game. The vocabulary is refused in the room’s own copy, with the negation window
make-guild.pyuses so the room can still say that it does not rank anything. - Each wire names which feed it carries, because two of those sites publish more than one. “The latest from Star Stuff” is an ambiguous sentence when Star Stuff keeps a feed of the pieces and a feed of the reasoning, and a board that picked quietly between them would be answering a question nobody knew it had been asked. The running order is not ours either: it is the order those sites appear in on stimpunks.org’s own feeds page, which is the Jungle Room’s rule about its cams. And this street is on its own board, fetched over the network like every other wire, so the board can be out of date about this site too.
- The seam through the middle of the letters had to go, twice. A real flap splits straight through the glyphs, so that is what it was: one near-black hairline at 50%. On the share card the row lettered NEVER read as a word struck through. Two solid faces with a lit fold between them fixed the card and then failed worse on a phone, where a destination wraps to three lines and 50% of a tall row lands inside somebody’s second line. The reason is structural and is not going away: a real board’s rows are one line of fixed-width characters and cannot wrap, and ours carry the titles people actually gave their pages. There is no proportion of a row that is not inside a sentence, so the lower leaf sits at the foot of the flap, where no width can push it into a word.
- The dial governs the clatter and never the arrivals. Still at Gentle, one downward settle per row at Regular, a riffle before settling at MAX. Both are keyframes rather than static transforms, deliberately — §3 kills animation at Gentle with
!importantand nothing out-specifies that by accident, so the faultcheck-gentle.pyexists to catch has nowhere to live here. Neither animation touches opacity, because three fast opacity steps in a row is a flicker whatever it is called, and Club Chronic’s rule holds on the whole street. - The room it could collapse into is the Adventurer’s Guild, and this is the hardest case since The Den. Both rooms are made of ruled rows, both are square, and in both of them nothing is rotated and nothing overlaps — and that room’s own section says its tidiness cannot spread. What holds them apart is not the layout, because the layout really is the same: the guild has no light source and no depth, lit like a photocopy of a document, with nothing casting anything, and this is nothing but light and depth. A clerk filed that; an engineer bolted this together and switched it on.
- And the light is a third kind of transmitted light, because a neighbour already owns the idea. Swaying Sweetgrass is lit through a translucent body — diffuse, no edges, nothing with a lit face. This is lit through an aperture: a hard light behind a mask, so every letter has a crisp edge and every flap throws a hairline shadow. New:
data/arrivals.json,tools/pull-arrivals.py,tools/make-arrivals.py,the-feed.html, §27 oflove.css(Small screens and Print renumbered to §28 and §29), Michroma and Space Mono self-hosted, a share card, and a job marker on the concourse floor.
2026-09-21 — a contrast checker that reads the page instead of the intention
check-contrast.pyis a list of pairs somebody wrote down.tools/check-contrast-live.pyis the page. It renders all 29 and walks every piece of text against the ground it actually sits on — whatcheck-gentle.pyalready does for motion, and what nothing did for colour. It exists because the pair list was blind three times, each found by a person looking: a link colour nobody ever decided, a decided colour that lost the cascade, and three hexes that had never rendered at all. Same shape every time — the colour that renders is not the colour that was written down.- It found the skip link unreadable in twenty-one rooms.
.skipcarries its own yellow ground and near-black ink at (0,1,0); every room sets.room-x aat (0,2,0). So the first control a keyboard user meets took each room’s link colour on a yellow box: 1.26 in the chapel, 1.10 in the arcade, 1.00 — yellow on yellow — on every plain room. Nobody had seen it because it sits off-screen until focus and nobody screenshots a focused skip link. It carries!importantnow, for the reason §2’s[hidden]guard does. - And it found two of the Hermitage’s bean bags under the bar. The chairs take their colour inline out of
data/hermitage.json; the checker had three lighter hexes in it that the page has never used, so every run passed while the magenta sat at 2.79 and the teal at 3.38 against the 4.5 their copy needs. The constants are read from the page’s own values now and the failure is written into the checker’s notes beside the Pink Pony Club’s, because which colours those chairs are is a choice about the room rather than a checker’s to make. - Three dead custom properties came out of
:rootwith it.--bag-1/2/3were referenced by nothing —.bagreadsvar(--bag), singular, which only ever exists on the element. A dead declaration is not harmless when something else is checking against it, and the old checker’s own guard caught them the moment the constants were corrected. - Its first run reported 314 failures and most of them were the tool’s fault, which is the point of breaking a checker before believing it. About a sixth of this site’s text stands on a
linear-gradientwith no background-colour under it — the Doomscroll’s newsprint, The Den’s shag — and walking up to the body reported 222 pieces of pale text as near-black on near-black. It declines rather than guesses now: a gradient in the chain makes a piece of text unmeasurable, counted and reported as such, and left to the hand-written list where those grounds are recorded with their measurements. It also unhides every[hidden]element and opens every<details>before measuring, because the bug it was written for was in a control that ships hidden. - Both findings are fixed and the sweep is clean: 0 under the bar on 29 pages. The Hermitage’s magenta and teal chairs were lightened rather than re-coloured — hue and saturation untouched, all three now sitting together at 4.80 to 4.82. Taking the lighter palette the checker had been assuming would have put the teal at 7.34 and made one chair a different weight from its neighbours, in a room whose own comment says no two of them are the same colour because nobody furnishes a room like this by agreeing. The Pebble Board’s slug ink was darkened by four thousandths of lightness to clear 4.41. New:
tools/check-contrast-live.py.
2026-09-21 — six more toys, and three links in that room that measured 1.31
- The blank column in the Playhouse is full. Ryan looked at the page and asked for more buttons. The toys grid was 353px of tiles beside 1293px of prose and dial, so six more close it: THE ECHO, THE DOUBLE EMPATHY TELEPHONE, THE SAFE FOOD TIN, THE SPOON DRAWER, THE OFF SWITCH and THE INFODUMP. Ten tiles, ten fills, none repeated.
- Every toy is an idea out of our own glossary wearing a costume, and a line under the tile says which idea. Echolalia, the double empathy problem, safe food, spoon theory, infodumping. The slugs were checked against the Knowledge System mirror rather than fetched, because on stimpunks.org a 301 is a failure rather than a pass and a live fetch will cheerfully confirm a page that does not exist — curb cut effect was dropped for being in our posts and not in the glossary. A toy is not an explainer: the tile does the thing, the line says where the thing came from, and nothing teaches, quizzes or asks anybody to show they have understood.
- The credit is on the face of the tile and
make-toys.pyrefuses one that is not. Damian Milton on the telephone, Christine Miserandino on the spoon drawer. A credit recorded in a data file and not in the copy is a credit nobody reads, which on this site is the one habit kept when the other three were dropped. - The spoon drawer hands out the sentences and not the spoons. The obvious build gives you a spoon every time and never runs out, which is generous and quietly deletes the limit Miserandino wrote the essay to describe. It holds the things you can say to somebody across a table instead, which is what she invented spoons for. Nothing is counted and nothing is deducted — the tool refuses the scoring vocabulary on every tile, because the stim box already says “nobody is counting” as a joke about counting and the joke does not survive a second toy repeating it straight.
- The double empathy telephone never says which account was right, because the idea it is wearing is that neither was wrong. Two handsets, one encounter, two honest reports of it; pick up both ends and the next press is a new call. Its tile is a
<div>and the handsets are the buttons, since a button cannot be nested in a button and the alternative was one control pretending to be two. - The off switch has no are-you-sure. It stops every sound on the page at once, closes the audio context so nothing the sound board has scheduled survives, and says so. A stop button that asks whether you meant it is not a stop button, and that room can now stack nine sound-board keys and two recorded yells with no single way out.
- An aria-live region does not announce text it already holds, and two of these toys exist to repeat themselves — the echo says the last thing again, the tin says the same sentence forever. Written the obvious way both are silent to the one reader who most needs them while looking perfectly correct on screen, which is a failure with no symptom for anybody watching. The region is cleared and set back on the next tick, which is what makes a repeat a change.
- An HTML entity is right in a blurb and wrong in a payload, and nothing in a data file shows which is which. The blurb is written into the markup as HTML; anything that becomes a
data-attribute is written by the script withtextContent, so“there arrives on the page as five literal characters. The spoon drawer shipped its first draft that way. The tool refuses an entity in a payload field now. - The generator caught a fill collision on its first run. The newcomer had taken
.toy--violet, which the word clock has owned since the room opened, and two rules in one section would have settled it by source order in silence. That ischeck-classes.py’s collision arriving inside a section, where that tool deliberately does not look. The newcomer was renamed rather than out-specified. - And that room had three live contrast failures nothing could see.
.room-play awas yellow, which is right on the near-black boxes — and every link on the page sits either on the blue ground or inside a white card. The house-rules links measured 1.31, the quest marker’s hand-in link 3.88, on a page published since the street opened.check-contrast.pyholds a pair for every colour somebody decided on, and an inherited colour was never decided, so there was nothing to hold a pair for — the exact hole the Doomscroll left, found again in an older room. The room decides at each ground it actually has now: white on the blue at 5.08, the room’s own blue on the white cards at 5.08. Every link in there was re-measured afterwards. - Every toy makes a noise now, because six of them making none read as breakage. In a room where nine other things answer out loud, the quiet ones feel faulty rather than quiet — Ryan's report. Each one is its own short synthesised sound, no two alike and none alike to the sound board's keys: an echo of a blip, a line opening, one unchanging note for the safe food tin, a teaspoon against a mug, two notes down for the off switch, and a fast run for the infodump.
make-toys.pyrefuses a toy without one. The off switch's noise comes after the silence, which is the only order that makes sense for that button, and its copy says so. - And the echo plays the last sound back as well as the last words, which is Ryan's idea and makes the toy the thing its name says it is — including sounds made by the board next to it. The mechanism is that a toy's noise is a factory: called once to choose, handing back a function that plays that choice. The obvious version, calling the toy's noise again, silently advances anything that varies, so the echo of the stim box would be the next note up the scale and nothing would look wrong. Measured: two stim presses give 659 then 784, two echoes give 784 twice, and the next press resumes at 880; a recorded yell echoes as that person's yell rather than a fresh draw.
- Four of the new answer boxes were rendering near-black on near-black at 1.00:1, and three more between 1.28 and 1.48.
.toy--orange spanwas written when a tile held one span; the readouts arrived later, also spans, and that rule is (0,2,0) against.toy__saidat (0,1,0). Styling by element is a rule that cannot see what it will hit. The blurb has a name now and every fill rule is scoped to it.check-contrast.pypassed the whole time, because it holds pairs somebody wrote down and not pairs that render — the pair was declared correctly and lost the cascade. That is the second time in a day the pair list was blind, after the inherited link colour, and both were found by a person looking at the page. - The first attempt at that fix missed a tile, and so did the check on it. The rescope was a regex expecting one space before
span;.toy--green spanhad two. The grep that verified the work carried the same assumption and reported clean. Break the check differently from the fix. - And then the buttons looked broken, because the room answered somewhere nobody could see. Every press wrote into the one live region at the top of the page, which is off the screen by the time anybody has scrolled to the toys — let alone to the sound board underneath them. Ryan pressed the toys he had asked for an hour earlier and thought they were faulty. Nothing caught it because every check, ours included, was reading the box: the handler fired, the text was right, the live region updated, and the person pressing saw nothing. That is the 0×0 iframe again in a different shape — the DOM correct and the screen wrong. Every toy answers on the tile you pressed now, and the sound board in one strip under its keys, since a key is a hundred pixels wide and a sentence does not fit on one. One readout at a time, all of them
aria-hiddenwith#playhouse-saysstill the only live region, and all of them shipping hidden so a page without scripts shows no empty boxes. - Chairy’s blurb stopped being a hand-typed number. It said “one of twenty-eight things”, which had been right by luck since the day the sayings stopped being five; it is generated from
data/chairy.jsonnow. New:data/toys.json,tools/make-toys.py. The tool carries Chairy’s sayings and the yell button’s recordings across untouched, because a generator that silently empties another generator’s output is the_headerstrap with two tools in it instead of one.
2026-09-21 — a sound board in the Playhouse, and a row of moods with no faces on it
- The Playhouse has a sound board on the wall. Ryan’s brief: everything in that room is a button, so a three-by-three board of stimmy noise keys, with the bottom row holding mood keys that toggle between happy, sad and angry noises, and a different visual fanfare for each key at MAX GLITTER. A click, a pop, a rainstick, a chime, a purr and a squeak; then a hum, a spring and a drum with three moods each.
- The bottom row is not a feelings chart, and that is why there are no faces on it. A face is the first thing anybody sketches for a mood key, and a row of happy/sad/angry faces on a Disabled people’s site is the emotion flashcard — the thing autistic self-advocates spend their lives being drilled with. What a mood is here is the shape of a noise: a hum that lifts a third and stays up, the same hum sagging a tone and a half, two drones fourteen cents apart buzzing against each other. Each one is a word, a drawn waveform and a sound, and the room says so in its own copy rather than leaving the absence for somebody to helpfully fill in. It also says that a sad noise is a perfectly good thing to want, and that you can leave a key on angry and go and do something else.
- A mood key shows the mood it is about to play. Press it and you get that noise; the key then offers the next one. The face of a button should describe what pressing it does, which the alternative — naming what you just heard — does not. The flourish keeps the colour of the noise that just happened while the label has already moved on, which is why that button carries two attributes and not one.
- Every noise is synthesised in the browser and nothing is fetched, so the room’s own house rule stays true: it is silent when you walk in and silent if you never touch anything. Oscillators, filters and a buffer of white noise, built inside the click handler — the AudioContext cannot start without a gesture, which is the platform enforcing the promise rather than us making it. A bell is 880 and 2.76 times 880, which is the whole difference between a bell and a sine; a purr is a trill at twenty-two on the gain rather than on the pitch; a bubble goes up, which every first draft of that sound gets backwards.
- Every key says what it sounds like, in words, on the press. A board made of sounds is the one thing on this street that can lock somebody out completely, so the room’s live region gets the noise described rather than just its name — the Jungle Room’s rule that colour is never the only channel, in a room where the channel is audio.
make-soundboard.pyrefuses a key without that line, and refuses two keys that claim to sound the same. - Three files have to agree about every key and none of them is near the others, so the tool reads all three: the markup is in the page, the noise is a registered
voice()inlove.js, the colour and the flourish are rules inlove.css. A key whose voice is missing is not an error anywhere — it ismake-chappell.py’s typo that never becomes a video, arriving in a room where the press is the content. A key whose flourish is missing is quietly ordinary at MAX, which nobody would notice because nobody screenshots MAX. Both refuse now, along with two keys sharing a flourish, a mood key anywhere but the last row, and a mood set that is not the same three in the same order. - Nothing on it is counted. No total, no streak, nothing kept between visits. A board of nine keys is exactly the shape of thing that grows a press counter, and the stim box one object over already counts its own presses as a joke about counting — a joke that does not survive being repeated by a second object with a straight face. The pebbling cabinet’s refusal of a tally, arriving a third time.
- Nine flourishes and no two alike, at MAX GLITTER only. Rings, bubbles, falling hairlines, a burst thrown eight ways, widening bars, darts, flat arcs off the bottom edge, a stretching coil, confetti — each clipped to its own key, so the flourish belongs to the button that made the noise. Everything moves with a translate or a scale and nothing rotates, which is
arcade.js’s call andquest.js’s: rotation and skew are allcheck-gentle.pycan read, and a checker must not be asked to take a room’s word for something. Nothing flashes and nothing strobes — Club Chronic’s rule, in the loudest room on the street. At Gentle nothing is built at all and the words are identical; measured at all three settings, along with the rendered boxes of the pieces themselves, because “the elements exist” is a question about the DOM and this was a question about paint. - Red was the obvious colour for angry and it measures 3.06 on the mood keys’ near-black. Angry is orange at 8.03, sad is cyan at 10.7 and happy is yellow at 14.5. The mood ink is on the word as well as on the line, so these are body-text pairs rather than graphics ones. Seven new pairs.
- A media block written above the rules it overrides loses exactly the declarations the base rule also sets, and keeps the rest. A new failure shape here, and it renders as a layout nobody wrote: the phone block sat before
.stimpad, soflex-flowand a font size lost to the base rule while aflexbasis the base rule does not set went straight through. Half a breakpoint. It looked like a stale stylesheet and it was source order. - And it is three across where there is room and one column on a phone. Held at three columns at 375px, a key gets about seventy pixels of text column and every blurb sets one word to a line. Hiding the blurbs to keep the grid would have been the lite-version mistake arriving through a breakpoint, so the grid gave way; the sentence describing the board’s shape is generated and carries its own caveat. New:
data/soundboard.json,tools/make-soundboard.py.
2026-09-21 — The Adventurer’s Guild, and the one tidy room
- The Adventurer’s Guild has opened a shopfront on the street. Ryan’s brief: the trope with the inn and the job board, jobs ranked by difficulty class, sending people on quests across the rooms; a discreet clickable drawing in each room as the quest target; a code revealed at the target and redeemed at the board; hints; and fanfare that follows the HOW LOUD DO YOU WANT IT? dial.
- The room is tidy, and that is its entire costume. On a street whose architecture is that nothing matches, somebody has come in and filed everything: manila, printer’s ink, hairline rules, ruled rows, a class in the margin, a stamp. Nothing in §26 has a gradient, a shadow, a rounded corner or a rotation in it. It is the second room you can read by daylight and it has no light source in it at all — the Hermitage has a sun in it, with a direction and shadows falling away from it; this is lit the way a photocopy of a document is lit, evenly, from nowhere. And it is the second pale ground on a dark street: the Doomscroll is one unbroken roll of foxed newsprint with nothing ruled on it, and this is made of rules.
- It states its own link colour, at the room, which is the hole the Doomscroll left the day before: that page declared a colour for one line and every other link fell through to the base stylesheet’s pink, at about 2.4 on paper, and the contrast checker had nothing to hold a pair for because nobody had decided anything.
- Every room on the street carries a marker, and no two markers are alike. A staple on the zine table, a token on the arcade carpet, a spindle adapter on the den floor, a tent peg in the field.
make-guild.pyholds one drawing per room and refuses a room it has no drawing for —make-og.py’s refusal, formake-og.py’s reason, because the failure mode of guessing is one shared glyph quietly appearing in every room on a street whose whole point is that the rooms share nothing. Each marker is drawn in its room’s own declared colours and every one is held against the floor it lies on at the body-text threshold, the Jungle Room’s quills rule: a marker you cannot pick out of the floor is a control you cannot use. The Playhouse lost that argument to its own floor — its yellow measures 3.88 on that blue, so the block is white at 5.08. - The marker is a native
<details>, and the way out of a question is another one. So the code, the hints and the “give me the answer” escape all work with JavaScript off; the scripted part is only the answer box, which ships hidden and is revealed byquest.js, so a page without scripts shows no dead control. Discreet means visually quiet and nothing else: every marker is a full-size target in the tab order with a real name on it, which is The Den’s door rule. And every marker is on the floor of its room, said out loud on the board, because scattering them at a different depth in each room would have made finding one a test of eyesight and of a mouse rather than a walk between rooms. - The marker is never the play button, although the example in the brief starts from one. A facade is two elements and
love-embed.jsreplaces the pressed<button>with a bare<div class="facade">, so anything it was wearing evaporates — the fault that shipped Swaying Sweetgrass’s players at 0×0 the day before. A play button that also does a second thing hands a popup to somebody who only wanted the song, and gating a quest behind a press would put it behind consenting to a third-party frame. So the George Jones job is a spindle adapter on the den floor and its question is what makes you read the tile: who wrote She Thinks I Still Care, which the room credits to Dickey Lee and Steve Duffy on the cut itself. - Nothing is scored, and the tool refuses the vocabulary. No total, no percentage, no streak, no rank you climb, nothing that expires. A job board is exactly the shape of thing that grows a score, and a score beside a walking tour of a Disabled people’s site turns a wander into a workload — the pebbling cabinet’s refusal of a tally, in the room most likely to talk itself out of it. The difficulty class is how far you walk, enumerated in the tool and defined by geography, so it says nothing whatever about the person doing it.
- The first thing that tool ever refused was a false positive, and the pattern was narrowed rather than excepted. “A book it points at” is the verb, and a scoring pattern that cannot tell it from a points system is
check-counts.py’s first draft refusing “no two rooms alike”. A point is only a point now when it is being awarded or counted. - The fanfare follows the dial and the words never do. Gentle says its piece and adds nothing; Regular chimes; MAX chimes properly and throws sparks that rise once and fade. The sentences are identical at all three, and nothing flashes or strobes at any setting — Club Chronic’s rule. The sparks move with a translate rather than a rotation, deliberately, because rotation and skew are all
check-gentle.pycan read and a checker must not be asked to take a room’s word for something. - A marker’s link carries its code to the board and stops there. It fills the box; the visitor still presses. That press is what the fanfare is consented by, and it is the accessible path for anybody who finds typing expensive, which is most of the reason it exists.
- The board holds a checksum of each code rather than a second copy, and the tool says out loud that this is a courtesy and not a lock. Every code is printed in plain text in the markup of a public page — that is the mechanism. What the checksum buys is that opening the source of the board is not a spoiler sheet for every room at once.
check-quests.pyreads the published HTML and never the data file. The generator writes both surfaces, so they cannot disagree the moment it runs; this is about every moment after that, when a generated line sitting in a committed file gets edited by hand. That is theframe-srcshape exactly. It found a bug in itself on its first run: it sliced each marker at the next</details>, the marker’s own hints are<details>, and it reported eighteen missing escapes that were all present. It slices on the generator’s end marker now.check-classes.pycaught this page wearing two of the street’s classes —pavementandmasthead__dial— which is thetaglineleak again, and the newcomer was renamed rather than out-specified. The guild ends in its own voice, like every other room.- The marker does not print. It is a control whose whole content is a code to type into a page you cannot type into on paper, and the zine room’s one-sheet promise has been broken by a single paragraph twice.
- Pitch 01 got a marker and it is ours, not Helen Edgar’s. A candle stub on the Faery Yurt’s windowsill, drawn in her own declared colours, added on Ryan’s call so that her pitch is not the one room on the street with no job in it — and written into the liner notes beside the one colour of hers this repository has changed, because a change to a contributor’s room should be visible somewhere other than a diff. Helen has the final say on whether it stays.
- Two pages carry no marker, on purpose and by name in the tool. The changelog is a dated record and writing new furniture into a log is the same instinct as rewriting a September entry to satisfy a linter; the guild is where jobs are handed in, so a marker there would be a job that sends you to the room you are standing in. Everything else refuses to ship without one.
- Two faces nothing else here sets — Rye, a woodtype face for posted bills, and Public Sans, which was drawn for United States government forms, which is the room’s joke set twice. Thirty-five new contrast pairs and one measured ornament. New:
data/quests.json,tools/make-guild.py,tools/check-quests.py,quest.js. love.css gains §26 and the two cross-cutting sections renumber to §27 and §28. - Still to come: the bed. A guild is an inn as well as a board, and this one has no room over it yet. When it does it will be about rest as something owed rather than earned, which means it will owe a great deal to The Nap Ministry and Tricia Hersey and will say so in its own copy. The board says that out loud rather than leaving a gap.
2026-09-21 — Swaying Sweetgrass, and a book we are not going to serve
- Swaying Sweetgrass is pitched on pitch 02, which had been open ground since the field opened. Ryan’s brief: a meadow of sweetgrass left alone, except for a natural-surface path a wheelchair can use, running to a clearing at the centre with a communal fire pit under open sky.
- The light is behind the grass, and that is the only thing keeping this out of a family it would otherwise join. The Faery Yurt, The Latibulum, The Den, the Hermitage’s cave and The Mopery are every one of them lit by a flame you could put your hand over. Here the sun is low, a hundred feet off and behind everything, so nothing has a lit face at all — the blades glow because the light is coming through them. That is why the greens go yellow while the ground stays dark, and it is a different warmth from tallow or varnish. There is no furniture in a meadow either; the only built things are the path and the fire ring.
- The fire is painted in the room’s own two golds and given no colour of its own, deliberately. A flame with an orange to itself would have made this the sixth flame-lit room on the street by the back door.
- Ryan’s brief pointed at 21 chapters of Braiding Sweetgrass read aloud, and they are published as doors rather than screens. The playlist is uploaded by The Anarchist Audio Library and is an unauthorised reading of a book that is in copyright — Milkweed Editions, 2013, Robin Wall Kimmerer living, publishing, and narrating the real audiobook herself. Every chapter plays and every chapter embeds, so nothing in the machinery would have stopped them going in beside the fire:
love-embed.jsonly asks whether an id is well formed andcheck-jukebox.pyonly asks whether a video works. What stopped them is that this room’s whole argument is the honorable harvest — never take the first, never take more than you need, ask — and a page making that argument cannot serve somebody else’s entire book off its own surface while doing it. Ryan’s call once the provenance was put to him: keep both, her voice as the fire and these as a way out.make-sweetgrass.pyrefuses a reading marked as a screen, so the decision survives being tidied by somebody who thinks the doors look broken next to the presses. - What is at the fire instead is Kimmerer in her own voice — her publisher, Bioneers, TEDxSitka, Harvard, the New York Botanical Garden, On Being, the Museum of Science, the Natural History Institute, the Commons KU — shortest first, so three minutes and an hour and a half are both a real option. Every id was resolved against YouTube on the day: status,
playableInEmbed, length, title and channel, off one fetch of each watch page. That check is the only reason the two lists are two lists; the readings arrived looking exactly like the talks and the channel is what told them apart. The build refuses a talk whose channel is the readings’ channel, in either direction. - The 21-strand teaching is somebody’s, and the video does not say whose. Seven generations behind, seven sacred laws, seven ahead. It was matched to its source rather than guessed at — the transcript panel was opened and read against the words, and it is Sweet Grass Teaching, published by Shawenim Abinoojii Inc., at 0:53, which was already in Ryan’s own field-guide list. The description says only “Made for Shawenim Abinoojii Inc.”, there is no name card at the end and the channel does not say, so the room credits the organisation and states plainly that the Elder is unnamed there rather than inventing a name. That is the herbarium’s refusal to guess at a binomial, applied to a person.
make-sweetgrass.pycounts the bundles and refuses one that is not seven — the opposite ofcheck-counts.py’s rule and for the opposite reason: a count that belongs to somebody else is a fact to protect, not a total that goes stale. - Nothing on that page teaches sweetgrass. Six teachings from Indigenous organisations, institutes and nations, Ryan’s selection, each linked and credited with one line of ours saying what it is about — and nothing anywhere instructing anybody how to harvest, braid or burn it, because that is not ours to hand out.
- A correction we owe is on the page rather than in a commit message. Our own glossary attributes a framework called reciprocal ethical unity to Barry Lopez and he never wrote the phrase; Star Stuff’s zine No. 72 went and read the essay. The room is quoting from the pages that carry the error, so it says so near the top instead of further down. When two of our own pages disagree, the one that checked wins.
- Three of the four passages were checked against the mirror and one could not be. The sheaf, the braid of stories and “becoming indigenous to a place” are verbatim on our own Nature, Place-Based Education and Offline pages. The Cajete and goldenrod-and-asters passage is on no page of ours, and archive.org’s search-inside was unreachable and Google Books rate-limited every attempt, so it is published on Ryan’s word and the liner notes say so rather than letting it sit among the checked ones looking identical. Zine No. 72’s own caveat on a fourth is still open and is recorded too.
- Ryan’s ten seconds of backlit bunchgrass is in there, and it is not sweetgrass. He said so when he sent it. It is already published by us on the Nature entry, underneath the line about immediate contact with the outdoors, which is exactly the argument: place-based means the ground you are standing on, not the sacred meadow somewhere else. The plant is deliberately not named to species — nobody here determined it, and a plant named on a page reads as a determination.
- VideoPress is the third origin this site will build a frame for, and getting it there took two goes. It was added to
_headersby hand, confirmed in the file, and shipped — but that CSP line is generated bymake-csp.pyfrom a string literal of its own, so every later run put the old list back. The dev server serves no headers at all, so the room worked locally and the live site refused the frame; Ryan found it by pressing the button. The allowlist is one place now:love-embed.js’sORIGINSarray, whichmake-csp.pyreads to buildframe-srcandmake-sweetgrass.pyreads to refuse a bad URL at build time. Both refuse outright rather than falling back to a default if the array is missing, because a silently narrowedframe-srcis a room full of blank boxes and a silently widened one is a hole. - Verified in a network panel: zero iframes and zero external requests on load, with eighteen presses on the page; one press produced exactly one iframe, at the right URL, with the right referrer policy, and left the other seventeen alone.
- The field’s sign for the pitch needed a light of its own, because the two on that board are taken. The yurt emits and the hermitage catches, so this one is carried: fireflies low in the grass, many small lights and no source you could point at, with the path going in and a thread of smoke where the clearing is. The fire is not drawn lit, because from the treeline the grass is taller than the clearing and what you can see from there is what gets drawn.
- Two name collisions, one of them caught by a tool and one by six sudden failures.
check-classes.pyrefuses a custom property declared twice; and an unprefixedGLOWincheck-contrast.py’s own Python silently repainted the Faery Yurt’s ember composite, turning six of Helen’s pairs red in a room nobody had touched. That is the--leafcollision arriving in a second file. The newcomer was renamed, scoped to its own block. - Two layout faults the room’s own argument caught. The rule under each recording sat wherever its text happened to stop, so a row of two had its ground at two heights — in a room whose stated structure is that things stand on a line. Same for the three bundles of the braid. Both now fill their row and push the press to the foot.
- Two faults in one press, found by Ryan pressing a button. A facade is two elements — a
<button>before the press and a<div>after it — andlove-embed.jsgives the replacement only the classfacade, so anything the button was wearing evaporates. The portrait clip came out landscape and letterboxed; worse, the fire’s players rendered at 0×0 while the sound played, becausealign-items: flex-starton that column stopped the div stretching and the iframe inside it is absolutely positioned, so it contributes no size. The column defaults to stretch now and only the button opts out, and the portrait box is scoped from its container the way the Pebble Board already did it. Both had passed a check that confirmed one press produced one iframe at the right URL — which is a question about the DOM, where this was a question about paint. The rendered boxes are measured now: 16/9, 16/9 and 9/16. - Two faces nothing else here sets — Eczar, whose serifs flare like a blade opening, and Alegreya Sans, a sans with a handwriting skeleton still in it. Sixteen new contrast pairs and two measured ornaments. New:
data/sweetgrass.json,tools/make-sweetgrass.py. The room joinscheck-jukebox.py’s lists in the same commit that opens it. love.css gains §25 and the two cross-cutting sections renumber to §26 and §27.
2026-09-21 — The Mopery, and a facsimile this site is not going to copy
- The Mopery is open — a dark academia library, reading room and parlour, with two rooms behind it. Ryan’s brief: goth, brooding, vampire librarian, used book shop, moon phases, eldritch tomes.
- It is the first COLD enclosed room on this street, and that is the whole reason it can stand beside the other four. The Faery Yurt, The Latibulum, The Den and the Hermitage’s cave are each lit by one warm source and the light reaches the walls — canvas, plaster, panelling and curtain all go amber. This room has candles the whole way along every top shelf and the walls stay blue-black stone, because that is what a candle actually does: it lights about a foot of a very large room. Cosy is what those rooms are. This is what it is like to be let into a building after everybody has gone home.
- The type is the other half of it. IM Fell English is a face that was punched — Fell’s Oxford types with the ink spread and the battered counters left in — against the yurt’s Cormorant, which is high-contrast, clean and cut yesterday. Two warm serif rooms kept apart at the stroke rather than at the palette, which is the only place it holds.
- One scan is shown and one is pointed at, and the difference is a single line of metadata. The reading nook was meant to show a scanned page beside the text. The Library of Congress’s facsimile of The Raven in Poe’s own hand is the obvious candidate and it carries “reproduction prohibited without permission” along the foot of its own first leaf — that printing was made in 1949 for an exhibition at Yale, and loc.gov answers a script with a bot check rather than with its rights statement, so the notice is the only rights information anybody here had actually read. Copying it onto a CC BY-SA site would be relicensing somebody else’s asset under a licence it may not carry, which is the Penguin Pebbling problem with a different deck. Ryan then found one that says the opposite in as many words: an 1865 Tyndale & Mitchell printing, illustrations engraved on wood by Scattergood, digitised by Lehigh University and published by the Internet Archive under the Public Domain Mark 1.0. Three leaves of it are in the room and the whole book is linked. The facsimile is still linked and still not copied, and the nook says which is which and why.
- All twenty-six of Gustave Doré’s engravings are in the poem, from the 1884 edition by way of Project Gutenberg’s ebook #17192. Doré died in 1883, so they are out of copyright everywhere — the same test the Doomscroll applies to its poets. Ryan asked for them.
- Where each plate sits is our decision and the page says so. That edition printed the poem straight through and put the plates after it, each captioned with the lines it illustrates. Here every plate stands at the lines its own caption quotes, which is a reading decision rather than a reproduction of the 1884 layout — so the room states it rather than letting anybody assume they are looking at that book.
- And the captions caught a textual difference nobody was looking for. Matching twenty-six captions to stanzas by their opening words failed on exactly two, because the 1884 edition reads “’T is some visiter” where our text reads “’Tis”, and “Be that word our sign of parting” where ours reads “Be that our sign”. The captions are printed verbatim and the difference is left visible rather than smoothed out. Two printings of one poem are not one text, which is the fact the Doomscroll is built on and the reason The Darkling Thrush is not on it.
- Every image in the room carries alt text and the build refuses one that does not — twenty-six engravings, three scanned leaves and thirteen plates in the deck, each described rather than left as a rectangle. Two new mounts were measured while they were at it: the plates and the leaves sit on paper-coloured grounds, because a near-white engraving dropped straight onto blue-black stone floats with no object under it.
- The poem is set in whichever voice you like, and the picker holds every typeface on the street. That is the one place here where borrowing all of them is the joke rather than the failure: nothing of the Playhouse arrives when you read The Raven in Titan One, only the letterforms.
@font-faceis lazy, so choosing a face is what downloads it and a reader who never opens the picker never pays for one. The choice is not remembered between visits — the only thing this site stores is somebody’s tolerance, and quietly re-applying a typeface next week would be the page deciding it knew how you wanted to read. - One screen, many versions of one song, and tuning is not playing. The parlour carries Paint It Black nine ways behind two guttering candles — the Rolling Stones’ own record, then eight people answering the cello arrangement Danny Elfman and Chris Bacon wrote for Wednesday. The behaviour is the Hermitage’s television: with the screen off, previous and next fetch nothing, and the whole listing can be walked without a request leaving the page. Verified in a network panel — three tunings, zero requests, zero iframes; one press produced exactly one iframe at the right id on youtube-nocookie with the right referrer policy.
- Every cut names Jagger and Richards, and
make-mopery.pyrefuses one that does not. That is The Den’s rule arriving where it bites harder: eight of the nine are covers, the performer’s name is the entire draw, and a wall of covers is precisely where crediting only the voice would pass unnoticed. - Two things the link text got wrong and the data does not. One of those videos is played on a viola, not a cello. Another’s own description credits the song to “Mick Jagger (1943)”, which is his year of birth. And one is an acknowledged unofficial upload — the channel says so in the first line of its own description — so the room says so too, rather than dressing it up as a release.
- Every book can be borrowed before it can be bought, and the tool refuses a title with no way to. Nine novels, and not one of them is a book our own pages already argue from — the opposite of the Hermitage’s shelf, whose rule is that every spine has a citing page. This is a second-hand shop inside a library and a shop stocks what it likes.
- The links are searches and the room says why. Open Library’s pages and Bookshop’s product pages both answer a script with a bot check, so no product id was invented to paper over it. Every work id was resolved against Open Library’s search API and came back carrying the right title and the right author — the rule
data/hermitage.jsonrecords the hard way, where an id written from memory pointed at a different book in the file whose own header forbids exactly that. - No content notes, and that is a decision rather than an oversight. Ryan’s call, asked directly, with the dark romance on the shelf named in the question. Written into the data file so nobody “finishes” it later.
- The Oracle Deck asks and does not answer, and the build enforces it. Thirteen engravings between 1514 and 1891 with a question on the back of each. No reversals, no spread, no yes, no no, nothing about what is going to happen to anybody —
make-oracle.pyrefuses a card that does not end in a question mark and refuses the vocabulary of prediction outright. A deck on a Disabled people’s site that told somebody how their life was going to go would be doing the thing the rest of these pages exist to refuse, in the one room dark enough to get away with it, and it would arrive as a friendly edit from somebody who thought a question was a bit thin. - And nothing in that room is behind the dice. The whole deck is face up on the page; drawing moves a copy of one card into a slot. A room that made somebody gamble to reach its contents would have put its contents behind chance, which is the “lite version” mistake holding a deck.
- Every plate is from one collection, and the tool refuses one that is not. Dürer, Mellan, Piranesi, Meryon, Goya, Redon and Bresdin, all public domain works in the Metropolitan Museum’s Open Access collection, released under CC0 — which is what lets that page make one rights statement somebody could check instead of thirteen. CC0 asks for nothing; every card names its artist anyway.
- The Doomscroll is a feed of public domain doom on an actual scroll, newest first by first publication, back to 1609. The date is when it went public and not when it was written, and for a third of that scroll the two are decades apart: Hopkins sat in a friend’s desk for twenty-nine years, Hardy’s in a drawer for thirty-one, Dickinson’s until four years after she died, retitled and a stanza short. The tool sorts on the year rather than trusting the file, so an entry pasted at the bottom cannot end up rendered at the bottom of a feed that claims to be chronological.
- Every poem there is out of copyright everywhere, and that cost the scroll its best opener. The rule is the author dead more than seventy years, checked against the current year rather than a date written into the file. T. S. Eliot’s The Hollow Men would have sat at the top and is public domain in America; Eliot died in 1965 and it will not be in much of Europe until the 2030s. A site that serves everybody cannot publish somebody’s whole poem on a technicality that holds in one country.
- The Darkling Thrush is not on that scroll either, for the other reason: Wikisource’s page for it names no printing and carries its own banner saying the source document is unknown. These poems exist in several printings and they differ — the 1890 Dickinson is retitled and edited, the 1609 Shakespeare keeps its compositor’s slip. A text nobody can trace is the one thing a scroll built out of dates cannot carry.
- The zine table is the room the scroll could have collapsed into, and the split is the object. The zine is a photocopy: stark white, pure black, cut with scissors, scattered at angles, and the page is the sheet. This is foxed newsprint, warm and grey, one unbroken roll with nothing cut and nothing rotated, lying on a desk you can see the edges of. The blackletter sets the masthead and nothing else — never a headline, never a line of a poem, because eighteen lines of blackletter is an access failure wearing atmosphere.
- All three popups are clones of markup already on the page, not renderings of
data-attributes: one copy of every book’s note and every poem’s text in the document, so a shelf cannot disagree with its own popup. With scripts off, each room’s<noscript>unhides them — the library becomes a catalogue and the doomscroll becomes more itself, a very long scroll you keep going down. check-gentle.pycaught a decorative rotation before it shipped. The deck’s cut-rule lozenge was a square turned 45°, which is indistinguishable from a room’s tilt outranking somebody’s Gentle setting, because all that tool can see is the computed matrix. It is clipped out of a square now — the same callarcade.jsmade when it moved its sprites withleft/toprather thantransform.- And
check-counts.pycaught two totals, one of them in a note about Piranesi’s prisons that had nothing to do with this street at all. - Six faces nothing else here sets, forty-three new contrast pairs and four measured ornaments. New:
tools/make-mopery.py,tools/make-oracle.py,tools/make-doomscroll.py,mopery.js,oracle.js,doomscroll.js. The Mopery joinscheck-jukebox.py’s lists in the same commit that opens it. love.css gains §22 to §24 and the two cross-cutting sections renumber to §25 and §26.
2026-09-21 — a noticeboard that is not a shopfront, and a rule that failed the person it was written for
- The Pebble Board is street furniture, not a storefront. A room on this street is permanent and singular; a board is defined by being replaced, edition after edition, with the old ones kept. A shop whose entire stock is swapped out every gathering is a periodical, and giving it a shopfront would quietly have made every other shopfront look temporary. So it stands on the pavement outside the shops, in the same category as the signpost to the campgrounds. Your Room also already holds the one community storefront, and that one means something exact: one person decorates one room.
- The frame is constant and the paper is not — the second place on this street where two pages are meant to resemble each other, and the second is not a licence for a third. A noticeboard, like the Arcade’s cabinets, is one body with different things behind the glass. Each edition still gets its own share card, because the card is where the shortcut would be invisible.
- The first edition is Norah Hobbs’s, collected at a gathering on 2026-06-25 and built by her in the block editor before being rebuilt as a page. The cream, the tape, the tabbed drawers and the wording are hers. Two of her three typefaces were substituted and one was kept: Caveat is the Faery Yurt’s hand and Special Elite is the Zine Table’s typewriter, so a punk-paper noticeboard set in the zine’s own typewriter was the exact collapse this street refuses. Atkinson Hyperlegible stayed, because it is the Braille Institute’s low-vision face and swapping the body text would have been an access regression rather than a style choice.
- Twenty-one hotlinked thumbnails became twenty local files, and the security header did not move. The page arrived pointing every card at img.youtube.com, which
img-src 'self'renders as a broken image — and loosening the policy to let them through would have asked Google for a picture on every card the moment the board opened, telling them who was reading it before anybody pressed anything. Cached at build time instead. Verified in a network panel: every request on load is same-origin, and one press produced exactly one iframe at the right id with eighteen buttons untouched. - Two of the twenty-one videos were not what the board thought they were, which is the argument for resolving ids rather than trusting them. OK Go’s “And the Adjacent Possible” had gone private since the gathering; the entry is kept in the data with what was measured, the way the Jungle Room keeps its dead cams. NEONI’s “Carry On Wayward Son” plays and refuses to embed, so it is a door dressed as a door rather than a play triangle that cannot play.
- Four images came off and their cards stayed on. A screenshot of the City of Austin’s Facebook post wrapped around a crowd of about forty identifiable strangers at a Pride event; a screenshot of an Instagram story carrying somebody’s phone status bar; a foundation’s product render credited as a photograph of two people wearing it. Two widely-reproduced memes were dropped for having no attributable source. The stories are all still there, in our own words, which is what the cards were carrying anyway.
- No total. The board arrived saying how many things had been collected.
check-counts.pywould have refused a typed one and a generated one would have passed — and still been wrong, because the pebbling cabinet refuses a tally on the grounds that pebbling is explicitly not about volume. Same practice, no game in the room, same answer. - A lightbox, because a watercolour spread at 250px is not a watercolour spread. A native
<dialog>, so the focus trap, the inert background and the return of focus are the browser’s rather than ours. The description is shown as words under the picture rather than only announced, so it reaches everybody. Escape is handled explicitly anyway: with the lightbox open and focus inside it, a real Escape keydown arrived undefended and the dialog stayed open. That may be an artifact of the browser it was tested in — but a modal a keyboard user cannot leave is not a thing to take on trust, and the fix is four lines. - A rule was rewritten because it failed the person it was written to protect. This site said flatly that it does not publish photographs of children, reasoning that a parent can consent but the child cannot take it back in ten years. That reasoning was sound and aimed at the wrong case: it read as a ban on a teenage volunteer consenting for herself, and would have taken her own activity off the board while leaving the two adults standing beside her on it — which is what nothing about us without us exists to refuse, and that motto has no lower age bound. What carries over unchanged: the consent must be the young person’s own and a parent’s does not substitute for it, withdrawal is deletion and works for them exactly as for everybody, and somebody too young to give that consent themselves is still not published with no parental override. Ryan’s call. Rewritten on the terms page and in the data; the old decision is marked superseded rather than deleted, because the old reasoning is why the new one has to say which case it is about.
- A consent record is not a booking for Enid’s wall. Every photograph here used to hang there, so “has an entry” and “is on the wall” were one fact. The board’s are the first that belong to another room only, and hanging them on her wall to satisfy a bookkeeping rule would have been a tool curating a room it is not about.
make-polaroids.pykeeps the whole contract and only declines to build the polaroid — and refuses outright if a photo is off the wall and published nowhere else. - Sharing a drawing at a gathering is not publishing it. Community artwork now records its maker’s permission as a fact separate from the maker’s name, and
make-pebble-board.pyrefuses without it — make-polaroids.py’s rule about photographers, arriving for the people who draw. - New:
tools/make-pebble-board.pyandpebble-board.js. The board joinscheck-jukebox.py’s lists in the same commit that opens it, every edition rather than only the current one, because a dead link on a back issue is worse than one on the page people are reading. love.css gains §21 and the two cross-cutting sections renumber to §22 and §23.
2026-09-21 — Club Chronic, and the room that refuses the one effect it obviously wants
- Club Chronic is open. Freaks to the front: punk music and punk community, the story of scenes that built their own doors, every playlist we keep pasted up by the entrance, and a rack of records along the back wall. Ryan’s brief.
- It does not strobe, at any setting, and the room says so on the door. A punk club has exactly one obvious ambient effect and it can cause seizures. That looks like the campgrounds’ rule and is a different rule — the field is still because quiet is what it is for, and this room is still because the obvious idea here hurts people. A room whose whole argument is come in as you are cannot have a light in it that puts somebody on the floor. MAX GLITTER buys nothing in here and the copy says that is on purpose rather than unfinished.
- And it says out loud that a loud room is itself an access barrier. Volume, crowds, no exit, no quiet room, no seat — for a lot of us the gig this room is about is unsurvivable. A scene that lets anybody in and then builds the only entrance out of volume has not finished the job. The honest thing about this being a page is that you can leave mid-song and nobody notices.
- The zine table is the room this could have collapsed into, and the split is structural. Both are punk, both are photocopied, both are made of paper. But the zine is one sheet you hold, cut up with scissors and scattered at angles, and the page is the paper. This is a hundred small rectangles pasted onto a black wall, flat and overlapping, because that is what a wall by a venue door does over years — collage as sediment rather than collage as violence. One sets a typewriter and a handwriting; this sets a condensed display face, because a flyer crams a whole bill onto one sheet, and a marker that went over the paper rather than being it.
- The selection in the rack is not ours and the room leads with that. Six racks, their order and their themes come from It Take a Joyful Sound on Star Stuff. Every note was written for this room rather than lifted from that page, which is
make-readings.py’s rule about the glossary applied to a sibling site: two of our own sites reciting the same paragraphs makes an argument you can only follow by having read the other one. The essay is linked and is the better thing. - Thirty-six ids, every one checked on its own watch page before it went up — status, embeddability and length — and every title and channel resolved against YouTube rather than taken from the link text they arrived with. All thirty-six play, all thirty-six can be embedded, and every button says how long it runs before you press it.
- Spotify is the first frame on this street that is not YouTube. The signature playlist is on both, and the Spotify one is the complete version, so the stage carries both. That cost an origin in the Content-Security-Policy and one in
love-embed.js’s own allowlist — and the generator checks the same list a third time, because a URL that is in neither renders as a blank box with no error anywhere. Three places on purpose: the browser enforces one, the script enforces another, and the build refuses before either can show somebody nothing. - Neither playlist says how long it runs, and
make-club.pyrefuses one that does. A song has a length; a list somebody keeps adding to does not, and storing today’s total publishes a number that is wrong next week and authoritative in the meantime. That ismake-jungle.py’s rule about live cameras arriving on a record shelf — and this is the first room that holds both halves at once, requiring a runtime on thirty-six objects and refusing one on two others, in the same tool. - One builder still makes every embed. The playlists need a whole URL rather than an eleven-character id, and a builder that accepts any URL is a hole — the id check was always really refusing to point this site’s frames somewhere nobody chose. So the URL form is allowed and checked against a list of origins.
- The counter caught a stale claim in the new stylesheet before it shipped, where a comment called this the second room whose type runs both ways. Rewritten to stay true however many there are.
- Three faces nothing else here sets, twenty-five new contrast pairs, and one colour retuned: red on flyer paper measures 2.91, so the siren stays on the wall and never touches the paste-up. The staples measured 2.00 and are their own darker grey now — a fixing you cannot see holding up a thing you can.
2026-09-20 — the thirteen unmeasured colours, and a gold room that had been rendering green
- All thirteen are resolved, and resolving them found a live bug in two other rooms. The list came from a note this site started printing after a colour in the contrast checker drifted from the stylesheet. It is a refusal now: every colour declared in
:rootis either measured or named with a reason, and nothing else gets in. - Five were a palette the pebbling cabinet outgrew. That room once kept its six carryable things in
:root; then it decided every fill had to clear 4.5 against the outline that draws it, which squeezed them all light, and the new values went intopebbling.jsbeside the shapes they fill. The dark originals sat on afterwards, declared and painted nowhere — a palette that looked like the source of truth and had not been true since. They are deleted. Every colour the game actually paints was already measured. - One carried text and nobody knew.
--peb-glasswas the shore’s START button on hover — a real text ground — and it was named after the sea glass in the game, which is a different green entirely. Renamed--peb-pressand measured: 4.72, which passes. The misleading name is why nobody had looked. - One was Helen’s ivy, and one was her ember. Both are painted with hexes written inline in her page, the way her crown is, so nothing here had ever named them. Her own copy says the ivy came in through the window frame and was never asked to leave, which is as clear a statement as a room can make that you are meant to see it. Measured on all four of the yurt’s grounds: ivy 3.9 to 4.9, ember 6.0 to 7.5.
- One was a brand strip on the campfire’s television at 1.54 against its own casing. Invisible ornament is not ornament; it is lightened until you can see it.
- The rest are ornament that carries no text, exempt with their measurements written down rather than waved through. The Chappell’s four stained-glass colours sit at 1.75 to 2.46 on the nave, and they are deep because stained glass is — lifting them to 3:1 would not make the window clearer, it would make it not a window. The campground’s post and board frame at 1.48, in a field that is deliberately the dimmest ground on the street and whose type carries all of it. The dark half of Helen’s ivy at 2.53 against the ivy it shades, which is two tones of one drawn plant. The plank under her bookshelf is at 1.38 and is left as she drew it, with the number recorded so the next person finds a decision rather than an oversight.
- And then the check found two custom properties declared twice in one
:root. The Solarpunk Hermitage had taken--leaffor its green and--skyfor its daylight, and both names were already in that block:--leafis The Chappell’s gold leaf and--skyis the pebbling shore’s overcast. A duplicate there is last-wins and silent, so for as long as that was live a gold room rendered green and a grey sky rendered blue, in two rooms nobody had reason to reopen. They are--sproutand--dayskynow. - The same collision had already been caught once, in the contrast checker’s own Python, and fixed only there. Nobody thought to look for it in the stylesheet, because the Python failed loudly and CSS does not fail at all.
check-classes.pyrefuses a custom property declared twice now, alongside the class names and the section numbers — three kinds of name in one file, all of them last-wins, all of them silent. - The coverage check was vacuous on its first pass and was rewritten. It scanned the whole source for a colour, which meant the exemption list counted its own entries as measured and the run passed while doing nothing at all. It reads the pairs now, and it was tested by adding a colour, by changing one, and by putting a hex in a comment — refusing the first two and ignoring the third, since that block quotes colours in its own prose.
2026-09-20 — the set said it was off while it was on, and the stylesheet was the one lying
- Ryan found the television reporting the wrong thing about itself. A column of text beside the running video announcing THE SET IS OFF, overflowing its own box, and sometimes naming a different programme from the one playing. Three symptoms, and underneath them one bug and a half.
- The bug:
[hidden]loses. The browser’s own rule for the hidden attribute is[hidden] { display: none }at specificity (0,1,0) — which any ordinary class rule that setsdisplayties with and then wins, because it comes later in the file. SooffPanel.hidden = truedid nothing visible. The script was correct and the stylesheet was overruling it, silently. The panel had never once been hidden. - It was the third time in one room, which is the actual finding. The way-out link had it, the play button had it, and both were patched one selector at a time — which is exactly how the whole off panel was left still waiting to be found. The guard is in §2 now, for everything on the street, and the per-component patches are gone: doing it per component is what hid the third one.
- And the half: the panel was only ever written on the path that does not play. Retuning while the set was on built a new player and left the panel holding whatever had been tuned the last time it was off — so the stale text Ryan saw was not a rendering artefact, it was a real second bug wearing the first one’s clothes. What the panel says is derived from the tuned channel on both paths now. A panel that is only correct on one of two paths is a panel that will be found wrong.
- The overflow was real too, and the fix is that 16:9 is a floor rather than a ratio. A channel title runs to a hundred characters; at phone width that is four lines, and with the runtime and the button under it the panel wanted 215px inside a 152px screen — putting the one control that matters below the bottom of the set. Scrolling inside a television to find the play button is not a fix. The screen is a grid now whose row takes the height of the tallest thing in it, so the set is exactly 16:9 on every channel at normal widths and grows only on a phone, where 16:9 would be too small for the card to fit in. Nothing is truncated and nothing is unreachable, which matters more than a set that never moves.
- The runtime and the play button moved onto one line, because they are one sentence — how long it runs, and the control that starts it — and because it saves the set a whole row of height where the room is tightest.
2026-09-20 — one television instead of twelve, and two sections numbered twenty
- The campfire is a room now rather than a grid. Green shag, three bean bags in colours nobody agreed on, a wooden coffee table with rings on it, and one shared television the chairs are all pointed at. Ryan’s brief. The twelve separate players are gone; the listing moved into a Channel Listing that opens and closes, and the set plays whatever you pick.
- Tuning and playing are two different things, and the set keeps them apart. While it is off, previous and next move the channel in silence — the screen says what it is on and how long that runs, and nothing is fetched. You can walk the entire listing without a single request leaving the page; verified in the network panel at five channel changes, zero requests, zero iframes. Once it is playing, changing channel changes the picture, because by then you have asked for a television and pressing play twelve more times would be a worse room and no more consented.
- The dial says where it is going before you press it. A next button that only says “next” is the one place this design could have quietly broken the rule that every control on this street names its runtime first — so the slip of paper beside the buttons names the channel it is about to tune to and how long that one runs.
- The channel that cannot be embedded is not skipped. It sits in the running order like everything else, and reaching it turns the screen into a door: the play button disappears, the runtime says this one will not play here, and a way out to YouTube appears instead. Stepping silently over it would hide a fact about somebody else’s permissions that this room states out loud everywhere else.
- One place builds a YouTube iframe, and now two things call it. The set retunes, which the press-to-play plate never had to do — but a second copy of those attributes is one copy that gets a
referrerpolicyfixed and one that does not, silently, in the security-relevant half of that file.love-embed.jsexposes the builder and keeps the contract in one place. Writing that exposed a hoisting bug on the way: naming the local variableframewould have shadowed the function it was calling one line above, andnode --checkpasses that happily because it is valid syntax. - The bright chairs cannot carry themselves. Every one of them measured under 2.3 against the rug — a chair you cannot pick out of the carpet, which is the Jungle Room canopy arriving as upholstery. So every object in that scene is carried by its outline, measured against the rug on one side and its own fill on the other. The television is the single exception: it is dark enough to separate from the rug by itself and a dark line round it would only muddy it.
- And the coffee table cannot carry a sentence in either direction. Body copy on that wood measures 3.29 in the dark ink and 4.20 in the pale one, both under the threshold. It is furniture, not a surface to set type on, so the explaining sentence came off the table and onto the page; what stayed is the buttons and a pale slip of paper, which carry their own grounds with them.
- Two class names were already taken, twice.
.tellyand.dialsare The Latibulum’s wireless and television, and.tuneris its tuning scale —check-classes.pyrefused all three in turn. The repair went wrong in a way that tool cannot see: renaming across the whole stylesheet instead of one section rewrote the burrow’s own selectors, leavinglatibulum.htmlwearing a class with no rule anywhere. A class nobody styles is exactly the check that file deliberately does not make, and for good reasons it states. The section was restored verbatim from the last commit rather than patched again. - And underneath all of that, two sections numbered §20. The Hermitage was added with the number Print already had, and dropped in between §18 and §19 — so every cross-reference by number in that file had two places to land.
check-classes.pyread both and reported collisions as “§20 and §20”, which looked like a display bug. It refuses a duplicate or an out-of-order section number now, and the file runs in sequence again. - A colour in the checker had drifted from the stylesheet.
--cedarwas lightened so a drawing’s outline would pass, andcheck-contrast.pykept the old value — so one pair in that file spent a commit measuring a colour that was no longer on the site. It is fixed, and every run now prints which colours declared in:rootthe checker has never heard of. There are thirteen, all pre-existing; they are reported rather than refused, because some are genuinely decorative and one is a variable nothing uses at all, and a checker that blocks a deploy on somebody else’s unfinished decision is the wrong shape. - The three chairs have something on each of them, and each names a real entry in our glossary. Stimming, parallel play — being alone together, which is what three chairs and one screen and no obligation actually is — and stim-watching, which is Jim Irion’s term and his account, and is the reason nobody here will ask why you have put the hummingbirds on for the fourth time. Two of the three carry somebody else’s words and say so on the chair.
2026-09-20 — three benches in the Hermitage, and a check that stopped guessing at Latin
- The watering hole is open, which finishes the room. Three tables pushed together under the long window: a herbarium, a solar bench, and a table of Star Stuff. A watering hole is where you learn from the people next to you, so nothing on these benches is a lesson — it is somebody else’s work left out where you can pick it up.
- One room, three postures, and that is what keeps the three zones apart. The cave is enclosed, round-cornered and dark and you are sitting in it. The campfire is seated too, and its cards are rounded because a bean bag has no corners. The workshop is flat-topped and square — worktops with a lip at the front, things laid out on them, and you are standing up.
- Every specimen in the herbarium is there because one of our own pages argues from it, and
make-hermitage.pyrefuses one that is not. Dandelion, tulip and orchid off the sensitivity metaphor; a bamboo rhizome for Helen Edgar’s Autistic Rhizome; a fern frond because it is the picture our glossary reaches for to explain a fractal; moss, lichen, mycelium and an envelope with nothing in it, off four Star Stuff pieces. There is no sunflower, although sunflowers are the plant growing outside the door — we have no page about them, so there is nothing to press, and the table says so. - Nothing in it is named to species, and the check that enforces that had to be thrown away and rewritten. A Latin binomial typed from memory is a taxonomic claim nobody checked, wearing the one kind of authority a herbarium sheet has. The first version looked for Latin endings — and missed Taraxacum officinale, the single most likely binomial to end up on this table, then missed two more after two rounds of widening, while every widening walked it closer to firing on ordinary prose. A tripwire that is allowed to miss and at risk of crying wolf is the worst of both. So the shape is the check now and the English words are the allowlist: a name of one capitalised word and one lowercase word is refused unless the second word is one this table has declared. That catches every binomial rather than the ones somebody anticipated, and it costs one word added on purpose when a plain name like fern frond arrives. All of this was found by putting a binomial in on purpose, which is the only reason any of it is known.
- The solar bench is books and videos about the thing on the roof. The videos came off our own Solarpunk entry and the reading off our own Electrify Everything — which is the only item on any of these three tables that we wrote. Every id was checked on its own watch page and every title and channel resolved against YouTube rather than taken from our link text, which mattered here: our glossary credits the first of them as “ft. @Andrewism”, and the channel that published it is Our Changing Climate. Two different facts, and only one of them was written down.
- Griffith’s Electrify is the second id in this file resolved by search rather than lifted, for the same reason Care Work was, and it was requested and answered before it went up. Twice in one room is a pattern rather than an accident: our pages name an author far more often than they link a book.
- The Star Stuff table refuses anything that does not point at starstuff.earth. A bench with somebody’s name on it holding something else is a mis-filed thing that reads as a claim. Six pieces, all linked out and none reproduced — including A Field Guide to the Ways of Being Alone, which says a lone wolf is not an outcast but a disperser, and is the keystone of this whole pitch arriving from the sibling site rather than from us.
- Three of the herbarium’s sheets come off pieces on the third table, and they say so. That is what a workshop with three benches in one room looks like, and it is the argument for putting them in one room rather than three.
- Nine new contrast pairs, including the first ground on this street that is a lighter card on a darker surface — a pressed sheet laid on a worktop, which is the opposite way round from every card here. 338 pairs, none failing.
2026-09-20 — the first daylit room on the street, and a laptop that frames the street inside it
- The Solarpunk Hermitage is open, on pitch 03 at the far end of the campgrounds. Ryan’s own place: a wood cabin on wheels bristling with panels, sunflowers taller than the door, an aerial going up out of the quiet.
- It is daylit, and that is the whole of its separation from everything else here. Every other world on this street is a dark ground with light put on it — neon on black, candle on canvas, lamp on earth, a screen in a dark arcade, shafts through a canopy. This one is the morning. A cabin that runs on the sun and reads as midnight would be an argument against itself, and the panels on that roof are the reason the lamp in the cave never gutters. It also means the arrival works twice in opposite directions: out of the field’s cold dusk into a lit tent at pitch 01, and out of the same dusk into full sun at pitch 03.
- The cave, the campfire and the watering hole are David Thornburg’s and are named as his. They are the primordial learning spaces from From the Campfire to the Holodeck, which our own glossary documents: the cave is where you learn from yourself, the campfire is where you learn from a storyteller, the watering hole is where you learn from peers. Taking a framework’s shape and not its author’s name is the failure this site keeps attribution for. There is a fourth, Life, where you make something out of what the other three gave you; the room says out loud that it is not in here, it is the door you came in by.
- And the argument the pitch stands on is Betsy Selvam’s. Lone wolfing is being alone well rather than being left out, and that distinction is hers, credited by name in the room and in the liner notes, not folded into our “we”.
- The cave is the hardest room this street has had to keep apart from its neighbours. It is the fourth warm enclosed space here, after the Faery Yurt, The Latibulum and The Den — and “it is a cosy reading nook, it should feel like the other cosy places” is the Latibulum argument arriving a second time, which is exactly when it stops sounding wrong. Three structural things keep it: the other three are each lit by one flickering source in the dark and this one is evenly lit at reading brightness, with the candles as ornaments on a room that does not need them; the others are canvas, earth and panelling and this is textile, with no wood and no straight edge in it but the shelves; and you reach the others out of the cold, while you reach this one out of full daylight and it is darker than where you came from.
- Every book on those shelves is one we already argue from, and each says which page of ours put it there — read out of the Knowledge System mirror’s own frontmatter rather than typed. Butler, Baldwin, Thornburg, brown, Kropotkin, Piepzna-Samarasinha, Chapman, Totton, Silberman, Kelly. A borrow link is required and a buy link is not, and
make-hermitage.pyrefuses a spine without one: our library page says knowledge is infrastructure and access to it is mutual aid, and a shelf that could only tell you where to buy would be a shop with an argument painted on it. - One of those ids was assembled from memory and was wrong, in the file whose own header says not to do that. Care Work is the one book our pages link without an Open Library id, and the id written for it pointed at a different work entirely. It was caught by checking, resolved against Open Library’s search, and the whole episode is written into the data file rather than quietly corrected — every borrow and buy link in there was then requested and answered before any of it went up.
- The campfire is Ryan’s list of documentaries and nothing on it was chosen in this repo. Every id was checked on its own watch page — status, embeddability and length — and every title and channel was resolved against YouTube rather than typed off the links that arrived. Every button says how long it runs before you press it, and
make-hermitage.pyrefuses one without a runtime, which is the exact inverse ofmake-jungle.pyrefusing a cam that has one. A live camera has no length to give and a film does; the two tools keep the same promise and must not be made to agree. - One of the twelve plays and cannot be embedded, which is the Jungle Room’s lesson arriving in a new room from a new list. It is published as a door out rather than a screen, shaped like a door so it does not promise a picture it cannot show, and saying why on its own face. Its title and channel came off the watch page, because YouTube’s oEmbed refuses it too.
- The laptop in the cave frames stimpunks.love inside stimpunks.love, and it is the real street — you can walk down it from in there. It still waits to be pressed, for a different reason than the jukebox facades: nothing third-party is involved, but a whole copy of the street loading itself unasked means a second intensity dial underneath the first, every font served twice, and a screen reader walking the entire site again for somebody who came in to read a book.
- And it refuses to nest. A laptop showing the street is a laptop you can walk back into this room through, and the third one is not a joke any more — it is a page that will not stop loading and an accessibility tree nobody can get out of. A hermitage that finds itself already inside a frame says one screen is enough instead of offering the laptop.
- The security header had to change for any of that, and it is the only loosening in the policy.
frame-ancestorswas'none', which forbids this site being framed by anybody, itself included, andX-Frame-OptionswasDENY. They are'self'andSAMEORIGINnow. Clickjacking protection against every other origin is unchanged; what is permitted is exactly one page of ours embedding another page of ours, after a press. The reasoning is in_headersand intools/make-csp.pybeside the line that generates it. - The contrast checker had to learn a room that is dark on light. This is the first one on the street whose type sits on a bright ground all the way down, which inverts the usual failure: the dangerous inks here are the pale accents rather than the dim greys. It refused three things before the room shipped — the cabin’s outline on its own timber, the leaves drawn on the ground band, and a sunflower held to the wrong threshold — and it also caught a collision in its own source, where the new room’s green was named
LEAFand silently overwrote The Chappell’s gold, failing five of that room’s pairs. A checker catching a bug in itself is the argument for having it. 329 pairs, none failing. - Two faces nothing else here sets, because no two rooms on this street share a voice. Fraunces swells and curls; Sora is drawn on a grid with flat terminals. Tech and nature, set in type, rather than one of them in fancy dress.
- The watering hole has its benches in and nothing laid out on them. A herbarium, a solar bench and a table of Star Stuff, marked as what they are rather than hidden until they are ready — the same honesty the empty storefront and the zine’s empty line use.
2026-09-20 — two drawings on the campground’s board, and a pitch taken at the far end
- The field’s pitches have pictures on them now. A yurt sat against the trees with its doorway lit, and a wood cabin on wheels bristling with solar panels. They are what you can see of each pitch from the gate, which is what the board has said it is for since the field opened: read the sign before you go in.
- An open plot has no drawing at all, and that is the whole grammar rather than an omission. What is pitched is what you can see from here; bare ground looks like bare ground.
- They are signs, not rooms, which is the only reason two of them may sit on one board. Both are drawn in the field’s own inks — spruce and bark for the masses, moss for every line, weight rather than tint doing the hierarchy — because you are looking at them across cold ground at night. Neither one is a preview of the world inside it, and neither one may become one.
- What tells them apart is one lit colour each, and the two lights do opposite things. The yurt emits: candle amber out of the crown, out of the doorway and onto the grass in front of it, round and soft-edged and strung with lights. The hermitage catches: nothing on it glows except one window, the moon lands on its panels, three sunflowers hold the only warm colour on the pitch, and the aerial is the one line reaching off it. Round and warm against angular and cool. The rule for the next pitch is written beside them in
love.css: the field’s inks, one light of its own, and not either of those two lights, because they are taken. - And that one window is a screen rather than a flame, which is the pitch’s argument in the only place a drawing can make it. Lone wolfing is not being unreachable; it is choosing the reach. A hermitage lit by a candle would have been a nicer picture and a different idea.
- Nothing in either drawing moves, at any setting, like everything else out here. The yurt’s fairy lights twinkle on its own page and are still on the board, because this is the field’s drawing of the tent and not the tent.
- Pitch 03 is taken and has no door yet. The Solarpunk Hermitage, Ryan’s, at the far end — which is where the board already said it was for the people whose whole specification is distance from the street. It is a post with a sign and a drawing and no link, because a campground has that state and a website usually pretends it does not. The honest alternative was publishing a room before it was a room.
- The card stopped listing the pitches by hand.
make-og.pyhad the plots typed into a string literal, and again into the alt text, in the file whose entire argument is that a card must not be able to disagree with its page. It reads them off the board’s own posts now — middots on the card, commas in the alt text, because a screen reader reads a middot out loud — and refuses to build a field with no plots in it. - The drawings are measured, because WCAG does not reach them. The canopy in the Jungle Room is why: it came in at 2.18 against the ground behind it, a smudge with no telling one leaf from another, and nothing was looking. Ten new pairs — every line against open ground and against the ground band, both lit colours against the mass they sit on, the dark disc inside a sunflower, the glazing bars on that screen. 294 in the file, none failing. Holding one ink at one threshold is why there are ten and not thirty: a ladder of dimmer greens would each have needed arguing about.
- The drawing of Helen’s yurt is ours and is said to be. It is the field’s sign for her pitch, in the field’s inks, seen from outside in the dark; it changes nothing on her page. That is written into the liner notes beside her credit rather than left to be inferred, for the same reason the one colour of hers this site changed is written down in four places.
2026-09-20 — a door at the back of the Jungle Room, and the other Jungle Room behind it
- The Den is open, and it is an easter egg. There is no door for it on the street. The way in is a quiet line at the foot of the Jungle Room — the same shape as the door through to The Chappell, turned right down: a hairline, small type and the room’s dimmest ink, below everything else in the room. You find it by getting to the bottom.
- Quiet is a visual setting and not a perceptual one. That door is an ordinary focusable link with real words in it, in the tab order, at full size, read out by a screen reader like anything else on the street. On a Disabled people’s site a secret only a sighted mouse user can find is not a secret, it is an exclusion, so the floor is written into the stylesheet beside the rule: nothing hidden, no one-pixel target, no
display:none. - It is Graceland’s Jungle Room, which is a real room and a better joke than the pun. Elvis Presley’s den: Polynesian furniture bought after Blue Hawaii, fur over the seats, an indoor waterfall of cut field stone on the north wall, and a green shag carpet. People have been rude about it for fifty years. And in 1976 it was converted into a recording studio, and the bulk of his last two albums came out of it — From Elvis Presley Boulevard, Memphis, Tennessee and Moody Blue. That fact is what turns a pun into a room: a carpet is a joke, a discography made on top of one is a listening bench.
- Sixteen cuts, in the order they were recorded, with the night each one was made. Twelve from the February week and four from the three nights in October, ending on the last studio session of his life. The track list, the session dates, the songwriters and the album attributions came off the two albums’ own articles.
- Nothing was guessed and nothing was typed from memory. Each title was searched on YouTube, the candidates filtered to Presley’s official channels, and every id then checked on its own watch page — channel, playability, embeddability, length. Twelve are on the estate’s art-track channel and four on his VEVO. And every runtime was matched against the released one, because searching any of these turns up alternate takes on the same official channels: a room whose argument is these are the records that came out of that carpet cannot quietly hand somebody a rehearsal.
- The writers are named on every cut. Presley wrote none of these songs. Gatlin, Sedaka and Cody, Mark James, Dennis Linde, Fred Rose, Layng Martine Jr., Lloyd Webber and Rice, and the rest. A room that credited only the voice would be doing the one thing this site keeps attribution for, in the room where the performer’s name is the entire draw.
- Every button says how long it runs, and that is the parent’s rule inverted rather than broken.
make-jungle.pyrefuses a runtime because a live camera never ends;make-den.pyrefuses a track without one because a song has a length and withholding it keeps back the thing that lets somebody decide. Two generators, opposite checks, one promise. Read them together. - The hardest subroom yet, because this one shares its parent’s name and its parent’s colour. The Chappell at least did not sound like Pink Pony Club. So the split is structural and stated: upstairs the green is the darkness and the light falls from above; down here the room is brown, the carpet is the brightest thing in it, and the track list is set dark on the green. Same hue, opposite job. One is outdoors, open and has no straight edge in it; this is low, closed and rectangular, full of carved frames with the corners notched out. One sets a serif whose strokes swell as they curve; this sets a slab with no contrast in it at all, because one is a botanical plate and the other is a record sleeve from 1976.
- The share cards invert too, and had to. Its parent’s card is a dark green field with a roof of leaves and light coming down. This one is a brown panelled wall with a slab of bright shag across the foot and the type dark on it. If the two had not inverted, splitting them into separate cards would have bought nothing.
- And the contrast checker caught the thing the eye does not. A track card is a pane of cream at 78% laid on the shag, so the type on it sits on what those two make and not on the green — measured against the carpet it would have been measuring a ground no word in the room is actually on. The composite lesson again, arriving in the place it is easiest to miss, because the carpet is the thing you see. Twenty-seven new pairs, 284 in the file, none failing.
2026-09-20 — the critter cam comes back as a door, not a window
- Ryan sent a replacement for CritterVision’s Critter Cam, and it is not dead. The new id answers OK and was live when it was checked — but
playableInEmbedis false, on the same channel id as the one it replaces, with oEmbed refusing it with a 401 the same way. CritterVision has embedding switched off across the channel, so no id from them would come out differently. It is published as a way out to YouTube rather than as a screen that would show a refusal where the picture should be. - Which is the distinction that room was built around, arriving from outside it. Playing and embedding are two different permissions, and the obvious assumption — a working replacement is an embeddable one — is wrong here. The check is one line and it is now written into
CLAUDE.mdbeside the rule about not picking ids from this repo. - Nothing in the room is dark. Both cams that answered UNPLAYABLE have come back from the events page, both were measured before they went up, and both entries carry a
replacednote saying what was measured. The jelly cam came back as a screen and the critter cam came back as a link, which is the honest difference between them. - A door does not get pressed, either. Every plate in the room ended pressing is what sends the request, which is true of a screen and false of a link-out — following one is. It is generated per state now, and the three notes stopped repeating what the door already says on its own face.
- And the note in the room had to learn to say that. With nothing dark it said only that every cam is playing — true, and it would have let a reader assume they could all be opened here. It counts the link-outs in the same breath now. That is the second time in two days this paragraph has been wrong about its own grammar: the number word and the noun were glued into one lookup, so the first build of this sentence published “Three cams of them”. Two maps now, and both branches agree with their own counts.
2026-09-20 — the jelly cam comes back, and a generated number with hand-written grammar around it
- The Live Jelly Cam is in the Jungle Room again. Ryan sent a new id the same day the old one was found dead, which is the process working exactly as
DECISIONS.mdsaid it should: the ids on the events page are his, a replacement chosen in this repo would have been a cam nobody chose, and this one came from the person who curates the list. - It was checked before it went up. oEmbed returns the same title and the same channel, the watch page answers OK, and
playableInEmbedis true — so it is the same cam under a new stream rather than a different thing with a familiar name. That is written into the entry as areplacednote, because a replacement nobody checked is the original bug with a fresh id on it. - CritterVision’s Critter Cam is still dark, and the room now says so in the singular without anybody editing a paragraph.
- Which turned up a small thing worth keeping. The room’s note about dead cams generates its count, for the reason
check-counts.pyexists — and it generated the count while leaving the rest of the sentence plural, so one dead cam read as “One cam … has gone dark … The entries are … Replacing them”. A generated number in front of hand-written grammar is a sentence that goes wrong the moment the number changes, which is a hand-typed total wearing a better disguise. The whole sentence agrees now. The same edit went through the liner notes, which had the count typed out in full.
2026-09-20 — a viewing room under a canopy, and the one facade on this street that must not say how long it runs
- The Jungle Room is open. A door on the street that opens under a closed roof of leaves: light coming down in shafts, and screens cut into the shape of the gaps. Every screen is somebody else’s camera pointed at somewhere real, and every one of them is off until you open it. Ryan’s brief.
- The cams are our own events page’s, and so is the order they are in. Our Watering Hole Hangs puts one of these up in the background every weekday — no slides, no presenter, no outcomes — and this room is that list, in that page’s own groups and that page’s own sequence. It is a list somebody keeps, not one for this street to re-sort. The ids came off the hrefs, read out of the Knowledge System mirror rather than fetched live, because on stimpunks.org a 301 is a failure and not a pass. The train cams are deliberately not here: a cab view down a Norwegian line is a fine thing to hang about in and it is not a watering hole.
- And this is the one room on the street where a runtime would be the dishonest thing. Every other press-to-play control here says how long it runs before you press it, and
make-latibulum.pyrefuses a track without one, because that number is what lets somebody decide. A live camera has no runtime. The reflex arriving from three other data files is to store the length of whichever stream happens to be up today, which is a number that is wrong tomorrow and looks authoritative in the meantime — somake-jungle.pyrefuses a cam that has one, which is the exact inverse of the burrow’s check and the same promise. The label says the true thing instead: it runs until you close it. And the room says out loud that the picture may be darkness, rain, an empty waterhole, or a cam between streams, because a camera pointed at somewhere real is often pointed at nothing, and sitting with nothing happening is most of what the room is for. - Playing and embedding turned out to be two different permissions, and nothing here knew that.
love-embed.jschecks that an id is well-formed and builds an iframe; it cannot know that the video’s owner has switched embedding off. The frame loads and shows a refusal where the picture should be — a button somebody presses and presses that never becomes a video, which is the failuremake-chappell.pyexists to prevent, arriving through a door no checker was watching. Two of these cams are like that. They get a way out to YouTube, dressed as a door rather than as a window, saying why.check-jukebox.pyreadsplayableInEmbedoff the same fetch as the status now, for every facade on the street, and a cam already published as a link-out is not reported. - Two cams on our own published events page are dead, and that page does not know it. Monterey Bay Aquarium’s Live Jelly Cam and CritterVision’s Critter Cam both answer UNPLAYABLE. They render nothing here and the room says so in its own copy, with their names in it, because a gallery quietly shorter than the page it came from is this site correcting a published page by deleting the evidence. The entries stay in the data file with the date they were found dead on. Replacing them is a curation decision on the events page and not one this street gets to make on its own — Ryan’s call.
- Nothing was typed off our own link text. Every title and every channel was resolved against YouTube’s oEmbed endpoint, and the three ids oEmbed refuses were read off the watch page’s own owner name. None of these cameras is ours; attribution is the one careful habit this street kept, and a credit taken from a link somebody wrote by hand is a guess wearing a citation.
- It is night-green under a roof, next to a field that is night-blue under nothing. The campgrounds is the pairing to watch here the way the yurt and the burrow were last time: both are outdoors, both are dark, both are green. What keeps them apart is structural. The field is bare and open with the sky still on it and posts standing alone on the ground; this has a roof, and nothing in it stands alone because everything overlaps something. The field routes its lettering like a park sign, flat and incised; this sets a face whose strokes swell as they turn, because a rainforest is the one place where growing and thickening are the same verb. You are outside in one and inside the other.
- Every screen is a leaf — two pointed corners, two round ones, the same silhouette on the card and on the aperture, and the player is clipped into it when the button becomes an iframe. It is the reason thirty-odd rectangles of video do not read as a spreadsheet.
- The contrast checker found the canopy. The band of leaves across the top measured 2.18 against the ground behind it — a smudge, with no telling one leaf from another. WCAG does not reach ambient decoration and it was measured anyway, for the reason the Arcade’s quills were: a canopy nobody can make out is not a canopy, it is a dark strip pretending to be one. All three greens went up. Twenty-six new pairs, and every ink is held against the lit ground as well as the dark one, because the shafts land where they land and a word that only clears in the shade is a word somebody reads in the one place it fails.
- The light got a layer of its own, and the second reason is the one that mattered. Painted on the text column it stopped at the column’s edges and drew a hard bright line across the page under the canopy — a shaft with a lid on it. But at MAX the light shifts, and whatever carries the light is what fades: on the column, MAX GLITTER would have dimmed every word in the room by a tenth, twice a minute, in a room built for people who came here to stop being asked to work.
- The share card broke the fit checker, and the fix was in the checker.
make-og.pymeasures where ink lands and refused this card for a crop that does not exist: the canopy’s leaves hang off both sides of their band and are clipped by it, so their boxes run past the edge while nothing is painted there. It skips descendants of a clipping<svg>now — reading the computed overflow rather than assuming it, so this stays a statement about paint — which is the same narrow exclusioncheck-gentle.pymakes for transforms inside a drawing. It also caught a real one on the way:width: 100%resolves against the padding box, so the band’s negative right margin moved nothing and left a visible step 60px in from the edge of the card. - Two new faces, and the room is the reason. Yeseva One and Cabin, self-hosted and OFL like everything else here. Cabin is a variable font, so one file is stored and declared twice against the weight axis — the same as Nunito.
2026-09-20 — a burrow under the street, and three class names that were already taken
- The Latibulum is open. A door on the street that goes down into a hill: round door, lamp, thick walls, a wireless with one station on it, a tube television with one programme, and a shelf of things to do with a bodymind. Ryan’s brief, and his word.
- The word does both jobs already. Latibulum is Latin, and Lewis and Short give it as “a hiding-place, lurking-hole, covert, den, of animals” before giving the figurative sense and quoting Cicero calling a place the latibulum et perfugium doloris mei — the hiding-place and refuge of his grief. Ryan met it in a Walkabout Saga post; the room checks the sense against the dictionary rather than restating the post, so the two can be read against each other. In our own vocabulary it is a cave, the quiet end of a Cavendish Space, which is what stops it being a theme.
- It is the second warm brown room on this street, and that is the whole design problem. The Faery Yurt is also candlelit, also earth-toned, also built to hold somebody — and “they are both cosy, so they should feel the same” is the subroom excuse in a woolly jumper. The thing keeping them apart is structural rather than decorative: the yurt reads cream on dark all the way down, and almost every word in the burrow sits dark on a lit plaster wall. One is a pitched column of canvas with lights strung across it; the other is dug into a hill and has no sky in it anywhere. Two new faces for the same reason — a planed slab and a rounded sans, because a smial is carpentry and the yurt is calligraphy.
- The wireless is Adriel’s and stays where he put it. Ocean Waves is by Adriel Jeremiah Wool, a Stimpunk, and he has given us permission to use it however we like. It is a press-to-play facade anyway, because a permission is not a reason to take a copy of somebody’s seventy-four-minute composition off its own shelf, and because this street does not host anything musical. It is also not a recording of the ocean and the room says so: Ryan’s own line calls it a fractal composition of the nature of the ocean, and knowing that before you press it changes what you do with it.
- The television is a class you can take lying down. Annette of Itstimefitness, 22:45, seated tai chi and qigong — Repulse Monkey, Parting the Horse’s Mane, Cloud Arms — chosen for our own Campfire Learn Together on somatic practice. Everything in it is seated and not as a modification: as the design.
- The shelf refuses to be a checklist. Stretch, flap, fidget, meditate, stim dance, body scan, eat, drink, pee — lifted from our own Bodymind Break, and not one of them is a button. No ticks, no streak, nothing that notices which ones you did. A shelf that kept score would have turned a bodymind break into a small unpaid job, which is what the break is a break from — the same argument the pebbling cabinet makes about tallies, arriving in a room with no game in it.
- MAX GLITTER, down here, is one lamp breathing. Nothing in the room rotates at any setting, so there was no tilt to reset; the single animation is an opacity change over nine seconds on the lamp flame. The room says that on its own face rather than leaving somebody to turn it up and wonder whether it worked.
- And then the interesting bug, which was in the stylesheet rather than in the room. This site is one
love.cssholding a set of worlds that share nothing, and a class name is global whatever section it is written in. Four of this room’s names were already taken:.scrawlbelongs to the zine table,.shelfto the bookshelf in the Faery Yurt,.knobto the Arcade’s speed control, and.taglineto the street’s six-typeface masthead. Only one of them was visible — the burrow’s trail line came out in the zine’s Rock Salt, which is how it was noticed at all. The other three were quietly inheriting a timber gradient, a button’s border anddisplay: flexfrom rooms on the other side of the file. - So there is a checker for that now.
check-classes.pyrefuses a class claimed by two rooms’ sections oflove.css, and — the half that catches the.taglinecase, where the stylesheet is innocent and the markup is not — refuses a page wearing a class name another room has claimed. It is the CSS twin ofcheck-ids.pyand exists for the same reason: the browser applies the winner and says nothing. A third check was written and thrown away: a class styled inlove.cssthat nothing wears is real dead weight, and it cannot be told apart from a class a script builds through a helper, becausesvgEl('frond', …)inotterly.jsputs a class on an element without the word class appearing near it. It reported seven drawings that are on the screen right now, and a checker that cries wolf is one people stop running. - And it found three leaks that were already here, none of them new. Two rules belonging to the quantum room had been left stranded at the bottom of the file, after the print section, which is how the print section came to look like it was claiming
.fringe; they are back in their own room..scrawlturned out to be worn by the zine table, issue #2 and Enid’s room while living inside the zine’s section — three rooms on one class makes it furniture whichever section it was typed in, so it moved to §4 rather than being renamed twice. And the Faery Yurt’s tagline had been quietly takingdisplay: flexand a 940px max-width from the street’s masthead since the room shipped. That one is a class name and not a design decision, so it is.yurt-taglinenow; nothing of Helen’s moved, and the room renders pixel for pixel as it did. - The share card is two grounds. Earth at the top with the lamp on it and the round door drawn on it, a band of lit plaster along the foot carrying dark type. That inversion is the room rather than a flourish, and a card that left it out would be advertising a different room. New contrast pairs for both halves; the brass moved from
#C28F3Cto#E3BB6Abecause a knob measured 1.93 against the lightest of the three woods behind it — a knob you could not see on the cabinet it is screwed to. - The burrow’s two facades are in
check-jukebox.py. A room with two of them is exactly the size at which somebody decides a list is not worth adding to a checker, and a dead station in a room built for people who are already flat is the worst place on this street to find rot.
2026-09-20 — a pebbling cabinet, and the licence that decided what it could be
- Penguin Pebbling is in the Arcade. A shore, pebbles on it, three neighbours with nests. Walk into something to pick it up, carry it over, press GIVE. Every gift is taken and every one gets something different said back, because giving is how you find out who somebody is rather than a lock to pick.
- The first thing to say is that there is already a Penguin Pebbling game, and this is not it. Penguin Pebbling is thirty cards across all five locutions, by Helen Edgar and Ryan Boren, 2026, with Helen’s artwork. Go and play that one. The cabinet takes nothing from it — no cards, no prompts, no artwork, no five-locution structure.
- And the reason is a licence rather than modesty, which is worth writing down because it nearly was not noticed. The deck is CC BY-NC-SA 4.0. This site is CC BY-SA 4.0, with no non-commercial clause. An adaptation would have dragged NC onto a page that cannot carry it; share-alike means it could not be quietly absorbed; and relicensing is not ours alone to do, because half the authorship and all the artwork are Helen’s. So the cabinet is built on the locution — coined by Amythest Schaber (Neurowonderful), documented by Stimpunks in 2022, written up by Helen at Autistic Realms in 2023 — which belongs to the community. Two of our own things with two different licences is exactly the case attribution exists for, and it is the first time on this site that a licence has changed what a page is rather than what it says at the bottom.
- It refuses a count, and that is the locution rather than a difficulty setting. No tally of what you gave, no total, no streak, nothing at the end. The neighbours bring you things on their own clock whether or not you have ever given them anything — built as a timer rather than as a reward, because a gift that arrives because you gave first is a trade. A number beside a practice that is explicitly not about volume would quietly make it about volume.
- The pale screen is the only one on the street, and the contrast work is why the pebbles have shapes. Everything on a shingle beach is a mid-tone including the shingle, so nothing on this screen is carried by its fill: every pebble, penguin and nest is drawn with the same dark outline, and
check-contrast.pymeasures that outline against the three grounds and then each fill against the outline. That is the honest reading of WCAG 1.4.11, which asks about adjacent colours rather than about a fill against a distant background. But holding the fills to 4.5 against the outline squeezes them all light — and a narrow band of light tones is a narrow band of things nobody can tell apart. So the six things you can carry are six different shapes: a round pebble, a smooth one, a shard of sea glass, a speckled stone, a feather, a broken shell. Shape carries it, and the name said out loud on every pick-up carries it again. Thirteen new pairs, 195 in the file, none failing. - The card inverts too, and had to. Gold on a pale sky measures 1.9, so the type is dark on light — the only share card on this street that is. It was decided by a measurement rather than chosen.
- A duplicate id, and a bug that would have been much worse anywhere else. The penguin’s drawing sits in the page’s
<defs>as#pengand the player’s sprite was alsoid="peng", sogetElementByIdreturned the definition and the game threw on the first line ofstart(). It took thirty seconds to find because pressing START does something visible. The same mistake in markup nobody presses would have sat there, which is why the other cabinets’ cloned sprites were built out of<use>against one definition in the first place. All four arcade pages were swept; no others. - So there is a checker for that now, and it immediately found a worse one.
check-ids.pyrefuses a page that uses an id twice, and refuses a script that asks by name for an id no page loading it has. Run against the whole site it turned up seven elements sharingid="yurt-says"in the Faery Yurt —make-yurt-sound.pyhad been emitting a live region inside every sound tile, so six of them were dead markup that had never received a word, andlove.jsonly ever reached the first. It had been live since the regulation nook shipped and nothing had said so, because a duplicate in markup nobody presses does not announce itself. The generator emits one shared region now. Broken on purpose with both real bugs put back; it named both. - Two things found by looking at the screen rather than by any check. Every penguin was the same size on the same line, so there was no telling which one you were steering — the neighbours are drawn smaller and staggered up the beach now, and you are the one in front. And the nests were single filled ellipses that read as puddles the penguins were standing in; a nest is a rim with a hollow, which is also what the animal actually builds.
- And an honest note about the penguins, on the page. Adélie and gentoo penguins do build nests of stones, carry them about, and steal them from each other. The tidy romance — one penguin choosing the perfect pebble for its beloved — is the popular retelling rather than the finding. The locution is named after the image and is not weakened by that. A metaphor does not have to be a finding. There is no stealing in the cabinet, because the game is about the locution and not about penguins.
2026-09-20 — a second cabinet in the Arcade, in which floating gets you nothing
- Otterly Adorbs. You steer an otter round a kelp bay. It twirls, somersaults, dives and floats on its back; three other otters keep their own rhythms; fish come through at feeding time and go again. Ryan’s proposal, and the name is his.
- It turned out not to be a blank sheet, which changed the design. The Stimpunks Solidarity Session has been leaving an otter cam running every Saturday for months — cameras on or off, some speaking, some in text, nobody has to watch. Helen Edgar wrote down what that was doing for her in Stimpunks Solidarity and Otters, and Star Stuff built The Stone You Keep (No. 58) on top of it, sourced to the primary literature. So the cabinet is built out of findings rather than out of charm, and
otterly.jsnames the paper beside each one. - Floating fills nothing up, and that is the single sharpest constraint in the build. No meter, no stamina, no bonus afterwards — the cabinet says so out loud the first time you roll over. Zine No. 58 refuses rest so you can produce in as many words: the otter is not recharging in order to forage better tomorrow. The friendly version of this game rewards resting, and the friendly version would have put a sentence on this page that another of our pages spends a spread refusing. It is written into
CLAUDE.mdso the next well-meant improvement gets stopped. - A clam takes between 6 and 88 presses, and those are the real numbers. Two observers at Point Lobos in 1964 watched thirty instances over six days: a mussel took a mean of 35.5 blows, range 6 to 88 (Hall & Schaller). The game rolls in that range unrounded and reports your number with no target beside it. The urchin opens in a couple of goes and a stone does not help with it, which is Law et al. 2024 — some otters never carry one, because they are on the prey that does not need one, and the ones who do carry one keep their teeth.
- Nothing ranks the other three otters. Under food limitation a real population does not converge on one best way to be an otter; it fans out into specialists, each measurably better at its own thing (Tinker, Bentall & Estes, 2008). One of ours mostly floats, one mostly dives, one mostly turns in circles, and there is no scoreboard for any of it.
- The kelp does the holding. Float in the fronds and you stay where you are; float in open water and you drift. That is co-regulation stated as physics rather than as a metaphor, and it is the one mechanic that is also the reason the Saturday session works.
- It follows the zine’s correction rather than our own changelog. stimpunks.org’s week-28 entry describes the otter keeping “a favorite stone tucked in a pouch of skin” and returning to it “again and again”. No. 58 went to the primary and found the lifelong favourite rock in an armpit pouch is a popular retelling; what Hall & Schaller support is a stone kept and reused across successive food items within a bout of feeding. The game does the second thing. When two of our own pages disagree, the one that checked wins.
- A twirl is drawn frames, not a rotation, and that cost real work. Rotating the sprite would have been three lines — and would have made the room’s own comment false, because
check-gentle.pyreads rotation out of the computed matrix and this room says in its stylesheet that there is nothing there to read. So the otter has five drawn poses and a trick is a run through them. The angled poses are rotated, inside their own<svg>, where a transform is part of the picture the way a path’sdis. Frame-swapping is also what an actual cabinet did. - The contrast checker found the seabed. It measured 1.10 against the water above it — invisible — and lightening the floor until it cleared 3:1 started swallowing the cobbles and the urchin that sit on it, which are the things a player reaches for. So the boundary is carried by a line instead, at 8.44 on the water and 9.25 on the bed. The information is “here is the floor”, and a line carries it perfectly well. Nineteen new pairs; 182 in the file, none failing.
- Buoyancy was winning an argument the player was trying to have with a clam. An otter is buoyant, so doing nothing takes you up — at the first setting that was about eight per cent of the bay a second, and it pulled you off the bed before you could pick a stone up. It is a quarter of that now, and it stops entirely while you are working on a shell, because an otter cracking something is holding itself there.
- Then the room split, and the share card is what decided it. Both games lived on one page for about an hour. Which meant a link to the otter game unfurled as a picture of a porcupine — the exact fault
make-og.pyexists to refuse, being committed by a room against its own second game. The Arcade is a foyer now, with the cabinets standing in it under lit marquees, and Quill Drift and Otterly Adorbs are pages with a machine on each. Three cards where there was one, and the two new ones are the screens: a flat dark field with Esmx and loose quills, and a kelp bay with an otter on its back. - Those three pages share a carpet, a marquee, a cabinet build and a pixel face, and that is correct here. On this street that normally reads as the tidying instinct winning, so it is written into
CLAUDE.mdbefore somebody either “fixes” the similarity or cites it as licence to harmonise actual rooms. An arcade is precisely a room whose machines share a body and differ behind the glass. The worlds here are the screens, and a dark field and a kelp bay have nothing to do with each other. The chrome moved to a.arcadeclass so that the thing which styles and the thing which unfurls are never the same word — each page carries exactly one classmake-og.pyhas a card for, and no ordering inside aclassattribute decides anything. - Each cabinet carries its own panels, its own refusals and its own credits. A single shared sidebar stopped working the moment there were two machines: a readout headed YOUR ESMX floating above an otter game is furniture belonging to nobody. The foyer keeps only what is true of every machine in the room — no timer, nothing chasing you, no sound, no memory, nothing moving until you press start.
check-counts.pygained cabinets and games while this shipped and immediately refused two sentences calling one of them “the second cabinet”.
2026-09-20 — the street stops saying how many rooms it has, and a checker to keep it that way
- Ryan’s call: the number of storefronts is going to grow well past anything worth writing down, so nothing here states a total any more. Not the pages, not the stylesheet’s comments, not a generator’s published strings, not the docs. The street’s own description, its share card,
llms.txt, the feed’s description, the liner notes, the campground’s lede and the empty storefront’s opening line all say something that stays true however many there are — no two rooms alike, one card per room, a row of shopfronts, a storefront with nothing in it. - The change that opened the Arcade is the argument for this, and it is not a flattering one. That commit carefully updated the room count in twelve places — and shipped three sentences still carrying the old one.
love.csswent on describing the doors and the shopfronts by a number that had stopped being true the moment the seventh one landed, andCLAUDE.mdwent on giving the number of share-card designs as one fewer than existed. All three were written by the same session that was updating the other twelve, and nothing caught them, because nothing was looking. A total is a fact about the whole site that gets written in a dozen places and updated in one. - So
check-counts.pyrefuses a number or an ordinal sitting in front of a thing that grows when a storefront opens — rooms, storefronts, shopfronts, doors, worlds, card designs. It is deliberately small. The jukebox’s tracks and The Chappell’s are real counts of real data, generated from files holding exactly that many, and it leaves them alone. - It starts at four, because the first draft refused its own fix. Written to catch any number from two upwards, the very first thing it flagged was “no two rooms alike” — the count-free phrasing this whole change exists to encourage — along with “two rooms turned out to be putting text on a background nobody had measured”, which is a finding rather than a claim about the size of the street. Below four, a number in front of these nouns is nearly always counting instances. A street’s total will be four and rising.
- Quoted text is skipped in prose and not in code, and the asymmetry is the point. A page or a doc has to be able to say what it corrected, so a count inside quotation marks there is evidence rather than a claim. In a generator every quoted string is a candidate for publication —
make-og.pywrites its card footers out of string literals — so there is no safe quotation, and the checker’s own docstring therefore describes the three stale counts rather than quoting them. It is the one place where a tool’s prose has to obey the rule it enforces. The first version scanned line by line and refused itself, because the quotation it makes its argument out of wrapped across two. - Broken on purpose in all three shapes that actually shipped — a page’s prose (“the seventh storefront”), a stylesheet comment (“the six doors”) and a generator’s docstring (“eleven card designs”) — and it named all three with their file and line. Then the working tree was put back.
- One count it missed on the way, which is why it grew a word. The Arcade’s own source said the room “shares nothing with the six next door”, and the first rule sailed past it because next was not in the short list of words allowed to sit between a number and its noun. It is in the list now, and the sentence says the rooms next door.
- The share card changed with the street. Its footer read ONE STREET · SEVEN ROOMS · A FIELD PAST THE TREELINE and now reads NO TWO ROOMS ALIKE, which is the better line anyway: the count was never the interesting claim, and the thing it was standing in for is the one this site is actually about.
- The room numbers on the doors stay. room 04, room 05, ROOM 07 are addresses, and a house number has never told anybody how long the street is.
2026-09-20 — the second yell, and a duration that lies about itself
- The yell button has two voices in it. The Playhouse holds a yell from Enigma, lent on 2026-09-20 — the first on that button from somebody other than the person who built the room. It is published under the name it came with, the room says whose yell it was out loud on the press, and it is credited in the liner notes as well. It carries no onward licence, unlike everything else here: CC BY-SA cannot be revoked, and a voice somebody lends us has to be one they can take back.
- Two tools refused it on arrival, which is what they are for. The file sat in
audio/yells/with no entry indata/yells.json, somake-yells.pystopped — a yell with nobody’s name on it is the one thing it cannot publish — andmake-yurt-sound.py’s sweep of every audio file in the repo stopped on the metadata:com.apple,Core Media, and a creation timestamp to the second. Neither tool strips anything, and that is deliberate: what to do with somebody’s recording is theirs to decide, not a script’s. It was stripped once there was a decision to strip it. - And the obvious way to check that strip is misleading. The instruction in both docstrings is to compare the duration before and after, because
-c copyre-muxes rather than re-encodes. It went from 4.160s to 4.096s — 64 milliseconds apparently gone, which reads exactly like a bad edit. It is not.-map_metadata -1drops theiTunSMPBtag, which is the container’s declaration of encoder padding, and the start offset went 0.044 to 0.000 with it. Decoding both files to raw PCM gives 196,608 samples each, identical at every one of them, same peak. The audio is untouched; the 64ms was never audio. Written down here because the check the tools recommend will keep producing that number, and the next person to run it should not go looking for what they cut off. - The house rule rewrote itself, which is the whole reason it is generated. The Playhouse now says the button holds “2 recorded yells” rather than one. A claim a page makes about itself should not depend on somebody remembering to edit it. Verified in the network panel afterwards: zero requests to
audio/on load, one per press, and both names reached the live region.
2026-09-20 — a seventh storefront, with one cabinet in it
- The street has an arcade on it. The Arcade is room seven, sixth door in the row, and it holds one game: Quill Drift, starring Esmx the Porkypine. Loose quills drift across a dark field, Esmx walks, and a quill joins the mane on contact and only on contact. No timer, no lives, no score, no streak, nothing chasing anybody and no way to lose a quill once it is in.
- The one rule is the mechanic, not a note at the bottom of it. A porcupine cannot shoot a quill — cannot throw, fire or launch one; it comes away in whatever touched it, and an attacker has to come to the animal. That is card No. 3 of the Quillery, sourced there to Uldis Roze. A spiky mascot invites precisely the opposite reading, so the game has no verb for it: there is nothing to aim, nothing to press but a direction, and nothing on the field but Esmx and the quills. “Non-violent” was the brief; refusing the one verb everybody expects is what it turned into.
- The point of the game is a variant, which is what the licence asks for. Twelve quills fill the mane, and what you are left with is a mane in an order nobody else walked into — written out in words beside the cabinet as well as drawn on the sprite, because a mane nobody can read is a mane nobody can tell anybody about. Esmx’s own page does not merely permit this: feel free to customise! Make variants of Esmx to represent your community.
- A correction, caught by Ryan mid-build and worth the space. The room shipped its first draft calling Esmx “our mascot and not ours”, and borrowed the framing from the Quillery, which says Kaya Oldaker’s artwork “is not ours to redraw stroke for stroke”. That is wrong about the facts. Stimpunks commissioned Esmx and holds the IP; Kaya is the artist. The credit line stays on every surface it was on — in the room, in the liner notes and in the drawing’s own markup — because holding the rights to a commission is not a reason to stop naming the hand that drew it, which is a different and better sentence than the one that was there. Attribution here is a courtesy as well as a licence, and it turns out the courtesy is the half that was doing the work.
- Esmx is drawn again rather than pasted in, and not because anybody needed permission. The originals are a download away and ours to use. A PNG would have been the only thing in the arcade that came from somewhere else, in a room whose whole argument is that it shares nothing with the six next door — and taking our own invitation seemed like the least we could do with it. The marks that make Esmx Esmx are kept: the pig snout, the earring in one ear, the chunk out of the other, and a mane that comes apart at the tips.
- An arcade in particular, because the mascot already came from one. Kaya’s notes say Esmx resembles a Sonic character or a Pokémon on purpose, due to their popularity within the Autistic community. Nothing of either is used here. The room is not a costume put on the mascot; it is where the mascot came from.
- The dial and the speed knob are two controls, on purpose. The dial governs the room — the cabinet glow, the marquee bulbs — and the game’s speed belongs to the player. The dial picks the knob’s starting position, Slow if you arrived on Gentle, and then stops having an opinion; all three speeds are offered at every dial setting. Tying the game to the dial would have made Gentle a different game, which is the “lite version” mistake with a joystick on it.
- And nothing on the playfield moves until a coin goes in — the jukebox’s consent model in a different costume, and the reason a room with a game in it does not make the dial lie. Motion the visitor started is not ambient motion. The cabinet also makes no sound at all, ever, at any setting; an arcade that is silent by choice seemed better than one that is silent until it isn’t.
- Everything moves with
left/top, and that is a decision about the checker rather than about performance. Rotation and skew are whatcheck-gentle.pyreads out of the computed matrix, and a room that put its game behind atransformwould be asking that tool to take the room’s word for something. There is nothing to take on trust if there is no transform to read. The two that are there are the sprite’s centring translate and ascaleX(-1)when Esmx turns round — both of which the tool already reads as layout, and both of which it can see. Broken on purpose with an unresetrotate(-2deg)on the cabinet marquee: it namedp.cab-marqueeand the matrix it found. 192 elements in the room, measured at all three settings, none tilting. - Thirty-six new contrast pairs, two of them against grounds nobody chose.
#0F1F24is what the screen becomes under its scanline stripe and is the lighter of the two grounds the playfield makes, so it is the one that decides;#2D1C25is the carpet under the cabinet’s own glow, where the headline and the eyebrow sit. The eight quills are in the list too — WCAG 1.4.3 does not reach a graphic, but a quill you cannot pick out of the background is a control you cannot use, and they are held to the body threshold rather than the 3:1 one so that nobody has to remember later which bar applied. Each quill also has a name, said out loud on contact, because colour is never the only channel here. 162 pairs, none failing; broken on purpose by dimming one grey, and the composite ground failed harder than the flat one, which is the whole argument for having both in the file. make-og.pyrefused the room until it had a card, which is exactly what it is for — the eleventh design, and the one that is mostly a drawing, because this is the only room whose subject is a character rather than an argument and a poster for a game showing nobody playing it would be a poster for the wrong thing. Esmx and the marquee bulbs are lifted out of the page rather than retyped, alongside the campground’s stream and the yurt’s crown, so the card cannot come to disagree with the room. The mane on it is the markup’s own default rainbow; the game only ever overwrites those twelve fills with what a player actually caught.- Press Start 2P is the eighteenth family and the only face in the room. A pixel face is the one thing no other room on this street could have borrowed without turning into the arcade. 4.7KB, latin only, self-hosted like the other seventeen — verified in the network panel: every byte on the page comes from this origin, and the cabinet fetches nothing when you press anything, because there is nothing to fetch.
- Playtested, and the first build was over before its own instructions were. Six quills on the field at a reach of 7.5 filled a twelve-quill mane in about ten seconds. Dropping to five at 6.2 went too far the other way — a full lap of the field turned up one quill and the game went slack. Six at 7.0 fills a mane in something under a minute of walking, measured over a sixteen-leg random walk rather than guessed.
- “Six rooms” was written down in twelve places — the street’s description and its card alt,
llms.txt,love.css’s own header, the liner notes, the campground’s lede, the feed’s description and the street card’s footer. It is seven now, and Your Room is the seventh storefront rather than the sixth. The derived files are derived, somake-sitemap.pyandmake-feed.pycarried their own copies of the sentence and had to be edited at the source rather than in the output. - The pad takes a press-and-hold or a single click, because a control that only works while a button is held down is not a control for somebody driving it with a switch or a screen reader. The arrow keys are bound to the playfield rather than to the document — arrow keys that stop the page scrolling from anywhere on it would be a trap — and Escape hands them back.
2026-09-20 — a checker for the dial, and the windowsill it caught
- The dial had nothing watching it.
check-gentle.pyloads all fourteen pages in headless Chrome, sets the intensity to Gentle, Regular and MAX GLITTER in turn, and reads what actually moves out of 2,253 computed styles — rather than reading the stylesheet and believing it. The global half was always safe: animation and transition are killed at Gentle with!important, and nothing out-shouts that by accident. The tilts were never safe. Every room sets its own rotations and resets them room by room, unprefixed, so a reset is one selector away from being outranked — and CSS does not warn when that happens. It applies the winner and says nothing. - It found the Faery Yurt’s windowsill on its first run. A book at
rotate(-3deg)and a pen atrotate(24deg), both still tilted for anybody who had asked the wobble to stop, because that room shipped without a single Gentle rule in it. Twenty-four degrees is not subtle. The room was a day old and two people had read it. The sill keeps its angles at Regular and MAX — they are Helen’s and they stay; the reset is the dial, which is our plumbing and applies to every room on the street. - Rotation and skew are the wobble; a mirror and a translate are not. The tool reads the off-diagonal terms of the computed matrix, which are non-zero for exactly those two and nothing else, so a vine flipped with
scaleX(-1)and a positioned layer pass without needing an exception. Transforms inside an<svg>are excluded on purpose: a transform on a<g>is part of the drawing, the same kind of thing as a path’sd, and flattening one would produce a broken picture rather than a calmer page. - It checks the other half of the sentence too. “Never the words” means the visible text of a page has to be identical at Gentle and at Regular. It is, on all fourteen — which is the moment to write the check, rather than after somebody has a paragraph they would rather drop at the quiet setting.
- Broken on purpose three times before being believed, because a checker that has only ever passed is a checker nobody has tested. Restoring the near-miss on Enid’s wall — the tilt selector written one level too specific — and it names
figure.polaroid. Hiding a.scrawlat Gentle and it reports the pages whose word count drops. Leaving an!importantanimation running and it names the element. Then the working tree was put back.
2026-09-20 — the wall becomes a wall, and a tilt that nearly outranked the dial
- Enid’s photographs were stacking in a single narrow column, and the prose panel beside them was being stretched to match: 1,291 pixels of bordered box holding 218 pixels of writing, and 1,073 of nothing. The row they sat in never carried
align-items, so it defaulted tostretch— and the row one level up already hadflex-start, which is the tell that this was an omission rather than a decision. - It was correct the day it was written and rotted as the site succeeded. With the wall grey, the column was one note at 222px and the panel was 218px; stretch looked like alignment. Every photograph anybody sent added about 350px of emptiness to the panel next door, because
aspect-ratio: autois the no-crop promise and a portrait renders at full portrait height. The third photo is what made it impossible to miss. Nothing would have reported this — it is not a failing check, it is a room that looks slightly wrong and gets slightly wronger. - So the wall is a wall now: sticker wall, then photographs across it, then the prose underneath. Polaroids are one fixed size, the way real ones are, and they pack across and wrap — the tenth photograph widens the wall instead of lengthening the page. Heights stay ragged, because the frame still adapts to each picture. Simulated eight photos in the page to watch it wrap: 3 / 3 / 2, the short last row staying short rather than stretching one polaroid to full width. The page is 1,175px where it was 2,860.
- Every other photograph leans the other way, because three in a row all tilted
-2degreads as one skewed strip rather than three separately pinned pictures. - And that tilt nearly turned the wobble back on for the people who turned it off. The obvious selector —
.polaroid-wall .polaroid:nth-child(even)— is specificity (0,3,0), and the Gentle reset ishtml[data-intensity="gentle"] .polaroidat (0,2,1). The decoration would have outranked the dial, in the one room whose photographs are of real people, and nothing here checks computed transforms so it would have shipped silently. It is written:where(.polaroid-wall) .polaroid:nth-child(even)::where()contributes no specificity, which holds the rule at (0,2,0) and under the reset. Read the computed transform at all three settings rather than trusting the arithmetic — Regular and MAX GLITTER tilt −2°, +1.5°, −2°; Gentle isnone,none,none. - The generator moved two spaces and learned nothing else.
make-polaroids.pywrites the wall between its markers and has no opinion about the container, so the restructure was ours to make; only its indentation changed, to match the new depth. Re-ran it against the rebuilt room and the output is byte-identical, which is the property that matters — the next photograph has to land in a row, not quietly restore the column.
2026-09-20 — the regulation nook makes noises, and a hole between three tools
- The Regulation Nook makes noises. All six of Helen’s tiles in the Faery Yurt are buttons now — blankets, squishmallows, fairy lights, cupcakes, coffee, cheese and pesto — and each plays a couple of seconds of Ryan making the appropriate noise. An easter egg Ryan and Helen wanted in her room. Each sound owns exactly one marker pair in the page and nothing else, rather than the tool generating the whole list: a tile whose recording is withdrawn goes back to being Helen’s own markup, and that has to be a change to one tile rather than a rewrite of six.
- An easter egg that still tells you it is there. A tile with a sound wears the same candlelit card as its neighbours, and a small ♪ 2s surfaces on hover and on focus; the button’s accessible name says it is a sound and how long. The discovery is meant to be “one of these is a button”, not “a page I was reading quietly made a noise at me” — a hidden noise would be the exact thing the dial and the press-to-play facades exist to prevent, arriving as a joke. At Gentle the marker is simply always shown, because the quiet setting should reveal more and never less.
- Nothing is fetched until you press. Verified in the network panel: zero requests to
audio/on load, one per press, and never two playing at once — pressing a second tile is a change of mind, not two people talking over each other. Whose voice it is is said out loud into a live region on every press rather than only filed in the liner notes, where it is also filed. - Every runtime is measured off the file, not typed. The six labels say 2, 2, 3, 2, 4 and 2 seconds because that is what the containers report. Every press-to-play control on this street promises a duration before the press — the jukebox, the thirteen arches, the audio room’s sequence — and a hand-kept number is a promise one edit away from being false.
- Then the interesting part: three tools guarding audio, and a hole between them.
make-readings.pyrefuses stray recorder metadata on passages,make-yells.pyon yells, and the new tool on the yurt’s — and every one of them only ever looked at files its own data file named. Recordings sat inaudio/for an afternoon carryingcom.apple.VoiceMemos (iPad Version 26.6.2), a creation timestamp to the second and a voice-memo UUID, belonging to no tool’s patch, onegit add -Afrom being permanent in a public repository.make-yurt-sound.pynow walks every audio file in the repo instead. Three guards with a hole between them is a hole. - It refuses rather than strips. What to do with somebody’s recording is theirs to decide, and a tool that silently rewrote the files people dropped in would be worse than one that says what is wrong and names the file.
2026-09-20 — the third photograph, and the promise it broke on arrival
- Helen sent her portrait, for both places at once. It is on Enid’s wall and it is the picture beside the welcome in her own room — the empty slot the yurt shipped with two commits ago, because the file was not ours to invent. Description, caption and naming are hers, and she took it herself. No EXIF, not resized, not cropped.
- And not filtered, which is the part worth writing down. Her mockup put a sepia wash over this photograph —
filter: sepia(.18) saturate(1.05) brightness(.96)— and the terms promise, in these words, that we will not “Crop you. Filter you.” A promise the site makes to everybody is not waived by the one person it happens to be about this time, because the next photograph would arrive under a rule that had already been bent once. The wooden frame is matting and stays: a border, a shadow or a mat goes around a picture; a filter is done to it. - So the tool checks it rather than trusting anybody to remember.
make-polaroids.pynow refuses a filter in an<img>’s own style attribute, and refuses any rule inlove.csswhose selector reaches a photograph and carries one. Every photograph on the site wearsclass="photo"so there is something exact to look for. - The first version of that check did not work, and the way it failed is the point. It scanned only the classes on the
<img>itself, so it sailed straight past.portrait-frame img { filter: … }— the filter was on a descendant selector, which is the shape this actually arrives in. It was written, it passed, and it was wrong; it only got caught because putting the sepia back and watching the tool say nothing is cheaper than believing it. A checker that passes a case it was built for is worse than no checker, and this one nearly shipped as exactly that. All three shapes refuse now — descendant selector, the plate’s own class, and an inline style — each one tested by breaking it on purpose.
2026-09-20 — the street grows an edge, and Helen pitches a yurt on it
- There is a signpost at the end of the shopfronts now. The Campgrounds — a field past the treeline with numbered pitches on it, for the people who do not want a storefront. A row of lit shops is a wonderful place to be and an exhausting place to live, and a site that only had one of those was telling its own quiet people that the loud room is the only room. The signpost is deliberately not a seventh door: a door here is a shop you walk into, and this is where the street stops.
- Nothing in the field moves at any setting — not at Gentle, not at Regular, not at MAX GLITTER. Every other page has an ambient layer waiting for the dial to be turned up; this one has none, and says so on the page. An area that exists for people who want quiet cannot have a loud setting and mean it. The dial still governs each pitch, which are their own worlds and set their own noise.
- Pitch 01 is the Faery Yurt, and it is Helen Edgar’s room rather than ours. The palette, the three typefaces, the drawings, the twelve book spines, the shutters on the glimmer window and every line of copy came from a mockup she built and sent. We added the plumbing and changed one colour. It is credited to her in the liner notes, in a section that did not exist until there was a room by somebody else to put in it.
- The yurt shares nothing with the field it is pitched on, and that was the hardest version of this rule yet. The Chappell at least had a parent room to differ from; this is the first thing in a brand new area, where “an area should look like an area” is the most reasonable-sounding sentence the tidying instinct has produced here since “it is only a subroom”. The field is cold blue spruce, bone signs routed like park lettering, and bare ground. The yurt is candlelit brown, old serifs and soft cards. You walk in out of the night air; the contrast is the door. They got a share card each, ninth and tenth, for the same reason.
- The contrast checker caught two things in Helen’s mockup before it shipped. Her smallest grey,
#8a7462, carries the eyebrow, the shelf note, the window hint, the animal cards and the footer — and it measures 4.30 on the flat tent ground, 3.85 on a card and 3.43 under the ember glow, failing everywhere it is used. It is#A4907Bnow. Her fourth book spine ran to#9a6c2f, where the cream lettering measured 3.74; it stops at#8A5F26. Thirty-nine new pairs, including one against#31231A— a colour nobody wrote, which is what the yurt’s canvas weave and ember crown actually composite to. 126 pairs, none failing. This is the only thing about her room this site changed, and it is written down rather than quietly applied. - The consent record now guards every page, not just the wall. The yurt hangs one of Enid’s photographs in Helen’s own room, which put the consent record and the publication in two different places for the first time — exactly the gap where a withdrawal gets half-honoured.
make-polaroids.pywalks all the HTML now: a photo published anywhere without an entry is a refusal, a photo hung outside the wall without that entry saying so is a refusal, and a file sitting inphotos/with no record at all is a refusal. Delete a withdrawn entry and the tool refuses to run until the yurt lets go of it too, instead of leaving a broken image on a page nobody thought to check. - Five typefaces arrived at once, which is what it costs to open an area whose two pages share nothing with the street or with each other. Alfa Slab One and Bitter are the campground’s routed sign and its field notice; Cormorant Garamond, Crimson Pro and Caveat are Helen’s, named in her own mockup. All five are self-hosted, so the yurt still makes no third-party request — verified in the network panel, along with the field: every byte on both pages comes from this origin.
- A keyboard fix the mockup could not have caught. The glimmer window’s shutters are opened by a visually hidden checkbox, so the site’s focus ring was landing on something invisible and a keyboard visitor had no way to tell they were on it. The ring goes on the window frame now.
2026-09-20 — the second photograph
- Enid’s wall has somebody else on it. Helen Edgar, on a grand staircase — the first photograph up there from somebody other than the person who built the room, which is the difference between a process and a person waving his own picture through. The description and the caption are the words it arrived with, because the terms do not allow any other kind.
- The photographer is credited without being named. A friend took it and would rather stay anonymous, and the permission is on the record anyway — the tool refuses a credited photographer with no permission logged, and anonymous is a way of being named rather than a way of skipping the question. Being in a picture is not the same as owning it.
- Checked before publishing, not promised: no EXIF, so no location data left on the file; the photograph keeps its own shape, because the plate stopped cropping when the first one went up; and it carries no onward licence, so it comes down the day she says so and nobody else gets to reuse it in the meantime.
2026-09-20 — a door at the back of the dancefloor
- Pink Pony Club has a subroom. The Chappell — thirteen Chappell Roan videos under the heading Unabashed Pleasure and Righteous Inclusion, which is the name of a playlist we already published. The room argues that the two halves of that title are usually kept apart, that Disabled people get handed the righteous one and told the other is a reward for good behaviour, and that unabashed pleasure is not the opposite of inclusion but what inclusion is for.
- Rhinestone Vatican, and it shares nothing with its parent. The dancefloor is flat hot pink, cream Shrikhand and ten small white cards inside one big cream tray. This is votive indigo, gold Monoton, and thirteen free-standing arches with stained glass over each one, standing on the bare ground. A subroom is the place where inheriting the parent’s look would have seemed most reasonable, which is exactly why it does not — and it got its own share card for the same reason, the eighth.
- Monoton was the last unclaimed display face on the street. It held one 27px line on the index, “Living out loud”, and no room had taken it as a headline. A neon marquee face set in gold leaf is the whole joke of this room in one typeface.
- Every button says how long before you press it. There is a twenty-three minute Tiny Desk concert in there sitting beside three-minute videos, and “press play” is only consent if you know what you are agreeing to — the same reasoning that put the passage count on the audio room’s sequence control. The generator refuses a track with no runtime rather than rendering a blank one, because a missing runtime would not look like a bug, it would look like a choice.
- Nothing was guessed. Ids came out of the playlist page’s own data and were cross-checked against the playlist panel on the watch page; titles, channels and runtimes were resolved against YouTube; every id was then put through the same playability check that caught the dead track on the dancefloor, and all thirteen answered OK. Guessing which song goes with which video id is the exact fabrication the zine table spends a page arguing against.
- The playlist says fifteen and thirteen render. YouTube counts private and deleted entries in that total and shows nothing at all for them to anybody but the owner, so the missing two cannot be read from outside. Thirteen is what plays and thirteen is what is published — written down in
data/chappell.jsonrather than quietly rounded off. - The rot checker now watches both lists. It only knew about the dancefloor’s ten, and would have left thirteen facades unwatched while printing “all tracks checked” in a tone of complete confidence. That is worse than not running it, because it reads like coverage.
- The contrast checker learned this room’s ambient layer before it shipped, not after. Thirteen new pairs, and two of them are against
#4E2E60— a colour nobody wrote, which is what the rose window actually makes over the nave. The gold headline measures 11.21 flat and 6.73 at the brightest point of the glow. The pony’s cream is 3.01 and 2.64 in the same comparison, which is why its card leaves the rays off and this one keeps them. Eighty-seven pairs now, none failing.
2026-09-19 — seven share cards, because one would have been a design system
- Every page has an image now when somebody pastes its link, and there are seven card designs for eleven pages — one per room, allowed to contradict each other exactly as the rooms do. The street’s collides six typefaces; the zine’s is a ransom note on photocopier grain; Hear Queer Here is a terminal face over interference fringes; the Playhouse keeps its bunting and its checkerboard floor. A single template would have been the tidying instinct arriving in the one asset nobody reviews, because nobody opens a PNG in a diff.
- The cards are built with the site’s own stylesheet rather than a copy of it. Each one is a scrap of markup on the page’s own
bodyclass withlove.cssattached, and the h1 is lifted from the page verbatim — which is how the zine’s card keeps its per-word ransom spans and the street’s keeps its two-part wordmark. Change a room and its card changes with it. - No card ships without alt text. The tool has no way to write an
og:imagewithout anog:image:alt, because words baked into a picture are words nobody can hear, on a site that exists to say so. - “It fits” is measured, not eyeballed. Chrome reports the layout back out of the same run that takes the screenshot, and a card whose content runs past 1200×630 fails the build. A slightly longer title is enough to push a word off the edge, and the crop lands in somebody else’s timeline looking like our bug.
- It found contrast nobody had measured. The checker held 66 named pairs and every one of them assumed a flat background; the rooms have ambient glows over those backgrounds. Enid’s aside grey is 4.55:1 on the black wall and 3.22 in the corner where the green half of the glow peaks — the card’s footer uses a lighter grey, and the room has the same line in its other corner at 3.39.
- And one we have not fixed, on purpose. The Pink Pony Club’s cream headline measures 3.01:1 on flat hot pink — clearing the 3:1 large-text threshold by four thousandths — and 2.64 over the room’s own mirrorball rays, where it fails. How that room looks is not a checker’s call to make, so it is written down at the foot of
check-contrast.pyrather than quietly patched, and the pony card leaves the rays off until it is decided.
2026-09-19 — the yell button yells, and takes yours
- It was blooping. It played the same oscillator as the stim box, an octave and a half down, and a pure tone is a bloop however low you put it. It builds the noise now — breath through a filter that sweeps as a shout runs out of air. Measured: zero-crossings went from 158 a second to 1,747, which is the difference between a tone and a shout.
- It can be your voice. Send us a yell and it joins the others, one chosen at random on each press, with the room saying whose it was out loud. The synth stays as the fallback, so the toy works whether or not anybody has sent one.
- The house rule rewrites itself. The page said the noises are synthesised and not fetched from anywhere, which stopped being true the moment a recording landed. That sentence is generated from the same data as the button now, because a claim the site makes about itself should not depend on somebody remembering to edit it.
- A correction we owed the readings. Enid’s wall refuses a photograph carrying EXIF; audio was never held to the same rule. The first yell arrived with the recording device, its OS build and the exact second in it — and so did all five readings already published. All six are stripped, re-muxed rather than re-encoded so the sound is untouched, and both audio tools now refuse a file that still carries any.
2026-09-19 — Chairy learns twenty-three more things to say
- Five sayings became twenty-eight, drawn from our philosophy, framing and creed pages. They live in
data/chairy.jsonnow rather than an HTML attribute, because an attribute cannot record where a line came from. - Two of them are not ours, and Chairy says so out loud. “Nothing About Us Without Us” is a motto of the self-advocacy movement — credited on our own page to Michael Masutha and William Rowland of Disabled People South Africa, 1993 — and “Design for Real Life” is a book by Eric A. Meyer and Sara Wachter-Boettcher. A talking chair passing a movement slogan off as a house line would be the exact thing this site argues against, so the credit is spoken rather than filed.
- Every source URL was read from the mirror’s own frontmatter, not constructed from a slug — the same rule the jukebox ids follow.
2026-09-19 — the first photograph
- Enid’s wall has a picture on it. Ryan, a tankard, and a description and caption in his own words — which is the process working rather than being waved through by the person who wrote it.
- It exposed a promise the code was breaking. The polaroid plate was square with
object-fit: cover, and cover crops — while the terms promise in as many words that we will not crop anybody. Nobody caught it while the wall was grey, because there was nothing in the frame to cut. A photograph keeps its own shape now. - Checked before publishing, not promised: no EXIF, so no location data; resized for the web but not cropped and not filtered; the alt text is the subject’s own sentence, not our description of him.
2026-09-19 — a second term, and a second voice
- Hear Queer Here holds two terms now. Developmental Pace joins Monotropism, five passages each. The entry itself makes the case for the pairing: monotropic time is what happens to time inside a flow state, and developmental pace is the longer arc — when a capacity arrives at all.
- The panel now measures a term as well as a pattern. With one term, “collapse to A” was unambiguous; with two it is not. There is a picker above the collapse row, which keeps the argument rather than working around it — the instrument and the object both matter, and you choose both.
- These passages are cut from our own entry rather than written fresh. Monotropism’s entry is mostly other people’s work and exactly one line in it was ours, so its passages had to be written. Developmental Pace is substantially our own prose, so it could be read as the room originally promised. The rule is the same either way: we read our own words and nobody else’s.
- A borrowed voice is not ours to licence.
LICENSEsaid nothing about recordings. Ours are our work; a reading by anybody else carries no onward licence, because CC BY-SA cannot be revoked and somebody who lends us their voice has to be able to take it back. Fixed before the recording exists rather than after — the first time on this site that has gone in that order. - Five slots are waiting on a voice, credited in the future tense until they are filled.
2026-09-19 — the panel plays the sequence
- All five passages are recorded. What monotropism is, the A side, the B side, both are measurements, and a love language — read by Ryan Boren, one minute thirteen seconds end to end. The room stops promising audio and starts having some, and the Not built yet list below is one item shorter.
- Collapsing to a reading now lets you hear it. The panel only highlighted passages before, which set an expectation it did not keep. A plays what monotropism is and then how the clinic writes it down; B plays it and then what it looks like from inside; leaving it open plays the whole argument, ending on the line that resolves it.
- One press, several passages — and the label says so first. “Play the A sequence — 2 passages, 39 seconds”, not a bare triangle. Starting a sequence you asked for is still press-to-play; getting four minutes you did not expect would not be.
- The collapse buttons still make no sound. Choosing a measurement and listening to one are separate acts, which also means you can collapse to A and read it somewhere you cannot play audio.
- Missing recordings are skipped and counted, so the control works at two of five exactly as it will at five — and the passage playing is marked on the page and announced for screen readers, with a stop always available.
2026-09-19 — the first passage is recorded
- “What monotropism is” has a voice. Eighteen seconds, read by Ryan Boren. The room that has been promising audio since launch now contains some. Four passages to go, and the words for all five are on the page either way.
- The generator would have ignored it. It looked for
.mp3and the recording is.m4a— what a Mac produces by default — so the first real recording of this project would have been silently skipped. It now accepts whatever a recorder gives you:.m4a,.mp3,.opus,.ogg,.wav,.aac,.flac. A tool that quietly ignores the file it was built for is worse than one that refuses.
2026-09-19 — the polaroid wall gets a consent process
- The licence would have swept up your face. This site is CC BY-SA 4.0 and
LICENSEexcluded the typefaces, the songs and the borrowed names — but said nothing about photographs. A community photo published under that licence would have let strangers reuse a Disabled person’s picture commercially, and CC licences cannot be revoked. Photographs now carry no onward licence at all, which is the only thing that makes “it comes down when you say so” true. - The terms are written down — what we ask for, what we promise, and how a photo comes back off the wall. You write the caption and the description; your name is however you write it, including not at all.
- The promises are enforced rather than intended.
tools/make-polaroids.pyrefuses a photo with no alt text, no named subject or no consent date — and refuses any file still carrying EXIF, which is where a phone records where and when a picture was taken. Sending us a photo should not tell the internet where you live. - We do not publish photographs of children. A parent can give the consent; the child cannot take it back in ten years when it matters to them.
- The wall is no longer grey. Ryan sent the first photograph, of himself, with the description and the caption in his own words. One photo is a wall that has started.
2026-09-19 — the audio room, built and waiting on a voice
- Hear Queer Here stops promising something it does not do. It said “the glossary read aloud, in our own voices” and delivered nothing. It now holds five written passages on monotropism, each shown as text, each with a visibly empty slot where its player will be. A passage goes live the moment its audio file exists.
- The prose is new, and that was forced by attribution. The glossary entry is mostly curation — the explanation in it belongs to Dinah Murray, Wenn Lawson and Mike Lesser, to the Monotropism Questionnaire’s authors, and to Helen Edgar, whose opening is hers. Exactly one line in it was ours. So the passages were written for this room rather than lifted, and nothing recorded here is anyone else’s to clear.
- The superposition panel finally has a subject. It was a mechanism with no content: A and B were not readings of anything. Three of the passages now answer to it — the clinic’s description, the monotropic one, and both at once. Its old caption said “neither one wrong”, which asserted a symmetry we do not hold; it now says that only one of the two knows it is a measurement.
- The words are the point, not the transcript. Every passage is printed whether or not the audio exists. An argument you can only follow by hearing it is an audio-only requirement, and this is a Disabled people’s organisation.
2026-09-19 — the changelog has a feed
- There is a feed now, and it is generated. The front door briefly linked
/feed.xmlbefore the file existed and the link was removed rather than the file invented.tools/make-feed.pybuilds it from this page, the way the sitemap is built from the pages’ own heads, so a changelog entry and its feed item cannot drift apart. - Every entry here now has a stable anchor, because that anchor is the feed item’s permalink. The generator refuses to run if one is missing — a feed whose guids move republishes every old entry into somebody’s reader as though it were new.
2026-09-19 — the zine prints in black and white, for real this time
- The second half of the room’s own sentence was false. “Prints to one sheet on a bad office printer, in black and white” — the ransom headline printed in full yellow, cyan and red, and the print rules reset backgrounds only on a fixed list of components. Anything not on that list kept its dark ground while the text on it was forced to black: 1.14:1, invisible. What actually vanished on paper was the most prominent quotation on each sheet and the entire credits box, on the page that argues attribution is the cheapest thing you can do.
- Colour and text are now reset together, universally. Fixing either alone breaks the other — pale citation text on a newly-white ground would have been just as unreadable the other way round.
check-print.pynow checks both halves, reading the inks out of the rendered PDF against an allowlist rather than a threshold, so a new colour on the page has to be looked at by a person instead of quietly tolerated.
2026-09-19 — a dead track on the dancefloor
- Bad Cop / Bad Cop, “Warriors”, has a new id. The id carried over from our Double Rainbow page had started returning “Video unavailable” inside the embed. Replaced with one that plays, resolved against oEmbed like every other entry, with the old id and the reason kept in
data/jukebox.jsonrather than quietly overwritten. - Two channel names now read the way a person would write them. The credits said “via Merge Records on YouTube”, which is genuinely what that channel is called now, and “via Bad Cop Bad Cop - Topic”, which is an auto-generated name missing the slashes the band uses. Both print properly now. YouTube’s exact wording is kept beside them in
data/jukebox.jsonso the checker can still tell a real rename from a choice we made. - The other nine were checked too, and all nine play. Worth saying plainly how, because two obvious tests are useless here: YouTube’s oEmbed endpoint answers
200for a video that will not play, and loading an embed URL directly fails identically for every video, working or not. What distinguishes them is the watch page’s ownplayabilityStatus, which readUNPLAYABLEfor the dead one andOKfor the rest.
2026-09-19 — the zine table takes issues
The Zine Table stops being one sheet and becomes a table with sheets on it.
- Issue #2, One Root, Two Rainbows — seven lessons from our own Neurodiversity and Gender course cut down to seven lines, using the course’s own one-idea-per-line device. Seven glossary terms linked, each one checked before it was written.
- Submissions have a route now. The room asked for pages by paper, photo, voice note and AAC, and the link under the ask pointed at Your Room — which is a whole storefront, a different and much larger offer. The zine table now carries the spec and the contact route itself, and names Your Room as the separate thing it is.
- Correction: the one-sheet promise was not true. The room says every page in it prints to one sheet and that the print stylesheet is not a joke. Rendered to PDF, issue #1 came out at three sheets — the two columns wrapped into one long one and every link expanded to its full URL after it. Fixed with print rules scoped to this room and a declared page margin, so it no longer depends on the print dialog. Both issues now land inside one sheet, and
tools/check-print.pyrenders them through headless Chrome on every run so the claim cannot quietly come apart again. - The rule on quoting songs changed. This site launched saying it would reproduce no lyric at all. That was never argued for on its own terms, and queering.earth had already settled it properly: a line or two, never the chorus alone, the songwriter named separately from the performer. The deciding argument is an access one — “go and listen to the recording” is an audio-only requirement. We follow that policy by reference now rather than restating it.
2026-09-19 — the street opened
Six rooms, one front door, and a dial. Live the same day at stimpunks.love, with the source public at github.com/Stimpunks/Stimpunks-Love.
- The Stoop — the front door, six shopfronts, and the tagline set in six typefaces because that is the thesis rather than the decoration.
- Pink Pony Club — ten tracks lifted from our own Double Rainbow page, each one a press-to-play facade that contacts YouTube only after you press it.
- The Zine Table — xerox and ransom note, and the page that says which two habits survived the move: attribution and contrast.
- Hear Queer Here — quantum queering, with Barad and Helen Edgar quoted and cited, and a superposition panel where “leave it open” is a real answer.
- Enid’s Room — colorful goth, a sticker wall wired to seven glossary entries, and somewhere to sit when the glee runs out.
- The Playhouse — four toys, all real buttons, all synthesised rather than fetched, all reachable by keyboard.
- Your Room — the sixth storefront, left empty on purpose, with the terms written down.
- The intensity dial — three settings on every page, defaulting to whatever your device asks for and letting you turn it up past that. Gentle takes away the wobble, never the words.
- Twelve typefaces self-hosted, so reading a page here makes no third-party request.
Not built yet
Enid’s polaroid wall has two photographs and room for more. Issue #2 of the zine has a quotation slot shaped for the last line of the course and nothing in it, because the credit that line needs is not something we will guess. All of them are listed here rather than hidden, because a room that says what it is missing is more use than one that pretends.
HOW LOUD DO YOU WANT IT?
Starts wherever your device says. Nothing moves, flashes, or plays until you say so.