Posts in Ui (20 found)
Unsung 4 days ago

Let me walk around

A perfect example of breaking the “let me click” slash “the current action has the most momentum” principles we just talked about , in macOS Settings. When you try to add a new keyboard layout, the layouts you already have added are completely disabled, not just from addition, but even from selection : On a surface this seems useful, right? A good signal to help you understand what you’ve already done? But this implementation also makes it unable to compare layouts of keyboards you have installed with the layouts you have not, since they previews are now in two different places. And this is important, as the differences between those layouts can be tiny, but significant. This breaks momentum, and in the process also makes it hard to establish a good map of the entire space, since you are not allowed to walk around it freely. A tactical solution seems to be relatively standard at this point – disable the Add button instead, and indicate the already-added layouts in some other way. Unrelated, but also – this popup-on-a-popup reminded me of this glorious old tram bezel city I’ve seen in Melbourne: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/let-me-walk-around/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/let-me-walk-around/3.1600w.avif" type="image/avif"> #flow #interface design #mac os #preview

0 views
Xe Iaso 5 days ago

How to make VS Code go back to the old UI

Someone on the VS Code team decided to do a redesign of the product. This makes VS Code look like this: A picture of the VS Code UI that has a design I don't like. This design is fine, I guess? It's got some rounded corners that look nice, I guess, but I really just want it to look like what I'm used to. I can tolerate this kind of redesign in my chat app, but I use VS Code professionally and kinda want things to look the same so I don't have to think as much. You can revert the design change by setting in your settings.json. Then it looks like this: A picture of the VS Code UI that has the design I'm used to. Who knows how long this is going to last, but at the very least it should work for now. Thanks to jtagcat and Hugo ARNAL for letting me know about this setting.

0 views
Brain Baking 6 days ago

The Red Mailbox

The Red Mailbox next to our village’s primary school is my primary drop-off point for writing letters . Over the decades, its bright deep red brilliance has been gradually replaced by a patina of sunburned broken red. And yet, The Red Mailbox persists. It still exists. It existed over thirty years ago, when I went to that very school next to it. Other Red Mailboxes aren’t that lucky: in 2019, BPost—the Belgian posting company that was privatised in 2000—removed over one fourth of the Red Mailboxes all over Belgium in an attempt to “save the company”. The biggest reason might not surprise you: most of these boxes didn’t receive much letters: Volgens BPost is het aantal brieven dat mensen in de rode brievenbussen deponeren, met 60 procent gedaald sinds 2004. Uit een kwart van de bussen haalt de postbode nog hoogstens zes brieven per dag op, luidt het. [According to BPost, the amount of letters that people deposit in the red mailboxes has diminished by 60 percent since 2004] The Red Mailbox. Emptied at 10:00 AM. That year also happened to be the year of BPost’s stock market crash. Still, I think ultimately their decision was the right one: of all the letters I send out, I only receive about a fourth replies in that same analogue form. Especially in 2026, people don’t use The Red Mailbox anymore, turning the battered broken red metal box attached to a brick wall into a weird artefact of the past. I wonder how long it’ll take before the same emotion is triggered as wandering around in The Legend of Zelda: Breath of The Wild ’s broken world, where artefact bits and pieces poking out of a ruin reminiscent of a once thriving community now only cause weariness. Before the Mailbox Removal Program, BPost also permanently closed multiple post offices. Our village’s old post office building now is a Turkish food joint. Yet another thing of the past, just like physical banks, toy stores , and if we’re not careful, bakeries and butcher shops. Yet we are nimble: a bike ride in two directions, both about four kilometres, will take you to another office. Do verify opening hours before leaving. Even Google Street View archives dating back to 2009 do not have a photo of the old post office building in its original state. The archives do contain traces of deceased Red Mailboxes, such as the one below weirdly enough mounted against the front facade of someone’s home? I would like to believe that the owners of the house kept a notebook besides one of the windows to track all those weird people stopping by to drop their weird letters. An archived copy from Google Stret View of the one that disappeared, mounted next to a red drainpipe. The dismounting job revealed an ugly square stain behind it. Passengers will no doubt wonder what used to be on that wall, thinking the owners of that house must have done something weird. They didn’t: the government did. I wonder what personal history The Red Mailbox can tell us. How many love letters did it ingest all these years? Or birth announcement cards? Marriages? The bearer of happy news. Let us intentionally leave out the boring and perhaps more depressing tax related correspondence. We made good use of that very same mailbox when we got married, and when we had our daughter and son—I can distinctly remember it barely containing the envelopes when I dumped all those birth cards in there at once. The expected Thunk! sound of the envelope hitting the bottom was replaced by the shuffling of papers and me trying to jam them all in. I still make good use of that trusty old mailbox whenever I feel like using a pen to send a message to a pen pal, which admittedly happens less and less. Perhaps I too am a part of the problem. The Red Mailbox was not always there. In fact, it’s one of the more modern alternatives—relatively speaking—compared to the late 19th century cast iron standalone models that are now officially classified as being part of our Flemish/national heritage . This particular model in the link still stands proudly in Antwerp, yet these are the exception to the rule: I haven’t encountered a cast iron painted one in our vicinity. The little door to retrieve the letters is a lovely touch. According to heritage info of the city Spa , these models were cast by the J.G.Requilled foundries of Liège between 1860 and 1938. The most striking difference between these original models and the ones on the photos above is perhaps the fact that its purpose is no longer explicitly mentioned: the French inscription “LETTRES/IMPRIMES” is gone. By now everyone knows that a Red Mailbox is a letterbox from BPost, not a personal one. I hope. If you ever received a letter from me: think of The Red Mailbox where its humble journey all the way to your letterbox started. Related topics: / letter writing / By Wouter Groeneveld on 24 August 2026.  Reply via email .

0 views
Unsung 1 weeks ago

Testing tip: Make your keyboard fast

I believe every modern operating system allows you to set the key repeat rate and the delay before first repeat: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/testing-tip-make-your-keyboard-fast/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/testing-tip-make-your-keyboard-fast/1.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/testing-tip-make-your-keyboard-fast/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/testing-tip-make-your-keyboard-fast/2.1600w.avif" type="image/avif"> By default, on a Mac, the initial delay is 500ms, and the key repeat rate 1000ms. You can adjust both: On a PC, the shortest values are exactly the same, but Windows 11 only allows up to 405ms between key presses, and 1000ms of initial delay. My suggestion is to make them both as short as possible for testing. Why would that be helpful? There are two reasons. First, it’s good to test whether your keystrokes behave well when repeated. Occasionally you might want your interface to suppress repeating, or do something special if the key is held longer. Second, it’s a good test not just of repeating, but just the user pressing keys really fast. It’s very important for the UI to never make you wait for any animations or transition, and a lightning fast 30fps repeat rate is a good way to stress test your system this way. Here’s me holding the Tab key in Figma at a standard key repeat speed: It’s nice to see those transitions help you orient yourself as you’re thrown around the canvas. But look at what happens when I do the exact same thing with the key repeat cranked up: The transitions are now slowing the UI so much that you can no longer see any canvas movement – the canvas only catches up when I release the Tab key. The smooth movement assumed a certain minimum key rate, and perhaps wasn’t tested with a faster one. There are of course ways about it, like speeding up the interactions, suppressing the transition smartly, or introducing a custom repeat rate if needed – I talked about it a bit in my essay about designing fast keyboard interfaces . Here’s an example of an interface that suspends transitions at a fast keyboard rate and responds in real time: This looks very chaotic especially since you’re not in a driver seat, but this interface is at least honest and doesn’t make the user wait. And it might not be pure madness – you would be surprised how fast people’s brains and fingers can react. But first, you have to be aware of the problem, and I think setting up those key repeat values as short/​fast as possible will help you find more of those kinds of issues. (And you might choose to keep those high speeds anyway in regular use, like I do.) #flow #keyboard #tips Initial delay goes from 250ms, to as long as 2s. Repeat rate goes from 2000ms (once every two seconds) all the way to a whopping 33ms (30 times a second).

0 views
Unsung 1 weeks ago

“A quick internet search should provide you with step-by-step instructions.”

In 2018, Tom Cruise and Christopher McQuarrie teamed up to make a short PSA about the dangers of frame rate interpolation, a.k.a. the soap opera effect : = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-quick-internet-search-should-provide-you-with-step-by-step-instructions/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/a-quick-internet-search-should-provide-you-with-step-by-step-instructions/yt1-play.1600w.avif" type="image/avif"> It’s a strangely boring video from the men known for exciting filmmaking, but it captures a fascinating debate. TL; DR of their argument: Home TVs have an option to take a typical 24fps movie and create interim frames to make it feel like a 60fps production. It’s often on by default, but you should turn it off. What’s interesting is that 60 or more fps is indeed in some ways objectively better: you see smoother movement, and you can notice more. Once you start paying attention, any whip pan or drastic movement in the cinematic 24fps appears very choppy… …and, of course, that is completely missing the point. The argument for 24fps is that it’s simply cinema’s vernacular, right next to anamorphic lenses with their blue lens flares and vertical stretching. The movies are not about conveying information, but they are about conveying a certain feel . (And also, about tradition.) I’m mentioning this because I spotted a similar battle happening when it comes to scrolling. Go to any page in Vivaldi and hold a down arrow key for a while. That scrolls through the page, moving it in chunks, reacting immediately to the initial key press and then the synthesized autorepeat presses: [force height limit] Firefox listens to the keys the same way, but it “upgrades” the choppiness to a 60fps movement by interpolating it: [force height limit] And Safari does something different altogether – it approaches it more like a game physics engine would. It only listens to ↓ down (when it turns on the scrolling “motor”) and then ↓ up (when it turns it off): [force height limit] This has an interesting effect: the movement is smoother than even Firefox’s – that’s because it doesn’t try to straighten something choppy, but it is itself smooth, by nature. At the same time, this approach feels a bit loose, like driving an old 1960s car. It also takes away any control of speed; Safari pages always scroll at this rate, no matter your keyboard settings. (Arguably, however, control via the key repeat rate that other browsers respect is also an illusion, as it affects typing as well. Would you ever change it just to control the scroll speed?) Of course, the analogy to frame interpolation doesn’t really make sense. Safari is not a soap opera, Firefox is not a smooth motion effect on your TV, and Vivaldi is not a cinematic experience. In contrast with movies and television, I don’t think there are any expectations or tradition here. In this particular context, I believe Firefox and particularly Safari are better because this is about conveying information, and smoother scrolling does help your eyes and your brain connect all the little befores with all the little afters. But I am sharing it mostly as a reminder that a keyboard is really just a button board by a different name. And sometimes it’s good to look at a key hold, and decide: #interface design #keyboard #motion design #youtube is this a sequence of pulsating key presses, or is it a button being held down and then released up?

0 views
matduggan.com 1 weeks ago

In Purgatory Everyone Likes Crepes: My Time at a Greek All-Inclusive

I can’t remember the last time I was actually hot. It’s a thought that keeps looping through my head as I stand next to a children’s play structure in a Greek all-inclusive waterpark. The sun is beating down on an international community of mostly parents drinking watered-down cocktails out of plastic cups while their children scream and run in circles. Surrounding this little paddock of plastic is a lazy river, filled with mothers and fathers staring blankly into the middle distance as they slowly orbit the water toys. It’s all concrete and aggressively bright primary colors, suffused with the smell of gyros being cooked by a Filipino staff behind me. Living in Denmark, it’s rare for the sun to shine directly on you. Typically, everything outside looks like it has a blue filter placed over the lens—like how TV shows put a yellow filter over the camera to establish that you are now in Mexico. Sometimes in Copenhagen you might get hot, but then it will immediately start to hail on you, and you suddenly have a different, worse problem. Greece, by contrast, feels like the sun is noticeably closer to the earth. It feels personal, like a heat lamp pressed against your skull. My daughter has been playing peek-a-boo with a cute baby on a bench next to this water playset for long enough that I feel a moral obligation to go over and say hi to the mom. She’s a nice woman, watching four kids at a waterpark alone with a casual calm I actively envy. I’m a little stressed keeping eyes on just one, but she has four kids ranging from around ten to two, running around and disappearing beneath the waves, only to emerge just before I would panic. She has a small sunburn on the small of her back that I assume she either can’t reach or forgot—a small, raw triangle of red. We chat briefly. She asks where I live; I ask the same. I’m surprised when she answers Russia, mostly because I don’t get much exposure to Russians in Denmark. I clearly make a face without meaning to, because she quickly adds, "Their father is off fighting in the war." Ironically, I think she added this to head off me judging her as a single mother. Instead, revealing the father is a Russian soldier has made the part of my brain that regulates politeness completely short-circuit. What is the social etiquette for the wife and children of a military power you don’t support? I’ve never even considered this question, standing here in my swim trunks, my too-pale stomach exposed to a hostile world. I don’t want her children to be orphans, obviously. Neither she nor they did anything to start this conflict. But I’m worried that expressing vague positivity will end like my conversation with an Israeli in Copenhagen who took my neutral statement, "I hope the conflict ends soon," and responded with a wink and, "It will, with Trump at the helm." "I hope he comes home soon," I say, keeping my face perfectly neutral. She nods and resumes throwing a ball around with her children. She seems completely unaffected by thinking about her husband, which I think is actually the strange magic of the all-inclusive resort. It is a geopolitical anesthesia. The world is burning down, but here, the ice cream machine is still running. On most topics, I don’t consider myself a snob. I enjoy a Michelin-star restaurant, and I enjoy a nice slice of 7-Eleven pizza at 2 AM. I'll finish a thick, sad Classic of Literature and then immediately pick up Space Marines vs. The Metal Skeleton Wizard on the Moon . But on travel, I’ve always looked down on the all-inclusive crowd. Sitting one rung above a Carnival Cruise on the ladder of human decay, the all-inclusive always seemed like the most cynical way to say you had legally stepped foot in another country. My first real exposure to this was in Puerto Rico. I would leave my bespoke 20-room boutique hotel and scoff at the barbed-wire fence surrounding the American mega-resort down the road. "Why would you fly to the Caribbean to eat at a steakhouse?" I’d say, dripping with scorn to my wife, who would nod as we walked through dark neighborhoods on our way to eat dinner in someone’s actual living room that Google Maps called a restaurant. As I traveled the world, I saw these giant compounds everywhere. I swore I’d never become one of those placid, sunburned people wandering around a sculpted grass lawn, slightly buzzed at 11 AM. So imagine my surprise when I found myself finishing my second tequila sunrise before lunch, staring at a too-blue pool. The resort’s "activity crew" was out on Crepe Island—so named because it had a full crepe station on an island in the middle of the pool. "Really, it's a crepe peninsula," I say to nobody. Nobody cares. They are aggressively not paying attention to anyone else. This is not a community. A line of unlicensed, Disney-and-Nintendo-adjacent costumes are paraded out, with "Merio" closest to me. Kids kept trying to give Merio a high-five. I don't know if it was the suit or if the guy inside was just sick of his job, but he kept waiting too long to high-five the kids back, inevitably wacking them in the face or the back of the head as they moved on. Over and over, an excited child would run up, followed by a bizarre, lagging delay before the inflated hand would strike. "At some point, that's just hitting kids," I said to the ether. The woman next to me put her AirPods back in. My wife had booked this trip as a reward to our daughter. Having been a remarkably good sport as we dragged her to such famously child-friendly vacations like "A Sheer Cliff Overlooking Icebergs in Greenland" and "Endless Climbing Up and Down Stairs in Florence," we wanted to give her a chance to just be a kid. When we asked her what her favorite vacation was, she responded with zero hesitation. "Lalandia," she’d say, before resuming coloring in her coloring books with so much force you could see the head of the marker get pushed back inside the plastic casing. Since Lalandia is effectively a massive, indoor all-inclusive in Denmark, we figured the same concept in Greece would at least be a warm alternative. We boarded a chartered flight direct to Greece, my first time on a flight where everything was delivered in Danish. I felt like a spy hiding among the locals, fearful they'd discover the American among them. Safe from prying eyes, I was pleased to watch the Danes engage in behaviors they usually made fun of us for. Loud conversations were had, crunchy snacks were aggressively unwrapped, and general uncouth behavior typically shunned was suddenly fair game at 30,000 feet. Upon landing, the tour coordinator told my wife and me that we had to "run" to make our bus. My wife took off for the toilet; I grabbed the kid and the big suitcase and sprinted for the van. We then sat in the van waiting to take off for over an hour. What I hadn't realized in my heroic rush to the van was that I had left a small carry-on sitting in the middle of the airport. It was filled with snacks, coloring books, and also my wife’s wallet and passport. The first night at our all-inclusive was understandably tense. Variations on the word "idiot" were thrown around. The next day, we got the good news that the bag was safe and sound at the airport police station on the island of Kos. So while my family went off to the pool, I went to the lobby and called a cab. My driver arrived 30 minutes later and immediately asked, "Is it ok if you sit up front so we also take these beautiful people downtown?" The Scottish woman in the back blushed at this. I, lacking the social architecture to recognize warmth, simply thought: Wow, bold move saying that in front of her husband. I got into the passenger seat. This, as I realized later, totally broke down the driver-passenger social construct. After dropping the charming Scottish couple off in the downtown area, my driver started telling me literally everything about his life. For the next forty minutes, I learned how his brother had been a firefighter, then one day went on vacation to Vietnam, fell in love with a Vietnamese woman, and opened the only authentic Greek gyro restaurant in Hanoi. He had a booming, theatrical laugh and was poured into a skin-tight polo shirt. "Why are you going to pick up this suitcase your wife lost? DO WE EVEN NEED TO ASK?? HAHAHA! WOMEN!" Then he’d get deadly serious and remind me, "Children, they're the most important thing." I had spoken maybe six words at this point in the trip. I forced a laugh, silently calculating the statistical probability of being murdered and buried in a Greek olive grove. It would be a beautiful place to die, though I worried they’d use a photo of me from this trip—pale, squinting in a baseball cap—for the Netflix documentary thumbnail. Some true crime podcast would inevitably conclude I had it coming. At one point, he pulled the cab over to show me a flat patch of grass. "This is where I saved the island from a wildfire," he said proudly. I couldn't see any sign of fire; it just looked like a normal field with the grass crushed. I didn't say anything, as up to this point, the conversation had been delightfully one-sided. I had mostly sat sweating through my shirt, nodding. He told me how someone had thrown a cigarette out of their car, and it had started to smolder. He had stopped and used his legally required fire extinguisher to put it out. "It's good that I had this," he said, patting the dash. "This is why a robot can never replace taxi drivers." He then stared at me as if I were an assassin sent from Silicon Valley. "You betcha," I said, sweating. I wanted to assure him I wasn't there to replace him with an app. My amoral peers back home were already working on it, but I personally wouldn't kill his livelihood. Just people who looked and sounded exactly like me. I kept poking around silently instead, but then he caught me looking at the giant bulldozer sitting twenty meters away, its tracks leading directly to the field. I'm a genius like that. "Yeah, alright, also the bulldozer helped a bit to put the fire out. But mostly, it was my fire extinguisher." The bulldozer was merely an accessory after the fact. He then changed the subject by telling me that Tom Hanks had sat in his taxi "right where you are sitting." "Did you know Tom Hanks loves Greece and we love him? He is such a friend of Greece that we gave him a passport." Is Tom Hanks Greek? I thought, staring out the window. Why are there so many interior decoration stores? Is everyone on this island redoing their bathroom? "Tom is so nice, we love him." My brain returned absolutely no information about Tom Hanks, which frankly is typical of my mind. He clearly wanted me to respond with a Tom Hanks factoid, but all I could think to say was, "Yeah, his son was really good in Fargo ." "HIS SON? Who is talking about his son?" He took the conversation back over, explaining how Tom Hanks’s wife had sat in the back of the cab while Tom sat in the front. Weird choice, Tom, I thought, looking for a sign we were wrapping this trip up. When we arrived at the small airport, he parked randomly outside the main building, basically just the corner of the road that led from the airport back to town. "Wait, are you coming in with me?" I asked, confused. He nodded, saying it would "take way too long" if I went in by myself. Suddenly we were concerned about efficiency. He marched us in, knowing everyone who worked there. I found myself in a small police office that definitely didn't understand the separation of church and state. There was a massive crucifix on the wall, and each police officer's desk was covered with a Jesus mousepad and a large picture of the Virgin Mary. My cab driver and the police officer negotiated the release of the suitcase in front of me without bothering to involve me. At some point, I was told I could take the suitcase and get out of here. Nobody had asked me any questions except to quiz me about the contents of the bag. On the way back, we stopped for tea because, truly, what is a taxi meter at this point? We'd been in the car together for like two hours. He told me how his mother-in-law had almost died from a heart attack. "It's good that she could get to Athens in time," he said. He then told me how during the off-season he harvests olives from his family farm and has them pressed down the street. "It's heaven working the fields with your family." I imagined my siblings and I being asked to harvest olives in the beating sun and immediately envisioned four body bags in the shade of an olive tree. I nodded, staring out the window at a fire extinguisher store across the street, where what looked like a 12-year-old boy rolled a cigarette seemingly one-handed and lit it while sitting on top of a barrel. The long grass around the fire extinguisher store seemed primed for a fire. What happens if a wildfire hits a fire extinguisher store? I pondered, while my driver went on about the beauty of the Mediterranean or something I wasn't paying attention. Then we packed it up and went back to the hotel. "Thanks for a nice morning, Mark," he said fondly to me as I got out. My name is Mat. But I guess if you've saved the island from a wildfire, you can call me whatever you want. I got back just after Mini Disco. This was a one-hour dancing marathon for the kids in the semi-enclosed theater. With two fully manned drink stations on either side of the stage, it was an opportunity for children to dance while their parents drank like an asteroid was imminent. The songs stayed the same every night, but on this first night, we were going to learn a valuable lesson: Always buy the t-shirt. Apparently, while I was learning the ins and outs of the Greek cab business, a nice woman had asked my wife and daughter if they wanted to buy a t-shirt for the Mini Disco. My wife, smelling a tourist scam, had hard-declined. What she didn't realize was that the climax of the Mini Disco was a formal t-shirt presentation ceremony. Each child's name was called, they were presented with a t-shirt, and then they were allowed to hug Leo the Lion. My daughter didn't understand that she didn't have a t-shirt. So, when the name "Eleanor"—which is not her name—was called, my daughter hopped up and snagged the shirt. This meant my wife had to rush onto the stage, rip the t-shirt out of our daughter's hands, and hand it to the sheepish little girl whose shirt it actually was, all while holding a cocktail. It was a masterclass in parenting under the influence. The next day, we were on the hunt to put in an order for the t-shirt, having made the most serious promises parents can make to a child. After we chased down the red-haired French woman running the kids' merch table, we went to the main pool. She didn't seem surprised to see us come crawling back. I got the sense the first day she was doing the sales pitch, then after that she just waited for us to come to her. There is a weird etiquette to pools and British people. They will rush out the second you are legally allowed to put a towel down on a chair, meaning from 8 AM to 1 PM, there isn't a single open seat. The British treat pool chairs the way trench soldiers treated no-man's-land: as hotly contested territory worth dying over. But if you are lazy like my family is, you just wait. They start to leave the pool around 1 PM, and you can get a great seat with zero work. The next day, you repeat the entire cycle. That evening, kiddo got her shirt. It was a proud moment; she clutched her blaze-pink t-shirt to her chest and teared up with pride. Soon, the days started to blend together. At some point, we all got an emergency text message telling us about wildfires on a neighboring island. I assumed the resort staff would need to calm down the crowds, as you could pretty clearly see the smoke from the fire. The sky was turning a dark, orange-brown in the distance, and the air smelled like burning rubber. Nobody cared at all. A thousand people looked at a Greek text message they couldn't read, put their phones down, and picked up their beach reads. The apocalypse was met with a shrug. As an allegory for global warming, there is something particularly bleak about people dancing in a pool to 90s boy band hits as a thick plume of wildfire smoke shoots up into the sky. Thankfully, here nobody pretends to care about anything, so I was able to slip back into a soothing apathy. In a world that was constantly asking me to pay attention to some fresh horror, this was a place that asked nothing of you. Toward the end of the trip, we decided to head down to the small town and were dropped off at Dolphin Square. We started walking around, looking at Google Maps to see what we should look at. There was a Roman House, which is basically an empty lot full of pieces of old Roman architecture and a sign saying I needed to pay 10 euros a person. Since nobody was there to collect this 10 euros, the sign felt more aspirational than practical. Someone should pay this Greek island 10 euros, but not today, I guess. But I looked at the old rocks. My daughter was unimpressed. She looked at the ruins, looked at me, and asked if she could get ice cream. "Denmark has a lot of old stuff," she said, which, in her defense, is true. We walked around a bit more, buying little tourist trinkets. I'll never understand who buys the t-shirts that fill the small streets of these towns. Who is the demographic for a shirt that says "I heart my boyfriend"? And more importantly, where is he? Does he buy the t-shirt for you before you go on a solo trip without him? But we went to a small restaurant and had a proper meal for the first time in days. Despite the heroic efforts of the staff at the resort, it was actually hard to eat there meal after meal. The culinary philosophy seemed to be "cook the will to live out of it." Everything was either fried and dried out beyond belief, a hard puff pastry, or so bland you couldn't really tell what was going on. The lamb sorta tasted like the chicken, which tasted a lot like the pork, which tasted like a cry for help. At one point, we went to an Asian-themed restaurant on the resort, and I was served "duck with Chinese pancakes." The duck was well-cooked, but the pancake was an Old El Paso flour tortilla. I couldn't help but feel like the duck died for no reason. At one of these meals, where my daughter pounded another plate of french fries and pizza, a British woman at the table next to us told me how her entire family looked forward to this trip. She started to tear up as she explained that she and her husband had worked extra hours this year to make it so their kids could come with them. "It just makes me burst with pride to think about," she said. As she spoke, one of her kids sat beside her, wearing noise-cancelling headphones, staring at an iPad, and methodically eating an entire pepperoni pizza without making eye contact with another human soul. By the end of our week, I was eating meals of plain bread with watermelon and coffee. My daughter was consuming what looked like a kilo of Nutella, and my wife and I settled down for another cycle. We only ended up going to the actual beach, which was beautiful and maybe 200 meters from our hotel room, once. The ocean was beautiful, with rolling hills in the background, perfect warm water that was the saltiest water I've ever been in. It was like swimming in a giant, warm tear. Everyone but me hated it because it wasn't as nice as the pools. "Ugh, there are ROCKS!" my daughter shouted, upset at the audacity of the ocean for existing. Honestly, the rocks hurt a fucking ton, but I was too self-righteous to admit it. "Let's enjoy nature, everybody!" I yelled, bleeding from the feet. I thought by the end of my time with these people that I would come to think less of them. I expected to leave despising their complacency. Instead, I found myself weirdly protective of these folks. They are just trying to make some childhood memories with their kids, trying to manufacture something, anything that looks like a normal childhood in a world burning down. I won't lie, the all-inclusive life isn't the life for me. It is a place out of time, where the enjoyment of it requires a total suspension of your relationship to the outside world. But I do now understand the appeal of not being challenged. In a time when everything is being questioned and every tradition and norm is falling apart, this is a callback to frankly an easier time to be alive. And we ended up getting the t-shirt, which, when you break it down, is really the most important part.

0 views
alikhil 1 weeks ago

How to not burnout

As someone who has experienced burnout, and has talked to many people who have experienced it, I can tell you that it’s tough to recover from burnout. It may take a lot of time and money and can cost you your job or even your profession. However, it’s much better to prevent it by taking some precautions and following simple rules. It requires less effort, helps prevent burnout and costs less. You won’t find a secret recipe or a silver bullet here. I genuinely believe that burnout can be prevented by following a few simple rules, or better yet, by treating them as hygiene. Doing the same thing every day can become extremely boring. It’ll slowly kill your motivation and you start hating your job. Automate repetitive work . Reduce the maintenance burden. For example, if you find yourself handling the same type of ticket over and over, build self-service workflows, or at least write instructions so other engineers can handle it without bothering you or your team. After you spend enough time repeating the same action many times, you’ll likely end up being good at it. Your colleagues will notice that and you’ll be asked to do this action even more. Boredom is another risk of repetitive tasks. If you find yourself bored with the same work, problem, technology or anything else, find a new challenge: something new to discover and solve, a new problem, a new tool or skill to learn. Remote work, lack of verbal communication, and absence of feedback could lead to loss of sense of reality, causing you to start doubting our skills, competence, and impact. Ask your manager and your peers for honest feedback . Accept it. Your self-doubt will likely disappear and you’ll get some direction on how to improve your skills and grow. Being motivated and productive at work will lead to big results, doubtlessly. However, for most people, life is not limited only by work. Chronic overworking will damage other areas of your life. While your productivity could benefit in the short term, in the long term you’ll suffer from tiredness, lack of motivation, and bad sleep. So try not to overwork when you can . If you had to overwork because of a strict deadline or an urgent delivery, try to compensate it by taking days off soon afterward to recover. Don’t check your Slack/email after working hours . You need a real pause. Reading work-related messages will keep your brain focused on solving problems instead of resting and being present with your friends and family. You are still working, and, in fact, overworking. If you can, I’d recommend having a separate smartphone for work-related things. You may say: “But if I don’t check Slack/email, I might miss something important and urgent.” I believe this concern is overestimated. Most communication can wait until the next morning. For really urgent matters, on-call practices should be in place, and another tool should be used, like PagerDuty. Use your paid time off days . I’ve met people who don’t use their PTO days; they stack up until they vanish. Disconnect from your work, get new ideas, travel and catch up with other areas of your life. Visit friends and family. It’s a basic necessity. It’s not surprising that minimum vacation days are required by law in many countries. Get regular physical activity. I’m not saying you should master volleyball or run 10 km every day. It could be anything convenient for you, like swimming in the sea, doing yoga, walking 10,000 steps, hiking – whatever suits you best. It can help to relieve stress and clear your mind. It’s especially useful to do it just after you finish your working day, to switch contexts. Physical activity can be a smooth bridge from your work back to your life. Have a hobby. Find something you’ll enjoy doing. It’s better if your hobby has nothing to do with your job – ideally, it should be something totally different. For example, I spend all day sitting at home in front of my computer as a software engineer. So as a hobby I’d choose something I’ll do away from home and with other people. Like going to improv comedy classes, or playing padel, or playing board games. Imagine loosing your job or burning out and when work is the main part of your self-identity. The crisis will hit you hard. If you have no idea what could be your hobby, go and try new things. Ask your friends about their hobbies, ask whether you can join them. Look for activities online, on platforms like Meetup. Think of things you enjoyed doing in your childhood. It’s easy to fall into workaholism, start overworking, forget to recharge and neglect other aspects of your life. Keeping work and life balanced takes effort. Find what works for you. What do you do / don't do to not burn out at work? Tell the world!

0 views
Brain Baking 1 weeks ago

A Beginner's Guide To Writing Snail Mail

One of the first satisfying things I did this morning was donating a sealed white envelope into a red mailbox. I hope to receive a response in a week or two. Or three. Does it make a difference? The contrast between my awkward habit of F5-ing the digital mailbox couldn’t be bigger. Neither could the yielded satisfaction from utilising both systems. One is very fast, caters to my impatience and fuels my discontent when finally a new email appears that turns out to be yet another sloppy phishing attempt. The other gives me a perfect excuse to ink a nice pen, take the time to write, add a printed photo perhaps, or another physical trinket, and start the ritual of taking out the bike to sprint to the said mailbox. And thus here is a beginner’s guide to committing yourself to writing less of the former and more of the latter: hooray for snail mail, booh for electronic junk. If by any chance this text convinced you to start writing and looking for a postage stamp, but you don’t quite know who to address it to, please reach out and we can start a fruitful conversation on paper! Let’s start with the material needed to start writing a letter: pen and paper. First, get yourself a nice pen. This being Brain Baking , of course I’d recommend a fountain pen , but a good roller ball is as good as any. Write with something that feels comfortable: a letter might feel like an endurance session if it’s been a long time since you’ve held a pen. There are plenty of resources that list great entry pens in case you need to start from scratch: the Pilot Prera/Metropolitan and Lamy Safari are both superb and don’t cost an arm and a leg. Second, consider which paper to use. If you do decide to write with a fountain pen, remember that cheap printer paper has the tendency to bleed through depending on the ink and the pen nib size. I once got gifted beautiful off-white laid paper for writing letters, but the ribbed texture makes writing with a small nib size difficult. If all this sounds too daunting, get out a sketch book pad, tear out a page and just get writing. Preparing a wax seal at the back of a letter. Pen: Pilot Custom 743 Verdigris. How do you address someone? Should you note the date and the location you write from? (“Dear friend x” might do and yes and yes) Did you know that you can write, draw, sketch whatever you want in a letter since it doesn’t adhere to a rigid structure full of zeros and ones? Did you know you can “attach” anything you want as long as it stays under a gigabyte in size? I love slipping in sealed Magic: the Gathering boosters I have lying around and hearing they pulled a valuable shock land afterwards. I love printing a photo with the Phomemo printer and attaching it with a piece of washi tape. I love using different pens to write different sections. Or whatever. Do whatever you want. Write whatever you want. But write. And don’t stop there: actually sending the thing is also highly recommended. It’s time to choose a stamp. If it’s designated for someone you really like you could consider paying a little extra to pick a nice theme. In Belgium, at the time of writing, 10 non-prior stamps with a theme cost €16,80 —with just the king’s boring head it’s €15,80. You can even create your own stamp! My European stamps are gone so I’ll be ordering these: Twenty custom Jefklak's Codex/Gobliins 2 BPost stamps to be used within Europe. Weirdly enough, that’s not more expensive than the pre-made philatelic stamps for EU correspondence: €14,75 for 5 stamps. Yes, that’s still much more expensive than quickly blurting out a few words on a keyboard before pressing the send button. Perhaps that’s also an advantage: it causes you to more deliberately think about what to write. And that’s only from BE to anywhere outside BE within EU, so perhaps only my loss 1 . Don’t forget to switch pens when writing the address as the envelopes I can buy here are not made from very high quality paper. Once you’re done with that, the real fun can begin: flip the envelope, write your own address ( Return To Sender, Address Unknown —shut up, Elvis), and then it’s time for the grand finale: sealing the envelope. Since I wrote about wax seals in 2022, I got another seal: of course the Brain Baking logo. I now own both: the W+K design for sending letters to family as mentioned in that post and the Brain Baking one for my internet friends. I’ve seen folks complain about delays in mail deliveries if they do use a wax seal, presumably because the letter got stuck in the sorting machine because of the thickness of the seal. As far as I know, that’s just speculation, and I haven’t encountered that problem. At least no more delays than the usual delays. We’re still talking Belgian postage services here; they’ve got to live up to their name. Try to not spill too much wax everywhere, I guess? Now why would you go through all that trouble of sealing and picking a nice stamp? Because you’re not only doing yourself a favour in doing so, but also the person at the receiving end. And no doubt they are worth it as you decided to take out your pen instead of turning to your computer—or even worse, instant messaging app on your phone—yet again. In case I still haven’t convinced you, please read Simon Garfield’s book To The Letter that begins like this: Letters have the power to grant us a larger life. They reveal motivation and deepen understanding. They are evidential. They change lives, and they rewire history. The world once used to run upon their transmission – the lubricant of human interaction and the freefall of ideas, the silent conduit of the worthy and the incidental, the time we were coming for dinner, the account of our marvellous day, the weightiest joys and sorrows of love. It must have seemed impossible that their worth would ever be taken for granted or swept aside. A world without letters would surely be a world without oxygen. Time for the final act: take out a bike (or polish your walking boots), seek out a mailbox, and donate the envelope, hoping for the best. Wait. I forgot to tell you something important. Did you already seal yours? No? Good. Because just a touch of modern technology usage won’t hurt here: take a snapshot of your letter—both sides. In a month, when you do receive a reply, you can still refer to whatever it was that you sent. The original one doesn’t usually get sent back like in a digital email conversation. I once received a reply and after three weeks I completely forgot what I wrote. “It was very touching”. Thanks but… what was again? Happy posting! Domestic corerspondance cost only €0,84 in 2018, eight years ago. Now that’s €1,68, literally double the price. The Dutch Wikipedia article on Belgian postage stamps keeps tabs on the price evolution in case you’re interested.  ↩︎ Related topics: / letter writing / By Wouter Groeneveld on 17 August 2026.  Reply via email . Domestic corerspondance cost only €0,84 in 2018, eight years ago. Now that’s €1,68, literally double the price. The Dutch Wikipedia article on Belgian postage stamps keeps tabs on the price evolution in case you’re interested.  ↩︎

0 views
Simon Willison 2 weeks ago

Qwen 3.8 27B is excellent, but it defaults to wildly overthinking things

Friday's big release was Qwen 3.8 27B , an Apache 2 licensed 27B parameter vision-capable LLM from Alibaba's Qwen research lab. I've been looking forward to this one: 27B is an excellent size for running a model on a reasonably specced laptop, and its predecessor Qwen 3.6 27B was impressive. Qwen's self-reported benchmarks for this model are eye-opening. They show a boost from both Qwen 3.6 27B and the closed-weight Qwen 3.7-Plus, which was one of Qwen's strongest models of any size as recently as May this year . It will be interesting to hear what independent benchmarks have to say about the model. I've been running the model on two different machines: my 128GB M5 Max MacBook Pro, and an NVIDIA DGX Spark . On both machines I'm running LM Studio and their 17GB Q4_K_M quantized build . I also tried using directly on the Spark. Qwen's documentation describes the model as defaulting to for the reasoning effort, and the LM Studio GGUF I've been trying preserves that default: Qwen3.8 comes with official support for , which can be used to adjust reasoning depth and control cost: This is a hilarious default. It's absolutely not a good way to run the model, especially on consumer hardware. I've been finding the results extremely entertaining. I quickly ran into problems with LM Studio's default context limit of 8,192 tokens - Qwen was using them all up thinking about even the most mundane of problems. I loaded the model with the full 262,144 maximum context length and that problem went away. Here's the pelican riding a bicycle SVG I got from my first attempt with that increased context length. It took 21 minutes to generate, using 22,276 reasoning tokens to produce 3,223 tokens of output. You can read the reasoning trace here . This is by far the best pelican SVG I've been able to generate with a model that runs on a local machine - and this Qwen is pretty small, just a 17GB file on disk. There's a lot to like about this: Was that worth waiting 21 minutes for? Absolutely not. Here's that same prompt run with reasoning turned off - transcript here . This one produced 3,715 tokens and took 137s - just over two minutes. And just for completeness, I used OpenRouter to run the same prompt through the much larger Qwen 3.8 2.4T-A95B (released last week ) and got this snazzy animated SVG : Your browser does not support HTML5 video. I said Qwen at xhigh has a tendency to over-think things, but how bad really is it? I tried a much simpler prompt, again with that default extra high setting: Qwen's reasoning trace started like this: The user is asking for an SVG drawing of a circle. Simple request — but I want it to be a carefully crafted piece. Let me make something that goes beyond just : a single self-contained SVG file with character — maybe a geometric "circle study," with subtle animation, layered rings, and a distinctive palette. Keep the scope right: they asked for an SVG of a circle. So the core is a circle. But I can add craft: concentric guide circles (like a compass/geometry drawing), tick marks, a soft gradient fill on the main circle, restrained ambient motion (a slowly rotating dashed ring, pulsing glow). Respect prefers-reduced-motion? That's more for CSS; SVG SMIL or CSS inside SVG will do. Palette options: deep teal ink on warm paper? Or bold vermilion circle on off-white with navy construction lines — Bauhaus/compass-drawing vibe. Let me go with a "geometric study" look: cool slate background, or bright paper white? Paper white is fine if it's not the cream-and-terracotta combo. [...] Several minutes later it produced this absolutely beautiful animated circle, which was entirely not what I had asked for! Your browser does not support HTML5 video. A fun way to test a vision model is to see how well it can return bounding boxes around items in a photograph. I've seen previous Qwen models deal well with this, so I decided to put it to the test drawing bounding boxes around some pelicans. I've seen asking for 0-1000 scale produce good results in the past. I tried this: Here's the reasoning trace , which produced this: This is such a good match . Here are those boxes rendered on top of the photo: That visualization of the bounding boxes was taken using a new custom tool that I had Qwen 3.8 27B build for me, running offline on my laptop. I forgot to dial down the thinking effort so it was massively over-engineered , but it did manage to produce this full interface from this single prompt : This screenshot shows one of the features I did not ask for - a demo scene, for if you don't have a photograph to test the tool with: Here's the relevant segment of the thinking trace, where it decided to draw its own pelicans purely because I had used the label "pelicans" in the example JSON I gave it in the prompt: Also a "load sample" that uses a known image? Can't depend on external images, but… the image URL input is user-provided; I could add a "try with sample" button [...] Hmm, I can draw a simple scene on canvas, export it as a data URL, and load it into the image — that's self-contained and demo-able! [...] But the user's coords are for an actual pelican image; a generated placeholder can still demo the scaling. Generate a 1000x1000 placeholder: gradient water + two blob-like "pelican" silhouettes placed at the given bboxes (using the same scale — cute: silhouettes at the exact 0-1000 positions, showing the boxes align). This makes for a fun, self-contained demo. Keep it simple: sky gradient, sun, water, two pelican-ish shapes (ellipse body, circle head, beak). Place at bbox centers. (I'm slightly nervous that models around the world might have a bias towards drawing pelicans at any chance they can get, brought on by nearly two years of exposure to my own stupid benchmark.) Is all that over-thinking necessary? Maybe it is, at least a bit. I tried with reasoning turned off and got this version , ( transcript here ), which nearly works but shows the boxes in the wrong place: So without reasoning it didn't quite one-shot a working tool. I'm sure it could get there with some follow-up prompts, but this is a good example of how reasoning can make a difference. One of the biggest questions around local models is whether or not they have enough horsepower to successfully run a coding agent loop. Coding agents require long context, strong code generation support and reliable tool-calling. On paper Qwen 3.8 27B has all three of these, so is it up to the task? My initial experiments with Pi have been very promising. I chose Pi because it has a shorter system prompt than most other options, making it a better fit for trying out smaller models. I configured Pi to use Qwen 3.8 27B running in LM Studio on the Spark (shared via ) by adding this to : Then ran in my folder and prompted: After a sequence of reasoning and tool calls that accessed a bunch of different files it produced this reply , which is very solid. Just one problem: I wanted to share that transcript. So I pointed Pi and Qwen 3.8 27B at the JSONL transcript file in and prompted: And it built and tested this pi_jsonl_to_md.py , which did exactly what I needed. Here's that session transcript , published using the tool that it created. So far this is all looking very promising. We have a 17GB model that runs on high-end consumer hardware and can write code, drive tools, annotate images and generally do everything that I need from an LLM for getting real work done. There's one very significant catch: it feels slow - especially when it starts over-thinking, but even without that it's not particularly sprightly. I've been getting around 15-30 tokens a second from LM Studio. That's not terrible, but it's slow enough that it's going to be hard to win me away from hosted API models, which can return results a whole lot faster. Artificial Analysis track token speed and show OpenAI 5.6 Sol at 74 tokens/second and 5.6 Luna at an impressive 184/second. The good news is that the community have been exploring ways to speed things up since the model was first released two days ago. One of the most promising optimizations is baked into the model itself. Qwen supports Multi-Token Prediction , an architecture trick where a cheaper mechanism guesses several tokens ahead and the main model can then quickly verify if the guesses were correct. This can have quite a dramatic effect on inference performance. Based on this tweet from creator Georgi Gerganov I tried running the model with MTP like this on the Spark: And sure enough, this gave me a significant boost. I had GPT-5.6 in Codex run a comparative benchmark on the Spark and the server outperformed the LM Studio default GGUF by around 72%. I expect we'll see a whole lot more innovation around serving this model faster over the next few weeks. The MLX community likely have some tricks brewing as well. The fact that a 17GB file can do all of this stuff on my home machines is a miracle . Once again, I'm delighted and amazed at how much progress local models have made this year. A year ago this would have been competitive with the best and most expensive of the proprietary models - today it can run on a capable laptop. The only thing holding this back from being a daily driver is performance. It feels pretty slow on both the M5 Mac and the DGX Spark. That's the catch with these dense (non-Mixture-of-Experts) models - they require a whole lot of memory bandwidth to perform well, and neither of the machines I have access to are top performers in that regard. The most important thing about Qwen 3.8 27B is what it demonstrates . We can have an open weights general purpose model with a long context, effective tool calling, strong vision ability, and competent code generation, and we can fit the whole thing in just a 17GB file. The models at this size continue to get better at an impressive rate. We don't need to spend half a million dollars on datacenter-class hardware just to run a competent model. You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options . (default): for complex tasks demanding thorough analysis : balancing accuracy and speed : efficient reasoning optimizing for speed and cost The bicycle frame is the right shape It has legs on each side of the bike - that's very rare Good, clear pelican pouch The wings extend to touch the handlebars! The motion lines are behind, not in front It has a tasteful background - nice sun, clouds, hill, flowers and grass.

0 views
James Stanley 2 weeks ago

Trailer

Over the last couple of weeks I've built a trailer for the tractor . I started by drawing up a basic design in FreeCAD: I didn't bother modelling the attachment for the axle because I hadn't worked out how I would do it yet. I then ordered the wheels and the steel I needed and welded up the frame: I actually made an error in ordering the steel and ordered much smaller box section than I intended. But no big deal, it still works. Probably a benefit because it makes it lighter. The wheels are sack truck wheels, the same as I used for the front wheels of the tractor. Then a couple of pieces of angle iron at each side to hold the axle: A plywood box to go inside it: Which I then trimmed to match the height of the frame and screwed into the corners with triangular battens. And then dismantle it and paint the parts. I thought it would be fun and interesting to do the painting outside in the garden, but this was a terrible idea. Loads of pieces of dead grass stuck to the paint and ruined the finish, plus leaving it out in the sun to dry meant it dried too quickly and caused loads of cracking and crazing. I would not do this again. I should have just painted it in the garage on the workbench. But it's only a trailer, doesn't really matter. The paint is only there to slow down the rotting of the wood. All is temporary. To attach the trailer, the tractor has a piece of angle iron with a hole in it, and the trailer has a rose joint for a towing hitch, and then a clevis pin with an R-clip is used to join them together: The spacer underneath is there so that when the tongue weight becomes negative the trailer doesn't tip up too much. I know this is attached in single shear and double shear would be better (e.g. two pieces of angle iron and the rose joint goes between them). But I don't care. I think the weakest point on the trailer is where the bolt is welded to the frame, that would probably break off if there were too much tongue weight, although I have stood on top of it and it didn't break so is probably fine for a toy trailer. So, great success, all finished. Lucy is still too afraid to drive the tractor herself (even without the trailer attached) but for now she is content to sit on my knee while I drive it. We hope to make good use of the trailer later this year when we cut the hedges, to carry the hedge cuttings down to the bottom of the garden. I have made a couple of modifications to the tractor since the previous post . As many people predicted, the original weld holding the sprocket to the axle was insufficient and sheared off: I subsequently welded it back on, but much more strongly because I now know how to use the settings on the welder. And it has been fine since then. And the front chain kept losing tension and coming off the sprockets. Initially I experimented with adding an idler sprocket to increase the wrap angle, but this didn't solve the problem. Eventually I realised the problem was that the countershaft was getting cocked diagonally on its mounts, so I added a piece of steel to stop it moving: The issue was that the chain on the left-hand sprocket was pulling forwards, and on the right-hand sprocket was pulling backwards, so there was an enormous torque on the mounts for the bearing blocks, so one would slide forwards and one would slide backwards, and then the sprockets were misaligned and they would keep pulling the chain off. With this piece of steel welded in place the bearing blocks are no longer free to move, so the sprockets stay aligned and the chain stays on. The tractor still understeers quite badly due to having an extreme rear bias on the weight distribution, especially if you're an adult (because your body weight is directly over the rear axle). So the next modification (currently untested) is to add this ~10kg block of concrete inside the chassis at the front to increase the weight on the front axle:

0 views
Jim Nielsen 2 weeks ago

The Fruits of AI

Terry Godier has a post titled “Mea culpa” (which, given his framing, might’ve been better titled “Claude’s Culpa”). I’m not sure how much to even trust anything in his post given the backstory , but this line stood out: I was careless in relying on AI [...] without doing the work to understand Let’s face it: carelessness is the grain of AI. It’s what the tool encourages and makes easy by default. Without constant vigilance and deliberate, active participation to cut against this grain — to maintain an understanding — careless outcomes are the default fruit of AI. And given how good humans are at being constantly vigilant and deliberate, it seems reasonable to expect more stories like this one. To analogize, AI is pitched like having your very own fruit tree. “Plant a seed, and soon enough, boom! Yummy, juicy fruit for you! So fast and easy!” But, like most things, it’s not that easy. Getting good fruit requires all kinds of effort: planting, fertilizing, watering, pruning, thinning, cutting out disease, etc. Good fruit requires cultivation and care. Otherwise you’ll just end up with something that looks like a peach, but when you (or someone else) bites into it, you realize it’s disgusting and barely edible. Reply via: Email · Mastodon · Bluesky

0 views
Farid Zakaria 3 weeks ago

nixpkgs-multiverse: every version that ever existed

Enter the Nixpkgs multiverse. All the versions that ever existed, all in one place. I bumped the release for my NixOS configuration to refresh many of my packages and found that a package I depended on at a particular version is no longer available. The package was “version bumped forward” in a way that broke some of my tooling. It’s late and I don’t want to fix it, so I just add another input pinned to the commit that had the version I want. This works, but it is miserable in a way that compounds. The need for the most recent package is so common that I had keep an overlay that would inject as a package set for me to easily pull from. If I have a need for a particular version of a package and it’s not present in my current , I am left searching for the commit and pinning it. 1 Every pin is a whole extra in the file. Flake inputs are fetched eagerly even if not used. A flake with three inputs whose output references only the first are all materialised. Nix lets us easily create a closure that reproduces a specific version of a package, but Nixpkgs makes it hard to hold one package still while everything else moves. Each Nixpkgs input to a flake is a distinct universe. If we can have multiple Nixpkgs as input to achieve fetching a particular package, why not have every version that ever existed always available ? 🤯 nixpkgs-multiverse is one flake input that gives you all of them at once. We can query the flake for all the versions of a package that ever existed in Nixpkgs . If we want a specific complete revision of Nixpkgs we can use the function. That is access to all the versions of all the packages that ever existed in Nixpkgs. You can mix them all together in one shell, one package or a build environment. How is it possible to have multiple Python versions? That is the whole point of Nix itself. Every package immaculately describes its dependencies using a hash via the intensional model . 2 Nixpkgs already supports multiple versions of a package in a single revision (i.e. , , ) as separate attributes. We took this to its logical conclusion of making them all available easily. Our deliberately has no inputs: . Inputs are fetched eagerly, and we have 1,393 of them. We need to fetch them lazily, only when something actually references a revision. To do this, we fetch revisions with , pinned by , only when needed. Two files do all the work: and . is one ordered array of every revision from Nixpkgs , 1,393 as of this writing, from 2017 to 2026. 3 We limit our commits to those that were actually built and cached by Hydra, so we only include commits that were either a release or a channel bump. How do we know which revisions to pick for the ones? We rely on the nix-releases S3 bucket to tell us which commits actually became published builds. The S3 bucket uses the commit hash as the directory name, so we can list the bucket and get a complete list of all revisions that were actually built. is the map from (attribute, version) to a revision: That integer is an offset into . It is the most recent revision that shipped that version. At this many revisions, it turns out that how you encode the data matters a lot. My first encoding stored every revision a version appeared in. Although it was simple, it was a disaster in terms of size for these JSON files. As you might expect, most versions of most packages are unchanged across many revisions. The size of our file was growing linearly with the number of revisions. By storing only the newest revision that shipped a version, we can keep the file small and still answer the question “which revision had this version”. Here is how it actually grows as revisions get indexed: 5.18 MB covering 1,393 revisions and 289,521 distinct (attribute, version) pairs. The key design rule for our flake: Cost is per revision touched , not per package. If we were to add revisions as inputs, evaluating our flake would explode. Each flake in our measurement below has N inputs and an output that references only the first one ; the timing is how long before that output evaluates. 4 Five pins that are not used cost 26 seconds before the output evaluates. Each input costs about 5 seconds, and the input is fetched and materialised even if never used. In contrast, the green line is with 1,393 revisions available , which is a flat 0.20s to parse the JSON. 🤩 Revisions are memoised, so pulling 3 packages out of one revision costs the same as pulling one. That concept that the can hold many graphs of the same package is core to understanding Nix. The popularity and rise of flakes made it even more apparent that we can mix multiple revisions of Nixpkgs together. The thing I keep coming back to is that Nixpkgs history already is the multiverse. Every version that ever existed is already built, already cached, already reachable. It was just addressed by commit hash instead of by version number, which is exactly backwards from how anyone thinks about it. The whole project is 5 MB of JSON and about 200 lines of Nix. It does not build anything, mirror anything, or host anything. It is a phone book. Thankfully sites like nixhub.io or lazamar’s search make this a little easier.  ↩ The hash is a unique identifier for the exact set of inputs that were used to build it. If you change any input, the hash changes and you get a new package.  ↩ A NixOS release is not special; it is a commit that happens to carry a label.  ↩ Everything is against a local clone, so there is no network latency.  ↩ Thankfully sites like nixhub.io or lazamar’s search make this a little easier.  ↩ The hash is a unique identifier for the exact set of inputs that were used to build it. If you change any input, the hash changes and you get a new package.  ↩ A NixOS release is not special; it is a commit that happens to carry a label.  ↩ Everything is against a local clone, so there is no network latency.  ↩

0 views
ava's blog 3 weeks ago

playing the mass effect board game

As a Mass Effect fan, and I am very grateful that my wife gifted me the ( relatively new) board game Mass Effect: Priority Hagalaz :) I am completely smitten with it! You can tell so much thought and love went into it by a huge fan who knows their stuff. The gameplay was translated so well to this format, and the characters and their abilities stay very true to the games. Nothing feels weirdly renamed, missing, or wrong, or too vague. Nothing feels like they had to compromise. All materials are beautifully printed on thick, glossy paper with amazing artwork, consisting of three spiral bound booklets and separate character and scenario sheets to track stuff on. The dice feel great, the tokens are sturdy, you have six character minifigs that are nice, two card stacks that look and feel high quality, and you get a little sack with the Alliance symbol on it and a marker pen with the Mass Effect label on it. Just feels like they went the extra mile with some little details they knew fans would love :) The concept is less a static boardgame, but a whole campaign you can play through with different paths, missions and outcomes. Instead of having to build a map via different physical parts or a map you unfold in each scenario, you open the specific map page in one of the spiral bound books and play on that. Less mess, cooler maps! You use the included colorful stones and marker to track skill progress, XP and unlocked abilities on the character sheets, as well as the tracker for each scenario for what you did or didn't do, and the tracker for the whole campaign. Thanks to the glossy/laminated finish, you can just remove the markings on any material so you can easily play again. There are different starting missions, character loyalty missions, and depending on your choices (what missions to do, who is loyal, how many War Points you get, if you play the scenario as more Paragon or Renegade, etc.) you get different sections in the Story Book, so it's a little like a "Make Your Own Adventure" book where it says " If you did this, continue reading at xyz, if you did the other, read abc ". This is so amazing for replayability! Gameplay-wise, it is easy to get into, but hard to succeed initially. It takes you a bit to get to know how the game expects you to behave and what you should focus on, and it can be difficult. If you do not focus on taking out at least 1-2 enemies each turn of a character (or at least weakening them), you will quickly be completely overrun as new enemies spawn frequently and existing ones get activated after each character turn. While shields recover, health only recovers with medigels you may find in the scenario. Just like the real game, characters love to go down and have to be revived (lol). If Shepard goes down, the scenario fails. As it was our first run through one of the possible routes of the campaign, we gave each other a bit of grace. There were a few moments where we realized we had played wrong (discovering a new rule or that we had applied it wrong, like for example, realizing later that you cannot split movements on the same die), and then either decided to do it right from that moment on, or create a map state as close as possible to how it would have been if we had been playing right. In the Loyalty Mission for Garrus, there's the option to actually monumentally fuck up Shepard's position in a way that completely traps them and makes moving away without dying impossible based on how the map is structured in that spot and due to a specific boss spawning. We agreed that if we had known this trap could occur when the enemy spawns, we would not have positioned Shepard this way or made her run away immediately. As we didn't wanna start over because of this incredibly niche problem/beginner mistake, we agreed to reset to an earlier boardstate as best as possible where Shepard wasn't standing in that horrible spot. I know it's technically cheating, but we really wanna focus on getting to know the game and progressing forward in the story as best as we can while learning :p I'm not sure a non-Mass Effect fan would like it as much; maybe the gameplay isn't convincing enough to stand on its own without the game relation. But for me, it's so fun to get back into a world with these characters again. I love it, and there are expansions announced for it, too! I hope they aren't cancelled, would love to have and play them. Published 08 Aug, 2026

0 views
Kev Quirk 3 weeks ago

New Pets, Sick Pets, and Hemorrhaging Money

Wooh! The last few weeks have been absolutely mental here in Casa del Quirk. Around 2 months ago we started renovating the stables to make things better for the goats and chickens. We've had an extraction system put in so fresh air is always circulating, as chickens are very dusty and goats don't like it too hot and stuffy. While we were at it, we also had some new fencing and gates put in, as well as better hard standing around the stables. Finally we had the old, rotten windows and doors replaced with lovely new ones that have shutters so we can control the air flow depending on the weather. Our stables with the new windows and doors As you can imagine, this has been a significant expense, but we planned for it. So it's all good, but then... Around a month ago we noticed that our older (and favourite) dog, Tia, had rather smelly breath and her mouth was bleeding when she was playing with her ball. We figured it's just old age and bad teeth, so we took her to the vet to have her mouth checked and properly cleaned. Unfortunately it was bad news. Tia has a benign but aggressive tumour growing in her gum. Apparently they're relatively common in older dogs (she's nearly 14) but if left untreated it would get very painful and we ultimately end up having to have her euthanised as it would significantly effect her quality of life. So we paid the unexpected £1,000 (~$1,350) bill to have the initial tumour removed, her teeth cleaned, and a biopsy. In the meantime we were also referred to a specialist to hopefully get the issue sorted properly. Last week Tia went to the specialist to have a full body CT scan. This would give them more info about the tumour in her mouth and what our options are, but also (because she's so old) let us know if there's anything more malicious going on in her body. We have to be pragmatic about this - the treatment was going to be expensive, and we had to make a call on whether we wanted it doing if they found something like cancer lingering somewhere in her body. Luckily for us the old girl came back with a clean bill of health and the tumour was treatable. That was another £1,500 (~$2,020) down the drain, but well spent. The procedure to treat the tumour involved taking around 40mm (~1.5") of her lower jaw away. It's a significant operation and the recovery, especially for an older dog, will be difficult. On Monday she had the procedure, it went really well, and yesterday she came home a day earlier than we expected. She's a tough old girl. She's much better today, but still struggling as she's been through a lot. Having a pet that's in pain is the worst - you can't really reassure them like you can a human, so you find yourself hopelessly watching them suffer. It's heartbreaking, but it's for the best. We're still to get the bill for this procedure, but the vet has estimated an eye-watering £4,400 (~$6,000). If anyone is playing along, that's £6,900 (~$9,200) in unexpected vet bills over the last few weeks. She also isn't insured as it's prohibitively expensive for a dog of her age. So we need to foot the entire bill. Anyway, on to more positive news... Last Saturday we welcomed the newest addition to our family, Nelly the 8 week old Labrador/cocker spaniel cross. The breed is known as a Cockador apparently - very unfortunate name if you ask me. Nelly on her first visit to the vet, being very good. Like any puppy, Nelly is a lot of work. Especially if you add into the mix a very sick dog, and the kids being off school for the summer holidays. I've also been working long hours recently, so my poor wife has been juggling most of this on her own. She's at her whits end. Nelly, Tia, and our other dog Sidney are all getting on well though. Nelly is even helping distract Tia from the pain she's in. It's fair to say that all our savings are gone, and the last of Tia's treatment will need to be thrown on a credit card so we can pay it off over the next few months. Things are extremely busy and stressful at the moment. But hopefully we will have Tia for a couple more years so her, Nelly, and Sid will become a proper little pack that gives us lots of lovely memories. Pets are a gift and we wouldn't have it any other way. I just wish vets bills were a little cheaper! 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
alikhil 4 weeks ago

How to control RGB on RAM sticks, motherboards, coolers, graphics cards programmatically with OpenRGB.

When I was building my gaming PC a few years ago, I bought a second-hand pair of RAM sticks with RGB lights. It was entertaining to see them glowing and changing colors. I did not bother myself to control them. Some time later, I got sick of gaming and made a decision to rebuild it into a self-hosting server. The PC moved from my table to an under-TV shelf in the living room. And here, glowing lights became distracting during watching TV or when we have guests sleeping in the living room. Therefore, I started searching for ways to control/disable RGB lights. After some search, I encountered OpenRGB . It’s open-source RGB control software that is independent from manufacturer software. It supports color syncing across several devices and has a community-managed effects library . It has a long list of more than 2,500 supported devices and, hopefully for me, my Corsair Vengeance was there! What a great piece of software, right? It’s a shame that I needed this software only to disable RGB . OpenRGB runs on Linux, macOS, and Windows. You can download the package for your operating system from the releases page . On my Debian-based server, I downloaded the package and installed it with: The package includes the required udev rules. If you use an AppImage, Flatpak, or a build from source, install the udev rules too. Without them, OpenRGB may not be able to access the RGB hardware without running as root. Before creating the service, check that OpenRGB can detect your devices: Make a note of the device numbers you want to control. Mine were and . I needed the RGB to turn off every time the system starts. So I ended up with the following systemd service. First, test the command manually. is black, which turns the LEDs off. The mode is supported by my devices; use the output of to check which modes yours support. When that worked, I created the service below. Now the RAM lights turn off automatically on every boot. No proprietary RGB application, no running desktop session, and no bright lights in the living room. If you have devices with RGB lights, check whether they are supported by OpenRGB . You might find a more creative use for it than I did and build some nice RGB animations.

0 views
Unsung 1 months ago

You only get one chance to make a zeroth impression

Contra the previous post , just spotted this “Same settings, new look!” callout in Firefox, on a page I have never visited before, talking about a feature I have never used: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/you-only-get-one-chance-to-make-a-zeroth-impression/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/you-only-get-one-chance-to-make-a-zeroth-impression/1.1600w.avif" type="image/avif"> I mentioned this once – when you get someplace new, everything is new. This redesign announcement’s conditions were engineered poorly, because they didn’t even consider people who didn’t use the feature before the redesign. I keep thinking of the very old computers from the 1940s, 1950s, and even 1960s, where the challenge wasn’t what to do with the computer, but with keeping the computer running. There was a machine called JOHNNIAC which gained a nickname “pneumoniac” because it refused to work on a warm day. On many other computers, there was a daily ritual of finding which of the vacuum tubes blew up and had to be replaced. Some teams had a literal downtime tax; they knew and communicated in advance that 40% of the days the machine would not be up to the task, consumed by tweaks and repairs to bring it just to the state of being ready to do work . When I look at those kinds of pop-ups and callouts, I think how we’re unwillingly recreating the very same conditions. I deeply believe people are exhausted not just by changes in software , but also constant questions, pop-ups, unnecessary notifications, “STOP 2 END,” emails to unsubscribe from, unsubscribes that don’t work the first time, and so on. Software should not require the user to occasionally click on buttons just to keep it running. #attention #onboarding

0 views
Unsung 1 months ago

In between the lines

Over the years, I acquired this weird collection of almost-invisible, but important signifiers of when I know a product really focuses on craft and thinks about its users. I thought about one recently. Here’s what happens when you try to copy a long block of text from YouTube’s (otherwise very useful) text transcript pane: And here’s an analogous example from GitHub: GitHub’s arrives ready to go. YouTube’s throws in a lot of messy things in between the lines. Why does it matter? Because these both feel like places you’ll be copying a lot from, and dealing with a messy paste can feel so, so unpleasant. You have probably seen this chart before, from xkcd : = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/in-between-the-lines/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/in-between-the-lines/3.1600w.avif" type="image/avif"> This is the fabled automation trade-off, or the high fixed cost vs. low variable cost dilemma. Yeah, if you’re doing a lot of copy/​paste, you might invest in creating some sort of a clean-up step, or even going through a programming text editor which has multiple cursors or other casual automation . But what if you don’t do that often, or if you don’t even know how much time it’d take you to automate it? Then the investment seems scary or insurmountable, and you’re stuck doing something like this, time and again: And it’s really nice to encounter a place like GitHub, where the team was thoughtful enough to save you all this trouble. There is also an asymmetry that’s worth pointing out. I believe making this good doesn’t have to be a lot of work for people putting these surfaces together. Here’s me fixing the YouTube situation with two simple lines of CSS with : I don’t know if it’d be as easy for all big text block situations, but I think it’s good practice to look around a bit and think about what are tiny things that you can do on your side that will save your users minutes or hours of tedium (see also: recents and paste and even more recents ). #copy paste #selection #text editing

0 views
@hannahilea 1 months ago

Birduino: A card-triggered audio player for [learning] the birds

Tap a bird card to the NFC reader to hear one of its calls, identify birds from their vocalizations, and up your bird game!

0 views
Unsung 1 months ago

Five moments in snapping history

Bear (a notetaking tool) has simple image resizing, with one extra nicety – if your images are near each other, resizing one will snap to the width of the other: In the Finder, columns snap to the width necessary to keep all the names untruncated – and not one pixel more: (Sidebar: This is also the only place I’m mentioning today that nicely uses the trackpad’s haptic feedback at the snap moment. I tried to indicate it in the video; this is not the final visual treatment I’m thinking of, but let me know if this kind of visualization of haptics feels useful to you!) macOS does something really interesting when you get its windows close to each other. Instead of typical snapping – pulling the thing you hold toward the other item like a magnet – it instead prevents you from going further for a while, in either direction. Perhaps the right analog here would be glue : If initially feels a bit funny, but I think I like it. It’s less aggressive and avoids needing some sort of cancellation (an option or a modifier key) if you don’t want it, because it never feels in a way. It also works for matching heights, like in Bear: In Figma, building atop regular snapping, we introduced something I awkwardly called “self-snapping”: if your objects are inside a container, the container will snap its padding to whatever it sees on the other side, without any explicit auto layout/​flexbox: I am sharing these five examples (and one from before ) because I think they exemplify a nice thing: precision without bureaucracy. In each case you could imagine an explicit heavy option somewhere in the menu… …that would feel slow and cumbersome. Instead, these take the freedom of direct manipulation and sprinkle just enough almost-invisible structure in a moment where that structure is undeniably useful. (Of course, you still might want explicit options somewhere in the menu or your command palette, if only for accessibility reasons.) I like that these quiet features have your back and make you look good, and that their creators understand that something almost aligned can feel worse than something completely misaligned. #bear #complexity #direct manipulation #interface design #mouse Bear: Set Image Width… macOS: Match Window Heights Finder: Restore Column Width Figma: Unify Padding

0 views
Kev Quirk 1 months ago

📝 2026-07-07 18:43: Guinea fowl keets are doing great too. All 5 are loving life with their foster...

Guinea fowl keets are doing great too. All 5 are loving life with their foster mums. 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