borretti.me
Some Data Should Be Code
I write a lot of Makefiles . I use it not as a command runner but as an ad-hoc build system for small projects, typically for compiling Markdown documents and their dependencies. Like so: And the above graph was generated by this very simple Makefile: graph.png : graph.dot dot -Tpng $< -o $@ clean : rm -f graph.png (I could never remember the automatic variable syntax until I made flashcards for them.) It works for simple projects, when you can mostly hand-write the rules. But the abstraction...
Letting Claude Play Text Adventures
The other day I went to an AI hackathon organized by my friends Lucia and Malin . The theme was mech interp , but I hardly know PyTorch so I planned to do something at the API layer rather than the model layer. Something I think about a lot is cognitive architectures (like Soar and ACT-R ). This is like a continuation of GOFAI research, inspired by cognitive science. And like GOFAI it’s never yielded anything useful. But I often think: can we scaffold LLMs with cog arch-inspired harnesses to ove...
There Is No New Aesthetics
“For man, or for a man, there can be no new beginnings.” — David Zindell, Shanidar Re: A Call for New Aesthetics . At some point in the 20th century, we filled out the last few basis vectors of humanity. We explored the whole game map. This is what it means to live at the end of history: every aesthetic movement, political and economic system you can imagine can be understood as a linear combination of things that have come before. Asking for a new aesthetics is like asking for a new continent, ...
1Password Dependency Breaks Syntax Highlighting
Earlier today I noticed the syntax highlighting on this website was broken. But not fully: on reload I’d see a flash of highlighted text, that then turned monochrome. The raw HTML from curl showed rouge tags, but the web inspector showed raw text inside the <code> elements. This didn’t happen in Chromium. My first thought was: there’s malformed HTML, and Firefox is recovering in a way that loses the DOM inside <code> tags. Then I noticed it doesn’t happen in incognito. Turning my ext...
Using the Brother DS-640 Scanner on NixOS
The DS-640 is a compact USB scanner from Brother . It was surprisingly hard to get it working on NixOS, so I wrote up my solution so others don’t have this problem. The bad news is you need Brother’s proprietary drivers to make this work. You need this configuration: # Enable SANE scanners. hardware . sane . enable = true ; # Add yourself to the scanner and printer groups. users . users . USERNAME . extraGroups = [ "scanner" "lp" ]; # Add support for Brother scanners. hardware . sane . brscan5 ....
Books I Enjoyed in 2025
The Apocalypse of Herschel Schoen by nostalgebraist . A revelation (ἀποκάλυψις = “unveiling”) told through the eyes of a developmentally-disabled teenager. You will never guess where it goes. This came across my desk because I really enjoyed The Northern Caves , which is both a great horror story and an evocation of the Internet forum culture of the late 2000’s. Algebraic Models for Accounting Systems . I like anything along the lines of, “let’s take a technical field that formed its ontology, v...
Coarse is Better
When DALL-E came out, it took me a couple of weeks to pick my jaw up from the floor. I would go to sleep excited to wake up to a full quota, with a backlog of prompts to try. It was magical, miraculous. Like discovering a new universe. I compiled the best art in this post . The other day a friend ran some of my old prompts through Nano Banana Pro (NBP), and put the old models side by side with the new. It’s interesting how after years of progress, the models are much better better at making imag...
I Wish People Were More Public
Probably not a popular thing to say today. The zeitgeisty thing to say is that we should all log off and live terrible cottagecore solarpunk lives raising chickens and being mindful. I wish people were more online and more public. I have rarely wished the opposite. Consider this post addressed to you, the reader. Your Writing I will often find a blog post on Hacker News that really resonates. And when I go to check the rest of the site there’s three other posts. And I think: I wish you’d write m...
Ad-Hoc Emacs Packages with Nix
You can use Nix as a package manager for Emacs, like so: { home-manager . users . eudoxia = { programs . emacs = { enable = true ; extraPackages = epkgs : with epkgs ; [ magit rust-mode treemacs # and so on ]; }; }; } Today I learned you can also use it to create ad-hoc packages for things not in MELPA or nixpkgs . The other day I wanted to get back into Inform 7 , naturally the first stack frame of the yak shave was to look for an Emacs mode. inform7-mode exists, but isn’t packaged anywhere. So...
Linux on the Fujitsu Lifebook U729
This post describes my experience using Linux on the Fujitsu Lifebook U729 . The tl;dr is that it’s a delightful laptop, and Linux runs flawlessly, and all the hardware things I’ve needed run OOTB. The only difficulty I had was in disabling Secure Boot, but I figured out how to do it, which I explain below. Contents Background Troubleshooting Secure Boot Spyware Non-Problems BIOS Notes Links Background From early 2024 my daily driver was an M2 MacBook Air, until earlier this year I broke the scr...
Agda on NixOS
To install Agda and its standard library, add this to your config: environment . systemPackages = with pkgs ; [ ( agda . withPackages ( p : [ p . standard-library ])) ]; Or, using home-manager : home-manager . users . $ username . home . packages = with pkgs ; [ ( agda . withPackages ( p : [ p . standard-library ])) ]; The p here stands for the nixpkgs.agdaPackages package set. Note that the following will not work: environment . systemPackages = with pkgs ; [ agda agdaPackages . standard-librar...
Hashcards: A Plain-Text Spaced Repetition System
hashcards is a local-first spaced repetition app, along the lines of Anki or Mochi . Like Anki, it uses FSRS , the most advanced scheduling algorithm yet, to schedule reviews. The thing that makes hashcards unique: it doesn’t use a database. Rather, your flashcard collection is just a directory of Markdown files, like so: Cards/ Math.md Chemistry.md Astronomy.md ... And each file, or “deck”, looks like this: Q: What is the role of synaptic vesicles? A: They store neurotransmitters for release at...
Adding Planets to Celestia on macOS
tl;dr: you have to modify the application bundle. Celestia is a space simulator: you can fly around space and look at moons and exoplants, fast forward time. It is sometimes used by sci-fi artists for worldbuilding because you can easily add new stars/planets/megastructures/spacecraft. Some people have built whole virtual worlds for storytelling in Celestia. The Orion’s Arm collaborative worldbuilding project has a collection of Celestia addons so you can explore the world of the year 10,000 AT....
Notes on Managing ADHD
The pleasure is in foreseeing it, not in bringing it to term. — Jorge Luis Borges, Selected Non-Fictions This post is about managing ADHD. It is divided into two sections: “Strategies” describes the high-level control system, “Tactics” is a list of micro-level improvements (really it should be called “stratagems”, since most are essentially about tricking yourself). Contents Strategies Chemistry First Memory Energy Procrastination Introspection Time Tactics Task Selection Visual Field Management...
Inboxes are Underrated
I have a lot of communication apps. By volume: Twitter DMs, Signal, Whatsapp, iMessage, Discord, email. Because I have so many disjoint places where communication happens, I have a daily task on Todoist to go through each of these, and ensure that every conversation is handled, where “handled” means: if I can reply immediately, I do so; otherwise, I make a task to reply. Polling is better than interrupts. But this is imperfect, because often I get distracted, and I do neither. Sometimes I read t...
You Can Choose Tools That Make You Happy
On Hacker News and Lobsters I often see blog posts with titles like: Why I built my startup on Common Lisp and DragonflyBSD Rewriting PyTorch in APL (year six update) I will never, ever, ever learn Docker The general form being: why Obscure Thing is better than Popular Thing. And always the justification is purportedly rational and technical. And always, always, it is complete sophistry. Why? Because people make technical decisions, in part, for affective reasons. They choose a technology becaus...
Two Years of Rust
I recently wrapped up a job where I spent the last two years writing the backend of a B2B SaaS product in Rust , so now is the ideal time to reflect on the experience and write about it. Contents Learning The Good Performance Tooling Type Safety Error Handling The Borrow Checker Async Refactoring Hiring Affect The Bad The Module System Build Performance Mocking Expressive Power Learning I didn’t learn Rust the usual way: by reading tutorials, or books; or writing tiny projects. Rather, I would s...
My Backup Infrastructure, 2025 Edition
tl;dr two portable SSDs, synced with rsync ; and a Backblaze bucket synced with restic : I’m finally satisfied with my infrastructure for backups, so I’m writing it up so others can benefit from it. Criteria My requirements for backup infrastructure are: Open source, to minimize the risk of backdoors. Fast, but only incrementally: an initial snapshot can be slow. Simple configuration, with little surface area to mess things up. Encryption with keys that I control and which never leave my device....
We Live In a Golden Age of Interoperability
Yesterday I was reading Exploring the Internet , an oral history of the early Internet. The first part of the book describes the author’s efforts to publish the ITU ’s Blue Book: 19 kilopages of standards documents for telephony and networks. What struck me was the description of the ITU’s documentation stack: A week spent trolling the halls of the ITU had produced documentation on about half of the proprietary, in-house text formatting system they had developed many years ago on a Siemens mainf...
Domain-Agnostic and Domain-Specific Tools
This post is, in a sense, a continuation to Unbundling Tools for Thought . It’s an argument for why you shouldn’t try to use a single tool to do everything, aimed at people who have been spent too much time shoveling prose into a “second brain” and have little to show for it. Software tools span a spectrum from domain-agnostic to domain-specific. Domain-agnostic tools are things like Obsidian. They have a small, spartan data model that can be made to represent most things. Obsidian’s data model ...