Latest Posts (20 found)
Unsung Today

“R.I.P. Zeus 2020–2020”

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) Early home computer games came with awkward anti-piracy schemes: “grab a word from the instruction manual” prompts, code wheels, or other mechanical gizmos. Not knowing the answer meant no play. Later on, as we’ve talked about before , some games tried to be more sneaky, or cute, or gaslighty, depending on your point of view. Instead of closing the door outright on you trying to play a pirated copy, they would pretend everything was okay – and then quietly the game would mess itself up , taking away some of your enjoyment, or preventing you from winning altogether. It’s perhaps not a surprise that this in turn inspired some people to invent fake, creepy DRM schemes. A lot of them. This 2022 video from Izzzyzzz covers that story: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/yt1-play.1600w.avif" type="image/avif"> The video is from four years ago and I will admit that this – the creepypasta , the Slendermans, the Backrooms, the Five Night At Freddy’s of it all – is the part of the internet I don’t fully understand. I didn’t dig deeper into more videos covering efforts like this, but it was at least interesting to see what people did with those and that point in time. And, it sure as hell – no pun intended – it felt like it belonged in Halloween Week. If you don’t feel like this is your kind of video, I screenshotted some of the games from the video. But I won’t tell you which ones of these were real anti-piracy screens, and which the strange internet art that blew up in the early 2020s: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/1.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/2.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/3.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/4.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/5.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/6.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/rip-zeus-2020-2020/6.1600w.avif" type="image/avif">

0 views

The Gate of the Feral Gods

Author: Matt Dinniman Genre: Sci-fi Released: 2021 Rating: ★★★☆☆ New Achievement! Total, Utter Failure. You failed a quest less than five minutes after you received it. Now that’s talent. Surviving in a multilevel dungeon that also happens to be the set of the galaxy’s most watched game show has taught Coast Guard vet Carl and his ex-girlfriend’s cat, Princess Donut, that there’s only one thing they can count on apart from each they never know what’s coming next. And this floor is no exception. A floating fortress occupied by warrior gnomes. A castle made of sand. A derelict submarine guarded by malfunctioning machines. A haunted crypt surrounded by lethal traps. It was supposed to be easy. One bubble. Four castles. Fifteen days. Capture each one, and the stairwell is unlocked. Here's the thing. It's never easy. Going it alone is not an option this time, so Carl and his team must rely on the help of the low-level, I-can't-believe-these-idiots-are-still-alive crawlers trapped in the bubble with them. But can they be trusted? Welcome, Crawlers. Welcome to the fifth floor of the dungeon. Learn more on Goodreads ➡ Dungeon Crawler Carl is a fun series of book, but like number 3 this one felt like a bit of a drag up until the last 1/5 of the book, where I think it got better. I particularly like how Carl is starting to really establish himself in the dungeon now and continues to put two fingers up to the powers that be. I felt that the story arc was really slow to get going on this book, but once it did gain momentum, it was enjoyable. I've been reading these books back to back; there's other books I want to read, so I think I'm going to take a break from reading these books and will switch to something else. I won't stop consuming the series though - my backlog of podcasts has dwindled lately, and lots of people have recommended the Dungeon Crawler Carl audiobooks. So I've started listening to book #5 in the car and on walks, and will switch to reading something else. Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️ You can reply to this post by email , or leave a comment .

0 views
Unsung Today

November 22, 1963

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories. This is a real story, and an excerpt from chapter 12 of my book Shift Happens .) The keyboards of the first teletypes looked as if the Shift Wars had happened in an alternate timeline won by typewriters with two Shifts, a century before the arrival of the iPhone. The first teletypes were, too, built with only three banks of keys, the digits sharing the top row of QWERTY. Among the most common was the striking green keyboard of Teletype Model 15, made by a company that – like many – renamed itself after its most popular product. The 15s were robust, heavy, and almost indestructible; 200,000 were made between 1930 and 1954, their production prolonged by World War II. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/1.1600w.avif" type="image/avif"> But the comparison to typewriters with two Shifts broke down as soon as you sat down to a teletype. There was one key called Figs and another called Ltrs, but there was no actual shifting. The two keys were meant to be used alone – pressing one would affect the meaning of all the keys used after it. Figs switched the teletype into digits and punctuation mode; Ltrs made all the keys once again behave as letters. The digits and punctuation covered all the common cases, but the letters were available only in uppercase, and remained so for a long, long time. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/2.1600w.avif" type="image/avif"> The reason for switching instead of shifting went back to Baudôt and his five keys. Five keys give thirty-one possibilities – not enough for the letters of the alphabet, digits, and common punctuation. So Baudôt added two non-printing combinations. Pressing just the leftmost key would switch the machine to think of letters; pressing just the second key from the left would make it focus on digits. Every chord’s character depended on what mode the machine was in: right index finger was A or 1, the middle index finger E or 2 , four leftmost fingers meant L or the equals sign. Thirty-one possible combinations became fifty-eight. And even when teletypes switched to a QWERTY keyboard, under the hood they still relied on a modernized version of Baudôt’s code, switching and all. There were more differences from typewriter keyboards. The keys had an unusual, cushioned feel: each key had a small spring inside for more comfortable typing. For the first time in history, the tops of the keys were held to the base magnetically and could be removed, making it easy to swap them for different uses. And the common mechanical gesture of the carriage return had been decoupled into two separate keys – Car Ret and Line Feed. Carriage return moved the carriage back to the beginning of the line; line feed advanced to the next line. This was done to give the teletype a bit more time for a carriage return to complete. The split was manual, however; the operator had to press the two keys one at a time, in the correct order, with every new line. Look at post-World War II teletypes, and you’ll find other interesting keys. One common one was labeled Who Are You? Pressing it would generate a special invisible code and ask the other machine to introduce itself. It was sometimes done automatically; other times it required the interlocutor to press a key labeled Here Is, which mechanically output a pre-recorded sequence of letters identifying the location, like . You might also stumble upon another ingenious physical-world backspace. Did you press a key by mistake, creating the wrong set of holes in the paper tape? You could rewind one spot and punch out all the other holes. It was kind of like backspacing on a typewriter and typing x over a typo, but it was invisible – no one was meant to read the tape itself, and the teletypes were programmed to ignore the five-hole position when printing the text on regular paper. And since paper tape was effectively infinite, a message with many corrected typos would have only one side effect – it would arrive marginally slower than one typed neatly. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/3.1600w.avif" type="image/avif"> The Who Are You?, Here Is, and Backspace keys were enhancements that came after the Model 15. But even the earlier model sported one unique key: S/Bell. In letters mode, Bell would do as expected and print a letter S . Switch to digits and punctuation mode, however, and the teletype would ring a bell. It would do so not just on the machine you used, but also on the teletype on the other side. It wasn’t a gentle typewriter bell alerting you to the end of the line, either. The teletype bell harkened back to an idea in an 1837 telegraph by Cooke and Wheatstone, its ringing meant to alert someone that a message was coming. And sometimes, it was an important message. The Morse code-powered telegraph network gave us a taste of what an internet could be. Teletypes added automation. In the late 1920s, the next step was Telex, a global network that connected business teletypes. Elsewhere, post offices in many countries brought telegraphy to the masses by introducing telegrams, a way to send a written message to someone via telegraph or teletype. No knowledge of Morse code or typing was necessary. The message would be typed in at the post office by a teletype clerk, travel through the wires, the resulting printout cut into pieces at the receiving station, and eventually be delivered by a clerk to the recipient’s doorstep as if it were a regular letter. Telegrams were much faster than letters, as they traveled mostly through wires; were much cheaper than long-distance phone calls; and didn’t require your recipient to have any technology in their house. (They also introduced the now-forgotten tradition of saying STOP in between sentences, and they begot the art of making messages as short as possible, later perfected in texting and on Twitter.) = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/4.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/5.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/6.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/november-22-1963/6.1600w.avif" type="image/avif"> But what was most commonly associated with the telegraph first and teletypes later was the instant broadcast of world events. The Associated Press (AP), Reuters, and United Press International (UPI) took Morse’s “Have you any news?” to heart, and established competing networks of teletypes clacking impatiently with the latest bulletins. Their correspondents would dictate by phone to their offices. The transcribed reports were typed in on one of the agency’s teletypes and sent within seconds to receiving teletypes in the subscribing newspapers. Since most of it happened over wires, it was often called “the wire service.” One UPI employer remembered: Nothing was true in those days unless the wire services said it was. Confirmation was on the yellow paper rolling out of Teletypes. There was no 24/7 cable TV news. No emailing. No tweeting. The teletypes were a common fixture in newspapers, “as common as a bathroom, although the machines probably were kept in better repair,” as one reporter recalled. “There was something about the throbbing of teletypes that made reporters and editors feel alive,” an article noted in the Philadelphia Inquirer in 1986. They used electromechanical technologies similar to those in electric typewriters. They were, however, driven by paper tape, and so their typing was distinctively machine-like, always at the constant speed of about 60wpm. “They made a low, guttural engine noise – rugrugrugrugrug – punctuated by that loud da dacka-dacka dak-dak, and they were as constant and pokey as a pair of plowmules. They. Yielded. Their. Secrets. One. Word. At. A. Time,” wrote the seasoned Philadelphia Inquirer reporter David O’Reilly. Just as many newspapers put the word Telegraph in their titles in the nineteenth century to align themselves with the high tech of that time, the next century witnessed many TV or radio news programs adding the distinctive cacophony of multiple clattering teletypes to their opening titles. One surprising but important component in the sharing of news was the S/Bell key. Its use evolved over time. It was no longer just about catching attention – the number of bells grew to signify the importance of upcoming news. On UPI teletypes, three bells meant “Urgent,” five bells indicated a “Bulletin,” and ten bells was a “Flash” – a story so rare and significant that it changed the world’s trajectory. Flash stories were reserved for earth-shattering events: a declaration of war, a president’s resignation, the death of the Pope. They would cause a newspaper printing plant foreman to yell “stop the presses” and a TV station manager to interrupt shows with breaking news. “Guys had worked in newsrooms for years and never heard ten bells,” wrote the Philadelphia Enquirer. Another columnist put it more bluntly: “when [a teletype’s] bells chimed out a Bulletin or Flash, it was like God clearing His throat.” God cleared their throat on November 22, 1963, when Lee Harvey Oswald shot President John F. Kennedy in Dallas, Texas, at 12:30 local time. UPI reporter Merriman Smith, riding in the motorcade just behind the president, got ahold of the press car’s radiophone and called UPI with the news. Soon, a few thousand UPI subscriber teletypes across the world started printing in unison. One inside the U. S. government cabinet plane reported: The chaos of the garbled transmission seems to capture the magnitude of the news. Knowing how teletypes – and their keyboards – worked, we can decipher most of it, starting with a few lines from a message from Hanover, West Germany: an update in the trial of a local doctor. Then the Dallas messages start taking over, although not without trouble. Typos likely happened in a hurry to get the message out, and the unusual spacing came from not giving enough time for Car Ret and Line Feed actions to finish their job. (Either could also have been the result of the Hanover and Dallas teletypes talking over each other on the same line at the same moment.) and others like it were standard signatures following each transmission: two letters for the initials of the operator, and seven to indicate 1:37pm Eastern time. How about ? It’s the operator forgetting to press the Figs key, or the signal being lost in transmission – the keystrokes 1 3 9, meaning 1:39pm, come out as , as the receiving teletype never switched to speaking in digits. This is the reason we see a repeated line of , meant to be slashes separating one message from another. That also explains the long lines of confused letters , and makes them more harrowing – those were meant to be bells, ringing to alert everyone of an event that shook the nation like few did in the twentieth century. But the switch to digits mode never happens or is lost in transmission, and the machines, obedient and clueless, interpret the transmitted data blindly. Counting the letters betrays the urgency, the desperation, or the despair felt by the teletype operator typing in the message. In a break with protocol, the early eight and ten bells grow to eleven, and then to an unprecedented sixteen bells. This wasn’t God clearing their throat – this was God caught surprised. The president was dying. Just a few minutes after seeing the UPI’s messages, CBS interrupted its mid-day soap opera to put on air a distraught Walter Cronkite, and soon the other two networks followed, suspending their usual programming for the subsequent three days and nights. On the wire, the uncanny intersection of human emotions and machine coldness continued, as transmissions of people oblivious to the tragic events in Dallas interleaved with frantic shouting from others: But in time, everyone understood and the day’s other events surrendered. An hour after the shooting, another teletype operator, Alice Guenther, started a new shift at the UPI offices. Four minutes later, the White House sent out the feared message of President Kennedy’s death. The broadcast news editor asked Alice to key it into the teletype, but her reaction reminded us that despite all the mechanization and the rhythmic ticking of teletype machines, sitting behind keyboards were still people. Guenther could not make herself finish the task. She took her hands from the keyboard, covered her face, collapsed, and cried “Oh, my God.” The operator supervisor, Jimmy Darr, walked over to her, lifted her out of the chair, let her sit gently on the floor, and leaned over the keyboard. Thirty-nine keystrokes later, at 1:35 Dallas time, thousands of UPI teletypes rang ten bells for one more time that day, and then printed, at a measured pace:

0 views
Unsung Today

A set of rectangles getting exponentially angrier, too

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) In July, I shared a video showing how strange visuals can get as you moved them further away from [0, 0, 0], and they start to be affected by the inherent limitations of floating point numbers. In response to that post, one of the readers (thank you, Ronan!) shared a similar video from a game Outer Wilds: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-set-of-rectangles-getting-exponentially-angrier-too/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-set-of-rectangles-getting-exponentially-angrier-too/yt1-play.1600w.avif" type="image/avif"> But I was curious if I could see something like this in a productivity app. I mentioned that Figma didn’t allow to move the viewport past a certain safe margin, but I since found a loophole: If you move an object off the safe area, and then invoke the Zoom To Fit command, Figma will actually allow itself to scroll further and further into the territory where laws of physics start to loosen up. It’s technically a bug, although I don’t believe it’s even worth fixing. However, it allowed me to do something fun. Behold, a timelapse of a set of macOS mock-ups deteriorating as you move them further and further away, to completely disappear when the X value reaches around 2 billion:

0 views

Noctua Fan Swap on a Calnex Rb/GPS Frequency Reference

Since this will be the only source of this process on the Internet 1 , I figured I'd document a quick fan swap I did on a piece of test/reference equipment I'm running in my Atomic Clock Tower . I took my Torx T10 screwdriver and popped off the top cover. The screws required some force to loosen, as they were all secured with Loctite. The inside is simple and serviceable. There's a SpectraTime GRClok-1500 , with an integrated timing-grade GPS module, and a stabilized 10 MHz output 2 .

0 views

Anthropic S-1, The Cost of Compute, Who Is Paying?

Anthropic's IPO is finally here; the core business is very profitable, but competition may eat all of the profits, even as investors are set up for endless dilution.

0 views
Unsung Yesterday

“Dear Human”

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories. This is a story of a second creepy bug I remember from my childhood.) The Monopoly Deluxe computer game from 1992 fascinated me for one reason that you will understand even if you know me only a little bit: despite not running on Windows, it had a really elegant rendition of a Windows-like user interface. The game came with a pull-down menu, two kinds of keyboard shortcuts, and fun sounds. There was a history log, with font sizes! There was good typography. It was, in some ways, an improvement over its inspiration, sporting gentler fonts, nicer shadows, better bezels, and cuter animations. In hindsight, it was maybe the epitome of that particular design style, more thoughtful that it needed to be and done by – I felt it even then – someone who really cared about user interface. It was still Monopoly, of course, and there were better games around. But I remember the interface of it all, and I particularly still remember one very strange moment. The game allowed you to play against one or more computer players. Instead of happening quietly inside the CPU, the computer’s turn was visualized exactly like a human player’s would be. People awaiting their turn would still see die on the board, pawns moving, dialog boxes for purchases or renting or chance appear, and then… the buttons pressing themselves. This was another thoughtful design decision, making it easier to feel you’re playing against someone else, rather than a mindless algo. That decision also came with some interesting consequences. One was the fact that, under some circumstances, you could beat the computer to pressing their own buttons. Instead of blocking that action, the game responded with a playful easter egg message that looked like this: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/dear-human/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/dear-human/3.1600w.avif" type="image/avif"> Like many other in-game actions, the message was accompanied with a sound. But this one felt different than all the otherwise joyful audio effects in the game. It was someone’s voice saying “I can do it” – perhaps a sample from a movie or another game, perhaps a reference to something. Even today , I have no idea. Without that context (if any existed) the voice felt… honestly? Intensely creepy. It was someone’s voice, or maybe even some thing ’s. Just listen for yourself: I’m telling you all this from the perspective of today, when I understand all of bits and pieces. But the way I stumbled upon it back in the early 1990s was this: I played against computer players for hours without ever seeing the “Dear Human” dialog or the voice sample, even once. But then, at some point, the game locked itself. Maybe it was an interface race condition, or maybe some other bug. In short: It was a computer’s turn, but the computer wasn’t doing anything. Tired of waiting, I clicked to rush things forward, and then… that creepy voice startled me. Worse, all of my subsequent clicks were accompanied by the same dialog box and yet another appearance of that terrifying sound sample. The game thought it was a computer’s turn and prevented me from doing stuff, but despite the creepy proclamations, the game also wasn’t doing anything itself. Imagine a young me, playing the generally heretofore fun game late at night, when suddenly everything grinds to a halt, and the tone shifts completely. My keystrokes and clicks go nowhere, and I’m trapped on a virtual Monopoly board with a frightening voice – somewhere between a child, a robot, and the Twin Peaks’s Red Room – saying, over and over again: I̷̳̦͉̯̎́̈́̎͛͘͜ ̵̹̀̓̃̇̃́C̴̼̜͔̈͐̈A̴͍̤̩̤̐̃̀̑̂͌͜N̶̬̅́̔̅͘͠ ̶̦͎̣͚̦͕͂D̵͙̰̬̲͎̩̒̇̒̕Ŏ̷̺͉̔̚͠ ̷̡̙̥̝͍͈̽͂́͒͋Ḯ̵̧͓͉͉͔̰̓T̴̩̥̤͌̓̇̉̂̒ I’ve since seen many ways in which interfaces got stuck, but this was the only one I felt like the UI became absolutely possessed . (To run the game yourself, go to the Internet Archive , click on the big green button, wait until the board appears, press Ctrl+Q to exit the game (or use the right click menu), type to run it again (now with sound), wait until the board appears, press Ctrl+N to start a new game.)

0 views
Anton Sten Yesterday

The system I no longer know by heart

Last week I had my first proper call with Buzz Usborne , which is slightly strange because I've known him for a long time. We'd never actually sat down and talked before. Buzz had recently written about rebuilding Help Scout's design system to make it legible to LLMs , so we spent a lot of the call comparing notes on what changes when AI starts doing a meaningful share of the production work. At one point we landed on something I hadn't really articulated before: I don't know every part of the design system I've been building by heart. I've spent months making decisions about it. I know why the important things work the way they do, where we deliberately reduced options, which exceptions are real, and which ones are mostly history. But if you asked me to reconstruct every component property or remember exactly how a particular state is wired, I would need to look. That used to be a fairly good proxy for how deeply I'd worked on something. If I built the whole system manually, repetition did some of the documentation for me. I knew where everything lived because I'd put it there, often several times. We'd both noticed a similar tradeoff: the system can become more structured and explicit while the person building it carries less of the detail in their head. AI changes that relationship. A lot of the production work now happens through an agent. I can define the rule, have it applied across dozens of components, check the result, and move on. Katie Langerman said on a recent episode of Complementary that the design system work she's done in the last four months would probably have taken a year before AI. The system gets built faster, but I don't get the same accidental memorization that came from doing every step myself. The surprising part is that I'm not sure this is a loss. The system itself is probably more explicit because of it. Naming has to make sense without me standing next to the file. Component descriptions need to say what something is for, not just what it's called. Patterns that used to live in someone's head have to become actual rules because an agent can't reliably work from "you know what I mean." I've written before about how design systems increasingly need to work for humans and agents at the same time. I'm noticing another consequence of that now: some of the knowledge has to move out of the designer and into the system. That sounds obvious when you say it like that. Katie put it well on the same episode: the reasoning behind a token "can't just be in your head." Of course a good system shouldn't depend on one person remembering everything. But a lot of systems do, especially while they're being built. There is always someone who knows that this component technically supports a certain property but nobody should use it, or that these two variants look similar but have completely different jobs, or that the example in the documentation is outdated and the real pattern lives somewhere else. Humans are surprisingly good at carrying that kind of mess. A team can work around gaps in the system for years because the people closest to it know where the gaps are. Agents make those gaps more visible because they don't have the same informal context. If the rule isn't written down, the agent has to infer it. If two components overlap, it doesn't necessarily know which one the team prefers. If a design system contains the right components but no guidance on how they should be composed, an agent can use every component correctly and still produce a bad screen. That has pushed me to think about documentation differently. It isn't the thing you do after the system is finished so someone else can understand it. Increasingly, it is part of the system itself. The same applies to examples, constraints, and composition rules. A component definition tells you what the component can do. It doesn't necessarily tell you when it belongs on a page, what it should sit next to, or which technically valid combinations are actually good product decisions. Those are the kinds of things an experienced designer often picks up by osmosis. If we're serious about agents working inside our systems, we have to decide how much of that judgment can be made explicit. I don't think all of it can. There is still a difference between following the system and understanding the product. An agent can know that one type style is for reading and another is for UI labels without knowing whether a screen has become too dense. It can follow the documented card pattern without noticing that the information architecture underneath it is wrong. And I still need to understand why the system works the way it does. I need to know when a new use case is genuinely different, when an abstraction is starting to stretch too far, or when the documented rule should change rather than be enforced harder. What I seem to need less of is the inventory in my head. That distinction feels important because there is a version of craftsmanship where knowing every detail is part of the value. I still recognize that feeling. I like knowing a file well enough that I can almost navigate it without looking, and there is comfort in having the whole thing in your head. But that kind of knowledge doesn't transfer particularly well. A system that only feels coherent because its designer remembers the exceptions is not really coherent. It is being held together by familiarity. Buzz's post gets at the other side of this: making a system work well with AI required more structure, more discipline, and more documentation than the team could realistically maintain by hand. The machine needed the parts that humans had previously been filling in for each other. I'm increasingly interested in whether someone new can understand why the system is shaped the way it is, and whether an agent can make a reasonable choice without having to infer the unwritten history behind it. That raises the bar in a useful way. It forces naming to carry intent, documentation to be current, and patterns to explain more than their pixels. It also exposes places where what we call a system is really just a collection of components plus the memory of the people who built them. I still find it slightly strange that I can spend this much time on a design system and not know every piece of it from memory. But if the trade is that the system knows more about itself, I think I'll take it.

0 views
Ahmad Alfy Yesterday

A select should tell you something

Heads up: your browser doesn’t support customizable selects yet, so the “after” demos below look like ordinary selects. That’s also exactly what your visitors would see in this browser. To see the difference, open this page in Chrome or Edge. There are multiple articles about and how you can use it. We finally can style a select. The bigger change is what an option can hold. Until now, an option was one line of plain text, so everything a person needed to decide had to fit in a label or be left out. Now an option can carry the thing people actually decide with: a preview, a number, a job title, a warning. They stop reading and working things out, and start recognising. Below are five selects, each shown before and after. The before is what most forms do today. The after is the same , with the same keyboard behaviour and the same form value. Only what it shows has changed. If you want the mechanics, the Chrome team’s announcement and MDN’s guide cover them well. A font picker usually lists names. To choose well, you either already know what Fraunces looks like, or you pick it, look at the result, and come back to try the next one. When each option is set in its own typeface, the option is the preview. You judge the shape, not the name. This pattern is not new. We already have in document editors (like Google Docs) and in design tools (like Figma and Photoshop). It just became available for us and all we need is one inline style per option, , and the closed control keeps the typeface after you choose. We are also able to show the category of each font, like Serif, Sans, Mono, Display, or Handwriting. Time zone pickers tend to look like “(GMT+09:00) Tokyo”. The offset is accurate and almost never what you want. What you want is the time there, so you add the offset to your own time in your head, and maybe get it wrong around midnight. Show the current time next to each city, plus whether it’s day or night, and the question answers itself before you choose. This is the only demo that needs JavaScript, because the times come from . Delivery options are usually a group of radio buttons, each with its details written out as a sentence. To be fair, radio buttons have a real strength. Every option is visible without a click, and for two or three short choices they’re the right pattern. But once each option carries a few facts, the facts end up in prose. Comparing means reading every sentence and holding the numbers in your head. A select with the facts in aligned columns turns that into a glance down a column, in the space of a single field. The columns are a grid on each option: At a company of about two hundred people, we had two colleagues with the same name, in different departments. Whenever I had to pick one of them, I went by their job title. Photos help less than you’d think, because people often don’t know what a colleague looks like, especially one in another department. A text-only select gives you two identical options and a guess. Put the title and department under each name and they become two different answers. The closed control keeps the title too, so anyone reviewing the form can see who you picked. Some options come with consequences. In a plain select, you find out afterwards. Mark those options in the list and you know while you’re choosing. needs approval People Legal , needs approval Security , needs approval Sales Support Before, you find out a team needs approval after you’ve shared. After, you know while you’re choosing. The badge appears only on the options that require special attention, and nowhere else. Every “after” in this post is a plain . Keyboard handling, type-to-jump, form submission, , , validation and the accessible role all stay with the browser, and the control itself needs no JavaScript. The bigger trade-off is on phones. A native select opens the operating system’s own picker. It shows a scrolling wheel on iOS, a sheet on Android. Those are familiar, sized for thumbs, and tuned to each platform’s accessibility features. A customizable select doesn’t use them; it draws its own list on the page instead. You don’t have to pick one behaviour for everyone. Opt in only where there’s a mouse or trackpad, and touch devices keep their native picker: Phone users then see each option’s text without the extras, which is one more reason the text has to stand on its own. The demos in this post opt in everywhere, so you can try them on any device. Customizable select is a textbook progressive enhancement. A browser that doesn’t support it doesn’t break. It shows a regular native select, keeps only the text of each option, and submits the same value. Nobody gets a worse form than they have today. If you’re reading this in Firefox at the time of writing, the “after” demos above are exactly what your visitors would see. That leaves one requirement, and it’s good practice anyway. The text of every option has to make sense on its own. “Ahmed Mostafa, Accountant · Finance”, not just a name. “Express, Tomorrow, $8.50”, not three loose fragments. In the demos, small separator spans that are hidden in the customized version make the plain version read like a sentence. No polyfill needed. So there’s no reason to wait. Find the select in your product where people hesitate the most, ask what they’re really trying to find out, and put that answer inside the option. Leave everything else out.

0 views
Unsung Yesterday

Book review: The Cuckoo’s Egg

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) My server was hacked a few months ago. It wasn’t an obvious “bad password” kind of a situation, but I believe a hole in PHP propped open by some code I wrote 25 years ago. (It’s entirely possible some ancient scripts I wrote for GUIdebook were to blame!) The hacker replaced some of my pages with garish ads for Indonesian casinos, and did some other slight damage. For a few days and nights, I played a cat-and-mouse game with the attacker, learning things, trying the newest patch, only to wake up to see some new pages on my server taken over – up until the moment I managed to close it all off. There were times during those few days when I knew I was patching my server at the same moment as the hacker was breaking it. It was a very strange, unnerving feeling, with some part of me wanting to reach out, have a conversation, generally learn more about them, or maybe also – I’m not going to lie – kick their ass. The Cuckoo’s Egg by Clifford Stoll is a book about a similar situation, except the story is from the mid-1980s, the server is at the Lawrence Berkeley National Laboratory, and the break-in takes longer than just a few days. And it all begins rather innocuously: And so it happened that on my second day at work, Dave wandered into my office, mumbling about a hiccup in the Unix accounting system. Someone must have used a few seconds of computing time without paying for it. The computer’s books didn’t quite balance; last month’s bills of $2,387 showed a 75-cent shortfall. Now, an error of a few thousand dollars is obvious and isn’t hard to find. But errors in the pennies column arise from deeply buried problems. […] I found the book – written by an astronomer! – much better than it had the right to be. The story gripping and continues throwing new wrinkles at the already interesting situation. I could sense some liberties taken with real-life events and chronology in service of smoother storytelling, but it all still feels pretty real, and nothing grated me too much. Released chronologically right in between WarGames and Sneakers , it is appropriately retro and old-fashioned – but there are still techniques that feel relevant, aspects of security that I don’t think changed that much since, and fascinating details I learned from. The only thing that bothered me was that the book should have ended a chapter or two before it did – there is a sort of second ending tacked on – but, to be fair, a lot of books have the same problem. If you feel like you’d fancy a breezy computer security espionage story from the 1980s, I’d recommend this one!

0 views

Tearaway is an amazing cozy game!

Busted out the Vita today and started playing Tearaway, what an amazing game! The art style and music give such a welcoming atmosphere. The gameplay mechanics use the unique features of the Vita so well. For example, you break through the game world by touching your fingers to the back touchpad and your face makes frequent appearances in the world (and story) thanks to the cameras. All of this is bundled in a fun, low-stakes game that makes you smile! Tearaway on my Vita If you have a Vita, I highly recommend giving this a play! If you don't have a Vita, unfortunately this is not a game to emulate. It's use of the unique hardware features of the Vita would translate poorly on any other device.

0 views
Unsung Yesterday

“Miss you, Tom.”

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) This is a really enthralling video walking people through a 2023 fan-made Doom level myhouse.wad: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/miss-you-tom/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/miss-you-tom/yt1-play.1600w.avif" type="image/avif"> When I say “a fan-made Doom level,” I’m not doing it justice. It is not just a cool map, or just a technically impressive one. myouse.wad treats the Doom game engine as a canvas to tell a particular, and perhaps even poignant story, and a story could have only been told this way. From the author of the map, by way of an introduction : Last August I lost a good childhood friend of mine, and took it pretty hard. When I was visiting my hometown for his funeral, I connected with his parents who shared with me some of his old belongings. Among them was a copy of an old map of his, backed up on a 3.5″ floppy from high school. Thomas and I were into amateur Doom mapping in the early ’00s, but I had never seen this map of his prior to uncovering it on one of the old floppy disks. As a way of paying tribute to him and all the great memories we had together, I took the plunge and installed Doom Builder in order to polish up his map and add a few modern amenities just for convenience sake. And when I say “A really enthralling video,” I’m not doing that justice, either. In the summary of the 2023 BFI video awards , a reviewer wrote: A masterpiece of recapping, Power Pak’s video is essentially a narrated journey through an ingenious mod. A good recap doesn’t just communicate plot, but also the point of the essay; this does both. Excellent pacing and vocal delivery communicates the tone of the map, and becomes a jumping off point for an analysis of horror in gaming / the oft-discussed topic of liminal spaces. […] The video itself is performance, too, further blurring the lines between what is art and what is, erm, “real.” This isn’t cheap machinima, and this isn’t a cheap walkthrough. Definitely worth checking it out.

0 views
Rik Huijzer Yesterday

Who Is Santa Claus?

(This post is still a work in progress.) According to Religion Wiki , "Santa Claus, a jolly old man with a long white beard who is said to distribute presents to good children on Christmas Eve, is largely based on Odin, merged with the Christian legend of Saint Nicholas of Myra.[15] Most Christmas traditions in Germanic countries derive from celebrations of the pagan winter solstice holiday Yule as a result of the gradual merging of the two holidays. Odin was recorded as leading a great Yule hunting party through the sky.[16] Two books from Iceland, the Poetic Edda, compiled in the 13th century from earlier sources, and the Prose Edda, written in the 13th century by Snorri Sturluson, describe Odin as riding an eight-legged horse named Sleipnir that could leap great distances, giving rise to comparisons to Santa Claus's reindeer.[17] Further, Odin was referred to by many names in Skaldic poetry, some of which describe his appearance or functions; these include Síðgrani,[18] Síðskeggr,[19] Langbarðr,[20] (all meaning "long beard") and Jólnir[21] ("Yule figure"). According to Phyllis Siefker, children would place their boots, filled with carrots, straw, or sugar, near the chimney for Odin's flying horse, Sleipnir, to eat. Odin would then reward those children for their kindness by replacing Sleipnir's food with gifts or candy. This practice, she claims, survived in Germany, Belgium, and the Netherlands after the adoption of Christianity and became associated with Saint Nicholas as a result of the process of Christianization and can be still seen in the modern practice of the hanging of stockings at the chimney in some homes." "Thor, who was honoured as the highest god in Norway" Thor can revive animals, "Their host was hospitable but very poor, and Thor, seeing that he would scarcely be able to supply the necessary food to satisfy his by no means small appetite, slew both his goats, which he cooked and made ready to eat, inviting his host and family to partake freely of the food thus provided, but cautioning them to throw all the bones, without breaking them, into the skins of the goats which he had spread out on the floor. ... On the morrow, however, Thor, ready to depart, struck the goat skins with his hammer Miölnir, and immediately the goats sprang up as lively as before, except that one seemed somewhat lame." Wore a belt, "Seizing an opportunity to tighten his belt Megin-giörd" Wore red clothing according to the painting Thor und die Midgardsschlange (1905) by Emil Doepler, And had a beard and long hair according to Thor wades rivers while the rest of the æsir ride across the bridge Bifröst as described in Grímnismál (1895) by Karl Gjellerup Thor rode in a "brazen chariot drawn by two goats". Odin owned a horse called Sleipnir "Odin himself was once dashing through the air on his eight-footed steed Sleipnir" that was gray, Thor's name gave rise to Thursday, "Thor’s name has been given to many of the places he was wont to frequent, such as the principal harbour of the Faroe Islands, and to families which claim to be descended from him. It is still extant in such names as Thunderhill in Surrey, and in the family names of Thorburn and Thorwaldsen, but is most conspicuous in the name of one of the days of the week, Thor’s day or Thursday." "Thor was considered a pre-eminently benevolent deity, and it was for that reason that he was so widely worshipped and that temples to his worship arose at Moeri, Hlader, Godey, Gothland, Upsala, and other places, where the people never failed to invoke him for a favourable year at Yule-tide, his principal festival. It was customary on this occasion to burn a great log of oak, his sacred tree, as an emblem of the warmth and light of summer, which would drive away the darkness and cold of winter." Yule-tide, also known as Yule, according to Wikipedia is "a winter festival and time of the year historically observed by pagan Germanic peoples that was later merged with the festival of Christmas". "Brides invariably wore red, Thor’s favourite colour," Thor was said to come by the houses and eat food during the night, "Thor’s temples and statues, like Odin’s, were fashioned of wood, and the greater number of them were destroyed during the reign of King Olaf the Saint. According to ancient chronicles, this monarch forcibly converted his subjects. He was specially incensed against the inhabitants of a certain province, because they worshipped a rude image of Thor, which they decked with golden ornaments, and before which they set food every evening, declaring the god ate it, as no trace of it was left in the morning." According to Adam of Bremen's Gesta Hammaburgensis 26, Tschan's translation (1080), Uppsala used to have a temple dedicated to paganism. "In this temple, entirely decked out in gold, the people worship the statues of three gods in such wise that the mightiest of them, Thor, occupies a throne in the middle of the chamber; Wotan and Frikko have places on either side. The significance of these gods is as follows: Thor, they say, presides over the air, which governs the thunder and lightning, the winds and rains, fair weather and crops. The other, Wotan—that is, the Furious—carries on war and imparts to man strength against his enemies. The third is Frikko, who bestows peace and pleasure on mortals. His likeness, too, they fashion with an immense phallus." Odin himself was also depicted as an old man with a long white beard in this George Von Rosen depiction of 1886, The Bible mentions the tradition of the Christmas tree specifically in Jeremiah 10:3-4, "For the customs of the people are vain: for one cutteth a tree out of the forest, the work of the hands of the workman, with the axe. They deck it with silver and with gold; they fasten it with nails and with hammers, that it move not."

0 views
Brain Baking Yesterday

Hello? Where Is Everybody?

The shopping centre we find ourselves in also has an IKEA nearby. My daughter & I pop in to walk through the isles that house the teddy bears. She picks out a giraffe that now lives by the name Giraffa or just Raffa . For once, we don’t really need anything else in this lovely Swedish store so we head downstairs to find the checkout registers. Instead of encountering a friendly face that helps with the payment process, we’re greeted with closed registers resulting in too long lines. The only open ones are self-scanners. There goes the possibility for some lightweight banter. Our fridge is empty. We bike to the nearest supermarket for some quick midweek resupplies. No long queues this time, but just as little employees waiting for us at the checkout: only the occasional self-scan verification makes chitchat possible. I see that they closed yet another “human checkout lane”. The System Works . On one of the campuses where I teach, as part of an experiment, a small physical Amazon store has been opened. This is one of those weird zero personnel stores where everything operates through cameras and image recognition. It feels creepy to even be there. It was also ridiculously expensive and the experiment has been put on hold, but during my trip to the USA I encountered more of these… things? Supply factories ? Stores ? I don’t know what to call them. My ISP is giving me a headache by wrongly configuring something in the remote-controlled router. This wasn’t the first time it happened, but this time, I can’t seem to fix it myself. So I dial the free support number, only to be greeted with too many robot-controlled menu options. Press 1 for Dutch. Press 2 for other requests. Press 3 if you really really need to really talk to a human—are you sure? Press 6 to confirm. Press 7 to confirm. Please wait 20 more minutes. After ten minutes, I disconnect in frustration and turn to the internet. There’s a FAQ page, a support page pointing to the FAQ page, and of course a lovely genAI-controlled chatbot. After “reasoning” (ha!) with the bot for a few minutes, it suggests to call the number I already called 30 minutes ago. I try to look for an email address but can’t find one. My fuck this, I’ll solve it myself attitude ultimately fixed the problem at the cost of a portion of my social self. I mentor a couple of students working their way through various internships in the IT industry. As the point of contact for the school, I head over there three times: an initial conversation to set the stage, a quick check-in to validate if everything is still going well, and a more formal evaluation meeting to hand out grades together with the employer. I look up where I need to be, bike over there, find the correct building but not the correct floor. I missed the info desk at the entrance—oh wait, it’s just… not there. There’s also no information on the elevator as to which company operates on which floor. I eventually find the info I need in a hallway and arrive at the reception desk of the company. Again, nobody home. I can see people clutched behind their laptop in adjacent rooms through the windows. I resist the urge to wave and look around. The glass door towards the company’s hallway is locked. There’s an iPad bolted on the reception desk where I have to register myself. The form demands my email address (I provide my work one as they have it anyway) and a telephone number (Yeah right! What about ?). It states my contact will pick me up soon. I wait. I again resist the urge to wave. After 10 minutes, the person picks me up and walks me towards the meeting room. I mention the awkward impersonal registration process; he assures it works perfectly. As a software professional myself, knowing the many points of failure, I don’t believe him. He admits to being a bit later because the system works with Slack messages but he was monitoring the wrong channel. I wished I did wave. This depersonalising of receptions to “optimise” employee efficiency leaves a very bad taste in the mouth of the visitors. I biked home confused and still feel a little sad when thinking about it. How hard can it be to put a human there to, you know, greet the visitor with, you know a smile instead of an iPad that demands personal data that’s not relevant to the visit? In the form, I had to select my contact person (that gets notified with a Slack message) which is a simple that revealed every employee’s first name and last name. Oops? On top of that, the “the person is notified, sit back and relax!” wasn’t relaxing at all: I know how async backend messages work: the frontend shows “relax dude!” but the backend says and your message never reaches the contact person. Just raise that hand. Wave. If a receptionist calls someone, I can hear them making the call and I know I can relax: the message has been passed. Smile. Hello? Where is everybody? This evolution depresses me. I want to see real (not generated) faces and talk to someone real (not generated). The rise of these annoying CAN I HELP YOU WITH ANYTHING?? chatbots on corporate websites replacing a simple contact form only adds to the irritation. I can certainly relate to the increased amount of spam received through these forms, but I pay you every month enough to keep the lights on. The least I expect in return is a humane customer service experience. By Wouter Groeneveld on 26 October 2026.  Reply via email .

0 views
Stratechery Yesterday

The End of the Internet

Listen to this post : It was the summer of 2003, just weeks before I was set to move to Taiwan, that I decided to create a blog to document my journey. I had, at that point, had a GeoCities site, a Blogspot site, a site I built in Microsoft FrontPage and hosted…somewhere, so this was my fourth swing at the blog thing (it was the seventh that ended up being Stratechery). I was intrigued by a just-released piece of software that promised a five-minute install; it was called WordPress. It did, I must confess, take me much longer than 5 minutes to install WordPress: it turned out I needed to learn how to create a MySQL database and configure PHP; once you had all of those component pieces in place, then yes, it only took 5 minutes to install! I was thinking back to those days last week when news broke that every version of PHP had a critical bug that allowed for remote code execution on the host machine; Stratechery today still runs on WordPress, but that WordPress is managed by Pressable , an Automattic company. That meant that my site was patched before the vulnerability was disclosed, and it would be crazy for me — or anyone else — to do it any other way. It’s kind of insane to think that twenty-some years ago I was doing everything by hand without having any idea what I was doing, and that it was totally fine. That’s the Internet, though: an insane invention from a time that is, sadly, gone forever. 2003 was, roughly speaking, right around the beginning of the blogosphere; yes, blogs existed — Dave Winer, often considered the father of blogs, started Scripting News in 1997, after early experiments with a personal site called DaveNet ; Justin Hall started Links.net in 1994; Jorn Barger coined the term “weblog” for Robot Wisdom , also in 1997, and the influential kottke.org started in 1998 — but it was the early 2000s when blogs suddenly seemed everywhere, particularly in the political space: That political blogs featured so prominently speaks, I think, to both the power and peril of the Internet’s first transformation. Up to that point the Internet was mostly technologists, comfortable discussing the intricacies of text editors and programming languages with other nerds on BBSs, early forums, and mailing lists; it was the politically minded, however, that realized that the freedom to start your own publication that could reach everyone was a radical development. The goal was not to make money; it was to make a difference. Originally these new publications were novel; what soon became clear, however, is that they were the tip of a wave of content that would dramatically expand the web. Newspapers had influence by being geographic monopolies; early bloggers gained influence by being the first to a new medium. Ultimately, however, the real winner of the web was Google: as the amount of content became abundant, Google offered not distribution — which was free — but rather discovery; indeed, it’s because distribution was free that discovery became the most important part of the value chain. Many of those early bloggers made a decent amount of money from Google through its AdSense advertising program; by the end of the decade, however, the ads became more intrusive even as the payouts shrank, both because the inventory was limitless, and also because the most attractive ad slots were on Google Search. And so we saw one of the first examples of how the Internet fails: because everything is open, everyone has an opportunity, which means infinite competition, which is terrible for business. For many years I rued the fact I wasn’t one of those early bloggers; a decade later, however, I realized that I was actually just in time for a much more sustainable business model: subscriptions. I wrote in 2015’s Blogging’s Bright Future : It turns out, though, that there are more business models than simply advertising, as Sullivan himself sought to show. Sullivan was, for the last two years, supported by reader subscriptions to the tune of nearly one million dollars a year, and while many were skeptical of Sullivan’s efforts when he started, his ability to raise money shouldn’t have been a surprise: his is a singular voice — to put it in economic terms, Sullivan’s writing had a low elasticity of substitution — so people were happy to pay for something they couldn’t get anywhere else. Right there was the exact loyalty that Klein fears has been lost… I am, of course, acutely aware that there is a tradeoff when it comes to the subscription business model: by making something scarce, and worth paying for, you are by definition limiting your number of readers. Stratechery, though, serves a niche, and niches are best served by making more from customers who really care than from milking pennies from everyone. In short, the answer to drowning in abundance is to purposely limit your audience — to go small. That is an economic model that works, and notably, there are a lot of bloggers on that list who are using that model today. Blogging is alive and well, it’s just constrained, and thus worth paying for. Google wasn’t the only Aggregator: a decade later there was a new means of discovery, which was social media. Now instead of searching for a site you could have a link shared directly to you, not just by email but on a site that served up interesting updates about whomever you chose to follow. And, for a period of time, followers could become friends. Stratechery’s fortunate timing was not just in terms of subscriptions becoming technically viable, but also the fact that Twitter was a community, not unlike the early Internet: genuinely interesting conversations happened in public, and you could reply-guy your way to broader distribution. Social media was also free, however, and even easier to get started than a blog ever was; that meant that the amount of content was greater by many orders of magnitude. This meant that algorithms started to matter — Facebook had one relatively early, but it took Twitter much longer — and also anyone with any sort of prominence had to start taking a much more defensive approach. Community, sadly, doesn’t scale; any platform that is available to everyone starts out special and spirals from there. Ultimately, public social media sites became personal entertainment sites, tuned for engagement, culminating in TikTok, a social media site with basically zero social component. However, that doesn’t mean social networking went away: in fact, I think that social networking is stronger than ever; the difference is that it isn’t public, but is rather in group chats. Group chats are familiar, they are high trust, they are, in many respects, the best of the Internet: even as technology atomizes us the group chat is the only place you can connect with people you care about, anytime and anywhere. In other words, the redemption of social media was — just like blogging — to become smaller. The scaling that mattered for most people was not an ever larger audience, but a proliferation of infinite finite groups. Social media 1.0 , even at its best, followed the 90-9-1 rule: one percent spoke, nine percent commented, and 90 percent lurked; the magic of group chats is not in giving everyone a voice, but a place where you feel safe to talk. The PHP vulnerabilities were just two of a host of security issues last week alone; there were also: This is, believe it or not, only a partial list, and I expect things to only get worse. All of software is built on an inherently creaky human-authored foundation; the human factor meant the primary gate in all of software development was “Did it work?”, not “Is it secure from every possible privilege escalation or race condition?” or the myriad of ways that software can act in ways not intended. The saving factor previously is that attackers were limited by human time and ingenuity as well; AI, however, has limitless time and the ability to substitute iteration for cleverness — and it’s getting pretty clever as well! It’s not a surprise that this wave of vulnerabilities is coming to light, and it’s going to get worse before it gets better — which I do, for the record, expect to happen; after all, the good guys have AI as well, and in the long run software will be better when it is (re)written by AI, and defended by agents continuously. At the same time, what this entails is that the public Internet, to an even greater extent than now, will be a battle zone at best (i.e. social media), and a wasteland at worst (everything else). Some of this is economic, as AI consumes everything — both content and attention — without giving any of the traffic back that Google did, but it is also technical: it was already a dodgy proposition to stand up your own site or app, which was the very promise of the Internet, given the hacking risks; in the age of AI it’s madness. It is sad. When I was a kid we called up BBS’s that were hosted in people’s homes; when I was in high school we downloaded music from public FTP addresses; when I was in college we set up our own websites. Anyone could set up a server, and that server was just as much a part of the Internet as any other server; that’s simply not viable any longer, even if you weren’t worried about making money. The Internet as we knew it is dead. There are, however, green shoots of possibility, and once again the answer is to go smaller. When anyone can make an app, the answer is not to try and make a quick buck in the App Store; in fact, the surge in slop will make the market worse for everyone. Rather, it’s to make something for yourself and a small group of trusted friends and colleagues. This is exactly what has happened at Stratechery: we have made a bunch of different apps, for everything from podcast production to task trackers to calendar management, none of which will ever be made available publicly. That doesn’t even include the apps made for oneself: I’ve created a bunch of different apps to manage my house and sports viewing: it turns out I had a lot of software-shaped holes in my life that suddenly I can fill without asking permission. Software has always been different from physical goods in that its zero marginal cost nature meant it could scale to far more people; at the same time, the sheer amount of up-front effort involved in creating it meant that the intended audience needed to be large enough to justify the investment. AI completely changes that: suddenly it’s possible to create software for one person, or one team; smaller target audiences aren’t just a necessity for security, they’re an entirely new and potentially much larger market for software creation at scale, by literally everyone. Or, to use the example above, the group chat era of software is here and it’s going to be so much better than what came before. Venkatesh Rao wrote an absolute must-read essay over the weekend called Cognitive Mercantilism . In brief, Rao makes the case that mercantilism rested on an assumption that economics was about scarcity and control; what brought about capitalism was demand. When people were freed from the burden of subsistence farming they discovered wants and desires at a scale that pulled entire markets into existence. Rao suggests the same might happen when people are freed from “subsistence cognition”. Rao concludes: What gets missed is the possibility that we are witnessing the beginning of a transition as profound as the one from an overwhelmingly agricultural society to an industrial and commercial one. From a world where 80% of human brains are engaged in subsistence cognition to one in which 95% are engaged in satisfying previously unfulfillable cognitive demands. The most important consequence of the agricultural revolution was not that farming became more efficient. It was that most people were liberated from the necessity of farming, allowing entirely new kinds of economic and cultural life to emerge. Likewise, the most important consequence of the AI revolution may not be that intelligence production becomes more efficient. It may be that most minds, human and eventually artificial, are liberated from the necessity of producing intelligence merely to survive, and become free to discover what they actually want to do with it. The cognitive mercantilist sees a world threatened by an oversupply of intelligence and an impending surplus of useless minds. The AI Malthusian sees a world in which intelligence outruns the capacity of humanity to absorb it, leaving a growing population of economically redundant minds primed for revolutionary explosions. The cognitive capitalist sees the possibility of an almost limitless expansion of demand, and a world full of minds whose potential has barely begun to be explored. I do understand why people have difficulty imagining this future. Capitalism, particularly over the last half century, has increasingly given way to scale, as ever larger corporations mediate ever more economic transactions, and as the Internet has played an important role in making the market a global one. The England in which capitalism emerged, however, and especially the America in which it was perfected, was much different. Alexis de Tocqueville, in Democracy in America , famously wrote: The political associations which exist in the United States are only a single feature in the midst of the immense assemblage of associations in that country. Americans of all ages, all conditions, and all dispositions, constantly form associations. They have not only commercial and manufacturing companies, in which all take part, but associations of a thousand other kinds — religious, moral, serious, futile, extensive, or restricted, enormous or diminutive. The Americans make associations to give entertainments, to found establishments for education, to build inns, to construct churches, to diffuse books, to send missionaries to the antipodes; and in this manner they found hospitals, prisons, and schools. If it be proposed to advance some truth, or to foster some feeling by the encouragement of a great example, they form a society. Wherever, at the head of some new undertaking, you see the government in France, or a man of rank in England, in the United States you will be sure to find an association. I met with several kinds of associations in America, of which I confess I had no previous notion; and I have often admired the extreme skill with which the inhabitants of the United States succeed in proposing a common object to the exertions of a great many men, and in getting them voluntarily to pursue it. I have since travelled over England, whence the Americans have taken some of their laws and many of their customs; and it seemed to me that the principle of association was by no means so constantly or so adroitly used in that country. The English often perform great things singly; whereas the Americans form associations for the smallest undertakings. It is evident that the former people consider association as a powerful means of action, but the latter seem to regard it as the only means they have of acting. My life is defined by the Internet: I witnessed and participated in its evolution, and maybe in some small way contributed to it; I certainly owe my livelihood and success to it. I bemoan its passing. And yet, in some ways, I am optimistic about what comes next. When it comes to economics, or social interaction, or now software, the only viable approach is to become smaller; smallness at scale, though, means there is not one global market, but infinite local ones. “Local” might mean geographic, or it might mean a private network; what many markets definitely means is many opportunities, because economies of scale matter less than the ability to meet new needs that only arise at the level of the association. This is where I come back to de Tocqueville: the Internet is an American invention, and has long been defined by American mores; the individuals who thrive on the Internet, no matter their nationality, come across as very American in their iconoclasm and cringe. Beyond the individual, however, there is the association, and amongst the association there is not a market, but infinite markets. Markets are just another word for needs and desires and the mechanisms of meeting and fulfilling them; the end of the Internet may mean the possibilities for creation are only just beginning. Presented by When I write about tech companies, I am often writing about businesses that depend on Stripe , because Stripe provides the foundation for Internet-native companies — including Stratechery. Consider Substack: building Stratechery was complicated and involved gluing together disparate pieces; Substack made it easy by delivering an integrated offering. One piece that was the same, however, was Stripe: Substack creators are also Stripe customers, as are creators on many other platforms. Zoom out and the pattern repeats. Fintechs can build entire business models around card programs without ever having to build the issuing and processing infrastructure underneath it. AI companies can charge for what customers actually use, which is particularly important when usage also drives costs, without having to build the systems to track and bill for it themselves. No business succeeds because of Stripe. Stripe doesn’t answer the hard questions about what to build or whether anyone will actually use it. But it does make more things practical to try. Talking Points Memo , Andrew Sullivan and Boing Boing launched in 2000 Instapundit , Little Green Footballs , and Dooce launched in 2001 Matt Yglesias , Daily Kos , Eschaton , The Volokh Conspiracy , Power Line , Gizmodo , Gawker , paidContent , and Daring Fireball launched in 2002 Ezra Klein , Marginal Revolution , ReadWriteWeb , and AVC launched in 2003 Compromised intermediate CA private keys (although this was an example of sheer incompetence, not AI hacking) Major new vulnerabilities in Node.js, GitLab, Java, and Cisco products Breaches in LiteLLM’s supply chain and Railway developer platform

0 views
Justin Duke 2 days ago

Beset

I am not breaking any news when I share the following trenchant insight: spam is back, and it's worse than ever. I'm seeing it across pretty much every front of my digital life right now, and it's one of the reasons I've pulled back from public fora like social media. The noise is simply too overwhelming. I remain optimistic that this is cyclical — that it will get solved in due time, in much the same way email spam was solved, until the phishing email was relegated to a punchline in outdated jokes. But until that happens, I find myself beset . Lazily lofted job applications fired to my personal email; barely disguised cold outreach sent not just to my work email but to my personal email, Buttondown's support inbox, and even my public calendar links. Our KYC tools are filled to the brim with people using an LLM to answer the question what is your newsletter about? It is all simply too much, and it has the unfortunate side effect of devaluing all cold outreach — a thing I used to love, when done with nuance and care — to zero. 1 To be explicit, as much of a bummer as this is to say: if you ever send me an email asking for a job with your resume attached, I will pointedly not respond. If you then follow up — as some people have — by sending it to my personal address, I will make a point of actively anti-recommending you to anyone who comes calling. I'm tempted to hook up something like Pangram to analyze every incoming email from an unrecognized sender, or to find one of the many tools I'm sure already do exactly that. This to me, like the cybersecurity chaos of last week, feels like environmental toxicity . "Selling the poison and then selling the cure", et cetera.

0 views
Langur Monkey 2 days ago

Volumetric galaxy rendering

The Milky Way is an essential component in any 3D Universe software. Rendering a realistic (i.e. science-based) and visually appealing galaxy is paramount to the user experience, and to the cohesion of the simulated universe as a whole. Galaxies are made of gas and dust clouds, so they are volumetric in nature. In Gaia Sky we have been using particle-based representations for a long time, even though we have had the volumetric rendering infrastructure in place also for a while. This post describes the rendering technique we use in Gaia Sky 3.9.0 to render the volumetric Milky Way, and how we have constructed the dataset that enables it. Interested? Keep reading. The Milky Way galaxy in Gaia Sky A little bit of history The rendering of our and other galaxies has always been a topic I dreaded. I never felt that the solutions we found were good enough. I always knew that the right way to do it was with volume rendering, but the main issue was that we did not have the volumetric data. So, for a long time, we have used approximations to render the Milky Way, some more gracious than others. Enhanced flat image — Initially, we used a single two-faced billboard with the artist’s impression by Nick Risinger, coupled with a generated star field. This was featured in the September 26, 2016 Astronomy Picture of the Day, titled “Here comes the Sun” 1 . This is a very primitive galaxy, but it looks awesome from above and in still pictures due to Risinger’s image. Top Side Wide Textured billboard approach — After Gaia DR3 landed in 2022, the catalog data were used by Stefan Payne-Wardenaar 2 to produce a high-quality representation of the whole Galaxy 3 in Blender. At that time, I worked with Stefan to produce a particle-based version that would fit in the existing billboard systems in Gaia Sky. The first version was based on textured additive billboards and dithered depth buffer occlusion. The depth was correct, but the look of the galaxy was rather cartoonish and unrealistic. Additive blending was used for all channels except the dust, which was purely occlusive in a binary sense (no sorting, so no transparency), making use of dithering to simulate translucency. This version is the one that looks the worst of all. Using textured billboards is a bad move to simulate a volume of gas and dust. Also, the brightness blows out when seen edge-on. Top Side Wide Billboards with additive and subtractive blending — Later on, inspired by this article , the textured billboards were updated to rely on blobs and additive/subtractive blending. The main issue was that the emissive parts blended additively in a very unrealistic way, and the occlusion did not respect the depth order in the scene. Several attempts were made afterwards to implement Weighted Blended Order-Independent Transparency (WBOIT) 4 , as suggested by the article, but this was very difficult to tune and produced underwhelming results. Looks better than the previous textured-billboards version, but the behavior of light is unrealistic. The brightness is mostly gone when seen from the top, but blows out edge-on due to the additive blending. Top Side Wide All these issues finally tipped me into seriously consider approaching the project of converting the particle data to a volume and implementing a proper volume renderer with emission and occlusion. The first step is to convert the particle data to a volume in the form of a voxel grid. This step is crucial, as it can make or break the whole project. Having a good dataset is the difference between a bland-looking visual and an awesome one. The source is the same particle model we were already rendering. It is split into channels, each a gzipped text file with one particle per line: where the position is in galactic coordinates, is the particle’s weight and is the emission coefficient of the particle, in arbitrary units. The Milky Way is made of three of them: Gas (~15,000 particles), Bulge (~900) and ArmDust (~93,000). The stars and the HII regions of the model are not part of the volume: they are genuinely point-like, so they keep their billboards and a voxel grid would only blur them. Reading a few hundred thousand lines and painting them into a grid is not hard. What is hard is doing it in a way that does not depend on the resolution of the grid, so that a \(200^{3}\) volume and an \(800^{3}\) volume describe the same galaxy and differ only in how much detail they can hold. Most of the work below exists to enforce that. Every particle is a point with no extent, so the first operation is a scatter into the grid: each particle adds its weight to the voxel it falls in. That is the simplest possible splat, and it is what the shipped volumes use. It is also the one that keeps the property above, because a nearest-voxel scatter is the identity of the sampling: the same data always lands in the voxel the same ray will visit. Splatting Each particle adds its weight to the voxel it falls in, so a voxel ends up with the summed weight ρ and the weight-averaged color c; here its opacity is drawn proportional to ρ. The magnification shows the arithmetic for a voxel that receives two particles. There are two details here worth taking into account: The color accumulates with the same weight as the density , so dividing the accumulated color by the accumulated density yields a size-weighted mean color per voxel. Getting the weights inconsistent here is the classic way to end up with a volume whose large particles dominate the hue. The grid is galactic but the file is not. Voxels are dumped in C order, like this: $$ (W, H, D) = gal(X, Z, -Y) $$ This is because of the axis order the shader indexes a 3D texture with. The permutation is written into the metadata, in both orders, precisely so nobody has to infer it. A raw scatter of 15,000 points into a \(400^{3}\) grid is a swarm of dimensionless points, but we need a volume, so every channel is blurred with a Gaussian. The tempting choice, a fixed sigma in voxels, is exactly the one that breaks resolution independence: it smooths more of the galaxy at 200 than at 800, and the same data produces two different objects. Instead, the blur width is a length on the particles, in world units of the box: $$ \sigma = 0.85 \times \ell $$ where \(\ell\) is the median distance from a particle to its 4th nearest neighbor — the local inter-particle spacing, not the volume divided by the count. Note that this measure is the same for all particles in a channel, as \(\ell\) is derived from the median. We do not compute a different smoothing for each particle. That value measures the gaps that actually need filling, and it is nearly independent of resolution by construction, since it comes from the particle positions alone. A channel that is denser gets a narrower kernel for free, and the same particles written at 200, 400 and 800 get 4×, 2× and 1× that sigma in voxels , which is the correct behavior. The 0.85 is empirical. A blur width given by hand in world units, per channel, never generalised; this little proxy held up across channels and resolutions. Smoothing The kernel width is a length measured on the particles, σ = 0.85 ℓ with ℓ the median distance to the 4th neighbor, so the same blur is described by twice as many voxels on a grid of twice the resolution. The result is one continuous density field; a fixed sigma in voxels would instead give a \(200^{3}\) volume and an \(800^{3}\) volume two different galaxies. Two guards keep this sensible: The color is blurred with the density kernel, over the unblurred density, so the color spreads exactly as far as the density is about to. Blurring the color separately is how you get colored halos around black voxels. The particle colors are emission coefficients, not display colors. Gas averages about 0.02, so clipping to and multiplying by 255 rounds roughly 82% of the occupied voxels to zero and leaves the whole channel carried by about thirty distinct levels. Quantizing as-is gives a black galaxy. The fix is a single scalar gain , derived from the 99.9th percentile of the occupied voxels and applied to all three channels identically. One scalar is the important part: the gain preserves the chromaticity of every voxel, so the hue is still the data’s. Per-channel normalization would give each channel the full 0–255 range and wash everything toward gray, which defeats the point of storing a per-voxel color at all. The gain is baked into the bytes, and the shader consumes the stored color as-is. Density gets the same treatment, by its peak, and is stored in the alpha channel. Each channel is written as a raw heap of bytes, gzipped, next to a small text sidecar that declares the grid and the box: The byte count per voxel selects the format (1 byte per voxel is R8 density, 3 is color, 4 is color+density) and the loader takes it from the file length, not from the file name. The RGB channels carry the chromaticity, the alpha channel the brightness, and the emitted radiance is the product . An occluding volume uses the same layout, with alpha as the normalized density. The per-channel textures are then merged into two final volumes: one emissive (Gas at 0.7 + Bulge at 0.3) and one occlusive (ArmDust at 0.08). Merging is a post-process on the textures, so it needs neither the particle data nor a re-conversion, but it does have to be careful: A galaxy disk is 6.7 units wide and 0.67 thick, so a cubic box around it is nine tenths empty space: \(400^{3}\) of is 244 MiB, where the same voxel size laid out as \(400 \times 400 \times 40\) is 24 MiB. A factor of ten, spent on nothing. The fix is to flatten the grid and the box together , deriving the grid from the data-shaped box: the detail of an \(N^{3}\) grid without the empty axes. Flattening only the grid would make the voxels anisotropic; flattening both keeps them cubic. Nothing else has to change. It is still one texture and one step count, because the ray-march step \(rayLength \times |rayDir / extent|\) is invariant under a rescale of the box: flattening it does not change how many samples a ray takes. Here we go over the galaxy shader, which is in . It is a single-pass ray marcher, but it is drawn twice : once early as a depth-only pre-pass, and once late as the emission pass. But first, we need a piece of geometry that emits the pixels to the fragment shader were we do the work. Here, anything works, as long as the pixels reach the fragment. Since we need to render the galaxy also from the inside, we use a flipped cube at the position of the model. The transformations for the actual galaxy are done in the fragment shader, so rotating or scaling this box does nothing. It is essentially a vessel to emit pixels. The box The box is drawn with its front faces culled, so it never shows up as a surface: the ray crosses the near wall and every pixel it covers receives exactly one fragment on the far wall. The shader does not use that fragment as a surface, it only takes its world position as a direction from the camera. Since the near wall is never the one drawn, the camera can also sit inside the box and the screen is still full. We said we do an early depth pass and the emission pass at the end. Why is that? Well, the volume is rendered with additive blending so its own fragments cannot write a meaningful depth. Adding two semi-transparent layers is commutative; the depth buffer, which keeps a single number per pixel, is not. And the volume cannot be sorted per fragment, so any attempt to give it “the” depth in the color pass is wrong by construction. But the scene needs it. The stars of the catalog, and the whole rest of the universe, are drawn after the Milky Way volume, and if nothing writes depth they all shine through the dust lanes. A galaxy whose dust hides nothing looks like a galaxy with a bright smudge on it. So the depth is produced as a separate mask , in its own pass, before anything else is drawn: The pre-pass marches each ray only until it finds the first sample that is dense enough to occlude, writes that distance, and returns. The emission pass marches the same ray from the same origin and finds the same front, so both agree on where the dust starts. Stars are switched from “no depth test” to “depth test, no writes”: they are hidden by the dust but cannot overwrite its depth. The volume is not the only thing that is allowed to render small. The volumes of the other galaxies (gas, bulge and dust) go into the same reduced buffer, and so do the nebulae, which are evaluated analytically in their fragment shaders instead of being sampled from a texture. All of them share the property that makes this safe: their content has no detail at the scale of a pixel, so the upscale costs almost nothing visible, while the fill rate they give back is the expensive part of the frame. The depth is never reduced. Every one of those elements still writes depth at full resolution, in the pre-pass of the table above, and before the scene draws at the reduced scale that depth buffer is blitted onto the reduced one. That copy is what keeps the reduced pass honest. Everything depth-tested in it, the stars above all, reads the reduced depth buffer, which the full-resolution pre-pass never wrote. Bringing the full-resolution depth down first means those tests see the dust front exactly where the full-resolution pass put it: without it the stars would shine straight through the lanes, and lowering the render scale would change the image instead of only its sharpness. Not every volume should occlude. The gas is emissive, and its faint outermost haze is not opaque: letting it write depth would cut a hard, sharp-edged hole in the star field, perfectly matching the box. The dust, on the other hand, should hide what is behind its lanes. So each volume slot carries its own density threshold , and only samples above it count as occluding. We define, for every channel, the threshold density above which occlusion happens: disables occlusion for that slot: the gas renders, and hides nothing. The value for the dust is not arbitrary, it comes from the data. In the dust volume, the low tail of the density histogram is the blur we applied deliberately, not matter, so the threshold is set to keep the lanes and drop the tail. The constant is per texture and has to be re-tuned if the smoothing or the normalization changes. Both volumes are marched in one loop , at the same position along the ray. That is what makes the ordering correct: a dust lane and a dust glow are the same voxels, and only the order of emission and absorption within the step decides which one you get. A few things in there are worth pointing out: Two, both of them consequences of doing the depth in a cheap pre-pass: Neither is visible in practice, and both are one comparison per sample away from being fixed properly. The renderer is only half of it. The other half is being able to load a volume from a data pack and declare it in a scene, which turned out to be mostly about formats . A volume object is a regular with the archetype, so it accepts , , / , and everything else, plus the volume-specific attributes: has one value per quality preset (low, normal, high, and ultra, adjustable from the settings dialog), so the same scene degrades gracefully on a weak GPU. Up to four volumes can be declared per object, and all of them are marched and composited in the same pass. The loader ( ) does three things worth mentioning: None of this is Milky-Way-specific: any 3D tool that can write an grid can produce a volume for Gaia Sky. The format and the scene attributes are documented in the data format and the volumes section of the Gaia Sky documentation. Memory is the price: an 800-resolution grid is \(798 \times 80 \times 800\) , about 200 MB once decompressed, per volume . The default data pack therefore ships three resolutions and picks one by data quality setting: 200, 400 and 800 voxels on the longest side of the box: Thanks to gzip (and to how much of the box is empty) the download cost is trivial; it is the decompressed texture that decides whether a card can hold it. The question a resolution-independent conversion has to answer is whether the three grids really are the same galaxy. They are: the mean ray integral (the integral of the density along a sample of rays through the volume, the quantity that has to match if the object is the same) is within 1% of each other, with the same total mass and the same hues, so what changes between them is only detail. And detail is visible: at 200 the dust cannot be smoothed at all (its kernel is 0.31 voxels, so the point cloud shows through), at 400 it is 0.63 voxels, and only at 800 does it reach 1.25 voxels and become a continuous lane. This is why the dust is the channel that decides which resolution you actually want, and why the 800 volume is the one in the preview video below. Up to 800, the volume costs what the step count says, not what the grid says. Frame time for the Milky Way alone, at QHD (2560x1440) with the camera at about 34.5 kpc above the galactic disk, on an NVIDIA GTX 1070 (driver 580.178.04) on Arch Linux. I deliberately chose to use this very old card instead of my other RTX 5080 because it may be more representative of the graphics computing power present in common household PCs and laptops. Tests have been carried out with only the base dataset loaded. With that hardware the resolution is almost free: going from 200 to 800, sixty-four times the voxels, costs under a millisecond at every preset (3.5 → 4.3 ms at low, 4.6 → 5.2 at ultra). This is possibly because the ray march is per-pixel and the grid does not change how many steps a ray takes. That is why I also built a 1300 volume, which no shipped dataset uses: 274 times the voxels of 200, for 1.5 to 2.2 ms (3.5 → 5.0 ms at low, 4.6 → 6.8 at ultra). Even at that scale the cost stays far below the voxel count, but it is no longer invisible: 1300 is now the most expensive thing in the table, ahead of the preset. The step count is also interesting. Current presets are 50 at low against 110 at ultra, and even that only adds 0.9 ms at 800 and 1.8 ms at 1300. The slowest cell in the table is 6.8 ms (1300, ultra) at QHD, 41% of the 16.7 ms a 60 fps frame allows, so even that volume is not limited by frame time on this card. What the card does pay for is memory. These are the sizes as decompressed and uploaded to VRAM, at 4 bytes per voxel ( ), for the flattened, cropped boxes the loader actually builds: Even the 1300 volume fits in the 8 GB of a GTX 1070 with room to spare. That is the flattening earning its keep: the same resolution in a cubic box would be 8.8 GB, so the high-resolution row could not have been run at all. The stills below are where the argument becomes visible, each pair sharing a camera. The top view is where the billboards fall short, and for a reason that is easy to get backwards: seen face-on, so few billboards overlap along the line of sight that there is almost no galaxy left. Top view. With so few billboards along the line of sight the galaxy almost disappears; the volume still shows the disk and its dust lanes. Volume at 800 resolution. Edge-on, the billboards look plausible at first glance, but they blow out, while the volume rendering stays consistent. The same additive blending that was too faint from the top saturates here: the bulge becomes a flat white patch and the disk loses its internal structure. The volume stays a thin dark lane with its dust intact. It is also dimmer overall, which is expected, because there the light is absorbed rather than added. Edge view. The billboards saturate, the volume does not. Volume at 800 resolution. Dust is where the grid resolution shows. Three close-ups of the same lane, same camera, 110 iterations each: The same close-up at 200, 400 and 800, 110 iterations. At 200 the fog is grainy, because the dust kernel is thinner than a voxel and the point cloud shows through. 400 is already smooth and 800 is smoother still, but the two are hard to tell apart at this framing. The stars and HII regions look the same in all three: they are billboards and never go through the grid. The last comparison is the two ends of the preset range. Low is the 200 grid and 50 steps, ultra is the 800 grid and 110 steps, so both knobs move at once and this pair shows the worst case rather than the effect of either one alone. Preset: low Preset: ultra Top view preset comparison The low preset versus the ultra preset, top view. The low preset versus the ultra preset, from inside the disk, looking at the galactic center. Low uses the 200 galaxy resolution and 50 iterations. Ultra uses the 800 galaxy resolution and 110 iterations. Against ultra, the low preset is softer and hazier, and the dust has less contrast. That is intended: low is meant for modest hardware, and it still looks decent there. Below is a video I captured with the 800 galaxy running in Gaia Sky. Credits: The Gaia Sky Project, ESA/Gaia/DPAC. For a decade the Milky Way in Gaia Sky was a compromise between what the data said and what a rasterizer could do with a pile of billboards. The volume rendering path fixes this: the galaxy is now a medium that emits and absorbs. The dust lanes hide the stars behind them and not the ones in front, and it no longer blows out or fades to nothing depending on where the camera is. Two things made it work, and neither of them is in the shader itself. The first is the conversion: sizing the blur on the particles rather than on the grid is what makes all resolutions the same object at different levels of detail. Flattening the box to the shape of the data makes real savings in memory (256 vs 25 MB for the \(400^{3}\) box). This is what lets the unshipped 1300 grid fit in the 8 GB of a GTX 1070 and still draw a frame in under 7 ms. The second is the depth pre-pass: a volume cannot write meaningful depth in a blended pass. The rest of the scene has to know where the dust is, so the cheap early pass does the trick here. So far, all this work only affects one galaxy: our own. Gaia Sky can already generate galaxies procedurally, but in 3.9.0+ that system still produces billboard particles. The next step is to adapt it to produce and render volumes. Other than that, what is left are smaller fixes rather than architecture: Finally, all this work has been done assuming we start from a particle-based distribution, which is a weird place to start for such a project. Typically, one builds the volume from scratch via analytical distributions without going through a particle dataset. For DR4, due on December 2, we will build a volume directly from Stefan’s data, bypassing the particles altogether. Astronomy Picture of the Day: Here comes the Sun https://science.nasa.gov/image-article/apod-2016-september-26-gaia-here-comes-the-sun/   ↩︎ Stefan Payne-Wardenaar BlueSky profile https://bsky.app/profile/stefanpw.bsky.social   ↩︎ Gaia’s Milky Way map https://www.cosmos.esa.int/web/gaia/milky-way   ↩︎ Morgan McGuire and Louis Bavoil , Weighted Blended Order-Independent Transparency , Journal of Computer Graphics Techniques (JCGT), vol. 2, no. 2, 122-141, 2013. Available online: http://jcgt.org/published/0002/02/09/   ↩︎ Enhanced flat image — Initially, we used a single two-faced billboard with the artist’s impression by Nick Risinger, coupled with a generated star field. This was featured in the September 26, 2016 Astronomy Picture of the Day, titled “Here comes the Sun” 1 . This is a very primitive galaxy, but it looks awesome from above and in still pictures due to Risinger’s image. Top Side Wide Textured billboard approach — After Gaia DR3 landed in 2022, the catalog data were used by Stefan Payne-Wardenaar 2 to produce a high-quality representation of the whole Galaxy 3 in Blender. At that time, I worked with Stefan to produce a particle-based version that would fit in the existing billboard systems in Gaia Sky. The first version was based on textured additive billboards and dithered depth buffer occlusion. The depth was correct, but the look of the galaxy was rather cartoonish and unrealistic. Additive blending was used for all channels except the dust, which was purely occlusive in a binary sense (no sorting, so no transparency), making use of dithering to simulate translucency. This version is the one that looks the worst of all. Using textured billboards is a bad move to simulate a volume of gas and dust. Also, the brightness blows out when seen edge-on. Top Side Wide Billboards with additive and subtractive blending — Later on, inspired by this article , the textured billboards were updated to rely on blobs and additive/subtractive blending. The main issue was that the emissive parts blended additively in a very unrealistic way, and the occlusion did not respect the depth order in the scene. Several attempts were made afterwards to implement Weighted Blended Order-Independent Transparency (WBOIT) 4 , as suggested by the article, but this was very difficult to tune and produced underwhelming results. Looks better than the previous textured-billboards version, but the behavior of light is unrealistic. The brightness is mostly gone when seen from the top, but blows out edge-on due to the additive blending. Top Side Wide The color accumulates with the same weight as the density , so dividing the accumulated color by the accumulated density yields a size-weighted mean color per voxel. Getting the weights inconsistent here is the classic way to end up with a volume whose large particles dominate the hue. The grid is galactic but the file is not. Voxels are dumped in C order, like this: $$ (W, H, D) = gal(X, Z, -Y) $$ This is because of the axis order the shader indexes a 3D texture with. The permutation is written into the metadata, in both orders, precisely so nobody has to infer it. A cap at twice the channel’s own half-mass thickness , along galactic Z. Without it, a sparse channel (a few hundred particles whose “local spacing” is an artifact of sparsity) would be blurred into a slab. A smoothing scale per channel. Dust uses 0.4×, because a dust lane that is smoothed like the gas stops being a lane and becomes a haze. Densities add. The color is the density-weighted mean over the inputs that carry one, and each input’s baked gain is undone first, so the merge happens in emission space. Otherwise a channel normalized to a different peak would bias the hue of the result. The merge verifies alignment (same grid, same box to 1e-3, metadata grid consistent with the file length) rather than assuming it. Renormalizing the sum after the merge dims everything : at Gas+Bulge 1/1 the peak lands at 1.36 and the texture is scaled by 0.73. Whether to do it is a decision, not a detail. Empty brick skipping is the single biggest performance win. On load, the voxel grid is reduced to an occupancy grid with one texel per 4×4×4 brick, holding the maximum density of the brick. A zero texel then means every fetch inside that brick would have returned zero: no emission, no extinction, so skipping the whole brick cannot change the image. The shader does one nearest fetch instead of the dozens the brick would have cost, and advances the sample index rather than the step size, so the samples it does take sit on exactly the lattice it would have used anyway. On a galaxy volume, most of the march is empty space. The jitter decorrelates neighboring pixels so a step size in UVW does not show as concentric banding. The transfer function is \(density \times color \times step\), integrated front to back, with an exposure factor applied at the end. Density is peak-normalized and sparse, so the ramp parameter is \(log_2(1 + 255\cdot d)\). Without the log the whole volume lands in the first ramp stop and the ramp does nothing. The depth is written at the first sample above the threshold, not where the ray actually becomes optically thick. A thin lane therefore occludes as hard as a thick one. The distance is along the ray, while the log depth buffer wants view-space depth. They differ by \(cos \Theta\) away from the view axis, which is exact at the center of the screen and a few percent at the corners. It crops. The grid is cut down to the range of voxels that actually hold density, plus one voxel of padding, and the cropped grid is mapped onto the same box. Writing the empty shell into the file costs file size and load time only. It builds the occupancy grid described above, and binds it as a separate 3D texture. A slot without one gets a \(1 \times 1 \times 1\) volume of ones, which never skips. It derives the format from the bytes , not from the filename: 1, 3 or 4 bytes per voxel, with the grid from the metadata sidecar. Sizing the ray-march step from the grid resolution instead of the box, so a finer grid is actually sampled finer. Replacing the time-hashed jitter with a static one (the current float32 clock dies after about ten hours of uptime). Enabling scattering in the dust, which is already wired with a coefficient of zero. Tuning the occlusion threshold, which is currently a single constant for the whole volume and would probably be better as a curve. Astronomy Picture of the Day: Here comes the Sun https://science.nasa.gov/image-article/apod-2016-september-26-gaia-here-comes-the-sun/   ↩︎ Stefan Payne-Wardenaar BlueSky profile https://bsky.app/profile/stefanpw.bsky.social   ↩︎ Gaia’s Milky Way map https://www.cosmos.esa.int/web/gaia/milky-way   ↩︎ Morgan McGuire and Louis Bavoil , Weighted Blended Order-Independent Transparency , Journal of Computer Graphics Techniques (JCGT), vol. 2, no. 2, 122-141, 2013. Available online: http://jcgt.org/published/0002/02/09/   ↩︎

0 views
Unsung 2 days ago

“I found an innocent loop that had no test in it.”

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) Speaking of fireside stories, this is a classic 1983 post called “The story of Mel, a real programmer”: […] I first met Mel when I went to work for Royal McBee Computer Corp., a now-defunct subsidiary of the typewriter company. The firm manufactured the LGP-30, a small, cheap (by the standards of the day) drum-memory computer, and had just started to manufacture the RPC-4000, a much-improved, bigger, better, faster — drum-memory computer. Cores cost too much, and weren’t here to stay, anyway. (That’s why you haven’t heard of the company, or the computer.) […] I don’t super love this presentation/​style, but it’s an interesting “close to the metal” programming anecdote (similar in some ways to Duff’s device ), and doubly interesting to try to go through the jargon and actually understand it all. Not particularly relevant to the story itself, but this is LGP-30, launched in 1956: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-found-an-innocent-loop-that-had-no-test-in-it/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-found-an-innocent-loop-that-had-no-test-in-it/1.1600w.avif" type="image/avif"> I’ve known LGP-30 for a while – some of the photos people put in the Wikipedia entry are actually ones I took at the Computer History Museum – but I saw a running one only earlier this year at a computer museum in Stuttgart. I particularly loved the industrial, lit up buttons… = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-found-an-innocent-loop-that-had-no-test-in-it/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-found-an-innocent-loop-that-had-no-test-in-it/2.1600w.avif" type="image/avif"> …and the “display” which was just an oscilloscope contorted to fit within a specific binary template: As far as I know, RGP-4000 – the 1960’s successor – didn’t feel much different, so perhaps seeing these might actually enhance the spooky story.

0 views
Jim Nielsen 2 days ago

Why My Dad Didn’t Have a Cell Phone

Here’s Dave Rupert writing about all those emails, texts, phone calls, etc. we’re getting these days: Once upon a time it had utility, now it’s all noise and grifter slop demanding our attention and giving us to-dos That last part really hit: “giving us to-dos”. I feel this. So many of the messenger apps on my phone are other people laying claim to my time and attention. It reminds me of an interaction I had with my Dad years ago. This was back when cell phones were starting to become ubiquitous. Not smartphones , mind you. Cell phones, i.e. telephones that were mobile. Texting wasn’t really a thing yet. These were devices for making voice calls wherever you went. As a teen, it seemed like everyone had one: my teachers, my friends, even my friends’ parents. But not my parents. They were “behind the times”. (Everyone was getting cell phones and we didn’t even have caller ID on our landline!) One night at family dinner I asked, “Dad, why don’t you have a cell phone?” His response? “Why would I want to allow other people to contact me whenever they want?” I still think about that. Reply via: Email · Mastodon · Bluesky

0 views