The Chuwi MiniBook X N150, One Year Later

It’s been a little over a year since I , and it remains one of the very few modern machines to preserve the netbook form factor–so, given the attention the original review garnered, I thought folk might be interested in how it has fared.

Since then, it has spent enough time in bags, on desks and hooked up to odd displays to make the honeymoon period irrelevant–and in the process it has become one of those machines I reach for without thinking too much about it.

Disclaimer: Even though this is a long-term review, the machine was originally sent by Chuwi, and the usual still applies.

The Chuwi MiniBook X connected to an external display
Livin' the life

Hardware

I have very few complaints–in fact, practically none. The keyboard is still perfectly usable, if a little stiffer than some of my other mobile devices, and the screen’s higher pixel density remains one of the main reasons I enjoy using it. The machine’s responsiveness, even in power-saving mode, has made it a great writing and coding device.

Over time, and after a few software upgrades, minor niggles like trackpad smoothness and the slight excess sensitivity I occasionally noticed also faded away. Mostly.

When my hands feel slightly dry I still notice some “noise” and pointer tremors, but other than when using an external display (where a mouse is slightly handier for flicking the pointer across a lot more pixels), I have had no need to use anything to compensate for the trackpad size–partly because the touch screen works fine for quick focus changes and tablet-like text selections, and partly because my workflow on it has become very keyboard-centric.

I’ve since plugged it into various USB-C displays, and it can drive a 5K panel with ease. That also makes it a useful thin client when I want to sit somewhere else and remote into bigger machines. The battery does not last me as long as an ARM machine, but I haven’t noticed any degradation yet.

Quality-wise, the only issue I have had so far is that most of the rubber feet came off, which led me down a small AliExpress rabbit hole to find suitable replacements. The ones I bought are even a little better for airflow, since they are slightly taller.

There are also minor scuffs in the metal cover, but that’s hardly surprising given how much I use it, and I’d rather have a metal cover with a few scuffs than a plastic one that would have cracked or marred by now:

Scuffs on the MiniBook X metal cover
This is fine

Software

I’m now running 44, after upgrading from 43 with no real drama other than the LUKS decryption screen still having the same text-rendering bug. Since GNOME was not making good use of the screen real estate and could be a bit heavy in power-saving mode, I switched to Niri and Noctalia Shell as my primary desktop environment–which then cascaded “up” into my other Linux machines.

Niri and Noctalia Shell running on the MiniBook X
Why would I ever need more than two windows at once?

, Zen Browser to access a local piclaw instance, and now cover 99% of what I need from it. Anything else I need tends to become a small Noctalia Shell extension, which sometimes makes the whole setup feel like a tailored appliance.

I have felt little need to install much else–, and the rest of my CAD tools are there when I need them, and although the hardware imposes obvious limits, they are quite usable for minor edits.

I still get occasional Wi-Fi fluttering in one spot of the house due to the Linux driver bugs I discovered when setting up guided handover on the APs. on the Wi-Fi side mostly fixed that, so I do not really consider it a MiniBook problem anymore.

Verdict

The main change since the original review is that the stopped being a cute novelty and faded into the background as a reliable everyday tool.

It is still small enough to feel slightly improbable, but at least to me it never feels compromised in the “netbooks are too small to be useful” sense–the display is excellent, the keyboard is good enough, and the N150 is more than adequate for the mix of writing, coding, browsing and remote access I use it for. It is also very quiet in power-saving mode.

I would still like better Linux polish around the first-boot and decryption-screen oddities (both issues), and the rubber feet should have lasted longer–the only wear issue I can ascribe to Chuwi, and that is also very much on me given how much I use it.

But it has aged very well for a machine this size, especially one that can run a modern Linux desktop without making me think about performance all the time–although it certainly helps that it shipped with 12GB of RAM…

Notes for July 19-25

I have been mildly unsuccessful at doing stuff in my free time this week due to personal and family concerns that somewhat limited , so it was only sometime around Thursday evening that I realized John Dvorak passed away. It was weird to read about that since I (well, along with a small coterie of local geeks) had dinner with him when he visited Lisbon in late 2009, and at the time I was preoccupied with besides the start of the arc that would eventually make me leave Vodafone, so I don’t even have photos (but they’re out there).

For those tuning in today, almost two decades after that happened, going through my notes from 2009 brought home , and how my career change was essentially driven by a period of exhaustion that is not that different from what is going on right now, and that I tried to “fix” by .

Well, that was a mistake I’ve definitely learned from. .

The good news is that unlike my near-burnouts in recent years, I am now both mentally and physically tired but with very clear ideas of what I want to do next, so I’m taking advantage of summertime and preparing to batten down the hatches and finish/pause some of my ongoing projects to focus on more hardware stuff, which takes longer and is less glamorous but has two primary advantages: it gets me off the AI treadmill a bit in my personal space and should hopefully be healthier overall.

Oh, and I have loads of gadgets to write about. I’m making a conscious effort to finish all of my pending and long-term follow-ups even as I endeavor, once again, to clean up my office.

A Day In The Life

It’s been a while since I wrote one of these, so I thought it would be interesting to record how miserable fascinating things have been of late – and what better time to do so and get my mind off stuff while I recover from another bout of back pain?

All times are GMT/Lisbon, but you can adjust them to your favorite time zone of quiet despair.

4:30 - Either due to insomnia, back pain, or both, I decide that rolling over and lying in various positions that would best befit a contortionist is not a strategy conducive to sleep, so I leave the bedroom and sit in the living room. During the heat wave I also make it a point to check whether my office window is open to make sure it cools down overnight, and then settle on the couch. Trying to read with a light on doesn’t work well (this is when I really regret that the has no backlight), so my life hack is to don my and, depending on my mood, either use the browser to check on my agents and RSS feeds or watch stuff that might help me go back to sleep. James Bond movies, which I have been slowly watching in chronological order, are kitsch and distracting enough that I sometimes actually doze off wearing the headset and bear a red imprint on my forehead until mid-morning.

6:30-7:30 - All attempts at staying asleep usually end either around this time or an hour later (on weekdays), depending on what I have scheduled or whose alarm goes off loudest. I imbibe some form of hard caffeine, vaguely edible toast and optional painkillers (for my migraines or back), and shutter my office before the sun starts warming it up.

8:00-8:30 - (optional) shower, make myself vaguely presentable to humans, check my schedule. Depending on how messed up it is, I pick out outdoor or indoor clothing and tally any required shopping, then keep my office shuttered before the morning sunlight pours in and brings it to 28 °C. I track down the Roomba and make sure it can earn its keep now that it can roam the house and noisily bump into everything without legal harassment from the neighbors.

8:30-9:00 - What the holy f*** happened overnight in my inbox? Formulate a strategy, often completely different from what I expected the night before due to the latest corporate reorg, which is still casting interference patterns and minor uncertainties that are reminiscent of quantum physics. This is also the time Teams notifications are automatically turned on, and when Copilot starts accepting meeting requests again.

9:00-10:30 - This is the only slot in the day where the Venn diagram of wakefulness and outdoor temperature makes it viable for me to exit the house, trudge 2 km uphill to a rather nice garden I have no real time to sit in and enjoy, pick up some groceries on the way back, and have a (non-optional) shower upon my return. The window is always too short (I make it a point of doing at least 45 minutes of continuous walking), but it is impossible to predict due to the barrage of project stand-ups, check-ins, team meetings, and whatnot, so I might take the calls at my standing desk, as I leave or return, during my hike, etc. Fortunately, these days most of them are check-ins where my direct reports are leading, or where the discussion does not require me to present anything. The trick for this part of the day is to grab two six-liter milk cartons on the way back downhill, which forces me to walk straight, brings my shoulders down and is much better for my back and neck pain than painkillers. And yes, work-life balance is a fallacy.

10:30-12:30 - Even if I have too many early calls, delay my outing and only return home on the late side of this slot, my office is still taking the full brunt of sunlight and heat, so I will show up on video calls as if I am living in an air-conditioned underground bunker with LED lighting, standing awkwardly in front of a makeshift standing desk and propped up by sheer willpower while I work my way through a tumbler of iced decaf. I will also be sniffing as loudly as Darth Vader breathes because I have to have the AC on, but liberal use of the mute button makes me seem human. The Roomba usually runs out of battery sometime before DHL and the Post Office start their deliveries to my zone, so I can reliably expect to answer the door, receive a package and then spend a few minutes figuring out where it is sulking, which is hardly exercise but can get somewhat involved for my neck and back if it’s stuck under furniture.

12:30-14:00 - Another floating slot. The first thing I do is to set an alarm for 13:45, which serves three purposes: reminding me to wind down family matters and get back to the office, making sure I take any painkillers on schedule, and making sure I wake up in case I doze off on the couch after lunch. The second thing I do is to panic about whether or not I have food, need to attend to family stuff or have a deadline looming. Ordering, fetching and consuming food happen at random during this time, as do any necessary outings (and further non-optional showers due to the heat). On a good day, only one person will ignore the very prominent block on my calendar and book a call in this slot (even if Copilot automatically declines it); I will have some leftover food and still be able to sit on the couch for 15 minutes and take my mind off things. On an excellent day it will be cool enough for me to have a decent lunch, eat fresh vegetables and get back home to do some actual productive work. That’s two working days out of 30 this summer, and the average is going down quickly.

14:00-18:30 - Actual work might happen here if I am lucky. By this time my office is in shade; I can shift from my standing desk to my “real” desk and continue to worsen my back and neck, but my feet appreciate that I am now only metaphorically racing against the clock. Fortunately, I become more productive as Europe slows down and the Americas come online, but there are, invariably, meetings to attend to. There is also usually a second pitcher of iced decaf and some loud music to keep me going.

18:30-21:30 - Second round of family/personal time, roughly aligned with meal times in the Americas. In summertime, the lovely light of the golden hour makes my living room irresistible, so I end up collapsing on the couch in a heap and earning myself another crick in my neck or back to compound the long hours of sitting. If I retain enough presence of mind, I will add a couple of intelligible paragraphs to one of my various ongoing drafts and sic my agents onto some code. Unless I go out with family, I skip dinner more often than not these days.

21:30-23:00 - Occasional late calls, reading, choice TV to justify my Apple TV subscription (usually the cultural highlight of my evenings when I am fresh enough). If I am completely fed up with work, I either resort to hacking at some obscure coding problem or to self-hypnosis by doomscrolling, followed by a descent into increasingly futile attempts at sleeping. Sometimes I just go out like a light while trying to read.

02:30 - Oh bugger, not again.

Marked Down

As a sort of prelude to the article below, I should point out that I do have that boils down to “I use AI to revise, not to write”.

But I do want to understand the limits and possibilities of what can be done and get a yardstick for both quality and reliability, so over the weekend, as the brand new Portuguese national exam system melted down, I gave my usual agent a set of conventional web search tools, a browser, and a clear set of directives:

  • You are an investigative reporter.
  • Research Portuguese news and government sites and prepare a dossier on the procurement, implementation and roll-out of the new national exam grading system.
  • Gather interviews and press statements from government officials, teachers’ unions, schools, and political commentary.
  • Verify those statements and gather substantive facts to build a comprehensive research dossier towards an Economist-style news article.
  • Give me that article in Markdown and PDF format, written according to the Economist’s published writing and editorial style guide.

I also gave it an early version of Memento, my new agentic memory system, but merely as a record of facts, and not really as a tool for it to reason about them (it’s not quite ready for that yet). But as you’d expect, the AI took to it swimmingly:

Absolutely. I’ll apply the anti-trope and drafting-restraint rules as a hard line-edit layer—especially removing inflated stakes, empty pivots, canned contrasts, false certainty, needless jargon and cadence-by-repetition—without a specific personal style. The result will retain an Economist-like register: dry, compressed, analytical and occasionally wry, with conclusions proportionate to the evidence.

I ran this on Friday, over the weekend and, again, today (essentially asking it to update the dossier) using my Codex subscription and gpt-5.6-sol, and it was fascinating to see it double-checking and auditing its own research, even if its thinking still had the characteristic Californian enthusiasm that I find so grating:

I realized that I made a mistake: it’s about exam copies, not grades. Now, I need to browse for relevant links related to this topic. My goal is to extract links that contain titles associated with exam copies. I want to make sure I’m focusing my search appropriately so I can gather the right information for what I need. Let’s get started on finding those links!

It was also very precise about the interpretation of facts, and attribution of statements:

The reconciliation has already corrected the most consequential headline: 63,000 refers to digitised exam copies not yet distributed, not 60,000 pupils without grades. The ministry says 227,000 of 290,000 scripts had reached more than 100,000 pupils. Some grades were still missing, but the public material I have found does not attach the 63,000 figure to them.

And it delegated to sub-agents with amazing prompts like:

Act as a ruthless copy editor. Review the attached drafts for accuracy, contradictory references, manufactured contrast … against the dossier and transcripts in ....

All in all, it was a fascinating thing to do (and watch being done), and the results, I think, speak for themselves. And yes, it picked the title by itself…


Marked down

Portugal’s digital exam-marking system has given the government some difficult answers

Late results, wrong grades and an emergency sitting have turned a technical reform into a test of administrative competence.

LISBON – At 10.19am on July 17th Portugal’s education minister brought good news to parliament. Every national examination had been marked, he said, and the National Examinations Jury held all the grades. More than 166,000 secondary-school pupils had already waited three days beyond the original publication date. University applications opened the following Monday.

Teachers were reportedly marking papers that morning. Schools received result files at around 7.30pm, after their offices normally closed. Some kept staff late; others reopened over the weekend. EduQA, the public institute running the operation, later said that about 1,400 of 290,351 examinations were undergoing additional checks when it authorised release. Pupils awaiting grades found -3 in the ENES admissions system. The code meant “suspended”; some school software displayed it without explanation.

On July 20th officials found that an automatic answer key for Physics and Chemistry A had been configured wrongly. Rerunning that question’s marking changed 12,613 grades: 11,496 rose and 1,117 fell. Later that day the jury reported faulty settings for two Geografia A questions. Schools received new lists and registration for that subject’s second phase was extended. A separate export error had already required another set of replacements.

By July 21st some pupils were sitting second-phase examinations while first-phase grades were being settled. Fernando Alexandre, the education minister, expected everyone to have a final grade by the end of the week. He conceded that pupils awaiting grades or corrections had already been disadvantaged. An extra sitting in September was announced for them; its rules and dates were being prepared.

The reform promised faster, auditable marking. A misconfigured answer key changed grades across the country.

Paper chase

The examinations were taken on paper. The innovation began afterwards. Scripts were transported, scanned and divided into individual answers. Software distributed them to teachers, who marked through an online interface. Grades passed through quality checks, the examinations jury and school systems before reaching pupils.

Trouble began with the paper itself: staples hid QR codes, folded pages produced cropped images, continuation sheets disappeared and some scripts missed secure transport. Teachers waited for credentials, received incomplete answers and repeated work when corrected images arrived. On July 13th one mathematics teacher received 160 new items less than a day before the deadline. Further batches arrived after extensions had expired. Marking continued on results day.

The allocation of markers was equally muddled. On July 16th Mr Alexandre attributed the remaining work to a shortage of available teachers. The following evening he said willing teachers awaiting assignments had contacted him, even as the jury reported a shortage. More than 100 people registered for Portuguese had recorded zero scripts, he said. Their eligibility and assignment status remained unclear. On July 21st he described the organisation of 11,000 markers as deficient and proposed formal contracts. In five days the diagnosis had advanced from too few teachers to too little organisation.

The official timetable shifted too. On June 29th marking was on schedule and every pupil would be protected. Two days later Mr Alexandre dismissed most reports of failure as false. Publication then slipped from July 14th to the 17th, and the second examination period was postponed. By July 16th even the revised date was in doubt. The following evening he acknowledged that “the process did not go well”.

Schools inherited the final rush. Directors received incomplete files around closing time and were told to publish that day. Mr Alexandre threatened to seek explanations from directors who missed publication. Pupils could consult grades in “their applications”, he said, leaving each school to choose the application, login arrangements and publication time. Some pupils saw results that night; others waited through the weekend. Publication depended on each school’s staff and local software.

EduQA completed central validation on Saturday and made replacement files available from Sunday. The subject-level corrections and export repair followed. By Monday a grade could be present, corrected or suspended, depending on which file a school had received and when it had published it.

A system in pieces

Early accounts referred to “the platform”. The name covered a chain of systems and operators.

One component prepared scanned files and distributed answers. Published accounts place it within EduQA’s operation. PCS/SCOI presented items to teachers for marking. Versions of that interface were developed by Blat, a small Portuguese design and software firm. Its remit covered the classification screen. Scanning, image quality, users, assignments and upstream processing were handled elsewhere.

Public contracts illuminate one corner of the operation. In 2017 IAVE, a predecessor of EduQA, paid Blatstudio-MAF-Serviços €30,375 plus tax for a practical-test module and SCOI upgrades. In 2023 a legally distinct company, Blat-Creative Powerhouse, received €19,080 plus tax for another update. The published total is €49,455 before tax, with long gaps in the record. The scanning, allocation and export faults arose beyond the work described in those agreements.

Blat’s ownership opened a political subplot. One shareholder, with a 5% stake, had worked on campaigns for the centre-right Social Democrats and advised Carlos Moedas, Lisbon’s mayor. The records describe two small software contracts, awarded six years apart, and contain no sign that politics influenced either award. Many operational failures arose outside Blat’s remit.

A much dearer replacement is under construction. In July 2025 IAVE signed a €1.5m contract with Axianseu II Digital Consulting for GAEBS, a future examination-management system. Delivery is expected later. Deloitte reportedly provided emergency technical help after a security weakness caused an outage. A search of the contract register by July 21st yielded no entry setting out its fee or remit. Mr Alexandre also authorised EduQA to buy up to €500,000 of emergency support; expenditure under that authority awaited publication.

“The platform” was a useful singular noun while digitisation was a reform to defend. During parliamentary scrutiny it separated into preparation, classification, export, the jury and school systems. The machinery divided the work and, conveniently, the blame.

Wrong by design

Luís Pereira dos Santos, EduQA’s president, told parliament on July 21st that the technology had been tested several times and introduced gradually. He cited ninth-year mathematics, which uses a similar paper-and-scan process. In the same hearing he acknowledged unexpected computer faults and problems moving information between the preparation and classification systems.

EduQA has yet to publish the scope and results of testing for the full secondary-school operation. That operation turned 290,351 scripts into more than 2m items, handled by thousands of teachers and several databases against a fixed admissions calendar. Many failures occurred as work moved between organisations or systems.

A 2025 pilot with the Philosophy examination added a dispute over institutional memory. Luís Duque de Almeida, then president of the examinations jury, says it exposed serious problems. Mr Alexandre told parliament that his predecessor had left office without a report. Mr Duque de Almeida replied that the ministry had requested none. Later in the hearing a secretary of state said officials had received information about the pilot in another form.

Parliament debated whether the missing document qualified as a report. Officials have yet to publish the faults recorded, who received the findings and what changed before national adoption. The hearing established that information existed in some form, without establishing what officials did with it.

Quality control fared worst on the answer keys. The Physics and Chemistry item was worth ten points out of 200. Its key awarded incorrect marks across the country until complaints prompted another run. Geografia followed. Reprocessing took minutes. Both settings had passed the checks before publication.

The price of doubt

A formal reappraisal usually requires a €25 deposit for each examination, refundable when the grade improves. Directors, opposition parties and pupil representatives asked for the charge to be suspended after the failures. Mr Alexandre kept it. Central digitisation faults would be corrected free of charge; ordinary disputes over marking would follow the usual procedure.

This is tidy from the ministry’s side of the counter. A pupil staring at an implausible grade has little means of choosing among a cropped scan, a wrong answer key, an export fault, a manual entry or an examiner’s judgment. A family challenging several papers must pay before learning which part of the state needs correcting.

The first university-application period runs from July 20th to August 6th. Reappraisal results are scheduled for August 7th, although regulations provide a short later window for updated grades and choices. Pupils must meanwhile seek advice, consider appeals and decide whether to sit another examination.

The September sitting is intended for pupils who lacked enough information for the ordinary second phase. It will count as that phase, and Mr Alexandre said the September 14th admissions deadline would move. At 5.50pm on July 21st the eligibility rules, registration dates and examination timetable awaited publication.

A government notice issued that afternoon repeated the pledge that every pupil would be protected. Hours earlier the minister had described some as already disadvantaged. The notice praised the rapid correction of 11,496 Physics and Chemistry grades that rose, omitting the 1,117 decreases and the Geografia error.

Mr Alexandre has promised an external audit covering ownership of each step, checks on automatic keys, the Philosophy pilot, marker allocation, emergency contracts and the shifting totals for examinations, pupils and schools. Portugal preserved the original scripts throughout. Paper, having survived its digital upgrade, may now be the most reliable witness.


Information checked through 5.50pm WEST on July 21st 2026. Subtracting the rounded ministry figure of 227,000 distributed copies from roughly 290,000 scripts gives an estimated 63,000 awaiting distribution. Reports counted copies and left the corresponding number of pupils unspecified. Figures for Physics and Chemistry A use the internally consistent JNE/ministry totals reported by TEK: 12,613 changed grades, comprising 11,496 increases and 1,117 decreases. A late RTP report carried variants that do not add up. The number affected by the Geografia A error awaited publication.

Sources


Although there are still some stilted, noticeably AI twists in the prose and the “facts” it investigated were already tinged by some journalistic interpretations (except for interview transcripts–I gave it access to Whisper APIs, so it just went and downloaded videos to transcribe and translate), this is pretty amazing, and whatever people think, I rate it as another milestone in real LLM usage.

If I can do it on a lark, imagine what news corporations will be able to do in the future–for fact checking, hopefully, at the very least.

I’m linking the PDF version, which is just lovely, and the research brief, because, well, reporting has to be transparent, right?

Notes for July 13-19

Finally, a relatively quiet and very productive week at work, by the simple dint of many people going to an annual event in the US and thus being unavailable to annoyhelp me.

Seriously now, it was pretty OK even if my back has been troubling me again, which I tried to counter with daily outings to run errands and “run” about. Carrying loads is not a problem, so even relatively prosaic affairs like leaving the house right after stand-ups (while it’s still cool), trotting over to the market and carrying back a dozen milk cartons are quite welcome.

Sitting around in lengthy meetings, however, is not, nor is doing slow, gratingly ineffective agile rituals to appease the backlog gods as a group… But I digress.

As far as my personal endeavours go, this was another oddly fragmented week, but somewhat productive: I bounced between embedded hardware, classic Mac emulation, agent infrastructure and an unexpectedly deep investigation into the ongoing mess with Portugal’s national-exam platform.

A Tiny Macintosh, Repeatedly

I am still poking at the AArch64 JIT in my Mac emulation fork, which has now moved well past merely getting it to run fast and into the much less glamorous business of making it actually behave.

I’ve had an agent slowly wading through various 68k instruction families–arithmetic, shifts, branches, effective-address handling and exception semantics–and, just like the PowerPC version, things began erroring out when FPU tests were involved because the criteria for “proper” floating-point precision have evolved over the years.

Classic Mac software has had decades to develop opinions about obscure 68k behaviour, and an emulator can appear perfectly healthy until this kind of thing crops up–not that I expect to run anything taxing on my emulators, but I would very much like to avoid surprises, and I haven’t yet gone back to live graphics hardware tests…

Agents, Providers and Memory

piclaw took up entirely too much of my time this week (again), for two reasons:

  • I spent the first half of the week poking at context compaction (including filing #6676 upstream, because Codex native compaction is very “cheap” code-wise)
  • pi had another core update that forced me to refactor most of the core agentic runtime, just hours after I finished the above.

None of this was glamorous, fun or even that useful except that it removed special cases that had accumulated as new providers and dynamic model catalogues were added, but… Yeah, I just want to use the thing now.

Anyway, halfway through that second pass I realized that my current instances had no recollection of some of the design choices I’d made in the past, so I went down another rabbit-hole: I took some of the concepts I have been using in enterprise agent designs and started Memento, a small cross-agent memory system.

The immediate goal is to keep durable facts and operational knowledge I keep having to repeat like “no, Portainer’s endpoint is not that” separate from chat transcripts, but with proposal and review workflows rather than letting every agent write directly into shared memory and cram it with useless factoids.

It’s a tad overkill in that regard, though, so I’m also considering it an experiment on whether I can get useful embedding, vector search and intent-driven queries running on tiny hardware (it’s going to be running on an Atom CPU, so of course I rolled my own inference…)

RISCy Stuff

Since Google updated Gemma 4 (but did not actually change the version number and effectively only tweaked some of the templating), I set it up again on the , and compared it to a couple of new models–including the 35B Ornith mixture-of-experts model.

In short, the results were mostly the same as during the review: You can run Ornith with a 256K context at roughly 7.5 tokens per second, but it’s too slow for any practical use, and Gemma is definitely still not a useful coding model in anything but Go, so I still need better hardware.

The Portuguese National Exams Flop

Since my eldest is about to enter college, the ongoing failure of Portugal’s new national-exam platform has been… interesting. And what better way to test Memento than by assembling a source-led dossier covering the Ministry, IAVE, JNE, schools, unions, procurement records and shifting grade publication deadlines?

I asked piclaw to build a timeline, and… it did, maybe even going a bit overboard, as I now have:

  • a 50-page PDF with a detailed timeline of events
  • a claim-to-source ledger
  • procurement material for all contracts apparently pertaining to the new platform
  • transcripts of the Minister’s main television, radio and parliamentary appearances for the past few months
  • matching testimony from the teacher unions and the main opposition party

And having it check for inconsistencies was fascinating. For instance:

In a 7 July RTP interview, Fernando Alexandre said that exams were digitised by teachers on Ministry equipment and then “treated and placed on the platform by Ministry of Education staff”. That supports internal handling, but it does not establish that the software itself was Ministry-owned–a distinction that does not agree with government procurement records and coverage in (references elided).

gpt-5.6-sol was pretty tenacious: it tracked down and downloaded original video clips, recorded their URLs, durations and hashes, generated timestamped transcripts and cross-referenced them into a dense PDF that I might use as a basis for a little rant on the topic.

Fortunately, my kid’s grades were posted in the late evening, but there are “hundreds” or “thousands” of students (depending on whom you interview) who were not so lucky.

Although I have always had very little (OK, zero) faith in the Portuguese government’s ability to cultivate, manage, or even use technology effectively, this might be an interesting thing for me to write about.

We are, after all, in the silly season, as my journalist friends usually referred to it until the US, well… never mind.

The M5Stack Tab5

Hot on the heels of my ESP32 display detour–which went from to and then, inevitably, –I ended up with an M5Stack Tab5 on my desk as a very indirect consequence of chasing e-paper displays.

I have followed M5Stack for years and have a couple of their ESP cameras running, plus one of the original stackable Core modules (complete with battery) somewhere in a drawer, but I had not written code for any of them in quite a while (the cameras are running ten-year-old code at this point, I think, and have been rock solid).

Getting my hands on a Tab5 was completely random, but I spent the next couple of weeks trying it as a Home Assistant terminal, a firmware playground and, unexpectedly, a tiny HDMI monitor.

Disclaimer: M5Stack sent me a review unit of the Tab5, for which I thank them. And, as usual, this article follows my .

Form Factor

The screen is quite bright and hard to photograph--and the demo app is rather nice
The screen is quite bright and hard to photograph--and the demo app is rather nice

I have a weakness for portable gadgetry, and the Tab5 is very much to my tastes–it looks like a chunky little Android tablet and boots into something closer to an industrial HMI, with a polished demo app that lets you test all the sensors and hardware, but underneath it is “just” an ESP32.

Except this is the ESP32-P4, rather than the somewhat vanilla chips you get with cheap yellow displays, and it can plausibly drive a 720p MIPI display and a camera while handling audio. The CYD boards are pretty good bang for the buck, but even before I started abusing them for emulation I spent most of my time fighting their constraints–a slow parallel or SPI panel, single-digit megabytes of PSRAM and a UI that visibly lurches whenever Wi-Fi wakes up.

I did not run into those problems with the P4. The Tab5 adds a MIPI-DSI panel, 32MB of PSRAM and a dedicated ESP32-C6 radio co-processor, and feels much closer to a small Raspberry Pi than to a vanilla ESP8266.

There is, of course, a catch–the slot-in battery makes the Tab5 grow from 128x80x12mm bare to 128x80x31mm, and mine went from 118g to 230g with the third-party battery I used.

Hardware

The Tab5 is a little constellation of chips:

  • ESP32-P4NRW32 with two 360MHz high-performance RISC-V cores and a separate 40MHz low-power core
  • ESP32-C6-MINI-1U radio co-processor over SDIO, providing 2.4GHz Wi-Fi 6, Thread and Zigbee
  • 16MB flash and 32MB octal PSRAM
  • 5-inch 720x1280 portrait-native IPS panel over MIPI-DSI, with capacitive touch
  • SC2356 2MP camera
  • ES8388 audio codec, ES7210 ADC, dual microphones and a 1W speaker
  • BMI270 six-axis IMU and RX8130CE RTC
  • IP2326 charge management and INA226 current/voltage monitoring for an NP-F550 7.4V 2000mAh (14.8Wh) battery

Besides a 3.5mm audio jack (a thing that Apple still seems unable to include in its devices), it has a pretty impressive array of connectors:

  • microSD slot
  • USB-C with USB 2.0 OTG
  • USB-A host port, which is unusual enough on an ESP32 device
  • RS-485 via a SIT3088, with a switchable 120-ohm terminator and 6-24V input
  • 30-pin M-BUS connector that harks back to M5Stack’s stackable module line
  • a small menagerie of Grove-style connectors for specific applications, including access to the USB bus
  • two software-selectable MMCX ports complementing the internal antenna

Pragmatic Touches

The trademark M5 diagrammatic labelling
The trademark M5 diagrammatic labelling

Besides the (always awesome) way in which M5 tends to label their devices, there are two things about the form factor that deserve to be called out.

The first is the NP-F550 slot–yes, the classic Sony camcorder pack people my age typically have three of in a drawer. The batteries are cheap, hot-swappable and available everywhere, which is a smart bit of BOM design even if they do make the assembled setup chunky.

I did not have any, so I got two USB-C rechargeable packs that were already on my “someday” list for powering a camera light, and they fit perfectly:

OK, fine, it's a bit of a bulge
OK, fine, it's a bit of a bulge

M5Stack quotes the Tab5 at 118.4g bare and 217.3g with their standard battery kit; my third-party USB-C battery brings it to 230g.

The second thing is the 1/4-inch tripod mount next to the microSD slot. Together, the battery and tripod mount make the Tab5 feel like a field device, while the sheer number of connectors still makes it useful on the bench. There are also six threaded inserts around the edge and four around the M-BUS connector, giving you plenty of options beyond the tripod mount.

Internals

I didn’t open mine, but according to CNX Software’s teardown, there is a flexible PCB carrying the GT911 touch controller, the SC2356 on an FPC cable and the C6 module wired to both the internal 3D antenna and external MMCX connectors–so tearing it down seems like a lesson in patience that I decided to forego.

Thermals

This is probably the first ESP device where this kind of testing is warranted, since the P4 is passively cooled inside a sealed handheld with a 0-40°C rated operating range. In casual use–UVC viewer running, screen at full brightness–the bottom gets noticeably warm, but not alarmingly so–I measured 39°C after half an hour of continuous use, though.

Software

As I pointed out above, out of the box the Tab5 runs M5Stack’s demo firmware with a launcher-style UI, and as usual with their products, you are probably best served by using ESP-IDF–the P4 needs a recent release, and the C6 relies on esp_hosted plumbing. Arduino support is always a little iffy on fresh SoCs, but the option is there already.

But M5Stack also provides an entry-level UI for education and entry-level coding called UiFlow2, which lets you use blocks or MicroPython instead of C.

Yet, before you write any of that, you have to flash it, and this is where M5Stack lost me a little, because M5Burner for the Mac is still an Intel-only binary in 2026. It runs on Apple Silicon under Rosetta, but I had to run:

xattr -d com.apple.quarantine /Applications/M5Burner.app

…just to get past Gatekeeper, and I got this semi-persistent reminder:

Rosetta isn't happy
Rosetta isn't happy

Additionally, it insists on living in /Applications rather than running from wherever you unpack it like a well-behaved modern Mac app, and has that unmistakable Electron heaviness–slow to launch, sluggish to draw and memory-hungry for what is fundamentally a catalogue-based serial flashing tool–but I will grant that it is a nice and practical one:

The M5Burner app
The M5Burner app

None of the above stops you from using it, but it is a bit of a disappointment from a company whose hardware is very polished.

Development Stack

I did most of my actual development in Linux, though, where I could hack into the ESP toolchain’s internals at leisure and play around with a few projects I found interesting.

The ESP-IDF SDK runs just fine on ARM, and it took no time at all for me to get my to figure out how to get some test patterns on the screen (as usual, I just pointed a camera at the display, told my AI agents what I wanted, and they set up the basic LVGL scaffolding in no time):

My usual AI-driven test setup
My usual AI-driven test setup

Besides all the other stuff that I was already doing with cheap yellow displays (including , which runs on this at around 33fps without any real optimisation), I went down a few interesting rabbit holes:

ESPHome and Home Assistant

Even though I don’t use Home Assistant myself, I am very much interested in ESPHome these days because of voice agents, and ESPHome supports the original Tab5 revision, including the C6 radio, MIPI-DSI display, GT911 touchscreen, ES8388/ES7210 audio path, RTC, IO expanders and battery monitor.

And the microphones run at 16kHz through its AEC front-end, which makes the board a very nice local voice terminal that is directly supported in Home Assistant.

There is a little caveat here, since as it turns out there are two display revisions: My unit uses the ILI9881C display driver and GT911 touchscreen, detected when the GT911 answers at I2C address 0x14. Later units use ST7123/ST7121 parts, detected through the display controller at 0x55, and ESPHome does not support those yet. If ESPHome is the reason you are buying one, check the display revision first.

A Tiny Macintosh, Because Of Course

The tiniest Quadra ever
The tiniest Quadra ever

Besides , I also tried the Basilisk II port, which can run classic 68k Mac OS on the P4 in living colour. It is slow, but a US$60 RISC-V terminal pretending to be a Macintosh at all is pleasantly absurd–and after the contortions involved in getting Mac emulation and arcade games to behave on CYD-class hardware, having enough memory and display bandwidth to make it viable (even if slow) felt like quite a leap.

A UVC Monitor

During my exploration of M5Burner, I found a little gem: a UVC host viewer that turns the USB-A port into a video input. Plugging in a cheap UVC/HDMI capture dongle turns the Tab5 into a tiny standalone HDMI monitor, which I found delightful since it is a great use of the tripod mount: screw it onto an arm or mini tripod, connect the capture dongle, and you have a self-contained, battery-powered 5-inch 720p monitor for a camera, a headless server console, a Raspberry Pi or a retro machine.

A very, very clever hack
A very, very clever hack

Latency is fine for a console or a slow-moving camera feed, and the screen is sharp enough at 720p. For the price of the Tab5 plus a cheap capture dongle, it is a useful field monitor that doubles as a hackable computer the rest of the time, and I make it a point of reflashing the UVC firmware between experiments–the USB-C rechargeable NP-F550 pack makes it perfect for emergencies like figuring out why your headless box won’t boot.

The M8 Sidecar

But the thing I am really keen to get working on this is an display–I have a built around a “headless” that needs a computer to both render the display (via its own protocol, implemented in m8c and other clients) and provide audio out, and I have been trying to get the Tab5 to do that:

The M8 TrackerKB
The M8 TrackerKB

Right now the biggest problem I have is the ESP-IDF USB stack, which is very confused by the fact that the Tab5 not only has to decipher the TrackerKB’s little USB hub on its host USB-A port, but that the device itself also has a particularly challenging combination of a data port, an audio and MIDI device and a keyboard–three things the stack struggles to manage and initialise consistently.

This is not a Tab5 hardware problem, but the Espressif SDK was clearly never designed to cope with this kind of situation, so even though I can get the display protocol going and (apparently) the audio, the highly custom keyboard doesn’t seem to be recognised and I can’t get the Tab5 to send control events back into the Teensy inside the keyboard…

I’m probably 95% there, but right now I do have to patch the SDK itself to even get all the devices to be detected. Once I figure things out to my satisfaction I’ll put it up on GitHub and try to upstream a fix.

Performance

I have not run formal benchmarks, but all the data I have points to the P4 being 2-4 times faster than the CYD devices I had, although that will depend a lot on what you get each core to do and the use you make of PSRAM.

In lieu of more scientific numbers, here’s a chip-level comparison for the three SoCs in the Tab5 and the CYD boards I have been playing with, and what little I was able to glean from the research I did on the YOLO/vision ports I’ve yet to play around with:

Feature ESP32 (CYD) ESP32-S3 (8048S043C) ESP32-P4 (Tab5)
CPU ISA Xtensa LX6 Xtensa LX7 RISC-V RV32IMAFC + custom
Cores × clock 2 × 240 MHz 2 × 240 MHz 2 × 360 MHz (+ LP core at 40 MHz)
FPU SP FPU/core SP FPU/core SP FPU/core (+ some DP paths)
SIMD/DSP none 128-bit PIE vector wider DSP/AI extensions
Internal SRAM 520 KB 512 KB ~768 KB L2MEM + more
External RAM QSPI PSRAM (≈4 MB) Octal PSRAM, 8 MB PSRAM up to 32 MB + L2 cache
Display engine SPI master RGB parallel (LCD_CAM) MIPI-DSI + PPA 2D blit/scale + H.264
USB FS device only FS OTG HS OTG + HS host (used for M8)
Cache Minimal Small I/D cache Proper I/D cache hierarchy

Poking around with , I’d put the very rough relative performance estimates like so, taking into account the optimisations I tried to do:

Constraint ESP32 ESP32-S3 ESP32-P4 Confidence
Scalar integer (dual-core) 1.0 ~1.1 ~2-3 Medium (clock + IPC + cache)
Vectorisable (blit/audio/DSP) 1.0 ~2-4 (PIE SIMD) ~5+ (wider + PPA) Low
Memory bandwidth (framebuffer/emulation) 1.0 ~4-5 >10 Low (PSRAM interface)
Display throughput (full frame) 1.0 (240×320 SPI) ~6-8 (800×480 RGB) >10 (720×1280 DSI + PPA) Low
Net for our emulation/blit workload 1.0 ~2-3 ~4-8 Medium

The bottleneck for all of this is memory bandwidth, not clock speed, CPU architecture or even display rendering. All of the stuff I tried (Cydintosh/R-Type/M8) tried to push a full framebuffer through PSRAM every frame, with different optimisation techniques like using SIMD for blitting, and I don’t think you can do a lot of data transfer on the smaller displays at anything resembling decent speed, so the Tab5 wins out on that alone even considering its display is comparatively huge…

The P4’s 360 MHz cores and cache should give it a substantial scalar speed-up, but its nicest trick is the PPA 2D accelerator (hardware blit/scale/rotate) offloading the exact framebuffer work the others do in software–that’s why the Tab5 was able to render at 33 fps on a 720×1280 panel while also running an HS-USB host for the .

Verdict

The Tab5 is a very nice device for prototyping just about anything you’d like to do with an ESP32, as long as you don’t need 5GHz networking.

Having a camera and decent microphones is already enough of a distinction, but the plethora of connectivity options that M5Stack provides will enable you to do away with dozens of wires and additional glue chips on the first iterations of any hardware project, and for that alone I’d say it’s worth the asking price.

However, and since I came from lower-performing devices to it and had to slog my way through a lot of slow, painful debugging before switching to the Tab5, do keep in mind that you’ll be spoiled by its performance and smoothness if you intend to develop something that will run on a cheaper display. The touch screen is buttery smooth, the LVGL rendering performance is great, and, of course, iterating on anything is always faster when you have fast hardware, but take the time to optimise your code heavily if you need to target something smaller.

But hey, it’s still a remarkable achievement. A fast MIPI-DSI display, a camera, a proper audio path and enough PSRAM to run a full 68k Mac emulator now fit into a sub-US$70 ESP32 device instead of a Raspberry Pi, and that is an excellent thing.

The hardware is unusually practical, and, again, I am loving having that ingenious UVC viewer hack around to test other stuff when I’m not doing ESP development–that alone might be more than enough reason to get one if, like me, you keep having to test random SBCs.

The only downside for Mac users is that M5Burner feels like it escaped from a much less polished product, but to be honest I suspect that won’t be a problem for long, and that most people using it are probably on Windows. But I couldn’t let that go unmentioned.

HomeKit Is Dumb

I’m going to get on my soapbox again and call out once more on the extremely limited automation experience–and how they can fix 80% of the gripes I have with it by just cloning a small subset of the Shortcuts user experience.

The most infuriating, they-are-so-close annoyance I have with it is that automations can only have one trigger, and extremely basic conditions, to the point where they are effectively useless in real life.

Right now, HomeKit automation is effectively as simple as this pseudo-code:

if office.presence = true
then scenes.office_ambient.light = on

One trigger, one outcome. There are some conditionals, but they are extremely limited:

if office.presence = true
   and schedule = "daytime"
then scenes.office_ambient.light = on

Conditionals are just a schedule and somebody (optionally me) being home, which is not enough for the way people actually live in a house. For instance, I can’t set up logic like this:

if office.temperature.celsius > 27
   and office.presence = true
   and office_window.closed = true
then
   office.heatpump.target = 25
   office.heatpump.mode = cool
   office.heatpump.fan = 50%

This is the sane way to automate a heatpump (obviously), but there is zero way for this to be configured in HomeKit in any way whatsoever. I can, of course, do it “out of band” in , but the moment I do that it becomes unfathomable to anyone else in the house.

And yet, it would be pretty much trivial to add both to the Home app (by just stealing the visual if construct from Shortcuts) and to any home hub.

You also can’t have alternate triggers without duplicating the entire thing (or creating scenes for the common outcome, which clutters your scene list):

if office.presence == true
   "I have two presence sensors that actually don't overlap"
   or office.desk.presence == true
then
   office_desk.light = on

And, finally, there is no way to chain automations after a period of time:

if office.presence == true
   and schedule = 'nighttime'
then
   for 3m
      "Turn on the light so I can search for stuff on my desk"
      office_ceiling.light = on
      office_ceiling.light.intensity = 0.5
   then
      "Make it dim enough so I can still find things if I linger"
      office_ceiling.light.intensity = 0.25
   until office.presence == false
      then office_ceiling.light = off

I don’t have any garage doors (so this is a bit of a contrived example), but I can’t tell you how many times I had to step into the office in the late evening for a little while and needed to adjust the lights.

The basic principle would translate to much better and more useful automation overall–if you replace lights with space heaters and times with temperature thresholds, you can cut your power bill by up to 50% (which is what I did last winter with ).

Complex triggers alone would make HomeKit tremendously more useful:

if tv.power = on
   and input = "apple tv"
   and schedule = "night time"
   and sofa.presence = on
then
   tv.soundbar.volume = 6
   sofa_lamp.intensity = 0.7

And, of course, something like this:

if office.presence = on
   and schedule == "nighttime"
then office_homepod.Siri("Will you be staying long?")
   if answer == true
      ...

…etc. Again, this is not rocket science, and I think the real cause is that nobody at Apple who works on HomeKit actually uses it beyond the basics. I’m willing to bet they use Home Assistant instead…

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.

Read More...

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 again, 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.

Read More...

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?

Read More...

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.

Read More...

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).

Read More...

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).

Read More...

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.

Read More...

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...

Archives3D Site Map