- ↔
- →
to read (pdf)
- I don't want your PRs anymore
- JitterDropper | OALABS Research
- DomainTools Investigations | DPRK Malware Modularity: Diversity and Functional Specialization
- EXHIB: A Benchmark for Realistic and Diverse Evaluation of Function Similarity in the Wild
- Neobrutalism components - Start making neobrutalism layouts today
- May 24, 2026
-
🔗 r/wiesbaden Bäckerei Dries hat Sonntagspreise rss
Der einzige Laden der am Sonntag teurer ist wie unter der Woche ist Bäckerei Dries. Angesichts dessen dass das so niemand sonst macht ist das eine Unverschämtheit.
Edit: mir ist schon klar dass die Mitarbeiter am Sonntag einen höheren Lohn haben.
Aber warum macht das sonst kein Laden, warum macht das nur Dries?submitted by /u/Loko21784
[link] [comments] -
🔗 r/reverseengineering GitHub - iss4cf0ng/OpenPetya: A Proof-of-Concept bootkit inspired by Petya ransomware, written in Assembly, C, and C++ rss
submitted by /u/AcrobaticMonitor9992
[link] [comments] -
🔗 r/Yorkshire Surprise Trip to York or Leeds rss
I was involved in a car crash on the way to Edinburgh, fortunately there were no serious injuries for any parties involved but we currently find ourselves stranded at a service station on the A1M between Leeds and York.
Because of the bank holiday getting a courtesy car may take a few days, we have spoken to the hotel chain we are booked in at Edinburgh they have branches in Leeds and York and have allowed us to transfer our booking because of the extenuating circumstances.
I'd like to ask the good people of Yorkshire their advice on which direction to go in and what each of your great cities have to offer someone who is having a pretty shit weekend away that need recovering.
Bonus points for restaurant recommendations.
Thanks in advance for all of your help.
submitted by /u/Spoonsforhands
[link] [comments] -
🔗 r/Yorkshire Screenshots of the tattoos of Reform Councillor Andy Arnold in close-up detail rss
submitted by /u/johnsmithoncemore
[link] [comments] -
🔗 backnotprop/plannotator v0.19.22 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.19.21 | Ask AI in plan review and annotate mode, shared AI runtime, origin-aware provider defaults
v0.19.20 | Interactive goal setup UI, OpenCode submit_plan fixes, browser no-op sentinel handling for Claude agents
v0.19.18 | Edit-based submit_plan for OpenCode, Pi namespace migration, Codex annotate-last fix, OpenCode commands dir fix
v0.19.17 | Reworked goal setup skill (interview-driven flow), CLI --version flag
v0.19.16 | Code navigation with peek view (Cmd/Ctrl+click tokens in diffs)
v0.19.15 | Commit-based diff base, jj evolution diffs, GitLab reliability fixes, OpenCode command intercept fix
v0.19.14 | Visual explainer skill update, PFM code-file hover previews, Graphviz, diff tab size and line bg intensity, hooks settings tab
v0.19.11 | Jujutsu (jj) VCS backend, slimmer hunk separators, collapse viewed files, multi-line gutter selection fix
v0.19.9 | OpenCode user-managed workflow, Pi model switch fix, Codex skill install, shimmer removal
v0.19.8 | 49 themes with syntax highlighting, keyboard shortcut registry, smart code-file path validation, remote URL notifications
What's New in v0.19.22
v0.19.22 fixes Safari clipboard handling in plan review and adds support for custom Claude config directories. Two PRs, one closing a community feature request.
Safari Copy Fix in Plan Viewer
Cmd+C (or Ctrl+C) was silently failing in Safari when copying selected text from the plan viewer. Two things combined to break it: web-highlighter clears the DOM selection on mouseup (so the browser has nothing to copy by the time the keyboard shortcut fires), and Safari rejects async
navigator.clipboard.writeText()calls outside the synchronous user-gesture window.The fix replaces the
keydownhandler with a nativecopyevent listener that callse.clipboardData.setData()synchronously. This works across all browsers. On touch devices where keyboard copy is less common, the toolbar's copy button remains visible and uses anexecCommandfallback for extra safety.Support for CLAUDE_CONFIG_DIR
Session log discovery for
plannotator lastnow reads theCLAUDE_CONFIG_DIRenvironment variable when resolving thesessions/andprojects/directories. Users who relocate their Claude Code config directory (common in container and multi-user setups) no longer need to work around hardcoded~/.claude/paths. When the variable is not set, behavior is unchanged.
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run
/pluginin Claude Code, find plannotator , and click "Update now".OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in
opencode.json:{ "plugin": ["@plannotator/opencode@latest"] }Pi: Install or update the extension:
pi install npm:@plannotator/pi-extension
What's Changed
- Fix copy (Cmd+C) broken in Safari on plan viewer by @backnotprop in #785
- fix: honor CLAUDE_CONFIG_DIR in session log discovery by @backnotprop in #786
Community
@BenNewman100 filed #783 requesting support for
CLAUDE_CONFIG_DIRin session log paths, which ships in this release.Full Changelog :
v0.19.21...v0.19.22 -
🔗 r/wiesbaden Best Massages rss
Hey M19 who works out a lot looking for a great place to get full body massages around the Wiesbaden area!!! What’s yalls recommendations 🙏👏
submitted by /u/GuavaCool4628
[link] [comments] -
🔗 HexRaysSA/plugin-repository commits sync repo: +1 release rss
sync repo: +1 release ## New releases - [vtable-context-tools](https://github.com/oxikkk/ida-vtable-tools): 1.1.0 -
🔗 r/reverseengineering Reverse engineering circuitry in a Spacelab computer from 1980 rss
submitted by /u/tnavda
[link] [comments]
-
- May 23, 2026
-
🔗 IDA Plugin Updates IDA Plugin Updates on 2026-05-23 rss
IDA Plugin Updates on 2026-05-23
New Releases:
Activity:
- atelier
- 73b51a77: Merge pull request #27 from atelier-runtime/cc
- 3a6bf44e: docs(state): record phase 1 context session
- ce77c4d3: docs(01): capture phase context
- 315f46e8: docs: create milestone v1.0 roadmap (5 phases)
- 0e8a66ec: docs: define milestone v1.0 requirements
- f6aa31c9: docs: start milestone v1.0 Atelier Token-Cost Reduction
- 454bd5ac: benchmarks: close remaining pending substitution rows
- 1e124eb0: docs: refresh search/grep measured benchmark rows
- 2e70b0dc: code: expand route extraction patterns
- 57542e75: code: stabilize explore budget packing
- 47c360e2: code: expose autosync counters in status
- 27cbe7a3: code: implement debounced autosync reindex
- dc702e6c: benchmarks: add code routes A/B fixture
- 9f9608c3: Merge pull request #26 from atelier-runtime/cc
- 18269d1a: code: add provider freshness warnings to status
- 50b70a54: code: scaffold autosync status surface
- be202749: code: add routes op to code MCP
- 63733996: code: enrich status payload diagnostics
- 412db648: benchmarks: add code files/explore A/B fixtures
- FileAnaAssistant
- ida-func-call-rank
- a07aadd5: Add malware triage use cases to README
- f68beb7a: Add badges (License, IDA Pro compat, IDAPython, latest tag) to README
- 87363c2c: Sync Japanese spec with implemented Recursive/Unknown columns
- 70c8725d: Address review #1 (title sync) and #2 (missing chooser columns)
- c14f17b8: Address review findings: stale view, install order, license
- f5465184: Drop toy.c sample; rely on the Emotet screenshot as the demo
- 71baafc7: Initial commit: ida-func-call-rank MVP
- space-reversing
- c2e26f7e: Add sta6-pyr2-nyx5 DGS territory config and update existing territories
- Spectra
- 2b41ca80: Fix XREF_NEAR compatibility in ai_features.py
- fd2f650a: Create skill.md
- 849928ae: Fixed some bugs
- 411548ec: Fix generate_disasm_text compatibility across all tools
- df554238: Fix IDA Pro 9.x XREF API compatibility
- d68e25f7: Add DPI scale override via environment variable and increase base fon…
- 7d8ee37d: Add auto-install for anthropic package and DPI debug logging
- df3eda0c: Updated GUI
- a4e4b3d4: Updated GUI
- 292ab8cd: Install Anthropic SDK in installer scripts
- e8ce9c56: Add Windows ARM64 detection and pip handling
- atelier
-
🔗 r/Yorkshire Big up Yorkshire rss
| submitted by /u/Britishsheffield
[link] [comments]
---|--- -
🔗 r/wiesbaden Wo spontan grillen in Wiesbaden (ohne Anmeldung)? rss
Hi zusammen! Meine Freundin und ich wohnen am Dotzheim (Daimlerstraße) und wollen zum ersten Mal draußen grillen. Wir haben einen eigenen kleinen Grill mit Standbeinen.
Da wir spontan sein wollen, suchen wir Plätze, an denen man keinen Termin vorab online buchen muss.
Stimmt es, dass man im Kulturpark hinter dem Schlachthof einfach so mit eigenem Grill grillen darf? Gibt es dort einen bestimmten Bereich?
Habt ihr ansonsten noch coole Tipps in der Nähe oder am Rhein (z.B. Biebrich/Kastel) für ein entspanntes Grillen zu zweit ohne Anmeldung?
Danke euch! 🙏submitted by /u/Orph3us_151
[link] [comments] -
🔗 r/york Best Catholic Church? rss
Hi! I was raised Roman Catholic, and as a student in York I've missed the frequent religious involvement I underwent for the first 18 years of my life.
Which Church would be best for a quiet weekday mass where I can just sit at the back and contemplate religion and life while listening without worrying about having to interact with people much?
Any suggestions are greatly appreciated!
submitted by /u/SamTheDystopianRat
[link] [comments] -
🔗 r/Leeds Does anyone know if i can and if so where I can get free period products in ls14 area? rss
Hey hope this is OK. Recently lost my job due to disability. That time of the month and have nothing in the bank. I hate stuff like this. I have been using toilet paper tbh but i also have run out
submitted by /u/blvdbrokendreams
[link] [comments] -
🔗 r/york Desperate for a job rss
Hi, I’m currently working in the legal sector and I genuinely despise my job. Would anyone know anywhere hiring full time or part time ish hours? I just want to be able to pay my rent till I figure things out.
I have experience in admin for an accounting and law firm. I’ve also got lots of retail experience.
If anyone has any leads I would be super super grateful. I have been applying loads but just keep getting rejections :(
TIA
submitted by /u/Smart_Apricot_9735
[link] [comments] -
🔗 r/Harrogate Lost glasses rss
My friend lost her varifocals on the Stray during park run today. If you find them we’d be grateful for their return
submitted by /u/Cliver84
[link] [comments] -
🔗 r/reverseengineering Open-source reverse engineering of PerimeterX (HUMAN Security) Web SDK — pure-algo cookie generators, dual-site live HTTP 200, 10-chapter methodology rss
submitted by /u/Shenpan_waterbili
[link] [comments] -
🔗 r/Harrogate Paddling pool rss
Hi, hope you're all enjoying the sun!
Thinking about what to do with my children (5 and 6) on monday and wondered if anyone knew whether or not the paddling pool in the park had water in yet?
submitted by /u/Chronic_Eyeroller_
[link] [comments] -
🔗 r/wiesbaden Karten für S Festival heute am Kurhaus rss
Braucht noch jemand ne Karte? Hätte zwei, bin mir aktuell nur noch nt sicher ob ich eine selbst benutze. Also wenn jmd sucht, meldet euch
https://www.vibrancy-music.com/events/vibrancy-at-kurhaus-wiesbaden
submitted by /u/paulchen27
[link] [comments] -
🔗 r/york Lovely views across York this afternoon rss
| Town may be heaving and not always in a good way, a combination of races, first weekend of half term, bank holiday weekend and the usual hen/stag do’s, but from up here the views are lovely and peaceful. Guess I don’t have to say where I am… submitted by /u/dosguy76
[link] [comments]
---|--- -
🔗 r/york Lovely walk around Rowntrees park and the Terrys chocolate factory rss
| Taken with my Lumix G9ii, PL12-60 and PL9 lenses. submitted by /u/DentistKitchen
[link] [comments]
---|--- -
🔗 r/Leeds Leeds to Manchester Commute via trains rss
I work in Manchester and my partner has work in york. Currently we are living in two separate cities i.e where we work and it has costed us a lot. We are planning to find a place in leeds near the train station so that we can commute to the two cities for our jobs. His commute is shorter while mine would take an average of 47 mins to 1 hour considering I take the transpenine direct train to Manchester Victoria.
Is anyone in the same situation and can advise? My work place has fairly strict attendance and time rules. I will go hybrid from September hopefully (2 days WFH). Can anyone give genuine advice on how workable the situation is or if anyone is in the same boat and can provide some tips?
submitted by /u/CapriChaos11
[link] [comments] -
🔗 r/york This little guy was hanging out opposite York St. John this morning rss
| submitted by /u/SavingsMap2506
[link] [comments]
---|--- -
🔗 earendil-works/pi v0.75.5 release
New Features
- Cleaner read tool output - Collapsed
readtool cards now show only the read line by default, whileCtrl+Ostill 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 updateand 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.forceAdaptiveThinkingsupport 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
koffidependency 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 updateto 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-handlerdependency 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).
- Cleaner read tool output - Collapsed
-
🔗 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] -
🔗 r/Yorkshire The Reform councillor for Wombwell has some interesting tattoos.. rss
| submitted by /u/johnsmithoncemore
[link] [comments]
---|--- -
🔗 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.
-
- May 22, 2026
-
🔗 IDA Plugin Updates IDA Plugin Updates on 2026-05-22 rss
-
🔗 r/LocalLLaMA NVIDIA Removes Gaming Revenue Category From Financial Reports rss
submitted by /u/HumanDrone8721
[link] [comments] -
🔗 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] -
🔗 r/Yorkshire Some more from YWP rss
| 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]
---|--- -
🔗 r/reverseengineering CTF with AI/LLM reverse engineering angles - intercepting streamed responses, replaying tokens, finding hidden endpoints (June 17-22) rss
submitted by /u/HighnessAtharva
[link] [comments] -
🔗 r/york Mega Empires - York rss
| 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]
---|--- -
🔗 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] -
🔗 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] -
🔗 r/Yorkshire Pub BBQ In Collingham rss
| Needless to say, I scoffed a burger like a dog might. submitted by /u/Pitiful-Hearing5279
[link] [comments]
---|--- -
🔗 r/reverseengineering Rebuilding Zyxel’s super-admin password flow in HTML from firmware/runtime notes rss
submitted by /u/TheReedemer69
[link] [comments] -
🔗 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] -
🔗 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] -
🔗 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] -
🔗 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] -
🔗 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
-
🔗 r/york Snowdrops at St mary’s abbey 🫶 rss
| @ Sue Gabbatiss submitted by /u/Juicewithextrapulp
[link] [comments]
---|--- -
🔗 livestorejs/livestore v0.4.0-dev.27 release
Release 0.4.0-dev.27
-
🔗 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
| submitted by /u/StephenMcGannon
[link] [comments]
---|--- -
🔗 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] -
🔗 r/Yorkshire Kirklees Reform councillors admit to not understanding how councils work at failed meeting to elect leader rss
| submitted by /u/johnsmithoncemore
[link] [comments]
---|--- -
🔗 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] -
🔗 r/reverseengineering Reverse Engineered Google reCAPTCHA rss
submitted by /u/Dapper-Profession552
[link] [comments] -
🔗 r/LocalLLaMA When your LLM treats data center GPUs like an optional DLC rss
| submitted by /u/noprompt
[link] [comments]
---|---
-
- May 21, 2026
-
🔗 IDA Plugin Updates IDA Plugin Updates on 2026-05-21 rss
IDA Plugin Updates on 2026-05-21
New Releases:
Activity:
- capa
- distro
- 19eb65c5: Update Ghidra PPA source to 12.1
- FileAnaAssistant
- hrtng
- ac5cb4f1: * Fix crash on "Decompile obfuscated code Alt-F5", fix proc deletion…
- ida-pro-mcp
- c92625ee: Merge pull request #422 from NeKroFR/fix-open-file
- ida-x64dbg-mcp
- 8adcc629: Simplify IX64MCP installer and release path
- ida_mask_plugin
- c1881a74: Refactor
- playlist
- 074be6f1: mine
- rapida-python
- 99588bd3: feat: loosen dependencies
- space-reversing
- 1cd3ccf5: Add Frida script for Diffusion RPC analysis and payload decoding
-
🔗 r/Harrogate Join our WhatsApp rss
| Join here https://chat.whatsapp.com/BQsgpUsra06HXqdEvuQKbq?mode=gi\_t submitted by /u/Complete-Gain4571
[link] [comments]
---|--- -
🔗 earendil-works/pi v0.74.2 release
Fixed
- Fixed
pi updateon 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.
- Fixed
-
🔗 @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 futureRead all about it here:
https://hex-rays.com/blog/ida-turns-35-lets-celebrate-together -
🔗 3Blue1Brown (YouTube) Tie random ends: How many loops? rss
Recent puzzle solutions on Patreon: https://members.3blue1brown.com/posts/158885046?pr=true
-
🔗 Hex-Rays Blog Celebrating 35 Years of IDA rss
-
🔗 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 ticketsAnd 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] -
🔗 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] -
🔗 r/york Mayor Making rss
| 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]
---|--- -
🔗 r/LocalLLaMA Waiting for Qwen 3.7 open weight... The new King has arrived... rss
| The hype is real! https://qwen.ai/blog?id=qwen3.7 submitted by /u/LegacyRemaster
[link] [comments]
---|--- -
🔗 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:
- datasette-agent-charts, shown in the video, adds charts to Datasette Agent, powered by Observable Plot.
- datasette-agent-openai-imagegen adds an image generation tool to Datasette Agent using ChatGPT Images 2.0.
- datasette-agent-sprites provides tools for executing code in a Fly Sprites persistent sandbox.
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
uvone-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.
-
🔗 r/reverseengineering Post-Quantum Cryptographic Algorithm Examined in Developmental Ransomware rss
submitted by /u/MalRE429
[link] [comments] -
🔗 r/Yorkshire Catherine Connolly: Irish president finishes first official visit to Leeds rss
| 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]
---|--- -
🔗 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
- Add Interslavic language #10538 @Anne-SophieW
- Macedonian (and others) not showing Cyrillic transliteration #10508 @ashemedai
- Translate is removing newlines from input #10442 @carl
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's Small Web is Wonderful
- Daring Fireball - Kagi Snaps
- Kagi: Good Enough to Leave Google (search)
- William Roth - Tools I Trust: Kagi and Orion
- MacSparky - Still on Kagi, Still Happy
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.
-
🔗 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
-
🔗 r/Yorkshire Some Lions at YWP rss
| Some lions from today. submitted by /u/Icy_Ebb_6862
[link] [comments]
---|--- -
🔗 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] -
🔗 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
submitted by /u/Cuber2113
[link] [comments] -
🔗 r/Yorkshire Then and Now rss
submitted by /u/Still_Function_5428
[link] [comments] -
🔗 r/Leeds Cheap activities to do around town rss
Hiya, just wondering what are some good activities to do in / around town. I've lived in Leeds for the past 2 years basically and have done some exploring, but in regards to actual activities to do, I haven't found much, or they are just way to expensive.
I would some shops (such as sewing, pottery, glassmaking, really anything artsy, or ice skating, horse riding, cocktail class etc). Any recs would be appreciated!
submitted by /u/Weoweo9
[link] [comments] -
🔗 r/Yorkshire Well, that's a bit worrying - I hope the people who voted Reform are happy though. rss
submitted by /u/johnsmithoncemore
[link] [comments] -
🔗 r/reverseengineering CVE-2026-40369: Twelve Bytes to Escape the Browser Sandbox rss
submitted by /u/Void_Sec
[link] [comments] -
🔗 r/york lovely green walk after the rain :) rss
| humid and smells lovely and pretty quiet submitted by /u/whtmynm
[link] [comments]
---|--- -
🔗 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] -
🔗 @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
-
🔗 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:
- https://www.emacswiki.org/emacs/RaymondZeitler (config is out of date)
- https://www.linkedin.com/in/raymondzeitler/ : Electrical Engineer | Electronic RF Components | Scripting & Automation | US Defense and Aerospace~ Modernizing your company’s legacy design tools
- Acting Historian, IEEE Connecticut Section
- https://codeberg.org/ZeitRa
- The rest of his Internet presence is either private (Facebook) or anonymous (two blogs, Github and Gitlab, Mastodon, Bluesky).
- Writing Calendar Files (GNU Emacs Manual) - cal-tex-cursor-week-iso
- elisp/next-spec-day.el at master · chenfengyuan/elisp · GitHub
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
Transcript0:00 OpeningSacha: 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 IntroductionSacha: 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 workflowsRaymond: 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 switchRaymond: 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-floatRaymond: 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 titlesSacha: 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-floatRaymond: [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 SCHEDULEDRaymond: 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
Raymond: 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
Raymond: 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
Raymond: 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 peopleRaymond: 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 houseRaymond: 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, buffersRaymond: 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
Raymond: 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 commandsRaymond: 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
Raymond: 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 statesRaymond: 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
Raymond: 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
Raymond: 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 clickRaymond: 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: VivaldiRaymond: 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-wordsRaymond: 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-linkSacha: 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 EmacsRaymond: 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 EmacsSacha: 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 namesRaymond: 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 maintenanceSacha: 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 meSacha: 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 blocksRaymond: 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 haveSacha: 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.
-
🔗 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] -
🔗 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] -
🔗 r/Yorkshire Amazing what is buzzing around in Richmond! rss
| submitted by /u/Still_Function_5428
[link] [comments]
---|--- -
🔗 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.0Now, 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.0I 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] -
🔗 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:
- SMT-LIB, used by Triton (symbolic execution)
- VEX, used by angr
- Miasm IR
- Sleigh, used by Ghidra, Remill and Icicle
- LLVM IR, used by Rellume, revng and Remill
- Microcode, used by IDA (proprietary)
- BNIL, used by Binary Ninja (proprietary)
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
Statestructure 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 opaquememorypointer that helps us differentiate aload/storein theStatefrom memory accesses by the x86 CPU. In short: theStatepointer is used to model the CPU and thememorypointer is used to model the RAM. While lifting, the prototype of the lifted function isvoid 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
initializeblock, which is used to get pointers to the relevantStatemembers. Then every instruction gets its own basic block namedinsn_<addr>. Every instruction is responsible for emitting an unconditional branch to its successors. The basic block for the successor is created with just aretterminator, 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 %1instruction which usesmemoryas 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
Semanticsclass 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: CsInsnThe
begin(address)function is used to create thelifted_<address>function in LLVM IR and create theinitializeblock 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.functionTo create the instruction block,
get_or_create_blockis 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 blockAs mentioned above, an empty block is not valid LLVM IR so we populate it with a
retinstruction. 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 successorsThe function first ensures an empty
insn_<address>block by removing the temporaryretinstruction. Then it creates an IRBuilderand calls the handler responsible for producing IR for the instruction being lifted (more on that below). If the handler does not return successors,lift_byteshandles the common fallthrough case by creating a basic block for the next instruction. It is up to the caller to handle the list ofSuccessortuples:class Successor(NamedTuple): src: int dst: ValueWe use an LLVM
Valuefor the branch destination, because it is not always concrete (for examplejmp 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_readis 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 FalseFor our example
mov rax, rcx, the function will forward toreg_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,alandahand it returns an LLVMValuecontaining the loaded register value. The last missing piece is thereg_ptrfunction, which is responsible for creating thegetelementptrin 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_ptrTo 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
movinstruction so far. Almost every other instruction has more complex behavior, especially around flag handling. For instance here are the implementations ofand/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, rbxand 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_0x140001003If 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
jccis responsible for creating both the destination blocks as well as thebrwith 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 voidLLVM 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_0x140001005LLVM 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_fnThis 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: retThe graph of the disassembly looks like this:

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
brightenedfunction sets up theStateon 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_retintrinsic 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
RAMvariable and pass that to ourmemoryargument. 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 %0shape and replace it with aninttoptrinstruction: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
rspto 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:
- A Gentle Introduction to LLVM IR
- A Journey to understand LLVM-IR!
- Mapping High Level Constructs to LLVM IR
- IR is better than assembly
- Introduction to LLVM
- Learning LLVM Part 1, Part 2
- LLVM Passes for Security Part 1, Part 2, Part 3, Part 4
-
🔗 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] -
🔗 r/reverseengineering I built 99 adversarial PE fixtures to stress‑test parsers — here’s what they reveal about malformed binaries rss
submitted by /u/iocx_dev
[link] [comments] -
🔗 r/york 'It's just crazy': The York students rejecting a bank-breaking prom rss
| submitted by /u/Kagedeah
[link] [comments]
---|--- -
🔗 backnotprop/plannotator v0.19.21 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.19.20 | Interactive goal setup UI, OpenCode submit_plan fixes, browser no-op sentinel handling for Claude agents
v0.19.18 | Edit-based submit_plan for OpenCode, Pi namespace migration, Codex annotate-last fix, OpenCode commands dir fix
v0.19.17 | Reworked goal setup skill (interview-driven flow), CLI --version flag
v0.19.16 | Code navigation with peek view (Cmd/Ctrl+click tokens in diffs)
v0.19.15 | Commit-based diff base, jj evolution diffs, GitLab reliability fixes, OpenCode command intercept fix
v0.19.14 | Visual explainer skill update, PFM code-file hover previews, Graphviz, diff tab size and line bg intensity, hooks settings tab
v0.19.11 | Jujutsu (jj) VCS backend, slimmer hunk separators, collapse viewed files, multi-line gutter selection fix
v0.19.9 | OpenCode user-managed workflow, Pi model switch fix, Codex skill install, shimmer removal
v0.19.8 | 49 themes with syntax highlighting, keyboard shortcut registry, smart code-file path validation, remote URL notifications
v0.19.7 | Codex Stop-hook plan review, Codex skills, sidebar auto-close, file tree context menu
What's New in v0.19.21
v0.19.21 brings Ask AI to plan review and annotate mode. The same inline AI chat that was available in code review now works when reviewing plans, annotating markdown files, annotating URLs, and annotating HTML documents.
Ask AI in Plan Review and Annotate Mode
Select any text in a plan or annotated document, open the comment popover, and click "Ask AI" to ask a question about the selected content. The response streams into a side panel that persists alongside the annotation panel. You can switch between annotations and AI chat using the sidebar tabs, and both stay independent of each other. AI chat messages are never included in approval or denial feedback.
The feature uses the same provider-agnostic backend that powers code review AI. Any provider you have installed (Claude, Codex, Pi, OpenCode) works automatically. If you have multiple providers, the system picks a default based on which agent runtime you're using (Claude Code defaults to Claude, Codex defaults to Codex, and so on) and you can override it from the AI settings bar at the top of the chat panel.
A one-time announcement dialog appears the first time Ask AI is available in plan review, then dismisses permanently via cookie. Users with no AI providers installed see no change at all.
Shared AI Runtime
The AI provider setup that previously lived inline in the code review server has been extracted into a shared
ai-runtimemodule. All three servers (plan review, code review, annotate) and the Pi extension now use the same initialization path. This means provider detection, session management, and SSE streaming are consistent across every Plannotator mode.The refactor also fixed a missing SSE timeout in the code review server. Long- running AI responses could previously be cut off by Bun's idle connection timeout. All three servers now correctly disable the timeout for
/api/ai/queryrequests.Origin-Aware Provider Defaults
When multiple AI providers are available, Plannotator now picks a default based on which coding agent launched the session. Claude Code sessions default to Claude, Codex sessions default to Codex, Pi sessions default to Pi, and OpenCode sessions default to OpenCode. You can still override the selection manually, and your per-origin preference is saved separately so switching between agents doesn't reset your choice.
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run
/pluginin Claude Code, find plannotator , and click "Update now".OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in
opencode.json:{ "plugin": ["@plannotator/opencode@latest"] }Pi: Install or update the extension:
pi install npm:@plannotator/pi-extension
What's Changed
- Add Ask AI to plan and annotate reviews by @backnotprop in #763
Full Changelog :
v0.19.20...v0.19.21 -
🔗 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] -
🔗 r/york House of Piccadilly radiators in York? rss
Hi. We are looking to get a radiator replaced and our plumber sent us radiator options from House of Piccadilly in York. Has anyone used them before?
Can't really find reviews for the different radiator options and wondering if we should look to buy the radiators separately. I've heard good things from best heating
submitted by /u/darkazuria
[link] [comments] -
🔗 r/york York, reflected ✨ rss
| Image @ kierandelaneyvisuals submitted by /u/1ChanceChipmunk1
[link] [comments]
---|--- -
🔗 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] -
🔗 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
- Fix rate control in av1_amf encoder [PR #16819], by @nyanmisaka
- Fix UserManager after EFcore refactor [PR #15368], by @JPVenson
- Update log for user session related concurrency update fails [PR #16845], by @JPVenson
- Allow HDR10 for VPP tonemapping [PR #16718], by @gnattu
- Use strict QSV CPB size for less powerful H.264 decoder [PR #16743], by @nyanmisaka
-
🔗 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.nixand symlinking them in place.The problem here is that NixOS seemingly doesn’t have a “native” way to say that
/a/b/cshould be a symlink to/c/d/e. Or has it?If you search options for
symlink, you’ll learn aboutenvironment.etcwhich 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-tmpfilesitself (thanks, NobbZ!).For example, if I want to symlink
~/dotfiles/git/configto.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.
-
🔗 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.
-
🔗 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.
-
🔗 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.
-
🔗 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,
rushis 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
rushis good at:- “Fix the failing
renders empty statetest.” - “Update
@src/components/ui/Select.tsxto match the focus-ring styling in@src/components/ui/Button.tsx” - “Rename
enableLegacySearchtoenableSearchV2in all files that use it”
Do not use
rushfor 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. Usesmartordeepfor those.What Changed
The previous system prompt in
rushmode 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.rushnow usesshell_commandfor searching, reading, and verification, andapply_patchfor edits. That means we can remove quite a few tools that all do almost the same thing -grep,glob, andcreate_file.The
tasksubagents have the same configuration as the main agent: no reasoning, GPT 5.5.Evals
On our internal evals,
rushsolved 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,deepsolved 58% of tasks, 14 points higher thanrush.Pair It with the Oracle
The best pattern we have found is
rushplus theoracle.Let
rushbuild. Ask theoracleto plan, criticize, or review. Theoracleis 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
rushfrom 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 failingseat limit is enforced after downgradetest. 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.tsxand@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 rushin the Amp CLI. - “Fix the failing
-
🔗 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.

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:

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

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





/news/amp-labs.jpg)


