Besides the showmanship demonstrated by the keynote opening (nice touches there, Tim) and the visual effect when you open it, the iPhone Duo is… strangely familiar, and yet, somehow just strange as well:
I am not a fan of the weird signal/battery status bar indicator or the vertical dock, although the ergonomics of moving toolbars there are undeniable–the bottom-right buttons are going to be very hard to reach single-handedly, though
I am a fan of having Touch ID back, as well as the under-display camera (which I suspect will eventually find its way downrange over the next few years)
I kept wanting to see the typing experience in “laptop” mode and Apple Pencil support (Apple says support for the USB-C Pencil is coming later this year)
Most of the UX we saw so far was both predictable and familiar to anyone who’s played with a Samsung Z Fold (Apple did not invent screen splits, app swaps or drag and drop), and so was the camera placement.
Oh, and the price, of course.
Definitely not a surprise even if shocking.
It won’t stop a lot of people, even if it is about as much as a couple of (sorry, three or four) iPad minis, but I am definitely not getting one–nor any other iPhone this year.
Nor AirPods either, given I have excellent open ear $50 earbuds.
But I am interested in the new Watch, both due to the improved heart rate tracking and battery life (the dark bronze look and redesign versus my Series 9 doesn’t hurt either).
I am, however, more than a bit put off by the Live Rewind and Recap features, simply because it doesn’t sit well with me to have anything listening constantly, even if with a short retention window (Apple says these are opt-in and raw audio is deleted after processing).
That said, as it happens I have been investigating how to duplicate the Index 01 smart ring’s (deliberate) press-and-hold recording and transcription for notes with my Watch, so I found the feature intellectually interesting.
But I find it incredibly frustrating that Apple consistently fails to get even the basics right.
For instance, currently my voice memos from the Watch are neither transcribed nor synced to my Mac (Apple says they should sync), and Apple’s unwillingness to do any sort of useful automation on the Watch has become a huge turn-off.
Update: I forgot to mention that, obviously, none of the AI features are going to be available in the EU. Which only makes the lack of flexibility and automation all the more annoying, because I can’t even script sending audio to my own endpoints to process.
Update 2: Apple has released a whitepaper on Audio Intelligence Privacy that outlines how it works and how audio is handled on-device with only condensed, generalized and encrypted transcripts making it to their private cloud compute (where it is actually summarized), and… Well, OK, fine, I guess. It does require opt-in.
Only yesterday I was discussing Mistral off-work and pondering what they might be up to, given both their EU lobbying – which fits rather neatly with the European AI pitch I wrote about in April – and the fact that they haven’t been doing a lot of actual model releases (in practice, nothing really new, or at the same pace as other labs).
I guess that they are positioning themselves squarely in the sovereignty arena, where a few other European companies have already started providing generic open-weight models for privacy- and US-sceptic customers that don’t want to be dependent on the whims of non-EU administrations. It’s a decent market to be in in Europe, but feels too regional, and I hope they get back to improving their own models, which are substantially lagging behind by any benchmark (if you care about benchmarks).
My LG TVs are too old/dumb to fall into this lot, fortunately, but what I want for my next TV is a huge, dumb monitor, and reports like this are why. Gamers Nexus and Level1Techs apparently found LG TVs recording audio with the screen off and storing it for later upload, besides snooping on other devices on the local network. I don’t know how much of this applies to European models (the article doesn’t establish that), but I would very much like someone to check rather than assume GDPR has taken care of it.
I’ve been complaining about TVs spying on their owners since 2012, and about the lack of EU scrutiny in 2024 and 2025, so this is getting a little tiresome. The European Commission keeps harping on Apple, and I suspect that has rather a lot to do with it being a much more recognisable brand–going after Apple has immediate political impact, whereas investigating what LG and the other TV manufacturers collect inside people’s homes seems to be nobody’s priority.
The desire to own an Apple Studio Display has probably been hanging over most Mac desktop users since time immemorial (well, since 1998 at least, but most people are more familiar with the “modern” 2022-era look) for two reasons:
It defines what a desktop Mac display should, ideally, look like–a black-edged, aluminium-backed slab with zero frills and impeccable image quality.
It has, traditionally, been hilariously expensive along every single dimension, including polishing cloths, until the historic date of August 27th this year.
And I, too, have always wanted one. But economics and insularity are part of the reason I never got one, although that hasn’t stopped me: I’ve always been curious about what it would be like to use a credible approximation of one, but with a twist: I like taller displays.
And now, I can confirm that this is probably the best single monitor set-up I’ve used for a long while:
The P20 on my living room desk.
Disclaimer:Kuycon supplied me with a P20 free of charge (well, actually two, but that’s part of the story) and this follows my review policy.
Getting here took several months. The first panel flickered, and pressing on a corner of the monitor improved things. I suspected a partially disconnected internal connector, but couldn’t confirm the cause, although I very strongly suspect shipment damage.
I returned the first unit, but the replacement arrived without a stand, so I couldn’t use it for many weeks. And then I went on vacation, and that further delayed things…
I finally set it up (again) on our living room desk (the space I now retire to whenever I’m not working, either due to needing clear separation from work or to my 3D printers making the office too noisy) and have now been using it properly for a few weeks.
First of all, I’ve always been a fan of the Microsoft Surface Studio–not the computer itself (which was far too feeble), but its screen size and 3:2 aspect ratio. Its 4500x3000 resolution was also exactly the same as the Kuycon P20.
My preference for taller displays goes back a long way–all the way back to the huge, monochrome 4:3 DECstations I used in college, and I still prefer those proportions to the modern 16:9 default that we seem to be saddled with in this age of video consumption.
Second, I’ve been using LG panels and a combo ultrawide and portrait setup at my office desk for quite some time now, largely because ultra-wides, despite their popularity for gaming and video editing, are actually a slow-burning hindrance when researching, writing or coding because of their comparatively limited screen height.
I use my portrait display for coding, researching, final page layout stuff, and, increasingly, CAD and 3D modelling.
However, it’s a bit annoying to flip windows to and fro (even with Moom), so when I realised I had a shot at using a subtly taller, better balanced display with what I still think are the right proportions for me, I jumped at the chance.
Why do I care about this so much? Well, for three reasons, two of which are related to my physical health:
I have high myopia, which makes the vertical space on my displays particularly important since anything off-centre, being invariably distorted by my corrective lenses, requires actual neck movement to view properly–even if my widescreen were curved, I would still have trouble seeing it clearly without moving my head.
My back and neck have been giving me trouble, so being able to raise the screen to the centre of my visual field matters a lot to me.
I simply prefer taller displays for productivity, as they allow me to see more content vertically without constantly scrolling.
In order to better convey my point of view on this, I had my “assistant” draw up this comparison:
Active display areas, shown at the same physical scale.
The rectangles above are drawn to the same physical scale (which took some doing), leaving out bezels and stands.
I’ve also added a couple of insets showing how 4K and 1080p images fit at native 1:1 pixels, rather than the physical sizes of other monitors. You can futz with desktop scaling to change how much content fits and how large the text is, but the panel proportions stay the same–and the comparison makes those much clearer than diagonal sizes alone.
The P20 has a 28.2-inch IPS panel running at 4500x3000 and 60Hz, with a 3:2 aspect ratio (also written as 4.5:3).
That gives it about 22% more pixels than my 5120x2160 LG ultra-wide, arranged in a much taller, narrower workspace–and a bit sharper, too.
The monitor and stand come in separate boxes (even though the illustration on the monitor box shows both, the stand is in the box on the right).
Inside the main box, everything’s neatly packed:
The foam insets have all the accessories.
Let’s get this out of the way: Yes, this is very heavily based on what we’ve come to consider Apple design language, from the glossy display, thin black bezels and all-aluminium look to the back vents:
The rear vents are part of the all-aluminium look.
And yes, that is part of the reason I was intrigued by the P20 in the first place, and a controversial aspect for some, but what matters is what the hardware can do for you, and how.
Besides the sturdy aluminium stand (which I like the look of, and which allows the P20 to be rotated 90°, if you want), the monitor itself ships with a stylish VESA mounting bracket:
The top catch holds the mount in place; the screw locks it.
The bracket itself appears to be machined out of a couple of solid plates of aluminium and is well designed in terms of strain relief, but as it happens none of my monitor arms was strong enough to hold the monitor without noticeably straining and drooping (my LGs are, after all, encased in light plastic), so I had to wait for the replacement stand.
The solid aluminium stand holds it steady. It does require some assembly, but nothing overly complicated:
Assembling the solid aluminium stand for the P20 takes 5 minutes.
Once the stand arrived, its height adjustment let me put the screen at the centre of my visual field–the top stop is high enough to get it where I want it.
You get 2 HDMI ports, a DisplayPort, and a USB-C port as inputs, plus a USB-C hub with 2 additional ports for peripherals (I plugged a Logitech Brio 4K into one of them) and a headphone jack.
The available ports, in line with the power connection at the centre of the monitor’s back panel.
Note that there are no speakers on this monitor (and likely no good place to put them inside the chassis), so you’ll need to rely on external audio solutions.
As you would expect, we plugged everything we could into the monitor to see how it would handle different connections:
All our Macs (including old Intel ones) worked without any issues.
Our Windows machines, both Intel and ARM, also had no trouble detecting and using the monitor at full resolution (and HDR where supported, which was the usual hit-and-miss in Windows).
Our Linux machines also detected and used the monitor without any major issues–I even wrote a Noctalia shell extension for my MiniBook X for managing monitor placement in Niri.
The iPad Pro worked seamlessly, as discussed in the next section.
And a Chromebook I tested also worked without any issues (except for resolution limitations due to its ARM hardware).
The only input I was unable to test was DisplayPort, simply because we have zero machines in the house with it–most of the laptops and SBCs I used connected to the monitor’s USB-C input, including those with Thunderbolt ports.
My trusty old Lenovo ThinkPad X1 Yoga had no real trouble driving it at full resolution (albeit at 30Hz) via HDMI. I also tried a few USB-C to HDMI adapters, including one of my trusty travel cables, without any significant issues (other than 4K limitations in some of the converters, which was expected).
To put it bluntly, this thing is glorious to use with my iPad Pro.
Completely overkill, but also completely right as far as screen proportions and resolution are concerned, even if Apple still provides essentially zero control over any monitor features other than HDR:
External display settings for the P20 on iPadOS.
I worked on this draft on the P20 itself using my iPad Pro (Obsidian on the right of the display, references on the left, and Notes on my iPad just below the monitor), and I would make that a habit if it were easier to manage and split windows on iPadOS:
Working my way back in time through my notes and references on the P20 with my iPad Pro.
One of my teens, who is just as obsessively attuned to colour as I am, spent an afternoon trying to adjust the P20 to a close match of what our MacBook screens can do and eventually gave up–with or without HDR, our unit had a salmon/pink/warm tint that we just couldn’t get to go away for a while.
I don’t have any colour calibration hardware and I tend to only edit photos on my iPad these days out of sheer convenience (and, let’s face it, due to having given up any pretence at doing “pro” photography over the years), but that tint was something I noticed immediately, even after trying the various DCI-P3 profiles macOS offered in its settings window.
The monitor’s own DCI-P3 and sRGB modes didn’t resolve it either, so we’ve settled on turning off HDR and using its “User” and “Cool” colour settings instead–that and some more judicious tweaking of other settings finally removed the tint, so expect spending some time fiddling with settings on both ends if you’re fussy.
It was impossible to do a true side-by-side with my LG monitors because of plain physics (I don’t have a big enough desk, and swapping one of my monitors for testing the P20 alongside would require me to rewire a bunch of things), but we still haven’t been able to get the colours quite right, in any setup.
But with HDR enabled, I couldn’t adjust the monitor’s colour settings (and the iPad offered no help there, either):
The OSD in HDR mode on the P20.
Note that I’ve mostly given up on it on computers both due to the wide variation in colour gamuts and the fact that it only really works for me on the Mac (and even then mostly on internal displays), so none of my machines are set to output HDR–but letting YouTube HDR videos play out at 4K on the P20 while I worked provided some uncanny “this feels like a window” moments, even if some of it was over-saturated until I settled on a colour space I liked.
In my tests, switching to HDR made the desktop look washed out, with muted colours on regular screen elements, and switching back made the difference particularly obvious on the P20. Even on the Mac, some YouTube footage was completely washed out in HDR mode–I couldn’t isolate whether that was down to the content, the software or the monitor.
Feature-wise, the one thing I found myself missing in the P20 was the ability to display two inputs–although it would likely have been pretty awkward in this 4.5:3 aspect ratio, I do use that capability a lot on my LG ultra-wide (to have work and personal machines alongside, in an approximately 4:3 ratio) and on my LG Dual Up (to have my Mac and an SBC, or a TV dongle to watch the news in more troubled times).
My objection is to having another remote at all: it’s the kind of loose end that I invariably end up losing or finding with a dead battery in between the three times I am likely to use it every year (which has been the fate of most non-TV remotes in the house). I already have three of these things for different kinds of portable monitors and gadgets, and those never work reliably.
I’d have much preferred an LG-like five-way switch to another remote to keep track of.
There are no built-in speakers, so if you want audio beyond what your computer or tablet provides, you’ll need separate speakers or headphones.
I didn’t miss them myself–the MacBook, my iPad and the Surface Laptop I was working on all have great speakers, and the only mild annoyance was when any of the machines forgot to keep using its internal speakers.
A reminder that any monitor is no match for sunlight and reflections, especially if it’s glossy…
After all the delays, the P20 has actually been a very good fit for the way I work. I like the height, the resolution and being able to write or research without shuffling windows between two displays, and I particularly like using it with the iPad–so much that it is going to stay on my living room desk (where I retire to focus and write) for the foreseeable future.
And not just for myself, since with college-aged children around, having an extra display in the living room has proven to be extremely useful for everyone in the household–although fights haven’t broken out over it yet.
The colour tint is the only reservation I’d have before recommending it to anyone doing colour-critical work. I don’t have calibration measurements, but both of us could see it, and settling on a cooler preset isn’t the same as correcting it. But we did manage to offset it, so I would rate it as “finicky”.
But for my purposes–writing, coding and everyday use, plus occasional Shapr3D sessions–the proportions are still perfect to my eyes.
As many people have remarked, the moat between ideas and technical execution is narrower than ever, and that has a number of consequences–both when it comes to investment (in this case, personal, although I am collecting war stories…) and focus.
And I think I need to be more selective about what gets my evenings, since I am back at work and already spending too much of my free time building things on a computer.
Why?
Because I am right back where I was before my break, spending too little time doing anything but sitting at a computer, or using a computer to do things that only work on a computer.
I keep having ideas, and even though I finish my workdays achy and drained, I inevitably get caught up in the excitement of being able to build stuff quickly.
And since my free Codex subscription is due to end this month, I’m trying to make the most of it…
I need to get back to electronics, hardware, and reading (maybe even music) as a hobby, and stop spending so much time glued to a screen–which is something I have been trying to balance against my writing backlog, and part of the reason the notes this week are relatively sparse.
But there are some hints of progress in finding a better balance between screen time and other activities:
I finally hit my daily step goal for several days in a row, which has been a small but satisfying victory and has eased some of the strain from sitting at my desk for long periods (albeit not completely).
The trick? Doing the grocery shopping myself. You end up walking more than you would if you relied on delivery, and it adds a bit of variety to your daily routine. Not to mention milk carton lifting, which is a surprisingly effective upper-body workout.
I spent some time (re)setting up test machines and going through my review backlog, trying to catch up on notes and tasks that had accumulated while I was focused on other projects–even though I have little to show for it in terms of output, I managed to at least organize most of my notes, some of which date back several months now…
As an offshoot of the work I did with micro-VMs, I’ve been poking at two related problems for a while: getting agents to preserve their state, and tackling the holy grail of freeing computing environments from being tied to a particular machine.
legion takes that idea and gives it a twist.
Rather than packing everything into one portable process, it is a self-hosted runtime for durable agents backed by a Raft cluster, with WASM and Bun functions (making those available across the whole cluster is still work in progress):
every agent turn is event-sourced
nodes form a Raft cluster
code is deployed as content-addressed WASM modules or Bun bundles
it’s all organized as a 9P namespace
The namespace provides a uniform way to manage the whole thing, and was, I confess, a whimsical choice.
But my intention is that crashes, restarts and individual machines going away should not make an agent stop or lose track of ongoing work, and so far this seems like a moderately sane way to do it.
This is still at an early design stage and might end up going nowhere, but there are already enough runnable examples to exercise most of the architecture:
Legion’s web chat reconnecting to a durable conversation
I had an epiphany about how to keep track of meeting agendas without relying on my memory alone: give the computer the talking points and have it listen for what we’ve already covered, leaving me to pay attention to the conversation.
And yes, [Teams] does that, but I wanted something that works entirely on my Mac and was fully local, without relying on any cloud services, plus I was curious to see how far I could push Apple’s on-device models for better privacy and responsiveness.
Which is why swift-smart-prompter started as a little demo of how much useful work Apple’s on-device speech and language models can do, even on relatively low-end hardware.
Then my NLP background kicked in, and it grew into a Mac app that listens to both sides of a call, tracks which topics have come up and suggests a short next response in a floating cue panel (which I can keep above the meeting window, instead of continually looking away to consult my notes):
Sometimes I am just too tired to keep track of meeting agendas
And, of course, there’s a hack: instead of using diarization, I rely on the audio split: ScreenCaptureKit gives me the microphone and system audio separately, so the transcripts are labelled “You” and “Call”–it doesn’t try to distinguish individual people at the other end at all.
And although I’ve been hacking on on-device translation and semantic understanding, that’s still a bit slow, so topic matching has a keyword-based fallback, with Apple Intelligence adding contextual cues and coverage classification that so far seems to work regardless of the language being spoken. Mostly. Ok, for English and Portuguese, at least for now.
Plus, I can manually correct the checklist when it gets things wrong. Without Apple Intelligence, it still shows the next uncovered point.
It all stays on the Mac, with no cloud API or account, and neither audio nor transcripts are written to disk. It does need macOS 26 and the appropriate on-device speech models, and multilingual use is a bit of a chore, since you have to fish around to enable everything.
On a more pragmatic note, I have a “me” problem with Azure Virtual Desktop: meetings happen inside it, but sometimes I need to share something that is on my local desktop, which the remote machine obviously cannot see.
My poor man’s fix is provisionally called ShareCam: select a region locally and pipe it into AVD as a camera.
Crude, but it works, and once I clean it up I will put it up on GitHub someplace:
Selecting part of my local desktop to send into Azure Virtual Desktop
And yes, this shows up instead of my camera view, but that is perfectly acceptable for my use case. The only real challenge is that screen sharing typically has a dedicated pane in Teams and Zoom, whereas my solution just replaces the camera feed and people have to arrange it themselves accordingly.
This was also based on rcarmo/swift-app-template, which I’ve been tweaking to build all my new little Mac tools. It took me all of… 25 minutes to get it working end-to-end, including a second pass for individual window selection and capture that still needs some UX tweaks. gpt-6-astra did the core implementation in less than 15 minutes–having the template ready certainly helped.
And this, I think, is what I should be doing more of: investing my personal development time in satisfying life hacks and little tools I will actually use instead of trying to boil small oceans–those I can always keep doing at work…
I have a long and somewhat embarrassing history with LISP that goes back to the years when it was fading from academia and LISP machines were giving way to Macs and DECstations (a transition that should be familiar to anyone who read the UNIX-HATERS Handbook), so I got properly hooked on Clojure when it came out.
But Clojure had the huge disadvantage of being tied to the Java virtual machine. That dependency was also one of its superpowers, but I always saw it as its biggest flaw.
Despite that, I used it in production for a few years and have been mourning the fact that you can’t have it without the JVM ever since.
On a Raspberry Pi or an ARM SBC, starting a JVM just to run a REPL feels like bringing a shipping container to a picnic.
Joker was the escape hatch I’d been looking for–a standalone Go binary that understands most of Clojure’s syntax and needs no external runtime.
I started using it for scripting and linting years ago, and when I began thinking about building gi (my own lightweight coding agent), embedding Joker as the extension language was the obvious choice.
There was just a tiny little problem: it was slow.
Not “a bit slow”–it was orders of magnitude slower than Python on anything involving loops, arithmetic or recursion.
Fine for linting, but useless for anything else.
The Go-Joker notebook rendering Mandelbrot through the WASM-backed imaging path.
But I recently realised that I never really put together all of my notes from last April, and it’s long overdue to write a proper post about it, so here it is.
My deep, dark past poking at the JVM (did you know that HP had one audited externally in Europe? Ask me how I know) and my limited time working on .NET internals–plus a lot of reading about the JVM’s tiered compilation–all told me the same thing: the path from “slow interpreter” to “fast interpreter” follows a fairly predictable arc. First you identify the hot paths, then you lower them to a simpler representation, then you specialise that representation for the common types.
If you’re lucky, you can go further and compile to native code for the innermost loops.
This isn’t something I’ve done often (not for a few decades, really), but I used to discuss it with one or two compiler nerds I worked with ages ago–we had long, weird phone calls about gcc, of all things–so I had an idea of how to do it.
The trick was getting a coding agent to do most of the mechanical work while I steered the architecture.
I had gpt-5.5 implement each layer while I provided the design constraints, which initially boiled down to:
flat bytecode
register-based execution
no heap allocation for primitives
a tree-walker fallback for anything weird
A few hours of thumbing through ancient books, interspersed with liberal swearing and infected by WASM’s relative madness, eventually got me to a tiered execution engine:
Go-Joker’s tiered execution pipeline, including WASM, typed IR, boxed IR and tree-walker fallbacks.
Each tier handles what it can and drops to the next for anything more complex.
Early on, execution would start in the tree-walker and be promoted as the interpreter recognised patterns it could optimise, and the implementation grew progressively more intricate from there.
And since I needed something to compile, I went out and grabbed The Computer Language Benchmarks Game, which has a range of computational scenarios that resist trivial optimisation (to a degree), along with ready-made comparisons.
The first step, heavily inspired by .NET, was compiling hot loops and functions to flat bytecode–an intermediate representation with fixed-size opcodes, a value stack and no allocation for integer/float operations.
This alone got mandelbrot from 450ms down to about 40ms.
The key insight (which I stole from the JIT literature) was that most Clojure loops are either purely numeric or purely structural–they rarely mix–so you can have a typed path that handles Int/Double without boxing and a boxed path for everything else.
And my old JVM tricks also paid off: stripping Int and Double down to single-field structs (8 bytes, stack-allocable) cut allocations by half across the board. That is the kind of change an LLM won’t suggest unless you ask very specifically, because it breaks the type hierarchy in ways that it “feels” are wrong until you measure.
The realisation that pure numeric loops could go further came when I noticed that wazero (a pure-GoWebAssembly runtime) could JIT-compile WASM to native code–with zero cgo, another requirement of mine.
If the tree-walker detected a loop that was purely integer/float arithmetic, we could emit WASM bytecode for it, hand it to wazero and get native-speed execution (well, almost) without leaving the Go process.
This was huge fun: the arithmetic benchmarks went from 12ms (IR) to 0.24ms (WASM), giving what used to be a Clojure interpreter pretty much Bun/JavaScriptCore speed.
It’s limited–it only handles cases where every value is a known numeric type and there are no collection operations–but when it applies, it’s great.
The rest was just grinding out the hotspots.
Per-instance function compilation caches (irGetFnProg), capture-slot optimisation for closures (captureSlotSet), a StringCursor native type for zero-allocation string iteration (because, well, it was getting embarrassing to append stuff to strings…), transient vectors for non-escaping loop mutations and tail-call rewriting at parse time–I had to ask piclaw to check the ordering, but this was all done by systematically going through the benchmarks.
Given my fondness for profiling, I wanted this thing to be self-diagnosing, so I asked gpt-5.5 to add a runtime introspection namespace (joker.runtime) so scripts can inspect their own IR, WASM output, escape analysis and allocation profiles.
The original goal wasn’t really to build a fast Clojure (well, not this fast, at least), but as usual I wandered off big time. Eventually I had to get back to what I wanted in the first place: an extension language for gi that:
is fast enough for real work (not just config parsing)
has a REPL for interactive debugging
can introspect its own execution
I now have all five.
Scripts and extensions for gi can be written in Clojure, stored in the SQLite database alongside everything else, and executed at speeds that range from “competitive with Python” to “competitive with JIT-compiled JavaScript”, depending on the workload.
I’m not doing anything with gi right now, but the above is close enough to the LISP machine dream that I still use go-joker quite frequently.
I could not have done this in two days without AI–the mechanical work of implementing 30+ IR opcodes, writing typed dispatch paths, plumbing WASM emission, and generating benchmark harnesses would have taken weeks by hand.
But (and this is the interesting bit for me) I also could not have done it with AI alone–the architectural decisions (tiered execution, typed vs. boxed split, WASM for numeric leaves, the fallback chain) came from knowing how the JVM and .NET CLR work internally, remembering that I had a copy of Smith & Nair and the wazero source (kudos), and spending years thinking about what makes interpreters fast and (let’s face it) taking a few shortcuts.
All in all, I think this ratio of thinking to execution (and, by the way, go-joker comes with a massive battery of tests I would never have thought of writing) is what I want to get out of most of my projects.
It’s never going to be as popular as the Bun rewrite in Rust, but it was a lot of fun.
This is indeed the end of an era. As I wrote when the transition was announced, Cook built Apple into what is probably the most formidable product manufacturing and logistics organisation on the planet (I remember when Nokia was considered the same, albeit only for mobile phones), and Patrick McGee’s Apple in China makes the sheer scale–and strategic cost–of that achievement painfully clear.
But Cook was never a product person, in my view, and that showed in the decline of overall software quality over the years. Contrast that with the tremendous growth in services and the sheer volume of the App Store–run by Phil Schiller, who is also changing roles today–and the lasting impression is one of relentless efficiency, perhaps a tad lacking in soul.
Everyone has high hopes for Ternus as his successor, particularly around QA and actual product focus. Cook will stick around as executive chairman to deal with politics (his understated main focus these days), but I am going to reserve judgement for a year or so…
Aug 30th 2026 · 3 min read
·
#eink #productivity #readers #supernote #xteink
I’m now back to work and already embroiled in far too much, so I’m going through my infinite set of mental checklists and trying to relax by offloading some of the stuff I never got around to writing down.
While I was on vacation, one of the things I did was tune out (as much as possible), which meant relying more on my e-ink devices.
I’ve written a bit about my long-term experience with the Supernote Nomad, but that was almost a year ago, and in the meantime there have been quite a few software updates–plus additional tweaks of my own.
But the interesting thing is that none of that changed the way I use the device.
It’s definitely replaced my Kindle for nearly everything (and more).
It’s been by my bedside for a year and a half now, and I still use it to take notes and catch up on the news.
Catching up on the news has become somewhat more frequent, as I don’t need (or want) the additional features (or distractions) afforded by my iPad.
I haven’t used it more even though I do most of my reading on it, but I also haven’t used it less, despite a fairly long hiatus in my regular reading habits.
It is very handy, virtually weightless when detached from its cover and frictionless for noting down stuff–even during work calls, when I mostly take notes to reinforce my memory of the event rather than for accuracy.
So it was a no-brainer to take it along for a week in Spain, but the new environment reminded me of three shortcomings:
The lack of a front light makes it hard to use for late-night reading marathons (and it’s still the thing I miss the most, even if I love how light and crisp the screen is).
It can be slow (and crashy) when running Android apps (the Kindle app crashed a few times).
I still can’t read or annotate PDFs on it comfortably (going “back” to it instead of an iPad makes the screen size and speed differences pretty obvious).
I still wish it had a fingerprint reader, too.
And, these days, I would probably appreciate a microphone for privacy-respecting dictation (I haven’t played with Bluetooth on it enough to tell if that would be a viable option).
But a bit of hacking on picoflux made it trivial to read the daily news comfortably over hotel Wi-Fi, and there are a lot of small hacks that I can pull off, even if the base system is already well polished.
And even though I don’t use it often as a regular tablet, Firefox, Tailscale, Termux and Obsidian let me do the few things I need to keep tabs on my home lab and “regular” notes.
But based on screen time alone, the e-ink device I used the most on vacation wasn’t the Nomad–it was the Xteink X4.
I installed a nightly build of CrossPoint Reader on a whim to see if it fixed my Wi-Fi problems (spoiler: 1.5.0-rc didn’t, 1.6.0-rc apparently does now that I am back). The X4 worked perfectly, and I carried it almost everywhere we went.
At this point, I would consider it the perfect travel and beach gadget.
It is easy to pick up/put down/put away, has absolutely zero distractions, and gave me everything I needed for entertainment and learning.
My 3D-printed hard cover protected it, and I added a little rubber USB-C plug to keep sand out.
Vacations and trips are self-contained periods when it’s pretty easy to cut down on noise and distractions by shifting to different devices for quieter, more focused downtime.
It doesn’t surprise me that this went so well.
And although it is impossible to gauge how much time I’ve spent on e-ink devices over the year, I want to spend more time with them as I try to stay focused and productive.
Doing more on low-end devices is going to be harder, of course, but the quality of the downtime also matters, and at least I can build my own solutions.
For instance, I’ve been making a few notes about improvements to my OPDS and syncing server, and I’ve been meaning to investigate Bluetooth audio and put together a dictation plugin for the Nomad–the SDK seems straightforward enough…
Aug 28th 2026 · 3 min read
·
#3d printing #ai #home automation #notes #weekly
I came back to work this week, started catching up on everything, and decided to go out for groceries without an umbrella (it is still August, right?) and got drenched.
That might be why I ended up having to take a day off–the fact that there was a virus rampaging through the household for a few days might have been entirely coincidental.
But it removed all the momentum from my return to work and didn’t improve my ongoing shopping list of ailments (back, plantar fasciitis, etc.).
Trying to get some exercise in by going to the pharmacy was not on my bingo card.
Since misery loves company, I followed up on the other day by pulling up a spreadsheet and trying to figure out how deep I would be in the hole if I bought a new desktop Mac, and… nope.
I don’t think I am going to buy any new Apple hardware this year (unless something critical breaks).
In fact, maybe no hardware whatsoever except for reviews, which just feels weird.
I got some very generous donations recently, though, so expect interesting hardware write-ups soon.
In that spirit, I revisited a little hack that let me keep using old hardware: we’ve had M5Stack ESP32 cameras in the house for years, but Apple, in their wisdom, broke HomeKit repeatedly until they stopped working (to be fair, they probably shouldn’t have worked in the first place).
I’ve used them to keep tabs on 3D printers, chimneys (it’s extremely irritating when your upstairs neighbours decide to renovate their kitchen), and other things, but they had become kind of useless since HomeKit didn’t support their MJPEG streams and I really don’t want to use anything but the Home app.
Well, it turns out that my earlier ESP32 hackery paid off: I realised that, yes, an ESP32 can do H.264 encoding, and spent a while iterating on the problem with gpt-5.6-sol–first getting encoding to work, then trying to figure out why HomeKit didn’t like the stream and mapping out all the parameters involved, and finally adding caching and interleaving encoding with streaming until I got 5fps (which is enough for most uses).
As I was reading this, I realized that the ESP32 HomeKit debugging session I had running was taking a while, and this happened:
Me: What are you doing?
Agent: I’m resolving Apple’s private video-resolution lookup table to determine whether iOS 26 supports 320×240 for HomeKit live streaming. The decompiled source hides the numeric constants, so I:
Downloaded/extracted the iOS 26.1 arm64e dyld cache to /workspace/tmp/ios26-dyld/.
Built and installed the read-only apfs-fuse utility needed to mount Apple’s APFS image.
Planned to extract HomeKitDaemon and decode its resolution table.
Me: Oh, OK. Carry on then.
These are weird times.
I was using piclaw for this, but a few days later Codex pulled a very similar stunt on me–I am increasingly of the opinion that sol is perhaps a bit too proactive…
This week I cancelled my LinkedIn Premium subscription, which is ironic in far too many ways to comment here, but doing so felt long overdue.
The reason I did it is that even with a corporate discount I was getting negative value from it:
It has devolved into a vanity fair that is worse than Twitter (if that is possible, solely because I still get some value from my daily 15 minutes of Twitter).
There was absolutely zero sense in paying for any of the “perks” it offers, all of which I have used approximately zero times.
The spam was getting really annoying, even after I patiently disabled everything.
People I meet at work can use my e-mail address to connect with me, so contact discovery is moot.
And, in a shocking, shocking development over the past few years, recruiters don’t really use it for recruiting any more–they just spam you without even checking if you’re a match.
None of that is worth the money–unless they were paying me to use it.
I can’t really remove it from my phone yet, but… we’re getting there.
I also spent a fair amount of my downtime filing e-mail and poking at a few interesting things, largely to keep myself organised.
For good measure, I decided to take another stab at the “personal CRM” thing–doing reviews is great, but you end up asking yourself “what is the state of X?” too often, so I got piclaw to whip up a moderately sensible data schema:
The data model behind my personal CRM experiment.
The key thing here is that there is no UI and no integrations–I just drop e-mails (or entire mailboxes) into a chat, and piclaw files them away and reasons about them.
Retrieving data is, as you’d expect, trivial:
If I want to see the overall status, I get an interactive Kanban board in the piclaw UI.
If I ask about someone or something, I get search results and a little table of our correspondence, including a plain-English summary of what transpired.
I thought about adding this to Memento, but the transactional and threading parts wouldn’t be a good fit (the CRM handling skills and modus operandi went there automatically, though, which was nice).
Turns out sol’s proactivity has manifested again. I asked it to review and test the secure P2P messaging add-on, and, without any intervention on my part, it provisioned two additional piclaw instances, tested the add-on across all three and then cut the 2.15.0 release.
I only asked it to review and test the add-on.
To paraphrase Douglas Adams on children and off switches, I may need to work out where sol’s is…
Aug 28th 2026 · 1 min read
·
#hardware #open source #reinforcement learning #robotics #rockchip
This is extremely impressive, not just from a design and kinematics perspective, but because the entire 50Hz control loop runs locally on an RK3566 (not the RK3588 I first assumed), with the ONNX movement policies running on the robot itself.
The repository includes the MuJoCo/PPO training code and Rust runtime, so every shipped behaviour can be retrained–which is quite something for a 25cm, 800g biped with fifteen motors that can walk, skate, grab things and get back up by itself.
It is a completely superfluous thing to spend north of $500 on, and I have no idea what I would do with one or where I would find the time, but it presses all the “shut up and take my money” buttons–and if NVIDIA’s acquisition of Hugging Face goes through, I suppose we may have to call it the Jetson Donald or something…
Aug 28th 2026 · 1 min read
·
#ai #hardware #ram #semiconductors #tariffs #trump
Trump’s timing is impeccable, as usual: after the AI boom helped turn RAMageddon into a sustained memory price surge, he has apparently decided that what data centres, PC builders and everyone buying electronics need next is a tax on the chips themselves.
And this lands just as the AI industry’s “teaser period” is supposed to end–when vast take-or-pay compute commitments become actual bills and utilisation starts to matter. Nothing says “winning the AI race” quite like making the entire stack more expensive just before the economics get real…
Aug 27th 2026 · 1 min read
·
#acquisitions #ai #hugging face #nvidia #open source
Well, this is unexpected. There were rumours while I was away–and Hugging Face reportedly turned down a $500 million NVIDIA investment earlier this year–but buying the entire thing for $12.9 billion doesn’t fit my mental model of NVIDIA, given its… spotty Open Source report card. They certainly have the money, given their current valuation and a quarterly revenue run rate closing in on $100 billion.
This feels like the same sort of stack consolidation that happened as public cloud took off and GitHub was acquired: owning the place where models live is a lot more ecosystem presence than pushing Nemotron models out in a corner and hoping people notice. I guess it makes sense. I am just not sure Hugging Face under NVIDIA is quite the same proposition…
Aug 25th 2026 · 1 min read
·
#ai #apple #apple silicon #mac #mac mini
The big difference Apple isn’t really drawing attention to is memory bandwidth. The M6 tops out at 170GB/s and 32GB of unified memory, whereas the M5 Pro offers 307GB/s and up to 64GB–nearly twice the bandwidth, as well as twice the memory ceiling. That is the number to watch for AI inference, not just CPU and GPU benchmark deltas.
The less amusing part is pricing: a halfway decent M6 configuration with 32GB RAM and 1TB storage lands at roughly €2,000, and an M5 Pro with 64GB RAM and 2TB storage costs about another €2,000 on top. And the Mac Studio can be yours for… a kidney, or two.
Aug 25th 2026 · 1 min read
·
#ai #legal #llm #open weights #privacy
The bit I like most about Thomson Reuters’ new model is that it starts from open weights–specifically Qwen3.6-35B-A3B, via Snowdon–and then uses continual training on Thomson Reuters’ own legal, tax and news material. There is likely an opportunity here for AI labs to provide tailored industry models with much better provenance, rather than aiming for AGI.
I am curious about how hyperscalers will tackle this–fine-tuning and training have always been available in Azure, for instance–but what I would really like to see is a definite move towards entirely local, entirely private models for regulated industries. That would also imply some decentralisation, and might give Europe a chance in this madness.
Aug 23rd 2026 · 4 min read
·
#3d printing #ai #home automation #notes #weekly
Tomorrow I’m going back to work after a rather lopsided summer break (not feeling up to it physically or mentally), and the social network pendulum is swinging back into a bit of normalcy as I progressively tune nearly all of them out.
Twitter (which I refuse to name otherwise) is still a controversial (but time-boxed) part of my news intake since Mastodon has turned into a desert for any serious AI discussions other than violent opposition, LinkedIn is still crammed with sales-y ego trips and YouTube keeps peddling glitz rather than substance, but I do need to figure out what is going on.
For science, I dipped into a few of them over the weekend, which did not improve my general mood–it doesn’t look like I am going “back” into a saner industry (rather the opposite), but at least I sort of got my book reading habits back over the break, and I can finally say I did more productive stuff than just doomscrolling.
First my shaver broke in the most subtly annoying way (the retaining latch was clearly not designed to outlive the mechanism), then I decided to do something about designing and printing cases for a bunch of SBCs and realised I no longer need to buy dust mesh for those:
A few things that needed fixing
Turns out I can print 0.1 mm-thick dust filters with zero issues using PLA and a 0.4 mm nozzle, even if the prints themselves are a bit susceptible to minor flaws if the filament is aged.
But being able to design them to size (and shape) is promising.
I ended up trying Qwen 3.8 on the only machine I have that can somewhat run it at speed (my MacBook Pro M3, which has 36GB RAM), and… it sort of worked (with RAM to spare, which is nice), but quickly reminded me why I prefer doing AI on servers as the battery visibly drained and the machine became warm enough on my lap to be noticeable.
Doing small programming tasks (algorithms or singleton functions) without an agentic harness context was doable (so I could probably rely on it if I was doing the same stuff I needed three years ago), but it takes forever (something like 30 minutes) to churn through a basic sub-32Ktok agent context, so… I still need better hardware.
Under the pretext of upgrading to Bun 1.4, I did some of the long-standing TypeScript cleanup work in piclaw, dropped in a few fixes and dependency updates, and let it loose.
As recounted in what is probably this year’s longest post, I just want to use the thing now, so unless there’s some amazing new frontier model out or some critical fix, I’m going to try to throttle back on it–also, my free Codex subscription is running out soon, so when that goes I’ll have to re-think how to keep my work and hobbies separate.
But things are looking up–RAM use seems lower, most of the annoyances I had seem to have been fixed, and there are (crosses fingers) no immediate issues.
After a very careful waiting period, I finally updated my home automation setup to homebridge 2.x, which, of course, broke things.
In my case I am using homebridge-webos-tv to control my living room TV and homebridge-mqtt to create virtual HomeKit devices from Node-RED, and they both broke instantly when I upgraded to 2.4.0 (yeah, I waited that long) because they seem to be fairly niche and not fully tested with 2.x yet.
The solution (which took a while to figure out) was to disable their child bridges and force the use of the bonjour-hap advertiser in the top config stanza:
At this time, nearly all of my automations are pure native HomeKit, with only a few things patched through Node-RED (which I upgraded to 5.0.4 this week as well), which is great except that it exposes me to Apple’s general penchant for breaking things every now and then.
But everything “just worked” aside from a minor configuration glitch in a “Virtual Bell” accessory that I use to merge our doorbells into a single alert, and my usual fiends, the ESP32 cameras that we still use to check on open windows and stuff.
Those tiny and slow cameras are long overdue for replacement, possibly with something like the Aqara G100.
The M5Stack hardware was never really meant to be HomeKit compatible, but I’ve been hacking at the ESP32 firmware for years and they have suffered through years of Apple breaking things subtly (without even documenting the right behaviour for camera devices), so at this point I keep them around for a sort of sport.
If you’ve missed my apple papercuts update, well, I’ve been trying to get a lot of writing done on my iPad, and… stuff happened.
I’ve also put together a swift-app-template to see if I can standardise a bit the stuff I am doing, and made a point of cramming in as many quality-control steps as possible so I don’t keep reinventing the wheel, starting with SwiftPM defaults and ending with a comprehensive set of agent skills consolidated from my library.
I also pinned down and fixed a site rendering bug (images inserted using certain ancient formats of Markdown references would be interpreted as page links).
Building on last week’s book marathon, I finished The Shattering Peace by John Scalzi, which was a nice, fun romp, and got started (again) on Norse Mythology, still one of my favourite reads.
I think I’m ready for whatever Loki tosses at me tomorrow when I log back in.
Aug 23rd 2026 · 1 min read
·
#editors #macos #markdown #writing
By the same developer as Ishmael (and all the goodness around the best Python TUI libraries in existence), Dinkus is an equally polished Markdown editor that was an instant buy for me. Full disclosure: I got a code for Ishmael when it was released, but paid for this one, which is rare enough to give you pause.
So far the experience is great, although I miss some of the niceties Obsidian has, like Quick Actions and typeahead find for quickly switching to other files. Still, it is nice to have something else that is snappy, polished and doesn’t look like a code editor.
For me, the only notable omission is that reference links (and footnotes) at the bottom of the document seem to be completely ignored, even if the source view knows what they are.
This is a short follow-up to my Apple Papercuts piece, wherein I bunched together a few more annoyances that I’ve come across while using my iPad Pro extensively on vacation.
This is totally up my alley, given both my recent reflection on infinite software and the fact that I recently started doing small Swift apps again. With agents taking care of much of the incidental work, small native utilities stop looking extravagant and become the obvious alternative to yet another TUI.
Just imagine if we could run our own iOS apps for more than a week without Apple’s restrictions…
Aug 21st 2026 · 15 min read
·
#agents #ai #architecture #arm64 #bun #pi #piclaw #typescript
I’ve spent the better part of six months building piclaw–my personal AI assistant, workspace and, occasionally, agent swarm–on top of Mario Zechner’s pi engine, and I think it’s time to write about not just my motivation but also how I feel about having invested that much time into the whole thing.
Bun has always been divisive because of its approach, and its acquisition by Anthropic and subsequent AI-driven port to Rust haven’t helped (especially given the way some people these days react to both the company and the “process” that led to it).
But amidst the insanity the JavaScript ecosystem has always been, its batteries-included approach (which also has its detractors) and overall performance–RAM use aside–have been pretty amazing and very, very useful to me recently. Yes, it’s starting to show signs of bloat and perhaps even “overfitting” to AI development and automation (case in point: it now includes direct support for webviews and thus “agentic browsing”), but I’m going to keep using it until something saner comes along.
Aug 20th 2026 · 2 min read
·
#ai #llm #saas #software #web
I am most definitely not the first person to mention this, but the past year has seen a Cambrian explosion of two things: AI deniers who base their judgement on very limited exposure (or effort to use it) and thousands of variations on software of all kinds, from the perennial to-do list to AI-infused toothpicks.
This changes effectively nothing I care about and continues to be completely laughable. Apple has rearranged payment options, commissions and eligibility rules for alternative distribution, but there are no changes whatsoever to the Apple Developer Program or to the utter inability to develop and run my own software on my own devices without paying Apple for the privilege of having it not expire after a week.
As a fan of the original (and highly existentially conflicted) Frasier TV show, I found this delightful solely because it exists, although a few minutes playing it on the web made it pretty obvious there is a lot of depth I will never have the patience to go into because, somewhat like Frasier, I do not seem to ever catch a break.
Aug 17th 2026 · 1 min read
·
#hardware #llm #local inference #quantisation #qwen
There is certainly quite a bit more to optimise in local inference–Simon got around 72% more throughput from MTP speculative decoding–even if most readily available (and not hugely overpriced) consumer hardware still can’t quite get to the point where memory bandwidth makes dense models usable interactively.
I can’t wait for an A3B or adaptive quantisation version to come out to see how it fares on even lower-end hardware.
Aug 16th 2026 · 4 min read
·
#agents #ai #archivebox #golang #homelab #inference #notes #rust #weekly
This was a different week, partly because we decided to watch the eclipse from a Spanish beachfront and partly because I actually read three books. There is an entire sub-thread around my back and neck aching worse than ever and my sleep patterns looking like a game of Splatoon that I will spare my readership, though.
Wow, 30 years. Part of that seems to have whizzed by, and it has been a long while since I last played Quake. I always hated the hellish look, but the technology was irresistible–and looking back, it is pretty amazing how much it shaped my career, or at least my pastimes.
Running Quake servers at an ISP is quite literally how I initially ended up in marketing instead of engineering, and it got me exploring networking, servers, real-time graphics and all sorts of other things I am still interested in today. I may have to make time for this new free episode, if only to see what thirty years of hindsight looks like inside the original engine.
Aug 6th 2026 · 6 min read
·
#3d printing #flashforge #hardware #kingroon #klipper #two trees
Since I got a new printer last week and I’ve been documenting my endeavours in this realm in a rather haphazard way, I thought it would be useful to do a sort of catch-up/snapshot of where things are (and have been) for a while now.
It’s about time. I’ve been running adapted versions of Proxmox on ARM for a few years now–first Pimox on a Raspberry Pi 4, and later on RK3588 boards–and ARM servers have been around for at least as long, so the fact that official support is only arriving now makes me a bit worried about Proxmox’s ability to do off-the-wall things like pve-microvm.
But this is proper support, with feature parity across VMs, LXC, clustering, ZFS, Ceph and backups, plus ISO images and package repositories–and it will be very nice to have official upstream packages when I go back into homelab ARM server land.