August activity report
Long Mode, Firefox, Notepad++ and a Very Busy Summer for AnotherOS
14 September 2026
Where are we going? Am I walking this road, or is the AI walking it without me and sending the occasional postcard?
Appetite comes with eating, they say. Mine never gets full, and my ego is worse: once I set a goal, it has to work. So after countless fights and reconciliations with Claude, AnotherOS is now a 64-bit operating system. We ran in circles and crossed the finish line, dropping plenty along the way. Were we running too fast? What are we trying to catch? Rhetorical questions, both.
How this thing actually gets built
During the architecture phase I was lost, and other work kept knocking me off track. A Claude request pops up on your phone while you're busy, you tap without thinking, and later you revert it, or redo something that was fine, just not your way.
What I love is remote sessions. While building a small fireplace in my studio, I hold the phone in one hand, tell the AI on my server what to do next, pocket the phone and carry on with both hands. ChatGPT gets other jobs: it helped me calibrate my 3D printer (no BLTouch) from the PC the printer is plugged into, while I drove it from my phone.
Why all this? I want to fix problems I keep hitting in today's operating systems, and for that I need a stable base first, the way Windows NT grew into 2000 and XP. In the NT 3.1 days that didn't look serious either.
Resources are limited: I'm on the Max 20x plan and won't do pay-as-you-go, because this is a hobby and I need rest too. So work starts on Sunday, when the weekly limit resets, and ends on Wednesday or Thursday, when it runs out. That's the good case. Sometimes it's Tuesday. :D
I'm optimising, though: last week I installed the memo MCP server on my Mac mini M4 as a one-week experiment. The codebase was already well organised (I'm no beginner, though not one of those Lithuanian "AI experts" who coach others after coaching themselves on YouTube), with a generated source map and indexes of functions and documentation. How exactly stays my secret.
The agents keep things interesting. One wrote down a design decision, signed it "the owner", and later retracted it as "a ruling nobody gave". Hence a CLAUDE.md full of rules, each learned by losing a session.
The big move: x86_64
After the jump to amd64, a month of porting and testing, the AI seemed a bit lost: some parts wouldn't move across, so it mostly rewrote them and ported the functionality back. I should have started on x86_64 from day one, but I had other motives.
The timeline, from git:
- 10 August: the transition plan is written.
- 11–12 August: long mode, a shell, SSH, SMP with the MuQSS scheduler, and the Fasadas desktop on x86_64, first in QEMU and then on the Dell.
- 17 August: i686 is deleted from master.
The rest of August was stabilisation, with a circus: stale documentation and old i686 assumptions kept tripping us up (ping quietly died because its glue lived in a deleted i686 file). It has settled now. The i686 branch is frozen (it was stable enough); I'll use it later for my vintage computer collection.
Firefox, or: every loose end at once
WebKitGTK is no longer the plan. Rust now cross-compiles to AnotherOS, which opened the door to the real thing: Firefox 153 ESR, something we practically couldn't have fitted into the i686 world. It took a good two weeks. Gecko first configured on 17 August. On 29 August our target YouTube video played, with VP9 decoded in software. By 9 September, 21 of 22 real sites loaded.
Firefox needs solid threading. Ours worked but had never been battle-tested, and the browser found every loose end:
- Sockets: IPC messages didn't fit the AF_UNIX buffer, every outgoing connection leaked a socket-table entry, and the whole machine had room for just 48 TCP sockets. A news site opens 30 to 60.
- Memory:
fork()failed with gigabytes free, and themmapallocator never reused freed address space. - Fonts: crisp icons, no text at all, because every UI font size came out as −0.138889 px.
Claude Opus wrestled with the IPC, memory and network driver problems for two days and got nowhere. Fable 5 found and fixed the critical bugs in about two hours, and quickly sorted out a graphics stack that couldn't keep up with website animations. Its inhuman appetite for tokens amazed me, though. With unlimited tokens, all of this could have taken two days, three at most.
The disk that lied, and the Dell that stopped talking
The scariest bug of the summer: when an AHCI disk command timed out, the driver abandoned it while the drive still owned it. The next request's data landed on the previous request's block, and everything reported success. We caught it red-handed when mkdir -p complained about "unrecognized option: p": 4 KiB of Firefox's times.json sat in the middle of the busybox binary. ext4 had a bug of its own too: writes past 4 GiB wrapped around and overwrote the start of the file.
The network was no calmer. The r8169 card stalled under traffic bursts and lost transmit "doorbells" (Linux calls its workaround the "8168 hack"), on a machine with no serial port for debugging. Then the Dell started freezing with every watchdog silent: it had simply stopped transmitting. One culprit was a dying Firefox process printing a kill line per sibling thread over the serial port with interrupts off, about 2.7 seconds of frozen desktop. After the fixes, a 31-site run came out clean.
Win32: Notepad++ on a Dell
We kept 32-bit ring 3 around on purpose. It was meant to be a surprise, but why hide it: we need full Win32 support, and later Win64. Appetite, eating, you know the rest.
AnotherOS now runs native 32-bit Windows programs in a WOW64-style subsystem. Not Wine, not an emulator:
- The kernel learned to run 32-bit compatibility-mode code in ring 3.
- Every Win32 API call crosses from 32-bit guest code into a 64-bit host implementation, and the result crosses back.
- Every Windows thread is a host pthread with its own TEB.
- About 1,700 exports across 28 built-in DLLs, plus the common controls from Wine's comctl32, loaded as an ordinary Windows DLL.
The result: the official, unmodified Notepad++ 8.9.8 runs in a native Fasadas window on the Dell, menus, Find, Save As, plugins and all.
Two bugs deserve a trophy:
- QEMU was lying to us. Every Win32 test passed, while on real Intel hardware each program crashed on its first
fs:access: the CPU refuses a null segment selector in compatibility mode, and QEMU doesn't check. - The heisenbug. Guest and host share one address space. On the Linux development host, where the same loader runs, Linux randomises a static binary's heap into the range we reserve for
VirtualAlloc, and Notepad++'s first thread-stack commit landed straight on musl's malloc data. It crashed once in about 60 runs, only with ASLR on, and gdb turns ASLR off, so it vanished under the debugger. Now the memory manager truly owns its address window.
There's a huge amount left, but we have a working Notepad++ proof. :)
Graphics and the desktop
Proper 3D acceleration has arrived, though through Mesa rather than the desktop itself. On 2 September Mesa's crocus driver drew its first triangle on the Dell's Intel GPU, in a test that fails on software fallback. Firefox's WebGL followed on 6 September. Our Metal-style Grafika API handles desktop rendering for now, and may later carry 3D into the desktop too.
On the desktop side, the AO_ toolkit (our AppKit-style API for C, C++ and Go, with a strict no-stubs rule) now runs all 18 System Preferences panels and the graphical installer. The desktop also gained a VNC server, a Launchpad, NTP time and a crash reporter.
Sometimes I think I've invented too many subsystems, so we're consolidating before we catch up with Microsoft: wifid and vardas are gone, and Tinklas now owns all network configuration, from Wi-Fi reconnects to the desktop tray.
A 2011 MacBook Pro joins the lab
AnotherOS now boots over the network on a 17" MacBook Pro from 2011, chosen because it has an Ethernet port. Apple's BSDP hands over to iPXE, and it boots to the full Fasadas desktop.
- Graphics: the Intel GPU's 2D path needed two fixes. The Radeon is burnt out, the usual fate of that generation's discrete GPUs and their bad solder, but the Intel side is fine and the machine runs faster than my 2014 Dell Inspiron.
- Apple bits: SMC, gmux backlight, the multitouch trackpad, and media keys for brightness, keyboard light and volume.
Sound moved forward too: the Dell plays music, and the mp3 that "repeated parts like a hung Windows 95" is fixed.
Also landed
- Installer: tested and working. In BIOS mode Limine boots a kernel that mounts the ext4 root partition by UUID; the Dell got its first full install on 30 August, and an upgrade mode keeps your configuration.
- ext4: extents, hashed directories, a real journal, and checksums verified on read (the code used to mention checksums 158 times and compare none). Four hard resets mid-write on the Dell lost nothing.
- Self-hosting: a fresh install compiles and runs C and C++ with its own GCC, no outside help.
- Ports Build Service: watches the ports git tree, pulls changes and builds new package versions, judging a build by the package it produced rather than the exit code (one Firefox build said "ok" after two hours and produced nothing).
make releaseassembles an ISO from the published packages. - Kernel command line: the buffer grew from 256 to 1,024 bytes (the Dell's network-boot line was being silently cut off), and the parameter registry from 160 to 512 entries.
- Updates from the repository (experimental):
apkg upgradenow spots a rebuilt package at the same version, the first brick for updating kernel, userspace and ports straight from the repository. - Forgejo automation: the agent files, labels, fixes, closes and reopens issues and keeps the wiki current. It even caught its own tool hiding all but 50 of 325 open issues.
- Separate versioning: kernel and userspace carry their own build numbers (k and u), both shown on the desktop.
What's next
- Win32 until it "just works", then Win64.
- Self-hosting, part two: ports, then the whole OS, built on the machine itself.
- GPU everywhere: hardware 3D in the desktop and hardware video decode.
- Fewer subsystems: finish Tinklas before I invent another name ending in "-as".
- Audio tested with real media players.
As always, all of this happens between Sunday and Wednesday. Thursday is for fireplaces.