<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="https://taoofmac.com/static/css/atom.xslt"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Tao of Mac</title>
<subtitle>The Tao of Mac is the personal wiki of Rui Carmo, featuring a technology-oriented blog, links to articles, several compilations of resources around various key technology topics, and a collection of photos and videos.</subtitle>
<link rel="alternate" type="text/xml" href="https://taoofmac.com"/>
<link rel="self" type="application/atom+xml" href="https://taoofmac.com/atom.xml"/>
<id>https://taoofmac.com/atom.xml</id>
<updated>2026-07-18T19:20:00+00:00</updated>
<rights>CC Attribution-NonCommercial-NoDerivs 3.0</rights>
<entry>
<title>The M5Stack Tab5</title>
<id>https://taoofmac.com/space/reviews/2026/07/18/1920?utm_content=atom</id>
<published>2026-07-18T19:20:00+00:00</published>
<updated>2026-07-18T19:20:00+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/reviews/2026/07/18/1920?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">Hot on the heels of my ESP32 display detour&#8211;which went from <a href="/space/links/2026/04/15/0718" rel="next" style="color: #0000cc;">Cydintosh</a> to <a href="/space/blog/2026/06/14/1400" rel="next" style="color: #0000cc;">Flying Toasters on an ESP32-S3</a> and then, inevitably, <a href="/space/blog/2026/06/17/1200" rel="next" style="color: #0000cc;">R-Type</a>&#8211;I ended up with an M5Stack <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> on my desk as a very indirect consequence of chasing e-paper displays.</p>
<p>I have followed <a href="https://m5stack.com/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">M5Stack</a> 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).</p>
<p>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.</p>
<blockquote>
<p><strong>Disclaimer:</strong> M5Stack sent me a review unit of the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a>, for which I thank them. And, as usual, this article follows my <a href="/space/site/review_policy" rel="next" style="color: #0000cc;">review policy</a>.</p>
</blockquote>
<a class="anchor" id="anchor-form-factor" rel="anchor" href="/space/reviews/2026/07/18/1920#form-factor" style="color: #0000cc;"><h2 id="form-factor">Form Factor</h2></a><p/><figure><img alt="The screen is quite bright and hard to photograph--and the demo app is rather nice" src="https://taoofmac.com/media/reviews/2026/07/18/1920/8Kc82kuyJrz3-P59JlgiU4XgLrs=/tab5-demo-screen.jpg" width="3846" height="2215" style="max-width: 100% !important;height: auto !important;"/><figcaption>The screen is quite bright and hard to photograph--and the demo app is rather nice</figcaption></figure><p/>
<p>I have a weakness for portable gadgetry, and the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> is very much to my tastes&#8211;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 &#8220;just&#8221; an ESP32.</p>
<p>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&#8211;a slow parallel or SPI panel, single-digit megabytes of PSRAM and a UI that visibly lurches whenever Wi-Fi wakes up.</p>
<p>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.</p>
<p>There is, of course, a catch&#8211;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.</p>
<a class="anchor" id="anchor-hardware" rel="anchor" href="/space/reviews/2026/07/18/1920#hardware" style="color: #0000cc;"><h2 id="hardware">Hardware</h2></a><p>The <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> is a little constellation of chips:</p>
<ul>
<li>ESP32-P4NRW32 with two 360MHz high-performance RISC-V cores and a separate 40MHz low-power core</li>
<li>ESP32-C6-MINI-1U radio co-processor over SDIO, providing 2.4GHz Wi-Fi 6, Thread and Zigbee</li>
<li>16MB flash and 32MB octal PSRAM</li>
<li>5-inch 720x1280 portrait-native IPS panel over MIPI-DSI, with capacitive touch</li>
<li>SC2356 2MP camera</li>
<li>ES8388 audio codec, ES7210 ADC, dual microphones and a 1W speaker</li>
<li>BMI270 six-axis IMU and RX8130CE RTC</li>
<li>IP2326 charge management and INA226 current/voltage monitoring for an NP-F550 7.4V 2000mAh (14.8Wh) battery</li>
</ul>
<p>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:</p>
<ul>
<li>microSD slot</li>
<li>USB-C with USB 2.0 OTG</li>
<li>USB-A host port, which is unusual enough on an ESP32 device</li>
<li>RS-485 via a SIT3088, with a switchable 120-ohm terminator and 6-24V input</li>
<li>30-pin M-BUS connector that harks back to M5Stack&#8217;s stackable module line</li>
<li>a small menagerie of Grove-style connectors for specific applications, including access to the USB bus</li>
<li>two software-selectable MMCX ports complementing the internal antenna</li>
</ul>
<a class="anchor" id="anchor-pragmatic-touches" rel="anchor" href="/space/reviews/2026/07/18/1920#pragmatic-touches" style="color: #0000cc;"><h3 id="pragmatic-touches">Pragmatic Touches</h3></a><p/><figure><img alt="The trademark M5 diagrammatic labelling" src="https://taoofmac.com/media/reviews/2026/07/18/1920/IhqKu_5UQBD2o8WtjlmStIGTJVg=/tab5-bottom.jpg" width="2048" height="1152" style="max-width: 100% !important;height: auto !important;"/><figcaption>The trademark M5 diagrammatic labelling</figcaption></figure><p/>
<p>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.</p>
<p>The first is the NP-F550 slot&#8211;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.</p>
<p>I did not have any, so I got <a href="https://www.amazon.es/gp/product/B0C27ZBX3Z/ref=as_li_tl?_encoding=UTF8&amp;tag=taoofmac-21&amp;linkCode=ur2&amp;camp=3638&amp;creative=24630&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">two USB-C rechargeable packs</a> that were already on my &#8220;someday&#8221; list for powering a camera light, and they fit perfectly:</p>
<p/><figure><img alt="OK, fine, it's a bit of a bulge" src="https://taoofmac.com/media/reviews/2026/07/18/1920/xJemOGE2Es9GbJGBdJfw5ZBuxEQ=/tab5-battery.jpg" width="2048" height="576" style="max-width: 100% !important;height: auto !important;"/><figcaption>OK, fine, it's a bit of a bulge</figcaption></figure><p/>
<p><a href="https://m5stack.com/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">M5Stack</a> quotes the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> at 118.4g bare and 217.3g with their standard battery kit; my third-party USB-C battery brings it to 230g.</p>
<p>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.</p>
<a class="anchor" id="anchor-internals" rel="anchor" href="/space/reviews/2026/07/18/1920#internals" style="color: #0000cc;"><h3 id="internals">Internals</h3></a><p>I didn&#8217;t open mine, but according to <a href="https://www.cnx-software.com/2025/05/14/m5stack-tab5-review-part-1-unboxing-teardown-and-first-try-of-the-esp32-p4-and-esp32-c6-5-inch-iot-devkit/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">CNX Software&#8217;s teardown</a>, 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&#8211;so tearing it down seems like a lesson in patience that I decided to forego.</p>
<a class="anchor" id="anchor-thermals" rel="anchor" href="/space/reviews/2026/07/18/1920#thermals" style="color: #0000cc;"><h3 id="thermals">Thermals</h3></a><p>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&#176;C rated operating range. In casual use&#8211;UVC viewer running, screen at full brightness&#8211;the bottom gets noticeably warm, but not alarmingly so&#8211;I measured 39&#176;C after half an hour of continuous use, though.</p>
<a class="anchor" id="anchor-software" rel="anchor" href="/space/reviews/2026/07/18/1920#software" style="color: #0000cc;"><h2 id="software">Software</h2></a><p>As I pointed out above, out of the box the Tab5 runs <a href="https://github.com/m5stack/M5Tab5-UserDemo?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">M5Stack&#8217;s demo firmware</a> with a launcher-style UI, and as usual with their products, you are probably best served by using ESP-IDF&#8211;the P4 needs a recent release, and the C6 relies on <code>esp_hosted</code> plumbing. Arduino support is always a little iffy on fresh SoCs, but the option is there already.</p>
<p>But M5Stack also provides an entry-level UI for education and entry-level coding called <a href="https://docs.m5stack.com/en/uiflow/uiflow_web?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">UiFlow2</a>, which lets you use blocks or MicroPython instead of C.</p>
<p>Yet, before you write any of that, you have to <em>flash</em> it, and this is where M5Stack lost me a little, because <a href="https://docs.m5stack.com/en/download?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">M5Burner</a> for the Mac is still an Intel-only binary in 2026. It runs on Apple Silicon under Rosetta, but I had to run:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code>xattr<span class="w"> </span>-d<span class="w"> </span>com.apple.quarantine<span class="w"> </span>/Applications/M5Burner.app
</code></pre></div>

<p>&#8230;just to get past Gatekeeper, and I got this semi-persistent reminder:</p>
<figure style="scale: 70%; margin-left: auto; margin-right: auto;">
<img src="https://taoofmac.com/media/reviews/2026/07/18/1920/Ey5WPjQkE6JJrDndr5W3mxM-0E4=/tab5-rosetta.png" alt="Rosetta isn't happy" width="688" height="210" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>Rosetta isn't happy</figcaption>
</figure>

<p>Additionally, it insists on living in <code>/Applications</code> rather than running from wherever you unpack it like a well-behaved modern Mac app, and has that unmistakable Electron heaviness&#8211;slow to launch, sluggish to draw and memory-hungry for what is fundamentally a catalogue-based serial flashing tool&#8211;but I will grant that it is a nice and practical one:</p>
<p/><figure><img alt="The M5Burner app" src="https://taoofmac.com/media/reviews/2026/07/18/1920/jge4VPrsoqQQdlgm_jluSP9X_TA=/tab5-m5burner.png" width="2560" height="1600" style="max-width: 100% !important;height: auto !important;"/><figcaption>The M5Burner app</figcaption></figure><p/>
<p>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.</p>
<a class="anchor" id="anchor-development-stack" rel="anchor" href="/space/reviews/2026/07/18/1920#development-stack" style="color: #0000cc;"><h3 id="development-stack">Development Stack</h3></a><p>I did most of my actual development in Linux, though, where <code>esptool.py</code> is, as usual, the escape hatch and I could hack into the ESP toolchain at leisure and play around with a few projects I found interesting.</p>
<p>The ESP-IDF SDK runs just fine on ARM, and it took no time at all for me to get my <a href="/space/reviews/2026/04/11/1900" rel="next" style="color: #0000cc;">Orange Pi 6</a> 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):</p>
<figure style="margin-left: 0; margin-right: 0;">
<img src="https://taoofmac.com/media/reviews/2026/07/18/1920/pBdKdFJ6wIpSgzZX9hT8JQAh5TM=/tab5-development-setup.jpg" alt="My usual AI-driven test setup" width="886" height="886" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>My usual AI-driven test setup</figcaption>
</figure>

<p>Besides all the other stuff that I was already doing with cheap yellow displays (including <a href="/space/blog/2026/06/17/1200" rel="next" style="color: #0000cc;">my R-Type port</a>, which runs on this at around 33fps without any real optimisation), I went down a few interesting rabbit holes:</p>
<a class="anchor" id="anchor-esphome-and-home-assistant" rel="anchor" href="/space/reviews/2026/07/18/1920#esphome-and-home-assistant" style="color: #0000cc;"><h3 id="esphome-and-home-assistant">ESPHome and Home Assistant</h3></a><p>Even though I don&#8217;t use Home Assistant myself, I am very much interested in ESPHome these days because of voice agents, and <a href="https://devices.esphome.io/devices/m5stack-tab5/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">ESPHome supports the original Tab5 revision</a>, including the C6 radio, MIPI-DSI display, GT911 touchscreen, ES8388/ES7210 audio path, RTC, IO expanders and battery monitor.</p>
<p>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.</p>
<p>But 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 <code>0x14</code>. Later units use ST7123/ST7121 parts, detected through the display controller at <code>0x55</code>, and ESPHome does not support those yet. If ESPHome is the reason you are buying one, check the display revision first.</p>
<a class="anchor" id="anchor-a-tiny-macintosh-because-of-course" rel="anchor" href="/space/reviews/2026/07/18/1920#a-tiny-macintosh-because-of-course" style="color: #0000cc;"><h3 id="a-tiny-macintosh-because-of-course">A Tiny Macintosh, Because Of Course</h3></a><p/><figure><img alt="The tiniest Quadra ever" src="https://taoofmac.com/media/reviews/2026/07/18/1920/oUMXN-wJZi77aI69BmoooTwKYd4=/tab5-macintosh-emulator.jpg" width="2048" height="1152" style="max-width: 100% !important;height: auto !important;"/><figcaption>The tiniest Quadra ever</figcaption></figure><p/>
<p>Besides <a href="/space/links/2026/04/15/0718" rel="next" style="color: #0000cc;">my own Mac Plus core</a>, I also tried the <a href="https://github.com/amcchord/M5Tab-Macintosh?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Basilisk II port</a>, 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&#8211;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.</p>
<a class="anchor" id="anchor-a-uvc-monitor" rel="anchor" href="/space/reviews/2026/07/18/1920#a-uvc-monitor" style="color: #0000cc;"><h3 id="a-uvc-monitor">A UVC Monitor</h3></a><p>A UVC host viewer turns the USB-A port into a video input, and plugging in a cheap UVC/HDMI capture dongle turns the Tab5 into a standalone HDMI monitor. This is where the tripod mount stops being a curiosity and becomes the point: 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.</p>
<p/><figure><img alt="A very, very clever hack" src="https://taoofmac.com/media/reviews/2026/07/18/1920/Kn_0_0GlEWZmJMM8RaF3f9fANpE=/tab5-uvc-monitor.jpg" width="2048" height="1152" style="max-width: 100% !important;height: auto !important;"/><figcaption>A very, very clever hack</figcaption></figure><p/>
<p>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&#8211;the USB-C rechargeable NP-F550 pack makes it <em>perfect</em> for emergencies like figuring out why your headless box won&#8217;t boot.</p>
<a class="anchor" id="anchor-the-m8-sidecar" rel="anchor" href="/space/reviews/2026/07/18/1920#the-m8-sidecar" style="color: #0000cc;"><h3 id="the-m8-sidecar">The M8 Sidecar</h3></a><p>But the thing I am really keen to get working on this is an <a href="/space/music/m8" rel="next" style="color: #0000cc;">M8 Tracker</a> display&#8211;I have a &#8220;headless&#8221; <a href="/space/music/m8" rel="next" style="color: #0000cc;">M8</a> that needs a computer to both render the display (via its own protocol, implemented in <a href="https://github.com/laamaa/m8c?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">m8c</a> and other clients) and provide audio out, and I have been trying to get the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> to do that:</p>
<figure style="margin-left: 0; margin-right: 0;">
<img src="https://taoofmac.com/media/reviews/2026/07/18/1920/2Jq4_zcRqThb3fus4rPiFBI4Q6s=/tab5-m8-tracker.jpg" alt="The M8 TrackerKB" width="2048" height="2048" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>The M8 TrackerKB</figcaption>
</figure>

<p>Right now the biggest problem I have is the ESP-IDF USB stack, which is <em>very</em> confused by the fact that the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> not only has a little USB hub on its host USB-A port, but that the hub also has a particularly challenging combination of a data port, an audio and MIDI device and a keyboard&#8211;three things the stack struggles to manage and initialise consistently.</p>
<p>This is not a <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> 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&#8217;t seem to be recognised and I can&#8217;t get the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> to send control events back into the Teensy inside the keyboard&#8230;</p>
<a class="anchor" id="anchor-performance" rel="anchor" href="/space/reviews/2026/07/18/1920#performance" style="color: #0000cc;"><h2 id="performance">Performance</h2></a><p>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.</p>
<p>In lieu of more scientific numbers, here&#8217;s a chip-level comparison for the three SoCs in the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> 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&#8217;ve yet to play around with:</p>
<table style="background: transparent;margin: 0px;padding: 0px;border-collapse: collapse;font-size: 90%;">
<thead>
<tr style="border-top: 1px solid #aaa;">
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Feature</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">ESP32 (CYD)</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">ESP32-S3 (8048S043C)</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">ESP32-P4 (Tab5)</th>
</tr>
</thead>
<tbody style="border-top: 2px solid black;border-bottom: 2px solid black;">
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">CPU ISA</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Xtensa LX6</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Xtensa LX7</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">RISC-V RV32IMAFC + custom</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Cores &#215; clock</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2 &#215; 240 MHz</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2 &#215; 240 MHz</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2 &#215; 360 MHz (+ LP core at 40 MHz)</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">FPU</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SP FPU/core</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SP FPU/core</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SP FPU/core (+ some DP paths)</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SIMD/DSP</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">none</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">128-bit PIE vector</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">wider DSP/AI extensions</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Internal SRAM</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">520 KB</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">512 KB</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">~768 KB L2MEM + more</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">External RAM</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">QSPI PSRAM (&#8776;4 MB)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Octal PSRAM, 8 MB</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">PSRAM up to 32 MB + L2 cache</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Display engine</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SPI master</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">RGB parallel (LCD_CAM)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">MIPI-DSI + PPA 2D blit/scale + H.264</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">USB</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">FS device only</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">FS OTG</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">HS OTG + HS host (used for M8)</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Cache</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Minimal</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Small I/D cache</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Proper I/D cache hierarchy</td>
</tr>
</tbody>
</table>
<p>Poking around with <a href="/space/blog/2026/06/17/1200" rel="next" style="color: #0000cc;">the R-Type hacks</a>, I&#8217;d put the very rough relative performance estimates like so, taking into account the optimisations I tried to do:</p>
<table style="background: transparent;margin: 0px;padding: 0px;border-collapse: collapse;font-size: 90%;">
<thead>
<tr style="border-top: 1px solid #aaa;">
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Constraint</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px;font-weight: bold;text-align: right">ESP32</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px;font-weight: bold;text-align: right">ESP32-S3</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px;font-weight: bold;text-align: right">ESP32-P4</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Confidence</th>
</tr>
</thead>
<tbody style="border-top: 2px solid black;border-bottom: 2px solid black;">
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Scalar integer (dual-core)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right">1.0</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right">~1.1</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right"><strong>~2-3</strong></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Medium (clock + IPC + cache)</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Vectorisable (blit/audio/DSP)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right">1.0</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right">~2-4 (PIE SIMD)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right"><strong>~5+</strong> (wider + PPA)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Low</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Memory bandwidth (framebuffer/emulation)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right">1.0</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right">~4-5</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right"><strong>&gt;10</strong></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Low (PSRAM interface)</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Display throughput (full frame)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right">1.0 (240&#215;320 SPI)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right">~6-8 (800&#215;480 RGB)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right"><strong>&gt;10</strong> (720&#215;1280 DSI + PPA)</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Low</td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><strong>Net for our emulation/blit workload</strong></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right"><strong>1.0</strong></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right"><strong>~2-3</strong></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px;vertical-align: top;border-top: 1px solid #aaa;text-align: right"><strong>~4-8</strong></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Medium</td>
</tr>
</tbody>
</table>
<p>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&#8217;t think you <em>can</em> do a lot of data transfer on the smaller displays at anything resembling decent speed, so the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> wins out on that alone even considering its display is comparatively huge&#8230;</p>
<p>The P4&#8217;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&#8211;that&#8217;s why the <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> was able to render at 33 fps on a 720&#215;1280 panel while also running an HS-USB host for the <a href="/space/music/m8" rel="next" style="color: #0000cc;">M8</a>.</p>
<a class="anchor" id="anchor-verdict" rel="anchor" href="/space/reviews/2026/07/18/1920#verdict" style="color: #0000cc;"><h2 id="verdict">Verdict</h2></a><p>The <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a> is a very nice device for prototyping just about anything you&#8217;d like to do with an ESP32, as long as you don&#8217;t need 5GHz networking.</p>
<p>Having a camera and decent microphones is already enough of a distinction, but the plethora of connectivity options that <a href="https://m5stack.com/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">M5Stack</a> 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&#8217;d say it&#8217;s worth the asking price.</p>
<p>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 <a href="https://docs.m5stack.com/en/core/Tab5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tab5</a>, do keep in mind that you&#8217;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 <em>anything</em> is always faster when you have fast hardware, but take the time to optimise your code heavily if you need to target something smaller.</p>
<p>But hey, it&#8217;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.</p>
<p>The hardware is unusually practical, and, again, I am loving having that ingenious UVC viewer hack around to test other stuff when I&#8217;m not doing ESP development&#8211;that alone might be more than enough reason to get one if, like me, you keep having to test random SBCs.</p>
<p>The only downside for Mac users is that <a href="https://docs.m5stack.com/en/download?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">M5Burner</a> feels like it escaped from a much less polished product, but to be honest I suspect that won&#8217;t be a problem for long, and that most people using it are probably on Windows. But I couldn&#8217;t let that go unmentioned.</p>
<br/>
]]></content>
<category term="esp32" label="esp32" />
<category term="m5stack" label="m5stack" />
<category term="hardware" label="hardware" />
<category term="iot" label="iot" />
<category term="risc-v" label="risc-v" />
<category term="reviews" label="reviews" />
<category term="embedded" label="embedded" />
<category term="emulation" label="emulation" />
<category term="electronics" label="electronics" />
</entry>
<entry>
<title>Review Policy</title>
<id>https://taoofmac.com/space/site/review_policy?utm_content=atom</id>
<published>2022-01-01T00:00:00+00:00</published>
<updated>2026-07-18T19:20:00+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/site/review_policy?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">This site has been around for over 20 years, so it was only natural that I would write about stuff I purchased. Those pieces became popular enough that people started asking me to review things, and eventually I started getting review units/copies from vendors.</p>
<p>So I thought it would be a good idea to have a policy in place to make sure everyone is on the same page:</p>
<ol>
<li>I don&#8217;t do paid reviews. I realize there is a fine line between getting &#8220;free&#8221; stuff to review and being paid to review it, but I&#8217;m not interested in crossing it&#8211;this site does not generate any form of income for me, and I&#8217;d like to keep it that way.</li>
<li>I only review things <em>I have a personal interest in</em> (i.e., things that I would ordinarily have an actual use for, learn from or would otherwise consider buying) or that would be interesting for the people I occasionally provide consulting services to.</li>
<li>I don&#8217;t do scripted reviews (i.e., there is no content placement, I write about the features I find important, etc.)</li>
<li>There are no editorial tweaks&#8211;vendors get to read my reviews at the same time as the general public.</li>
<li>I don&#8217;t participate in vendor affiliate programs&#8211;I&#8217;m OK with handing out discount codes or linking to the vendor&#8217;s site with <a href="/space/site/privacy_policy" rel="next" style="color: #0000cc;">a <code>utm</code> referral tag</a> (so they can check attribution), but other than my usual (automatic) Amazon/AliExpress linking (which <a href="/space/site/wishlist" rel="next" style="color: #0000cc;">I started using for books decades ago</a> and now do for electronics components), there are no other affiliate links on this site to ensure I don&#8217;t get any direct revenue from the reviews.</li>
<li>When applicable, scripts used for performance measurements and benchmarks will be published here or on GitHub.</li>
<li>Benchmarking will be focused on the aspects I value (although I will try to use standard tooling where appropriate).</li>
<li>I review what&#8217;s &#8220;in the box&#8221;, not what&#8217;s promised for future releases or what might be available in a future version.</li>
</ol>
<p>I&#8217;m also open to reviewing books&#8211;I&#8217;ve done pre-publishing reviews in the past, and I&#8217;m always happy to read and review books on topics I&#8217;m interested in.</p>
<p>I have also recently started <a href="https://www.youtube.com/@TheTaoOfTech?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">a YouTube channel called @TheTaoOfTech</a> that I am slowly populating with videos that complement the content on this site. I will try to keep the same review policy there, although I might do some sponsored videos in the future (but I will always disclose that).</p>
<p>So if you have something you&#8217;d like me to review, please <a href="/about" rel="nofollow" style="color: #0000cc;">get in touch</a> and we&#8217;ll take it from there.</p>
<a class="anchor" id="anchor-audience" rel="anchor" href="/space/site/review_policy#audience" style="color: #0000cc;"><h2 id="audience">Audience</h2></a><p>Many people ask me about page views, statistics, Google rankings, etc. This is what I have to say about it:</p>
<ul>
<li>This site <em>does not use Google Analytics</em> for privacy reasons, nor any other mainstream analytics or tracking platform. The flip side of that is that it is (incorrectly) down-ranked in just about every single public site ranking.</li>
<li>It does, however, use Cloudflare Analytics, which is privacy-preserving and a more accurate than most other tracking sites because it automatically filters out bots, referrer spam and other things that contribute to site traffic inflation. However, it can provide some interesting figures (updated for August 2024):<ul>
<li>Over 2M monthly pageviews (and steadily rising).</li>
<li>Over 110K unique <em>human</em> visitors per month, mostly from the US, UK, Germany, and Singapore (if I add in figures from Japan and Australia, I get almost as much traffic from APAC than from the UK, which has always been interesting to me).</li>
</ul>
</li>
</ul>
<p>You can check <a href="/media/site/review_policy/SHpEdajwGE7j5A-yIWkB_wQrJKs=/202509_traffic.pdf" rel="media" style="color: #0000cc;">this PDF</a> for a sample Cloudflare traffic report.</p>
<p>This audience reach comes down to four main factors:</p>
<ul>
<li>My emphasis on consistently solid technical content&#8211;which ensures continued reader interest.</li>
<li>No fake audience engagement on site (I interact with readers directly via e-mail correspondence)</li>
<li>Posts are automatically broadcast to X/Twitter, Mastodon and a few sites that consume my RSS feed directly.</li>
<li>I get a <em>lot</em> of traffic from places like Reddit, Hacker News, etc. (especially when I post something with an unusual technical angle).</li>
</ul>
<a class="anchor" id="anchor-social-networking" rel="anchor" href="/space/site/review_policy#social-networking" style="color: #0000cc;"><h2 id="social-networking">Social Networking</h2></a><p>All of my posts are automatically broadcast to my X/Twitter and Mastodon accounts, and I also post occasional links to my LinkedIn profile.</p>
<p>I am also (slowly) starting to produce YouTube videos. This will be a slow process, as I am not a professional video editor and I have no intention of becoming one. I will, however, try to produce some videos that complement the content on this site, and am curious to explore the medium a bit more (and not just in Youtube).</p>
<p>Links to all my social and video accounts can be found on the site footer.</p>
<a class="anchor" id="anchor-past-reviews" rel="anchor" href="/space/site/review_policy#past-reviews" style="color: #0000cc;"><h2 id="past-reviews">Past Reviews</h2></a><p>This is a non-exhaustive list of things I&#8217;ve reviewed in the past:</p>
<p/><table class="compact" style="background: transparent;margin: 0px;padding: 0px;border-collapse: collapse;font-size: 90%;">
<thead>
<tr style="border-top: 1px solid #aaa;">
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Date</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Category</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Link</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Notes</th>
</tr>
</thead>
<tbody style="border-top: 2px solid black;border-bottom: 2px solid black;">
<tr style="border-top: 1px solid #aaa;">
<td rowspan="6" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2026</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Accessories</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2026/05/23/2130" rel="nofollow" style="color: #0000cc;">Logitech Combo Touch (long-term)</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me (discount from Logitech)</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">E-ink Readers</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2026/04/04/1800" rel="nofollow" style="color: #0000cc;">The Xteink X4</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">NAS</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2026/01/25/2000" rel="nofollow" style="color: #0000cc;">YouYeeToo NestDisk</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.youyeetoo.com/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">YouYeeToo</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="3" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SBCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2026/04/11/1900" rel="nofollow" style="color: #0000cc;">Orange Pi 6 Plus</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="http://www.orangepi.org/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Orange Pi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2026/06/11/1830" rel="nofollow" style="color: #0000cc;">MilkV Jupiter 2 / SpacemiT K3</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://radxa.com/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Radxa</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2026/07/18/1920" rel="nofollow" style="color: #0000cc;">M5Stack Tab5</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://m5stack.com/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">M5Stack</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="19" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2025</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">3D Printing</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2025/04/13/2000" rel="nofollow" style="color: #0000cc;">Polyphemus Filament Dryer</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://eibos3d.com/pages/polyphemus?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">EIBOS</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Accessories</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/11/24/1900" rel="nofollow" style="color: #0000cc;">The Maclock</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me (AliExpress)</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Apple</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/04/25/1630" rel="nofollow" style="color: #0000cc;">HomePod Mini</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">E-Ink Tablets</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/01/18/2335" rel="nofollow" style="color: #0000cc;">SuperNote A6X2 Nomad</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://supernote.com/products/supernote-nomad?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Supernote</a>, <a href="/space/reviews/2025/06/14/1530" rel="nofollow" style="color: #0000cc;">six month review</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">E-ink Displays</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/12/13/2200" rel="nofollow" style="color: #0000cc;">The TRMNL (DIY Everything Edition)</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me from Seeed Studio</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Homelab</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2025/02/02/1630" rel="nofollow" style="color: #0000cc;">Sipeed NanoKVM Cube</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2025/03/19/1800" rel="nofollow" style="color: #0000cc;">JetKVM</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://jetkvm.com?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">JetKVM</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Laptops</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/05/15/2230" rel="nofollow" style="color: #0000cc;">MiniBook X N150</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.chuwi.com/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Chuwi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="3" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Mini-PCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2025/03/05/2030" rel="nofollow" style="color: #0000cc;">iKOOLCore R2Max</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.ikoolcore.com/products/ikoolcore-r2-max?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">iKOOLCore</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2025/04/05/1800" rel="nofollow" style="color: #0000cc;">Chuwi LarkBox S</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://store.chuwi.com/products/larkbox-s?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Chuwi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/09/11/1230" rel="nofollow" style="color: #0000cc;">Chuwi AuBox 8745HS</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://store.chuwi.com/products/aubox-8745hs?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Chuwi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Music</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/06/29/1800" rel="nofollow" style="color: #0000cc;">ESI Xsynth</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.esi-audio.com/products/xsynth/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">ESI</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Networking</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/08/03/1900" rel="nofollow" style="color: #0000cc;">Sodola SL902-SWTGW218AS</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/09/14/1630" rel="nofollow" style="color: #0000cc;">Cudy AX3000 Wi-Fi 6 System</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me (multiple units)</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="5" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SBCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2025/03/12/2000" rel="nofollow" style="color: #0000cc;">ArmSoM AI Module 7</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.armsom.org/aim7?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">ArmSoM</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/05/12/2230" rel="nofollow" style="color: #0000cc;">Orange Pi RV2</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-RV2.html?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">OrangePi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/07/26/2145" rel="nofollow" style="color: #0000cc;">ArmSom Forge1</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.armsom.org/armsom-forge1?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">ArmSom</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/08/11/2100" rel="nofollow" style="color: #0000cc;">LattePanda Mu</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.dfrobot.com/product-2902.html?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">DFRobot</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2025/11/09/1930" rel="nofollow" style="color: #0000cc;">LattePanda IOTA</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.dfrobot.com/product-2989.html?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">DFRobot</a> (expansion boards included)</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="28" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2024</td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">3D Printers</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/03/02/1900" rel="nofollow" style="color: #0000cc;">Two Trees SK1</a></td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.twotrees3dofficial.com/products/sk1-corexy-3d-printer-twotrees?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Two Trees</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/07/13/1900" rel="nofollow" style="color: #0000cc;">Two Trees SK1 Enclosure Kit</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Accessories</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/05/18/2000" rel="nofollow" style="color: #0000cc;">3DConnexion SpaceMouse Wireless</a></td>
<td rowspan="3" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Gaming</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/02/03/2000" rel="nofollow" style="color: #0000cc;">Logitech G Cloud</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/04/20/1200" rel="nofollow" style="color: #0000cc;">BSP D8 Bluetooth Controller</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Homelab</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/09/29/1900" rel="nofollow" style="color: #0000cc;">AURGA Viewer</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.aurga.com/products/aurga-viewer?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">AURGA</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="5" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Keyboards</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/02/21/1210" rel="nofollow" style="color: #0000cc;">Logitech K380</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/04/06/1830" rel="nofollow" style="color: #0000cc;">Keychron K7 Max</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.keychron.com/products/keychron-k7-max-qmk-via-wireless-custom-mechanical-keyboard?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Keychron</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/05/25/1800" rel="nofollow" style="color: #0000cc;">Keychron K11 Max</a></td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.keychron.com/products/keychron-k11-max-qmk-via-wireless-custom-mechanical-keyboard?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Keychron</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/10/14/1900" rel="nofollow" style="color: #0000cc;">Keychron K2 HE</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2024/08/17/1400" rel="nofollow" style="color: #0000cc;">Hexgears Immersion A3</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://hexgears.com/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Hexgears</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Mini-PCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/03/17/1900" rel="nofollow" style="color: #0000cc;">AceMagic AM18</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://acemagic.de/collections/minipc/products/acemagic-am18-amd-ryzen%E2%84%A2-7-7840hs-mini-pc?utm_source=BLOG&amp;utm_medium=KOL&amp;utm_campaign=KOL-TAO+OF+MAC&amp;utm_content=external_link" rel="external" style="color: #0000cc;">AceMagic</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/07/04/2200" rel="nofollow" style="color: #0000cc;">GMKtec G2</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">NAS</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/10/26/1900" rel="nofollow" style="color: #0000cc;">CM3588 NVMe NAS Kit</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.friendlyelec.com/index.php?route=product%2Fproduct&amp;product_id=294&amp;utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">FriendlyELEC</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/12/26/2330" rel="nofollow" style="color: #0000cc;">TerraMaster F4-424 MAX</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Donation</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="4" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Networking</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/05/30/2000" rel="nofollow" style="color: #0000cc;">TP-Link L-SG108E</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/11/30/1700" rel="nofollow" style="color: #0000cc;">wisdPi WP-UT5 5GbE USB adapter</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.wisdpi.com?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">wisdpi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2024/08/11/1230" rel="nofollow" style="color: #0000cc;">SL-SWTG124AS</a></td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.sodola-network.com/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Sodola</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2024/08/11/1230" rel="nofollow" style="color: #0000cc;">SL-SWTGW218AS</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="9" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SBCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/01/20/1800" rel="nofollow" style="color: #0000cc;">Orange Pi 5+</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5-plus.html?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Orange Pi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/02/10/2000" rel="nofollow" style="color: #0000cc;">YouYeeToo R1</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.youyeetoo.com/products/youyeetoo-r1?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">YouYeeToo</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/03/09/2000" rel="nofollow" style="color: #0000cc;">Orange Pi Zero 3</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero-3.html?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Orange Pi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/06/16/1800" rel="nofollow" style="color: #0000cc;">Banana Pi M7</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.banana-pi.org/en/banana-pi-sbcs/169.html?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Banana Pi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/07/20/1800" rel="nofollow" style="color: #0000cc;">Luckfox Pico Mini B</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.luckfox.com/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Luckfox</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/08/03/1200" rel="nofollow" style="color: #0000cc;">Radxa X4</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="http://radxa.com/products/x/x4/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Radxa</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/09/16/1600" rel="nofollow" style="color: #0000cc;">XPI-3566-Zero</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.geniatech.com/?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Geniatech</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/10/07/2000" rel="nofollow" style="color: #0000cc;">Banana Pi M5 Pro</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://www.banana-pi.org/en/banana-pi-sbcs/177.html?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Banana Pi</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2024/11/16/1700" rel="nofollow" style="color: #0000cc;">Debix Model A</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by <a href="https://debix.io/hardware/model-a.html?utm_campaign=review&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Debix</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="10" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2023</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">3D Printers</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/01/22/1700" rel="nofollow" style="color: #0000cc;">Kingroon KP3S Pro V1</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p><a href="/space/reviews/2025/04/30/1930" rel="nofollow" style="color: #0000cc;">two year review</a></p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Accessories</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/10/29/1700" rel="nofollow" style="color: #0000cc;">OBSbot Tiny 4K, RODE NTG1</a></td>
<td rowspan="16" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Android</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/04/22/1330" rel="nofollow" style="color: #0000cc;">Lenovo ThinkSmart View</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Apple</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/06/22/1200" rel="nofollow" style="color: #0000cc;">Mac Mini M2 Pro</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/11/23/2000" rel="nofollow" style="color: #0000cc;">iPhone 15 Pro, Watch Series 9</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Keyboards</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/08/08/1230" rel="nofollow" style="color: #0000cc;">Bluehand</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Mini-PCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2023/03/11/2000" rel="nofollow" style="color: #0000cc;">Beelink U59 Pro</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Monitors</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/05/31/0845" rel="nofollow" style="color: #0000cc;">LG 28MQ780-B</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">PC Builds</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/02/18/1845" rel="nofollow" style="color: #0000cc;">ASRock DeskMeet B660</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SBCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2023/10/07/1830" rel="nofollow" style="color: #0000cc;">Radxa Zero</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="11" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2022</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Android</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/04/29/2045" rel="nofollow" style="color: #0000cc;">Xiaomi Mi Stick 4K</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Apple</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/09/11/1850" rel="nofollow" style="color: #0000cc;">iPad Pro M1</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Gaming</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/06/26/2130" rel="nofollow" style="color: #0000cc;">Xbox Series X</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2022/12/10/1930" rel="nofollow" style="color: #0000cc;">Retroid Pocket 3</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="3" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Keyboards</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/02/19/1830" rel="nofollow" style="color: #0000cc;">Avatto Folding Keyboard</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/07/03/2000" rel="nofollow" style="color: #0000cc;">Dierya 63, Adafruit Macropad</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/09/11/1850" rel="nofollow" style="color: #0000cc;">Logitech Combo Touch</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Laptops</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/12/03/1600" rel="nofollow" style="color: #0000cc;">Lenovo ThinkPad X1 Yoga</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Work issued</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Music</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/02/05/1730" rel="nofollow" style="color: #0000cc;">Novation Circuit Tracks</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2022/03/27/1400" rel="nofollow" style="color: #0000cc;">Monome Norns Shield</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Built from kit</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">SBCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2022/09/18/2300" rel="nofollow" style="color: #0000cc;">Banana Pi M2 Zero</a></td>
<td rowspan="6" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="5" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2021</td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Laptops</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2021/08/26/1400" rel="nofollow" style="color: #0000cc;">Lenovo IdeaPad Flex 5</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2021/12/04/1950" rel="nofollow" style="color: #0000cc;">MacBook Pro 14" (M1 Pro)</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Monitors</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2021/08/21/1600" rel="nofollow" style="color: #0000cc;">LG 34WK95U-W</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Music</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2021/04/17/1610" rel="nofollow" style="color: #0000cc;">Teenage Engineering OP-1</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2021/06/03/1930" rel="nofollow" style="color: #0000cc;">Arturia KeyLab Essential 61</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="3" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2020</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Laptops</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2020/12/23/1705" rel="nofollow" style="color: #0000cc;">Surface Book 3</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Work issued</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Music</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2020/08/08/1430" rel="nofollow" style="color: #0000cc;">Yamaha Reface DX, AG06</a></td>
<td rowspan="4" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">NAS</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2020/04/04/2310" rel="nofollow" style="color: #0000cc;">Synology DS1019+</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="4" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2019</td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Apple</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2019/11/17/2000" rel="nofollow" style="color: #0000cc;">iPad Mini 5</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2019/12/08/2150" rel="nofollow" style="color: #0000cc;">Watch Series 5</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Laptops</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2019/05/11/2030" rel="nofollow" style="color: #0000cc;">Surface Laptop</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Music</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2019/09/07/1140" rel="nofollow" style="color: #0000cc;">Roli Songmaker Kit, Korg Nanokey Studio</a></td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2018</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Apple</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2018/11/18/1845" rel="nofollow" style="color: #0000cc;">iPhone XS</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="3" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2017</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">3D Printers</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2017/11/26/2000" rel="nofollow" style="color: #0000cc;">BQ Prusa i3 Hephestos</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Built from kit</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Laptops</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2017/08/23/1900" rel="nofollow" style="color: #0000cc;">Surface Pro 4</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Work issued</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Mini-PCs</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2017/12/03/2130" rel="nofollow" style="color: #0000cc;">Z83ii</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="4" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2016</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Apple</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2016/03/12/1300" rel="nofollow" style="color: #0000cc;">Apple Watch (Sport)</a></td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Keyboards</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2016/03/12/1300" rel="nofollow" style="color: #0000cc;">Logitech Keys-To-Go</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Mice</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2016/11/06/1930" rel="nofollow" style="color: #0000cc;">Citrix X1 Mouse</a></td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"/>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">PC Builds</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2016/12/17/1840" rel="nofollow" style="color: #0000cc;">Streacom ST-F1CB WS Black Aluminum Case</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2014</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Laptops</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2014/09/28/1940" rel="nofollow" style="color: #0000cc;">Acer C720</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Surprisingly still working in 2024</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2013</td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Phones</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2013/10/20/2230" rel="nofollow" style="color: #0000cc;">HTC One</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Test sample</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2010</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2010/10/10/2010" rel="nofollow" style="color: #0000cc;">Samsung Wave 8500</a></td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2009</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">E-ink Readers</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2009/02/01/0936" rel="nofollow" style="color: #0000cc;">The Sony Reader</a></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="3" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2008</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Accessories</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/reviews/2008/04/26/1840" rel="nofollow" style="color: #0000cc;">DisplayLink DVI</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Supplied by DisplayLink</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Cameras</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2008/06/12/0945" rel="nofollow" style="color: #0000cc;">Panasonic Lumix DMC-FX33</a></td>
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Purchased by me</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Laptops</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/blog/2008/10/07/0830" rel="nofollow" style="color: #0000cc;">Asus Eee PC 901</a></td>
</tr>
</tbody>
</table>
<br/>
]]></content>
<category term="meta" label="meta" />
<category term="site" label="site" />
<category term="social" label="social" />
<category term="reviews" label="reviews" />
<category term="audience" label="audience" />
<category term="policy" label="policy" />
</entry>
<entry>
<title>HomeKit Is Dumb</title>
<id>https://taoofmac.com/space/blog/2026/07/17/1601?utm_content=atom</id>
<published>2026-07-17T16:01:00+00:00</published>
<updated>2026-07-17T16:08:57+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/blog/2026/07/17/1601?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">I&#8217;m going to get on my soapbox again and call out <a href="/space/com/apple" rel="next" style="color: #0000cc;">Apple</a> once more on the <em>extremely</em> limited <a href="/space/com/apple/homekit" rel="next" style="color: #0000cc;">HomeKit</a> automation experience&#8211;and how they can fix 80% of the gripes I have with it by just cloning a small subset of the <a href="https://support.apple.com/guide/shortcuts/welcome/ios?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Shortcuts</a> user experience.</p>
<p>The most infuriating, they-are-so-close annoyance I have with it is that <em>automations can only have one trigger, and extremely basic conditions</em>, to the point where they are effectively useless in real life.</p>
<p>Right now, HomeKit automation is effectively as simple as this pseudo-code:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="k">if </span><span class="n">office</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">true</span>
<span class="k">then </span><span class="n">scenes</span><span class="p">.</span><span class="n">office_ambient</span><span class="p">.</span><span class="n">light</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">on</span>
</code></pre></div>

<p>One trigger, one outcome. There are some conditionals, but they are <em>extremely</em> limited:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="k">if </span><span class="n">office</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">true</span>
<span class="w">   </span><span class="nb">and </span><span class="n">schedule</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"daytime"</span>
<span class="k">then </span><span class="n">scenes</span><span class="p">.</span><span class="n">office_ambient</span><span class="p">.</span><span class="n">light</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">on</span>
</code></pre></div>

<p>Conditionals are just a schedule and somebody (optionally me) being home, which is not enough for the way people <em>actually</em> live in a house. For instance, I can&#8217;t set up logic like this:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="k">if </span><span class="n">office</span><span class="p">.</span><span class="n">temperature</span><span class="p">.</span><span class="n">celsius</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">27</span>
<span class="w">   </span><span class="nb">and </span><span class="n">office</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">true</span>
<span class="w">   </span><span class="nb">and </span><span class="n">office_window</span><span class="p">.</span><span class="n">closed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">true</span>
<span class="k">then</span>
<span class="k">   </span><span class="n">office</span><span class="p">.</span><span class="n">heatpump</span><span class="p">.</span><span class="k">target</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">25</span>
<span class="w">   </span><span class="n">office</span><span class="p">.</span><span class="n">heatpump</span><span class="p">.</span><span class="n">mode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cool</span>
<span class="w">   </span><span class="n">office</span><span class="p">.</span><span class="n">heatpump</span><span class="p">.</span><span class="n">fan</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">50</span><span class="p">%</span>
</code></pre></div>

<p>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 &#8220;out of band&#8221; in <a href="/space/dev/javascript/node-red" rel="next" style="color: #0000cc;">Node-RED</a>, but the moment I do that it becomes unfathomable to anyone else in the house.</p>
<p>And yet, it would be pretty much trivial to add both to the Home app (by just stealing the visual <code>if</code> construct from <a href="https://support.apple.com/guide/shortcuts/welcome/ios?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Shortcuts</a>) and to any home hub.</p>
<p>You also can&#8217;t have alternate triggers without duplicating the entire thing (or creating scenes for the common outcome, which clutters your scene list):</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="k">if </span><span class="n">office</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">true</span>
<span class="w">   </span><span class="s2">"I have two presence sensors that actually don't overlap"</span>
<span class="w">   </span><span class="nb">or </span><span class="n">office</span><span class="p">.</span><span class="n">desk</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">true</span>
<span class="k">then</span>
<span class="k">   </span><span class="n">office_desk</span><span class="p">.</span><span class="n">light</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">on</span>
</code></pre></div>

<p>And, finally, there is no way to chain automations after a period of time:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="k">if </span><span class="n">office</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">true</span>
<span class="w">   </span><span class="nb">and </span><span class="n">schedule</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'nighttime'</span>
<span class="k">then</span>
<span class="k">   </span><span class="n">for</span><span class="w"> </span><span class="mi">3</span><span class="n">m</span>
<span class="w">      </span><span class="s2">"Turn on the light so I can search for stuff on my desk"</span>
<span class="w">      </span><span class="n">office_ceiling</span><span class="p">.</span><span class="n">light</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">on</span>
<span class="w">      </span><span class="n">office_ceiling</span><span class="p">.</span><span class="n">light</span><span class="p">.</span><span class="n">intensity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0.5</span>
<span class="w">   </span><span class="k">then</span>
<span class="w">      </span><span class="s2">"Make it dim enough so I can still find things if I linger"</span>
<span class="w">      </span><span class="n">office_ceiling</span><span class="p">.</span><span class="n">light</span><span class="p">.</span><span class="n">intensity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0.25</span>
<span class="w">   </span><span class="n">until</span><span class="w"> </span><span class="n">office</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">false</span>
<span class="w">      </span><span class="k">then </span><span class="n">office_ceiling</span><span class="p">.</span><span class="n">light</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">off</span>
</code></pre></div>

<p>I don&#8217;t have any garage doors (so this is a bit of a contrived example), but I can&#8217;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.</p>
<p>The basic principle would translate to much better and more useful automation overall&#8211;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 <a href="/space/dev/javascript/node-red" rel="next" style="color: #0000cc;">Node-RED</a>).</p>
<p>Complex triggers alone would make HomeKit tremendously more useful:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="k">if </span><span class="n">tv</span><span class="p">.</span><span class="n">power</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">on</span>
<span class="w">   </span><span class="nb">and </span><span class="n">input</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"apple tv"</span>
<span class="w">   </span><span class="nb">and </span><span class="n">schedule</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"night time"</span>
<span class="w">   </span><span class="nb">and </span><span class="n">sofa</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">on</span>
<span class="k">then</span>
<span class="k">   </span><span class="n">tv</span><span class="p">.</span><span class="n">soundbar</span><span class="p">.</span><span class="n">volume</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">6</span>
<span class="w">   </span><span class="n">sofa_lamp</span><span class="p">.</span><span class="n">intensity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0.7</span>
</code></pre></div>

<p>And, of course, something like this:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="k">if </span><span class="n">office</span><span class="p">.</span><span class="n">presence</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">on</span>
<span class="w">   </span><span class="nb">and </span><span class="n">schedule</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"nighttime"</span>
<span class="k">then </span><span class="n">office_homepod</span><span class="p">.</span><span class="n">Siri</span><span class="p">(</span><span class="s2">"Will you be staying long?"</span><span class="p">)</span>
<span class="w">   </span><span class="k">if </span><span class="n">answer</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">true</span>
<span class="w">      </span><span class="p">...</span>
</code></pre></div>

<p>&#8230;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&#8217;m willing to bet they use <a href="https://www.home-assistant.io/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Home Assistant</a> instead&#8230;</p>
<br/>
]]></content>
<category term="automation" label="automation" />
<category term="homekit" label="homekit" />
<category term="apple" label="apple" />
<category term="iot" label="iot" />
</entry>
<entry>
<title>Google Ordered to Open Android and Search in Europe</title>
<id>https://taoofmac.com/space/links/2026/07/17/0810?utm_content=atom</id>
<published>2026-07-17T08:10:00+00:00</published>
<updated>2026-07-17T08:10:00+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/links/2026/07/17/0810?utm_content=atom"/>
<content type="html"><![CDATA[
<p><a href="https://www.theverge.com/policy/966438/eu-google-android-ai-interoperability-search-data-dma?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" title="external link to https://www.theverge.com/policy/966438/eu-google-android-ai-interoperability-search-data-dma" alt="screenshot of https://www.theverge.com/policy/966438/eu-google-android-ai-interoperability-search-data-dma" style="color: #0000cc;"><img class="quicklook" src="https://taoofmac.com/thumb/links/2026/07/17/0810/640,480/TjEFynt29ZYc7XMOaY_omCdIquI=/large.jpg" width="320" height="240" style="max-width: 100% !important;height: auto !important;"/></a></p>
<p class="lead">Google is playing the EU game much better than Apple, but the EU still doesn&#8217;t seem to understand how privacy and security work in modern platforms. Letting people swap the onboard agent is being treated much like the ancient argument over shipping/default browsers&#8211;politically correct, bureaucratically led and technically much harder than changing a default handler.</p>
<p>An agent may need access to personal data and privileged APIs, and keeping a third-party agent away from things it should not access is difficult&#8211;or impossible for some features. The EU&#8217;s framing is therefore somewhat stupid, but Apple will <a href="/space/links/2025/11/07/0732" rel="next" style="color: #0000cc;">have to deal with the same demands</a> (and <a href="/space/links/2024/06/22/0856" rel="next" style="color: #0000cc;">has already held features back</a>), so Google is setting a lot of useful precedents here. Apple certainly won&#8217;t like this.</p>
<br/>
]]></content>
<category term="android" label="android" />
<category term="dma" label="dma" />
<category term="security" label="security" />
<category term="eu" label="eu" />
<category term="ai" label="ai" />
<category term="privacy" label="privacy" />
<category term="google" label="google" />
</entry>
<entry>
<title>RapidRAW</title>
<id>https://taoofmac.com/space/apps/rapidraw?utm_content=atom</id>
<published>2026-07-16T15:15:00+00:00</published>
<updated>2026-07-17T06:52:29+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/apps/rapidraw?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead"><a href="https://github.com/CyberTimon/RapidRAW?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">RapidRAW</a> is a GPU-accelerated RAW editor that the author describes as a non-destructive alternative to <a href="/space/apps/lightroom" rel="next" style="color: #0000cc;">Lightroom</a>, with packages under 20MB for <a href="/space/com/apple/macos" rel="next" style="color: #0000cc;">macOS</a>, <a href="/space/os/linux" rel="next" style="color: #0000cc;">Linux</a>, Windows and <a href="/space/com/google/android" rel="next" style="color: #0000cc;">Android</a>.</p>
<p>The implementation combines a <a href="/space/dev/rust" rel="next" style="color: #0000cc;">Rust</a> core and WGPU/WGSL shaders with a <a href="https://tauri.app?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tauri</a> and React front end&#8211;a much better fit for this kind of app than Electron.</p>
<p>The author says it is not yet as polished as <a href="https://www.darktable.org/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Darktable</a> or <a href="https://www.rawtherapee.com/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">RawTherapee</a>. It already includes masks, parametric curves, LUTs, HDR merging, noise reduction, lens correction and batch editing.</p>
<p/><figure><img alt="RapidRAW editor showing colour and curve controls" src="https://taoofmac.com/media/apps/rapidraw/AqMSoa2DO8Xd7-yWejuKOCwWxA4=/rapidraw.jpg" width="1280" height="720" style="max-width: 100% !important;height: auto !important;"/><figcaption>RapidRAW editor showing colour and curve controls</figcaption></figure><p/>
<br/>
]]></content>
<category term="photography" label="photography" />
<category term="rust" label="rust" />
<category term="image-editing" label="image-editing" />
<category term="tauri" label="tauri" />
<category term="raw" label="raw" />
<category term="open source" label="open source" />
</entry>
<entry>
<title>Google Cancels The Earth... Sort Of</title>
<id>https://taoofmac.com/space/links/2026/07/16/1320?utm_content=atom</id>
<published>2026-07-16T13:20:00+00:00</published>
<updated>2026-07-16T13:20:00+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/links/2026/07/16/1320?utm_content=atom"/>
<content type="html"><![CDATA[
<p><a href="https://hackaday.com/2026/07/16/google-earth-desktop-client-to-be-retired-in-2027/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" title="external link to https://hackaday.com/2026/07/16/google-earth-desktop-client-to-be-retired-in-2027/" alt="screenshot of https://hackaday.com/2026/07/16/google-earth-desktop-client-to-be-retired-in-2027/" style="color: #0000cc;"><img class="quicklook" src="https://taoofmac.com/thumb/links/2026/07/16/1320/640,480/BiYc7XfLvrP6jIM1QMwNwD_mveQ=/large.jpg" width="320" height="240" style="max-width: 100% !important;height: auto !important;"/></a></p>
<p class="lead">This is going to be the end of an era for me. One of the first things I did with the early versions of <a href="/space/com/google/earth" rel="next" style="color: #0000cc;">Google Earth</a> was wire it up to Vodafone&#8217;s mobile network data, producing some genuinely unique&#8211;for the time, at least&#8211;visualisations of network usage over time.</p>
<p>The hotspots were fascinating to actually see: high schools where kids saturated GSM cells with SMS, highways, sports stadiums, the places where 2G/3G hand-overs kept failing. It was <em>extremely</em> useful to us at the time&#8211;far more so than the normal <a href="/space/geo/gis" rel="next" style="color: #0000cc;">GIS</a> systems&#8211;because I could just have a CGI script spit out a <code>.kml</code> file and get &#8220;live&#8221; data straight onto the globe. I also used <a href="/space/apps/gps2gex" rel="next" style="color: #0000cc;">gps2geX</a> with a Garmin GPS to build our own overlays.</p>
<br/>
]]></content>
<category term="gis" label="gis" />
<category term="vodafone" label="vodafone" />
<category term="kml" label="kml" />
<category term="maps" label="maps" />
<category term="mobile" label="mobile" />
<category term="google" label="google" />
</entry>
<entry>
<title>Siri and Apple&#039;s Trickle-Up Strategy</title>
<id>https://taoofmac.com/space/links/2026/07/14/0805?utm_content=atom</id>
<published>2026-07-14T08:05:00+00:00</published>
<updated>2026-07-14T08:05:00+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/links/2026/07/14/0805?utm_content=atom"/>
<content type="html"><![CDATA[
<p><a href="https://www.macstories.net/stories/siri-ai-and-apples-trickle-up-strategy/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" title="external link to https://www.macstories.net/stories/siri-ai-and-apples-trickle-up-strategy/" alt="screenshot of https://www.macstories.net/stories/siri-ai-and-apples-trickle-up-strategy/" style="color: #0000cc;"><img class="quicklook" src="https://taoofmac.com/thumb/links/2026/07/14/0805/640,480/BjZ_WNgfSoR_yQc2cjjJOLiUb8s=/large.jpg" width="320" height="240" style="max-width: 100% !important;height: auto !important;"/></a></p>
<p class="lead">This is about what I&#8217;d expect. If it works, it will seem revolutionary and magical to most people&#8211;including in the EU, though that is another matter entirely&#8211;and yet I still think they could do better. People like me will carry on using more sophisticated, squirrelly, hacky things, and that might well be all we&#8217;re allowed to do in the EU anyway.</p>
<br/>
]]></content>
<category term="ai" label="ai" />
<category term="eu" label="eu" />
<category term="apple" label="apple" />
<category term="siri" label="siri" />
</entry>
<entry>
<title>Notes for July 5-12</title>
<id>https://taoofmac.com/space/notes/2026/07/12/1230?utm_content=atom</id>
<published>2026-07-12T12:30:00+00:00</published>
<updated>2026-07-12T19:27:00+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/notes/2026/07/12/1230?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">This was a weird week, during which I went back to studiously disconnecting from work as soon as possible because, well, <a href="/space/site/disclaimer" rel="next" style="color: #0000cc;">a lot of stuff is going on</a>. 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, <a href="/space/blog/2026/07/08/2130" rel="next" style="color: #0000cc;">all of it</a> has been affecting my motivation and well-being.</p>
<p>To compensate, I ended up writing a fair bit more than usual and taking the time to play around with some novelties (like <a href="/space/blog/2026/07/11/1500" rel="next" style="color: #0000cc;">the new SOTA models</a>). But all this additional personal entropy/dispersion overhead also put me behind on my review schedule, and I have been chastising myself for not turning off as many distractions as possible, reminding myself that all it takes is another interesting project for me to become passionate about work again, and generally trying to do better across the board.</p>
<p>But hey, sometimes welcome distractions literally drop out of the sky.</p>
<a class="anchor" id="anchor-new-3d-printer" rel="anchor" href="/space/notes/2026/07/12/1230#new-3d-printer" style="color: #0000cc;"><h2 id="new-3d-printer">New 3D Printer</h2></a><figure style="margin: 0 auto; text-align: center;">
<img src="https://taoofmac.com/media/notes/2026/07/12/1230/fNZ7cmXI2f5jCZx4Ca6iuOlVd1s=/flashforge-creator-5-pro.jpg" alt="The Flashforge Creator 5 Pro in my office" width="540" height="720" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>It's... imposing, for sure.</figcaption>
</figure>

<p>My new Flashforge Creator 5 Pro arrived this week&#8211;if you&#8217;ve been paying attention, you&#8217;ll know that I have taken my usual long, circuitous (and, let&#8217;s face it, miserly) approach to buying a new 3D printer since I started tracking both the <a href="/space/com/flashforge/ad5x" rel="next" style="color: #0000cc;">Flashforge AD5X</a> and the <a href="/space/com/snapmaker/u1" rel="next" style="color: #0000cc;">Snapmaker U1</a> early last year, and it&#8217;s finally here.</p>
<p>I will write a dedicated review when I&#8217;ve poked at it enough, but the background story is, in short, that:</p>
<ul>
<li>I still quite like (and intend to keep using) my <a href="/space/com/two_trees/sk1" rel="next" style="color: #0000cc;">SK1</a> and <a href="/space/com/kingroon/kp3s_pro" rel="next" style="color: #0000cc;">KP3S Pro</a>, but have long felt I needed a better printer for technical filaments</li>
<li>I don&#8217;t intend to print multi-colour frippery, but rather to use <em>multi-material</em> printing</li>
<li>I hate the waste from single-nozzle multi-colour systems, so a toolchanger is the only thing that ever made sense to me</li>
<li>I took a bet on Flashforge&#8217;s Kickstarter because, well, I&#8217;m not made of money</li>
</ul>
<p>Even so, this was something I&#8217;d been saving up for since <em>before</em> I got the <a href="/space/com/two_trees/sk1" rel="next" style="color: #0000cc;">SK1</a> as a review unit, so it wasn&#8217;t really a splurge or impulse thing&#8211;as a somewhat depressing comparison, I have been putting money aside to upgrade my Mac mini for about as long, aiming for a four-year replacement cycle&#8211;but after the recent price hikes, I&#8217;m now looking at&#8230; eight at this rate?</p>
<p>The only thing I regret is that it arrived while my enthusiasm was at a fairly low ebb, so it will take me a while to make full use of it. But at least <a href="/space/apps/orcaslicer" rel="next" style="color: #0000cc;">OrcaSlicer</a> already supports it fully, and even though Flashforge has decided not to expose the full <a href="/space/3d/printing/klipper" rel="next" style="color: #0000cc;">Klipper</a> UI, I have started building <a href="https://github.com/rcarmo/swift-flashforgeui?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">a native Swift app</a> (based on an existing Electron app) to monitor it; I essentially tossed <a href="https://github.com/praeclarum/UI.md?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">UI.md</a> and the Electron source code into a blender, and thanks to Codex and GPT-5.6, I had this working in under four hours:</p>
<figure>
<img src="https://taoofmac.com/media/notes/2026/07/12/1230/QrP_riSvuLz1nnfq8QYatMqS1_4=/flashforgeui-overview.png" alt="FlashForgeUI showing live status, camera, telemetry and material data from the Creator 5 Pro" width="1920" height="1492" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>This is already live data from the printer.</figcaption>
</figure>

<a class="anchor" id="anchor-3d-reconstructions" rel="anchor" href="/space/notes/2026/07/12/1230#3d-reconstructions" style="color: #0000cc;"><h2 id="3d-reconstructions">3D Reconstructions</h2></a><p>Following up on <a href="/space/notes/2026/06/28/1200" rel="next" style="color: #0000cc;">my photogrammetry trials</a> from a couple of weeks ago, I took a look at AI-assisted mesh (re)construction, with pretty interesting results:</p>
<figure>
<img src="https://taoofmac.com/media/notes/2026/07/12/1230/znytP97eotr4j25UpUCXsm0nevo=/orange-pi-6-plus-reconstruction.png" alt="AI-reconstructed mesh of an Orange Pi 6 Plus in Blender" width="1920" height="1058" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>This is the Orange Pi 6 Plus, without a heatsink.</figcaption>
</figure>

<p>The papers I found are, as such things go, already somewhat dated (<a href="https://arxiv.org/abs/2405.14832?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">the first</a> and <a href="https://arxiv.org/abs/2501.12202?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">its sibling</a> were published in 2024 and 2025). What surprised me was how trivial the process is.</p>
<p>The mesh above was the result of feeding <a href="https://github.com/Tencent-Hunyuan/Hunyuan3D-2?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Hunyuan3D-2 MV</a> a couple of semi-random, non-orthogonal shots of an SBC I found through an image search. It clearly got some of the connectors wrong, but is still <em>much</em> better than my earlier results.</p>
<p>I stumbled upon this completely by accident while researching 3D mesh generation, and to my delight I was able to get <a href="https://github.com/DreamTechAI/Direct3D?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Direct3D</a> (which is, incidentally, an unfortunate and nearly impossible name to search for&#8230;) to work on my puny RTX 3060, which then led me to <a href="https://github.com/DreamTechAI/Direct3D-S2?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Direct3D-S2</a> and <a href="https://github.com/Tencent-Hunyuan/Hunyuan3D-2?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Hunyuan3D-2 MV</a>.</p>
<p>The idea of going straight from diffusion to a mesh (and then using marching cubes) is pretty neat, and even though a bazillion people are using this to create game assets, 3D-print miniatures and the like, having a passable, proportionally correct shim for bootstrapping SBC enclosures from just two photos seems worth poking at&#8211;even if some of my friends keep pointing out that I&#8217;d have them done by now if I just used a pair of callipers.</p>
<a class="anchor" id="anchor-remote-cad" rel="anchor" href="/space/notes/2026/07/12/1230#remote-cad" style="color: #0000cc;"><h2 id="remote-cad">Remote CAD</h2></a><p>At the other end of the process, I&#8217;ve decided to reinvent the wheel and bootstrap my own Wayland environment, which is going&#8230; slowly. I&#8217;ve started by upstreaming some of my changes to <a href="https://github.com/Devolutions/IronRDP?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">IronRDP</a> and have a mostly working solution, although I did spend an embarrassingly long amount of time patching <code>labwc</code> (which is the compositor I&#8217;m vendoring) so that it rendered Platinum-like window decorations:</p>
<figure>
<img src="https://taoofmac.com/media/notes/2026/07/12/1230/W5dDtCAXncrc_e-HnZAnzIwP5sI=/remote-cad-platinum-desktop.png" alt="A remote Wayland desktop with Platinum-style window decorations running a WebGL aquarium" width="1920" height="1354" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>GPU-accelerated Platinum-style window decorations, because apparently this is what I do now to relax.</figcaption>
</figure>

<p>I also had yet another go at getting <a href="/space/apps/shapr3d" rel="next" style="color: #0000cc;">Shapr3D</a> to run under WINE, but it is so dependent on unimplemented Windows APIs that I gave up after a few hours. I may try again later since I would very much like to have a semi-permanent remote CAD setup, but for now I am content to use my iPad to run it.</p>
<a class="anchor" id="anchor-other-stuff" rel="anchor" href="/space/notes/2026/07/12/1230#other-stuff" style="color: #0000cc;"><h2 id="other-stuff">Other Stuff</h2></a><p>Besides maintaining <a href="https://rcarmo.github.io/projects/piclaw/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>piclaw</code></a>, I have been <a href="/space/apps/shelf" rel="next" style="color: #0000cc;">poking at Shelf</a> and creating the Flashforge monitoring app I discussed above. Both are native <a href="/space/dev/swift" rel="next" style="color: #0000cc;">Swift</a> apps, a departure from my usual stance of hacking the least possible amount of code to wrap something as a Mac app.</p>
<p>Neither is fully usable yet, but I&#8217;ve learned quite a bit in the process, including that using <code>/goal</code> in Codex to explore the limited printer API and figure out what else we could do can have hilarious effects when it involves running a Swift app repeatedly over lunchtime:</p>
<figure class="full-width">
<img src="https://taoofmac.com/media/notes/2026/07/12/1230/PxohvNhgWLjIKAgVU9UkPsW6DCU=/flashforgeui-local-network-prompts.png" alt="Dozens of overlapping macOS local network permission prompts triggered by FlashForgeUI" width="1920" height="810" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>In my defense, I was supervising it from my iPad...</figcaption>
</figure>

<p>Now if you&#8217;ll excuse me, I need to get back to testing some of the hardware that has been piling up on my desk, some of which had to be relocated hastily when I swapped out the <a href="/space/com/two_trees/sk1" rel="next" style="color: #0000cc;">SK1</a> for the Creator 5 Pro and needed to find a new place for it&#8230;</p>
<blockquote>
<p><strong>Update:</strong> Also, a minor home automation note: <a href="/space/blog/2019/01/27/2130" rel="next" style="color: #0000cc;">my hacky doorbell extender</a> finally gave up the ghost after seven years of faithful service because its micro-USB connector got torn off. I replaced it with a <a href="https://www.zigbee2mqtt.io/devices/ZA03.html?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Tuya ZA03</a>, but I actually miss the buzzer. Either way, this is a chance to move the debouncer logic out of Node-RED, and another lovely inconsequential-but-satisfactory micro-project to have on hand in case of further workplace madness.</p>
</blockquote>
<br/>
]]></content>
<category term="ai" label="ai" />
<category term="swift" label="swift" />
<category term="cad" label="cad" />
<category term="3d printing" label="3d printing" />
</entry>
<entry>
<title>My AI Model Tier List for mid-2026</title>
<id>https://taoofmac.com/space/blog/2026/07/11/1500?utm_content=atom</id>
<published>2026-07-11T15:00:00+00:00</published>
<updated>2026-07-17T12:18:52+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/blog/2026/07/11/1500?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">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&#8217;re reading this in the far future when we have cheap RAM, both Fable and GPT 5.6 were, for a bit, subject to the whims of red tape), I spent a little time taking stock of what was left to us here in Europe and whether any of it actually works.</p>
<blockquote>
<p><strong>Update, July 16th:</strong> This isn&#8217;t aging well&#8211;for the record, and even though I haven&#8217;t yet spent a lot of time with Kimi 3, I&#8217;d say you should read the Moonshot AI section with a dollop of salt, because it&#8217;s <em>way</em> better than 2.7&#8211;but it&#8217;s still too early to do a full write-up.</p>
</blockquote>
<p>I suspect I wasn&#8217;t the only one doing this over the past few weeks, but now that both Fable and Sol are &#8220;back&#8221;, I decided, as a distraction from the mild chaos at work, to sit down and tidy up my notes while they were still current.</p>
<p>This isn&#8217;t a benchmark, and I don&#8217;t much care about anyone&#8217;s leaderboard: the existing ones are either pointless or gamed (or both), because the numbers stop meaning anything the moment you point a model at a real codebase with a real <code>SPEC.md</code> and real tests.</p>
<p>So take this as a set of caricatures instead&#8211;exaggerations of the behaviours I&#8217;ve run into week after week, switching between models for coding, auditing and the occasional bout of retrocomputing madness. They&#8217;re unfair, as caricatures tend to be, and mostly true.</p>
<a class="anchor" id="anchor-the-anthropic-fable" rel="anchor" href="/space/blog/2026/07/11/1500#the-anthropic-fable" style="color: #0000cc;"><h2 id="the-anthropic-fable">The Anthropic Fable</h2></a><p>I can&#8217;t help but think that Fable is very, very aptly named, because nothing about it feels quite real.</p>
<p>Opus writes a beautiful UI, tells you everything is done, and breaks three unrelated files on the way out. It is irritatingly fluent, West Coast glib and confident, and often <a href="/space/notes/2026/06/14/1800" rel="next" style="color: #0000cc;">verbose about what it claims it built and wrong about what is actually there</a>&#8211;a salesman spinning a beautiful yarn while I check the <code>diff</code>. I&#8217;ve had it cheerfully lie about implementing MMU and I/O emulation and then act wounded when I checked.</p>
<p>Its saving grace has been that 4.8 is good at both front-end code and turning a pile of requirements into user stories&#8211;even little Sonnet, bless its silly little heart, can do that faster than any committee.</p>
<p>But ask either to write tests and they will <a href="/space/blog/2026/06/04/1222" rel="next" style="color: #0000cc;">plain cheat at them</a>, papering over corner cases and, sometimes, entire chunks of any <code>SPEC.md</code> you throw at them.</p>
<p>Fable, sadly, has been no different, at least not for me.</p>
<p>Opus, despite being the &#8220;grown up&#8221;, consistently mangled long files, did drive-by edits on tangentially related ones, and has a sycophantic streak I&#8217;ve never managed to fully beat out of it. Fable improved on that and certainly feels different, although I may merely not have used it long enough to catch it in the act.</p>
<p>More to the point, Fable seems to ignore entire sections of directives or existing program modules and cheerily duplicate them &#8220;better&#8221;, not really explaining why. I haven&#8217;t (yet) caught it outright lying about its achievements, but I trust it about as far as I can throw Opus.</p>
<p>Sonnet, in general, lies less than Opus simply because it understands and achieves much less (and no, judging by the couple of hours I spent with Sonnet 5, it isn&#8217;t much of an improvement), but those shared foibles are, generally, the reason I didn&#8217;t particularly regret not having access to Fable for a while.</p>
<p>Older versions could be competent&#8211;Opus 4.6 once <a href="/space/til/2026/02/16/1334" rel="next" style="color: #0000cc;">reverse-engineered an STL into a stupefyingly accurate OpenSCAD file</a>, which is the sort of thing I&#8217;d never have managed alone. Then 4.7 shipped feeling <a href="/space/notes/2026/04/19/1400" rel="next" style="color: #0000cc;">lobotomized</a>, and it was plain that Anthropic was nerfing it too much.</p>
<p>And that takes me to a tangential issue that certainly tinges my viewpoint&#8211;the part I like least isn&#8217;t the models so much as the posture: Anthropic is betting hardest on mainstream adoption while locking you into its own harness, which is of increasingly dubious value when the harness itself becomes context overhead.</p>
<p>That said, I&#8217;ve had decent results using both Opus and Fable as a &#8220;manager&#8221; for OpenAI sub-agents, but the arrangement sometimes worked out about as you would expect: just like a human team, when the GPT models implemented their tasks successfully, the manager spewed out glorious progress reports. When they didn&#8217;t, it offered &#8220;guidance&#8221; that was only marginally useful because it was outside the immediate context the agents were pursuing.</p>
<blockquote>
<p><strong>Tier: B.</strong> Brilliant and slippery. Keep a <code>diff</code> open and one finger on the cancel button, because it <em>will</em> shove bugs under the rug.</p>
</blockquote>
<a class="anchor" id="anchor-better-call-sol" rel="anchor" href="/space/blog/2026/07/11/1500#better-call-sol" style="color: #0000cc;"><h2 id="better-call-sol">Better Call Sol</h2></a><p>I have a Codex trial subscription for my OSS work, so I&#8217;m biased. Judging by Twitter, there are&#8230; dozens of us.</p>
<p>GPT 5.5 was already pretty good&#8211;output felt like it was coming from a senior engineer who never uses emoji, never pads a reply with adjectives, and finds the bugs in your pull request without making a song and dance about it. I <a href="/space/blog/2026/01/17/2130" rel="next" style="color: #0000cc;">tuned out of Claude the moment I tried the sober, emoji-free GPT 5.x replies</a>, and I never regretted it.</p>
<p>When I make the mistake of letting Anthropic&#8217;s models break something, 5.x is what I bring in to audit&#8211;the fixes are usually solid, it seldom goes and tramples unrelated code, and in my experience OpenAI models really do clean up after Anthropic ones.</p>
<p>That restraint matters more than it sounds after a few hours spent putting up with Opus&#8217;s slop.</p>
<p>It&#8217;s the only family of models that writes halfway-decent tests; Codex 5.3 was what made my blog engine port and most of my TDD projects very workable indeed. But it has no taste: it&#8217;ll <a href="/space/blog/2026/02/06/1245" rel="next" style="color: #0000cc;">design an API surface that makes sense on paper and is miserable to use</a>, and the family has drifted off a bit since then. GPT 5.4 was less thorough than Codex 5.3, and 5.5 initially felt <a href="/space/notes/2026/05/07/0600" rel="next" style="color: #0000cc;">&#8220;worse&#8221; in some way I can&#8217;t yet pin down</a>&#8211;chattier, friendlier, and somehow worse at finding a logic error in a 2000-line file.</p>
<p>In practice, I can give GPT 5.4-mini a <code>SKILL.md</code> file, well-defined tools and a task to do, and 90% of the time <em>it will just work</em>. I could never get anything like that to work reliably with Sonnet.</p>
<p>The 5.x family also seems to have a penchant for building its own scaffolding and tooling, like when <a href="/space/notes/2026/05/07/0600" rel="next" style="color: #0000cc;">5.4 crafted a visual diff tool to compare site rendering engines</a> rather than trusting either of us to eyeball the output.</p>
<p>Sol (which is the only model from the 5.6 family that I&#8217;ve used extensively so far) is <em>very</em>, very good at low-level code&#8211;it has been systematically plugging holes in my JIT and emulator stuff not by trial and error, but through static analysis. Like 5.5, it can also use <code>delegate</code> very effectively in <a href="https://github.com/rcarmo/piclaw?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>piclaw</code></a>, totally unprompted.</p>
<p>I&#8217;ve run it against a few of my ongoing projects, and it not only fixed stuff Fable had gotten wrong, but also came up with a much saner set of API endpoints than the other models&#8211;and <em>tested it</em>, with sane tests for the API, the underlying data schemas, and the UX.</p>
<p>I&#8217;ve been using 5.5 to go from user stories to Gherkin to Playwright tests in a few steps, but 5.6 just went and did it quickly, end-to-end, for one of my web tools, unprompted other than for the spec.</p>
<p>(Note that I don&#8217;t do one-shot prompts&#8211;<a href="/space/blog/2026/03/08/2130" rel="next" style="color: #0000cc;">I go through the entire PRD to SPEC to <code>plan</code> cycle</a>, and <a href="https://github.com/rcarmo/piclaw?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>piclaw</code></a> supplies models with bare tooling, but the repo this happened in did not have an <code>AGENTS.md</code> file or skills).</p>
<blockquote>
<p><strong>Tier: S.</strong> The one I trust with sharp objects. It still has no taste, but it gets low-level code right and leaves working tests behind.</p>
</blockquote>
<a class="anchor" id="anchor-lost-in-the-mists" rel="anchor" href="/space/blog/2026/07/11/1500#lost-in-the-mists" style="color: #0000cc;"><h2 id="lost-in-the-mists">Lost in the Mists</h2></a><p>We have a myth here in Portugal where King Sebastian, who was lost to us in an epic battle, will one day return from the mists and deliver us.</p>
<p>Well, I don&#8217;t think Mistral is likely to do that for Europe, but I sure have tried using it. The model I keep underestimating and the company I keep rolling my eyes at are, awkwardly, the same outfit.</p>
<p>Vibe, their TUI, has been <a href="/space/blog/2026/06/04/1222" rel="next" style="color: #0000cc;">surprisingly capable</a>&#8211;it played nicely with <code>tmux</code>, the clipboard handling never once tripped me up, the free tier was generous enough to experiment with, and it ran Mistral inside my agent containers doing real work without much fuss.</p>
<p>For a pairing I only expected to tolerate, it earned a permanent slot until I moved to Codex, and I&#8217;d call it a competent, much less snooty Sonnet.</p>
<p>And for a model this unapologetically French, it has one baffling failing: it never once sauntered in like Pepe Le Pew, tail aloft, to christen anything <em>le</em> this or <em>le</em> that. All that Gallic charm on the box, and not one amorous skunk in the actual tokens&#8211;the only stray <em>le</em> I ever saw was the brand name on <em>Le Chat</em>. That is to say that it never hallucinated, lied to me, or otherwise tried to gaslight me, and the code was (and is, since I still have access to it in Azure Foundry) unremarkable but competent.</p>
<p>The company is harder to love. Mistral <a href="/space/links/2026/04/13/0730" rel="next" style="color: #0000cc;">published a 52-minute manifesto on how Europe should build a sovereign AI stack</a>&#8211;talent, single-market scale, local compute, the lot&#8211;which reads like a policy brief from the company that would most benefit from &#8220;buy European&#8221; procurement rules.</p>
<p>Mind you, the underlying analysis is hard to argue with. It&#8217;s also hard to take entirely seriously from a European company that, at the time, wouldn&#8217;t even hire remotely in Europe (Anthropic, by the way, already has a few offices open in key locations&#8211;all too distant for me, though).</p>
<p>The irony is that if the Chinese government ever decides to curtail access to models from its own research labs the way Washington just has, Mistral might be the only credible supplier of SOTA models in Europe. And like most European compromises, it would get us absolutely nowhere&#8211;unless they are secretly brewing a Fable-class model, which is hardly apparent despite all the &#8220;le gros chat&#8221; parodies that flooded the net a few weeks back.</p>
<blockquote>
<p><strong>Tier: C.</strong> The TUI was better than expected; the models are competent enough not to be interesting. The sovereignty sermon together with lack of visible motion is very European indeed.</p>
</blockquote>
<a class="anchor" id="anchor-twin-peaks" rel="anchor" href="/space/blog/2026/07/11/1500#twin-peaks" style="color: #0000cc;"><h2 id="twin-peaks">Twin Peaks</h2></a><p>Gemini is&#8230; weird. I have it (via GitHub Copilot) on every machine I use and have reached for it on almost none of them. It rides along in <a href="/space/notes/2026/01/25/2030" rel="next" style="color: #0000cc;">my agent containers &#8220;for kicks&#8221;</a>, it&#8217;s the third pane in a Copilot side-by-side I mostly use to confirm I prefer the other two, and I can&#8217;t remember it ever fixing any of the stuff I handed over to Codex&#8211;I&#8217;ve never found a reason to start <a href="/space/blog/2026/05/14/1220" rel="next" style="color: #0000cc;">selling out to Gemini</a> with actual money.</p>
<p>This leaves Gemini in the least useful category: a model I have everywhere and no reason to choose. It has one strength I&#8217;ve pinned down, and an unsurprising one&#8211;<a href="/space/notes/2026/01/25/2030" rel="next" style="color: #0000cc;">architecting Go packages</a>&#8211;but I&#8217;ve never had the patience to see it through a whole project because nothing it did made me want to keep going.</p>
<p>The joke, of course, is that it&#8217;s the model everyone is going to use without choosing it: <a href="/space/blog/2026/06/08/2040" rel="next" style="color: #0000cc;">Apple Foundation Models are derived from Gemini</a>, so half the people who&#8217;d never install it are running it by proxy. Nobody <em>picks</em> Gemini.</p>
<blockquote>
<p><strong>Tier: C.</strong> Present everywhere, chosen nowhere. Very Google.</p>
</blockquote>
<a class="anchor" id="anchor-the-incredible-shrinking-whale" rel="anchor" href="/space/blog/2026/07/11/1500#the-incredible-shrinking-whale" style="color: #0000cc;"><h2 id="the-incredible-shrinking-whale">The Incredible Shrinking Whale</h2></a><p>DeepSeek is, <a href="/space/blog/2026/05/09/2130" rel="next" style="color: #0000cc;">thanks to Salvatore Sanfilippo</a>, now very much available &#8220;locally&#8221; if you can spare a kidney (or, given <a href="/space/links/2026/06/26/0556" rel="next" style="color: #0000cc;">Apple&#8217;s recent pricing increases</a>, almost two).</p>
<p>As a model, though, I&#8217;ve found it somewhat unremarkable&#8211;good, but not good enough that I reach for it before GLM. Its MoE architecture and copious documentation make it a more plausible basis for useful local inference than anything Qwen or Gemma offers now, though.</p>
<p>The thing is, it barely counts as a model in the grand scheme of things&#8211;it&#8217;s now mostly a flag for the local AI movement, and, to a degree, more of a hardware problem than a software one. The interesting part is neither its origin nor its capabilities but <a href="/space/blog/2026/05/09/2130" rel="next" style="color: #0000cc;">@antirez&#8217;s brilliant hack</a> of a bare-metal inference engine that makes running it locally (well, the Flash variant, at least) actually feasible at usable speeds.</p>
<p>And I get the excitement&#8211;I, too, have been <a href="/space/blog/2026/05/09/2130" rel="next" style="color: #0000cc;">chasing that vision within my meagre resources</a> by porting it to Go in <code>go-ds4</code>. It turned &#8220;run a frontier-ish model at home&#8221; into <a href="/space/notes/2026/05/10/1433" rel="next" style="color: #0000cc;">a weekend of SIMD and Go assembly</a>, which is how an open model became yet another project gated behind hardware most of us can&#8217;t justify buying.</p>
<p>In practice, though, I have had a couple of <code>piclaw</code> instances running it almost exclusively for weeks on end without much complaint, switching between Flash and Pro on Azure Foundry&#8211;where it is both cheap and readily available, unlike the hardware required to run it at home.</p>
<blockquote>
<p><strong>Tier: B.</strong> Perfectly useful in the cloud. At home, you had better be prepared to spend a <em>lot</em> of money on hardware.</p>
</blockquote>
<a class="anchor" id="anchor-z-is-for-zorglub" rel="anchor" href="/space/blog/2026/07/11/1500#z-is-for-zorglub" style="color: #0000cc;"><h2 id="z-is-for-zorglub">Z is for&#8230; Zorglub?</h2></a><p>I&#8217;ve topped up my OpenRouter account twice, largely to spend the credits on GLM. 5.1 was OK but not ground-breaking (and I have access to it via Azure Foundry), while 5.2 has something of GPT 5.4&#8217;s directness (at least with my <code>AGENTS.md</code>) and just enough of Claude&#8217;s flair to be the most interesting open model I&#8217;ve used since DeepSeek was let loose.</p>
<p>I haven&#8217;t spent enough time with 5.2 to draw a fair caricature, but running it alongside Opus 4.8 and GPT 5.4 it did a perfectly serviceable job of the chores I threw at it&#8211;mostly porting a couple of things to Go and Rust. Nothing major, but also nothing it seemed to mess up.</p>
<p>And then there&#8217;s the local angle&#8211;GLM keeps getting held up as one of the open models that will democratise all this, and every time I look, <a href="/space/blog/2026/02/14/1500" rel="next" style="color: #0000cc;">the latest GLM release still needs an eye-watering amount of resources</a> that puts it firmly out of reach of the hardware most people actually own.</p>
<p>The catch is that the &#8220;local&#8221; part still requires hardware owned by a very small and conspicuously well-funded slice of the market. I&#8217;d be delighted to be proven wrong on something I can afford, but every release so far has moved the goalposts for hardware requirements.</p>
<p>Still, over two weeks and $50 in OpenRouter credits I had <em>zero</em> issues with it as long as I kept my expectations reasonable. I don&#8217;t care if the weights were created by a Chinese company&#8211;it&#8217;s a perfectly good model to host and rally around in Europe if both the US and China go into lockdown mode (politicians, alas, will never understand this).</p>
<blockquote>
<p><strong>Tier: A.</strong> Cheap, capable, and the one I&#8217;d point European hosters at. Calling it &#8220;local&#8221; still requires the sort of hardware that costs a kidney.</p>
</blockquote>
<a class="anchor" id="anchor-to-the-moon-but-low-orbit" rel="anchor" href="/space/blog/2026/07/11/1500#to-the-moon-but-low-orbit" style="color: #0000cc;"><h2 id="to-the-moon-but-low-orbit">To The Moon, but Low Orbit</h2></a><p>Kimi felt much the same. I mostly played with 2.6 for a couple of evenings (nothing special) and have yet to really use 2.7, but until the new GLM came out it was <a href="/space/blog/2026/05/14/1220" rel="next" style="color: #0000cc;">the most interesting model in the pricing tables that ship with <code>piclaw</code></a>&#8211;and cheap enough that I never begrudged the tokens.</p>
<blockquote>
<p><strong>Tier: B.</strong> Probably. I haven&#8217;t used 2.7 enough for anything more elaborate than that.</p>
</blockquote>
<a class="anchor" id="anchor-genies-in-the-lamp" rel="anchor" href="/space/blog/2026/07/11/1500#genies-in-the-lamp" style="color: #0000cc;"><h2 id="genies-in-the-lamp">Genies in the Lamp</h2></a><p>Everything above only runs at useful speeds in someone else&#8217;s datacentre. Over the past few months <a href="https://github.com/rcarmo/llama-cpp?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">my llama.cpp fork</a> has been where I&#8217;ve tried to do without one&#8211;first as part of my <a href="/space/reviews/2026/06/11/1830" rel="next" style="color: #0000cc;">K3 testing</a>, then as a more serious attempt to get usable inference at decent speeds <em>with tool-calling</em> and enough context.</p>
<p>Because, well, the models I actually &#8220;own&#8221; all have to squeeze into a 12GB RTX 3060, and the pattern has always been the same: promising on paper, but always one VRAM tier short of usable.</p>
<p>Gemma 4 is, actually, the one I like best, mostly because it finally got fast. After some messing about with the <code>E4B</code> variant&#8217;s <a href="/space/notes/2026/06/28/1200" rel="next" style="color: #0000cc;">QAT and MTP weights and a few patches to <code>llama.cpp</code></a>, I got the E4B quants running at nearly 90 tok/s&#8211;quick enough to surprise me.</p>
<p>It is also dim and forgetful: the context window is far smaller than I consider usable, and for anything past &#8220;if this (and maybe that) then this other arbitrary set of things&#8221; it just barely qualifies. <code>piclaw</code> <em>can</em> drive it, but it gets off-track too early and the results are reliably frustrating.</p>
<p>Qwen 3.6 is the one I keep trying to cram into the same card and never quite manage. I&#8217;ve spent real time <a href="/space/notes/2026/05/24/1445" rel="next" style="color: #0000cc;">shoehorning it in with MTP and KV-cache optimisations</a> and still don&#8217;t have a usable solution&#8211;it is always a couple of gigabytes away from fitting. The architecture is clever, but the VRAM requirements just don&#8217;t help.</p>
<p>Until hardware gets cheaper&#8211;and <a href="/space/links/2026/06/26/0556" rel="next" style="color: #0000cc;">recent price hikes</a> suggest it won&#8217;t soon&#8211;anything you want to run locally is going to require both VRAM and bus speeds that the vast majority of people just don&#8217;t have&#8211;and no, my 36GB MacBook Pro is not where I want to run these things; I love my battery.</p>
<blockquote>
<p><strong>Tier: D.</strong> I still cannot fit the models I want into the hardware I own.</p>
</blockquote>
<a class="anchor" id="anchor-where-this-leaves-me" rel="anchor" href="/space/blog/2026/07/11/1500#where-this-leaves-me" style="color: #0000cc;"><h2 id="where-this-leaves-me">Where This Leaves Me</h2></a><p>None of this is, as you might have gathered, scientific or prescriptive, and I don&#8217;t actually pick a winner. On any given day <code>piclaw</code> is running a cheap GPT-5-Mini-class model for the boring parts, reaching for Opus when it needs to interpret something fuzzy, and switching to a Codex model the moment real code is needed, with tests to catch whatever Anthropic broke behind my back. We anthropomorphize models and ascribe them personalities, but we need to stop pretending that any single one of them&#8211;or any company creating them&#8211;is our friend.</p>
<p>I am, in the long term, rooting for open-weight models. Even if we can&#8217;t run them on local hardware cheaply, European hosters already can, and in the meantime (with any luck) Europe will get off its collective ass and invest in doing something more than <a href="https://eurollm.io?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">tiny towers of Babel</a>.</p>
<p>I know it&#8217;s a start, don&#8217;t get me wrong. But it is not where we should be right now.</p>
<br/>
]]></content>
<category term="coding" label="coding" />
<category term="llm" label="llm" />
<category term="opinion" label="opinion" />
<category term="agents" label="agents" />
<category term="local-inference" label="local-inference" />
<category term="ai" label="ai" />
</entry>
<entry>
<title>The Return of Shelf</title>
<id>https://taoofmac.com/space/blog/2026/07/10/1330?utm_content=atom</id>
<published>2026-07-10T13:30:00+00:00</published>
<updated>2026-07-10T14:30:00+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/blog/2026/07/10/1330?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">Remember when the internet was young, there was a finite (but quite large) set of personal sites, personal contact actually <em>mattered</em> and you had trouble keeping track of who blogged where, who you corresponded with and what their social handles were?</p>
<p>You know, before all hell broke loose and we got 300 variations on impersonal blogging platforms (ahem Medium), entirely too many walled-garden social networks and utterly unmanageable spam?</p>
<p>Well, back in those days I used something called <a href="/space/apps/shelf" rel="next" style="color: #0000cc;">Shelf</a>, created by Tom Insam, which did a pretty amazing thing for the time (because Apple actually had working desktop automation, but I digress):</p>
<blockquote>
<p>It looked at the current foreground application, and tried to figure out if what you were looking at corresponded to a person in your address book&#8211;and then gave you more context on them</p>
</blockquote>
<p>It was pretty amazing, really:</p>
<p/><figure><img alt="The original Shelf, surfacing context about Tom by looking at his site" src="https://taoofmac.com/media/blog/2026/07/10/1330/WQS2CP58lmzz4nWIrxj9Iv1O7gg=/original-shelf.png" width="510" height="503" style="max-width: 100% !important;height: auto !important;"/><figcaption>The original Shelf, surfacing context about Tom by looking at his site</figcaption></figure><p/>
<p>I spent quite a while hacking on it 16 years ago, and one of the things I <em>really</em> wanted was for it <a href="/space/links/2010/03/13/1007" rel="next" style="color: #0000cc;">to show me related emails</a>. At the time, <a href="/space/ai" rel="next" style="color: #0000cc;">AI</a> was not a thing, but Apple was surprisingly ahead of the curve and was shipping a <a href="/space/blog/2011/08/11/2240" rel="next" style="color: #0000cc;">Latent Semantic Mapping framework</a> that I used to build myself quite a nice <a href="/space/apps/mail" rel="next" style="color: #0000cc;">Mail.app</a> extension&#8211;that Apple kept killing, again and again, as it progressively neutered what developers could build atop Mail.</p>
<p>Eventually Apple killed much better, downright brilliant extensions like <a href="/space/links/2007/11/02/1007" rel="next" style="color: #0000cc;">Mail Act-On, which I had used for years</a>, and all we got is that stupid little &#8220;Filing Suggestions&#8221;/<code>Move To</code> button in Mail, which, besides being available only on macOS, seldom works and is hardly deterministic.</p>
<p>Well, guess what, LSM is still there, and thanks to the power of AI I have resurrected <a href="/space/apps/shelf" rel="next" style="color: #0000cc;">Shelf</a> to a degree:</p>
<p/><figure><img alt="Shelf reborn, falling back to related mail search and Next Best actions" src="https://taoofmac.com/media/blog/2026/07/10/1330/5Y40w5F-neeE7NgMnKUvvC9RijU=/shelf-reborn.png" width="1608" height="944" style="max-width: 100% !important;height: auto !important;"/><figcaption>Shelf reborn, falling back to related mail search and Next Best actions</figcaption></figure><p/>
<p>The code is <a href="https://github.com/rcarmo/shelf?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">up on GitHub</a>, as usual, and I kept the original philosophy of capturing context from the foreground app (via a hideous pastiche of Apple Events and Accessibility, but it &#8220;works&#8221;), matching it to additional content from the same app (I&#8217;m focusing on Mail) and providing &#8220;Next Best&#8221; actions&#8211;which are entirely deterministic, by the way. I also tacked on a smattering of local Apple Intelligence support thanks to <a href="https://github.com/praeclarum/SwiftIntelligence?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">SwiftIntelligence</a> (because I might want to use external models later).</p>
<p>And it works beautifully so far, even if I clearly need to remove the nerdy diagnostics and re-think the UX.</p>
<a class="anchor" id="anchor-so-what-did-i-learn-from-this" rel="anchor" href="/space/blog/2026/07/10/1330#so-what-did-i-learn-from-this" style="color: #0000cc;"><h2 id="so-what-did-i-learn-from-this">So what did I learn from this?</h2></a><p>Not common sense, I&#8217;m afraid.</p>
<p>First off, after creating three or four desktop apps using nothing but <a href="/space/dev/swift" rel="next" style="color: #0000cc;">Swift</a>, I now <em>get</em> both why some people love it and why some people absolutely hate it, especially compared with the ancient ObjC/AppKit combo. LLMs released since spring 2026 can <em>finally</em> generate Swift code that is actually <em>usable</em>, so I mostly let GPT-5.5/5.6 do the heavy lifting and focused on search ranking and the criteria for suggestions.</p>
<p>Also, oh goodness, how utterly useless Apple&#8217;s automation/AX APIs can be for this sort of thing. I have a <em>lot</em> of admittedly dated experience with Apple Events and Accessibility, but even I was surprised at how many things that should be trivial are either impossible or require a lot of workarounds to get right (like just finding the right window in a multi-window app, or getting the right item to glean context from).</p>
<p>And, finally, Apple&#8217;s Spotlight APIs in macOS 26 are <em>completely and utterly broken</em> because it is impossible for my app to find <em>the exact same thing</em> I can find with system Spotlight. Even with Full Disk Access, it seems that the only way I can programmatically search for an email message that <em>I can find nearly instantaneously with Cmd+Space</em> is to go and read the Mail SQLite storage myself, which is ridiculous:</p>
<ul>
<li>It&#8217;s not a question of ranking, predicates, anything</li>
<li>It&#8217;s not a question of query timeouts</li>
<li>It&#8217;s not a question of just about anything I can send to the API (and I&#8217;ve pretty much fuzzed it)</li>
</ul>
<p>There are no decent modern examples, either, so all I get are <em>some</em> messages from <em>some</em> accounts, not <em>any</em> message that matches the criteria I set from across <em>all</em> accounts.</p>
<p>This makes my little email filing helper only partially useful, so I&#8217;ll probably shelve it (pun intended) until macOS 27 comes along, and by then I will also see if I can get on-device models to actually file things for me properly.</p>
<p>And no, creating email rules doesn&#8217;t scale, and I also only want messages filed <em>after</em> I&#8217;ve marked them as read, which is another thing I was able to do just fine with Mail Act-On before Apple nerfed Mail.</p>
<p>I&#8217;ll probably write about this again come Christmas, with any luck.</p>
<br/>
]]></content>
<category term="shelf" label="shelf" />
<category term="macos" label="macos" />
<category term="ai" label="ai" />
<category term="mail" label="mail" />
<category term="apple" label="apple" />
<category term="automation" label="automation" />
</entry>
<entry>
<title>Rewriting Bun in Rust</title>
<id>https://taoofmac.com/space/links/2026/07/08/2310?utm_content=atom</id>
<published>2026-07-08T23:10:00+00:00</published>
<updated>2026-07-09T06:16:17+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/links/2026/07/08/2310?utm_content=atom"/>
<content type="html"><![CDATA[
<p><a href="https://bun.com/blog/bun-in-rust?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" title="external link to https://bun.com/blog/bun-in-rust" alt="screenshot of https://bun.com/blog/bun-in-rust" style="color: #0000cc;"><img class="quicklook" src="https://taoofmac.com/thumb/links/2026/07/08/2310/640,480/oKAdJIAaZzi_fFU8td4m7gG3ZkQ=/large.jpg" width="320" height="240" style="max-width: 100% !important;height: auto !important;"/></a></p>
<p class="lead">I wasn&#8217;t expecting quite so dramatic a shift, but it makes perfect sense for Anthropic to use its <a href="/space/links/2025/12/03/0801" rel="next" style="color: #0000cc;">acquisition</a> as a high-profile engineering success story&#8211;which doesn&#8217;t detract from the achievement (and I&#8217;m doing similar things on much smaller projects myself, so I know it works), but should be noted.</p>
<p>It also doesn&#8217;t surprise me in the least that Jarred caught Claude blatantly lying about implementation details&#8211;stubbing out functions to fake compilation, then papering over them with verbose comments. I&#8217;ve never had that issue with Codex, but I&#8217;ve had it several times with Anthropic models, and that is why, ironically, I don&#8217;t trust them for coding.</p>
<p>Also, I can&#8217;t even begin to estimate how much that all cost in tokens at their current rates&#8230; (actually, it seems to have cost $165,000).</p>
<br/>
]]></content>
<category term="rust" label="rust" />
<category term="open source" label="open source" />
<category term="ai" label="ai" />
<category term="bun" label="bun" />
<category term="javascript" label="javascript" />
<category term="anthropic" label="anthropic" />
</entry>
<entry>
<title>AI as a weapon of mass cognitive destruction</title>
<id>https://taoofmac.com/space/blog/2026/07/08/2130?utm_content=atom</id>
<published>2026-07-08T21:30:00+00:00</published>
<updated>2026-07-08T21:59:17+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/blog/2026/07/08/2130?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">I use AI every day; it&#8217;s unavoidable <a href="https://rcarmo.github.io/projects/piclaw/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">when you create agentic tooling</a>. But something has been grating on me for months, and it isn&#8217;t about development: non-technical people are using it to generate far too much slop. Not code slop, but <em>business</em> slop.</p>
<p>Five paragraph meeting agendas. Four-page responses to a planning inquiry, because that way I get &#8220;all the facts&#8221;. A one-line question turns up dressed as a formal memo with a summary, three bullets of tangentially related sub-questions and a partridge in a pear tree. Documents that used to run a page now run six, padded out with restated context that nobody wrote by hand and nobody reads. Words are now effortless, so people produce more of them&#8211;whether or not they still mean anything.</p>
<a class="anchor" id="anchor-the-illusion-of-saved-time" rel="anchor" href="/space/blog/2026/07/08/2130#the-illusion-of-saved-time" style="color: #0000cc;"><h2 id="the-illusion-of-saved-time">The illusion of saved time</h2></a><p>The immediacy is a bigger dopamine hit than you&#8217;d expect. Type a prompt, get six paragraphs and two tables in seconds, and it <em>feels</em> efficient. The sender reckons they&#8217;ve saved twenty minutes, and from where they sit, they have: what took twenty minutes now takes two.</p>
<p>Except the time didn&#8217;t vanish, it <em>shifted</em> and multiplied. Every recipient now has to wade through the padding, work out which sentence actually matters, and mentally rebuild the one-liner that should have been sent in the first place. Sender spends two minutes; ten people downstream lose fifteen each&#8211;if they read the whole thing at all.</p>
<a class="anchor" id="anchor-not-even-speed-reading-helps" rel="anchor" href="/space/blog/2026/07/08/2130#not-even-speed-reading-helps" style="color: #0000cc;"><h2 id="not-even-speed-reading-helps">Not even speed-reading helps</h2></a><p>People in tech love AI because, well, let&#8217;s face it, few of them can write; the average coder isn&#8217;t very communicative. And if you do spend a lot of time communicating, the illusion above soon has you in thrall.</p>
<p>AI in the hands of people who can&#8217;t use it effectively simply dumps cognitive load on everyone else. I&#8217;m something of a speed reader (part of my slightly off neurological makeup), and it&#8217;s driving me nuts that a context switch which used to be instant now means ploughing through pages of vaguely dressed-up pseudo-facts.</p>
<p>Hilariously, one of the last times I replied to a verbose e-mail &#8211; in my usual terse one-liners and bullets &#8211; I pointed out that the data fed to the AI that helped create that e-mail was slightly off. The response was baffling: people actually mistook my British-leaning vocabulary&#8230; for an AI-generated response. Because, yes, I use em dashes.</p>
<a class="anchor" id="anchor-output-is-not-productivity" rel="anchor" href="/space/blog/2026/07/08/2130#output-is-not-productivity" style="color: #0000cc;"><h2 id="output-is-not-productivity">Output is not productivity</h2></a><p>The worst part is that management usually can&#8217;t tell the difference, and increasingly doesn&#8217;t try. More emails, longer documents, quicker turnaround&#8211;it all <em>looks</em> like productivity, and output is easy to count in a way quality never is. So the person firing off ten inflated reports looks busier than the one sending a single tight paragraph that actually settles the question.</p>
<p>This runs top to bottom of the org chart, and it comes down to a basic confusion about what AI is for. The point is to save effort&#8211;same result for less, or a better result for the same. Instead people use it to inflate the same result into something that looks bigger. Leadership watches the volume tick up and reads it as a gain. All that&#8217;s really happened is the work got louder.</p>
<p>And given the constant pressure to &#8220;sell&#8221;, to be noticed, to &#8220;achieve more&#8221;, we&#8217;re actually rewarding volume and calling it work because the worst KPIs are the easiest to measure: count of emails, length of documents, speed of reply. Just like measuring the number of PRs landed, or <a href="https://www.folklore.org/Negative_2000_Lines_Of_Code.html?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">lines of code</a>.</p>
<p>Nobody is measuring the cognitive load being dumped on the other end, or whether the message actually landed, or how many recipient-hours were wasted. So on paper the overload doesn&#8217;t exist&#8211;it just compounds, off the books, while some management dashboard stays in the green&#8211;&#8220;line go up&#8221;, right?</p>
<a class="anchor" id="anchor-measure-at-least-once-goddammit-and-cut-more-than-twice" rel="anchor" href="/space/blog/2026/07/08/2130#measure-at-least-once-goddammit-and-cut-more-than-twice" style="color: #0000cc;"><h2 id="measure-at-least-once-goddammit-and-cut-more-than-twice">Measure (at least once, goddammit) and cut more than twice</h2></a><p>Blaise Pascal once quipped &#8220;I would have written a shorter letter, but I did not have the time.&#8221; Being both factual and concise is the expensive option, not the lazy one. Halving a document means understanding it well enough to know what can be trimmed away. Getting a paragraph down to the pair of sentences that are really key takes judgement, a couple of revisions and, yes, time. And (this is what really annoys me) we still haven&#8217;t nailed the art of the concise slide presentation&#8211;instead, we&#8217;ve now weaponized it to&#8230; a nuclear degree.</p>
<p>And since I&#8217;ve mentioned slide decks: taste is one of AI&#8217;s main casualties, visual and textual alike. I abhor the sleek corporate jargon now available as e-mail ammunition to everyone&#8211;but that deserves its own post. And, like Pascal, I&#8217;m starting to feel I didn&#8217;t spend enough time trimming this one down&#8230;</p>
<br/>
]]></content>
<category term="productivity" label="productivity" />
<category term="work" label="work" />
<category term="writing" label="writing" />
<category term="ai" label="ai" />
</entry>
<entry>
<title>id Software Hit Hard by Layoffs</title>
<id>https://taoofmac.com/space/links/2026/07/07/2052?utm_content=atom</id>
<published>2026-07-07T20:52:00+00:00</published>
<updated>2026-07-07T23:32:23+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/links/2026/07/07/2052?utm_content=atom"/>
<content type="html"><![CDATA[
<p><a href="https://arstechnica.com/gaming/2026/07/bethesda-id-software-reportedly-hit-hard-by-microsoft-layoffs/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" title="external link to https://arstechnica.com/gaming/2026/07/bethesda-id-software-reportedly-hit-hard-by-microsoft-layoffs/" alt="screenshot of https://arstechnica.com/gaming/2026/07/bethesda-id-software-reportedly-hit-hard-by-microsoft-layoffs/" style="color: #0000cc;"><img class="quicklook" src="https://taoofmac.com/thumb/links/2026/07/07/2052/640,480/tzc1LKZPbF40suzj8YMNAeA8pRo=/large.jpg" width="320" height="240" style="max-width: 100% !important;height: auto !important;"/></a></p>
<p class="lead"><a href="/space/site/disclaimer" rel="next" style="color: #0000cc;">I can&#8217;t really say anything about this</a>, but I wanted to record it anyway, because id Software had a profound impact on my early career. Some of the most fun I ever had at work was running <a href="/space/games/quake" rel="next" style="color: #0000cc;">Quake</a> servers at Portuguese ISPs&#8211;which is, <a href="/space/blog/2019/11/13/1400" rel="next" style="color: #0000cc;">quite literally, how I ended up in marketing instead of engineering</a>. I still keep a <a href="/space/games/quake_iii_arena" rel="next" style="color: #0000cc;">Quake III Arena page</a> around, clan banners and all, for old times&#8217; sake, and somehow this <em>feels</em> harder than the mainstream layoff news.</p>
<br/>
]]></content>
<category term="layoffs" label="layoffs" />
<category term="personal" label="personal" />
<category term="microsoft" label="microsoft" />
<category term="quake" label="quake" />
<category term="memoirs" label="memoirs" />
<category term="gaming" label="gaming" />
</entry>
<entry>
<title>Microsoft Lays Off 4,800</title>
<id>https://taoofmac.com/space/links/2026/07/06/1430?utm_content=atom</id>
<published>2026-07-06T14:30:00+00:00</published>
<updated>2026-07-07T06:33:26+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/links/2026/07/06/1430?utm_content=atom"/>
<content type="html"><![CDATA[
<p><a href="https://www.theverge.com/news/961528/microsoft-layoffs-july-2026-sales-xbox?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" title="external link to https://www.theverge.com/news/961528/microsoft-layoffs-july-2026-sales-xbox" alt="screenshot of https://www.theverge.com/news/961528/microsoft-layoffs-july-2026-sales-xbox" style="color: #0000cc;"><img class="quicklook" src="https://taoofmac.com/thumb/links/2026/07/06/1430/640,480/k5lAJzfEcGlOMk-3DC--fsCPIl4=/large.jpg" width="320" height="240" style="max-width: 100% !important;height: auto !important;"/></a></p>
<p class="lead">Well, I still have a job&#8211;<a href="/space/site/disclaimer" rel="next" style="color: #0000cc;">though I won&#8217;t say any more than that</a>. But going through smaller versions of <a href="/space/blog/2024/06/08/1200" rel="next" style="color: #0000cc;">The After</a> is not something I want to be doing every year.</p>
<br/>
]]></content>
<category term="personal" label="personal" />
<category term="work" label="work" />
<category term="layoffs" label="layoffs" />
<category term="microsoft" label="microsoft" />
</entry>
<entry>
<title>Notes for June 28 - July 4</title>
<id>https://taoofmac.com/space/notes/2026/07/04/1230?utm_content=atom</id>
<published>2026-07-04T12:30:00+00:00</published>
<updated>2026-07-04T15:41:34+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/notes/2026/07/04/1230?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">The <a href="/space/notes/2026/07/02/2200" rel="next" style="color: #0000cc;">weather certainly doesn&#8217;t help</a>, but I&#8217;ve still managed to squeeze in a few interesting hacks this week in between work, <a href="/space/blog/2024/06/08/1200" rel="next" style="color: #0000cc;">flashbacks</a> about the <a href="/space/links/2026/07/02/1459" rel="next" style="color: #0000cc;">recent reorg</a> (too soon to call it, but like everyone else, I&#8217;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&#8217;s a bit uneven in quality).</p>
<a class="anchor" id="anchor-pi-on-your-ipad-sort-of" rel="anchor" href="/space/notes/2026/07/04/1230#pi-on-your-ipad-sort-of" style="color: #0000cc;"><h2 id="pi-on-your-ipad-sort-of">Pi On Your iPad&#8230; Sort Of</h2></a><p>Although I can run most AI agents inside <a href="https://github.com/rcarmo/ios-linuxkit?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>ios-linuxkit</code></a>, I keep getting bitten by the fact that Apple won&#8217;t let me run my own apps <em>permanently</em> on my iPad, so every now and then the build expires when I am either a) away from home or b) with every single Mac in the house off or otherwise inaccessible (or both), which is a <em>giant</em> pain.</p>
<p>And I do want to be able to run some form of terminal-based agent on the iPad, if only for helping me proofread and auto-link drafts (which I could theoretically do with an <a href="/space/apps/obsidian" rel="next" style="color: #0000cc;">Obsidian</a> plugin, but none of those are reliable in the long term). So when I got wind of <a href="https://github.com/huggingface/tau?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>tau</code></a> and realized it was pure <a href="/space/dev/python" rel="next" style="color: #0000cc;">Python</a>, I immediately tried to install it inside <a href="/space/apps/a-shell" rel="next" style="color: #0000cc;">a-Shell</a>, which has a very complete Python runtime and has been my go-to for all sorts of CLI tooling for years&#8211;and after some creative hacking, it mostly works:</p>
<p/><figure><img alt="tau running in a-Shell after some tweaks" src="https://taoofmac.com/media/notes/2026/07/04/1230/OOkL3OFrUn5NV7vipWA67Wv5e9g=/tau.jpg" width="1280" height="894" style="max-width: 100% !important;height: auto !important;"/><figcaption>tau running in a-Shell after some tweaks</figcaption></figure><p/>
<p><a href="https://github.com/rcarmo/tau-a-shell?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">My fork</a> adds a bunch of things like GitHub provider support, hiding the sidebar and a few workarounds for common iPad foibles (like the lack of an <code>Esc</code> key, and <a href="/space/apps/a-shell" rel="next" style="color: #0000cc;">a-Shell</a>&#8217;s weird lack of support for <code>Command + .</code>), and like <a href="/space/ai/agentic/pi" rel="next" style="color: #0000cc;"><code>pi</code></a>, is self-modifying to a degree where I can expect it to keep adapting to the way I work.</p>
<a class="anchor" id="anchor-home-automation" rel="anchor" href="/space/notes/2026/07/04/1230#home-automation" style="color: #0000cc;"><h2 id="home-automation">Home Automation</h2></a><p>Since I have a love-hate relationship with air conditioning, I set up an additional <a href="https://www.zigbee2mqtt.io/devices/ZG-204ZM.html?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link#tuya-zg-204zm" rel="external" style="color: #0000cc;">Tuya ZG-204ZM</a> to keep track of presence in the office and only turn it on when absolutely needed, which led me down the usual rabbit hole of <a href="/space/blog/2026/05/18/1320" rel="next" style="color: #0000cc;">Homekit not having any sort of useful logic</a> to do something as simple as &#8220;only turn this thing on <strong>if</strong> I am in the office <strong>and</strong> it is over 27<sup>o</sup>C&#8221;, which takes all of three minutes to wire up in Node-RED &#8211; but is now undiscoverable by anyone else in the house since it won&#8217;t be visible in the Home app.</p>
<blockquote>
<p>And yes, I know there are alternatives to the Home app. That is not the point.</p>
</blockquote>
<p><em>Truly useful</em> automation like &#8220;only turn this thing on <strong>if</strong> I am in the office <strong>and</strong> it is over 27<sup>o</sup>C <strong>and</strong> my kids didn&#8217;t leave the window open&#8221; (which takes two more minutes) is, alas, something that Apple will likely never really understand.</p>
<p>That said, this class of microwave-based presence sensors is very good. I&#8217;ve been using one for a year to turn on ambient lighting when I sit at my office desk (and dim everything when I walk away), and it&#8217;s been stupidly reliable. However, it seems that the really interesting, zone-aware ones that have been coming out require wired power, and if any smart home manufacturer truly believes people want to have wall warts to push 5V to these things through a highly visible wire, well, that&#8217;s just not happening (the model I&#8217;m using takes 2 AAA batteries, which apparently last forever).</p>
<a class="anchor" id="anchor-ai-media-slop-ish" rel="anchor" href="/space/notes/2026/07/04/1230#ai-media-slop-ish" style="color: #0000cc;"><h2 id="ai-media-slopish">AI Media Slop&#8230;ish</h2></a><p>I have been playing with <a href="https://ideogram.ai/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Ideogram 4</a> a bit <a href="/space/notes/2026/06/14/1800" rel="next" style="color: #0000cc;">again</a>, but this time on my puny RTX 3060 (which manages one decent-quality image every&#8230; 5 minutes or so), as well as with automated video generation via <a href="https://github.com/remotion-dev/remotion?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Remotion</a>, mostly to figure out how some of the current commercial SOTA slop generation pipelines (the output of which we&#8217;re constantly exposed to in social media) can be <em>scaled down</em> to more useful pursuits, like helping teachers create <em>grounded</em> educational assets. Since I have long had a local <a href="https://kiwix.org/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Kiwix</a> instance on my NAS (yes, I like the idea of having offline copies of iFixit and selected Stack Exchange forums), there&#8217;s no shortage of material, but I started out with a simpler thing&#8211;a <a href="https://github.com/rcarmo/piclaw?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>piclaw</code></a> intro:</p>
<figure>
  <video controls="" muted="" autoplay="" playsinline="" style="width: 100%" poster="/media/notes/2026/07/04/1230/5mJBYRjk3PxWBiCbbv70_Ay2gTc=/piclaw-intro.jpg">
    <source src="/media/notes/2026/07/04/1230/OwF4GxR0dfM-APfsMmKbtZt-WlQ=/piclaw-intro.mp4" type="video/mp4">
    <img src="https://taoofmac.com/media/notes/2026/07/04/1230/5mJBYRjk3PxWBiCbbv70_Ay2gTc=/piclaw-intro.jpg" style="max-width: 100%;height: auto;width: 100%" alt="Your browser cannot play this video" width="1920" height="1080"/>
  </source></video>
  <figcaption>
    A short intro clip that <code>piclaw</code> created for itself using Remotion.
  </figcaption>
</figure>

<p>So far, I see two major challenges:</p>
<ul>
<li>Fact-based storylines/scripts are (as I expected) quite challenging to put together (LLMs have no taste, hence no decent criteria for emphasizing the right aspects of the source material). This seems like a relatively easy thing to handle using a multi-step curation process and better skill authoring, but requires time.</li>
<li>Consistency in visual depictions. Themes and templates go a long way, but anything that involves a visual prompt is just too prone to error&#8211;which is why I&#8217;ve been looking into <a href="https://ideogram.ai/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Ideogram 4</a> as a possible way to improve things.</li>
</ul>
<p>And yes, there&#8217;s a lot of pseudo-infographic stuff out there, but it&#8217;s all pretty much crap&#8211;any pointers on actually reliable techniques or open-weight models are welcome.</p>
<a class="anchor" id="anchor-rdp-shenanigans" rel="anchor" href="/space/notes/2026/07/04/1230#rdp-shenanigans" style="color: #0000cc;"><h2 id="rdp-shenanigans">RDP Shenanigans</h2></a><p>Faced with the prospect of <em>years</em> without significant hardware upgrades <em>and</em> the heat, I decided to revive <a href="/space/blog/2022/10/23/1700" rel="next" style="color: #0000cc;">my Linux thin client setup</a>, with a twist: I need to run modern graphical apps on the server, and right now that means Wayland.</p>
<p><code>xrdp</code> still works great for most essentials, but we keep getting told that Wayland is the future for what&#8211;two decades now?&#8211;and it&#8217;s high time I explored RDP support in Wayland properly. After all, <a href="https://github.com/rcarmo/go-rdp?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">I know the wire protocol well</a>, and I have extra motivation:</p>
<ul>
<li>I&#8217;ve been meaning to fix a critical part of the Steam experience (pairing a new/updated device remotely to a headless machine) for ages, and getting view-only output out of Gamescope would be nice, because Valve clearly never gave much thought to the notion of headless Steam boxes.</li>
<li>GNOME Remote Desktop is&#8230; bad. I&#8217;m sorry, but it just is, not just because I want proper multi-user headless support but also because of various protocol support gaps.</li>
<li>I would very much like to, sometime in the future, have something that works <em>at least as well</em> as <code>xorgxrdp</code> and <code>sesman</code> to have minimally accelerated desktops (rendered using the GPU on the server side) streamed via RDP (preferably H.264) to an arbitrary client.</li>
</ul>
<p>The current state of the art in the X11 world lets me do the latter (with minimally usable audio) pretty well, but there&#8217;s nothing equivalent in the Wayland ecosystem&#8230; Until I found out about <a href="https://github.com/lamco-admin/lamco-rdp-server?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>lamco-rdp-server</code></a> and started hacking at my own fork to implement the bits I wanted.</p>
<p>And oh boy, is Wayland broken by design if you try to do something like this&#8230; Right now the current setup is, roughly, an in-memory, headless Weston instance that, via some duct tape and wishful thinking, <em>is screen captured</em> through the &#8220;portal&#8221; abstraction by <code>lamco-rdp-server</code>, which feels like a tremendous waste of resources instead of, you know, just having a process hold both the compositor and the protocol renderer per logged-in user.</p>
<p>But I got most of the interesting bits to work already:</p>
<figure>
  <video controls="" autoplay="" loop="" muted="" playsinline="" style="width: 100%" poster="/media/notes/2026/07/04/1230/_ybOYgPM_jQX-3DKAspFN45cwG4=/wayland-rdp.jpg">
    <source src="/media/notes/2026/07/04/1230/J1SiZ2h1W36aHd46-doSDsd6Ark=/wayland-rdp.mp4" type="video/mp4">
    <img src="https://taoofmac.com/media/notes/2026/07/04/1230/_ybOYgPM_jQX-3DKAspFN45cwG4=/wayland-rdp.jpg" style="max-width: 100%;height: auto;width: 100%" alt="Your browser cannot play this video" width="1552" height="720"/>
  </source></video>
  <figcaption>
    A headless Weston session streamed over RDP via my <code>lamco-rdp-server</code> fork.
  </figcaption>
</figure>

<p>Screen resizing, in particular, is a pain, but then again input has been much worse&#8230; I wasn&#8217;t particularly fond of the idea of reinventing this wheel to the point where it&#8217;ll be a full-fledged thin client solution, but a few hours with Codex led me to a usable <code>xrdp</code>-like solution with an equivalent <code>sesman</code>-like session manager, PAM support and a few other niceties, and I&#8217;m certainly up for experimenting (and learning) with it over Summer.</p>
<br/>
]]></content>
<category term="weekly" label="weekly" />
<category term="ai" label="ai" />
<category term="homekit" label="homekit" />
<category term="linux" label="linux" />
<category term="home-automation" label="home-automation" />
<category term="wayland" label="wayland" />
<category term="notes" label="notes" />
<category term="rdp" label="rdp" />
</entry>
<entry>
<title>We Call It &quot;Weather&quot; Here</title>
<id>https://taoofmac.com/space/notes/2026/07/02/2200?utm_content=atom</id>
<published>2026-07-02T22:00:00+00:00</published>
<updated>2026-07-03T10:56:29+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/notes/2026/07/02/2200?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">Even as my colleagues around Europe complain of a heat wave, things have been pretty much normal here&#8211;35<sup>o</sup>C 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 <a href="/space/links/2014/09/09/0706" rel="next" style="color: #0000cc;">Surface Pro 3</a> that I use at my standing desk).</p>
<a class="anchor" id="anchor-borg-thermals" rel="anchor" href="/space/notes/2026/07/02/2200#borg-thermals" style="color: #0000cc;"><h2 id="borg-thermals">Borg Thermals</h2></a><p>Which doesn&#8217;t mean things don&#8217;t get <em>too</em> hot. I woke up the other day to find that <a href="/space/blog/2023/02/18/1845" rel="next" style="color: #0000cc;"><code>borg</code></a> had halted at around 5AM, and I immediately suspected thermals, so, <a href="/space/notes/2023/04/30/2130" rel="next" style="color: #0000cc;">again</a>, I popped it open, swapped out the CPU fan (some things are so predictable I keep spares) and, while I did that, asked one of my agents to check telemetry&#8211;which, despite my best efforts, I&#8217;ve been neglecting to turn into alarms:</p>
<p/><figure><img alt="That last spike is clearly where the fan started failing" src="https://taoofmac.com/media/notes/2026/07/02/2200/RxZjnkDGzs-oSBRHkRUJykPAy6Y=/chart.svg" style="max-width: 100% !important;height: auto !important;"/><figcaption>That last spike is clearly where the fan started failing</figcaption></figure><p/>
<p>It&#8217;s pretty obvious, even looking at the monthly data (which I pulled out to get an idea of the overall trend), that one of the fans started failing over the weekend&#8211;and it was the <a href="https://www.amazon.es/gp/product/B009NQM7V2/ref=as_li_tl?_encoding=UTF8&amp;tag=taoofmac-21&amp;linkCode=ur2&amp;camp=3638&amp;creative=24630&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Noctua NF-A9x14</a> that I&#8217;ve been using for the CPU cooler.</p>
<a class="anchor" id="anchor-only-fans" rel="anchor" href="/space/notes/2026/07/02/2200#only-fans" style="color: #0000cc;"><h2 id="only-fans">Only Fans</h2></a><p>Since those slim profile fans seem to die on me around every 18 months or so, this time I got an <a href="https://www.amazon.es/gp/product/B0D4YZFKP5/ref=as_li_tl?_encoding=UTF8&amp;tag=taoofmac-21&amp;linkCode=ur2&amp;camp=3638&amp;creative=24630&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Artic P9 Max</a>, on the spurious grounds that:</p>
<ul>
<li>It has a <em>much</em> higher CFM</li>
<li>I can still fit a 25mm fan into the <a href="https://www.asrock.com/Nettop/Intel/DeskMeet%20B660%20Series/index.asp?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">B660</a> (there&#8217;s enough clearance below the PSU)</li>
</ul>
<p>It is, of course, <em>much</em> noisier, but we are in the middle of a heat wave and I expect it to throttle down eventually. Either way, I did get <a href="https://www.amazon.es/gp/product/B07ZP6KKKZ/ref=as_li_tl?_encoding=UTF8&amp;tag=taoofmac-21&amp;linkCode=ur2&amp;camp=3638&amp;creative=24630&amp;utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">another Noctua</a> to keep around as a spare, because fans are probably the only PC part that is cheap enough to keep a spare of these days&#8230;</p>
<p>While I waited for the new fan to arrive, I decided to whip up a <a href="https://gist.github.com/rcarmo/e82804e068751586b947ae7ad075c00a?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">stupidly visible temperature monitor</a> to keep an eye on it, and the results were&#8230; dramatic:</p>
<figure class="full-width">
<img src="https://taoofmac.com/media/notes/2026/07/02/2200/VJ5KggUtsZAfyKArKMtI1QeoLIU=/beforeandafter.jpg" title="Before and after swapping the CPU fan." alt="Before and after swapping the CPU fan." width="2048" height="550" style="max-width: 100% !important;height: auto !important;"/>
<figcaption>
Before and after, <i>and</i> it was hotter after.
</figcaption>
</figure>

<p>I don&#8217;t expect this to be the last time I do this, but I hope it will at least be a while before I have to do it again. The <a href="https://www.asrock.com/Nettop/Intel/DeskMeet%20B660%20Series/index.asp?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">B660</a> is an amazing motherboard/case combo, but it is not designed for high-performance cooling&#8211;or Portuguese weather.</p>
<br/>
]]></content>
<category term="cooling" label="cooling" />
<category term="homelab" label="homelab" />
<category term="hardware" label="hardware" />
</entry>
<entry>
<title>Microsoft Frontier Company</title>
<id>https://taoofmac.com/space/links/2026/07/02/1459?utm_content=atom</id>
<published>2026-07-02T14:59:00+00:00</published>
<updated>2026-07-03T07:32:13+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/links/2026/07/02/1459?utm_content=atom"/>
<content type="html"><![CDATA[
<p><a href="https://blogs.microsoft.com/blog/2026/07/02/microsoft-frontier-company-ai-engineering-that-amplifies-and-protects-your-intelligence/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" title="external link to https://blogs.microsoft.com/blog/2026/07/02/microsoft-frontier-company-ai-engineering-that-amplifies-and-protects-your-intelligence/" alt="screenshot of https://blogs.microsoft.com/blog/2026/07/02/microsoft-frontier-company-ai-engineering-that-amplifies-and-protects-your-intelligence/" style="color: #0000cc;"><img class="quicklook" src="https://taoofmac.com/thumb/links/2026/07/02/1459/640,480/VkhH-XOTRghbRPmhStcRmZB2RTk=/large.jpg" width="320" height="240" style="max-width: 100% !important;height: auto !important;"/></a></p>
<p class="lead">And, again, as the fiscal year rolls around, so does another reorganization. I <a href="/space/site/disclaimer" rel="next" style="color: #0000cc;">have no clue what is going to happen</a>, but this is relevant to me as Industry Solutions Delivery (the previous-to-this designation of the ancient Microsoft Consulting Services organization I initially joined some seven years ago) is now going to slot under this somehow.</p>
<br/>
]]></content>
<category term="ai" label="ai" />
<category term="work" label="work" />
<category term="microsoft" label="microsoft" />
</entry>
<entry>
<title>Free The Icons</title>
<id>https://taoofmac.com/space/links/2026/06/30/0725?utm_content=atom</id>
<published>2026-06-30T07:25:00+00:00</published>
<updated>2026-06-30T11:06:09+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/links/2026/06/30/0725?utm_content=atom"/>
<content type="html"><![CDATA[
<p><a href="https://weblog.rogueamoeba.com/2026/06/26/free-the-icons/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" title="external link to https://weblog.rogueamoeba.com/2026/06/26/free-the-icons/" alt="screenshot of https://weblog.rogueamoeba.com/2026/06/26/free-the-icons/" style="color: #0000cc;"><img class="quicklook" src="https://taoofmac.com/thumb/links/2026/06/30/0725/640,480/pxFuZOhD0K3Nk-M39S4IQT8dcAI=/large.jpg" width="320" height="240" style="max-width: 100% !important;height: auto !important;"/></a></p>
<p class="lead">I, too, find the squircles aesthetically offensive and utterly pointless. Tahoe didn&#8217;t just dumb down Apple&#8217;s own icons, it dictated the shape of <em>everyone&#8217;s</em>, shrinking any icon that refused to conform into an ugly grey cell&#8211;icon jail for the crime of having a silhouette. Decades of distinctive Mac icons flattened into bland uniformity, and the usability argument is the one that really stings: shape was a way to tell things apart at a glance, and now it&#8217;s down to colour alone (good luck with that if, like me, you often can&#8217;t readily distinguish Slack from Photos).</p>
<p>What I yearn for is the era when an icon had room to <em>be</em> something <em>distinctive</em>, with enough real estate to carry a bit of personality. Golden Gate walking back the worst of <a href="/space/blog/2026/06/08/2040" rel="next" style="color: #0000cc;">Liquid Glass</a> is encouraging, so maybe the people inside Apple who clearly know this was a mistake will find it in themselves to fix the rest.</p>
<p>The part that genuinely breaks my brain, though, is that I now find <em>icons on Linux</em> more distinctive than on macOS, which would be impossible for my ten-year-ago self to believe. The platform that built its reputation on craft and visual identity has spent a year sanding it off, while the one everyone used to mock for its inconsistency is where individuality survives. Funny how that goes.</p>
<br/>
]]></content>
<category term="apple" label="apple" />
<category term="macos" label="macos" />
<category term="linux" label="linux" />
<category term="icons" label="icons" />
<category term="design" label="design" />
<category term="ui" label="ui" />
</entry>
<entry>
<title>Notes for June 21-28</title>
<id>https://taoofmac.com/space/notes/2026/06/28/1200?utm_content=atom</id>
<published>2026-06-28T12:00:00+00:00</published>
<updated>2026-06-28T19:58:20+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/notes/2026/06/28/1200?utm_content=atom"/>
<content type="html"><![CDATA[
<p class="lead">The weather is&#8230; infuriatingly tropical, but tolerable (we&#8217;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.</p>
<p>Other than it being the last fiscal month <a href="/space/site/disclaimer" rel="next" style="color: #0000cc;">at work</a>, that is&#8211;my thresholds for patience have become somewhat elastic over the years, but it&#8217;s still a busy part of the year.</p>
<p>That, and the <a href="/space/blog/2026/06/24/1300" rel="next" style="color: #0000cc;">ongoing industry madness</a> pushed me into another reassessment of how I have been spending my time, and I decided to go back to more hands-on work.</p>
<a class="anchor" id="anchor-the-photogrammetry-detour" rel="anchor" href="/space/notes/2026/06/28/1200#the-photogrammetry-detour" style="color: #0000cc;"><h2 id="the-photogrammetry-detour">The Photogrammetry Detour</h2></a><p>Since I have a bunch of CAD work to do, I tried my hand at photogrammetry over the week to see if I could speed up creating SBC cases:</p>
<p/><figure><img alt="Photogrammetry capture of the Radxa Q8B" src="https://taoofmac.com/media/notes/2026/06/28/1200/ua8DFG68XMjxQceCAg_C0b7DcVc=/photogrammetry.jpg" width="2048" height="715" style="max-width: 100% !important;height: auto !important;"/><figcaption>Photogrammetry capture of the Radxa Q8B</figcaption></figure><p/>
<p>The main conclusion so far is that although the photogrammetry process itself worked (and I could probably write a fairly detailed post about the C++ libraries I used and how I automated the process), even with 4K inputs and a few passes at refining the mesh it&#8217;s just not accurate enough to do what I need, partially because the BRIO 4K&#8217;s autofocus is a bit of a wash:</p>
<p/><figure><img alt="A sharpness map from the photogrammetry scans, still not sharp enough" src="https://taoofmac.com/media/notes/2026/06/28/1200/BveoS1UMTiXlrNo85wi0eAoHKYM=/photogrammetry-sharpness-map.jpg" width="1024" height="576" style="max-width: 100% !important;height: auto !important;"/><figcaption>A sharpness map from the photogrammetry scans, still not sharp enough</figcaption></figure><p/>
<p>Now, that <em>is</em> tweakable, but the process is still a bit too manual and error-prone to be worth it for me.</p>
<p>In comparison, <a href="/space/til/2026/02/16/1334" rel="next" style="color: #0000cc;">flipping the script on my previous attempts at using AI</a> and just feeding photos to <a href="https://github.com/rcarmo/piclaw?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>piclaw</code></a> has been working stupendously well, and even if the dimensions are off, I can fix them easily in CAD once I have a STEP file:</p>
<p/><figure><img alt="CAD model reconstructed by just feeding photos to piclaw" src="https://taoofmac.com/media/notes/2026/06/28/1200/lZ7AA1WFpWaOtgp3MLNmRhgkDdc=/piclaw-cad-reconstruction.png" width="1280" height="869" style="max-width: 100% !important;height: auto !important;"/><figcaption>CAD model reconstructed by just feeding photos to piclaw</figcaption></figure><p/>
<p>As much as I would love to get my hands on a 3D scanner, I suspect this will be my go-to approach from here on out&#8211;although I&#8217;m currently investigating if I can re-use the image-processing pipeline to guide the model:</p>
<p/><figure><img alt="Using the image-processing pipeline to guide the model" src="https://taoofmac.com/media/notes/2026/06/28/1200/qA4RYEDUFIlQgskTabTQC6rKmJU=/cad-guided-image-processing.jpg" width="1280" height="363" style="max-width: 100% !important;height: auto !important;"/><figcaption>Using the image-processing pipeline to guide the model</figcaption></figure><p/>
<a class="anchor" id="anchor-tiny-local-models" rel="anchor" href="/space/notes/2026/06/28/1200#tiny-local-models" style="color: #0000cc;"><h2 id="tiny-local-models">Tiny Local Models</h2></a><p>Before shifting back to more pragmatic pursuits, I still &#8220;finished&#8221; a few <a href="/space/ai" rel="next" style="color: #0000cc;">AI</a>-related things, mostly related to Gemma 4.</p>
<p>In short, after some messing around with QAT and MTP weights, I have finally gotten a reasonably smart and speedy version of <code>Gemma4-E4B</code> to run on my RTX3060 at nearly 90 tok/s, but&#8230;</p>
<p>It still isn&#8217;t as smart (or fast) as I would like for running my agents, and the context window is much smaller than what I ordinarily consider usable. Even for automating &#8220;if this (and maybe that) then (this other arbitrary set of things)&#8221; workflows&#8230; It just barely qualifies.</p>
<p>I might poke at it a bit more, but the core issues I had <a href="/space/reviews/2026/06/11/1830" rel="next" style="color: #0000cc;">during my K3 review</a> still stand: both context and capabilities of this kind of model are still <em>far</em> below what I need for regular use (<a href="https://github.com/rcarmo/piclaw?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>piclaw</code></a> <em>can</em> use it, but the results are always frustrating), and SOTA models are still much, much more effective than anything else.</p>
<p><a href="/space/links/2026/06/26/0556" rel="next" style="color: #0000cc;">Recent price hikes</a> have put me off the notion of ever getting good enough hardware to run anything useful locally unless I win the lottery <a href="/space/site/donate" rel="next" style="color: #0000cc;">or something</a>, so this might be a dead end for the rest of the year.</p>
<a class="anchor" id="anchor-rss-with-less-baggage" rel="anchor" href="/space/notes/2026/06/28/1200#rss-with-less-baggage" style="color: #0000cc;"><h2 id="rss-with-less-baggage">RSS, With Less Baggage</h2></a><p>I also went after my daily news intake&#8211;the news is bad enough as it is, but I can at least try to make it less stressful to consume.</p>
<p>Back when I was <a href="/space/notes/2025/11/22/2200" rel="next" style="color: #0000cc;">moving away</a> from <a href="https://feedly.com/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Feedly</a> to <a href="https://freshrss.org/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">FreshRSS</a> I briefly considered <a href="https://miniflux.app/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Miniflux</a> but discarded it because I thought it lacked features I ended up never using, so this week I decided to <a href="https://github.com/rcarmo/picoflux?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">fork it</a>, replace its <a href="/space/db/postgresql" rel="next" style="color: #0000cc;">PostgreSQL</a> database with <a href="/space/db/sqlite" rel="next" style="color: #0000cc;">SQLite</a> and create something even more minimalist I dubbed <a href="https://github.com/rcarmo/picoflux?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">picoflux</a> &#8211; which seems to work just fine with <a href="/space/apps/reeder" rel="next" style="color: #0000cc;">Reeder</a> and takes up a whopping&#8230; 70MB of RAM when running as a dedicated service.</p>
<p>That&#8217;s <em>far</em> less than the <a href="/space/dev/php" rel="next" style="color: #0000cc;">PHP</a> and database baggage that <a href="https://freshrss.org/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">FreshRSS</a> brought, and it let me downsize the (already) tiny Azure VM I run &#8220;insecure&#8221; services in to <em>half</em> the capacity, so that&#8217;s a win right there.</p>
<p>Migration was, as usual, another opportunity to prune/fix stale feeds, but completely uneventful other than <a href="/space/apps/netnewswire" rel="next" style="color: #0000cc;">NetNewsWire</a> not having support for <a href="https://miniflux.app/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Miniflux</a>&#8211;which is not a problem since I am still using <a href="/space/apps/reeder" rel="next" style="color: #0000cc;">Reeder</a>, but said support <a href="https://github.com/Ranchero-Software/NetNewsWire/pull/5335?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">seems to be coming</a>, and if my UX gripes (which revolve around scrolling and overly garish iconography) get fixed, I might well switch to it.</p>
<a class="anchor" id="anchor-going-back-to-raw-feeds" rel="anchor" href="/space/notes/2026/06/28/1200#going-back-to-raw-feeds" style="color: #0000cc;"><h2 id="going-back-to-raw-feeds">Going Back To Raw Feeds</h2></a><p>After <a href="/space/notes/2023/05/14/1820" rel="next" style="color: #0000cc;">three years of experimentation</a> and around nine months of daily use, I am bringing my <a href="/space/blog/2026/01/17/2130" rel="next" style="color: #0000cc;">feed summarization experiment</a> to a close, for the following reasons:</p>
<ul>
<li>My reading habits and schedule changed to a point where I was not really reading all of the bulletins (especially the noon and evening ones) and they just piled up.</li>
<li>The bulletin structure itself, despite being great for a few of the feeds I wanted to keep a cursory eye on, was just not good enough to surface important news.</li>
<li>Following the links inside bulletins was a bit fiddly (they were too small a target to pick out from a page of text, and turning the entire summary into a hyperlink to &#8220;fix&#8221; that just didn&#8217;t work inside any RSS reader).</li>
<li>I realized that my brain is just <em>better</em> at scanning hundreds of headlines and ranking them as they scroll past on the iPad.</li>
<li>It is another service to run and maintain, and I wanted to focus on other things.</li>
</ul>
<p>To be fair, it has had exactly <em>zero</em> code changes other than a couple of cosmetic fixes and the LLM API costs were under $5/month, but asking myself &#8220;why&#8221; didn&#8217;t surface a lot of value.</p>
<p>That is not to say that the summaries were not valuable, but it&#8217;s just easier to prune noisy, spammy feeds. I have also considered using the summaries to feed a &#8220;smarter&#8221; agent that would notify me of &#8220;interesting&#8221; news, but my interests are so wide (and shift priorities so often) that it would be tough to get consistent output out of that, too.</p>
<p>I suspect I will circle back to this with a fresh point of view (and I have been thinking about how to refactor it into a pure functions/workers construct), but for now it&#8217;s just easier to wind it down for the holidays.</p>
<h2 id="sashimi-soak-testing"><code>sashimi</code> Soak Testing</h2>
<p>I picked up <code>sashimi</code> (the <a href="/space/dev/golang" rel="next" style="color: #0000cc;">Go</a> port of this site&#8217;s static generator) again this week, and after running the numbers on visual rendering parity (which <a href="https://github.com/rcarmo/piclaw?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;"><code>piclaw</code></a> and Codex helped me with by generating some <a href="/space/notes/2026/04/12/1700" rel="next" style="color: #0000cc;">nice visual diffs</a>), it is now at a point where it can render the <em>entire</em> site with pretty much 100% fidelity to the current renderer&#8211;except for a few corner cases, and with some bits already looking better.</p>
<p>It is blazingly fast, and incremental rendering is <em>ridiculously</em> fast, but more to the point it&#8217;s finally good enough to run alongside the main engine, generating a complete staging site entirely inside GitHub Actions (with a somewhat complex but quite fun set of cascading, low-impact actions) that do the required incremental/partial rendering in <em>seconds</em> instead of several minutes.</p>
<p>It&#8217;s probably interesting enough to deserve a dedicated write-up, and that will happen after a couple weeks&#8217; soak time. I&#8217;ve already done a bunch of &#8220;live&#8221; testing, but I&#8217;m sure regular posting will surface more things to fix.</p>
<br/>
]]></content>
<category term="rss" label="rss" />
<category term="notes" label="notes" />
<category term="feeds" label="feeds" />
<category term="weekly" label="weekly" />
<category term="cad" label="cad" />
<category term="hardware" label="hardware" />
<category term="3d-printing" label="3d-printing" />
<category term="ai" label="ai" />
</entry>
<entry>
<title>RDP</title>
<id>https://taoofmac.com/space/protocols/rdp?utm_content=atom</id>
<published>2003-03-02T15:24:13+00:00</published>
<updated>2026-06-28T07:02:48+00:00</updated>
<author>
<name>Rui Carmo</name>
<uri>https://taoofmac.com</uri>
</author>
<link rel="alternate" xml:base="https://taoofmac.com" type="text/html" href="https://taoofmac.com/space/protocols/rdp?utm_content=atom"/>
<content type="html"><![CDATA[
<p><img src="https://taoofmac.com/media/protocols/rdp/ucop_gjfG-lg2bDi5kFC01ZObUM=/rdc.jpg" style="max-width: 100%;height: auto;float: right;padding-left: 1em" width="125" height="121"/></p>
<p class="lead">The <a href="http://en.wikipedia.org/wiki/Remote_Desktop_Protocol?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Remote Desktop Protocol</a>, which has a long and colorful history. I much prefer it over <a href="/space/protocols/vnc" rel="next" style="color: #0000cc;">VNC</a> due to its vastly superior performance and extra features.</p>
<a class="anchor" id="anchor-h-264/avc-acceleration-up-to-60-fps-the-short-version" rel="anchor" href="/space/protocols/rdp#h-264/avc-acceleration-up-to-60-fps-the-short-version" style="color: #0000cc;"><h2 id="h264avc-acceleration-up-to-60-fps-the-short-version">H.264/AVC Acceleration up to 60 fps (The Short Version)</h2></a><p>On Windows 10/Server 2016 and above, you can enable nearly 60fps connections between clients using H.264, which considerably improves the user experience. To do that, on the server:</p>
<ol>
<li>Run <code>gpedit.msc</code> (Windows 10 Pro or above, although there are ways to enable it on Home)</li>
<li>Go to <code>Computer Configuration -&gt; Administrative Templates -&gt; Windows Components -&gt; Remote Desktop Services -&gt; Remote Desktop Session Host -&gt; Remote Session Environment</code></li>
<li>Enable <code>Prioritize H.264/AVC 444 Graphics mode for Remote Desktop</code></li>
<li>Enable <code>Configure H.264/AVC hardware encoding for Remote Desktop</code></li>
<li>If your machine has a discrete GPU, enable also <code>Use hardware graphics adapters for all Remote Desktop Services sessions</code></li>
<li>Run <code>gpupdate /force</code></li>
<li>Create a <code>DWMFRAMEINTERVAL</code> <code>DWORD</code> (32-bit) under <code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations</code> with the value 15 (decimal) to set fps to 60.</li>
</ol>
<p>Modern versions of <a href="/space/apps/gnome/remmina" rel="next" style="color: #0000cc;">Remmina</a> support this as <code>GFX AVC 444</code>, although the results will greatly vary depending on the client.</p>
<a class="anchor" id="anchor-the-long-version" rel="anchor" href="/space/protocols/rdp#the-long-version" style="color: #0000cc;"><h2 id="the-long-version">The Long Version</h2></a><p>This is a more detailed version of the above which I gleaned from various sources when I needed to re-tune a server and had to re-do the whole thing.</p>
<blockquote>
<p>If you intend to use UDP, make sure you can receive traffic on port 3391.</p>
</blockquote>
<a class="anchor" id="anchor-server-policy-changes" rel="anchor" href="/space/protocols/rdp#server-policy-changes" style="color: #0000cc;"><h3 id="server-policy-changes">Server Policy Changes</h3></a><p>Run <code>gpedit.msc</code> and configure these settings, using <code>gpupdate /force</code> in an admin prompt afterwards:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="nt">Computer Configuration</span><span class="p">:</span>
<span class="w">  </span><span class="nt">Administrative Templates</span><span class="p">:</span>
<span class="w">    </span><span class="nt">Windows Components</span><span class="p">:</span>
<span class="w">      </span><span class="nt">Remote Desktop Services</span><span class="p">:</span>
<span class="w">        </span><span class="nt">Remote Desktop Session Host</span><span class="p">:</span>
<span class="w">          </span><span class="nt">Connections</span><span class="p">:</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Select RDP Transfer Protocols = Enabled, Use both UDP and TCP</span>
<span class="w">          </span><span class="nt">Device and Resource Redirection</span><span class="p">:</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Do not allow supported Plug and Play device redirection = Disabled</span>
<span class="w">          </span><span class="nt">Remote Session Environment</span><span class="p">:</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Configure compression for Remote FX data = Enabled, Do not use an RDP compression algorithm</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Configure H.264/AVC Hardware encoding for Remote Desktop Connections = Enabled,  Prefer AVC hardware encoding = Always attempt</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Configure image quality for RemoteFX Adaptive Graphics = Enabled, High</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Configure Remote FX Adaptive Graphics = Enabled, Optimize for server scalability</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Enable RemoteFX encoding for RemoteFX clients designed for Windows Server 2008 R2 SP1 = Enabled</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Prioritize H.264/AVC 444 graphics mode for Remote Desktop Connections = Enabled</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Remote FX Adaptive Graphics = Enabled</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Use hardware graphics adapters for all Remote Desktop Services sessions = Enabled</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Use WDDM graphics display driver for Remote Desktop Connections = Disabled</span>
<span class="w">            </span><span class="nt">Remote FX for Windows Server 2008 R2</span><span class="p">:</span>
<span class="w">              </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Configure Remote FX = Enabled</span>
<span class="w">              </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Optimize visual experience when using Remote FX = Enabled, Highest (Best Quality) for both Screen Capture Rate and Screen Image Quality</span>
<span class="w">              </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Optimize visual experience for remote desktop sessions = Enabled, Rich Multimedia</span>
</code></pre></div>

<a class="anchor" id="anchor-server-registry-changes" rel="anchor" href="/space/protocols/rdp#server-registry-changes" style="color: #0000cc;"><h3 id="server-registry-changes">Server Registry Changes</h3></a><p>Save this out to a <code>.reg</code> file, edit to taste, import and reboot.</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="na">Windows Registry Editor Version 5.00</span>

<span class="c1">;Sets 60 FPS limit on RDP.</span>
<span class="c1">;Source: https://support.microsoft.com/en-us/help/2885213/frame-rate-is-limited-to-30-fps-in-windows-8-and-windows-server-2012-r</span>
<span class="c1">;YMMV, since policies also have an impact on this</span>
<span class="k">[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations]</span>
<span class="na">"DWMFRAMEINTERVAL"</span><span class="o">=</span><span class="s">dword:0000000f</span>

<span class="c1">;Increase Windows Responsiveness</span>
<span class="c1">;Source:https://www.reddit.com/r/killerinstinct/comments/4fcdhy/an_excellent_guide_to_optimizing_your_windows_10/</span>
<span class="c1">;Not really sure how much this helps in Windows 11</span>
<span class="k">[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile]</span>
<span class="na">"SystemResponsiveness"</span><span class="o">=</span><span class="s">dword:00000000</span>

<span class="c1">;Sets the flow control for Display vs Channel Bandwidth (aka RemoteFX devices, including controllers.)</span>
<span class="c1">;May not be very useful if your client negotiates other protocols.</span>
<span class="k">[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD]</span>
<span class="na">"FlowControlDisable"</span><span class="o">=</span><span class="s">dword:00000001</span>
<span class="na">"FlowControlDisplayBandwidth"</span><span class="o">=</span><span class="s">dword:0000010</span>
<span class="na">"FlowControlChannelBandwidth"</span><span class="o">=</span><span class="s">dword:0000090</span>
<span class="na">"FlowControlChargePostCompression"</span><span class="o">=</span><span class="s">dword:00000000</span>

<span class="c1">;Removes the artificial latency delay for RDP.</span>
<span class="c1">;Again, not sure how much this helps in Windows 11</span>
<span class="k">[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]</span>
<span class="na">"InteractiveDelay"</span><span class="o">=</span><span class="s">dword:00000000</span>

<span class="c1">;Disable Windows Network Throttling.</span>
<span class="k">[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]</span>
<span class="na">"DisableBandwidthThrottling"</span><span class="o">=</span><span class="s">dword:00000001</span>

<span class="c1">;Enable large MTU packets. Might cause some issues over VPNs, so if things start acting funny, revert this.</span>
<span class="na">"DisableLargeMtu"</span><span class="o">=</span><span class="s">dword:00000000</span>

<span class="c1">;Disables WDDM Drivers and goes back to legacy XDDM drivers (theoretically better for performance on NVIDIA cards, you might want to change this setting for AMD cards.)</span>
<span class="c1">;Of dubious effect in Windows 11 given policy settings.</span>
<span class="k">[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services]</span>
<span class="na">"EnableWddmDriver"</span><span class="o">=</span><span class="s">dword:00000000</span>
</code></pre></div>

<p>Also, if you have a dual GPU system, open the NVIDIA control panel and set it as the preferred graphics processor (Windows 11 has somewhat deprecated this, but it worked for me).</p>
<a class="anchor" id="anchor-client-policy-changes" rel="anchor" href="/space/protocols/rdp#client-policy-changes" style="color: #0000cc;"><h3 id="client-policy-changes">Client Policy Changes</h3></a><p>If you need to share USB devices (including webcams, although those rely on your client having UVC pass-through support), do this:</p>
<p>Run <code>gpedit.msc</code> and configure these settings, using <code>gpupdate /force</code> in an admin prompt afterwards:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="nt">Computer Configuration</span><span class="p">:</span>
<span class="w">  </span><span class="nt">Administrative Templates</span><span class="p">:</span>
<span class="w">    </span><span class="nt">Windows Components</span><span class="p">:</span>
<span class="w">      </span><span class="nt">Remote Desktop Services</span><span class="p">:</span>
<span class="w">        </span><span class="nt">Remote Desktop Connection Client</span><span class="p">:</span>
<span class="w">          </span><span class="nt">RemoteFX USB Device Redirection</span><span class="p">:</span>
<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Allow RDP redirection of other supported RemoteFX USB devices from this computer = Enabled, Users and Administrators</span>
</code></pre></div>

<p><code>gpupdate /force</code></p>
<a class="anchor" id="anchor-mac-client-rdp-tweaks" rel="anchor" href="/space/protocols/rdp#mac-client-rdp-tweaks" style="color: #0000cc;"><h3 id="mac-client-rdp-tweaks">Mac Client .rdp tweaks</h3></a><p>Since the official Mac Remote Desktop clients lack a lot of settings, I&#8217;ve found that these may help for LAN connections in some regards:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="na">networkautodetect</span><span class="o">:</span><span class="s">i:0</span>
<span class="na">connection type</span><span class="o">:</span><span class="s">i:6</span>
<span class="na">videoplaybackmode</span><span class="o">:</span><span class="s">1</span>
</code></pre></div>

<p>However, Jump Desktop tends to do a better job connecting to <code>xrdp</code> in Mac OS. On iOS, the official RD Client is often better.</p>
<a class="anchor" id="anchor-fixing-the-black-square-cursor-when-connecting-to" rel="anchor" href="/space/protocols/rdp#fixing-the-black-square-cursor-when-connecting-to" style="color: #0000cc;"><h3 id="fixing-the-black-square-cursor-when-connecting-to-xrdp">Fixing The Black Square Cursor when connecting to <code>xrdp</code></h3></a><p>Add this to <code>/etc/xrdp/xrdp.ini</code> as a workaround:</p>
<div class="highlight"><pre style="font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, 'Cascadia Code', 'Cascadia Mono', 'Consolas', 'DejaVu Sans Mono', 'Segoe UI Mono', 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro','Fira Code','Fira Mono', 'Droid Sans Mono', 'Courier New', monospace !important;"><span/><code><span class="na">new_cursors</span><span class="o">=</span><span class="s">false</span>
</code></pre></div>

<a class="anchor" id="anchor-resources" rel="anchor" href="/space/protocols/rdp#resources" style="color: #0000cc;"><h2 id="resources">Resources</h2></a><p/><table class="compact" style="background: transparent;margin: 0px;padding: 0px;border-collapse: collapse;font-size: 90%;">
<thead>
<tr style="border-top: 1px solid #aaa;">
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Category</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Date</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Link</th>
<th style="border-bottom: 1px solid black;border-top: 2px solid black;padding: 4px 4px !important;font-weight: bold;text-align: center;">Notes</th>
</tr>
</thead>
<tbody style="border-top: 2px solid black;border-bottom: 2px solid black;">
<tr style="border-top: 1px solid #aaa;">
<td rowspan="4" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Alternatives</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2025</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://docs.linuxserver.io/images/docker-kasm?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Kasm</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A set of pre-baked containers that provide web-based (non-RDP) desktops</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2024</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/selkies-project/selkies-gstreamer?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">selkies-gstreamer</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A WebRTC desktop streaming platform</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="6" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2023</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="http://www.rdesktop.org?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">rdesktop</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>The old classic open-source RDP client.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/citronneur/rdpy?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">rdpy</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A set of Python tools to access and test RDP servers.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="4" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Clients</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="/space/apps/CoRD" rel="nofollow" style="color: #0000cc;">CoRD</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>My favorite Mac client around 2009 or so.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/Devolutions/IronRDP?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">IronRDP</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A Rust-based RDP client with RFX support</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/rustdesk/rustdesk?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Rustdesk</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A new cross-platform client.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://thincast.com/en/products/client?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Thincast Client</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A cross-platform RDP client that supports GPU acceleration and ARM64.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="8" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Gateways</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2026</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/lamco-admin/lamco-rdp-server?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">lamco-rdp-server</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Wayland-native RDP server for Linux desktop sharing with hardware encoding and clipboard sync</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="5" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2025</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/bolkedebruin/rdpgw?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">rdpgw</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>an implementation of the Remote Desktop Gateway protocol.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/cedrozor/myrtille?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">myrtille</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A Windows-based simple and fast web Remote Desktop client</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/kulaginds/rdp-html5?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">rdp-html5</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A simple HTML5 RDP client</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/paidem/guacozy?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">guacozy</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>a HTML5 browser based VNC/RDP/SSH remote connection manager based on Guacamole</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/wwt/guac?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">guac</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Apache Guacamole client ported to Go</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="5" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2023</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="http://guac-dev.org/?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Guacamole</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A Java-based gateway providing HTML5 access to RDP, VNC, and SSH.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/FreeRDP/FreeRDP-WebConnect?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">FreeRDP WebConnect</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A C++ gateway providing HTML5 access for FreeRDP servers.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Mods</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/DuoStream/Duo?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">Duo</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A multi-seat solution that uses RdpWrap and Moonlight to enable remote gaming.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/stascorp/rdpwrap?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">rdpwrap</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A library wrapper to enable multiple remote desktop connections on Windows.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Ports</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="http://www.freerdp.com?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">FreeRDP</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>A well-maintained open-source RDP implementation, including a DirectFB client.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="3" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">Tools</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2025</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/Upinel/BetterRDP?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">BetterRDP</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>a Windows Registry file that optimizes RDP server settings in Windows.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td rowspan="2" style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;">2023</td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="http://www.kimknight.net/remoteapptool?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">RemoteApp Tool</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>Manages application access for RemoteApp sessions.</p></td>
</tr>
<tr style="border-top: 1px solid #aaa;">
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><a href="https://github.com/scarygliders/X11RDP-o-Matic?utm_source=taoofmac.com&amp;utm_medium=web&amp;utm_campaign=unsolicited_traffic&amp;utm_content=external_link" rel="external" style="color: #0000cc;">X11RDP-o-Matic</a></td>
<td style="min-width: 80px;margin: 0px;padding: 4px 4px !important;vertical-align: top;border-top: 1px solid #aaa;"><p>An automated installer to set up a native X11-based RDP server.</p></td>
</tr>
</tbody>
</table>
<br/>
]]></content>
</entry>
</feed>


