Notes for July 5-12

This was a weird week, during which I went back to studiously disconnecting from work as soon as possible because, well, . My back has also been acting up again (perhaps because of the added stress), and even though the weather has been marginally cooler, meetings still make it impossible to leave the house during the cooler morning hours. To be honest, has been affecting my motivation and well-being.

To compensate, I ended up writing a fair bit more than usual and taking the time to play around with some novelties (like ). But all this additional personal entropy/dispersion overhead also put me behind on my review schedule, and I have been chastising myself for not turning off as many distractions as possible, reminding myself that all it takes is another interesting project for me to become passionate about work again, and generally trying to do better across the board.

But hey, sometimes welcome distractions literally drop out of the sky.

New 3D Printer

The Flashforge Creator 5 Pro in my office
It's... imposing, for sure.

My new Flashforge Creator 5 Pro arrived this week–if you’ve been paying attention, you’ll know that I have taken my usual long, circuitous (and, let’s face it, miserly) approach to buying a new 3D printer since I started tracking both the and the early last year, and it’s finally here.

I will write a dedicated review when I’ve poked at it enough, but the background story is, in short, that:

  • I still quite like (and intend to keep using) my and , but have long felt I needed a better printer for technical filaments
  • I don’t intend to print multi-colour frippery, but rather to use multi-material printing
  • I hate the waste from single-nozzle multi-colour systems, so a toolchanger is the only thing that ever made sense to me
  • I took a bet on Flashforge’s Kickstarter because, well, I’m not made of money

Even so, this was something I’d been saving up for since before I got the as a review unit, so it wasn’t really a splurge or impulse thing–as a somewhat depressing comparison, I have been putting money aside to upgrade my Mac mini for about as long, aiming for a four-year replacement cycle–but after the recent price hikes, I’m now looking at… eight at this rate?

The only thing I regret is that it arrived while my enthusiasm was at a fairly low ebb, so it will take me a while to make full use of it. But at least already supports it fully, and even though Flashforge has decided not to expose the full UI, I have started building a native Swift app (based on an existing Electron app) to monitor it; I essentially tossed UI.md and the Electron source code into a blender, and thanks to Codex and GPT-5.6, I had this working in under four hours:

FlashForgeUI showing live status, camera, telemetry and material data from the Creator 5 Pro
This is already live data from the printer.

3D Reconstructions

Following up on from a couple of weeks ago, I took a look at AI-assisted mesh (re)construction, with pretty interesting results:

AI-reconstructed mesh of an Orange Pi 6 Plus in Blender
This is the Orange Pi 6 Plus, without a heatsink.

The papers I found are, as such things go, already somewhat dated (the first and its sibling were published in 2024 and 2025). What surprised me was how trivial the process is.

The mesh above was the result of feeding Hunyuan3D-2 MV a couple of semi-random, non-orthogonal shots of an SBC I found through an image search. It clearly got some of the connectors wrong, but is still much better than my earlier results.

I stumbled upon this completely by accident while researching 3D mesh generation, and to my delight I was able to get Direct3D (which is, incidentally, an unfortunate and nearly impossible name to search for…) to work on my puny RTX 3060, which then led me to Direct3D-S2 and Hunyuan3D-2 MV.

The idea of going straight from diffusion to a mesh (and then using marching cubes) is pretty neat, and even though a bazillion people are using this to create game assets, 3D-print miniatures and the like, having a passable, proportionally correct shim for bootstrapping SBC enclosures from just two photos seems worth poking at–even if some of my friends keep pointing out that I’d have them done by now if I just used a pair of callipers.

Remote CAD

At the other end of the process, I’ve decided to reinvent the wheel and bootstrap my own Wayland environment, which is going… slowly. I’ve started by upstreaming some of my changes to IronRDP and have a mostly working solution, although I did spend an embarrassingly long amount of time patching labwc (which is the compositor I’m vendoring) so that it rendered Platinum-like window decorations:

A remote Wayland desktop with Platinum-style window decorations running a WebGL aquarium
GPU-accelerated Platinum-style window decorations, because apparently this is what I do now to relax.

I also had yet another go at getting to run under WINE, but it is so dependent on unimplemented Windows APIs that I gave up after a few hours. I may try again later since I would very much like to have a semi-permanent remote CAD setup, but for now I am content to use my iPad to run it.

Other Stuff

Besides maintaining piclaw, I have been and creating the Flashforge monitoring app I discussed above. Both are native apps, a departure from my usual stance of hacking the least possible amount of code to wrap something as a Mac app.

Neither is fully usable yet, but I’ve learned quite a bit in the process, including that using /goal in Codex to explore the limited printer API and figure out what else we could do can have hilarious effects when it involves running a Swift app repeatedly over lunchtime:

Dozens of overlapping macOS local network permission prompts triggered by FlashForgeUI
In my defense, I was supervising it from my iPad...

Now if you’ll excuse me, I need to get back to testing some of the hardware that has been piling up on my desk, some of which had to be relocated hastily when I swapped out the for the Creator 5 Pro and needed to find a new place for it…

My AI Model Tier List for mid-2026

Since the US has decided, in a bout of Cold War nostalgia, to bring back the years when encryption counted as a munition (if you’re reading this in the far future when we have cheap RAM, both Fable and GPT 5.6 were, for a bit, subject to the whims of red tape), I spent a little time taking stock of what was left to us here in Europe and whether any of it actually works.

I suspect I wasn’t the only one doing this over the past few weeks, but now that both Fable and Sol are “back”, I decided, as a distraction from the mild chaos at work, to sit down and tidy up my notes while they were still current.

This isn’t a benchmark, and I don’t much care about anyone’s leaderboard: the existing ones are either pointless or gamed (or both), because the numbers stop meaning anything the moment you point a model at a real codebase with a real SPEC.md and real tests.

So take this as a set of caricatures instead–exaggerations of the behaviours I’ve run into week after week, switching between models for coding, auditing and the occasional bout of retrocomputing madness. They’re unfair, as caricatures tend to be, and mostly true.

The Anthropic Fable

I can’t help but think that Fable is very, very aptly named, because nothing about it feels quite real.

Opus writes a beautiful UI, tells you everything is done, and breaks three unrelated files on the way out. It is irritatingly fluent, West Coast glib and confident, and often –a salesman spinning a beautiful yarn while I check the diff. I’ve had it cheerfully lie about implementing MMU and I/O emulation and then act wounded when I checked.

Its saving grace has been that 4.8 is good at both front-end code and turning a pile of requirements into user stories–even little Sonnet, bless its silly little heart, can do that faster than any committee.

But ask either to write tests and they will , papering over corner cases and, sometimes, entire chunks of any SPEC.md you throw at them.

Fable, sadly, has been no different, at least not for me.

Opus, despite being the “grown up”, consistently mangled long files, did drive-by edits on tangentially related ones, and has a sycophantic streak I’ve never managed to fully beat out of it. Fable improved on that and certainly feels different, although I may merely not have used it long enough to catch it in the act.

More to the point, Fable seems to ignore entire sections of directives or existing program modules and cheerily duplicate them “better”, not really explaining why. I haven’t (yet) caught it outright lying about its achievements, but I trust it about as far as I can throw Opus.

Sonnet, in general, lies less than Opus simply because it understands and achieves much less (and no, judging by the couple of hours I spent with Sonnet 5, it isn’t much of an improvement), but those shared foibles are, generally, the reason I didn’t particularly regret not having access to Fable for a while.

Older versions could be competent–Opus 4.6 once , which is the sort of thing I’d never have managed alone. Then 4.7 shipped feeling , and it was plain that Anthropic was nerfing it too much.

And that takes me to a tangential issue that certainly tinges my viewpoint–the part I like least isn’t the models so much as the posture: Anthropic is betting hardest on mainstream adoption while locking you into its own harness, which is of increasingly dubious value when the harness itself becomes context overhead.

That said, I’ve had decent results using both Opus and Fable as a “manager” for OpenAI sub-agents, but the arrangement sometimes worked out about as you would expect: just like a human team, when the GPT models implemented their tasks successfully, the manager spewed out glorious progress reports. When they didn’t, it offered “guidance” that was only marginally useful because it was outside the immediate context the agents were pursuing.

Tier: B. Brilliant and slippery. Keep a diff open and one finger on the cancel button, because it will shove bugs under the rug.

Better Call Sol

I have a Codex trial subscription for my OSS work, so I’m biased. Judging by Twitter, there are… dozens of us.

GPT 5.5 was already pretty good–output felt like it was coming from a senior engineer who never uses emoji, never pads a reply with adjectives, and finds the bugs in your pull request without making a song and dance about it. I , and I never regretted it.

When I make the mistake of letting Anthropic’s models break something, 5.x is what I bring in to audit–the fixes are usually solid, it seldom goes and tramples unrelated code, and in my experience OpenAI models really do clean up after Anthropic ones.

That restraint matters more than it sounds after a few hours spent putting up with Opus’s slop.

It’s the only family of models that writes halfway-decent tests; Codex 5.3 was what made my blog engine port and most of my TDD projects very workable indeed. But it has no taste: it’ll , and the family has drifted off a bit since then. GPT 5.4 was less thorough than Codex 5.3, and 5.5 initially felt –chattier, friendlier, and somehow worse at finding a logic error in a 2000-line file.

In practice, I can give GPT 5.4-mini a SKILL.md file, well-defined tools and a task to do, and 90% of the time it will just work. I could never get anything like that to work reliably with Sonnet.

The 5.x family also seems to have a penchant for building its own scaffolding and tooling, like when rather than trusting either of us to eyeball the output.

Sol (which is the only model from the 5.6 family that I’ve used extensively so far) is very, very good at low-level code–it has been systematically plugging holes in my JIT and emulator stuff not by trial and error, but through static analysis. Like 5.5, it can also use delegate very effectively in piclaw, totally unprompted.

I’ve run it against a few of my ongoing projects, and it not only fixed stuff Fable had gotten wrong, but also came up with a much saner set of API endpoints than the other models–and tested it, with sane tests for the API, the underlying data schemas, and the UX.

I’ve been using 5.5 to go from user stories to Gherkin to Playwright tests in a few steps, but 5.6 just went and did it quickly, end-to-end, for one of my web tools, unprompted other than for the spec.

(Note that I don’t do one-shot prompts–, and piclaw supplies models with bare tooling, but the repo this happened in did not have an AGENTS.md file or skills).

Tier: S. The one I trust with sharp objects. It still has no taste, but it gets low-level code right and leaves working tests behind.

Lost in the Mists

We have a myth here in Portugal where King Sebastian, who was lost to us in an epic battle, will one day return from the mists and deliver us.

Well, I don’t think Mistral is likely to do that for Europe, but I sure have tried using it. The model I keep underestimating and the company I keep rolling my eyes at are, awkwardly, the same outfit.

Vibe, their TUI, has been –it played nicely with tmux, the clipboard handling never once tripped me up, the free tier was generous enough to experiment with, and it ran Mistral inside my agent containers doing real work without much fuss.

For a pairing I only expected to tolerate, it earned a permanent slot until I moved to Codex, and I’d call it a competent, much less snooty Sonnet.

And for a model this unapologetically French, it has one baffling failing: it never once sauntered in like Pepe Le Pew, tail aloft, to christen anything le this or le that. All that Gallic charm on the box, and not one amorous skunk in the actual tokens–the only stray le I ever saw was the brand name on Le Chat. That is to say that it never hallucinated, lied to me, or otherwise tried to gaslight me, and the code was (and is, since I still have access to it in Azure Foundry) unremarkable but competent.

The company is harder to love. Mistral –talent, single-market scale, local compute, the lot–which reads like a policy brief from the company that would most benefit from “buy European” procurement rules.

Mind you, the underlying analysis is hard to argue with. It’s also hard to take entirely seriously from a European company that, at the time, wouldn’t even hire remotely in Europe (Anthropic, by the way, already has a few offices open in key locations–all too distant for me, though).

The irony is that if the Chinese government ever decides to curtail access to models from its own research labs the way Washington just has, Mistral might be the only credible supplier of SOTA models in Europe. And like most European compromises, it would get us absolutely nowhere–unless they are secretly brewing a Fable-class model, which is hardly apparent despite all the “le gros chat” parodies that flooded the net a few weeks back.

Tier: C. The TUI was better than expected; the models are competent enough not to be interesting. The sovereignty sermon together with lack of visible motion is very European indeed.

Twin Peaks

Gemini is… weird. I have it (via GitHub Copilot) on every machine I use and have reached for it on almost none of them. It rides along in , it’s the third pane in a Copilot side-by-side I mostly use to confirm I prefer the other two, and I can’t remember it ever fixing any of the stuff I handed over to Codex–I’ve never found a reason to start with actual money.

This leaves Gemini in the least useful category: a model I have everywhere and no reason to choose. It has one strength I’ve pinned down, and an unsurprising one––but I’ve never had the patience to see it through a whole project because nothing it did made me want to keep going.

The joke, of course, is that it’s the model everyone is going to use without choosing it: , so half the people who’d never install it are running it by proxy. Nobody picks Gemini.

Tier: C. Present everywhere, chosen nowhere. Very Google.

The Incredible Shrinking Whale

DeepSeek is, , now very much available “locally” if you can spare a kidney (or, given , almost two).

As a model, though, I’ve found it somewhat unremarkable–good, but not good enough that I reach for it before GLM. Its MoE architecture and copious documentation make it a more plausible basis for useful local inference than anything Qwen or Gemma offers now, though.

The thing is, it barely counts as a model in the grand scheme of things–it’s now mostly a flag for the local AI movement, and, to a degree, more of a hardware problem than a software one. The interesting part is neither its origin nor its capabilities but of a bare-metal inference engine that makes running it locally (well, the Flash variant, at least) actually feasible at usable speeds.

And I get the excitement–I, too, have been by porting it to Go in go-ds4. It turned “run a frontier-ish model at home” into , which is how an open model became yet another project gated behind hardware most of us can’t justify buying.

In practice, though, I have had a couple of piclaw instances running it almost exclusively for weeks on end without much complaint, switching between Flash and Pro on Azure Foundry–where it is both cheap and readily available, unlike the hardware required to run it at home.

Tier: B. Perfectly useful in the cloud. At home, you had better be prepared to spend a lot of money on hardware.

Z is for… Zorglub?

I’ve topped up my OpenRouter account twice, largely to spend the credits on GLM. 5.1 was OK but not ground-breaking (and I have access to it via Azure Foundry), while 5.2 has something of GPT 5.4’s directness (at least with my AGENTS.md) and just enough of Claude’s flair to be the most interesting open model I’ve used since DeepSeek was let loose.

I haven’t spent enough time with 5.2 to draw a fair caricature, but running it alongside Opus 4.8 and GPT 5.4 it did a perfectly serviceable job of the chores I threw at it–mostly porting a couple of things to Go and Rust. Nothing major, but also nothing it seemed to mess up.

And then there’s the local angle–GLM keeps getting held up as one of the open models that will democratise all this, and every time I look, that puts it firmly out of reach of the hardware most people actually own.

The catch is that the “local” part still requires hardware owned by a very small and conspicuously well-funded slice of the market. I’d be delighted to be proven wrong on something I can afford, but every release so far has moved the goalposts for hardware requirements.

Still, over two weeks and $50 in OpenRouter credits I had zero issues with it as long as I kept my expectations reasonable. I don’t care if the weights were created by a Chinese company–it’s a perfectly good model to host and rally around in Europe if both the US and China go into lockdown mode (politicians, alas, will never understand this).

Tier: A. Cheap, capable, and the one I’d point European hosters at. Calling it “local” still requires the sort of hardware that costs a kidney.

To The Moon, but Low Orbit

Kimi felt much the same. I mostly played with 2.6 for a couple of evenings (nothing special) and have yet to really use 2.7, but until the new GLM came out it was –and cheap enough that I never begrudged the tokens.

Tier: B. Probably. I haven’t used 2.7 enough for anything more elaborate than that.

Genies in the Lamp

Everything above only runs at useful speeds in someone else’s datacentre. Over the past few months my llama.cpp fork has been where I’ve tried to do without one–first as part of my , then as a more serious attempt to get usable inference at decent speeds with tool-calling and enough context.

Because, well, the models I actually “own” all have to squeeze into a 12GB RTX 3060, and the pattern has always been the same: promising on paper, but always one VRAM tier short of usable.

Gemma 4 is, actually, the one I like best, mostly because it finally got fast. After some messing about with the E4B variant’s , I got the E4B quants running at nearly 90 tok/s–quick enough to surprise me.

It is also dim and forgetful: the context window is far smaller than I consider usable, and for anything past “if this (and maybe that) then this other arbitrary set of things” it just barely qualifies. piclaw can drive it, but it gets off-track too early and the results are reliably frustrating.

Qwen 3.6 is the one I keep trying to cram into the same card and never quite manage. I’ve spent real time and still don’t have a usable solution–it is always a couple of gigabytes away from fitting. The architecture is clever, but the VRAM requirements just don’t help.

Until hardware gets cheaper–and suggest it won’t soon–anything you want to run locally is going to require both VRAM and bus speeds that the vast majority of people just don’t have–and no, my 36GB MacBook Pro is not where I want to run these things; I love my battery.

Tier: D. I still cannot fit the models I want into the hardware I own.

Where This Leaves Me

None of this is, as you might have gathered, scientific or prescriptive, and I don’t actually pick a winner. On any given day piclaw is running a cheap GPT-5-Mini-class model for the boring parts, reaching for Opus when it needs to interpret something fuzzy, and switching to a Codex model the moment real code is needed, with tests to catch whatever Anthropic broke behind my back. We anthropomorphize models and ascribe them personalities, but we need to stop pretending that any single one of them–or any company creating them–is our friend.

I am, in the long term, rooting for open-weight models. Even if we can’t run them on local hardware cheaply, European hosters already can, and in the meantime (with any luck) Europe will get off its collective ass and invest in doing something more than tiny towers of Babel.

I know it’s a start, don’t get me wrong. But it is not where we should be right now.

The Return of Shelf

Remember when the internet was young, there was a finite (but quite large) set of personal sites, personal contact actually mattered and you had trouble keeping track of who blogged where, who you corresponded with and what their social handles were?

You know, before all hell broke loose and we got 300 variations on impersonal blogging platforms (ahem Medium), entirely too many walled-garden social networks and utterly unmanageable spam?

Well, back in those days I used something called , created by Tom Insam, which did a pretty amazing thing for the time (because Apple actually had working desktop automation, but I digress):

It looked at the current foreground application, and tried to figure out if what you were looking at corresponded to a person in your address book–and then gave you more context on them

It was pretty amazing, really:

The original Shelf, surfacing context about Tom by looking at his site
The original Shelf, surfacing context about Tom by looking at his site

I spent quite a while hacking on it 16 years ago, and one of the things I really wanted was for it . At the time, was not a thing, but Apple was surprisingly ahead of the curve and was shipping a that I used to build myself quite a nice extension–that Apple kept killing, again and again, as it progressively neutered what developers could build atop Mail.

Eventually Apple killed much better, downright brilliant extensions like , and all we got is that stupid little “Filing Suggestions”/Move To button in Mail, which, besides being available only on macOS, seldom works and is hardly deterministic.

Well, guess what, LSM is still there, and thanks to the power of AI I have resurrected to a degree:

Shelf reborn, falling back to related mail search and Next Best actions
Shelf reborn, falling back to related mail search and Next Best actions

The code is up on GitHub, as usual, and I kept the original philosophy of capturing context from the foreground app (via a hideous pastiche of Apple Events and Accessibility, but it “works”), matching it to additional content from the same app (I’m focusing on Mail) and providing “Next Best” actions–which are entirely deterministic, by the way. I also tacked on a smattering of local Apple Intelligence support thanks to SwiftIntelligence (because I might want to use external models later).

And it works beautifully so far, even if I clearly need to remove the nerdy diagnostics and re-think the UX.

So what did I learn from this?

Not common sense, I’m afraid.

First off, after creating three or four desktop apps using nothing but , I now get both why some people love it and why some people absolutely hate it, especially compared with the ancient ObjC/AppKit combo. LLMs released since spring 2026 can finally generate Swift code that is actually usable, so I mostly let GPT-5.5/5.6 do the heavy lifting and focused on search ranking and the criteria for suggestions.

Also, oh goodness, how utterly useless Apple’s automation/AX APIs can be for this sort of thing. I have a lot of admittedly dated experience with Apple Events and Accessibility, but even I was surprised at how many things that should be trivial are either impossible or require a lot of workarounds to get right (like just finding the right window in a multi-window app, or getting the right item to glean context from).

And, finally, Apple’s Spotlight APIs in macOS 26 are completely and utterly broken because it is impossible for my app to find the exact same thing I can find with system Spotlight. Even with Full Disk Access, it seems that the only way I can programmatically search for an email message that I can find nearly instantaneously with Cmd+Space is to go and read the Mail SQLite storage myself, which is ridiculous:

  • It’s not a question of ranking, predicates, anything
  • It’s not a question of query timeouts
  • It’s not a question of just about anything I can send to the API (and I’ve pretty much fuzzed it)

There are no decent modern examples, either, so all I get are some messages from some accounts, not any message that matches the criteria I set from across all accounts.

This makes my little email filing helper only partially useful, so I’ll probably shelve it (pun intended) until macOS 27 comes along, and by then I will also see if I can get on-device models to actually file things for me properly.

And no, creating email rules doesn’t scale, and I also only want messages filed after I’ve marked them as read, which is another thing I was able to do just fine with Mail Act-On before Apple nerfed Mail.

I’ll probably write about this again come Christmas, with any luck.

AI as a weapon of mass cognitive destruction

I use AI every day; it’s unavoidable when you create agentic tooling. But something has been grating on me for months, and it isn’t about development: non-technical people are using it to generate far too much slop. Not code slop, but business slop.

Five paragraph meeting agendas. Four-page responses to a planning inquiry, because that way I get “all the facts”. A one-line question turns up dressed as a formal memo with a summary, three bullets of tangentially related sub-questions and a partridge in a pear tree. Documents that used to run a page now run six, padded out with restated context that nobody wrote by hand and nobody reads. Words are now effortless, so people produce more of them–whether or not they still mean anything.

The illusion of saved time

The immediacy is a bigger dopamine hit than you’d expect. Type a prompt, get six paragraphs and two tables in seconds, and it feels efficient. The sender reckons they’ve saved twenty minutes, and from where they sit, they have: what took twenty minutes now takes two.

Except the time didn’t vanish, it shifted and multiplied. Every recipient now has to wade through the padding, work out which sentence actually matters, and mentally rebuild the one-liner that should have been sent in the first place. Sender spends two minutes; ten people downstream lose fifteen each–if they read the whole thing at all.

Not even speed-reading helps

People in tech love AI because, well, let’s face it, few of them can write; the average coder isn’t very communicative. And if you do spend a lot of time communicating, the illusion above soon has you in thrall.

AI in the hands of people who can’t use it effectively simply dumps cognitive load on everyone else. I’m something of a speed reader (part of my slightly off neurological makeup), and it’s driving me nuts that a context switch which used to be instant now means ploughing through pages of vaguely dressed-up pseudo-facts.

Hilariously, one of the last times I replied to a verbose e-mail – in my usual terse one-liners and bullets – I pointed out that the data fed to the AI that helped create that e-mail was slightly off. The response was baffling: people actually mistook my British-leaning vocabulary… for an AI-generated response. Because, yes, I use em dashes.

Output is not productivity

The worst part is that management usually can’t tell the difference, and increasingly doesn’t try. More emails, longer documents, quicker turnaround–it all looks like productivity, and output is easy to count in a way quality never is. So the person firing off ten inflated reports looks busier than the one sending a single tight paragraph that actually settles the question.

This runs top to bottom of the org chart, and it comes down to a basic confusion about what AI is for. The point is to save effort–same result for less, or a better result for the same. Instead people use it to inflate the same result into something that looks bigger. Leadership watches the volume tick up and reads it as a gain. All that’s really happened is the work got louder.

And given the constant pressure to “sell”, to be noticed, to “achieve more”, we’re actually rewarding volume and calling it work because the worst KPIs are the easiest to measure: count of emails, length of documents, speed of reply. Just like measuring the number of PRs landed, or lines of code.

Nobody is measuring the cognitive load being dumped on the other end, or whether the message actually landed, or how many recipient-hours were wasted. So on paper the overload doesn’t exist–it just compounds, off the books, while some management dashboard stays in the green–“line go up”, right?

Measure (at least once, goddammit) and cut more than twice

Blaise Pascal once quipped “I would have written a shorter letter, but I did not have the time.” Being both factual and concise is the expensive option, not the lazy one. Halving a document means understanding it well enough to know what can be trimmed away. Getting a paragraph down to the pair of sentences that are really key takes judgement, a couple of revisions and, yes, time. And (this is what really annoys me) we still haven’t nailed the art of the concise slide presentation–instead, we’ve now weaponized it to… a nuclear degree.

And since I’ve mentioned slide decks: taste is one of AI’s main casualties, visual and textual alike. I abhor the sleek corporate jargon now available as e-mail ammunition to everyone–but that deserves its own post. And, like Pascal, I’m starting to feel I didn’t spend enough time trimming this one down…

Notes for June 28 - July 4

The , but I’ve still managed to squeeze in a few interesting hacks this week in between work, about the (too soon to call it, but like everyone else, I’m waiting for the other shoe to drop), and a new personal project of watching every Bond movie in chronological order (which is a surprisingly good way to spend a few evenings, even if it’s a bit uneven in quality).

Pi On Your iPad… Sort Of

Although I can run most AI agents inside ios-linuxkit, I keep getting bitten by the fact that Apple won’t let me run my own apps permanently on my iPad, so every now and then the build expires when I am either a) away from home or b) with every single Mac in the house off or otherwise inaccessible (or both), which is a giant pain.

And I do want to be able to run some form of terminal-based agent on the iPad, if only for helping me proofread and auto-link drafts (which I could theoretically do with an plugin, but none of those are reliable in the long term). So when I got wind of tau and realized it was pure , I immediately tried to install it inside , which has a very complete Python runtime and has been my go-to for all sorts of CLI tooling for years–and after some creative hacking, it mostly works:

tau running in a-Shell after some tweaks
tau running in a-Shell after some tweaks

My fork adds a bunch of things like GitHub provider support, hiding the sidebar and a few workarounds for common iPad foibles (like the lack of an Esc key, and ’s weird lack of support for Command + .), and like , is self-modifying to a degree where I can expect it to keep adapting to the way I work.

Home Automation

Since I have a love-hate relationship with air conditioning, I set up an additional Tuya ZG-204ZM to keep track of presence in the office and only turn it on when absolutely needed, which led me down the usual rabbit hole of to do something as simple as “only turn this thing on if I am in the office and it is over 27oC”, which takes all of three minutes to wire up in Node-RED – but is now undiscoverable by anyone else in the house since it won’t be visible in the Home app.

And yes, I know there are alternatives to the Home app. That is not the point.

Truly useful automation like “only turn this thing on if I am in the office and it is over 27oC and my kids didn’t leave the window open” (which takes two more minutes) is, alas, something that Apple will likely never really understand.

That said, this class of microwave-based presence sensors is very good. I’ve been using one for a year to turn on ambient lighting when I sit at my office desk (and dim everything when I walk away), and it’s been stupidly reliable. However, it seems that the really interesting, zone-aware ones that have been coming out require wired power, and if any smart home manufacturer truly believes people want to have wall warts to push 5V to these things through a highly visible wire, well, that’s just not happening (the model I’m using takes 2 AAA batteries, which apparently last forever).

AI Media Slop…ish

I have been playing with Ideogram 4 a bit , but this time on my puny RTX 3060 (which manages one decent-quality image every… 5 minutes or so), as well as with automated video generation via Remotion, mostly to figure out how some of the current commercial SOTA slop generation pipelines (the output of which we’re constantly exposed to in social media) can be scaled down to more useful pursuits, like helping teachers create grounded educational assets. Since I have long had a local Kiwix instance on my NAS (yes, I like the idea of having offline copies of iFixit and selected Stack Exchange forums), there’s no shortage of material, but I started out with a simpler thing–a piclaw intro:

A short intro clip that piclaw created for itself using Remotion.

So far, I see two major challenges:

  • Fact-based storylines/scripts are (as I expected) quite challenging to put together (LLMs have no taste, hence no decent criteria for emphasizing the right aspects of the source material). This seems like a relatively easy thing to handle using a multi-step curation process and better skill authoring, but requires time.
  • Consistency in visual depictions. Themes and templates go a long way, but anything that involves a visual prompt is just too prone to error–which is why I’ve been looking into Ideogram 4 as a possible way to improve things.

And yes, there’s a lot of pseudo-infographic stuff out there, but it’s all pretty much crap–any pointers on actually reliable techniques or open-weight models are welcome.

RDP Shenanigans

Faced with the prospect of years without significant hardware upgrades and the heat, I decided to revive , with a twist: I need to run modern graphical apps on the server, and right now that means Wayland.

xrdp still works great for most essentials, but we keep getting told that Wayland is the future for what–two decades now?–and it’s high time I explored RDP support in Wayland properly. After all, I know the wire protocol well, and I have extra motivation:

  • I’ve been meaning to fix a critical part of the Steam experience (pairing a new/updated device remotely to a headless machine) for ages, and getting view-only output out of Gamescope would be nice, because Valve clearly never gave much thought to the notion of headless Steam boxes.
  • GNOME Remote Desktop is… bad. I’m sorry, but it just is, not just because I want proper multi-user headless support but also because of various protocol support gaps.
  • I would very much like to, sometime in the future, have something that works at least as well as xorgxrdp and sesman to have minimally accelerated desktops (rendered using the GPU on the server side) streamed via RDP (preferably H.264) to an arbitrary client.

The current state of the art in the X11 world lets me do the latter (with minimally usable audio) pretty well, but there’s nothing equivalent in the Wayland ecosystem… Until I found out about lamco-rdp-server and started hacking at my own fork to implement the bits I wanted.

And oh boy, is Wayland broken by design if you try to do something like this… Right now the current setup is, roughly, an in-memory, headless Weston instance that, via some duct tape and wishful thinking, is screen captured through the “portal” abstraction by lamco-rdp-server, which feels like a tremendous waste of resources instead of, you know, just having a process hold both the compositor and the protocol renderer per logged-in user.

But I got most of the interesting bits to work already:

A headless Weston session streamed over RDP via my lamco-rdp-server fork.

Screen resizing, in particular, is a pain, but then again input has been much worse… I wasn’t particularly fond of the idea of reinventing this wheel to the point where it’ll be a full-fledged thin client solution, but a few hours with Codex led me to a usable xrdp-like solution with an equivalent sesman-like session manager, PAM support and a few other niceties, and I’m certainly up for experimenting (and learning) with it over Summer.

We Call It "Weather" Here

Even as my colleagues around Europe complain of a heat wave, things have been pretty much normal here–35oC outside, 27-ish inside, made tolerable only by the fact that I have minimized the number of active devices in my office (where the hottest things are probably my monitors and the ageing that I use at my standing desk).

Borg Thermals

Which doesn’t mean things don’t get too hot. I woke up the other day to find that had halted at around 5AM, and I immediately suspected thermals, so, , I popped it open, swapped out the CPU fan (some things are so predictable I keep spares) and, while I did that, asked one of my agents to check telemetry–which, despite my best efforts, I’ve been neglecting to turn into alarms:

That last spike is clearly where the fan started failing
That last spike is clearly where the fan started failing

It’s pretty obvious, even looking at the monthly data (which I pulled out to get an idea of the overall trend), that one of the fans started failing over the weekend–and it was the Noctua NF-A9x14 that I’ve been using for the CPU cooler.

Only Fans

Since those slim profile fans seem to die on me around every 18 months or so, this time I got an Artic P9 Max, on the spurious grounds that:

  • It has a much higher CFM
  • I can still fit a 25mm fan into the B660 (there’s enough clearance below the PSU)

It is, of course, much noisier, but we are in the middle of a heat wave and I expect it to throttle down eventually. Either way, I did get another Noctua to keep around as a spare, because fans are probably the only PC part that is cheap enough to keep a spare of these days…

While I waited for the new fan to arrive, I decided to whip up a stupidly visible temperature monitor to keep an eye on it, and the results were… dramatic:

Before and after swapping the CPU fan.
Before and after, and it was hotter after.

I don’t expect this to be the last time I do this, but I hope it will at least be a while before I have to do it again. The B660 is an amazing motherboard/case combo, but it is not designed for high-performance cooling–or Portuguese weather.

Notes for June 21-28

The weather is… infuriatingly tropical, but tolerable (we’re used to the heat this time of year, but the dampness is relatively new), and shifting all my morning meetings to my standing desk has markedly improved (but not fully healed) my back, so it was a relatively OK week.

Other than it being the last fiscal month , that is–my thresholds for patience have become somewhat elastic over the years, but it’s still a busy part of the year.

That, and the pushed me into another reassessment of how I have been spending my time, and I decided to go back to more hands-on work.

The Photogrammetry Detour

Since I have a bunch of CAD work to do, I tried my hand at photogrammetry over the week to see if I could speed up creating SBC cases:

Photogrammetry capture of the Radxa Q8B
Photogrammetry capture of the Radxa Q8B

The main conclusion so far is that although the photogrammetry process itself worked (and I could probably write a fairly detailed post about the C++ libraries I used and how I automated the process), even with 4K inputs and a few passes at refining the mesh it’s just not accurate enough to do what I need, partially because the BRIO 4K’s autofocus is a bit of a wash:

A sharpness map from the photogrammetry scans, still not sharp enough
A sharpness map from the photogrammetry scans, still not sharp enough

Now, that is tweakable, but the process is still a bit too manual and error-prone to be worth it for me.

In comparison, and just feeding photos to piclaw has been working stupendously well, and even if the dimensions are off, I can fix them easily in CAD once I have a STEP file:

CAD model reconstructed by just feeding photos to piclaw
CAD model reconstructed by just feeding photos to piclaw

As much as I would love to get my hands on a 3D scanner, I suspect this will be my go-to approach from here on out–although I’m currently investigating if I can re-use the image-processing pipeline to guide the model:

Using the image-processing pipeline to guide the model
Using the image-processing pipeline to guide the model

Tiny Local Models

Before shifting back to more pragmatic pursuits, I still “finished” a few -related things, mostly related to Gemma 4.

In short, after some messing around with QAT and MTP weights, I have finally gotten a reasonably smart and speedy version of Gemma4-E4B to run on my RTX3060 at nearly 90 tok/s, but…

It still isn’t as smart (or fast) as I would like for running my agents, and the context window is much smaller than what I ordinarily consider usable. Even for automating “if this (and maybe that) then (this other arbitrary set of things)” workflows… It just barely qualifies.

I might poke at it a bit more, but the core issues I had still stand: both context and capabilities of this kind of model are still far below what I need for regular use (piclaw can use it, but the results are always frustrating), and SOTA models are still much, much more effective than anything else.

have put me off the notion of ever getting good enough hardware to run anything useful locally unless I win the lottery , so this might be a dead end for the rest of the year.

RSS, With Less Baggage

I also went after my daily news intake–the news is bad enough as it is, but I can at least try to make it less stressful to consume.

Back when I was from Feedly to FreshRSS I briefly considered Miniflux but discarded it because I thought it lacked features I ended up never using, so this week I decided to fork it, replace its database with and create something even more minimalist I dubbed picoflux – which seems to work just fine with and takes up a whopping… 70MB of RAM when running as a dedicated service.

That’s far less than the and database baggage that FreshRSS brought, and it let me downsize the (already) tiny Azure VM I run “insecure” services in to half the capacity, so that’s a win right there.

Migration was, as usual, another opportunity to prune/fix stale feeds, but completely uneventful other than not having support for Miniflux–which is not a problem since I am still using , but said support seems to be coming, and if my UX gripes (which revolve around scrolling and overly garish iconography) get fixed, I might well switch to it.

Going Back To Raw Feeds

After and around nine months of daily use, I am bringing my to a close, for the following reasons:

  • My reading habits and schedule changed to a point where I was not really reading all of the bulletins (especially the noon and evening ones) and they just piled up.
  • The bulletin structure itself, despite being great for a few of the feeds I wanted to keep a cursory eye on, was just not good enough to surface important news.
  • Following the links inside bulletins was a bit fiddly (they were too small a target to pick out from a page of text, and turning the entire summary into a hyperlink to “fix” that just didn’t work inside any RSS reader).
  • I realized that my brain is just better at scanning hundreds of headlines and ranking them as they scroll past on the iPad.
  • It is another service to run and maintain, and I wanted to focus on other things.

To be fair, it has had exactly zero code changes other than a couple of cosmetic fixes and the LLM API costs were under $5/month, but asking myself “why” didn’t surface a lot of value.

That is not to say that the summaries were not valuable, but it’s just easier to prune noisy, spammy feeds. I have also considered using the summaries to feed a “smarter” agent that would notify me of “interesting” news, but my interests are so wide (and shift priorities so often) that it would be tough to get consistent output out of that, too.

I suspect I will circle back to this with a fresh point of view (and I have been thinking about how to refactor it into a pure functions/workers construct), but for now it’s just easier to wind it down for the holidays.

sashimi Soak Testing

I picked up sashimi (the port of this site’s static generator) again this week, and after running the numbers on visual rendering parity (which piclaw and Codex helped me with by generating some ), it is now at a point where it can render the entire site with pretty much 100% fidelity to the current renderer–except for a few corner cases, and with some bits already looking better.

It is blazingly fast, and incremental rendering is ridiculously fast, but more to the point it’s finally good enough to run alongside the main engine, generating a complete staging site entirely inside GitHub Actions (with a somewhat complex but quite fun set of cascading, low-impact actions) that do the required incremental/partial rendering in seconds instead of several minutes.

It’s probably interesting enough to deserve a dedicated write-up, and that will happen after a couple weeks’ soak time. I’ve already done a bunch of “live” testing, but I’m sure regular posting will surface more things to fix.

I think that will be quite enough AI, thank you very much

It’s been (inexactly) , and the place wouldn’t feel the same if I wasn’t (mildly) furiously hammering my current train of thought into vim, bare-brained, like the semi-civilized ape-like creature that we all are when bereft of our crutches.

Read More...

Notes for June 14–21

My back is still giving me trouble, but a week’s worth of moving about carefully and a little exercise “fixed” it (as in, I can stand again for extended periods of time). And I’ve pinned down the most likely cause–I have been spending far too much time sitting at my desk.

Read More...

Running microVMs in Proxmox VE, The Easy Way

I’ve been running a mixed cluster for years – four nodes of wildly different capability, from an Atom x5-Z8350 with 2 GB of RAM (a , currently offline after years of faithful service as a baseline torture device) up to an i7-12700 with 128 GB (, my main homelab server).

Read More...

Shoehorning... R-Type into the ESP32

This is a very quick follow-up to from a couple of weeks ago, and worth noting for the fun value and a little bit of .

Read More...

Notes for June 7-14

Another week, another set of bank holidays that I tried to leverage strategically to do interesting things with my time, and… I ended up throwing out my back and having to sit very still for hours at a time, which made the whole thing feel like a waste of paid vacation with extra ibuprofen.

Read More...

Shoehorning Flying Toasters into a ESP32-S3

This is the (very) abridged story of how I got After Dark running on my own flavour of the –specifically, Flying Toasters on an ESP32-S3 board, zooming along at 65 FPS, which is both completely pointless and one of the more satisfying things I’ve done this month.

Read More...

The MilkV Jupiter 2/SpacemiT K3

This is a fascinating box–so much so that after almost three weeks playing with it, I amassed so much material that I nearly decided to split my review into two parts, but in the end I decided to condense it a bit and post a longer piece than usual, even if that means almost half of it is a fairly wide-ranging exploration of how to get AI workloads on it.

Read More...

WWDC26: Early Impressions

This was the weirdest WWDC26 keynote in a while, and some of the past ones were visibly phoned in. It was rife with weirdness and flashbacks.

Read More...

Notes for June 1–7

I decided to take a couple of days off and generally tune out, thanks to a few strategically placed bank holidays – which meant my usual mix of relaxing and dealing with a few chores.

Read More...

My WWDC 26 Wish List

Michael Tsai’s annual roundup of WWDC wish lists went up this week, and the thing that struck me most wasn’t any single request–it was the mood. There seem to be fewer wish lists than last year, several people openly admitted they couldn’t be bothered to write one, and the ones that did are pretty much bereft of any “aspirational” wishes.

Read More...

Field Notes From The AI Battlefield

Since today is a bank holiday for me, I decided to consolidate a few more of my notes into a post. What follows is a set of guiding “principles” that I’ve found useful over the past year or so and that I’ve codified into various bits of scaffolding I reuse across my projects.

Read More...

Archives3D Site Map