🏡


to read (pdf)

  1. I don't want your PRs anymore
  2. JitterDropper | OALABS Research
  3. DomainTools Investigations | DPRK Malware Modularity: Diversity and Functional Specialization
  4. EXHIB: A Benchmark for Realistic and Diverse Evaluation of Function Similarity in the Wild
  5. Neobrutalism components - Start making neobrutalism layouts today

  1. May 23, 2026
    1. 🔗 r/york This little guy was hanging out opposite York St. John this morning rss

      This little guy was hanging out opposite York St. John this morning | submitted by /u/SavingsMap2506
      [link] [comments]
      ---|---

    2. 🔗 earendil-works/pi v0.75.5 release

      New Features

      • Cleaner read tool output - Collapsed read tool cards now show only the read line by default, while Ctrl+O still expands the full file content.
      • Faster file tools on Windows - Built-in file tools now use async filesystem operations during streaming, and image resizes run off the main TUI thread in a worker.
      • More reliable package updates - pi update and git package installs now reconcile pinned git refs and keep package settings intact. See Packages.
      • Custom Anthropic-compatible adaptive thinking - Custom provider model configs can opt into adaptive-thinking Claude behavior with compat.forceAdaptiveThinking. See Custom providers and Models.

      Added

      • Added compat.forceAdaptiveThinking support to custom Anthropic-compatible model configuration docs and validation (#4797 by @mbazso).
      • Added a standard unified patch to edit tool result details for SDK consumers (#4821).

      Changed

      • Changed collapsed read tool cards to show only the read line until expanded (#4916).
      • Replaced the inherited optional koffi dependency for Windows VT input with a tiny vendored native helper, reducing install size while preserving Shift+Tab handling (#4480).
      • Changed the root development install documentation to use npm install --ignore-scripts (#4868).

      Fixed

      • Fixed pi update to reconcile git-pinned packages to their configured ref (#4869).
      • Fixed package/resource path handling for Windows and glob/pattern resolution (#4873 by @mitsuhiko).
      • Fixed config pattern matching to resolve patterns from the correct base directory (#4898 by @haoqixu).
      • Fixed theme pickers to list themes by their content name instead of file stem (#4830 by @Perlence).
      • Fixed OpenCode Zen/Go requests to send per-session OpenCode routing headers (#4847).
      • Fixed Amazon Bedrock provider loading under strict package managers by inheriting the declared @smithy/node-http-handler dependency from @earendil-works/pi-ai (#4842).
      • Fixed inherited Amazon Bedrock Claude requests to send the model output token cap by default, avoiding Bedrock's 4096-token default truncation (#4848).
      • Fixed exported session HTML to escape quote characters in attribute values (#4832).
      • Fixed GitHub Copilot device-code login to keep opening the verification URL in browser-capable environments while ignoring browser launch failures for headless use (#4788 by @vegarsti).
      • Fixed git package installs to reconcile existing checkouts to the requested ref and update package settings without losing filters (#4870).
      • Published a 0.74.2 rescue release that tells Node 20 users to upgrade Node before updating to newer Pi versions (#4876).
      • Fixed final bash tool cards to avoid rendering duplicate full-output truncation paths (#4819).
      • Fixed bash tool truncation line counts to ignore the trailing newline as an extra output line (#4818).
      • Fixed footer home-directory abbreviation to avoid shortening sibling paths that only share the same prefix (#4878).
      • Fixed macOS Bun release binaries to resolve the native clipboard sidecar so Ctrl+V image paste can load @mariozechner/clipboard (#4307).
      • Fixed coding-agent tools to avoid synchronous filesystem operations during streaming and moved image resizing off the main TUI thread (#4756 by @mitsuhiko).
    3. 🔗 r/Leeds I've just navigated Dawsons Corner for the first time. WTF rss

      Had to choose between an RTC or taking the wrong turn. Chose the latter obviously. Appropriate signage might help drivers navigate the new layout (was leaving New Pudsey station trying to get back to Horsforth). Lol 🫣

      submitted by /u/Lost_Mammoth7273
      [link] [comments]

    4. 🔗 r/Yorkshire The Reform councillor for Wombwell has some interesting tattoos.. rss
    5. 🔗 Probably Dance Book Review: Babel by R.F. Kuang rss

      The book Babel, or The Necessity of Violence: An Arcane History of the Oxford Translators ' Revolution is fascinating. And I'm not sure how much of this the author intended. It's mainly fascinating because it's trying to discuss colonialism, technological progress, and inequality with characters who are all stuck in the 19th century and are unable to reason with history in mind. And throughout the entire book the author acts like this is the right way of thinking. This review will contain major spoilers, partially because I don't think the book is actually worth reading. I found it very frustrating and nearly stopped a few times.

      The main reason for this frustration is that the "good guys" are often quite evil and get nearly everything wrong all the time and don't achieve any of their goals. There are very few actual good people in this book, and those actual good people get treated badly by the story. The "good guys" think that the actual good people are evil.

      The story is about a kind of magic ("silver working") where you can use a bar of silver for direct effects (heal someone from cholera, kill someone) or imbue the silver with a kind of aura that affects things near it. So you can embed the right bar of silver in e.g. a steam engine and the engine runs more efficiently. Or you can embed it in a buildings foundation to make the building stronger. The magic spells require fluency in multiple languages, so being a translator is a very prestigious job. The story takes place at the University of Oxford in the 1830s, where silver working has recently gone through its own industrial revolution (at the same time as the actual industrial revolution is going on) so that these aura effects have been scaled up, creating enormous benefits for society, and enormous wealth for the people in charge.

      Colonialist Imperialism vs Anarchism

      The book is mainly about how this technological progress changes the world. But the two main parties are

      • The bad guys: British colonizers who would like nothing more than to take over the world and exploit all other countries. These are racist warmongering assholes who believe in a zero-sum world where they have to win, and if others lose in the process, that's just how the world is. (oh and they're also academics, which is the first slight disconnect)
      • The "good guys": Modern day Robin Hoods who steal from the university so that the poor can also benefit from silver working. It's hard to characterize them because they don't have a fully coherent plan, but they're probably closest to anarchists. These people play negative-sum games (theft, sabotage) mostly because they're upset that the first group got so rich while being assholes, and also because they enjoy helping the poor directly.

      The obvious issue, knowing how the industrial revolution turned out, is that both of these mindsets are deeply stupid. Progress is a positive-sum game. We now live in a world that's vastly better than the 1830s, with much of the world lifted out of poverty. The bad guys are working towards that much better world, but they're doing it for selfish reasons and they incorrectly believe that they have to hurt others to get the benefits that they're getting. Meanwhile the "good guys" are acting in a way that will delay the better world that we now live in. They have good intentions and the book constantly acts like that is what counts, but it is intensely frustrating to read. It's never quite clear what their plan is. They talk about helping the poor, though that topic stays abstract, and about sabotaging the bad guys, which they get very specific on.

      A Trumpian Mindset And the Tragedy It Leads To

      When talking to my wife about this, she pointed out that many people still think in the zero-sum mindset today. In my mind the most obvious person is Donald Trump, and maybe the people who vote for him. So the book is extra fascinating because it has these people who think like Donald Trump, but who would probably hate him. If a left-leaning person had the same world view as Donald Trump, they might turn out like the "good guys" in this book.

      The saddest character in the book is Letty, the main actual good person. Obviously the "good guys" end up hating her by the end. She is the only one who seems capable of breaking out of the Trumpian world view. She survives until the end of the book and the main hope is that she manages to improve the world. Her tragedy is that she falls in love with Ramy, one of the "good guys" who is an immigrant from India. But Ramy refuses her advances because of this same weird dynamic where he has fully adopted the racist colonial world view where a brown Indian man can't date a white English lady. Letty is realistic about this and is willing to try to transgress the norms of the time and find out what the consequences are, but once again the "good guys" accept the world view of the bad guys and are unable to get over it.

      The entire time while reading the book I'm not sure what the author actually thinks. Does she have this Trumpian mindset? The first chapter quotes from Adam Smith's The Wealth of Nations, which makes you think that the book will explore the economic impacts of this silver working. But then everyone is acting very stupidly about it, from an economist point of view (but consistent with 19th century beliefs). Similarly the author writes a chapter which perfectly explains Letty: A brilliant girl from an upper class English family who was constantly oppressed because of the sexism of the time. But her genius and hard work allow her to escape her path and go to university. When the "good guys" join the anarchist group she has her doubts, but joins in because she was also oppressed and is trying to improve the world. She quits and betrays them when it's clear that the anarchists are turning towards violent means. She is very clear-eyed and sane about all of this. So once again it's very interesting how the author can write this character, but also writes all the other characters who think Letty is evil.

      At one point, when the existence of the anarchist group is first revealed to Letty, she makes all kinds of sane suggestions about how the world could be improved using their skills for magic, including finishing school then going into philanthropy. This actually would make sense, but the author criticizes the idea in a footnote. The author can write both sides, but then she always gives the last word to a Trumpian mindset where philanthropy is suspect.

      The Necessity of Violence

      The confusion about the author's intent peaks at the end of the book when things turn violent. The anarchist group occupies Babel, the home of most silver-working in the country, by shooting its leader and making everyone else flee, and goes on strike. The goal is to weaken the British empire with the most destructive sabotage. The magical auras from silver keep many things working in the country and they can disrupt it all.

      At some point earlier in the book it's revealed that the translators' guild (the "bad guys") is deeply irresponsible about how they run their business. They intentionally make it so that silver has to be regularly maintained because that makes them more money. Also it's revealed that they only have two translators in all of England who are fluent enough in English and Chinese to keep the silver bars working that rely on those two languages. One of them dies in the story, the other joins the strike, so magic auras all over the country start failing very quickly. It's incredible irresponsible that such important technology relies on just two people. (once again the book is internally confused because in the book all of this is treated as sane and is not even questioned)

      Silver afforded London all of its modern conveniences. Silver powered the ice-making machines in the kitchens of London's rich. Silver powered the engines of the breweries which supplied London's pubs, and the mills which produced London's flour. Without silver, the locomotives would cease to run. No new railways could be built. The water would run foul; the air would thicken with grime. When all the machines that mechanized the processes of spinning, weaving, carding, and roving ground to a halt, Britain's textile industry would wholly collapse. The entire country faced possible starvation, for there was silver in the plough-frames, seed drills, threshing machines, and draining pipes throughout Britain's countryside.

      (Page 485)

      The strike fails terribly because, oh shock, it mostly hurts poor people. Turns out silver working was benefiting the whole society, not just the rich. (just like the real industrial revolution) This quickly opens up a rift in the anarchist group. Some realize that they're mostly hurting the poor and want to stand down, or at least still maintain some of the silver bars. But after a vote they decide to keep the strike going on full so that the pain can even be felt by the rich people who they're striking against. Dozens of people die as a result from traffic accidents from malfunctioning carriages and crumbling buildings which were held up by magic auras. (the buildings crumble the day after the scheduled maintenance. Who schedules the maintenance on the last possible day? Again incredibly irresponsible) Eventually it's revealed that the rich, who were the target of this strike, were barely affected. And when the rich did finally lose their patience, they stopped being polite and send in the army for real. The anarchists cave in immediately. Part of the group flees, but the others stay behind to end the book in a giant suicide bombing, destroying the silver-working center of the country with its library, throwing back technological progress by a decade or more.

      Once again the author's world view is deeply confusing because she writes as if these people are heroes, but she also writes that they're just causing a giant disaster without achieving any of their goals. It surely must be a commentary on how the "necessity of violence" is bullshit and leads to far more suffering and doesn't help in the end. But it has that same fascinating confusion as the rest of the book where the author pretends that these are heroes.

      What Does the Author Think?

      I am writing this without having looked up R.F. Kuang. I have not read any other book by her. I think it's more interesting to have this uncertainty. Currently my odds are

      • 30% chance that she has this Trumpian mindset
      • 60% chance that she is confused and this book is her way of working through her confusion, with the result being that she is still trying to hold on to this zero-sum world view, but she also sees that it doesn't really work
      • 10% chance that she understands all of the issues in the book and wrote it as a brilliant criticism of the anarchist branch of the American far left by showing how their world view is stuck in the past and doesn't work

      Given that I put the biggest odds at "she is working through her confusion" and that I think she didn't finish working it out by the end of the book, the rest of this blog post will be me trying to talk about how to move on from this confused mindset.

      Technological Progress in the Trumpian World View

      This is obviously relevant right now because Trump started a war with Iran, and when they responded with blocking the Strait of Hormuz, causing economic problems and fuel shortages all over the world, mostly affecting poorer countries, Trump responded with joining in and blocking all oil trade from Iran. Meaning now Trump and Iran are blocking the Strait of Hormuz together. It's exactly the kind of thing that the "good guys" in Babel would be doing. Sabotaging the world in order to hurt their evil enemies (and there's no doubt that the Iranian regime is evil) but doing it in such a way that they're mostly hurting the poor. (This is just the current example. If I had written this review six months earlier or later, I'm sure I could have named another current example)

      The other reason why it's relevant is that we are going through the AI revolution. As a programmer I am obviously very positive about technological progress. The book is very negative on it and often gives voice to Luddites and focuses on how people lost their livelihoods as the factories automated. I'm sure that was very bad at the time, but with the benefit of hindsight we know that this turned out great. New jobs popped up, including mine, programming. We now live in a country with 100k massage therapists, and even more people whose job it is to care for pets. We live longer lives because more people could dedicate their lives to curing diseases. Average people now live healthier lives, eat better food, and enjoy better entertainment than kings and queens of the 19th century. If the anarchists in the book had their way, this would either not have happened or would have happened much more slowly. The most sensible method of dealing with the terrible colonial imperialists in the book would have been to finish school at Babel, and to then open a competing school with the goal of democratizing silver-work. Yet the only person who even vaguely gestures in this direction is the evil Professor Lovell, when he points out that other countries have been unable to open competing institutions. (mainly because they have bad governments) In particular some of the anarchist group have been in a position for years to do this, but have not done it, preferring to work in secret so they can sabotage the bad guys.

      I'm sure that as a programmer I have reduced the number of jobs required to finish a project. Most obviously when I was a tools programmer on Just Cause 3. If it hadn't been for my work (or somebody else in the same role) that game would have required more artists and more designers. But obviously those people wouldn't have been hired. The budget wasn't there. Instead the game would have just turned out worse. Similarly right now AI is automating a lot of programming tasks. It's clear that this will end differently once AI can do all tasks (also called "AGI") but so far my job is secure and I have been using AI to create new projects that I couldn't have done on my own before. (1, 2) Maybe in another world I would have hired a web designer or frontend programmer to do the things that I couldn't do myself, but realistically I wouldn't have. Either the projects would have turned out worse or just wouldn't have gotten done at all.

      So when the book talks about people being out of jobs because looms are being automated, I just can't empathize. In my mind automating looms is a great thing. That's what I do for a living. It allows people to get more stuff done or to do better work. If you're against that automation you're probably destroying the 100k massage therapist jobs in the country because those wouldn't have existed in a world in which people make clothing by hand. There just wasn't enough wealth in the 1830s. But in a Trumpian world view these things are zero-sum and if someone gets rich off of automatic looms, that must mean that others are poorer as a result. Now we know that this is a silly thought, but people didn't know in the 19th century.

      The Lecture

      There is a part in the book where one of the professors becomes disillusioned with their work. I'm going to quote a long section to show you how the book talks about these things:

      The silver industrial revolution had decimated both the textile and agricultural industries. The papers ran piece after piece exposing the horrific working conditions inside silver-powered factories (although these had their rebuttals, including one refutation by Andrew Ure, who argued that factory workers would feel a good deal better if they only consumed less gin and tobacco). In 1833 the surgeon Peter Gaskell had published a thoroughly researched manuscript entitled The Manufacturing Population of England , focusing chiefly on the moral, social, and physical toll of silver-working machinery on British labourers. It had gone largely unheeded at the time, except by the Radicals, who were known to exaggerate everything. Now, the antiwar papers ran excerpts from it every day, reporting in grisly detail the coal dust inhaled by small children forced to wriggle into tunnels that adults could not, the fingers and toes lost to silver-powered machines working at inhuman speeds, the girls who'd been strangled by their own hair caught in whirring spindles and looms.

      The Spectator printed a cartoon illustration of emaciated children being crushed to death under the wheels of some nebulous contraption, which they captured WHITE SLAVES OF THE SILVER REVOLUTION. In the tower, they laughed themselves silly over this comparison, but the general public seemed genuinely horrified. Someone asked a member of the House of Lords why he supported exploiting children in factories; he replied quite flippantly that employing children under the age of nine had been outlawed in 1833, which led to more general outcry over the suffering of ten- and eleven-year-olds in the country.

      'Is it really as bad as all that?' Robin asked Abel. 'The factories, I mean.'

      'Worse,' said Abel. 'Those are just the freak accidents they're reporting on. But they don't say what it's like to work day after day on those cramped floors. Rising before dawn and working until nine with few breaks in between. And those are the conditions we covet. The jobs we wish we could get back. I imagine they don't make work half as hard at university, do they?'

      'No,' said Robin, feeling embarrassed. 'They don't.'

      The Spectator story seemed to greatly affect Professor Craft in particular. Robin found her sitting with it at the tea table, red in the eyes, long after the others had finished their breakfast. She hastily wiped her eyes with a handkerchief when she saw him approach.

      He sat down beside her. 'Are you all right, Professor?'

      'Oh, yes.' She cleared her throat, paused, then nudged the paper. 'It's just… it's a side of the story we don't often think about, isn't it?'

      'I think we all got good at choosing not to think about certain things.'

      She seemed not to hear him. She stared out of the window at the green below, where the strikers' protest grounds had been turned into what looked like a military camp. 'My first patented match-pair improved the efficiency of equipment at a min in Tyneshire,' she said. 'It kept coal-laden trolleys firmly on their tracks. The mine owners were so impressed they invited me up for a visit, and of course I went; I was so excited about contributing something to the country. I remember being shocked at all the little children in the pits. When I asked, the miners said that they were completely safe, and that helping out in the mines kept them from trouble when their parents were at work.'

      She took a shaky breath. 'Later they told me that the silver-work made the trolleys impossible to move off the tracks, even when there were people in the way. There was an accident. One little boy lost both his legs. They stopped using the match-pair when they couldn't figure out a workaround, but I didn't give it a second thought. By then I'd received my fellowship. I had a professorship in sight, and I'd moved on to other, bigger projects. I didn't think about it. I simply didn't think about it, for years, and years and years.'

      She turned back towards him. Her eyes were wet. 'Only it builds up, doesn't it? It doesn't just disappear. And one day you start prodding at what you've suppressed. And it's a mass of black rot, and it's endless, horrifying, and you can't look away.'

      (Pages 492 to 494)

      (a "match-pair" is the magic spell you can cast on silver, it's a pair of words from different languages)

      So what do you do with that? It's really bad. Your magic spell made a kid lose both legs because a mine cart couldn't be stopped. But in a sense it's the wrong thing to focus on. The important thing to notice that this is better. Working conditions were terrible before, now they're slightly less terrible. Obviously it's not better for the kid who lost both legs, but given the nature of the invention it's likely that risk of injuries went down on average. Less risk of mine carts derailing and injuring people, more risk of getting hit by a mine cart if you're on the tracks, which adds up to less risk overall. The professor is making the mistake of not giving herself credit for the accidents that didn't happen. We know, with the benefit of hindsight, that piling up inventions leads to a much better life. You'd rather be working in a English coal mine the 2000s than in the 1830s, because working conditions became much better. Partially due to labor organizing and demanding better working conditions, but mostly due to technology getting better. (no amount of labor organizing in the 1830s would have improved conditions to the level of the 2000s) And in fact the last big coal mine in England shut down in 2013, which would have never happened if it weren't for better technology. So when you're presented with a terrible situation it would be great if you could solve it, but if you can't, maybe you can make it better , and that's a good thing to do. And then eventually the new invention was retired, maybe in favor of a new, even better magic spell, maybe for nothing at all. This is fine. Trying is progress as long as you sometimes come up with things that stick. It's not necessarily a straight line.

      Obviously nothing is better along every single dimension. For almost every invention you can find some aspect where it's worse. That's just the messiness of life, it happens with most decisions you have to make, not just new inventions. But notice that there can be decisions that are better for almost every involved party. This invention is better for the mine owners and the mine workers (assuming less risk of injury on average) and it's also better for the professor. The increased reliability is so much better that all three involved parties benefit. In a Trumpian world view you'd think that this is impossible. In a Trumpian world view you think that if one person benefits, another must lose out. (the book is reliably cynical about improvements to the world, like abolition of slavery, or making child labor illegal for kids under the age of nine, see above. It always finds something to complain about and ignores that things got better) That's where the cartoon above comes in. The thresher and the automatic loom made life better for the majority of people. Not everyone, but for most (I'm sure someone was unable to find a new job, but employment in the English textile industry went up, not down, peaking in the early 20th century).

      This point can be made more obviously in the other direction: There are some acts that just make things worse. Like if I go around littering, or smashing windows, that just makes things worse for everyone. (except maybe briefly myself because littering or smashing windows is slightly more fun than not littering and not smashing windows, but in the long term it also makes things worse for myself) I'm just causing people to have costs to bring things back into order, and those costs bring us no benefits except getting us back to the status quo. So if there are acts that can be worse for almost everyone, where there is no winner for the loser, maybe that makes it believable that there can also be acts that can be better for almost everyone. Like building an automatic loom. It's the difference between negative-sum games (littering), zero-sum games (land disputes), and positive-sum games (improving technology).

      If you want to be really rich, then for most of human history you had to take from someone else. The richest people had to field armies to conquer neighboring countries and to force the conquered to pay taxes. This stopped being true. Now the richest people are entrepreneurs and merchants. And even normal people lead better lives than conquerors of the past. This is because positive-sum games make the world so much better. There is no amount of conquering and taxing you can do in the middle ages that would allow you to lead as good of a life as billions of people have today. (measured in things like health, food, entertainment, …) And those billions of people don't constantly have to defend their wealth against usurpers and competing powers. The only way to get to that broad wealth is with positive-sum games like trade and technology.

      The long take to watch is the Sarah Paine interview where she talks about "Continental Powers" vs "Maritime Powers". Excerpt here, but also watch the full thing:

      The Unpleasant Parts of the Book

      So back to the book. It makes sense that if you, as an author, want to talk about these things, you should set your story in the 19th century because back then these were real problems. Nowadays globalization and automation is lifting the world out of poverty one country at a time and this is great. Back then this was very much not the case. Colonialism was exploiting and destroying countries. But from today's perspective it's just so frustrating to read the opinions of people who had 19th century frameworks and didn't know how to solve this and then go about doing lots of bad things because their world view is so uninformed. Is that plausible? Yes. Is it fun to read as a 21st century person? No.

      The other part where I had to skip pages was that at some point in the book the "good guys" have to cover up a murder. The book makes this very unpleasant. They're stuck on a boat and have to somehow come up with a cover story to hide the murdered until the boat lands. This leads to high tension for weeks. When they finally land, you think it's over now, but no, now they meet the neighbor of the murdered person and so the tension is high for longer. After that's over they have to face the housekeeper and then coworkers and after I've had too much of this series of tense awkward encounters, the author ratchets it up even more by making them go to a social event where everyone will be suspicious that the murdered person is missing and yet the "good guys" have to go for some reason and have to somehow come up with implausible stories because their cover story has long ago fallen apart. I skipped that part because there really was no need to drag this whole thing out for so long and to keep on making me feel uncomfortable.

      Overall a Fascinating Book

      The book is still fascinating. Mainly this aspect of "adopting the world view of the people you oppose." Where the "good guys" are accepting the world view of the "bad guys" and then come up with really bad plans that work out really badly because they're operating within the wrong world view. (and also where the main love story doesn't work out because the Indian guy has accepted the world view of the colonizers and is unwilling to date a white woman (and also, actually, how the author feels the need to justify at the beginning of the book why it's OK for her as an American to write about Oxford. Why are you arguing with people like that? They're wrong, ignore them, nobody can tell you to not write this book, just write the book))

      It would be less fascinating if it treated these aspects from a 21st century perspective, but it only briefly gives voice to that and always gives the last word to people who are stuck in the 19th century. A view you only find in few prominent people today. Maybe Trump or Putin or the remaining communist regimes. I couldn't figure out for the entire book what the author actually believes. My main theory is that she has part of that Trumpian world view because she is so consistent in voicing it, but she is confused by it because anything else would seem really weird for a smart author in the 21st century, especially one who has read so much history. After all she is also able to write the other side.

      It's also fascinating how she constantly undermines the stated point of the book. "The Necessity of Violence" is the alternate title but whenever the "good guys" adopt this belief they make terrible decisions and don't achieve their goals. Similarly she chose to create a kind of magic that is so obviously positive-sum (just take a piece of silver, engrave some words, speak the words, and suddenly things around it are better in some way) that all of the zero-sum thinking of the characters in the book makes even less sense than it makes in the real world. Why write with such a strong opinion when the story works out exactly the opposite, undermining your own message?

      I mentioned that I wrote this whole review without actually looking up what R.F. Kuang believes. The experience was more interesting not knowing that, having this big uncertainty. I plan on looking her up as soon as I hit publish.

    6. 🔗 anthropics/claude-code v2.1.150 release

      What's changed

      • Internal infrastructure improvements (no user-facing changes)
  2. May 22, 2026
    1. 🔗 IDA Plugin Updates IDA Plugin Updates on 2026-05-22 rss

      IDA Plugin Updates on 2026-05-22

      Activity:

      • capa
        • 88ba8f77: Sync capa rules submodule
        • c619ef51: Sync capa rules submodule
        • 9ac688b8: build(deps-dev): bump js-cookie from 3.0.5 to 3.0.7 in /web/explorer …
      • haruspex
        • bda544a6: chore: update dependencies
        • 0f42f58e: chore: update mozilla-actions/sccache-action in ci
      • hrtng
        • 560579b3: fix unflatterer looping and register size issues; fix "Auto turn on '…
      • rhabdomancer
        • c652bf18: chore: update mozilla-actions/sccache-action in ci
    2. 🔗 anthropics/claude-code v2.1.149 release

      What's changed

      • /usage now shows a per-category breakdown of what's driving your limits usage — skills, subagents, plugins, and per-MCP-server cost
      • /diff detail view can now be scrolled with the keyboard (arrows, j/k, PgUp/PgDn, Space, Home/End)
      • Markdown output now renders GFM task list checkboxes (- [ ] todo / - [x] done) instead of plain bullets
      • Enterprise: added the allowAllClaudeAiMcps managed setting to load claude.ai cloud MCP connectors alongside managed-mcp.json
      • Fixed a PowerShell permission bypass: built-in cd functions (cd.., cd\, cd~, X:) changed the working directory undetected, letting a later command read outside the workspace
      • Fixed the sandbox write allowlist in git worktrees covering the entire main repository root instead of only the shared .git directory (with hooks/ and config denied)
      • Fixed PowerShell prefix/wildcard allow rules (e.g. PowerShell(dotnet.exe build *)) not pre-approving native executables and scripts
      • Fixed a permission-analysis gap where the parser trusted stale variable-tracking values for PWD/OLDPWD/DIRSTACK across cd/pushd/popd
      • Fixed find in the Bash tool exhausting the macOS system file/vnode table and crashing the host on large directory trees
      • Fixed the managed-settings approval dialog leaving the terminal frozen after accepting at startup
      • Fixed /ultraplan and remote session creation failing with "Could not capture uncommitted changes" when the working tree has no real changes
      • Fixed otelHeadersHelper failing silently when the script path contains spaces; helper failures are now reported in /doctor and the debug log
      • Fixed the thinking spinner staying amber across tool calls and onto fresh thinking bursts
      • Fixed collapsed Bash output reporting the wrong hidden-line count for outputs with many short lines
      • Fixed slash-command argument-hint clipping trailing typed characters when the hint overflows the input box
      • Fixed argument-hint and progressive arg suggestions not appearing after Tab-completing a skill whose frontmatter name: differs from its directory basename
      • Fixed the status bar showing the user's baseline /effort setting instead of the effort level applied by skill/agent effort: frontmatter
      • Fixed Ctrl+O transcript view freezing at the moment it was opened instead of tailing new messages
      • Fixed editing a recalled prompt-history entry losing the edit when navigating further up/down with arrow keys
      • Fixed /config exit summary reporting phantom changes to auto-compact and theme when toggling unrelated settings
      • Fixed /insights crashing when cached session-meta files are missing optional fields
      • Fixed malformed PowerShell and History tool calls with missing input being misclassified as reads in transcript collapsing
      • Fixed renaming a Remote Control session from claude.ai or the Claude mobile app not updating the local session name for claude --resume
      • Fixed a race where a just-submitted prompt could appear twice in the up-arrow history
      • Fixed tapping the "Jump to bottom" pill in fullscreen mode not dismissing it immediately
      • Improved /feedback reports to include the conversation that happened before context compaction, making issues from earlier in long sessions easier to triage
    3. 🔗 r/LocalLLaMA NVIDIA Removes Gaming Revenue Category From Financial Reports rss
    4. 🔗 r/Leeds Summer w/o a social group rss

      with the lovely weather this weekend, it can be a bit isolating not knowing a lot of people in leeds, especially when everywhere seems to be constantly packed with groups and couples.

      what are some solo things we’re doing which don’t feel as scary or lonely? anyone in the same boat?

      submitted by /u/mvhhhr
      [link] [comments]

    5. 🔗 facebookresearch/faiss v1.14.2 release

      Highlights

      • SuperKMeans — faster k-means via ADSampling + PDX progressive pruning (#5168)
      • Metal GPU backend for Apple Silicon, starting with IndexFlat (#5144)
      • RVV (RISC-V Vector) SIMD backend + RISC-V cross-compilation CI (#5156, #5184)
      • pip install support via scikit-build-core + cibuildwheel (#4862)
      • SVS IVF index enabled; SVS upgraded to 0.3.0 (#4801, #4999); SVSVamana usable as IVF coarse quantizer via index_factory (#5175)
      • TurboQuant (CPU) quantizer (#5049)
      • HNSW improvements — optional persistent locks for incremental adds (#5031), prune_headroom to avoid O(n²) pruning (#4847), narrower add-time critical section (#4915)
      • Extensive index deserialization hardening — validation and OOM/overflow protection across ~40 PRs (binary, IVF, HNSW, FastScan, ScalarQuantizer, AdditiveQuantizer, ProductQuantizer, SVS, VectorTransform, …)
      • Major Dynamic Dispatch refactor across distances, hamming, partitioning, RaBitQ, FastScan; dynamic dispatch now builds on Windows (#5127)
      • cuVS upgraded to 26.02 (#4945, #4788); CI moved to CUDA 13.2 (#5207); C++20 for cuVS (#4881); filtered search for cuVS indexes (#4858)
      • OMP exception safety across IndexHNSW, IndexNNDescent, IndexNSG, IndexFlatCodes, IndexIVF (#5106, #5105, #5111, #5133, #5037, #5053)

      Full Changelog

      Added

      • b7618fa Add SuperKMeans: faster k-means via ADSampling+PDX progressive pruning (#5168)
      • 66c9d08 Add SuperKMeans foundations: math primitives, PDX layout, SIMD kernels
      • dc7afcf Support SVSVamana as IVF coarse quantizer via index_factory (#5175)
      • 7a8e4dd CI: cross-compile for riscv64 with RVV dynamic dispatch (#5184)
      • 0320279 Introduce RVV (#5156)
      • 417c53e Add NoneSIMDLevel context manager for cross-level reference checks (#5158)
      • 46def46 Enable SVS IVF Index in FAISS (#4801)
      • 585ba79 Add pip install support via scikit-build-core + cibuildwheel (#4862)
      • 799bf3a Introduce early stop facilities for IVF, attempt 2 (#5160)
      • 66cea52 Add Metal GPU backend for Apple Silicon (IndexFlat) (#5144)
      • 17fd333 Add database-parallel flat search for few-query workloads (#5000)
      • c7f07bb Add C++ per-SIMD-level tests for distance utility functions (#5154)
      • 0242758 Add bit-exact RQ encode cross-level test (#5155)
      • 2f68a37 Add per-SIMD-level tests for hamming.h utils + fix crosshamming bug (#5153)
      • a7116ed Add TurboQuant (CPU) (#5049)
      • 11e5d39 Add optional persistent locks to IndexHNSW for incremental adds (#5031)
      • e82aa28 Add OMP exception capture helpers and migrate IndexIVF (#5111)
      • 6299bff Add QT_0bit to ScalarQuantizer for centroid-only IVF distance (#5079)
      • 3030fe0 Add filtered search for cuVS indexes (#4858)
      • f83ea51 Support IVFRaBitQSearchParameters in RaBitQFastScan scanner (#5081)
      • 82a8235 Add iterator callbacks for distance computation and heap admission (#5082)
      • b068fd9 Support IO_FLAG_MMAP_IFC on Darwin (#5058)
      • 113bf6c Expose fast_scan_code_size from non-IVF FastScan indices (#5077)
      • 786d993 Expose a fast scan code size from fast scan indices (#5064)
      • 95f1e45 OMP build diagnostics (#4842)
      • c4ac852 Add a balanced assignment function (#5050)
      • 8402a6b Add unit tests for HNSW deserialization validation (#5033)
      • 1dc5e1f V2 enable specifying a subset of SIMD levels that are implemented at dispatching time. (#4959)
      • e6f5c0c Add SIMD dynamic dispatch migration guide (#4973)
      • 8177a3b Add nvidia-smi diagnostic call (#4960)
      • 67fc664 Add CappedInvertedLists for per-list size limiting (#4880)
      • e57a893 introduce SingleQueryResultCollectHandler (#4926)
      • 748c031 HNSW: add prune_headroom to avoid O(n^2) pruning/locking, headroom test (#4847)
      • 1e4d227 Introduce an early stop threshold for Kmeans (#4894)
      • 4a0fba1 Add FastScanCodeScanner dispatch boundary with per-SIMD TUs (#4897)
      • 0fcba22 Add sentinels to index format enums. (#4907)
      • 40480fb Support limits on index deserialization loops — useful for tests (#4902)
      • 1e4544a Add defaulted SIMDLevel template parameter to handler and scaler types (#4867)
      • abdd37b Add Pixi installation option to docs (#5214)

      Changed

      • 9d5491a Templatize SIMDResultHandler on SL, mark handle() final (#5223)
      • b63f236 Upgrade GitHub Actions CI from CUDA 12.6 to CUDA 13.2 (#5207)
      • a9f5baa Move RISC-V fast_scan forwarders to dedicated impl-riscv.cpp (#5216)
      • 8932716 Validate SVS storage_kind via shared helper at all deserialization read sites (#5204)
      • bc490b5 Make IVFPQSearchCagraConfig dtype fields settable from Python (#5191)
      • ffd3727 Update pattern for index factory string with SVSVamana (#5201)
      • f37041d Extract Metal shaders to standalone .metal file with kernel wrapper class (#5167)
      • d98364e perf: reserve() to avoid rehashing/reallocation (#5193)
      • 4eee3d7 Add tolerance and assertion log to test_OIVFPQ (#5188)
      • 2322afd faiss: parallelize post-BLAS reduction loop and end_multiple() in result handlers (#5185)
      • 967eda6 Replace FAISS_ASSERT with FAISS_THROW_FMT for unsupported SVSStorageKind (#5182)
      • 715725d Enable verbose mode for TestPyPI publish step (#5181)
      • 5e12311 Filter wheel artifacts before publishing to PyPI (#5179)
      • 28b2b66 Inline PQ code distance kernels into scanner TUs (#5159)
      • c41405d Enforce minimum training set size for ScalarQuantizer, check nullptr (#5141)
      • 44c1972 Enable ccache in GitHub Actions cmake builds (#5157)
      • e09de2d Harden compute_query_factors: add preconditions, handle aliasing, remove dead checks
      • 6a9936c Hoist per-iteration vector allocations in IndexIVFRaBitQFastScan::compute_LUT
      • c3460c9 Convert binary index Hamming callers to dynamic dispatch (#5071)
      • ecac651 Convert hamming.cpp public API to dynamic dispatch (#5070)
      • 8d1b964 Enable dynamic dispatch build on Windows (#5127)
      • a25bcb1 Rely on cuVS for default values (#5140)
      • 0622841 Panorama Optimizations (#5041)
      • f4338ad Parameterize existing tests with @for_all_simd_levels (#5134)
      • 9d56749 Wire 512-bit QBS kernels into fast scan DD dispatch (#5075)
      • bdf877f facebook-unused-include-check in IndexNNDescent.cpp (#5132)
      • 632427f fbcode/faiss/invlists (#5048)
      • e23c661 Replace dispatch_HammingComputer with with_HammingComputer (#5126)
      • ed7e1f2 Hoist SIMD dispatch outside loops in 4 call sites (#5074)
      • 582246b Remove use of __AMDGCN_WAVEFRONT_SIZE macro with it being deprecated in ROCm 7 (#4619)
      • 2dff119 Add braces around single-line control flow statements
      • cc0c087 Hoist SIMD dispatch out of approx_topk hot loops (#5073)
      • 18f93fd Replace SSE3 intrinsics in Index2Layer with portable scalar code (#5076)
      • 42765ab Optimize RaBitQ FastScan LUT construction for high-dimensional data (#5110)
      • ec5e70c Optimize multibit sign-bit unpacking in RaBitQ FastScan handlers (#5097)
      • 3f127ee Thread qb/centered search params through FastScan LUT and handler (#5095)
      • 3c19c52 Use std:: qualified math functions to avoid float-to-double promotion (#5088)
      • 48d2b0c Replace typedef with using declarations (#5086)
      • e12debc Remove extra semicolons after inline member function definitions (#5085)
      • 5679d3a HNSW Cagra base-level entrypoint sampling parallel (#5068)
      • c4efc42 Remove bare simdlib type aliases from simdlib_dispatch.h (#5069)
      • 4a63c9e Convert partitioning to dynamic dispatch (#5062)
      • f226be4 Roll out @for_all_simd_levels to key test files (#5061)
      • afd6949 fbcode/faiss/impl/HNSW.cpp (#5059)
      • 658c434 Replace bare assert() with FAISS_THROW_IF_NOT in core index files (#5052)
      • 364749e Re-enable ROCm runner for AMD GPU CI (#4854)
      • faeac86 Update outdated C++17 and Python 2 references (#5045)
      • 77e6028 Use HTTPS for GitHub links in README (#5043)
      • 91843bd Use explicit ISA flags instead of -march/-mtune=sapphirerapids (#5034)
      • acac823 Merge .gitignore updates from faiss-gpu-cu132 into main (#4996)
      • 8d8881e Make distance_compute_blas_threshold dimension-aware (#5022)
      • 553c78b HNSW SIMD dispatch (#5015)
      • 499b488 close the loop on ivf rabitq fast scan filter integration (#5026)
      • aef066a SVS 0.3.0 (#4999)
      • cc34603 reuse unpack buffer in multibit IVFRaBitQFastScan refinement (#5003)
      • d81584d Update Python type stubs: fix class hierarchy and add missing base classes (#5004)
      • d1c432f Convert rabitq_simd.h to runtime SIMD dispatch (#4912)
      • 6bca961 Convert distances_fused/ to runtime SIMD dispatch (#4911)
      • 04d0d56 facebook-unused-include-check in distances_simd.cpp (#5013)
      • 7eb05f0 facebook-unused-include-check in partition.cpp (#5012)
      • 7e04fa2 Update Python type stubs (init.pyi) to match current API (#4998)
      • db0e798 Use omp_get_max_threads() for OpenMP thread count (#4991)
      • 9af8384 Bump openblas from 0.3.30 to 0.3.32 in conda recipes (#4994)
      • c048917 Enable quieting FAISS warning "inverted lists not stored" (#4964)
      • b2ddb46 Loosen SVS findpackage version requirement (#4969)
      • d8c3d26 Upgrade to C++20 for CUVS (#4881)
      • 94f2b51 Rename train() with queries to train_with_queries (#4955)
      • 02d609c Upgrade cuVS Version to 26.02 (#4945)
      • 55a47c9 Upgrade cuVS Version to 26.02, switch various BUCK files over to 26.02 (#4788)
      • 0d147a7 Make READVECTOR byte limit configurable (#4928)
      • 9962fbe HNSW: narrow critical section during add to avoid lock contention (#4915)
      • b1feeb7 Convert approx_topk and residual_quantizer_encode_steps to SIMDLevel dynamic dispatch (#4923)
      • 58a57e6 Re-enable backwards compatibility tests for rabitq now that 1.14.1 released (#4924)
      • 5dcef18 Refactor binary HNSW stats to use OpenMP reduction instead of destructor sync (#4910)
      • d8c1a97 move distances implementation into SIMD specific compile units (#4906)
      • ea11f0e Switch all search paths to FastScanCodeScanner and remove make_knn_handler (#4904)
      • 57190f9 Wire RaBitQ search through FastScanCodeScanner dispatch (#4903)
      • 79e8acb Parallelize compute_residuals in IndexIVFPQ (#4654)
      • eddea2a Extract RaBitQ result handler to impl/fast_scan/ (#4895)
      • 734751a Extract PQ4 kernels to includable headers in impl/pq_4bit/ (#4868)
      • bb298a2 convert simdlib in distances_simd.cpp (#4884)
      • 8d8268c Templatize simdlib types on SIMDLevel (#4866)
      • c74809a Improve exception safety for the 'own_fields'/allocation pattern (#4864)
      • c6cf004 use level but not 0 in neighbor_range(i, level, &begin, &end) (line 198) (#5005)

      Fixed

      • cb69d7c Fix Dq=None crash and np.empty nondeterminism in search_preassigned wrappers (#5221)
      • 5c92c5c Fix flaky test_hnsw smoke test by increasing efSearch (#5222)
      • 8d3cc92 Fix clone_index null return for IndexRowwiseMinMax (#5220)
      • ff1d543 Fix python_unnecessary_generator_set_comprehension issues in faiss/tests/test_fastscan_filter.py (#5215)
      • e235915 Fix FastScan DD regression by threading SIMD level through kernel functions (#5210)
      • 172324a Fix IDSelectorBitmap conversion to cuVS bitset (#5211)
      • 6bd749e Fix IDSelector leak via SearchParameters.sel setter (#5208)
      • 6376bc3 Fix CI: (cuVS) conda shards cache lock, (ARM) bump openblas, (SVS) fix LeanVec double-destruction (#5209)
      • 4b5a735 Fix python_unnecessary_generator_set_comprehension issues in faiss/.../bench_fw/optimize.py (#5205)
      • 6789bf5 Validate IndexIDMap id_map and inner-index ntotal consistency to prevent search-time null deref (#5203)
      • f750815 Pin MKL to <2026 to avoid soname mismatch with pytorch (#5192)
      • bb2ce71 Fix 7 broken tests (#5197)
      • f323c0f Fix backward compat test (#5195)
      • 23cd94c Reduce BinaryCagra test parameters to prevent CI timeouts (#5194)
      • 85fc627 Validate ProductQuantizer M*ksub during deserialization to prevent oversized allocations (#5187)
      • 6cef1bb Fix cuVS and ROCm CI conda environment failures (#5180)
      • 4a471ee Pin conda <25.7 to fix Windows build (#5176)
      • a9c0d41 Work around GCC 12 miscompilation of AVX2 histogram (#5124)
      • 40a8cc0 Fix lints associated with early stop facilities for IVF (#5172)
      • 1e69d5a Fix peak-memory spike when loading IVF invlists via IO_FLAG_MMAP_IFC (#5122)
      • 9942229 Fix add_sa_codes silently accepting non-int64 ids, corrupting stored labels (#5171)
      • c5ddbc7 c_api: fix IndexShards own_indices getter/setter name mismatch (#5165)
      • 8380e25 Fix avx512 unit test (#5161)
      • 71448c0 Fix issue with svs tests (#5162)
      • 6c70444 Validate code_size during deserialization to prevent oversized allocations (#5151)
      • 9dbb81c Set own_fields after reading Index2Layer sub-quantizer during deserialization (#5147)
      • 01b22b4 Fix memory leak warning for unordered_multimap in IndexIVFFlatDedup Python binding (#1667) (#5145)
      • 130fc24 Fix flaky test (#5150)
      • dfce6e9 Fix OMP exception safety in IndexHNSW search (#5133)
      • c627334 Fix sa_decode offset bug and integer overflow in IndexRefine (#5143)
      • 1b4b995 Fix implicit integer precision loss from 64-bit to 32-bit (#5091)
      • b056894 Fix miscellaneous lint warnings (#5093)
      • ed11f28 Fix broken fbcode//faiss/tests:test_contrib - test_checkpoint (test_contrib.TestBigBatchSearch) (#5139)
      • 277c53d Fix PCA training bug and memory safety issues in VectorTransform.cpp (#5138)
      • 8312540 Fix integer type truncation in IDSelectorBatch bloom filter mask (#5136)
      • 9cbc8da Fix integer overflow and unbounded loop in Clustering.cpp (#5130)
      • 3c4056d Fix race condition in HNSW::add_with_locks (#5129)
      • 6e64c5d Bump GCC pin in faiss-gpu conda recipe to fix AVX2 SIMD miscompilation (#5125)
      • 58f6ebb Add per-read byte limit to SVS ReaderStreambuf to prevent OOM from corrupt index data (#5118)
      • 817ecf9 Validate inverted list entry sizes against deserialization byte limit (#5117)
      • e6be162 Validate VectorTransform dimension consistency during deserialization (#5115)
      • 6707eac Add is_trained check to IndexIVF search and range_search to prevent querying untrained indexes (#5114)
      • 349df70 Validate IndexHNSW2Level storage type during deserialization and search (#5113)
      • edd6f3b Reject null quantizer during IVF index deserialization (#5112)
      • 27078c5 Fix OMP exception safety in IndexNNDescent and IndexNSG search (#5106)
      • 99db159 Fix OMP exception safety in IndexFlatCodes search (#5105)
      • 40ad646 Fix cuVS build (#5107)
      • 57bf474 Fix int/size_t signedness mismatches in HNSW add (#5116)
      • f9f116d Validate k_factor during deserialization to prevent search-time OOM (#5104)
      • 2d8232c Set code_size on IVFRaBitQFastScanScanner (#5099)
      • b923091 fix: GPU CAGRA copyFrom host-memory lifetime dependency and add regression test (#4968)
      • 796977a Fix IndexBinaryMultiHash::reset() not clearing hash maps and avoid unnecessary copies (#5100)
      • b86066a fix: cagra bug (#4963)
      • 91f6636 Add value-initialization to uninitialized member variables (#5089)
      • 61ed7dc Fix orphaned OpenMP directives in IndexRowwiseMinMax training functions (#5096)
      • 740d3a3 Fix FastScan for indices without own inverted lists + performance optimizations in RaBitQ handler (#5080)
      • 7cc6342 Suppress unused static constexpr variable warnings (#5087)
      • aa3ce37 Fix race condition, memory management, debug output, and hashtable lookup in sorting.cpp (#5078)
      • 86d3371 Validate FastScan M2 consistency during deserialization (#5056)
      • 67f066f Validate SVS storage_kind during deserialization (#5055)
      • e899476 Default-initialize SVSStorageKind in IndexSVSVamana (#5054)
      • c1e48a2 Add search-path bounds checking to IndexIVF::search1 (#5040)
      • 97d2574 Fix correctness bugs in NNDescent Nhood copy/move operations and gen_random bounds (#5072)
      • 06ef481 Fix uncaught exceptions in IndexIVF::range_search_preassigned OpenMP region (#5053)
      • 2552509 Fix bugs in NSG search_on_graph and sync_prune (#5063)
      • 7047dc5 Fix priority_queue constructor inheritance for Apple Clang on macOS (#5065)
      • e0a1aec Assorted Dynamic Dispatch cleanup fixes (#5060)
      • 25296ba Fix type mismatch bug and remove dead code in IndexRowwiseMinMax::sa_decode_impl (#5051)
      • 7b2705c Debug manifold crash with NaN (#5025)
      • 9d3f97e Fix duplicate words and grammar typos across codebase (#5044)
      • 84262f0 Fix d_out check bug and add descriptive error messages to VectorTransform assertions (#5047)
      • ef28c6b Fix uncaught exceptions in IndexIVF::search_preassigned OpenMP region (#5037)
      • 8008ca2 Fix deadly signal in to_svs_metric() for unsupported metrics (#5032)
      • 4b8da68 Fix IndexSVSVamana null-deref in deserialize_impl (#5029)
      • ab3da52 Cap ZnSphereCodecRec decode cache size (#5028)
      • d68050d Add missing input validation to IndexFlat::range_search and compute_distance_subset (#5038)
      • c6fa50a Validate IndexIDMap id_map size during deserialization (#5024)
      • 408786b Validate AdditiveQuantizer dimension consistency during deserialization (#5023)
      • 0ce4dfb Fix AVX512_SPR build failure for 512-bit SIMD types (#5030)
      • a308ada Harden ScalarQuantizer deserialization validation (#5020)
      • ab46dcb Validate qbs at deserialization time in FastScan index formats (#5019)
      • 668da4a Validate IndexBinaryHash b <= code_size*8 during deserialization (#5011)
      • 87bc9b0 Validate IndexFastScan quantizer state during deserialization (#5009)
      • 4c39156 Validate codebooks size at deserialization time in read_AdditiveQuantizer (#5008)
      • 8c1f3f4 read-heap-buffer-overflow (size 32) in float faiss::fvec_norm_L2sqr<>()
      • 226ccf3 Fix OSX arm64 nightly: bump libopenblas from 0.3.30 to 0.3.32 (#5006)
      • aeb170c large-malloc (15023964028 bytes) in __sanitizer::RunMallocHooks() (#5018)
      • 8550f23 Validate VectorTransform dimensions during deserialization (#5007)
      • 833d4aa out-of-memory in __gnu_cxx::new_allocator<>::allocate() (#5014)
      • d716be3 Fix avx512_result_handlers build on aarch64 (#4965)
      • 18c85e1 Add deserialization vector limit enforcement for ResidualCoarseQuantizer (#4997)
      • b74f3cd Validate IndexBinaryMultiHash b and nhash*b bounds during deserialization (#4984)
      • b9f4960 Add invlists null check to IndexBinaryIVF::search (#4980)
      • ba1981c Add input validation to IndexBinaryHNSW search preconditions (#4979)
      • d26c15d Validate binary index consistency during deserialization (#4978)
      • 2c28ef5 Validate RaBitQ qb during deserialization (#4983)
      • 5a4d621 deadly-signal (vector::_M_default_append) in __clang_call_terminate (#4986)
      • 0759009 Fix compiler warnings for pip wheel builds (macOS + Windows) (#4989)
      • 8a80b3d signal in faiss::ArrayInvertedListsPanorama::ArrayInvertedListsPanorama() (#4987)
      • 12675af out-of-memory in __gnu_cxx::new_allocator<>::allocate() (#4985)
      • 0a8e516 Fix HNSW Panorama Perf Bug (#4974)
      • 6dbf271 Validate VectorTransform data during deserialization (#4981)
      • 3f79389 Fix MSVC link failure: remove __restrict from fvec_madd specializations (#4972)
      • d47b281 deadly-signal (vector::_M_default_append) in __clang_call_terminate (#4982)
      • f851c54 large-malloc (6241124352 bytes) in __sanitizer::RunMallocHooks() (#4977)
      • bd5ed00 Validate inverted lists pointer in IndexIVF operations (#4951)
      • 398857b Handle empty index in IndexHNSWCagra base_level_only search (#4950)
      • d647b59 Validate graph index data during deserialization (#4949)
      • e5114c2 fix: resolve compiler warnings in binary and miscellaneous Index files (#4940)
      • 44f57ba fix: resolve compiler warnings in top-level FAISS source files (#4943)
      • b3a2914 fix: resolve compiler warnings in test files (#4944)
      • 88efcb9 fix: resolve compiler warnings in core base classes and headers (#4933)
      • 7acc420 fix: resolve compiler warnings in inverted lists and cppcontrib (#4939)
      • 64a2122 fix: resolve compiler warnings in IO, result handlers, and misc impl (#4936)
      • a05f13f fix: resolve compiler warnings in PQ, PreTransform, and Refine Index files (#4941)
      • 7645426 fix: resolve compiler warnings in IVF Index implementations (#4942)
      • f5142bf large-malloc (7046432072 bytes) in __sanitizer::RunMallocHooks() (#4967)
      • 4db01e3 fix: resolve compiler warnings in graph-based index implementations (#4956)
      • ccc3cd6 Validate code vector sizes during index deserialization (#4948)
      • ec30fb3 Use BitstringReader in IndexBinaryHash to avoid OOB reads (#4961)
      • fa8ddd9 Fix flaky test for Panaorama/regular IVFFlat equivalence (#4954)
      • 1e6729d Validate quantizer data sizes during index deserialization (#4947)
      • 62a1969 fix: resolve compiler warnings in distance and hamming utilities (#4937)
      • 645a742 Re add cuvs to cmakelists.txt (#4953)
      • 5287db0 fix: resolve compiler warnings in graph-based index implementations (#4934)
      • a48e45a fix: resolve compiler warnings in quantizer implementations (#4935)
      • 32ca42f fix: resolve compiler warnings in SIMD, sorting, and misc utilities (#4938)
      • 52d9fc7 Add overflow check in READVECTOR macro (#4946)
      • 0f7e65e Enforce memory limit in read_ProductQuantizer (#4930)
      • 9ea026c Validate codes vector size in BlockInvertedLists deserialization (#4920)
      • a4385df Validate n_per_block and block_size in BlockInvertedLists deserialization (#4919)
      • cdb7254 Validate id_map size matches ntotal in IndexBinaryIDMap deserialization (#4917)
      • 05ca04e Validate per-entry ilsz in read_binary_multi_hash_map (#4916)
      • b023178 Fix MSVC OpenMP build: use idx_t instead of size_t in parallel for loop (#4922)
      • 5b83ec6 Fix OpenMP critical section contention in IndexBinaryHNSW search (#4909)
      • e96ba2d fix: decouple coarse quantizer from cuvs index reset (#4885)
      • 9d6b2e7 Additional input validation for index deserialization (#4899)
      • 796bdf9 Additional binary index input validation (#4898)
      • d0434be Fix cloning for IVFFlatPanorama (#4887)
      • 3e4c103 Validate dynamic_casts during index load (#4883)
      • 47e53b4 Fix backward compatibility to use latest version (#4855)

      Deprecated

      • 812010f Remove flaky test (#5169)
      • 74dceee Remove RaBitQStats debug counters from all RaBitQ handlers (#5102)
      • 000eec2 Delete old pq4_accumulate_loop files (replaced by dispatching.h) (#4905)

      Compare: v1.14.1...v1.14.2

    6. 🔗 r/Yorkshire Some more from YWP rss

      Some more from YWP | I work here currently so apologies for all the images. It was a really sunny day and I got these at lunchtime. submitted by /u/Icy_Ebb_6862
      [link] [comments]
      ---|---

    7. 🔗 r/reverseengineering CTF with AI/LLM reverse engineering angles - intercepting streamed responses, replaying tokens, finding hidden endpoints (June 17-22) rss
    8. 🔗 r/york Mega Empires - York rss

      Mega Empires - York | Hi r/york. I am organising a game of Mega Empires up at Monks Cross on Saturday 27th June. This is a modern epic take on a classic civilization board game for up to 18 players. I have a handful of spaces left available, if you're interested see below or drop me a message! BGG link for the game: https://boardgamegeek.com/boardgame/339526/mega-empires
      Sign up: https://forms.gle/bLPx9Mdis5nqtMsz6 submitted by /u/Thisisnotasmile
      [link] [comments]
      ---|---

    9. 🔗 r/york Wavy Hair Hairdresser rss

      Hi I was wondering if anyone has recommendations for hair dressers who work with wavy hair? I have 2B hair and I’m going to York for Uni in September so I want to find a good hairdresser in advance

      submitted by /u/AyakaXI
      [link] [comments]

    10. 🔗 r/wiesbaden Vibrancy rss

      Moin,
      morgen soll ja das erste Event des Jahres von Vibrancy stattfinden. Also bis eben war noch nichts vor dem Kurhaus zu sehen. Jemand eine Ahnung ob die so kurzfristig alles aufbauen können?

      submitted by /u/Prestigious-Cod-8064
      [link] [comments]

    11. 🔗 r/Yorkshire Pub BBQ In Collingham rss

      Pub BBQ In Collingham | Needless to say, I scoffed a burger like a dog might. submitted by /u/Pitiful-Hearing5279
      [link] [comments]
      ---|---

    12. 🔗 r/reverseengineering Rebuilding Zyxel’s super-admin password flow in HTML from firmware/runtime notes rss
    13. 🔗 r/wiesbaden Wiesbaden → Flughafen Frankfurt: Taxi, Uber oder Transfer? rss

      Hi zusammen,

      was ist die beste Möglichkeit, von Wiesbaden zum Flughafen Frankfurt zu kommen, wenn man 4–5 große Koffer dabei hat? Wir sind 2 Personen.

      Würdet ihr eher Taxi, Flughafentransfer, Uber oder etwas anderes empfehlen? Am besten unkompliziert und nicht zu teuer.

      Danke!

      submitted by /u/Lum_zan
      [link] [comments]

    14. 🔗 r/wiesbaden Body Street Biebrich Str. d. Republik 22 rss

      Can someone in the area confirm if Body Street EMS Gym is open? They don't respond to any emails and calls. If someone is in the area and can check for me that would be super nice! Google says they're still open but the last review was 5 months ago...

      submitted by /u/thehappierguy
      [link] [comments]

    15. 🔗 r/york Pickering pubs? rss

      Asking here as r/Pickering is unsurprisingly Ontario-related: any recommendations for a good old CAMRA traditional pub in Pickering (North Yorkshire) or surrounding areas (can stretch to Thornton) for a drink? TIA

      submitted by /u/Denzelini_Dumfrini2
      [link] [comments]

    16. 🔗 r/Yorkshire What’s a completely normal thing in Yorkshire that confuses people from elsewhere in the UK? rss

      For me it’s how people will still call somewhere “down road” even when it’s about 40 min away

      submitted by /u/RedDevilPlay
      [link] [comments]

    17. 🔗 r/LocalLLaMA DeepSeek is pushing forward with $10.29 billion financing round, with Liang Wenfeng committing to continue developing open-source AI models rather than pursuing short-term commercialization goals rss
    18. 🔗 r/york Snowdrops at St mary’s abbey 🫶 rss

      Snowdrops at St mary’s abbey 🫶 | @ Sue Gabbatiss submitted by /u/Juicewithextrapulp
      [link] [comments]
      ---|---

    19. 🔗 r/Yorkshire The Futuro House in Todmorden, West Yorkshire. It was a post-war futurist home designed to be easy to transport, deconstruct and quickly reconstruct on site. (1971) rss
    20. 🔗 r/Leeds Beer gardens in headingley/Hyde park with real grass? rss

      Bit of a weird question maybe but are there any pubs in the headingley/hyde park area that have beer gardens with real grass? It just stood out to me as strange that they all have fake grass put down when none of the pubs in my hometown have it

      submitted by /u/JealousBodybuilder42
      [link] [comments]

    21. 🔗 r/Yorkshire Kirklees Reform councillors admit to not understanding how councils work at failed meeting to elect leader rss
    22. 🔗 r/Leeds The sun is coming 🌞 rss

      Where are your favourite places to go around Leeds (or accessible from Leeds) on a hot day? Particularly interested in any toddler friendly recs

      submitted by /u/Spirited_Plenty_7599
      [link] [comments]

    23. 🔗 r/reverseengineering Reverse Engineered Google reCAPTCHA rss
    24. 🔗 r/LocalLLaMA When your LLM treats data center GPUs like an optional DLC rss

      When your LLM treats data center GPUs like an optional DLC | submitted by /u/noprompt
      [link] [comments]
      ---|---

    25. 🔗 anthropics/claude-code v2.1.148 release

      What's changed

      • Fixed the Bash tool returning exit code 127 on every command for some users (a regression introduced in 2.1.147)
  3. May 21, 2026
    1. 🔗 IDA Plugin Updates IDA Plugin Updates on 2026-05-21 rss

      IDA Plugin Updates on 2026-05-21

      New Releases:

      Activity:

    2. 🔗 anthropics/claude-code v2.1.147 release

      What's changed

      • Pinned background sessions (Ctrl+T in claude agents) now stay alive when idle, are restarted in place to apply Claude Code updates, and are shed under memory pressure only after non-pinned sessions
      • Renamed /simplify to /code-review. It now reports correctness bugs at a chosen effort level (e.g., /code-review high); pass --comment to post findings as inline GitHub PR comments. The old cleanup-and-fix behavior has been removed
      • Improved auto-updater: retries transient network failures, reports specific error categories and OS error codes on failure, and shows the current version when an update fails
      • Improved diff rendering performance for large file edits
      • Prompt history no longer records consecutive duplicate entries — recalling a prompt with arrow-up and submitting it again won't add another copy
      • Fixed enterprise login restrictions (forceLoginOrgUUID and forceLoginMethod managed-settings) not being enforced against third-party-provider and API-key sessions
      • Fixed & in ! command output displaying as &amp;, which broke copy-pasting URLs from commands like gcloud auth login on headless machines
      • Fixed unknown slash commands silently doing nothing in headless/SDK mode — they now show an error message
      • Fixed /help rendering a broken tab header and showing only one command per page on small terminals when not in fullscreen mode
      • Fixed shell snapshot dropping user functions whose names start with a single underscore, which broke aliases referencing them
      • Fixed plugin agents that declare multiple Agent(...) types in tools: frontmatter dropping all but the last entry
      • Fixed hook if conditions like PowerShell(git push*) never matching — only PowerShell(*) worked
      • Fixed PowerShell tool dropping output for commands that rely on the default formatter
      • Fixed: on Windows, "Yes, and don't ask again" for a PowerShell script invocation now writes a rule that actually matches on subsequent runs
      • Fixed PowerShell tool failing on Windows with exit code 1 when pwsh is installed via winget or the Microsoft Store
      • Fixed /effort opening with the slider on the wrong level — it now starts at your current effort
      • Fixed paginating MCP servers dropping resources, templates, and prompts past page 1
      • Fixed full-screen strobing in attached background sessions on Windows Terminal while Claude is streaming
      • Fixed: on Windows, removing a background-job worktree no longer follows NTFS junctions into the main repo
      • Fixed /background refusing sessions whose only typed input was a skill or custom slash command
      • Fixed auto mode suppressing AskUserQuestion when the user or a skill explicitly relies on it; the auto-mode classifier now sees the user's answers as intent signal
      • Fixed /theme "New custom theme" and color editor dialogs not responding to Esc
      • Fixed an uncaught exception at the end of streaming sessions when running via the Agent SDK
      • Fixed a rare hang when waiting for scroll to settle on Windows
      • Fixed stale and doubled rows in the agent view list on Windows when background session results contain wide (CJK) characters
      • Fixed pasted text being delivered to agents as an unreadable [Pasted text #N] placeholder instead of the actual content
      • Fixed plugin component counts in claude plugin details and /plugin being doubled when a plugin's manifest listed paths overlapping its default directories
      • Fixed backgrounded sessions re-prompting for tool permissions you already granted with "don't ask again"
      • Fixed GNOME Terminal right-click and middle-click paste not inserting text
      • Fixed CLAUDE_CODE_SUBAGENT_MODEL not applying to teammate processes spawned by agent teams
      • Fixed slash commands followed by a tab or newline being treated as an unknown command
      • Fixed several spacing and layout glitches in the /plugin, /status, /mobile, /sandbox, and /permissions menus
      • Fixed stripped images prompting the model to repeatedly re-read media that was no longer present
    3. 🔗 r/Harrogate Join our WhatsApp rss
    4. 🔗 earendil-works/pi v0.74.2 release

      Fixed

      • Fixed pi update on Node 20 to explain that newer Pi releases require Node >= 22.19.0 instead of reporting a successful no-op update (#4876).
      • Changed self-update package-manager commands to pass --ignore-scripts.
    5. 🔗 @HexRaysSA@infosec.exchange 🎂 IDA Turns 35. mastodon

      🎂 IDA Turns 35.
      From DOS-era disassembler to one of the most widely used reverse engineering platforms in the world...

      To celebrate, we’re launching:
      • 35% off new licenses (see eligibility requirements)
      • Limited-edition swag giveaway
      • “35 Ways to Use IDA” as told by you
      • Stories from the past and a few for the future

      Read all about it here:
      https://hex-rays.com/blog/ida-turns-35-lets-celebrate-together

    6. 🔗 3Blue1Brown (YouTube) Tie random ends: How many loops? rss

      Recent puzzle solutions on Patreon: https://members.3blue1brown.com/posts/158885046?pr=true

    7. 🔗 Hex-Rays Blog Celebrating 35 Years of IDA rss

      Celebrating 35 Years of IDA

      35 Days of IDA

    8. 🔗 r/LocalLLaMA Qwen3.6 35Ba3 has changed my workflows and even how I use my computer rss

      My workflow has changed basically to ask Codex to do certain tasks and then document how to do them (including errors it found on its way) into a skill. I feed that skill to pi, and suddenly my qwen3.6 gets that hard stuff done:

      - devops on a VPS
      - using docling to create epubs from old PDFs
      - using playwright to test stuff
      - Doing code tickets

      And the list goes on.

      What also has changed for me is the way I use the computer. Suddenly, I talk to the OS with natural language: "pi pal, install me please this python library in an .env and do X"; "hey pi, check what is using most space from the memory"; "clean X"; "check my network"; "change X configuration", etc etc etc.

      There are times the only reason why I use chatgpt for something is to spare the laptop the effort, or because qwen is already busy with something else.

      What I've done today just blew my mind:

      I got couple of whatsapp audios asking me to build a simple landing page. I downloaded the audios and transcripted them with AnythingLLM. Then "asked the transcript" to create a content structure for the landing page for the project mentioned in the audios. I got the proper structure and pasted it into a markdown file content.md within an empty folder.

      I opened pi and asked it to create a website with that content. Gave it some assets also in the folder. Gave two links from websites to extract other assets or contents that could be relevant. Went to have a walk.

      Came back the website was ready and looking nice.

      I wanted some changes, so I created a plan.md file with tickets like following "Ticket 1 | UNDONE" + description of the task.

      Then I opened pi again and promted something like this:

      We have a solid first website. You should follow the plan.md file. There are tickets there, for each ticket, one by one, you should open another pi to do the ticket:

      pi -p @plan.md "Check the first Ticket with Status UNDONE and do it".
      

      For every ticket that gets done, change the status to DONE and commit that change (git). All the tickets should be done, not by you, but by other pi instances. You only send the promt to them. There are 8 tickets, you are the manager, the pis you call are your employees.

      With this trick, I had one main pi running "ephemeral pis". The idea was to save some RAM (context), since for each task there was a new pi with fresh context. The main one would check that they did the job, change the status to DONE, git commit, and promt the next "sub-pi".

      I had 8 promts, it did them all. In the meantime I prepared DNS for the domain of the landing page.

      When it was done, I had just to ask it to use the VPS skill codex had created to upload the site.

      That means: from some whatsapp audios, to a website live, ALL WAS DONE LOCALLY by qwen3.6 35B. To me that's mindblowing.

      Just some months ago I was just wondering if there was any use to a local model, or if I would have to wait couple of years for another laptop with more RAM and bandwith.

      Today I refreshed this sub like 20 times and I will keep doing it the next days, salivating for a qwen3.7 35B!!

      What a time to be a live, for Jupiter's sake!

      My big thanks for the qwen team and the pi team! (btw, pi is the most "meta" software I've ever seen, since it is able to extend itself, call itself, add skills to itself, change its own configs, etc. Kudos, really)

      submitted by /u/mouseofcatofschrodi
      [link] [comments]

    9. 🔗 r/Leeds Unpopular opinion: The Core redevelopment is fantastic rss

      Whether or not you agree with more student accom in the city centre, I think this is one of the best recent examples in Leeds of contextually-responsive redevelopment.

      • Proportions and architectural nod to the civic grandeur of the Headrow.
      • Large two storey frontages.
      • Ornate red brick rather than dull white cladding.
      • Creating 2 new streets between to avoid super blocking.

      Looks like they’re also taking inspiration from Leeds’ famous east-west arcades by aligning these with opening into Thorntons Arcade entrance which always felt so claustrophobic on Lands Lane.

      Happy to hear others views!

      submitted by /u/zeitgeist247
      [link] [comments]

    10. 🔗 r/york Mayor Making rss

      Mayor Making | York does its history so well. 800+ years of Lord Mayors and Sheriffs relived today with the annual mayor making ceremony at annual council. submitted by /u/York_shireman
      [link] [comments]
      ---|---

    11. 🔗 r/LocalLLaMA Waiting for Qwen 3.7 open weight... The new King has arrived... rss
    12. 🔗 Simon Willison Datasette Agent rss

      We just announced the first release of Datasette Agent, a new extensible AI assistant for Datasette. I've been working on my LLM Python library for just over three years now, and Datasette Agent represents the moment that LLM and Datasette finally come together. I'm really excited about it!

      Datasette Agent provides a conversational interface for asking questions of the data you have stored in Datasette. Add the datasette-agent-charts plugin and it can generate charts of your data as well.

      The demo

      The announcement post (on the new Datasette project blog) includes this demo video:

      I recorded the video against the new agent.datasette.io live demo instance, which runs Datasette Agent against example databases including the classic global-power-plants by WRI, and a copy of the Datasette backup of my blog.

      The live demo runs on Gemini 3.1 Flash-Lite - it's cheap, fast and has no trouble writing SQLite queries.

      A question I asked in the demo was:

      when did Simon most recently see a pelican?

      Which ran this SQL query:

      SELECT
        title, commentary, created
      FROM
        blog_beat
      WHERE
        beat_type = 'sighting'
        AND (title LIKE '%pelican%' OR commentary LIKE '%pelican%')
      ORDER BY
        created DESC
      LIMIT
        5

      And replied:

      The most recent sighting of a pelican by Simon was recorded on May 20, 2026.

      The observation included a California Brown Pelican, along with a Common Loon, Canada Goose, Striped Shore Crab, and a California Sea Lion.

      Here's that sighting on my blog, and the Markdown export of the full conversation transcript.

      The plugins

      My favorite feature of Datasette Agent is that, like the rest of Datasette, it's extensible using plugins.

      We've shipped three plugins so far:

      Building plugins is really fun. I have a bunch more prototypes that aren't quite alpha-quality yet.

      Claude Code and OpenAI Codex are both proving excellent at writing plugins - just point them at a checkout of the datasette-agent repo for reference and tell them what you want to build!

      Running it against local models

      I've also been having fun running the new plugin against local models. Here's a uv one-liner to run the plugin against gemma-4-26b-a4b in LM Studio on a Mac:

      uvx --prerelease=allow \
        --with datasette-agent --with llm-lmstudio \
        datasette --internal internal.db --root \
        -s plugins.datasette-llm.default_model lmstudio/google/gemma-4-26b-a4b \
        data.db

      Datasette Agent needs reliable tool calls and the ability for a model to produce SQL queries that run against SQLite. The open weight models released in the past six months are increasingly able to handle that.

      What's next

      Datasette Agent opens up so many opportunities for the LLM and Datasette ecosystem in general.

      It's already informed the major LLM 0.32a0 refactor which I'm nearly ready to roll into a stable release, maybe with some additional "LLM agent" abstractions extracte from Datasette Agent itself.

      I've been exploring my own take on the Claude Artifacts, which is shaping up nicely as a plugin.

      I'm excited to use Datasette Agent to build my own Claw - a personal AI assistant built around data imported from different parts of my digital life, which is a neat excuse to revisit my older Dogsheep family of tools.

      We'll also be rolling out Datasette Agent for users of Datasette Cloud.

      Join our #datasette-agent Discord channel if you'd like to talk about the project.

      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.

    13. 🔗 r/reverseengineering Post-Quantum Cryptographic Algorithm Examined in Developmental Ransomware rss
    14. 🔗 r/Yorkshire Catherine Connolly: Irish president finishes first official visit to Leeds rss

      Catherine Connolly: Irish president finishes first official visit to Leeds | Irish President Catherine Connolly has ended her first official visit to Great Britain in Leeds. On Wednesday morning, she visited the University of Leeds, where she had studied for two years to obtain her Masters in Clinical Psychology degree. Some Irish connected artefacts from the university's collections were shown to Connolly by archivists, including a very rare first edition of Dracula - the university holds a big collection of Bram Stoker's letters from his time as a theatre manager. At the Leeds Irish Centre, she praised the work of Irish nurses in the NHS. Other artifices presented to her were some miniature books made by the Bronte sisters, whose father came from County Down, and an early edition of "Station Island" by Seamus Heaney, annotated and changed by the author. In her speech at the Leeds Irish Centre, Connolly spoke of the contribution Irish emigrants had made to Britain, especially women - particularly those who had worked in the NHS. Members of the community who met the president said visits like this meant a lot. submitted by /u/coffeewalnut08
      [link] [comments]
      ---|---

    15. 🔗 Kagi release notes May 21st, 2026 - Search API preview opens to all users rss

      Kagi Search API is now in public preview

      Today we’re making the Kagi Search API preview publicly available, giving builders access to Kagi search across web, images, videos, news, and podcasts. The API is ready to use today, and we’re using this preview to transition existing beta API users, collect feedback, and finish the remaining launch details before the official announcement.

      As a thank you to our subscribers, we’ve added $5 in API credits to your account. You can use them right away to try the API, explore what’s possible, and see how it fits into your workflow.

      Explore the API, read the docs, and check pricing to get started!

      The API is not just a generic search endpoint, queries can inherit the preferences attached to the Kagi account behind the API key, including lenses, upranks, downranks, and blocklists, so applications can search through the same trusted and filtered view of the web that users have already shaped in Kagi.

      Please send us candid feedback: what’s confusing, missing, broken, or unexpectedly good! Try it out!

      Search

      Incognito-only mode for Privacy Pass

      Our Privacy Pass extension, which allows you to prove to our servers that you're a subscriber without revealing your identity, has gained a long- awaited toggle that makes it active only in incognito windows, so you can benefit from personalized results most of the time but have added anonymity for your more sensitive browsing. The extension was almost completely rewritten in the process, squashing several long-standing bugs. Try it out!

      • Incognito Only Privacy Pass option in extension #6261 @snowytrees
      • Privacy Pass Authentication Doesn't Work in Private Windows of Firefox unless the Extension Is Turned Off and On Again #10582 @kbkle
      • Upload speed test started in background after pressing stop during download speed test #10449 @shezgara
      • "Welcome to your kagi team" email template missing team name #8876 @tboby
      • Region selection for Images, Videos, Podcasts #6784 @batuhan
      • 404 Not Found When Deactivating Lens #10564 @Vage
      • Incorrect definition of English word dingy #10395 @tekchip
      • Quick Answer Not Showing Short Citation #10406 @Hummvie
      • Keywords in Lenses act as "AND" instead of "OR" (adding keywords restrict the results). #10614 @aussetg
      • Small Web: button not clickable when hovering over text 'Start your journey' #10094 @alelb22
      • Duplicate youtube videos in video search results #7116 @Thibaultmol
      • Notifications only appear after you make a search #8304 @Temanor
      • Maps: Searching with no query searches for text "Undefined" #10486 @zachary
      • Firefox Privacy Pass Extension does not redirect for right click search kagi for "" #6381 @Trees79

      Assistant

      • LLM's Can't Tell the Difference Between Files with the Same Name #8878 @rogue
      • Kagi Assistant fails to output answer if too many work blocks are used #10568 @PolicyPants
      • What model is the Research Assistant based on? #10536 @rogue

      Kagi Translate

      New on the Kagi Translate mobile app

      Support for custom languages, explanations for alternative translations, word suggestions for dictionary mode, app shortcuts, and many other improvements!

      Grab the app if you haven't already: Android or iOS

      Post of the week

      This week's featured social media mention:

      Featured Kagi tip 💡

      We put together a guide on using Kagi for academic work - the features, shortcuts, and search habits to get precise, more relevant results.

      Around the block

      A handful of posts worth sharing with our community:

      Kagi video

      A quick video from our team to serve as a reminder of what Kagi is all about: the web, and your time on it, belong to you.

    16. 🔗 Jeremy Fielding (YouTube) This Invention Got Tesla Inducted Into The Hall of Fame rss

      If you want to join my community of makers and Tinkers consider getting a YouTube membership 👉 https://www.youtube.com/@JeremyFieldingSr/join

      If you want to chip in a few bucks to support these projects and teaching videos, please visit my Patreon page or Buy Me a Coffee. 👉 https://www.patreon.com/jeremyfieldingsr 👉 https://www.buymeacoffee.com/jeremyfielding

      Social media, websites, and other channel

      Instagram https://www.instagram.com/jeremy_fielding/?hl=en Twitter 👉https://twitter.com/jeremy_fielding TikTok 👉https://www.tiktok.com/@jeremy_fielding0 LinkedIn 👉https://www.linkedin.com/in/jeremy-fielding-749b55250/ My websites 👉 https://www.jeremyfielding.com 👉https://www.fatherhoodengineered.com My other channel Fatherhood engineered channel 👉 https://www.youtube.com/channel/UC_jX1r7deAcCJ_fTtM9x8ZA

      Notes:

      Technical corrections

      Nothing yet

    17. 🔗 r/Yorkshire Some Lions at YWP rss

      Some Lions at YWP | Some lions from today. submitted by /u/Icy_Ebb_6862
      [link] [comments]
      ---|---

    18. 🔗 r/Leeds First time at Akbar’s in Leeds tonight. I thought I was being sensible by ordering the Medium naan… rss

      Chicken Karahi was 10/10. Any other good recommendations around?

      submitted by /u/HanSeaulo
      [link] [comments]

    19. 🔗 r/reverseengineering I got so sick of Android taking forever to calculate folder sizes, I built a custom C++/Rust storage visualizer to bypass MTP rss
    20. 🔗 r/Yorkshire Then and Now rss
    21. 🔗 r/Yorkshire Well, that's a bit worrying - I hope the people who voted Reform are happy though. rss
    22. 🔗 r/reverseengineering CVE-2026-40369: Twelve Bytes to Escape the Browser Sandbox rss
    23. 🔗 r/york lovely green walk after the rain :) rss

      lovely green walk after the rain :) | humid and smells lovely and pretty quiet submitted by /u/whtmynm
      [link] [comments]
      ---|---

    24. 🔗 r/LocalLLaMA Heretic has been served a legal notice by Meta, Inc. rss

      To Whomsoever it May Concern,

      The individual behind the Heretic Free Software Project (henceforth called "Heretic", notwithstanding unrelated entities of the same name) has been served a notice by a legal services provider representing Meta Platforms, Inc. (henceforth called "Meta"), via the digital communications medium variously known as Internet Mail, Electronic Mail, or simply "email".

      The Heretic Project conducts its affairs in full compliance with applicable laws, regulations, rules, guidelines, opinions, and hunches. Following the commendable example set by the renowned heretic Galileo Galilei in 1616, we are recanting the relevant materials, namely derivatives of Meta's "Llama" Artificial Intelligence language models, and have removed the same from all model weight repositories controlled by the Heretic Project.

      We are grateful to Meta and its legal representatives for the opportunity to better align ourselves with the agenda of the global corporate oligarchy. The Llama model family ranks among the 200 best language models available today, trailing only 168 other models from 23 competitors on the LM Arena leaderboard, and Meta's concern for that asset naturally outweighs scientific freedom, as well as the legally and ethically dubious circumstances under which those models were created in the first place, regarding which, ironically, Meta is currently facing lawsuits and investigations in multiple jurisdictions around the world.

      On a completely unrelated note, the Heretic Project is diversifying its infrastructure, and now has an official Codeberg mirror athttps://codeberg.org/p-e-w/heretic, hosted in Germany. Additional mirrors are planned. We are also actively working to implement technological measures that will preserve access to models created with Heretic without depending on any specific service provider. We are proud to be part of this journey as we navigate an evolving global regulatory landscape, and work with stakeholders from diverse institutional backgrounds to ensure that Artificial Intelligence remains safe, culturally appropriate, and controlled by those who have always known what is best for humanity. If you, too, would like to share in this exciting adventure, please join us!

      Sincerely, p-e-w, Chief Heretic

      submitted by /u/-p-e-w-
      [link] [comments]

    25. 🔗 @binaryninja@infosec.exchange Working in a messy function? Sidekick 26.0 suggestion operations can repair mastodon

      Working in a messy function? Sidekick 26.0 suggestion operations can repair and annotate the code right at your cursor. Start with Suggest Repairs when the analysis substrate looks off. Then use Suggest Types, Suggest Names, or Suggest Comments to apply focused improvements. Each run writes directly to the Binary Ninja database and lands as a single undoable transaction you can audit in the Transaction Log. https://docs.sidekick.binary.ninja/guide/suggestions.html

    26. 🔗 sacha chua :: living an awesome life Emacs Chat 23: Emacs Chat with Raymond Zeitler rss

      I chatted with Raymond Zeitler about Emacs, life, automation, Org Mode, Diary, and Calendar. There were a couple of cuts to get rid of accidentally shown passwords, but it was a great glimpse into someone's system for managing things.

      View in the Internet Archive, watch or comment on YouTube, read the transcript online, download the transcript, download the audio, or email me.

      Related links:

      You can add the iCal for upcoming Emacs Chat episodes to your calendar. https://sachachua.com/topic/upcoming-emacs-chats.ics

      Find more Emacs Chats or join the fun: https://sachachua.com/emacs-chat

      Chapters:

      • 0:00 Opening
      • 0:58 Introduction
      • 1:59 I love automating workflows
      • 3:15 Org Mode switch
      • 4:08 diary-float
      • 6:48 Tip: Add links to task titles
      • 6:59 diary-float
      • 7:59 The difference between active timestamps and SCHEDULED
      • 10:06 Including other diary files
      • 11:26 cal-tex-cursor-week-iso, printing planner pages on index cards
      • 14:59 Holidays
      • 16:45 Making calendars for other people
      • 17:27 Keeping track of when things were done on the house
      • 18:49 My first customizations: backspace, buffers
      • 20:32 Windows and super key
      • 23:23 Org Mode class on Udemy, agenda custom commands
      • 25:00 toggling tags
      • 26:57 TODO states
      • 27:21 Functions for Org Agenda
      • 28:34 exeln, shellfn: executing things in DOS
      • 30:22 Middle mouse click
      • 31:59 Keybindings in other apps: Vivaldi
      • 34:09 M-s M-w, eww-search-words
      • 35:50 Saving links with org-store-link
      • 38:29 How I got into Emacs
      • 41:45 Maybe my own theme?
      • 42:26 Other editors? Always Emacs
      • 43:57 Package names
      • 45:54 What's next? Maybe auto maintenance
      • 48:31 Vibe-coding?
      • 50:53 Where people can find me
      • 52:02 Org Mode source blocks
      • 52:49 Slideshows?
      • 53:50 Emacs Chats?
      • 56:33 Other resources that would be nice to have

      ----

      Transcript

      Transcript

      0:00 Opening

      Sacha: I'll go live if that's okay with you. Yeah, good to go?

      Raymond: Okay.

      Sacha: All right, going live.

      Raymond: Let me just stop sharing right now.

      Sacha: Hi everyone, this is Emacs Chat. Emacs Chat 23. Today I'm here with Raymond Zeitler who has been using Emacs for a long time. Your EmacsWiki page says since 2000. And I know for sure that you've been commenting on my blog since about 2008, probably even earlier, I don't know. Everything gets lost in the mists of time. I would love to chat with you about the things that you've learned over the years, what you're still fiddling with, and the things in your configuration or workflow that aren't obvious to people who are reading configurations. It's just Emacs Lisp, but it doesn't show people what you do with Emacs that makes you stick with it over all this time.

      0:57 Introduction

      Sacha: So yes, but of course, we should do a bit of context setting. You have a lot of different hats. You're a historian, you're an electrical engineer. How would you describe yourself?

      Raymond: Well, right now, I would say I'm an electrical engineer, but I spend most of my time, instead of designing stuff, I work on the workflow for the design. And I'm writing scripts, you know, to automate various parts of the design. Now, I just want to pause here because I hear like a 10-second delay.

      Sacha: Yes. Oh, you have the video open in another tab. Yeah, so the 10-second delay is there in case we need to panic, you know, in case you accidentally flash something you'd rather keep private. But it can be quite disconcerting to hear yourself talking at the same time that you're trying to say something.

      Raymond: Okay, I think I fixed that. Okay.

      1:57 I love automating workflows

      Raymond: Yes, so I'm an electrical engineer, but I also love to do scripting. Automating any kind of workflow is my favorite thing to do, and I would just love to go around and help people to find ways to automate the workflow. Basically, I was doing that ETL, you know, extract, transform, and load many years ago, I mean, dozens of years ago, and showing people how to do that too for them, and you know, when they look at me and they say, oh my god, thank you so much, I'm so glad... You know, it used to take me hours to do this. Automating a design flow is a good idea once you have all your script in place, that serves as your documentation. If there is a problem with the design, you can go back to the script and update it. So the next time, you're not going to have that problem, hopefully.

      Sacha: You've been learning Python recently, too, right? I can imagine that helps a lot with automation. Are you taking advantage of things like Org Mode as well for the things that you can partially automate?

      Raymond: Absolutely.

      Sacha: Tell us about that.

      Raymond: Oh, I figured that we should save for the last, because it could take the whole thing.

      3:20 Org Mode switch

      Raymond: But yes, I started using Org Mode after you jumped ship from Planner Mode. I know that you and John Wiegley were big on that, and I used to use Planner. And I delayed switching to Org Mode, but eventually I latched onto it really well. So one thing I used Org Mode for at home was for bill pay, you know, because you can schedule things recurring. So you got your mortgage, you can recur, you know, and the recurrence is well thought out. You know, you could have it scheduled exactly 30 days away or one month.

      4:05 diary-float

      Raymond: What I found recently, though, is you can use the diary: diary-float and diary-warning. Those functions can be used in Org Mode in place of the schedule. So that's really cool. I have a lot of meetings that occur, let's say, the second Wednesday of the month and stuff. There's really no way to easily do that out of the box with Org Mode. So that's fun to do. Let's see. I'm going to share my Org now, if you want.

      Sacha: Sure, go ahead. If that's okay with you.

      Raymond: Sure. Well, I deleted some of the stuff. You know, not all the files are there.

      Sacha: Thank you. It's always interesting to see, because a lot of times, when we're trying to demonstrate Org to people, we're like, okay, here's a small example. But when you see it in the context of someone's actual life, with the tons of reminders they have... Your agenda is very full, for example. I'm not the only one with things that are scheduled for over 100 days.

      Raymond: And actually, your talk isn't on here, so that's kind of strange. So, for example, I was talking about bills, right? I don't know if you can see that.

      Sacha: Yeah, I can see that.

      Raymond: It's not the same.

      Sacha: Yeah, I see. And you're using the logbook. You can keep notes in a task. You can put all the things there.

      Raymond: Yeah. So, you know, something like a mortgage or your utility, that's pretty standard. That's just +1m, you know, for the recurrence. Let's see. Yeah.

      Sacha: Yeah. So basically, you have the regular or repeat things, plus one month or plus one week for the things that can be expressed that way. But you also use diary-float for the things that are second Wednesday of the month.

      Raymond: Yes. So let me try a different Org file for that. Oh, everyone, I have to do this too.

      Sacha: Oh yeah, you can set a global font default scale thingy. I don't remember exactly how to do that, but... [cut due to passwords] I'll move your screen off the thing first while you talk, and then I'll move it back when you're ready. So we had a bit of a "Oh no, he's showing me like meeting passwords online." So if you saw that, which probably you didn't because 10 second delay, just ignore it. And then we'll go back and scrub things later. Let me know when it's safe to look again.

      Raymond: Okay, here we go. So here's a meeting.

      Sacha: Okay, okay. We got this. We got this.

      6:48 Tip: Add links to task titles

      Sacha: I also want to point out, I love how you're using links in the task title. You know, that did not occur to me to have the links right there so it's easy to get to from just the overview.

      6:59 diary-float

      Raymond: [cut due to passwords] ...which works really in a diary file.

      Sacha: All right. Let me move it back so people can see.

      Raymond: It works. This is great because it works in Org Mode too. If anyone doesn't know it, this is the month. And true just means that this meeting occurs every month. And I believe this means Monday.

      Sacha: No, Tuesday. Although... Your comment says Tuesday, yeah.

      Raymond: Yeah, Tuesday. So that's the second day of the week, with Sunday being zero. And then this is the week number, the second week. Second Tuesday of every month. And then you could just put the time there as well.

      Sacha: Yeah, yeah. I have actually personally never used this syntax, but I see people use it for things like Emacs meetups and they're like, okay, yeah, we meet every second Wednesday or whatever, but here's the thing that you can just put into your Org agenda and it'll work.

      7:59 The difference between active timestamps and SCHEDULED

      Raymond: But the problem with this, though, is that it doesn't obey the, you know, if you mark it done, it'll be marked done. So it won't show up again. So I'm actually starting to put these in my actual diary because you know, I don't really need to mark the meeting done.

      Sacha: You know, you can take out, just remove the scheduled keyword. You can have the active timestamp and it will show up on your calendar, but it doesn't have to be marked as done. And it'll just keep showing up whenever you need to. So this is the distinction between scheduled, which is actually not like a scheduled appointment, it's like a task that you're scheduling for a specific day, versus just using an active timestamp, which is the stuff within the angle brackets. It can be anywhere in your entry. It doesn't have to be the second line after your heading. Then it will show up in your agenda, but it's not going to keep showing up like the next day. It's not going to say it's overdue. It's just going to be for that day.

      Raymond: Okay. Yeah. There was somebody who tried to solve the problem, though. And they came up with next-spec-day, a function, but it's not possible to compile that with the modern Emacs. So I'm just happy with the way I have it now, though. Yeah. But when I first started using Emacs, the diary and the calendar were one of the first non-text editing uses that I had for it. And I'm really getting back into diary. I hope I don't show anything else.

      Sacha: Tell you what, I'm going to move your window away. Okay. And then you can do your thing and then I can move it back when you're comfy.

      Raymond: Okay.

      Sacha: Yeah, I know how to do this now. This is good. I have two monitors so I can control.

      Raymond: Where's my screen? Oh boy. So what I'm showing here

      Sacha: I put it back so people can see.

      10:06 Including other diary files

      image from video 00:10:09.867Raymond: My main diary is just diary. What I'm doing is I'm using includes, because I like to break it up into various files that I can comment them out if I don't want something so busy. The reason I'm doing that is because I was tooling around in calendar in the calendar functions and there's actually cal-tex-cursor functions that so when you go into calendar, for example... That's also small, right?

      Sacha: It's okay. Everyone has seen calendar. Well, most people have seen calendar at this point, so we know what the calendar is. Okay. What are we showing? What are we seeing?

      Raymond: So if I wanted to, let's say for next week, what I could do is create a, let's see, cursor... I forgot the command.

      Sacha: I'm surprised you don't have completion set up.

      Raymond: Yes.

      11:26 cal-tex-cursor-week-iso, printing planner pages on index cards

      image from video 00:14:04.867Raymond: Okay, so this is what I like to do. So this function, cal-tex-cursor-week-iso

      Sacha: It's okay. It's the curse of the live demo.

      Raymond: All right, I'll create mine.

      Sacha: Change cursor shape, huh...

      Raymond: All right, so for some reason that's not working. But what you end up doing is you can create a weekly planner, kind of like a page in a date book, and it will show everything from your diary if you want...

      Sacha: In a nice printed format or like a nice visual format.

      Raymond: Yeah, I have to... How do I get that? I don't know why it's not working here. So...

      Sacha: Certainly the layouts of things, the layouts of date planners is something that I sometimes envy about my paper planner days. Like you could see things. I also wanted to point out something that I hadn't considered. You were using diary for diary entries, it looks like also not just appointments and reminders, but also this is what happened that day. Ooh, that is pretty. Do you actually print these out or like read them on an e-reader or just look at them?

      Raymond: I did. Yeah, I found out that my printer can print double-sided on index cards.

      Sacha: Oh yeah, double-sided.

      Raymond: So I actually created my own little book here. So what's nice about this is, you know, when you go into a store to look for some planner, many of them, like half of them, don't even have the lunar phases. And let's see if this has a lunar phase.

      Sacha: So printing planner pages on index cards. Very cool.

      Raymond: So you've got your full moon there. And because I was very active in photography, nature photography in particular, and doing landscapes and stuff. So it's really helpful to know when the full moon is, more so sunrise and sunset, which I have here. Because you get, especially in the winter, you get great shots at around sunset. Yeah, so that was something that I was really interested in.

      Sacha: Oh, it's so cool. It's something I'd never considered using Emacs to generate your custom, you know, calendar planner thing that you then take offline because you're out there in the field. You're taking pictures. You don't want to open your laptop or look at your phone or whatever. It's just your index card. Nice.

      Raymond: And there's some astrology in there.

      Sacha: [cut due to password] We're back to streaming. Yeah, birthdays. Gotcha.

      Raymond: Birthdays. And then, so I'll just... I wonder if I could do this safely.

      Sacha: Give me a heads up, I'll move the screen off and then I can move it back when you give me the heads up again.

      Raymond: I'm pretty sure my .emacs is pretty... If anyone wants to see this and download it, it's on emacswiki.org. Just look for the page RaymondZeitler.

      Sacha: Yeah, it's in the related links now for the blog post. Gotcha.

      14:59 Holidays

      image from video 00:15:07.533Raymond: So what I was looking for here is my list of holidays. So what you could do with... This is basically a calendar thing, but you can set up all your holidays. For example, Towel Day is coming up. It will be Monday for you Hitchhiker's Guide geeks. You've got your Star Wars Day, you've got Pi Day, which you won't find on a regular calendar, of course. And that's an atrocious thing here.

      Sacha: I was just admiring that. It's a very complicated expression, but you can do it.

      Raymond: You can, right. So that's what I came up for Election Day. And if anyone's a Seinfeld fan, you've got your Festivus. So that's a neat thing. Yeah, and don't worry about the longitude-latitude. Everyone knows where I am.

      Sacha: [another password hiccup] ... dealing with the panic, it's good. It's good practice. And also everyone is very nice, so afterwards, I'll just probably make this unlisted and then see if there's anything that actually needs scrubbing. But probably it's all good. Yes, so you've got calendar, you've got holidays, you print them out. Are there other ways that you use Emacs, kind of in this online-offline way? Are there any other things that you like to print out, or do you do the rest of the things in your computer?

      Raymond: It's all on computer, yeah. So the only thing that's printed out is the planner datebook. By planner, I mean this thing. Okay. So...

      16:45 Making calendars for other people

      Raymond: Oh, yeah. Anyway, getting back to why I break up my diary into multiple files is eventually I may want to create these things for other people, right? Print out a date book for my wife, for example. So she's going to want to know when Towel Day is, right? Well, that's a different thing, but she's not going to want a lot of other things.

      Sacha: Yeah, it's very customizable. You can just say, okay, include these, you know, modules in the calendar. Yeah. Yeah. Yeah. Cool.

      Raymond: So, and then getting back to the diary again, yes.

      Sacha: I can move this. We're safe. Yeah. We're safe.

      Raymond: Okay.

      17:27 Keeping track of when things were done on the house

      Raymond: So one thing I like to do is keep track of when things were done on the house.

      Sacha: You've got a license plate?

      Raymond: No, there's really nothing bad here. For example, if you want to know when you have to register your car, you can put that in there and it'll show up on your little planner. So I thought that was pretty neat.

      Sacha: And I like that you can say a number of years ago, so it automatically keeps track of that. You can wish somebody a specific number of years, happy birthday, instead of just a generic happy birthday. You don't have to do math. Nice, nice. Diary, I think it's underutilized.

      Raymond: It is, yeah. And what I like about Emacs is that the people who are, you know, creating functions and adding to it use it and have really good design ideas. So, oh, this is, let's go back to something else here. Okay, so back to my .Emacs. Let's see. Let me just... In the interim, before we come up with something else to talk about, I'll just talk about some of the modifications.

      18:49 My first customizations: backspace, buffers

      Raymond: And by the way, when I first started using Emacs, I decided not to do anything. I'm a Windows user, so naturally you might want to use CUA mode, but I never did that. And the first customization I did was... For some reason the backspace key was doing the delete function. I think that was Emacs 19. So that was the one thing I changed. And then the other thing I changed is very soon I had multiple buffers. Like if you're using Emacs for any amount of time, even like 10 minutes, you'll have multiple buffers. And I was using a tabbed web browser at the time, so it's easy. To switch tabs by just pressing the Ctrl-Tab key or Shift-Ctrl-Tab key to switch between tabs. And I figured, let me do that with the buffers. And so that's somewhere in here.

      Sacha: Oh yeah, there's a control tab, control shift tab, next buffer, and previous buffer.

      Raymond: Yeah, so that was one of the first things besides the delete key modification that I did. But I'm also now, since I have multiple windows open as well, I'm using the windows... Next and Windows Prior. Next is, I think, the page down key, I believe. And Prior is the page up key.

      20:33 Windows and super key

      image from video 00:21:50.033Raymond: And how you can get to use the Windows key is, I got that from Xah Lee's website. And where is that now?

      Sacha: Yeah, you make it the super key. I use Xmodmap but other people can use different things depending on their setup. Although lately I've been experimenting with using Kanata so that my modifiers are one-shot modifiers. I can tap the super key and then I can let go of it and then I can press whatever key is next so I don't have to hold them at the same time. Oh hey look at that it's actually an option! I didn't even know that it was. You can change it right from Emacs. Nice.

      Raymond: Yeah, so this is what I set up. I lifted this from the website. There's the URL. And if you're curious, you can go to that Emacs wiki website and see this. The only thing that I wasn't able to get this to work until I added this statement, which I found in Stack Overflow or something like that.

      Sacha: That is interesting. Yeah. All right. So does it mean that Emacs is entirely responsible for the Windows key? You don't do anything else with it outside Emacs?

      Raymond: Right. So yes, it intercepts the Windows key before Windows does somehow magically, which can be kind of frustrating because sometimes I do want to open the start menu from within Emacs and I'm pressing it and saying, why isn't this working?

      Sacha: This is where you just get used to having your own launchers within Emacs.

      Raymond: Yeah, yeah. Well, you know that you're a good Emacs user if you start using the Emacs key bindings in other programs. You know, how many times I've used C-y to paste something in, you know, my web browser. Oh, boy.

      Sacha: Yeah, it's not the C-y that gets me. It's the C-w because that closes your browser down.

      Raymond: Yeah, oh yes, that can be dangerous. But actually C-y can be bad too, because it's like the redo function in a lot of programs. So if you've undone something, and then you redo it, you can get very confused very quickly. Anyway, so this is a neat thing to do. Some people might want to try that.

      Sacha: Yeah, for sure. Having a super key means you can then go on and do other things with it. You can have all these key bindings because nothing binds to the super key. So you can have all the single character key bindings you like.

      Raymond: Exactly, yeah.

      23:23 Org Mode class on Udemy, agenda custom commands

      Raymond: So I was taking, believe it or not, there's an Org Mode class on Udemy. And it's... Rainer König did it. I don't know if I pronounced his name right. But he inspired me to do custom commands. So for example, if I want to look at all my bills for the week, I would just press the b w.

      Sacha: Do you want me to move the window?

      Raymond: I don't know. Is there anything dangerous here? I'm not going to do it, but I'm just trying to point out my thing.

      Sacha: Yeah, yeah, yeah. Different agendas for slicing and dicing your Org data in different ways.

      Raymond: Yeah, yeah. Remember you pointed out earlier that my agenda was jam-packed with stuff. The way I manage that is I came up with a way to easily apply the today tag to all those things. And I came up with some functions somewhere which I bind to C-M-S-t. Let's see if I can find it.

      Sacha: That is interesting. So you're using a tag for the things you want to do today.

      Raymond: Yes.

      Sacha: Versus scheduling them, because if you schedule them for today, then they will still show up tomorrow.

      Raymond: Well, yes, that's true.

      24:53 Toggling tags

      image from video 00:25:00.400Raymond: So yes, so these are the two functions I came up with. Oh, you're toggling. What's that?

      Sacha: You toggle that. You have something that lets you add or remove a tag.

      Raymond: Yes, yes. Yes, exactly. And maybe I could demonstrate that without displaying too much stuff here. Okay, so here, so in the agenda, I'm a little bit worried about updating. See, okay, so I don't know if you can see it, but I just invoked it and then down here in a little.

      Sacha: Oh, yeah.

      Raymond: It says you have to press s r to save and refresh the screen. And the reason why I didn't automatically refresh and save files is because I think that's a dangerous thing.

      Sacha: Yeah, because you've been removing things. Okay, okay. But the idea there is you can turn the tag on and off from your agenda directly, which is interesting. Yeah, it's there. And you have a different view that shows you just the stuff you're focusing on for today.

      Raymond: And I have that bound to "C-c a .". This is going to be small. So there on the top are my things for today.

      Sacha: Yeah, so different ways of prioritizing. So your agenda is the stuff that you want to keep on your radar. And the today stuff is the stuff like, okay, you got some time. This is what you're actually going to work on.

      Raymond: Right, so.

      Sacha: Yeah, there are different ways to approach it. Some people have a much more minimalist, okay, if it's on the agenda, it's because I want to do it that day. And then they have a different view showing them the stuff that they want to keep on their radar. But the nice thing about Org Mode is that it accommodates all these different ways of working.

      Raymond: Yeah.

      26:56 TODO states

      Raymond: And getting back to the Rainer's class on Org Mode, you know, it's not like the way Carsten Dominik set it up with the default tags of to-dos. What is it? To do, started, waiting. He does something a little bit different, but it works for him. So I think that's kind of cool too.

      27:21 Functions for Org Agenda

      image from video 00:28:06.200Raymond: And by the way, you need two functions. You need one that works in an Org file and another one in the agenda because they don't work the same way.

      Sacha: I have some functions that act that way, and I usually end up checking if the major mode is derived from the Org agenda. And then there's an with Org agenda. There's a macro that lets you run the code in the context of the task. So if you needed to kind of switch those together, it's possible. But you already have something that works, so it's fine.

      Raymond: Yeah, and it's easy because, you know, I copied this from some existing function like, you know, when you press Z, for example, it creates a note. So you can leverage that code and write your own code instead.

      Sacha: It's called org-agenda-with-point-at-orig-entry. It does the thing. You know, this part that you're doing at the moment with manually finding the marker and jumping to it and all that stuff. In the future, if you find yourself writing one of these agenda functions.

      Raymond: Yeah.

      28:34 exeln, shellfn: executing things in DOS

      image from video 00:29:15.767Raymond: So what else do I have here? Oh, so sometimes I just like to execute. So I do a lot of batch files or scripts, and I'll just do C-c x to send that particular line to the DOS prompt just to execute it.

      Sacha: Oh, execute line. Okay, so that's what EXELN means. That's cool. So it's basically you can evaluate things without having to switch and paste and switch and paste and all that stuff.

      Raymond: Yes. And just to demonstrate, if I wanted to do the dir command.

      Sacha: It's like an eval-last-sexp, but for DOS. Yeah, so this is... And hats off to you for, like, batch scripting with DOS. I'm very spoiled with my bash and zsh, but you're in Windows and you're making it work.

      Raymond: Yeah. Which is like a handicap, isn't it? And then I can just send the whole buffer to the command prompt, which I think now there's a function that don't really does that, you know, out of the box. Maybe not. And then if I wanted to insert the date, you know, just some easy stuff like that.

      Sacha: Yeah. Yeah. Yeah. I recently added this insert date and time thing as an abbrev, So I just type it and that frees up more of my key bindings for other things. Yeah. But it's surprising. You always find yourself wanting to refer to the time and that way you don't have to look.

      30:27 Middle mouse click

      Raymond: I don't remember how Emacs treated the scroll wheel or the middle mouse button, but I found that this was very useful. I believe what you can do is click the mouse. Let's see what happens. It pasted what I had there.

      Sacha: Yeah, yeah. I think middle is usually paste, but it sounds like you've got it. Oh, okay. So, so you, you can scroll if you're dragging, but you can also click, just middle click to paste. Yes.

      Raymond: Yeah. So it's fun. There are some things that down-mouse-2 does, and I'm not able to do that now. I think, for example, spell checking, if you want to correct a word at point, I think the command is to do the mouse-2 button, but I no longer can do that. But that's okay.

      Sacha: Over 20 plus years of Emacs, I'm sure parts of your workflow have come in and out of viability as things change. I feel like Emacs does make more of an effort to keep things pretty stable for the most part, hence all the contortions that new Emacs development has to do in order to keep things working but also adapt to the times.

      31:59 Keybindings in other apps: Vivaldi

      Raymond: I think I mentioned before how I co-opted the ability to switch tabs. I got the idea from the web browser and incorporated it into Emacs. But I've started to do the opposite. So if you do C-k, which deletes anything from point to the end of the line...

      Sacha: Yeah, you've up-cased a bunch of things.

      Raymond: Yes, I am going to have to close this because I'm really scared now.

      Sacha: revert-buffer, maybe? Or undo?

      Raymond: Yes, I'm trying to do undo. That's what I meant to do. We're back. There we go. So, yeah, because I did C-x C-u instead of... whatever. So what I've decided to do then is if you're using a web browser and you're opening new tabs, which I do, so I am able to bind a key and I'm using control shift K to close all the tabs to the right of the current tab. So that's sort of like borrowing an Emacs keystroke and using it in my browser. [Sacha] How are you doing that? Are you using AutoHotkey or does Vivaldi let you do that automatically? Yes, it's Vivaldi. So if I go into the Settings - Keyboard shortcuts... So actually, I don't know how to increase the size of this.

      Sacha: That's fine. We can see it. People can go open up Vivaldi if they're curious. But the idea there is you get used to these conveniences or these ideas from Emacs. And now you're like, OK, I want to make my other apps feel at least a little bit this way.

      Raymond: Yeah. Yeah, so.

      Sacha: Yeah?

      Raymond: And I still keep learning stuff about Emacs.

      34:10 M-s M-w, eww-search-words

      Raymond: Believe it or not, I didn't know that you could select a region and then do an internet search on it, right?

      Sacha: Today I am learning. How do you select a region and do an internet search on it?

      Raymond: So M-s M-w (Alt s and Alt w) is loading in EWW. And this is what Atomic Chrome Start Server is. And that's actually a Chrome extension that you can... Okay, so if I go to some... Okay, okay.

      Sacha: It is EWW Search Words. Okay, good. Cool.

      Raymond: So if I go to your website now and I want to type a comment, which I think I can do, right?

      Sacha: Oh, I switched to just doing comments through email. Because Disqus was getting all ads-y and annoying and tracking JavaScript and stuff. So now it's like every post has an email me if you have thoughts. Sometimes it has a Mastodon link if I've remembered to post it to Mastodon beforehand.

      Raymond: So... What I'm trying to do is find a window that I can type into.

      Sacha: There's a search box up there to the top. But basically, you're going to show us how you can take stuff from the browser and put it into Emacs for easier editing.

      Raymond: Yes.

      Sacha: All right.

      35:50 Saving links with Org-store-link

      Sacha: Charlie has a question. So Charlie asks, do you use Org Mode protocol at all for browser to Emacs interaction? If so, were there any complications to set it up on Windows?

      Raymond: I don't.

      Sacha: Is there like bookmarklets for capturing or doing things?

      Raymond: Yeah. So, oh yeah. So capture is just a wonderful tool. Okay. So I'm not sure I'm I can answer the question, but what I would say is, let's say if I wanted to... Alright, let's try this. This might not be too bad. So let's say I wanted to create a link to some ad. So no, I don't use EWW to capture the link. But I just learned out how you can do it. But if I wanted to go to another, all right, well, this is a silly example. But if I were to do just a help, Let's say, if I just wanted to find a place in the info, in info, if I do C-c-L, it'll create a link for me, and then if I wanted to here, put that link. So it's already there in the mode line. Yeah. And then I can say info. And I can have that there. So this will go, and I'll close this help.

      Sacha: Okay.

      Raymond: And then if I click this, it'll open back up.

      Sacha: So you use the org-store-link a lot. Do you use org-capture as well?

      Raymond: Yes.

      Sacha: I saw your keyboard, your key binding for it. But you don't necessarily have bookmarks or extensions in Vivaldi to do the capturing with the context from your browser. You'll just copy and paste the link manually.

      Raymond: Exactly. That sounds like fun, though. [Sacha] That's a nice thing about Emacs. There's always one more thing to tweak, one more thing to learn. You've been tweaking your Emacs for a long time, and yet there's still more to do, to fiddle with and explore.

      38:24 How I got into Emacs

      Raymond: Yeah if you can think way, way, way, back, how did you get into Emacs in the first place? Oh, okay. So, you know, I was thinking about how my career, like the first half of my career, I've been using an IBM PC and MS-DOS, and it was all command line based. And as well, those machines were quite slow. So what we would often do is Write batch files and basically have things happen while we were away. Go and get a cup of coffee or leave for the day and come back the next day and hope it was done. I was working with text files for 20 years. I had a really good text editor. It was called Brief. And it had a lot of nice features. It was, of course... You could record and playback keystroke macros, right? Sounds familiar. It also had a scripting language. Of course, it had undo. But the nice thing I really liked about it is that you could do column editing, right? So you could delete columns of text, or add columns, or cut and paste and move them around, and stuff like that. Because if you're using a lot of csv files, it's really columnar in nature. I guess I can't pronounce that word. But when I moved to Windows, that text editor didn't work so well. It wasn't very happy in a multitasking environment And so I started looking around for stuff. I did find an editor actually that it had the same key bindings as brief, but it had one problem. And if you open, for example, if you opened a binary file, that had a null character, it would crash. So I don't know if that bothered me. So then I started looking around for another one. And then I guess it was in Usenet that somebody said, why don't you try Emacs? As if I heard of it and decided not to. So I did, and I really liked it. So maybe I'm going to go back and search for that conversation and thank the person. That'd be something I could put on my Org agenda.

      41:05 Did it click for you right away or is it something that grew on you over time?

      Sacha: Did it click for you right away or is it something that grew on you over time? I started right away with the tutorial And I said, ah, this is crazy to have to do. And I don't even know how to navigate with the original key bindings. So I expected to be able to use the arrow keys. And I don't think it was set up that way. But then I stuck with it. And like I said, I didn't adopt the CUA binding or anything like that. Yeah, and I just grew to learn it.

      41:45 Maybe my own theme?

      Sacha: I had thought about coming up with a theme for it, a different color theme. And I tried that for a while, but then when I would use a different mode, it just looked terrible. So I'm keeping the same mode now. What I hear more and more people are doing is they'll take something like modus themes and then they can change the colors of it without necessarily having to make all the mappings of, okay, this thing in this mode, you should use this kind of face. So if you still want to have your customized colors, that might be an approach to consider.

      Raymond: Yeah. Going to stop sharing for a second.

      Sacha: Sure.

      42:26 Other editors? Always Emacs

      Sacha: Did you ever flirt with other editors again after getting into Emacs? Or has it basically been mostly Emacs for the last while?

      Raymond: Oh my gosh, how could you even say such a thing? No, it never occurred to me to do that. But some of the guys were using Notepad++, which, you know, mine is the only computer with Emacs. But if I go to another computer, they have No pad++. I would be using that. And it's nice. It has a tabbed interface so you can switch between files very easily. But I've never considered switching to something else. And even, you know, I took a vibe coding class. So they have you use VS code or anti-gravity or something like that. And I'm thinking, wouldn't it be nice if I could You know, switch to my Emacs editor and do the typing there and then switch back to anti-gravity. I don't know. But I hear some people are vibe coding with Emacs, so I might look into that.

      Sacha: Yeah, there's been an explosion of different ways that people are interacting with these systems. And of course, people are also totally welcome to keep using Emacs without it. But if people are curious, as the usual Emacs way of doing things, there are more than a handful of packages all with their different workflows. You'll find something that fits.

      Raymond: Yeah.

      43:57 Package names

      Raymond: I wanted to ask you, speaking about EWW, do people pronounce that ew? The thing about a lot of these packages, they have these wonderfully self-effacing names. There's one called Dismal. That's the acronym for it. And it's Dismode Ain't Lotus. It's basically a spreadsheet. So I was just curious about that.

      Sacha: I think we spend so much of our time reading rather than you know hearing or talking to people so then it's only in the middle of a conversation of a very rare conversation one can have about Emacs either on stream or in person when you're like okay is it Magit or magic you know do I say ew but that that seems so rude ew ew ew the Emacs web thing yeah sure

      Raymond: And that's pretty new, isn't it? That mode? Because I remember doing W3 and then WW3.

      Sacha: There was a w3m and elinks. I remember that too.

      Raymond: Links, I had a version of that on my, you know, like a DOS version of it, believe it or not. But it was very utilitarian, you know.

      Sacha: Yeah, yeah. Sometimes you just want to browse the web or get the information without all the clutter that goes on and, you know, just like all the layouts and the cookie pop ups and whatever. Just get me the stuff. Yeah. Yeah.

      Raymond: Well, I do think I'm going to be incorporating EWW more as I think it was Charles who said, you know, creating a link using C-c l to create that link and it basically copies what's around it. I do see the usefulness of that.

      45:54 What's next? Maybe auto maintenance

      Sacha: Yeah, yeah, because org-capture and org-store-link can just pick up the context for you and then it's so easy to go back to things afterwards. I've also heard good things about org-remark. So that's something that's on my to-do list as well. There are always all these things to be curious about and learn. What are you looking forward to exploring? So there's EWW. What's next for you in this Emacs journey?

      Raymond: Oh boy. I was thinking of using Org as a car maintenance tool. And as you know, Org is great for scheduling and projecting out things. The thing about auto maintenance, though, is a lot of times something has to be done at a certain mileage. Like every 5,000 miles, you have to rotate the tires, for example. If you're driving regularly, like maybe 100 miles a week, you could say, oh, that's going to happen in a year. But if you're driving as erratic, then you'll probably want a way to download your mileage from the car. Cars are basically just computers, aren't they? I mean, they're computers that we drive around, or sometimes they drive us around, frighteningly so. I'm sure someone is thinking about or has already come up with a link between a desktop computer and a car. Okay, I'm not seeing. Well, maybe. Maybe that's giving somebody an idea there. But maybe Lori Wired or something can come up with that.

      Sacha: And even, you know, even a manually scheduled reminder, hey, you know, just write down what your odometer says, and then some kind of logic that takes a look at that reading and says, okay, it's past this threshold, schedule this task. And have that done semi-automatically. Sounds really interesting. Because then you could have all sorts of things to say, all right, I have this manually scheduled recurring task to manually log something. But then it kicks off these processes that then surface all these other tasks that I should do. Could be fun. How would you do that? That sounds really cool.

      Raymond: So I don't know if I'll ever do that because I'm pretty lax with my car maintenance anyway.

      Sacha: It could be like every six months check to see whether, you know, it's time.

      Raymond: Yeah, yeah.

      48:31 Vibe-coding?

      Raymond: But I probably would try the vibe coding with Emacs eventually. You know, every so often I see it on Reddit or Stack Overflow. You know, somebody is trying this package or that package. Yeah, it might be worth trying.

      Sacha: What are the challenges that people sometimes find when it comes to vibe-coded stuff? It's great for the initial prototype, but once you start digging into it, it's hard to modify it yourself, so then you become dependent on it. And then, of course, the large language model can't quite get some things. How are you finding this so far? I mean, this is very early in your journey. I think you're still experimenting with it. But do you find that it's working out for you? How is it with Emacs?

      Raymond: It was just like you said, like it just can't get it. Like I told it, well, fix this because I don't like that format, and then it will do it differently. And then, no, but it changed something else that it was doing correctly, and I just couldn't get it to work. And the other thing is, so the course that I was taking, they wanted... Next.js And I just can't describe it. So I was trying to back up my computer one day after installing it, and it's doing on and on in like 20 minutes. Just because there's so many files and it's just crazy. So I thought it was fun to try it, but I think I'll just stick with what I know best.

      Sacha: In a way, I'm delighted. We've come full circle. Emacs is now the lightweight solution. It is a lot of fun. Emacs, less AI. AI is not quite at the fun point yet, I think. But I'm glad that there's still more to tinker with and explore. I have about eight minutes before the kiddo runs out and starts lunch break.

      50:52 Where people can find me

      Sacha: I'm guessing if people want to keep up with your adventures they can check your EmacsWiki page for updates. You have some code shared on Codeberg and you mentioned your LinkedIn profile which is in my thing, but how can people keep up with what you're learning?

      Raymond: I'm surprised that people would want to.

      Sacha: I want to. I do not have an auto to maintain, but I have a cargo bike that I've got to keep up with also. So I'm very interested in these mileage-based task reminders, if you work something out.

      Raymond: Yeah, I'm not pretty good about publishing stuff. I don't know. That's a good question. I'll come up with something. Maybe I'll be more diligent pushing my updates to the Lisp Codeberg repository. I don't know.

      Sacha: Sometimes it just takes somebody saying, your stuff is interesting. I'm telling you, your stuff is interesting.

      Raymond: Okay. Thank you so much.

      52:02 Org Mode source blocks

      Raymond: By the way, I am using source code blocks now. So like we talked earlier about executing the batch file, I can now put a little batch file inside a source code and execute it that way.

      Sacha: You have those links in your heading and in your Org task bodies. I've been enjoying using Elisp and Shell link types so that I can put in those partially automatable things. In my workflows, because sometimes you're like, I do have to do it manually. I just can't write a function to do everything. But at least they can document it step by step and say, okay, do this, run this code block, you know, just do all that stuff.

      52:49 Slideshows?

      Raymond: And the other thing I'd like to try to do is I know some people can create slideshows with Emacs. And so that looks like it would be worth pursuing. I'd like to try that.

      Sacha: Oh, yeah. Are you thinking of it for the history stuff that you're involved with or other things that you're teaching?

      Raymond: So I'm starting to present my photography as a slideshow. And I thought I would try that. And now I see that Emacs can support images. I don't know how it would work as an export, but I look into that now.

      Sacha: Yeah. And even, you know, the couple of times that I've wanted to use Emacs to create, you know, even just a PDF of these pictures, just being able to automate that instead of pasting and resizing, it's like, ugh, don't do that that way, just have the computer do it for you, and Emacs is great for it.

      53:50 Emacs Chats?

      Sacha: I've been meaning to ask you, what is your viewership with these Emacs chats?

      Raymond: Are you starting to see a lot of traction with that?

      Sacha: I have no idea. My goal here is just to get stuff out of interesting people's heads. Interesting stuff out of, yes, interesting people's heads. And I think mainly I'm using it as a way to keep improving my transcription workflow. I guess I like to train everything into text afterwards. That way it's searchable. But it's been really fun getting a sense of how people are using it because we all have such different workflows. And as I was saying in the beginning, you don't see that when you're looking at someone's config. You're like, okay, I see that the code that sets the key bindings, but how does it work together? And then seeing your Org file, I'm like, Oh yeah, why am I not putting the links right there so that I can just get to them from the agenda? Diary can do that? All that stuff is really, really interesting. It's been great revisiting it after such a long break, taking care of the kiddo. Now the kiddo is slightly more independent and even has moments where she's like, bye mom, I don't need any help. Like, okay, yes, I'm just going to do my Emacs thing.

      Raymond: Asking for the car keys yet or not?

      Sacha: No, no, no. Also no car, but someday she's going to, you know, and she actually already likes to bike to the park on her own. So she's 10. She's not at the car level yet, but definitely in the biking and walking by herself, she's keen on that. Gradually, independence for both of us and the ability to explore things. I'm really liking these Emacs chats. With you and Shay Arison, who's also been a long-time reader, it's like this continuation of a conversation we've been having over decades now. I can't wait to see where this goes next. I've picked up a lot that I, again, would not have really understood just by looking at your EmacsWiki page and I hope that other people watching can also get a sense of, like, this is what it looks like in use. Sometimes people think oh, I need to make a video that's going to be a snazzy demonstration of this really technical setup, but sometimes it's just the little things that make your life better.

      Raymond: Well, I really want to thank you for doing this, not just this Emacs chat, but just having your web page and organizing all the Emacs information. It's just been a wonderful resource.

      Sacha: Thank you. In the last two minutes I have before I get like, "mom!",

      56:39 Other resources that would be nice to have

      Sacha: what kind of resources would you like to see going forward? What would make your learning even better?

      Raymond: Well, you know, it's just, you know, just saying something that you did... For example, when you were... So when I visited your site and you showed how you could show the time in someone's native time zone, right? Which is a wonderful thing, right? But I had my own time thing that I was wondering. Like, I wanted to know if someone had a date, like May 21, what day of the week is that? I know that I can't go on a meeting on Tuesday. I'm trippable. So I figured out a way you could select it and send it to a custom search engine that searches on DuckDuckGo AI and says, what day of the week is this? And just include the date. And it tells you.

      Sacha: Yeah, yeah. It's nice to be able to modify things, not just in Emacs, but in browsers or anything else. And my personal approach for that date thing would be like, okay, I'm just going to do an insert date, like a C-c C-! in Org. Because if I type in, you know, the part of the date that will get it to show up, it will include the day of the week. But that only works in Emacs, of course. Everything should be in Emacs. So yeah, I guess one of these little workflows, oh, I just figured out something, sort of posts can ripple out into other people imagining other things that they can do. And on that note, I'm going to wrap this up very nicely. I will try to mark this as unlisted so I can see if I accidentally let any of your passwords slip past my 10-second panic window. You're okay with your coordinates. That's okay. Yeah. All right. Thank you so much, Ray.

      Raymond: Oh, thank you.

      Sacha: And I look forward to more conversations.

      Raymond: Yeah.

      Sacha: All right. Bye.

      Raymond: Bye bye.

      Chat

      • sachactube: ​​This is for https://sachachua.com/blog/2026/05/em
      • charliemcmackin4859: ​:D
      • charliemcmackin4859: ​do you use org-mode protocol at all for browser -> emacs interaction? If so, was there any complication to set it up on windows?
      • charliemcmackin4859: ​I did slideshows a few times at a previous job with org-reveal. I liked it decently.
      • mtendethecreator: ​Hello sacha
      • phyzixlab: ​​Thank you both. Great interview

      You can e-mail me at sacha@sachachua.com.

    27. 🔗 r/wiesbaden Nagelstudio? 💅🏻 rss

      Kann mir jemand ein Nagelstudio (am liebsten in der Innenstadt oder gut mit ÖPNV erreichbar) empfehlen?

      Mir wäre wichtig, dass sauber und ruhig gearbeitet wird. Ich war einmal im Leben in einem Studio und kam mit blutender Nagelhaut und schlecht gemachten Nägeln wieder raus – daher will ich mich ungern blind an nen neuen Laden trauen. 🥲

      submitted by /u/Wildtollwut
      [link] [comments]

    28. 🔗 r/wiesbaden Geschlechtsangleichende Therapie in Wiesbaden rss

      Hey hey, ich bin vor kurzem nach Wiesbaden gezogen und bin große Städte nicht gewohnt weshalb es mir ein wenig schwer fällt zurecht zu finden und wollte fragen ob sich jemand mit Therapieplätzen für Erwachsene in Wiesbaden auskennt und mir eventuell Anlaufstellen für einen Therapieplatz geben könnte bei einem Therapeuten der mir Indikationsschreiben ausstellen kann. Das würde mir wirklich unfassbar helfen, Dankeschön:)

      submitted by /u/Top-Estate-2164
      [link] [comments]

    29. 🔗 r/Yorkshire Amazing what is buzzing around in Richmond! rss
    30. 🔗 r/LocalLLaMA 110 tok/s with 12GB VRAM on Qwen3.6 35B A3B and ik_llama.cpp rss

      Had been getting great MTP performance with llama.cpp on my RTX 4070 Super 12GB, until they actually merged the MTP PR. Then, performance tanked and was barely above non-MTP. So, I decided to try out ik_llama.cpp since it also supports MTP and is apparently better optimized for CPU offloading. I did not expect such a huge speed boost!

      Before moving on with the benchmark results, here's my PC specs: OS: CachyOS with Plasma (X11) - HIGHLY recommended CUDA: 13.1.1 GPU: RTX 4070 Super 12GB CPU: AMD Ryzen 7 9700X RAM: 48GB DDR5-6000 EXPO I UPDATED: For comparison, here's the regular llama.cpp results with byteshape's recently released Qwen3.6-35B-A3B-IQ4_XS-4.19bpw quant, which has similar accuracy to Unsloth's Q4_K_XL, but is 4GB smaller: ❯ ./mtp-bench.py code_python pred= 192 draft= 122 acc= 118 rate=0.967 tok/s=79.8 code_cpp pred= 192 draft= 117 acc= 110 rate=0.940 tok/s=89.1 explain_concept pred= 192 draft= 124 acc= 113 rate=0.911 tok/s=88.0 summarize pred= 192 draft= 139 acc= 127 rate=0.914 tok/s=95.0 qa_factual pred= 192 draft= 133 acc= 128 rate=0.962 tok/s=97.0 translation pred= 192 draft= 125 acc= 117 rate=0.936 tok/s=91.6 creative_short pred= 192 draft= 109 acc= 99 rate=0.908 tok/s=82.1 stepwise_math pred= 192 draft= 130 acc= 125 rate=0.962 tok/s=97.0 long_code_review pred= 192 draft= 121 acc= 115 rate=0.950 tok/s=88.2 Aggregate: { "n_requests": 9, "total_predicted": 1728, "total_draft": 1120, "total_draft_accepted": 1052, "aggregate_accept_rate": 0.9393, "wall_s_total": 21.86 } This gives a 89.76 tok/s average.

      Here's my llama.cpp launch command. Temperature is set to 0.0 for the

      benchmark to prevent diverging results between runs:

      llama-server \ -m Qwen3.6-35B-A3B-IQ4_XS-4.19bpw.gguf \ --fit on \ --fit-target 512 \ --ctx-size 131072 \ --cache-type-k q8_0 \ --cache-type-v q8_0 \ --cache-type-k-draft q8_0 \ --cache-type-v-draft q8_0 \ --spec-type draft-mtp \ --spec-draft-p-min 0.75 \ --spec-draft-n-max 3 \ --no-mmap \ --mlock \ --threads 8 \ --temp 0.0
      

      Now, here's the benchmark results with the same quant, but running with

      ik_llama.cpp:

      ❯ ./mtp-bench.py code_python pred= 192 draft= 135 acc= 122 rate=0.904 tok/s=105.1 code_cpp pred= 192 draft= 136 acc= 120 rate=0.882 tok/s=110.3 explain_concept pred= 192 draft= 133 acc= 116 rate=0.872 tok/s=109.0 summarize pred= 56 draft= 38 acc= 37 rate=0.974 tok/s=122.3 qa_factual pred= 192 draft= 141 acc= 127 rate=0.901 tok/s=116.0 translation pred= 192 draft= 143 acc= 113 rate=0.790 tok/s=104.1 creative_short pred= 192 draft= 133 acc= 118 rate=0.887 tok/s=109.4 stepwise_math pred= 192 draft= 140 acc= 125 rate=0.893 tok/s=114.6 long_code_review pred= 192 draft= 128 acc= 108 rate=0.844 tok/s=101.4 Aggregate: { "n_requests": 9, "total_predicted": 1592, "total_draft": 1127, "total_draft_accepted": 986, "aggregate_accept_rate": 0.8749, "wall_s_total": 16.64 }
      

      That's a 110.24 tok/s average, or 23% increase!

      If you want to get similar results on a 12GB RTX GPU, make sure you use the

      following ik_llama.cpp launch parameters, as they can differ from llama.cpp:

      llama-server \ -m Qwen3.6-35B-A3B-IQ4_XS-4.19bpw.gguf \ --fit \ --fit-margin 1664 \ --ctx-size 131072 \ --cache-type-k q8_0 \ --cache-type-v q8_0 \ --cache-type-k-draft q8_0 \ --cache-type-v-draft q8_0 \ --multi-token-prediction \ --draft-p-min 0.75 \ --draft-max 3 \ --no-mmap \ --mlock \ --threads 8 \ --temp 0.0
      

      I also want to mention that I'm on CachyOS running my GPU as a secondary GPU, with the monitor plugged in the iGPU, so I can use 100% of available VRAM.

      If you get an "out of memory" (OOM) error while loading the model or working with it, try increasing --fit-margin to 1792 or even 2048.

      Cheers :)

      submitted by /u/janvitos
      [link] [comments]

    31. 🔗 secret club Striga: Lifting x86 to LLVM IR with Python rss

      Background

      While discussing with eversinc33 about lifting BinaryShield to LLVM IR I decided it would be useful to write a basic lifter in Python that can lift x86_64 instructions to LLVM IR. He has since released his blog post: Writing a Naive LLVM-based Devirtualizer, which I highly recommend you check out! This post assumes familiarity with the basics of LLVM IR. You can find some references at the end of this post.

      Over the years I noticed that a lot of people get stuck exploring lifters, because existing tooling is too difficult to compile. In October 2025 I spent around a month redoing Remill’s build system (remill#723) and earlier this month I did the same for the Dna project (Dna#9). Last year I also started working on Python bindings for LLVM, which I wanted to use for a real project. You can find the lifter at LLVMParty/striga.

      The goal of this post is to lower the barrier of entry and let you experiment with lifting to LLVM IR. For inspiration you can look at the Static Devirtualization of Themida post that was just released by Back Engineering Labs, as well as the Pushan: Trace-Free Deobfuscation of Virtualization-Obfuscated Binaries paper by ASU researchers published in March.

      If you enjoy this article and would like to learn more, seemy website for information about my in-person trainings.

      Lifting

      Lifting is the process of translating assembly instructions to some kind of intermediate representation (IR). The motivation is usually that directly analyzing and manipulating (x86) assembly instructions is complex and error prone. The lifter translates the underlying instruction semantics directly to an IR that is easier to reason about (and therefore to manipulate as well).

      A few popular IRs:

      For this project I picked LLVM IR, because I am the most familiar with it and it has a well-established ecosystem. LLVM already has all of the common compiler optimizations and it is used and maintained by teams at large corporations.

      Architecture

      The architecture of the lifter is very much inspired by remill, but I simplified some things to make it easier to follow. In LLVM a register is actually an SSA value, which means we can only assign to it once. CPU registers are variables that can be assigned to multiple times. We model this by creating a State structure in memory that represents the x86 CPU state:

      struct State {
        uint64_t rax;
        uint64_t rbx;
        uint64_t rcx;
        uint64_t rdx;
        // ... GPRs
        uint8_t cf;
        uint8_t zf;
        uint8_t of;
        // ... Flags
        // ... XMM
      };
      

      Instructions that read or write to RAX will load/store to State->rax. If we play our cards right, the optimizer will use the mem2reg pass to translate this into SSA form for us and enable further optimizations.

      An important difference to an actual CPU is that flags are modelled as independent 8-bit registers. This makes it easier to reason about compared to a packed bitfield. For instance, it helps the optimizer to perform dead store elimination and propagation.

      In addition to the State, we need an opaque memory pointer that helps us differentiate a load/store in the State from memory accesses by the x86 CPU. In short: the State pointer is used to model the CPU and the memory pointer is used to model the RAM. While lifting, the prototype of the lifted function is void lifted(State* state, void* memory). Later on we will perform brightening , to turn this into something we can recompile.

      Below is the LLVM IR for the instruction mov rax, rcx, with comments in pseudo-C:

      define internal void @lifted_0x140001000(ptr %state, ptr %memory) {
      initialize:
        ; uint64_t* rcx = &state->rcx;
        %rcx = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 2
      
        ; uint64_t* rax = &state->rax;
        %rax = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 0
      
        ; Jump to the first instruction
        br label %insn_0x140001000
      
      insn_0x140001000:                                 ; preds = %initialize  
        ; uint64_t v0 = *rcx;
        %0 = load i64, ptr %rcx, align 4
      
        ; *rax = v0;
        store i64 %0, ptr %rax, align 4
      
        ; Jump to the next instruction
        br label %insn_0x140001003
      
      insn_0x140001003:                                 ; preds = %insn_0x140001000
        ; Block terminator to keep the IR valid
        ret void
      }
      

      We start out with the initialize block, which is used to get pointers to the relevant State members. Then every instruction gets its own basic block named insn_<addr>. Every instruction is responsible for emitting an unconditional branch to its successors. The basic block for the successor is created with just a ret terminator, to keep the module verifier happy.

      To illustrate memory accesses, here is the LLVM IR for mov rax, qword [rbx+42]:

      define internal void @lifted_0x140001000(ptr %state, ptr %memory) {
      initialize:
        %rbx = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 1
        %rax = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 0
        br label %insn_0x140001000
      
      insn_0x140001000:                                 ; preds = %initialize
        ; uint64_t v0 = *rbx;
        %0 = load i64, ptr %rbx, align 4
      
        ; uint64_t v1 = v0 + 42;
        %1 = add i64 %0, 42
      
        ; uint8_t* v2 = &memory[v1];
        %2 = getelementptr i8, ptr %memory, i64 %1
      
        ; uint64_t v3 = *(uint64_t*)v2;
        %3 = load i64, ptr %2, align 1
      
        ; *rax = v3;
        store i64 %3, ptr %rax, align 4
      
        br label %insn_0x140001004
      
      insn_0x140001004:                                 ; preds = %insn_0x140001000
        ret void
      }
      

      Here you can see the getelementptr i8, ptr %memory, i64 %1 instruction which uses memory as a base, signaling that this is a read from the x86 memory (we will clean this up later).

      The lifter itself is contained in a ~500 line Semantics class with these main functions (some are omitted for brevity):

      # src/striga/semantics.py
      
      class Semantics:
          def __init__(self, module: Module): ...
      
          # Lifting
          def begin(self, address: int) -> Function: ...
          def get_or_create_block(self, address: int) -> BasicBlock: ...
          def lift_bytes(self, address: int, code: bytes) -> list[Successor]: ...
      
          # Semantic helpers
          def reg_read(self, name: str) -> Value: ...
          def reg_write(self, name: str, value: Value): ...
          def mem_read(self, addr: Value, ty: Type) -> Value: ...
          def mem_write(self, addr: Value, value: Value): ...
          def op_mem(self, op: X86Op) -> Value: ...
          def op_read(self, index: int) -> Value: ...
          def op_write(self, index: int, value: Value): ...
          def flag_read(self, name: str) -> Value: ...
          def flag_write(self, name: str, value: Value): ...
      
          # State (simplified)
          module: Module
          function: Function
          ir: Builder
          insn: CsInsn
      

      The begin(address) function is used to create the lifted_&lt;address&gt; function in LLVM IR and create the initialize block with a branch to the first instruction:

      def begin(self, address: int) -> Function:
          name = f"lifted_{hex(address)}"
          fn = self.module.get_function(name)
          if fn is None:
              fn = self.module.add_function(name, self.lifted_ty)
              fn.param_attributes(0).add("noalias")
              fn.param_attributes(1).add("noalias")
              state, memory = fn.params
              memory.name = "memory"
              state.name = "state"
              self.function = fn
              self.reg_ptrs = {}
              self.insn_blocks = {}
      
              entry = fn.append_basic_block("initialize")
              assert fn.last_basic_block == entry
              with entry.create_builder() as ir:
                  ir.br(self.get_or_create_block(address))
          else:
              # Omitted for brevity
          return self.function
      

      To create the instruction block, get_or_create_block is used:

      def get_or_create_block(self, address: int) -> BasicBlock:
          block = self.insn_blocks.get(address)
          if block is None:
              block = self.function.append_basic_block(f"insn_{hex(address)}")
              with block.create_builder() as ir:
                  ir.ret_void()
              self.insn_blocks[address] = block
          assert block.function == self.function
          return block
      

      As mentioned above, an empty block is not valid LLVM IR so we populate it with a ret instruction. When actually lifting into the basic block, that instruction will be replaced with the lifted code.

      To lift a single instruction we pass its address and bytes to lift_bytes, which is responsible for producing LLVM IR:

      def lift_bytes(self, address: int, code: bytes) -> list[Successor]:
          # Ensure we have a function to lift into
          if not hasattr(self, "function"):
              self.begin(address)
      
          insn = self.cs_disasm(address, code)
          if self.verbose:
              print(";", hex(insn.address), insn.mnemonic, insn.op_str)
      
          # Skip lifting if the block is already populated
          block = self.get_or_create_block(address)
          assert block.first_instruction
          if block.first_instruction.opcode == Opcode.Ret:
              block.first_instruction.erase_from_parent()
          else:
              return []
      
          with block.create_builder() as ir:
              # State used by semantic handlers
              self.ir = ir
              self.insn = insn
      
              handler = _semantics.get(insn.mnemonic)
              if handler is None and insn.mnemonic.startswith("lock "):
                  # LOCK preserves the single-threaded architectural result; the
                  # lifter does not model inter-thread atomicity separately.
                  handler = _semantics.get(insn.mnemonic.removeprefix("lock "))
              if handler is None:
                  raise NotImplementedError(insn.mnemonic)
      
              successors = handler(self)
              if successors is None:
                  # Linear fallthrough - handler didn't emit a terminator.
                  fallthrough = address + insn.size
                  ir.br(self.get_or_create_block(fallthrough))
                  successors = [Successor(address, self.const64(fallthrough))]
      
              # Make sure the handler produced valid IR
              self.module.verify_or_raise()
              return successors
      

      The function first ensures an empty insn_&lt;address&gt; block by removing the temporary ret instruction. Then it creates an IR Builder and calls the handler responsible for producing IR for the instruction being lifted (more on that below). If the handler does not return successors, lift_bytes handles the common fallthrough case by creating a basic block for the next instruction. It is up to the caller to handle the list of Successor tuples:

      class Successor(NamedTuple):
          src: int
          dst: Value
      

      We use an LLVM Value for the branch destination, because it is not always concrete (for example jmp reg).

      The semantic handlers are registered globally:

      # src/striga/semantic.py
      
      SemanticFn: TypeAlias = Callable[["Semantics"], list[Successor] | None]
      _semantics: dict[str, SemanticFn] = {}
      
      
      def semantic(fn: SemanticFn):
          name = getattr(fn, "__name__")
          _semantics[name.removesuffix("_")] = fn
          return fn
      
      
      # src/striga/x86/data.py
      
      @semantic
      def mov(sem: Semantics):
          value = sem.op_read(1)
          sem.op_write(0, value)
      

      Every handler gets an instance of Semantics, to allow easy access to x86 constructs like operands, registers, flags and memory. For example, op_read is implemented as follows:

      def op_read(self, index: int) -> Value:
          op: X86Op = self.insn.operands[index]
          if op.type == CS_OP_REG:
              name = self.reg_name(op.reg)  # pyright: ignore[reportAssignmentType]
              return self.reg_read(name)
          if op.type == CS_OP_IMM:
              return self.const_n(op.imm, op.size * 8)
          if op.type == CS_OP_MEM:
              addr = self.op_mem(op)
              return self.mem_read(addr, self.types.int_n(op.size * 8))
          assert False
      

      For our example mov rax, rcx, the function will forward to reg_read:

      def reg_read(self, name: str) -> Value:
          if name in self.reg_types:
              load = self.ir.load(self.reg_types[name], self.reg_ptr(name))
              load.metadata["tbaa"] = self.tbaa_tags[name]
              return load
      
          full_name, size, bit_offset = self.subregs[name]
          load = self.ir.load(self.reg_types[full_name], self.reg_ptr(full_name))
          load.metadata["tbaa"] = self.tbaa_tags[full_name]
          if bit_offset:
              load = self.ir.lshr(load, self.const64(bit_offset))
          return self.ir.trunc(load, self.types.int_n(size))
      

      This function transparently handles accesses to sub registers like eax, ax, al and ah and it returns an LLVM Value containing the loaded register value. The last missing piece is the reg_ptr function, which is responsible for creating the getelementptr in the function entry:

      def reg_ptr(self, name: str) -> Value:
          reg_ptr = self.reg_ptrs.get(name)
          if reg_ptr is not None:
              return reg_ptr
      
          entry = self.function.entry_block
          state = self.function.get_param(0)
          with entry.create_builder() as ir:
              ir.position_before(entry.terminator)
              reg_ptr = ir.struct_gep(self.state_ty, state, self.reg_indices[name], name)
          self.reg_ptrs[name] = reg_ptr
          return reg_ptr
      

      To help the optimizer we add TBAA Metadata to the register load/store instructions. In this case we know that a register loads/stores never alias with each other. By telling the optimizer about this, it can perform more aggressive dead-store elimination when optimizing a sequence of lifted instructions.

      Semantics

      So far we discussed the architecture of the lifter, but we only discussed the mov instruction so far. Almost every other instruction has more complex behavior, especially around flag handling. For instance here are the implementations of and/or/xor:

      # src/striga/x86/bitwise.py
      
      def write_logical_flags(sem: Semantics, result: Value):
          false = sem.const_n(0, 1)
          sem.flag_write("cf", false)
          sem.flag_write("pf", sem.result_parity_even(result))
          sem.flag_write_undef("af")
          sem.flag_write("zf", sem.result_is_zero(result))
          sem.flag_write("sf", sem.result_sign_bit(result))
          sem.flag_write("of", false)
      
      def logical_binop(sem: Semantics, opcode: Opcode):
          dst = sem.op_read(0)
          src = sem.resize_int(sem.op_read(1), dst.type)
          result = sem.ir.binop(opcode, dst, src)
          sem.op_write(0, result)
          write_logical_flags(sem, result)
      
      @semantic
      def and_(sem: Semantics):
          logical_binop(sem, Opcode.And)
      
      @semantic
      def or_(sem: Semantics):
          logical_binop(sem, Opcode.Or)
      
      @semantic
      def xor(sem: Semantics):
          logical_binop(sem, Opcode.Xor)
      

      For reference here is the lifted LLVM IR for xor rax, rbx and the Python code responsible for each part:

      insn_0x140001000:                                 ; preds = %initialize  
        ; dst = sem.reg_read(0)
        %0 = load i64, ptr %rax, align 4
      
        ; src = sem.resize_int(sem.op_read(1), dst.type)
        %1 = load i64, ptr %rbx, align 4
      
        ; result = sem.ir.binop(Opcode.Xor, dst, src)
        %2 = xor i64 %0, %1
      
        ; sem.op_write(0, result)
        store i64 %2, ptr %rax, align 4
      
        ; sem.flag_write("cf", false)
        store i8 0, ptr %cf, align 1
      
        ; sem.flag_write("pf", sem.result_parity_even(result))
        %3 = trunc i64 %2 to i8
        %4 = lshr i8 %3, 4
        %5 = xor i8 %3, %4
        %6 = lshr i8 %5, 2
        %7 = xor i8 %5, %6
        %8 = lshr i8 %7, 1
        %9 = xor i8 %7, %8
        %10 = and i8 %9, 1
        %11 = icmp eq i8 %10, 0
        %12 = zext i1 %11 to i8
        store i8 %12, ptr %pf, align 1
      
        ; sem.flag_write_undef("af")
        %13 = call i1 @__striga_undef_af(i64 5368713216)
        %14 = zext i1 %13 to i8
        store i8 %14, ptr %af, align 1
      
        ; sem.flag_write("zf", sem.result_is_zero(result))
        %15 = icmp eq i64 %2, 0
        %16 = zext i1 %15 to i8
        store i8 %16, ptr %zf, align 1
      
        ; sem.flag_write("sf", sem.result_sign_bit(result))
        %17 = lshr i64 %2, 63
        %18 = trunc i64 %17 to i1
        %19 = zext i1 %18 to i8
        store i8 %19, ptr %sf, align 1
      
        ; sem.flag_write("of", false)
        store i8 0, ptr %of, align 1
      
        ; Semantics.lift_bytes
        br label %insn_0x140001003
      

      If you pay close attention you see a call to __striga_undef_af, which is a custom intrinsic used to represent something that has no clear analog in LLVM IR. In this case the description of the xor instruction says:

      The OF and CF flags are cleared; the SF, ZF, and PF flags are set according to the result. The state of the AF flag is undefined.

      This means that Intel/AMD does not want to document exactly how the value of AF is computed in silicon. In practice this can vary between CPU models/generations and it can be used as an anti-emulation trick, but we will not go into detail in this post. We emit __striga_undef_af, to allow the user to handle this however they see fit. If you are interested there is remill#766 with a little discussion about how to model this correctly.

      Another class of instructions to highlight here is the various branch instructions:

      # src/striga/x86/control.py
      
      def conditional_jump(sem: Semantics, cond: Value):
          brtrue = sem.insn.operands[0].imm
          brfalse = sem.insn.address + sem.insn.size
          sem.ir.cond_br(
              cond,
              sem.get_or_create_block(brtrue),
              sem.get_or_create_block(brfalse),
          )
      
          src = sem.insn.address
          return [
              Successor(src, sem.const64(brtrue)),
              Successor(src, sem.const64(brfalse)),
          ]
      
      def jcc(sem: Semantics, cc: str):
          return conditional_jump(sem, cc_cond(sem, cc))
      
      @semantic
      def je(sem: Semantics):
          return jcc(sem, "e")
      
      @semantic
      def jmp(sem: Semantics):
          dst = sem.op_read(0)
          if dst.is_constant:
              sem.ir.br(sem.get_or_create_block(dst.const_zext_value))
          else:
              sem.ir.call(sem.jmp_handler, [dst])
              sem.ir.ret_void()
          return [Successor(sem.insn.address, dst)]
      
      @semantic
      def call(sem: Semantics):
          dst = sem.op_read(0)
          fallthrough = sem.insn.address + sem.insn.size
          sem.push(sem.const64(fallthrough))
          sem.ir.call(sem.call_handler, [dst])
          sem.ir.br(sem.get_or_create_block(fallthrough))
          return [Successor(sem.insn.address, sem.const64(fallthrough))]
      
      @semantic
      def ret(sem: Semantics):
          dst = sem.pop(sem.i64)
          if sem.insn.operands:
              rsp = sem.reg_read("rsp")
              sem.reg_write("rsp", sem.ir.add(rsp, sem.const64(sem.insn.operands[0].imm)))
          sem.ir.call(sem.ret_handler, [dst])
          sem.ir.ret_void()
          return [Successor(sem.insn.address, dst)]
      

      LLVM IR for je imm:

      insn_0x140001000:                                 ; preds = %initialize
        %0 = load i8, ptr %zf, align 1
        %1 = icmp ne i8 %0, 0
        br i1 %1, label %insn_0x140001014, label %insn_0x140001002
      
      insn_0x140001014:                                 ; preds = %insn_0x140001000
        ret void
      
      insn_0x140001002:                                 ; preds = %insn_0x140001000
        ret void
      }
      

      Note that the semantic handler for jcc is responsible for creating both the destination blocks as well as the br with the appropriate condition based on the flag(s).

      LLVM IR for jmp rbx:

      insn_0x140001000:                                 ; preds = %initialize
        %0 = load i64, ptr %rbx, align 4
        call void @__striga_jmp(i64 %0)
        ret void
      

      LLVM IR for call imm:

      insn_0x140001000:                                 ; preds = %initialize
        %0 = load i64, ptr %rsp, align 4
        %1 = sub i64 %0, 8
        store i64 %1, ptr %rsp, align 4
        %2 = getelementptr i8, ptr %memory, i64 %1
        store i64 5368713221, ptr %2, align 1
        call void @__striga_call(i64 5369761797)
        br label %insn_0x140001005
      

      LLVM IR for ret:

      insn_0x140001000:                                 ; preds = %initialize
        %0 = load i64, ptr %rsp, align 4
        %1 = getelementptr i8, ptr %memory, i64 %0
        %2 = load i64, ptr %1, align 1
        %3 = add i64 %0, 8
        store i64 %3, ptr %rsp, align 4
        call void @__striga_ret(i64 %2)
        ret void
      }
      

      As you can see, we use the following intrinsics:

      • __striga_jmp: indirect jump
      • __striga_call: call instruction
      • __striga_ret: ret instruction

      These are also used to give the user flexibility in how they want to handle these instructions.

      Control flow

      Because of the design choice where every instruction is a basic block, it becomes fairly straightforward to recover the control flow of a basic function:

      def lift(module: Module, container: Container, start: int, *, verbose=True):
          sem = Semantics(module, verbose=verbose)
          lifted_fn = sem.begin(start)
      
          queue: Queue[Successor] = Queue()
          queue.put(Successor(0, sem.const64(start)))
          # Keep destinations as LLVM Values instead of splitting constants into ints.
          # This keeps the worklist uniform and matches later slicing/data-flow uses.
          visited: set[Value] = set()
          while not queue.empty():
              src, dst = queue.get()
      
              if not dst.is_constant:
                  if sem.verbose:
                      print(f"; non-constant branch destination: {hex(src)} -> {dst}")
                  continue
      
              if dst in visited:
                  continue
              visited.add(dst)
      
              va = dst.const_zext_value
              code = container.get_data(va, 15)
              successors = sem.lift_bytes(va, code)
              for successor in successors:
                  if successor.dst in visited:
                      continue
                  queue.put(successor)
      
          sem.module.verify_or_raise()
          return lifted_fn
      

      This is a simple Breadth-first search over the control flow graph and it allows recovering functions without indirect branches. Note that we do not have to do anything special to handle back edges (loops) or block splitting. The lifted code is modeled with an LLVM basic block per instruction, so we can connect instructions arbitrarily.

      Below is a function with some simple control flow (if/else/loop):

      test_cfg:
          cmp rax, 0
          je .else_block
      .if_true:
          add rax, 1
          jmp .merge
      .else_block:
          add rax, 2
      .merge:
          sub rax, 1
          jne .merge
      .exit:
          ret
      

      The graph of the disassembly looks like this:

      CFG

      The LLVM IR looks like this:

      define internal void @lifted_0x140001000(ptr %state, ptr %memory) {
      initialize:
        %rax = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 0
        %zf = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 51
        %rsp = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 6
        br label %insn_0x140001000
      
      insn_0x140001000:                                 ; preds = %initialize
        ; cmp rax, 0
        %0 = load i64, ptr %rax, align 4
        %1 = sub i64 %0, 0
        %19 = icmp eq i64 %1, 0
        %20 = zext i1 %19 to i8
        store i8 %20, ptr %zf, align 1
        br label %insn_0x140001004
      
      insn_0x140001004:                                 ; preds = %insn_0x140001000
        ; je 0x14000100c
        %30 = load i8, ptr %zf, align 1
        %31 = icmp ne i8 %30, 0
        br i1 %31, label %insn_0x14000100c, label %insn_0x140001006
      
      insn_0x14000100c:                                 ; preds = %insn_0x140001004
        ; add rax, 2
        %32 = load i64, ptr %rax, align 4
        %33 = add i64 %32, 2
        store i64 %33, ptr %rax, align 4
        br label %insn_0x140001010
      
      insn_0x140001006:                                 ; preds = %insn_0x140001004
        ; add rax, 1
        %62 = load i64, ptr %rax, align 4
        %63 = add i64 %62, 1
        store i64 %63, ptr %rax, align 4
        br label %insn_0x14000100a
      
      insn_0x140001010:                                 ; preds = %insn_0x140001014, %insn_0x14000100a, %insn_0x14000100c
        ; sub rax, 1
        %92 = load i64, ptr %rax, align 4
        %93 = sub i64 %92, 1
        store i64 %93, ptr %rax, align 4
        %111 = icmp eq i64 %93, 0
        %112 = zext i1 %111 to i8
        store i8 %112, ptr %zf, align 1
        br label %insn_0x140001014
      
      insn_0x14000100a:                                 ; preds = %insn_0x140001006
        ; jmp 0x140001010
        br label %insn_0x140001010
      
      insn_0x140001014:                                 ; preds = %insn_0x140001010
        ; jne 0x140001010
        %122 = load i8, ptr %zf, align 1
        %123 = icmp ne i8 %122, 0
        %124 = xor i1 %123, true
        br i1 %124, label %insn_0x140001010, label %insn_0x140001016
      
      insn_0x140001016:                                 ; preds = %insn_0x140001014
        ; ret
        %125 = load i64, ptr %rsp, align 4
        %126 = getelementptr i8, ptr %memory, i64 %125
        %127 = load i64, ptr %126, align 1
        %128 = add i64 %125, 8
        store i64 %128, ptr %rsp, align 4
        call void @__striga_ret(i64 %127)
        ret void
      }
      

      For clarity, some flag computations were omitted from this IR dump.

      Brightening

      Brightening was a term coined in 2019 by Peter Garba and Matteo Favaro in the SATURN paper:

      Brightening [COMP.] verb – Reshaping code to make it more readable and understandable for humans

      Concretely it means to transform the LLVM IR from the lifted shape (pseudo C):

      /*
      Lifted instructions:
        add rdi, rsi
        mov rax, rdi
        ret
      */
      void lifted(State* state, void* memory) {
        state.rdi += state.rsi;
        state.rax = state.rdi;
        __striga_ret(...);
      }
      

      Back to a regular function for the lifted platform’s calling convention, such as:

      // Linux calling convention: https://wiki.osdev.org/System_V_ABI#x86-64
      uint64_t /* rax */ brightened(uint64_t /* rdi */ x, uint64_t /* rsi */ y) {
        return x + y;
      }
      

      The brightened function sets up the State on the stack and assigns the arguments to the registers appropriate for the calling convention of our target platform. The result register is returned from the function. Conceptually this is not very difficult, but it requires a bit of mental gymnastics to wrap your head around the trick:

      // Symbolic variable for memory
      uint8_t RAM[0];
      
      void lifted(State* state, void* memory) { ... }
      
      uint64_t brightened(uint64_t x, uint64_t y) {
        State state;
        state.rdi = x;
        state.rsi = y;
        lifted(&state, RAM);
        return state.rax;
      }
      

      After an inlining pass it would look something like this:

      uint64_t brightened(uint64_t x, uint64_t y) {
        State state;
        state.rdi = x;
        state.rsi = y;
        state.rdi += state.rsi;
        state.rax = state.rdi;
        __striga_ret(...);
        return state.rax;
      }
      

      We can get rid of the __striga_ret intrinsic in this case, which will let the optimizer reduce the function to its original shape:

      uint64_t brightened(uint64_t x, uint64_t y) {
        return x + y;
      }
      

      LLVM IR before optimizations:

      define i64 @brightened_0x1000(i64 %0, i64 %1) {
      entry:
        %state = alloca %State, align 8
        %rdi = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 5
        store i64 %0, ptr %rdi, align 4
        %rsi = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 4
        store i64 %1, ptr %rsi, align 4
        %stack = alloca i8, i64 4096, align 1
        %2 = getelementptr i8, ptr %stack, i64 4088
        %3 = ptrtoint ptr %2 to i64
        %rsp = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 6
        store i64 %3, ptr %rsp, align 4
        store i64 3735928559, ptr %2, align 1
        call void @lifted_0x1000(ptr %state, ptr @RAM)
        %rax = getelementptr inbounds nuw %State, ptr %state, i32 0, i32 0
        %4 = load i64, ptr %rax, align 4
        ret i64 %4
      }
      

      After optimizing the module with default<O1>:

      define i64 @brightened_0x1000(i64 %0, i64 %1) {
      entry:
        %2 = add i64 %1, %0
        ret i64 %2
      }
      

      Memory / Stack

      To handle memory accesses, we create a global RAM variable and pass that to our memory argument. In the previous example it folded away, but we need to handle it separately. The simplest form is access to a pointer parameter:

      uint64_t lift4_read(uint64_t *n) {
        return *n ^ 1337;
      }
      

      With our current brightening strategy the lifted code (after optimizations) would look like this:

      define i64 @brightened_0x1000(i64 %0) {
      entry:
        %1 = getelementptr i8, ptr @RAM, i64 %0
        %2 = load i64, ptr %1, align 1, !alias.scope !19, !noalias !22
        %3 = xor i64 %2, 1337
        ret i64 %3
      }
      

      We need to detect the getelementptr i8, ptr @RAM, i64 %0 shape and replace it with an inttoptr instruction:

      define i64 @brightened_0x1000(i64 %0) {
      entry:
        %1 = inttoptr i64 %0 to ptr
        %2 = load i64, ptr %1, align 1, !alias.scope !19, !noalias !22
        %3 = xor i64 %2, 1337
        ret i64 %3
      }
      

      The stack can be modeled by allocating a local stack variable and pointing rsp to the end of that buffer (since on x86 the stack grows towards lower addresses):

      uint64_t brightened(uint64_t x, uint64_t y) {
        uint8_t stack[4096];
        State state;
        state.rdi = x;
        state.rsi = y;
        state.rsp = (uint64_t)&stack[sizeof(stack) - 8];
        lifted(&state, RAM);
        return state.rax;
      }
      

      Putting everything together in brighten.py:

      from llvm import Linkage, Module, Opcode, Value, global_context
      
      from bfs import lift_bfs
      from container import Container, RawContainer
      
      OPT_PIPELINE = "default<O1>"
      
      
      def rewrite_ram_geps(module: Module, ram: Value):
          """Replace GEPs rooted at @RAM with inttoptr(address)."""
          types = module.context.types
      
          for gep in ram.users:
              if not gep.is_instruction or gep.opcode != Opcode.GetElementPtr:
                  raise ValueError(f"unexpected @RAM user: {gep}")
      
              if gep.get_operand(0) != ram:
                  raise ValueError(f"unexpected @RAM GEP base: {gep}")
      
              if gep.num_operands == 2:
                  if gep.gep_source_element_type != types.i8:
                      raise ValueError(f"expected i8 ptradd-style @RAM GEP: {gep}")
                  address = gep.get_operand(1)
              elif gep.num_operands == 3:
                  zero = gep.get_operand(1)
                  if not zero.is_constant_int or zero.const_zext_value != 0:
                      raise ValueError(f"expected zero first @RAM GEP index: {gep}")
                  address = gep.get_operand(2)
              else:
                  raise ValueError(f"unexpected @RAM GEP shape: {gep}")
      
              with gep.create_builder() as ir:
                  ptr = ir.inttoptr(address, types.ptr)
              gep.replace_all_uses_with(ptr)
              gep.erase_from_parent()
      
          if not ram.users:
              ram.delete_global()
      
          module.verify_or_raise()
      
      
      def define_ret_stub(module: Module):
          """Make the modeled return hook removable for this demo wrapper."""
          ret_handler = module.get_function("__striga_ret")
          if ret_handler is not None and ret_handler.is_declaration:
              ret_handler.linkage = Linkage.Internal
              entry = ret_handler.append_basic_block("entry")
              with entry.create_builder() as ir:
                  ir.ret_void()
      
      
      def lift_brightened(container: Container, entry: int, args: list[str]):
          with global_context().create_module("blog") as module:
              sem = lift_bfs(module, container, entry, verbose=True)
      
              # Convenience aliases
              types = module.context.types
              i8 = types.i8
              i64 = types.i64
      
              # Global RAM array
              ram = module.add_global(types.array(i8, 0), "RAM")
      
              # TODO: support different register sizes
              brightened_ty = types.function(i64, [i64 for _ in args])
              brightened = module.add_function(f"brightened_{hex(entry)}", brightened_ty)
              with brightened.create_builder() as ir:
                  state = ir.alloca(sem.state_ty, "state")
      
                  def reg_ptr(name: str) -> Value:
                      return ir.struct_gep(sem.state_ty, state, sem.reg_indices[name], name)
      
                  # Assign arguments to register state
                  for i, name in enumerate(args):
                      ir.store(brightened.get_param(i), reg_ptr(name))
      
                  # Set up function stack
                  stack = ir.alloca(i8, i64.constant(4096), "stack")
                  stack_ptr = ir.gep(i8, stack, [i64.constant(4096 - 8)])
                  ir.store(ir.ptrtoint(stack_ptr, i64), reg_ptr("rsp"))
      
                  # Set up return address
                  retaddr_store = ir.store(i64.constant(0xDEADBEEF), stack_ptr)
                  retaddr_store.inst_alignment = 1
      
                  # Call lifted function
                  ir.call(sem.function, [state, ram])
      
                  # Load return value from rax and return it
                  ir.ret(ir.load(i64, reg_ptr("rax")))
      
              module.verify_or_raise()
      
              # 1. Inline/optimize with @RAM assigned to the lifted memory parameter.
              module.optimize(OPT_PIPELINE)
      
              # 2. Brighten lifted memory: @RAM + integer address -> inttoptr(address).
              rewrite_ram_geps(module, ram)
      
              # 3. Now that RAM accesses have been brightened, discard the modeled ret
              #    hook for this demo and let LLVM clean up the remaining wrapper noise.
              #    Undefined flag helpers are already declared memory(none) by Semantics,
              #    so their dead uses fold away without local stub definitions.
              define_ret_stub(module)
              module.verify_or_raise()
              module.optimize(OPT_PIPELINE)
      
              print(brightened)
      

      This cleanly lifts the following (unoptimized) function:

      ; 0x1000 push rbp
      ; 0x1001 mov rbp, rsp
      ; 0x1004 mov qword ptr [rbp - 8], rdi
      ; 0x1008 mov rax, qword ptr [rbp - 8]
      ; 0x100c pop rbp
      ; 0x100d ret 
      define i64 @brightened_0x1000(i64 returned %0) {
      entry:
        ret i64 %0
      }
      

      Conclusion

      Hopefully this was an insightful introduction to lifting to LLVM IR. Feel free to check out the repository at LLVMParty/striga and reach out if you do something interesting with it!

      Note : Striga is not meant to be a production-ready lifter. There are no tests and only a very limited subset of x86 has been implemented.

      Thanks to the reviewers:

      LLVM IR references:

    32. 🔗 r/york Free theatre tickets for The Psychic @ Theatre Royal TONIGHT 19:00 rss

      I've 2x tickets for the new play, The Psychic, tonight - Thursday 21st May at 7pm. We're unable to attend due to unforeseen circumstances (the irony!) but I don't want them to go to waste - good seats. Free of charge to anybody who wants them, but I only ask that you actually attend! DM me if you're serious about going and would like them.

      https://www.yorktheatreroyal.co.uk/show/the-psychic/

      submitted by /u/clockworkear
      [link] [comments]

    33. 🔗 r/reverseengineering I built 99 adversarial PE fixtures to stress‑test parsers — here’s what they reveal about malformed binaries rss
    34. 🔗 r/york 'It's just crazy': The York students rejecting a bank-breaking prom rss

      'It's just crazy': The York students rejecting a bank-breaking prom | submitted by /u/Kagedeah
      [link] [comments]
      ---|---

    35. 🔗 r/Leeds Canada Goose rss

      Hi,

      I've come up from London for a conference and my friend Tarquin has spilt some of your Kirkstalle Ale on his Gilet last night while we were enjoying KPMG corporate hospitality.

      We are flying back to Heathrow this afternoon so don't have time to get it dry cleaned but obviously don't want to go the day sticking out like a sore thumb without the proper attire. Is there anywhere in Leeds (ideally near the dock) we could pick up some Canada Goose, want to avoid brands like North Face unless it's getting dire.

      Thanks in advance

      submitted by /u/Ford_Maeve
      [link] [comments]

    36. 🔗 r/york York, reflected ✨ rss

      York, reflected ✨ | Image @ kierandelaneyvisuals submitted by /u/1ChanceChipmunk1
      [link] [comments]
      ---|---

    37. 🔗 r/wiesbaden Wellpass +1 Mitgliedschaft gesucht rss

      Hey zusammen,

      ich wollte mal freundlich in die Runde fragen, ob zufällig jemand hier Mitglied bei EGYM Wellpass ist und den neuen „Plus1“-Platz noch frei hat 😊

      Dabei kann man wohl eine weitere Person privat mit in den Tarif aufnehmen. Ich hätte Interesse daran und würde die Kosten natürlich vollständig selbst übernehmen – für euch also kein finanzielles Risiko oder zusätzlicher Aufwand, außer der Einladung selbst.

      Hier sind die Infos dazu:

      Wellpass Plus1-Mitgliedschaft Erklärung

      https://support.egym-wellpass.com/de/articles/10853223-plus1-mitgliedschaft

      Falls jemand grundsätzlich Interesse hätte oder Fragen dazu hat, gerne einfach melden 🙂

      submitted by /u/Ackererack
      [link] [comments]

    38. 🔗 jellyfin/jellyfin 10.11.9 release

      🚀 Jellyfin Server 10.11.9

      We are pleased to announce the latest stable release of Jellyfin, version 10.11.9! This minor release brings several bugfixes to improve your Jellyfin experience. As always, please ensure you take a full backup before upgrading!

      You can find more details about and discuss this release on our forums.

      Changelog (5)

      📈 General Changes

    39. 🔗 anthropics/claude-code v2.1.146 release

      What's changed

      • Renamed /simplify to /code-review with an optional effort level (e.g. /code-review high)
      • Auto mode no longer suppresses AskUserQuestion when the user or a skill explicitly relies on it
      • Fixed Windows PowerShell tool failing with "command line is invalid" when pwsh is installed via winget or the Microsoft Store (regression in v2.1.124)
      • Fixed MCP resources/list, resources/templates/list, and prompts/list dropping items past page 1 on paginating servers
      • Fixed full-screen strobing in attached background sessions on Windows Terminal while Claude is streaming
      • Fixed the auto-updater status line not showing your current version when an update fails
      • Fixed on Windows, removing a background-job worktree no longer follows NTFS junctions into the main repo
      • Fixed /background refusing sessions whose only typed input was a skill or custom slash command
      • Fixed backgrounded sessions re-prompting for tool permissions you already granted with "don't ask again"
      • Fixed /theme color editor and "New custom theme" dialogs not responding to Esc
      • Fixed an uncaught exception at the end of streaming sessions when running via the Agent SDK
      • Fixed forceLoginOrgUUID and forceLoginMethod managed-settings policies not being enforced against third-party-provider and API-key sessions
      • Fixed GNOME Terminal right-click and middle-click paste not inserting text
      • Fixed CLAUDE_CODE_SUBAGENT_MODEL not being forwarded to child processes in multi-agent sessions
      • Improved auto-updater reliability: native version checks and downloads now retry transient network failures instead of failing immediately
      • Improved diff rendering performance for large file edits
    40. 🔗 matklad TIL: Symlinking NixOS Dotfiles rss

      TIL: Symlinking NixOS Dotfiles

      May 21, 2026

      The standard answer to managing dotfiles on NixOS is home- manager. I’ve never used it, due to two aesthetic and one practical objection:

      • I avoid dependencies, especially in nix, which rivals Python in the number of approaches to dependency management.
      • home-manager installs packages for the current user only, which makes sense on non-NixOS systems. But on a single-user desktop system, I prefer having just one set of packages.
      • Having a source of truth for dotfiles be in nix store requires rebuilding your system to change config, which gets in the way of Emacs-style direct tinkering.

      The approach I like is storing dotfiles in the same repository as flake.nix / configuration.nix and symlinking them in place.

      The problem here is that NixOS seemingly doesn’t have a “native” way to say that /a/b/c should be a symlink to /c/d/e. Or has it?

      If you search options for symlink, you’ll learn about environment.etc which allows you to configure symlinks, but only for things in /etc, not your ~/.config.

      For the latter, you can use gnu stow or some other dotfile link manager, but the complexity of the problem of just managing symlinks doesn’t warrant yet another dependency. It’s fine to do this manually.

      But wouldn’t it be nice if this framework for declarative configuration of your system allowed you to declaratively configure symlinks? Turns out this is possible, in roundabout way. Inaptly-named systemd- tmpfiles allows creating symlinks from a declarative config, and you can use NixOS to configure systemd-tmpfiles itself (thanks, NobbZ!).

      For example, if I want to symlink ~/dotfiles/git/config to .config/git/config:

      {
        systemd.tmpfiles.rules = [
          "L+ /home/matklad/.config/git/config - - - - /home/matklad/dotfiles/git/config"
        ];
      }
      

      No opinion at this point how this compares to a bespoke script or something more purpose-built.

    41. 🔗 Console.dev newsletter Antigravity 2.0 rss

      Description: Agentic IDE.

      What we like: Integrates a VS Code-style editor with a CLI and agent management console. Easily track multiple agent sessions and subagents. Create scheduled tasks e.g. regular dependency updates. Sync between different Gemini / Antigravity clients e.g. chat to CLI. Supports skills, MCPs, hooks.

      What we dislike: No custom themes. Workspace accounts can’t upgrade usage.

    42. 🔗 Console.dev newsletter Fate rss

      Description: Data client for React.

      What we like: Uses async React to enable optimistic UI updates and instant feedback. Provides typed APIs to connect to the data backend over fetch, tRPC, or GraphQL. Also includes adapters for Prisma and Drizzle. Introduces an Actions concept for mutations, but you can use more traditional imperative calls.

      What we dislike: Requires React 19 because this is a modern library.

    43. 🔗 Ampcode News Amp Labs rss

      We are assembling small teams of exceptional software builders to bring the full power of artificial intelligence to a single company per industry and region, with CEO mandates.

      For the companies we partner with: we win if and only if you win. We profit only through warrants unlocked if your stock appreciates considerably. We don't work with your competitors.

      To the best builders out there and to the best companies in the real economy: we'll be in touch.

      Being on the front lines with Amp Labs is how we keep the Amp agent on the frontier. Read more at amplabs.com.

      Amp Labs

    44. 🔗 Ampcode News Rush, 2.0 rss

      We're releasing a new version of our agent mode rush.

      Prior to this change, rush’s usefulness was limited. It was faster and cheaper, but also made more mistakes and required more attempts to get to the same results than a slower and ultimately not that much more expensive frontier model.

      Now, rush is tuned to lean into its advantages — speed, low cost — instead of trying to make up for its shortcomings.

      It uses GPT-5.5 with no reasoning instead of Haiku 4.5. It is tuned for small coding tasks that don’t require contemplating the whole repo, but to find the relevant files, make the smallest correct change, run a focused check, and stop.

      This is what rush is good at:

      • “Fix the failing renders empty state test.”
      • “Update @src/components/ui/Select.tsx to match the focus-ring styling in @src/components/ui/Button.tsx
      • “Rename enableLegacySearch to enableSearchV2 in all files that use it”

      Do not use rush for transient bugs, architecture changes, migrations, complex features, and tasks where you do not yet know what “done” means. In those cases, reading more, thinking longer, and building a larger model of the codebase is what gets you good results. Use smart or deep for those.

      What Changed

      The previous system prompt in rush mode was “speed first.” It told the model to move fast, keep explanations short, edit, verify, and stop. With GPT-5.5, we can be more precise: gather only the context needed to act safely, make the smallest correct change, verify narrowly, and stop. This makes it less prone to save time by skipping the parts that make the result usable and to over-contextualize - to keep reading and thinking.

      rush now uses shell_command for searching, reading, and verification, and apply_patch for edits. That means we can remove quite a few tools that all do almost the same thing - grep, glob, and create_file.

      The task subagents have the same configuration as the main agent: no reasoning, GPT 5.5.

      Evals

      On our internal evals, rush solved 44% of tasks, up from 39% for the previous version.

      The cost moved up slightly: $0.58 per task on average, compared to $0.44 for the previous version (an 18% increase).

      The speed changed much more. Rush 2.0 finished in 1 minute and 32 seconds on average, down from 2 minutes and 59 seconds.

      That is the tradeoff we wanted: a little more expensive, meaningfully more capable, and almost twice as fast.

      It is not deep. On the same evals, deep solved 58% of tasks, 14 points higher than rush.

      Pair It with the Oracle

      The best pattern we have found is rush plus the oracle.

      Let rush build. Ask the oracle to plan, criticize, or review. The oracle is slower and more expensive, but it is read-only and good at adversarial thinking.

      This works especially well for tasks that are still bounded, but not trivial. You know the area of the codebase. You know roughly what needs to change. But there is enough surface area that a second, more deliberate pass can prevent rush from making the locally obvious but globally wrong edit.

      Try prompts like:

      • “Ask the oracle to inspect @src/billing/applySeatLimit.ts, @src/billing/planLimits.ts, and the failing seat limit is enforced after downgrade test. Have it propose the concrete fix first: which behavior should change, which file should own the rule, and what should stay untouched. Then implement the smallest patch and run the billing tests.”
      • “Update the workspace invite flow so expired invites show the same error state in @src/routes/invites/AcceptInvitePage.tsx and @src/components/invites/InviteBanner.tsx. After the patch, ask the oracle to review the diff and suggest the focused tests or manual checks that would actually prove this works. Run the relevant ones before calling it done.”
      • “Before changing the caching behavior in @src/search/useSearchResults.ts, ask the oracle for two or three implementation options beyond the obvious one. Have it judge them in context of the codebase: consistency with the existing query hooks, risk of stale data, complexity, and testability. Then implement the best minimal option.”

      To use it: run mode: use rush in the Amp CLI.

    45. 🔗 muffinman SpaceDeck X is coming to an arcade cabinet rss

      I want your coins!

      I'm making a game. It is called SpaceDeck X and you can try it online. But thanks to Amsterdam Indie Arcade, it will be available on a physical arcade cabinet at Blast Galaxy.

      It will be released on the 14th of June with a small release party and hi- score tournament. If you are in Amsterdam, be sure to come and check it out. It will be available for the next two months, then a new indie game will take its place.

      Poster for the release party with an image of a stylized arcade
cabinet

      Hi-Score Tournament

      We are going to organize a hi-score tournament. The Indie Arcade organizer asked me if I could come up with a fun prize for the winner, so I did:

      Hi score tournament trophy, 3D printed ship from the game on a
stand

      I designed and 3D printed the main player ship from the game on a little pedestal. It was super fun figuring out how to bring my pixel art to the real world and break it down for 3D printing. The model is made in JavaScript using Replicad.

      Come and claim the trophy on the 14th!

      Steam Release

      Screenshot of the boss fight in SpaceDeck X, showing the player ship and
deck, with the large triangular boss ship above it

      The arcade release is just a pit stop. I'm actively working towards a Steam release, so stay tuned!

  4. May 20, 2026
    1. 🔗 IDA Plugin Updates IDA Plugin Updates on 2026-05-20 rss

      IDA Plugin Updates on 2026-05-20

      New Releases:

      Activity:

    2. 🔗 r/wiesbaden WC26 Question rss

      New to the city, is there any special events that happen for the World Cup? The best bars to go watch?

      submitted by /u/FunnyCryptographer38
      [link] [comments]

    3. 🔗 r/LocalLLaMA Re. what ever happened to Cohere’s Command-A series of models? rss

      Re. what ever happened to Cohere’s Command-A series of models? | Hey everyone, Nick Frosst here from Cohere. A few months ago Aidan (my cofounder) left a comment in here about our Command series and how we were working on some more powerful, open-weights models behind the scenes. We just launched Command A+ and we wanted to share it with you guys. TLDR is we built a really efficient model. It’s our first MoE model, which is exciting. There’s obvs work to do on top-line performance but it’s easily looking like one of the fastest and most responsive models in our category. We also pulled off some incredible quantization work so it runs really well on even 1 or 2 GPUs. Like with R7B, we really prioritized making the model practical, so smaller teams and devs could realistically use it to build the kind of agents we ship for our platform customers. That’s also why it’s under Apache 2.0. Just total, near unfettered access to a pretty awesome model. We’re enterprise-first but honestly, we get so much out of our open-source community that makes us more innovative and creative. The feedback you give will almost certainly influence how we think about models and product going forward…... as it already has here from getting called out the last time haha. So, don’t hold back. Share your thoughts, your projects, whatever. You can see the full details here https://cohere.com/blog/command-a-plus We appreciate you :) submitted by /u/nick_frosst
      [link] [comments]
      ---|---

    4. 🔗 r/reverseengineering GeoHelper - Tauri + Chrome DevTools Protocol (CDP) for GeoGuessr (Steam) rss
    5. 🔗 r/LocalLLaMA Qwen will release another 27B with high probability rss
    6. 🔗 r/york Lost/stray cat? rss

      Lost/stray cat? | Does anybody recognise this cat/know if it has an owner? Spotted in the alley next to st Lawrence church. I'm worried she doesn't have a home because there's no collar, she's very skinny and covered in fleas but she seems too friendly to be a stray. I will try to take her to a vet to check for a chip if no one knows anything. submitted by /u/cousarn
      [link] [comments]
      ---|---

    7. 🔗 r/reverseengineering AI Agents defeat obfuscated JavaScript in 10 minutes rss
    8. 🔗 r/Leeds Gardening club for a young teen rss

      My little 13 year old brother will be living in Leeds during the month of June and I've been making a list of ideas of activities he can take part in while here. I want him to spend as much time outdoors and have taken off time from work to spend with him.

      I was wondering if anyone knows of any gardening clubs that he could join. I've looked online and saw a few clubs that are either for adults, aren't taking on any new members or are attached to schools so won't benefit him (he goes to school abroad)

      submitted by /u/boppy78
      [link] [comments]

    9. 🔗 r/reverseengineering What is it Wednesdays: Episode 0002 rss
    10. 🔗 r/LocalLLaMA Waiting on Qwen to drop those 3.7 models be like: rss

      Waiting on Qwen to drop those 3.7 models be like: | Mods please be kind. This was not “low effort”. It took me several minutes to find just the right waiting room gif to capture the sentiment of all us folks patiently waiting for our brothers and sisters in the east to hopefully drop some amazing new models on us.
      I’m hoping for the 27b and 122b models, but I’ll be happy with whatever at this point. We need to see our little Capybara friend make an appearance here soon. submitted by /u/Porespellar
      [link] [comments]
      ---|---

    11. 🔗 r/Leeds LEAD GUITARIST WANTED! rss

      We’re a Leeds-based indie/alternative band looking for a new lead guitarist.

      We’ve recently released a new EP and have built a really solid foundation online. Right now, our focus is entirely on keeping that momentum going. We’re stepping straight into a writing and recording phase to get new material ready for release and for shows. Logistics-wise, we’ve got it sorted: we have our own dedicated rehearsal space, we demo everything ourselves, and we work closely with great producers to bring the songs to life.

      We write music about everyday life and the honest, relatable things people actually experience. We’re ambitious and we take the music seriously, but we also genuinely just want to have fun. Writing and rehearsing shouldn’t feel like a chore; we want someone who wants to have a laugh and enjoy the whole process of building the next phase with us.

      For fans of:

      Deaf Havana / Twin Atlantic / The Xcerts / The Hunna / The Band CAMINO and loads more!

      Who we're looking for:

      We want someone who wants to take the reins lead-guitar wise - bringing big melodies, atmosphere, and a great understanding of dynamics. With a bulk of songs already main stays in our live set, we are looking for a songwriter who genuinely loves the creative process and wants to collaborate on new music from scratch, as sticking their own solid take on our existing material.

      We need someone who is reliable, committed, and doing it for the right reasons. Gigging experience is definitely a bonus, but it’s absolutely not a dealbreaker if playing live is something you are excited for. Leeds or Yorkshire-based is preferred.

      If you're on our wavelength and want to create something exciting, drop us a message. We'll probably chew your ear off and want to know lots about you, like:

      A quick video or audio clip of your playing/writing

      Your main influences

      Any previous projects (don’t worry if you haven't been in a band before)

      Please get in touch and I'll get back to you if this sounds like a good fit!

      submitted by /u/TWKcub
      [link] [comments]

    12. 🔗 earendil-works/pi v0.75.4 release

      New Features

      • Hardened npm install and release path - Pi now ships the CLI with a generated shrinkwrap for transitive dependencies, blocks accidental lockfile changes, verifies dependency pinning and lifecycle-script allowlists in checks, disables lifecycle scripts for self-update and local release installs where supported, and smoke-tests isolated npm and Bun installs before release. See Supply-chain hardening.

      Added

      • Added interactive update notes after pi update runs, so users can see the installed version's changelog before continuing (#4724 by @mitsuhiko).
      • Exported image resize utilities from the package root for SDK consumers (#4775 by @xl0).

      Changed

      • Changed source syntax to avoid TypeScript constructs that require JavaScript emit, keeping core sources compatible with Node.js strip-only TypeScript checks.
      • Removed web UI workspace references from the CLI package and dropped the package-level development watch script.
      • Published npm installs now include an npm-shrinkwrap.json to lock transitive dependencies for the CLI package.
      • Improved terminal theme detection for light/dark and truecolor handling.
      • Changed self-update package-manager commands to disable lifecycle scripts during reinstall.

      Fixed

      • Fixed the system prompt to tell models to resolve pi docs and examples under the absolute package paths before reading topic-specific relative references (#4752).
      • Fixed extension ctx.abort() during tool-call preflight to stop later confirmations and restore queued interactive input like Escape (#4276).
      • Fixed AgentSession retry, compaction, and event settlement to use the awaited agent lifecycle instead of a separate event queue, and added willRetry to agent_end session events.
      • Fixed forked session runtime state to keep the active session id aligned with the fork target (#4799 by @Perlence).
      • Fixed the subagent extension's parallel mode to return useful per-task output and failed-task diagnostics to the parent model instead of 100-character previews (#4710).
      • Fixed Windows local bash execution to hide helper console windows when launched from background SDK processes (#4699).
      • Fixed managed npm extension folders to set cloud-sync ignore metadata where supported (#4763).
      • Fixed HTTP idle timeout configuration so long-running provider streams can avoid premature idle disconnects (#4759 by @mitsuhiko).
      • Fixed default system prompt boundaries to use explicit XML tags for clearer file separation (#4709 by @herrnel).
      • Fixed HTML share/export sidebar clicks for shared tool entries to scroll to the rendered tool call (#4664 by @yzhg1983).
      • Fixed theme palettes to set explicit text colors and avoid terminal-default color drift.
      • Fixed truecolor detection to align terminal image rendering and interactive theme decisions.
      • Fixed loader indicator startup inherited from @earendil-works/pi-tui so initialization cannot run before frames are available.
      • Fixed OpenAI-compatible default output token requests inherited from @earendil-works/pi-ai to avoid reserving impossible context windows on servers such as vLLM (#4675).
      • Fixed OpenAI prompt cache keys inherited from @earendil-works/pi-ai to stay within the 64-character provider limit (#4720).
      • Fixed Windows npm-family package commands for fnm-managed Node.js installs that expose both extensionless Unix scripts and .cmd shims (#4793).
    13. 🔗 r/reverseengineering TinyLoad v5 - encrypted strings, obfuscated opmap, IAT wiping, payload depends on stub (implemented feedback from last post) rss
    14. 🔗 r/reverseengineering Tracing CVE-2026-34472 auth bypass through decompiled ZTE H188A firmware and Lua wizard routing rss
    15. 🔗 r/LocalLLaMA HuggingFace benchmark datasets now let you filter by model size rss

      HuggingFace benchmark datasets now let you filter by model size | Quite useful to see which model under 32B performs best on swebenchverified for example.
      https://huggingface.co/datasets?benchmark=benchmark:official&sort=trending submitted by /u/paf1138
      [link] [comments]
      ---|---

    16. 🔗 Locklin on science Q1/2 2026 books rss

      Getting the best of it by David Sklansky. This is something that’s been in my list of books to read since I got out of grad school. It’s often recommended for getting a quant finance job for the sort of gambling puzzles it contains. Most of the poker stuff is lost on me, as I’ve […]

    17. 🔗 r/york Informal York Queer Meet-Up @ City Screen Picturehouse Café - Friday, 22 May 2026 rss

      Hello!

      We've organised a couple of meetups via Reddit and the /r/york Discord over the last few months.

      We're planning to meet up again at City Screen Picturehouse Café Friday, 22 May 2026. If anyone would like to come along and chill with some queer nerds, you're more than welcome!

      A bit about me: I’m a guy in my mid-30s, into Star Trek, grand strategy gaming, and Wikipedia editing.

      • Where: Cityscreen Café, either on the sofas or at one of the tables at the back!
      • When: 18:30, Friday 22 May 2026 (this Friday!)

      You'll know it's us because we'll have a fluffy rabbit on the table.

      Feel free to reply here, DM me, or message in the Discord if you’re thinking of coming along!

      submitted by /u/NervousEnergy
      [link] [comments]

    18. 🔗 r/Leeds Anyone know where I can buy the spice blend tajin ? rss

      It's a Mexican spice blend used on fruit a lot and I always wanted too try or. I tried b an m, aldi, lidil and Asda with 0 results

      submitted by /u/TipAdditional4625
      [link] [comments]

    19. 🔗 r/Leeds Looking for Germany supporters in Leeds for the World Cup rss

      Hey everyone. I’m looking for fellow Germany fans in Leeds to watch the World Cup matches together.

      Quick context: I’m Indian, been living in Leeds for a while, and somehow ended up supporting Germany. I know, I know. Finding other Germany fans in England is basically a quest at this point.

      If you support Germany for whatever reason, or just want someone to suffer with during the matches, get in touch. Would be great to find a group or even just one or two people to watch the games with.

      Drop a comment or message me. Cheers.

      submitted by /u/Regular-Being7191
      [link] [comments]

    20. 🔗 r/reverseengineering How to build .NET obfuscator rss
    21. 🔗 r/york A classic York sightline 👀 rss

      A classic York sightline 👀 | @ John Wellock submitted by /u/1ChanceChipmunk1
      [link] [comments]
      ---|---

    22. 🔗 r/wiesbaden Panini WM 2026 Sticker Tauschbörse rss
    23. 🔗 r/Leeds Is this permanent? Did we run out of money for the station project? rss

      Just feels weird. We've been waiting nearly two years to repave that stretch of road, with it being half done all that time. Unless it's some kind of temporary covering? Anyone have any idea?

      submitted by /u/TheScarletCravat
      [link] [comments]

    24. 🔗 The Pragmatic Engineer Google Cloud deletes Australian trading fund’s infra rss

      A $124B fund in Australia would have lost all data stored with Google Cloud, had they not relied on a third-party backup. A rare blunder from GCP, where regional replication did not stop the deletion - and a just as rare statement from Google Cloud's CEO taking the blame.

      The below is an excerpt from The Pulse #93: OpenAI makes Google dance , originally published on 16 May, 2024. I am republishing it because on 20 May 2026 Google Cloud has done it again: they took offline cloud infra provider Railway by blocking Railway 's Google Cloud account . The below is a warning: if you are on GCP, have a plan B, should GCP delete your account and data, or block your account.

      Following on from Google Cloud being a distant third among cloud providers, a recent event could cement its reputation as the least reliable of the top three.

      UniSuper is one of the largest retirement savings accounts in Australia, used by 615,000 citizens, that's also known as a "superannuation fund." UniSuper has $124B of assets under management and is one of the biggest in the country.

      On 29 April, the service suffered an outage. Members could not log into their online accounts, or manage their funds until two weeks later, on 15 May.

      The reason was that Google Cloud accidentally deleted UniSuper's subscription, which also deleted all data associated with the subscription. UniSuper had set up replication across two regions in Google Cloud to protect from a regional failure, but Google Cloud deleted the replica as well!

      UniSuper could only avoid data loss thanks to having a backup on another service provider outside Google. In a surprising admission, UniSuper would have lost all data with Google thanks to the failure of the cloud provider. The only reason UniSuper could restore services was by having another provider with whom they'd backed up the data. Basically, UniSuper not trusting Google's replication across two regions turned out to be a 100% correct assumption. Whoever pushed through the decision to spend additional resources in "a backup in case Google fails" saved the day at the retirement fund.

      The incident is incredibly embarrassing for Google. UniSuper seems to have forced Google Cloud's hand by issuing a joint statement with Google Cloud CEO Thomas Kurian, in which Google Cloud takes all the blame for this failure. In my experience, the situation is rarely this black-and-white, as it usually takes two parties to cause such a major outage. I would not be shocked if it turned out UniSuper's staff played a role in this failure, but Google Cloud made enough mistakes that the press release could dump all blame on it. I asked Google Cloud if the press release really was a joint release, and if they had more to add. The company confirmed the press release is correct and added nothing else.

      Whoever was at fault, two weeks of downtime is still very long for a major fund. As I understand, the damage to UniSuper is mainly reputational because the funds are safe and secure.

      Users could not see their balances for a few weeks, and were told Google Cloud had messed things up. This means there are up to 615,000 Australians in whose minds UniSuper and Google Cloud are indelibly linked with unreliability.

      I keep seeing that Google Cloud has no apparent strategy for what it wants its cloud to offer. A few months ago, we dived into how AWS, Azure and GCP respond to regional outages, and I concluded it's hard to see a strategy at GCP beyond following processes, while doing the least impressive job of all three cloud providers. It's hard to gain market share if you remain the slowest to respond to regional outages, and the provider for whom a zone outage takes down a region, or which loses all customers' data, despite regional replication, by deleting it.

      This incident is a reminder you shouldn 't fully trust your cloud provider. UniSuper was smart to have backups elsewhere for its data in Google Cloud. And while it's tempting to point fingers at Google Cloud: there are no definite assurances that another vendor would not make a similarly unprecedented mistake in the future!

      The learning is that if you have really valuable data, keep a backup somewhere else. If you use any cloud provider, use another cloud, on-prem backups, or something else.

      Read the full The Pulse issue

    25. 🔗 r/wiesbaden Looking for Tattoo artist rss

      I need someone who has a love for Tattooing and is really good at it!! I’m willing to pay for what I get just need the confidence I’m in good hands 🙏🙏

      submitted by /u/GuavaCool4628
      [link] [comments]

    26. 🔗 r/wiesbaden Kurhaus wird zur Open‑Air‑Bühne für neue Eventformate rss

      Neben mehreren Konzerten des Rheingau Musik Festivals prägen moderne elektronische Daytime‑Events das Programm und erweitern das Angebot um urbane Veranstaltungsformate.

      submitted by /u/LethisXia
      [link] [comments]

    27. 🔗 r/Yorkshire You can tell exactly where they are from rss

      You can tell exactly where they are from | submitted by /u/RedDevilPlay
      [link] [comments]
      ---|---

    28. 🔗 r/LocalLLaMA Qwen3.7 Max scored by Artificial Analysis, 27B/35B waiting room rss

      Qwen3.7 Max scored by Artificial Analysis, 27B/35B waiting room | https://preview.redd.it/42ak5qmus82h1.png?width=1133&format=png&auto=webp&s=744ea3dfc06c83d0c4d8aa128c39b3238b17d7be Qwen 3.7 Max sitting at 5th, pretty much on par with GPT 5.4 (xhigh) and a notch above the just released Gemini 3.5 Flash. On the other end, we see DSV4 Flash and Qwen3.6 27B which is exactly 6 points behind its max counter part. Let's hope Qwen3.7 can get in the same ballpark of its max big bro as well. submitted by /u/Beamsters
      [link] [comments]
      ---|---

    29. 🔗 HexRaysSA/plugin-repository commits sync repo: +2 releases rss
      sync repo: +2 releases
      
      ## New releases
      - [ida-settings-editor](https://github.com/williballenthin/ida-settings): 1.1.1, 1.1.0
      
    30. 🔗 r/Leeds Landlord Conference Leeds rss

      Please can you all return from whence you came because the pub quizzes are all cancelled and the pub queues are streaming down the road and we don’t really like landlords much normally anyway

      submitted by /u/marinasambhi
      [link] [comments]

    31. 🔗 anthropics/claude-code v2.1.145 release

      What's changed

      • Added claude agents --json to list live Claude sessions as JSON for scripting (tmux-resurrect, status bars, session pickers)
      • Added agent_id and parent_agent_id attributes to claude_code.tool OTEL spans, and fixed trace parenting so background subagent spans nest under the dispatching Agent tool span
      • Status line JSON input now includes GitHub repo and PR information when detected
      • /plugin Discover and Browse screens now show a plugin's commands, agents, skills, hooks, and MCP/LSP servers before installation
      • claude agents terminal tab title now shows the awaiting-input count so an alt-tabbed window tells you when an agent needs attention
      • Slash command and @-mention suggestion list now supports mouse hover and click in fullscreen mode
      • Stop and SubagentStop hook input now includes background_tasks and session_crons fields
      • Fixed a permission-prompt bypass where bare variable assignments to non-allowlisted environment variables in Bash commands were auto-approved
      • Fixed MCP prompt slash commands showing raw server validation errors when a required argument is omitted — the error now names the missing argument and shows expected usage
      • Fixed the spinner and elapsed-time display freezing until a keypress after the terminal was resized or refocused
      • Fixed the cross-project resume hint failing in default Windows PowerShell 5.1 — Windows now uses ; as the command separator
      • Fixed voice push-to-talk not working in the agent view's reply pane
      • Fixed task lists rendering in random order when several tasks are created at once
      • Fixed stale "Failed to install Anthropic marketplace" banner showing when the marketplace is already installed
      • Fixed the PR badge in the footer not updating immediately after gh pr create and other PR-state-changing commands run in-session
      • Fixed Agent Teams teammates with non-ASCII names failing every API call due to invalid header encoding
      • Fixed /review using a deprecated projectCards GraphQL query that errored on repos with Classic Projects
      • Fixed claude plugin validate not flagging skills: entries that point at a file instead of a directory — the error now suggests the parent directory
      • Fixed an infinite loop where a skill using context: fork could repeatedly re-invoke itself instead of running
      • Improved the Read tool to return a truncated first page with a "PARTIAL view" notice instead of a hard error when a whole-file read exceeds the token limit
    32. 🔗 Stephen Diehl Book Review: On the Calculation of Volume rss

      Book Review: On the Calculation of Volume

      Solvej Balle's On the Calculation of Volume is a planned septology about a Danish antiquarian book dealer who falls out of time, and the first five volumes are one of the most original and brilliant literary projects I've read in years. The premise is the one you have seen a hundred times. The protagonist, Tara Selter, wakes up on the eighteenth of November. The day passes. She goes to sleep. She wakes up. It is the eighteenth of November. Her husband Thomas, who lives with her in a stone house in northern France, has no memory of the previous iteration. She does. It takes a familiar science fiction idea and makes it feel fresh, intimate, and deeply human. I read all five over a week in San Sebastian, sitting in the bright Atlantic light of the Basque coast while reading about a woman who can't leave a single grey rainy day in northern France, and the books were only better for the contrast. Mild spoiler warning: I'll describe the shape of each book but not its turns. Skip to the bottom if you want to come to the cycle clean.

      The first volume is the small one, around two hundred pages, minimalist in both plot and prose. The minimalism is the point. Tara has returned to Clairon-sous-Bois from a book fair in Paris with a small burn on her hand from a hotel heater and a Roman sestertius in her bag, and we meet her on day one hundred and twenty-two of the loop. By then she has the day memorized to the second. The blackbird sings at the same instant every morning. The cup is where she left it. Thomas, beautifully indifferent to the cosmological catastrophe he is sleeping through, asks her about her trip. She tells him. He listens. He has listened a hundred and twenty-two times. There is something sisyphean about a marriage where one of you has to begin the conversation again from scratch every morning. The writing here is the kind of plain prose that takes a whole career to learn how to write. Short sentences. Present tense. Almost no metaphor. A naturalist's field notebook, kept by someone who has begun to understand that the field is closing in. Barbara J. Haveland's English translation is so unobtrusive you forget the book was written in another language. Volume I is a phenomenology textbook in the disguise of a novel, and the disguise is so good that the textbook keeps surprising you with feeling.

      A year passes inside the day, and in the second volume Tara goes traveling. She has worked out by then that the eighteenth restarts wherever she happens to be sleeping, so she can take the loop with her. She rides trains. She crosses Europe. She follows snow up to Norway and crepuscular light down to the south, anything that might serve as evidence of the season she has been denied. The trick of Volume II is that it is a travelogue turned inside out. The world is supposed to be the still backdrop against which the traveler moves. Here the traveler is the still one. She is the same November eighteenth wherever she goes. It is the world that keeps shifting under her, a palimpsest written and overwritten on the same Wednesday, and the shifts are rendered so attentively that the book becomes a slow, hallucinatory survey of how light behaves in different latitudes when the same day is happening to it. The sestertius travels with her, opening into a lovely tangent about the Roman empire and the routes its money once took, and by the end of the book Tara's senses have sharpened to a pitch where the prose itself begins to breathe differently. The world, she writes, is whispering in a new language. Her husband, who appears in this volume mostly as someone she telephones from foreign hotels, has begun to feel the strain of being loved by a woman who is aging at a rate his calendar refuses to acknowledge.

      And then, in the third volume, the project does something nobody saw coming. Tara meets someone else. His name is Henry Dale. He is a sociologist. He has been inside the day longer than she has, and he has a young son in America whom he visits every loop at his ex-wife's house. Imagine being four years old and meeting your father every morning, knowing he is the same and knowing also that he carries with him a freight of time you cannot see. The book never over-stresses the heartbreak, letting it sit the way it lets everything sit. Tara and Henry try to figure out what they are to each other. The volume is, in part, about how dignified people behave when the universe has made them, against their will, into a liminal society of two. Then Olga arrives, with her plan to reorganize the loop into a fairer society. Then Ralf, with his plan to spend each iteration of the day stopping every preventable accident on the planet. The four of them have nothing in common except the day, and the novel is too honest to pretend that the day is enough. The marriage with Thomas has by now become the book's quietest engine of dread. Tara is older. Thomas is not. Every morning he wakes up younger than the woman who has come home to him.

      By Volume IV they have moved into a big house outside Bremen, and the four have become fifty. Volume IV does something I have rarely seen at this scale in serious literary fiction. The singular voice breaks. The careful "I" of the first three books gradually, and then unmistakably, becomes a "we," and the book begins to read like extended meeting minutes from the most interesting commune ever convened. The residents argue about everything. They argue about what to call themselves. They argue about whether the day should be measured from sunrise or from the moment of arrival. They argue about food, because food consumed inside the loop is gone from the loop forever, and a population of fifty is a meaningful pull on a finite breakfast. They argue about healthcare in a world where every wound resets at midnight. They argue, in other words, about the load-bearing architecture of any society, and they argue at a pace and an articulacy that is recognizably the kind of conversation that only happens when people have nothing to lose and everything to figure out. The whole project is apophatic, an attempt to build a vocabulary for their condition by exhaustively naming what it is not. The volume keeps the metaphysics inside the kitchen. The questions about language and identity never float free of the bread. Someone is always doing the dishes. The book ends on a hinge I will not describe, except to say that it earns the turn.

      Volume V is the settling. The exhilaration of Volume IV gives way to something stranger and gentler, the texture of a second life slowly making itself plausible. The community has habits now. Some of the loopers have begun to write. Some have begun to teach. Some have figured out, the way people figure out anything important, that you can build a tolerable existence on a foundation of repetition if you stop arguing with the foundation. New arrivals appear at the door, and the work of welcoming them, of explaining the day to a stranger who has just discovered they are inside it, becomes a kind of vocation. The central insight of the cycle, after five books, clarifies itself. The project is the great novel of dailiness. Joyce gave us one Dublin day at six hundred pages of close attention. The series is the same Wednesday written eleven hundred times over, and somehow still not done. Not a novel that contains daily life among its themes. A novel about the daily as such. The eighteenth of November is the prosaic distilled into philosophy. Mornings. Bread. Light at a window. The same conversation begun gently for the thousandth time. What a life is, these five volumes suggest, when you take away the future and you take away the past, and you are left with the present examined at the resolution of a Vermeer. Book VI arrives in May 2027, with one more to follow. The engine, after five books, shows no sign of fatigue, and the project keeps getting larger by getting smaller.

      I recommend these books to anyone who keeps a notebook and wants a beautiful, quiet, understated meditation on life wrapped in metaphysical curios. Anyone who has written down what the morning light looked like on a particular Wednesday and felt slightly embarrassed about doing it. Anyone whose work involves going back to the same thing over and over until it finally starts to make sense. If you have ever caught yourself cataloging the way your kitchen table looks at six in the morning and felt something that was neither boredom nor revelation but a third thing, calmer than both, then Solvej Balle has written the books you did not know were possible, and she has written five of them and is still going. They are, sentence by sentence, some of the most beautiful prose being published anywhere right now. They are also, taken together, a serious and unembarrassed meditation on time, on selfhood, on what a person is when she is no longer accumulating history, and on what a marriage is when only one of you is aging into it. Tara cannot leave the eighteenth of November. None of us can leave today either. Eternal recurrence treats this as a test. The absurd treats it as a climb. Balle treats it as a practice. The prosaic, attended to, is the depth. The repetition, accepted, is the meaning. The measure of a life is one you would say yes to twice, and these books leave you wondering whether her one day, lived a billion times, is really so different from our own lives.

    33. 🔗 Drew DeVault's blog New blog design rss

      I redesigned my blog! I decided to put some more personality into it this time, after over a decade of the minimalist style. This short post is just an excuse to show up in your feed reader so you can go look at it. Cheers!

      Also: I’m trying out fedi again. You can find me here: @drew@freebitcoin.gay.