<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="https://taoofmac.com/static/css/atom-feed.css"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml">
<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>
<xhtml:header class="browser-header"><xhtml:h1><xhtml:a href="https://taoofmac.com">Tao of Mac</xhtml:a></xhtml:h1><xhtml:p>This is an Atom news feed. Copy its URL into a feed reader, or browse recent entries below.</xhtml:p><xhtml:code>https://taoofmac.com/atom.xml</xhtml:code></xhtml:header>
<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-08-12T21:34:57+00:00</updated>
<rights>CC Attribution-NonCommercial-NoDerivs 3.0</rights>
<entry>
<title>Nature Is Healing</title>
<id>https://taoofmac.com/space/links/2026/08/12/2015?utm_content=atom</id>
<published>2026-08-12T20:15:00+00:00</published>
<updated>2026-08-12T21:34:05+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/08/12/2015?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/links/2026/08/12/2015?utm_content=atom">Nature Is Healing</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-12T20:15:00+00:00">2026-08-12T20:15:00+00:00</xhtml:time><xhtml:p>I literally chortled at this one. I had no idea Apple had done this bad an icon for what is likely the only game they ever shipped with early OS X.</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p><a href="https://daringfireball.net/linked/2026/08/12/nature-is-healing?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" title="external link to https://daringfireball.net/linked/2026/08/12/nature-is-healing" alt="screenshot of https://daringfireball.net/linked/2026/08/12/nature-is-healing" rel="external"><img class="quicklook" src="/space/links/2026/08/12/2015/large.jpg?v=0a519d7f73b0" alt="quicklook" width="320" height="240"/></a></p>
<p class="lead">I literally chortled at this one. I had no idea Apple had done <em>this bad</em> an icon for what is likely the only game they ever shipped with early OS X.</p>

<br/>
]]></content>
<category term="apple" label="apple" />
<category term="chess" label="chess" />
<category term="design" label="design" />
<category term="icons" label="icons" />
<category term="macos" label="macos" />
</entry>
<entry>
<title>Clojure(Script)</title>
<id>https://taoofmac.com/space/dev/clojure?utm_content=atom</id>
<published>2013-08-20T17:09:00+00:00</published>
<updated>2026-08-11T20:14: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/dev/clojure?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/dev/clojure?utm_content=atom">Clojure(Script)</xhtml:a></xhtml:h2><xhtml:time datetime="2013-08-20T17:09:00+00:00">2013-08-20T17:09:00+00:00</xhtml:time><xhtml:p>Clojure is a LISP dialect that targets the Java VM - but that also happens to have a number of other back-ends, including a JavaScript one. ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">Clojure is a <a href="/space/dev/lisp" rel="next">LISP</a> dialect that targets the <a href="/space/dev/java" rel="next">Java</a> VM - but that also happens to have a number of other back-ends, including a <a href="/space/dev/javascript" rel="next">JavaScript</a> one.</p>
<p></p><table class="compact"><thead><tr><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td rowspan="10">Back-end</td><td>2021</td><td><a href="https://github.com/babashka/babashka?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">babashka</a></td><td><div><p>a standalone, fast-starting clojure interpreter</p>
</div></td></tr><tr><td>2019</td><td><a href="https://github.com/eginez/calvin?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">calvin</a></td><td><div><p>a built tool for ClojureScript</p>
</div></td></tr><tr><td>2018</td><td><a href="https://github.com/clojerl/clojerl?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clojerl</a></td><td><div><p>Clojure atop the Erlang BEAM VM</p>
</div></td></tr><tr><td>2016</td><td><a href="https://github.com/nakkaya/ferret?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Ferret</a></td><td><div><p>A Clojure to C++ compiler that can target Arduino-compatible microcontrollers</p>
</div></td></tr><tr><td rowspan="6">2013</td><td><a href="https://github.com/greghendershott/rackjure?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">rackjure</a></td><td><div><p>A set of Clojure semantics ported to Racket</p>
</div></td></tr><tr><td><a href="https://github.com/halgari/clojure-py?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clojure-py</a></td><td><div><p>A <a href="/space/dev/python" rel="next">Python</a> implementation that compiles down to bytecode (project is stalled, but may be useful as reference)</p>
</div></td></tr><tr><td><a href="https://github.com/jkk/honeysql?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">honeysql</a></td><td><div><p>A SQL statement generator</p>
</div></td></tr><tr><td><a href="https://github.com/joshaber/clojurem?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ClojureM</a></td><td><div><p>Another Objective-C compiler</p>
</div></td></tr><tr><td><a href="https://github.com/raph-amiard/clojurescript-lua?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clojurescript-lua</a></td><td><div><p>A <a href="/space/dev/lua" rel="next">Lua</a> back-end</p>
</div></td></tr><tr><td><a href="https://github.com/schani/clojurec?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clojurec</a></td><td><div><p>This one targets both C and Objective-C</p>
</div></td></tr><tr><td>Cloud Tools</td><td>2015</td><td><a href="https://github.com/nervous-systems/cljs-lambda?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">cljs-lambda</a></td><td><div><p>Leiningen plugin/template for running ClojureScript functions inside AWS Lambda</p>
</div></td></tr><tr><td rowspan="2">Compilers</td><td>2026</td><td><a href="https://github.com/jolt-lang/jolt?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">jolt</a></td><td><div><p>Clojure compiler implemented on top of Chez Scheme</p>
</div></td></tr><tr><td>2024</td><td><a href="https://github.com/squint-cljs/cherry?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">cherry</a></td><td><div><p>Experimental ClojureScript to ES6 module compiler</p>
</div></td></tr><tr><td rowspan="11">Data Science</td><td>2021</td><td><a href="https://github.com/metasoarous/oz?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Oz</a></td><td><div><p>a data visualization and scientific document processing library for Clojure
built around Vega</p>
</div></td></tr><tr><td rowspan="2">2017</td><td><a href="https://github.com/JonyEpsilon/gorilla-repl?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">gorilla-repl</a></td><td><div><p>Notebook style REPL with plotting features</p>
</div></td></tr><tr><td><a href="https://github.com/roryk/clojupyter?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clojupyter</a></td><td><div><p>Jupyter notebook kernel</p>
</div></td></tr><tr><td rowspan="2">2015</td><td><a href="https://github.com/MichaelDrogalis/onyx?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Onyx</a></td><td><div><p>Data processing framework</p>
</div></td></tr><tr><td><a href="https://gorillalabs.github.io/sparkling/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Sparkling</a></td><td><div><p>Clojure API for Apache Spark</p>
</div></td></tr><tr><td rowspan="2">2014</td><td><a href="https://github.com/Netflix/PigPen?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">PigPen</a></td><td><div><p>A DSL that compiles down to Apache Pig</p>
</div></td></tr><tr><td><a href="https://github.com/damballa/parkour?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Parkour</a></td><td><div><p>Clojure integration layer written directly against Hadoop</p>
</div></td></tr><tr><td rowspan="4">2013</td><td><a href="http://cascalog.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Cascalog</a></td><td><div><p>Querying library for <a href="/space/dev/hadoop" rel="next">Hadoop</a>, inspired by Datalog</p>
</div></td></tr><tr><td><a href="http://incanter.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Incanter</a></td><td><div><p>A set of statistical and graphical tools</p>
</div></td></tr><tr><td><a href="https://github.com/jackschultz/classify?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">classify</a></td><td><div><p>A small text classifier using OpenNLP</p>
</div></td></tr><tr><td><a href="https://github.com/weavejester/clucy?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clucy</a></td><td><div><p>Lucene bindings</p>
</div></td></tr><tr><td>Databases</td><td>2019</td><td><a href="https://github.com/dscarpetti/codax?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">codax</a></td><td><div><p>a transactional, embedded database engine</p>
</div></td></tr><tr><td rowspan="2">Distributed Computing</td><td rowspan="2">2016</td><td><a href="https://github.com/tolitius/chazel?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Chazel</a></td><td><div><p>Hazelcast wrapper</p>
</div></td></tr><tr><td><a href="https://github.com/tolitius/hface?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">hface</a></td><td><div><p>Hazelcast cluster monitor</p>
</div></td></tr><tr><td>GUI</td><td>2024</td><td><a href="https://github.com/HumbleUI/HumbleUI?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">HumbleUI</a></td><td><div><p>a desktop UI framework for cross-platform applications</p>
</div></td></tr><tr><td>Graphics</td><td>2014</td><td><a href="https://github.com/karls/collage?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">collage</a></td><td><div><p>A high-level image processing library</p>
</div></td></tr><tr><td rowspan="2">Infoviz</td><td rowspan="2">2013</td><td><a href="https://github.com/dribnet/strokes?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">strokes</a></td><td><div><p>An interop library for using D3, with <a href="http://s.trokes.org/dribnet?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">samples</a></p>
</div></td></tr><tr><td><a href="https://github.com/lynaghk/c2?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">C2</a></td><td><div><p>A D3-like visualization library with a standalone bundle</p>
</div></td></tr><tr><td rowspan="2">Job Management</td><td rowspan="2">2016</td><td><a href="https://github.com/jxa/resque-clojure?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">resque-clojure</a></td><td><div><p>A Resque clone.</p>
</div></td></tr><tr><td><a href="https://github.com/metametadata/byplay?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">byplay</a></td><td><div><p>Background job queue atop PostgreSQL</p>
</div></td></tr><tr><td rowspan="8">Libraries</td><td>2026</td><td><a href="https://github.com/glojurelang/glojure?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">glojure</a></td><td><div><p>Clojure interpreter hosted on Go, with extensible interop support.</p>
</div></td></tr><tr><td>2023</td><td><a href="https://github.com/tonsky/clj-simple-router?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clj-simple-router</a></td><td><div><p>A simple, order-independent Ring router</p>
</div></td></tr><tr><td>2021</td><td><a href="https://github.com/clj-python/libpython-clj?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">libpython-clj</a></td><td><div><p>Python interop</p>
</div></td></tr><tr><td>2020</td><td><a href="http://quil.info/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">quil</a></td><td><div><p>a library for interactive graphics</p>
</div></td></tr><tr><td rowspan="4">2019</td><td><a href="https://duckling.wit.ai/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">duckling</a></td><td><div><p>a library that parses text into structured data</p>
</div></td></tr><tr><td><a href="https://github.com/TheClimateCorporation/claypoole?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">claypoole</a></td><td><div><p>improved, tunable thead pooling for concurrency primitives (pmap, etc.)</p>
</div></td></tr><tr><td><a href="https://github.com/coast-framework/coast?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Coast</a></td><td><div><p>A “full stack” web framework</p>
</div></td></tr><tr><td><a href="https://github.com/domino-clj/domino?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">domino</a></td><td><div><p>a dataflow library that allows for reactive constructs in your app</p>
</div></td></tr><tr><td rowspan="2">Mobile</td><td rowspan="2">2013</td><td><a href="https://github.com/clojure-android/clojure?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clojure-android</a></td><td></td></tr><tr><td><a href="https://github.com/oakes/lein-fruit?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">lein-fruit</a></td><td><div><p>A Leiningen plugin to develop iOS apps (using <a href="http://www.robovm.org/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">RoboVM</a>)</p>
</div></td></tr><tr><td rowspan="6">Networking</td><td rowspan="6">2013</td><td><a href="http://avout.io?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Avout</a></td><td><div><p>Distributed state in Clojure, via ZooKeeper</p>
</div></td></tr><tr><td><a href="http://http-kit.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">http-kit</a></td><td><div><p>High-performance event-driven HTTP client/server for Clojure
(see <a href="https://github.com/ptaoussanis/clojure-web-server-benchmarks?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">benchmarks</a> and <a href="https://github.com/http-kit/lein-template?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">this leiningen template</a>)</p>
</div></td></tr><tr><td><a href="http://riemann.io?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Riemann</a></td><td><div><p>An event stream processor</p>
</div></td></tr><tr><td><a href="https://github.com/amitrathore/swarmiji?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">swarmiji</a></td><td><div><p>Simple distributed computing framework using RabbitMQ</p>
</div></td></tr><tr><td><a href="https://github.com/flatland/clojure-protobuf?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clojure-protobuf</a></td><td><div><p>Protocol buffers support</p>
</div></td></tr><tr><td><a href="https://github.com/isaiah/vertx-clj?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">vertx-clj</a></td><td><div><p><a href="http://vertx.io?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">vert.x</a> adapter</p>
</div></td></tr><tr><td rowspan="5">Parsers</td><td>2014</td><td><a href="https://github.com/scsibug/feedparser-clj?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">feedparser-clj</a></td><td><div><p>RSS feed parsing library</p>
</div></td></tr><tr><td rowspan="4">2013</td><td><a href="https://github.com/Engelberg/instaparse?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Instaparse</a></td><td><div><p>Generic parser library</p>
</div></td></tr><tr><td><a href="https://github.com/cgrand/parsley?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Parsley</a></td><td><div><p>DSL for creating total and truly incremental parsers in Clojure</p>
</div></td></tr><tr><td><a href="https://github.com/yogthos/markdown-clj?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">markdown-clj</a></td><td><div><p>limited <a href="/space/markup/markdown" rel="next">Markdown</a> parser</p>
</div></td></tr><tr><td><a href="https://github.com/ztellman/gloss?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">gloss</a></td><td><div><p>A byte-format DSL especially suited to handling raw binary protocols</p>
</div></td></tr><tr><td rowspan="2">Resources</td><td>2014</td><td><a href="http://grimoire.arrdem.com?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Grimoire</a></td><td><div><p>A handy reference</p>
</div></td></tr><tr><td>2013</td><td><a href="http://www.clojure-toolbox.com?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Clojure Toolbox</a></td><td><div><p>A compilation of useful Libraries</p>
</div></td></tr><tr><td rowspan="2">Runtimes</td><td>2022</td><td><a href="https://github.com/jank-lang/jank?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">jank</a></td><td><div><p>a Clojure dialect on LLVM with a native runtime and C++ interop</p>
</div></td></tr><tr><td>2020</td><td><a href="https://github.com/borkdude/sci?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">sci</a></td><td><div><p>A small Clojure interpreter</p>
</div></td></tr><tr><td>Serverless</td><td>2020</td><td><a href="https://github.com/siilisolutions/hedge?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">hedge</a></td><td><div><p>a ClojureScript serverless framework that targets both Azure Functions and AWS Lambda</p>
</div></td></tr><tr><td rowspan="14">Tools</td><td rowspan="3">2026</td><td><a href="https://github.com/gloathub/gloat?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">gloat</a></td><td><div><p>Glojure automation tool</p>
</div></td></tr><tr><td><a href="https://github.com/yogthos/jolt?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">jolt</a></td><td><div><p>a Janet-hosted Clojure interpreter aiming to provide an SCI-compatible runtime</p>
</div></td></tr><tr><td><a href="https://gitlab.com/andreyorst/clojurefnl?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ClojureFnl</a></td><td><div><p>A work-in-progress Clojure-to-Fennel transpiler for running .cljf code on Lua runtimes</p>
</div></td></tr><tr><td rowspan="2">2021</td><td><a href="https://github.com/nextjournal/clerk?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clerk</a></td><td><div><p>a Clojure notebook environment</p>
</div></td></tr><tr><td><a href="https://github.com/tonsky/sublime-clojure?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">sublime-clojure</a></td><td><div><p>a Clojure extension for Sublime Text 4</p>
</div></td></tr><tr><td>2017</td><td><a href="https://github.com/oakes/Nightlight?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Nightlight</a></td><td><div><p>Embedded editor that runs inside your project</p>
</div></td></tr><tr><td rowspan="2">2016</td><td><a href="https://github.com/Quantisan/docker-clojure?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">docker-clojure</a></td><td><div><p>The official <a href="/space/os/linux/docker" rel="next">Docker</a> image for Clojure, with build triggers.</p>
</div></td></tr><tr><td><a href="https://github.com/martinklepsch/tenzing?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">tenzing</a></td><td><div><p>A Clojurescript application template</p>
</div></td></tr><tr><td rowspan="6">2013</td><td><a href=":https://nightcode.info">Nightcode</a></td><td><div><p>An integrated IDE</p>
</div></td></tr><tr><td><a href="http://leiningen.org/grench.html?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Grenchman</a></td><td><div><p>Simple, straightforward nREPL client</p>
</div></td></tr><tr><td><a href="https://github.com/cemerick/austin?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Austin</a></td><td><div><p>A ClojureScript REPL</p>
</div></td></tr><tr><td><a href="https://github.com/dgrnbrg/spyscope?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">spyscope</a></td><td><div><p>trace-oriented debugging tools</p>
</div></td></tr><tr><td><a href="https://github.com/weavejester/codox?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Codox</a></td><td><div><p>Documentation generator that relies on function metadata</p>
</div></td></tr><tr><td><a href="https://github.com/zcaudate/lein-midje-doc?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">lein-midje-doc</a></td><td><div><p>A clever way to generate documentation from tests</p>
</div></td></tr><tr><td rowspan="12">Web</td><td>2025</td><td><a href="https://github.com/jacobobryant/biff?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Biff</a></td><td><div><p>a Clojure web framework for solo developers</p>
</div></td></tr><tr><td>2021</td><td><a href="https://github.com/AppsFlyer/donkey?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">donkey</a></td><td><div><p>a Ring-compliant server and HTTP client that uses Vert.x, with great metrics support</p>
</div></td></tr><tr><td>2020</td><td><a href="https://github.com/metosin/reitit?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">reitit</a></td><td><div><p>a very fast data-driven router with ring support</p>
</div></td></tr><tr><td>2019</td><td><a href="https://github.com/duct-framework/duct?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Duct</a></td><td><div><p>a modular web framework</p>
</div></td></tr><tr><td>2015</td><td><a href="https://github.com/metosin/ring-swagger?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ring-swagger</a></td><td><div><p>Swagger Spec for Clojure Web Apps</p>
</div></td></tr><tr><td>2014</td><td><a href="http://immutant.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Immutant</a></td><td><div><p>Full-blown application server</p>
</div></td></tr><tr><td rowspan="6">2013</td><td><a href="http://let-caribou.in?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Caribou</a></td><td><div><p>Pretty decent back-office.</p>
</div></td></tr><tr><td><a href="http://pedestal.io?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Pedestal</a></td><td><div><p>A more complete framework</p>
</div></td></tr><tr><td><a href="http://www.luminusweb.net?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Luminus</a></td><td></td></tr><tr><td><a href="http://www.webnoir.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Noir</a></td><td><div><p>Nice (but, alas, deprecated) framework atop Ring and Compojure</p>
</div></td></tr><tr><td><a href="https://github.com/ring-clojure/ring?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Ring</a></td><td><div><p>HTTP abstractions</p>
</div></td></tr><tr><td><a href="https://github.com/weavejester/compojure?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Compojure</a></td><td><div><p>HTTP routing middleware</p>
</div></td></tr><tr><td rowspan="4">Web UI</td><td>2014</td><td><a href="http://holmsand.github.io/reagent?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Reagent</a></td><td><div><p>A <a href="http://facebook.github.io/react/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">React</a> wrapper that is less trendy (but arguably more pragmatic) than <a href="https://github.com/swannodette/om?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Om</a></p>
</div></td></tr><tr><td rowspan="3">2013</td><td><a href="http://fluentsoftware.github.io/cljs-binding/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">cljs-binding</a></td><td><div><p>native data binding library</p>
</div></td></tr><tr><td><a href="https://github.com/holmsand/cloact?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Cloact</a></td><td><div><p>Simple ClojureScript interface to React</p>
</div></td></tr><tr><td><a href="https://github.com/pangloss/clang?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">clang</a></td><td><div><p>Bindings to AngularJS</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="clojure" label="clojure" />
<category term="clojurescript" label="clojurescript" />
<category term="development" label="development" />
<category term="lisp" label="lisp" />
</entry>
<entry>
<title>Scheme</title>
<id>https://taoofmac.com/space/dev/scheme?utm_content=atom</id>
<published>2006-05-08T12:11:41+00:00</published>
<updated>2026-08-11T19:04: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/dev/scheme?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/dev/scheme?utm_content=atom">Scheme</xhtml:a></xhtml:h2><xhtml:time datetime="2006-05-08T12:11:41+00:00">2006-05-08T12:11:41+00:00</xhtml:time><xhtml:p>Scheme is a LISP dialect that has not just gone its own way (as is usual with LISPs) but also achieved IEEE standardization. With a focus on lexical scope ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">Scheme is a <a href="/space/dev/lisp" rel="next">LISP</a> dialect that has not just gone its own way (as is usual with LISPs) but also achieved IEEE standardization. With a focus on lexical scope and tail call optimization, it actually contributed many of its ideas back into Common LISP.</p>
<a id="anchor-resources" class="anchor" href="/space/dev/scheme#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td rowspan="12">Compilers</td><td rowspan="2">2026</td><td><a href="https://github.com/jolt-lang/jolt?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">jolt</a></td><td><div><p>Clojure compiler implemented on top of Chez Scheme</p>
</div></td></tr><tr><td><a href="https://gitlab.com/weinholt/loko?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">loko</a></td><td><div><p>optimizing Scheme compiler for Linux, NetBSD, and bare hardware</p>
</div></td></tr><tr><td rowspan="2">2023</td><td><a href="https://codeberg.org/spritely/hoot?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">guile-hoot</a></td><td><div><p>an AOT Scheme to WebAssembly compiler</p>
</div></td></tr><tr><td><a href="https://github.com/wingo/whiffle?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">whiffle</a></td><td><div><p>a minimal Scheme-to-C compiler</p>
</div></td></tr><tr><td rowspan="2">2021</td><td><a href="http://www.gnu.org/software/kawa/index.html?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Kawa</a></td><td><div><p>a Scheme that runs on the JVM</p>
</div></td></tr><tr><td><a href="https://github.com/udem-dlteam/ribbit?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ribbit</a></td><td><div><p>small and portable Scheme implementation with AOT compilation and 4K footprint</p>
</div></td></tr><tr><td>2019</td><td><a href="https://github.com/cisco/ChezScheme?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Chez Scheme</a></td><td><div><p>a high-performance Scheme compiler</p>
</div></td></tr><tr><td>2018</td><td><a href="https://github.com/vyzo/gerbil?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">gerbil Scheme</a></td><td><div><p>a layer over Gambit</p>
</div></td></tr><tr><td rowspan="4">2016</td><td><a href="https://github.com/justinethier/cyclone?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Cyclone Scheme</a></td><td><div><p>Supports multiple native threads</p>
</div></td></tr><tr><td><a href="https://github.com/larcenists/larceny?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Larceny Scheme</a></td><td><div><p>Compiles to Intel and ARM machine code</p>
</div></td></tr><tr><td><a href="https://ryansuchocki.github.io/microscheme/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Microscheme</a></td><td><div><p>A compiler for the <a href="/space/hw/arduino" rel="next">Arduino</a></p>
</div></td></tr><tr><td><a href="https://www.call-cc.org/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Chicken Scheme</a></td><td><div><p>One of the most well-known compilers</p>
</div></td></tr><tr><td>Frameworks</td><td>2025</td><td><a href="https://gitlab.com/hardenedlinux/artanis?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">artanis</a></td><td><div><p>a web application framework</p>
</div></td></tr><tr><td rowspan="16">Interpreters</td><td rowspan="2">2026</td><td><a href="https://github.com/aalpar/wile?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Wile</a></td><td><div><p>R7RS Scheme in pure Go for embedding</p>
</div></td></tr><tr><td><a href="https://github.com/matthewp/puppy-scheme?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">puppy-scheme</a></td><td><div><p>Self-hosting Scheme compiler that targets WebAssembly using the WASM GC proposal, keeping outputs tiny (~137 bytes).</p>
</div></td></tr><tr><td rowspan="2">2025</td><td><a href="https://github.com/mattwparas/steel?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">steel</a></td><td><div><p>an empedded Scheme interpreter written in Rust</p>
</div></td></tr><tr><td><a href="https://github.com/raviqqe/stak?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">stak</a></td><td><div><p>a R7RS Scheme interpreter written in Rust</p>
</div></td></tr><tr><td rowspan="3">2023</td><td><a href="https://github.com/ashinn/chibi-scheme?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">chibi-scheme</a></td><td><div><p>an embeddable Scheme interpreter</p>
</div></td></tr><tr><td><a href="https://github.com/racket/zuo?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">zuo</a></td><td><div><p>a tiny Racket for scripting (written in C)</p>
</div></td></tr><tr><td><a href="https://github.com/shirok/Gauche?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Gauche</a></td><td><div><p>can create standalone executables</p>
</div></td></tr><tr><td rowspan="2">2022</td><td><a href="https://gitlab.com/owl-lisp/owl?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">owl</a></td><td><div><p>a Scheme interpreter written in C, that can apparently also compile to C</p>
</div></td></tr><tr><td><a href="https://web.cs.wpi.edu/~jshutt/kernel.html?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Kernel</a></td><td><div><p>a Scheme-like dialect of Lisp in which everything is a first-class object.</p>
</div></td></tr><tr><td rowspan="2">2021</td><td><a href="http://armpit.sourceforge.net?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">armpit Scheme</a></td><td><div><p>an ancient R7RS interpreter</p>
</div></td></tr><tr><td><a href="https://ccrma.stanford.edu/software/snd/snd/s7.html?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">S7 Scheme</a></td><td><div><p>a TinyScheme variant designed for embedding into other projects</p>
</div></td></tr><tr><td>2020</td><td><a href="https://www.gnu.org/software/guile?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Guile</a></td><td><div><p>the GNU Scheme implementation, which has a JIT</p>
</div></td></tr><tr><td rowspan="2">2019</td><td><a href="https://github.com/eliben/bobscheme?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">bobscheme</a></td><td><div><p>A suite of Scheme implementations in Python and C++ including an interpreter, VM and compiler to WebAssembly</p>
</div></td></tr><tr><td><a href="https://github.com/microsoft/schemy?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">schemy</a></td><td><div><p>a .NET embeddable Scheme interpreter</p>
</div></td></tr><tr><td>2016</td><td><a href="http://t3x.org/s9fes/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">s9fes</a></td><td><div><p>A well-documented interpreter that can run on <a href="/space/os/plan9" rel="next">Plan9</a></p>
</div></td></tr><tr><td>2014</td><td><a href="http://ironscheme.codeplex.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">IronScheme</a></td><td><div><p>Runs atop the .NET DLR</p>
</div></td></tr><tr><td rowspan="3">Libraries</td><td>2020</td><td><a href="https://github.com/massung/r-cade?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">r-cade</a></td><td><div><p>a Racket library for doing simple retro-style games</p>
</div></td></tr><tr><td rowspan="2">2019</td><td><a href="https://github.com/evilbinary/scheme-lib?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">scheme-lib</a></td><td><div><p>A set of libraries for Chez</p>
</div></td></tr><tr><td><a href="https://github.com/ovenpasta/thunderchez?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">thunderchez</a></td><td><div><p>More libraries for Chez Scheme</p>
</div></td></tr><tr><td rowspan="3">Tools</td><td>2026</td><td><a href="https://github.com/Bogdanp/Ruckus?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Ruckus</a></td><td><div><p>a Racket IDE for iOS</p>
</div></td></tr><tr><td>2021</td><td><a href="https://marketplace.visualstudio.com/items?itemName=rheller.alive&amp;utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Alive</a></td><td><div><p>VS Code extension</p>
</div></td></tr><tr><td>2019</td><td><a href="https://github.com/gwatt/chez-exe?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">chez-exe</a></td><td><div><p>A tool to generate standalone executables with Chez</p>
</div></td></tr><tr><td>Tutorials</td><td>2025</td><td><a href="https://codeberg.org/ZelphirKaltstahl/guile-examples?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">guile-examples</a></td><td><div><p>examples and tutorials for Guile</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="functional" label="functional" />
<category term="language" label="language" />
<category term="lisp" label="lisp" />
<category term="programming" label="programming" />
<category term="resources" label="resources" />
<category term="scheme" label="scheme" />
</entry>
<entry>
<title>3D Graphics</title>
<id>https://taoofmac.com/space/3d/graphics?utm_content=atom</id>
<published>2005-05-28T23:17:11+00:00</published>
<updated>2026-08-10T07:08: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/3d/graphics?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/3d/graphics?utm_content=atom">3D Graphics</xhtml:a></xhtml:h2><xhtml:time datetime="2005-05-28T23:17:11+00:00">2005-05-28T23:17:11+00:00</xhtml:time><xhtml:p>I spent far too much time doing 3d graphics to get me through college (it was tremendous fun but I fortunately had the good sense not to make a career out ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">I spent far too much time doing <a href="3d" rel="nofollow">3d</a> graphics to get me through college (it was tremendous fun but I fortunately had the good sense not to make a career out of it).</p>
<p>These days I spend a <em>lot</em> of my free time in CAD software (including <a href="/space/apps/blender" rel="next">Blender</a> and <a href="/space/apps/openscad" rel="next">OpenSCAD</a>), so those years were a great learning experience that has really paid off.</p>
<a id="anchor-resources" class="anchor" href="/space/3d/graphics#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td>Gaussian Splats</td><td>2025-12</td><td><a href="https://github.com/NullandKale/NullSplats?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">NullSplats</a></td><td><div><p>An app to generate Gaussian splats from casual captures</p>
</div></td></tr><tr><td rowspan="2">Modeling</td><td rowspan="2">2016-08</td><td><a href="/space/apps/blender" rel="next">Blender</a></td><td><div><p>free, does just about anything, has a bazillion plugins for everything</p>
</div></td></tr><tr><td><a href="https://www.wings3d.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Wings 3D</a></td><td><div><p>free, has POV-Ray export</p>
</div></td></tr><tr><td rowspan="2">Ray-Tracers</td><td rowspan="2">2016-08</td><td><a href="http://www.pov-ray.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">POV-Ray</a></td><td><div><p>the one application I spent more CPU time running, easily, during my entire lifespan</p>
</div></td></tr><tr><td><a href="http://yafray.org/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Yafray</a></td><td><div><p>free, supports distributed rendering</p>
</div></td></tr><tr><td>Tools</td><td>2026-08</td><td><a href="https://gitlab.com/Kazade/picophysics?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">picophysics</a></td><td><div><p>physics simulation project with interactive examples</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
</entry>
<entry>
<title>Emulation</title>
<id>https://taoofmac.com/space/emulation?utm_content=atom</id>
<published>2005-06-09T09:38:12+00:00</published>
<updated>2026-08-09T14:51: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/emulation?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/emulation?utm_content=atom">Emulation</xhtml:a></xhtml:h2><xhtml:time datetime="2005-06-09T09:38:12+00:00">2005-06-09T09:38:12+00:00</xhtml:time><xhtml:p>Emulation and hardware virtualization software of various descriptions, most of them obsolete by now: CategoryDateLinkNotes8-bit2025MCUMEa multi-system ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">Emulation and hardware virtualization software of various descriptions, most of them obsolete by now:</p>
<p></p><table class="compact"><thead><tr><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td rowspan="2">8-bit</td><td rowspan="2">2025</td><td><a href="https://github.com/Jean-MarcHarvengt/MCUME?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MCUME</a></td><td><div><p>a multi-system emulator for microcontrollers</p>
</div></td></tr><tr><td><a href="https://github.com/floooh/chips-test?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">chips-test</a></td><td><div><p>a collection of <a href="https://floooh.github.io/tiny8bit/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Tiny Emus</a> for
8-bit systems</p>
</div></td></tr><tr><td rowspan="3">Amiga</td><td rowspan="2">2008</td><td><a href="http://sourceforge.net/projects/maxuae/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MaxUAE</a></td><td><div><p>Somewhat dead, with only Power PC binaries available.</p>
</div></td></tr><tr><td><a href="http://www.rcdrummond.net/uae/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">UAE</a></td><td><div><p>Cross-platform Amiga emulator</p>
</div></td></tr><tr><td>2021</td><td><a href="https://github.com/midwan/amiberry?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">amiberry</a></td><td><div><p>optimized for ARM cpus</p>
</div></td></tr><tr><td rowspan="3">Arcade</td><td>2010</td><td><a href="http://openemu.sourceforge.net?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Open Emu</a></td><td><div><p>A modular emulator that can be used as a Quartz Composer plug-in</p>
</div></td></tr><tr><td>2011</td><td><a href="http://www.emulaunch.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Emulaunch</a></td><td><div><p>A multi-emulator front-end suitable for use on a TV</p>
</div></td></tr><tr><td>2022</td><td><a href="https://github.com/Provenance-Emu/Provenance?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Provenance</a></td><td><div><p>an iOS and tvOS multi-emulator frontend</p>
</div></td></tr><tr><td rowspan="2">C64</td><td>2019</td><td><a href="https://github.com/randyrossi/bmc64?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">bmc64</a></td><td><div><p>a “bare metal” C64 emulator for the Raspberry Pi</p>
</div></td></tr><tr><td>2025</td><td><a href="https://github.com/SensoriumEmbedded/TeensyROM?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">TeensyROM</a></td><td><div><p>a ROM emulator, fast loader, MIDI and internet cartridge for Commodore 64/128</p>
</div></td></tr><tr><td>DEC</td><td>2024</td><td><a href="https://github.com/rscott2049/DECstation2040?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">DECstation2040</a></td><td><div><p>A RP2040 based DECstation emulator (the workstations I used in college)</p>
</div></td></tr><tr><td rowspan="4">Emulation</td><td>2024</td><td><a href="https://github.com/86Box/86Box?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">86Box</a></td><td><div><p>a low level x86 emulator for running older operating systems and software.</p>
</div></td></tr><tr><td rowspan="3">2026</td><td><a href="https://github.com/amcchord/M5Tab-Macintosh?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">M5Tab-Macintosh</a></td><td><div><p>68040 emulator on an ESP32-P4 with video rendering and input handling capabilities.</p>
</div></td></tr><tr><td><a href="https://github.com/kstenerud/Musashi?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Musashi</a></td><td><div><p>A portable Motorola 68000 CPU emulator core used in many classic system emulators</p>
</div></td></tr><tr><td><a href="https://github.com/rkindustriesYT/Anemoia-NES-Emulator-fixes?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Anemoia NES Emulator fixes</a></td><td><div><p>fixes for the ESP32 port of the Anemoia NES emulator</p>
</div></td></tr><tr><td>Gameboy</td><td>2008</td><td><a href="http://www.bannister.org/software/ba.htm?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Boycott Advance</a></td><td><div><p>GBA emulator. Universal binary.</p>
</div></td></tr><tr><td>Gaming</td><td>2008</td><td><a href="http://www.bannister.org/software/kigb.htm?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">KiGB</a></td><td><div><p>Gameboy/Gameboy colour emulator.</p>
</div></td></tr><tr><td rowspan="3">Generic x86</td><td rowspan="2">2008</td><td><a href="/space/apps/q" rel="next">QEMU</a></td><td><div><p>Q</p>
</div></td></tr><tr><td><a href="/space/com/microsoft/virtual_pc" rel="next">Virtual PC</a></td><td><div><p>Used to be the best option for running Windows on Power PC</p>
</div></td></tr><tr><td>2010</td><td><a href="/space/links/2011/03/25/1840" rel="next">DOSBox</a></td><td><div><p>Boxer</p>
</div></td></tr><tr><td>Graphics</td><td>2025</td><td><a href="https://github.com/carlosefr/retroarch-shaders?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">retroarch-shaders</a></td><td><div><p>a collection of finetuned shaders to replicate CRT looks on Retroarch</p>
</div></td></tr><tr><td rowspan="6">IBM PC</td><td>2023</td><td><a href="https://github.com/dbalsom/martypc?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">martypc</a></td><td><div><p>a cycle-accurate IBM PC/XT emulator written in Rust</p>
</div></td></tr><tr><td rowspan="4">2025</td><td><a href="https://cmaiolino.wordpress.com/dosbian?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Dosbian</a></td><td><div><p>a lightweight distribution for Raspberry Pi that boots directly into DOSBox</p>
</div></td></tr><tr><td><a href="https://felix86.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">felix86</a></td><td><div><p>a low-level x86 emulator for RISC-V platforms</p>
</div></td></tr><tr><td><a href="https://github.com/ericjenott/Evertop?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Evertop</a></td><td><div><p>an ultra low power, ultra long battery solar PC</p>
</div></td></tr><tr><td><a href="https://github.com/jhhoward/Faux86?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Faux86</a></td><td><div><p>designed to be run ‘bare metal’ on a Raspberry Pi</p>
</div></td></tr><tr><td>2026</td><td><a href="https://github.com/jggonz/os8088?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">os8088</a></td><td><div><p>8088 operating system and retro x86 project</p>
</div></td></tr><tr><td rowspan="21">Mac</td><td>2011</td><td><a href="https://github.com/cebix/macemu?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Basilisk II and SheepShaver</a></td><td><div><p>the most stable emulators for Motorola-based Macs, but maintained and
released via an obscure forum, so quite annoying to keep up to date</p>
</div></td></tr><tr><td rowspan="3">2023</td><td><a href="https://github.com/InvisibleUp/uvmac?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">µvMac</a></td><td><div><p>An attempt to modernize the vMac source code</p>
</div></td></tr><tr><td><a href="https://github.com/macmade/Macintosh-ROMs?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Macintosh ROMs</a></td><td><div><p>quite amazed to see these in the wild</p>
</div></td></tr><tr><td><a href="https://www.gryphel.com/c/minivmac?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Mini vMac</a></td><td><div><p>The most straightforward Mac emulator out there</p>
</div></td></tr><tr><td rowspan="6">2024</td><td><a href="https://github.com/TaraHoleInIt/MinivMacArduino?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MinivMacArduino</a></td><td><div><p>Port of Mini vMac to the Arduino framework (Kind of)</p>
</div></td></tr><tr><td><a href="https://github.com/clehner/macemu?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">nacemu</a></td><td><div><p>for of Basilisk and SheepShaver with networking support</p>
</div></td></tr><tr><td><a href="https://github.com/evansm7/pico-mac?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pico-umac</a></td><td><div><p>embeds the umac emulator into a Rasbperry Pi Pico, complete with VGA mono output</p>
</div></td></tr><tr><td><a href="https://github.com/evansm7/umac?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">umac</a></td><td><div><p>a minimalist Apple Macintosh 128K/512K emulator</p>
</div></td></tr><tr><td><a href="https://github.com/noshbar/Ultibo-Mini_vMac?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Ultibo-Mini_vMac</a></td><td><div><p>A minivmac fork to be built against Ultibo instead of out-of-date SDL2</p>
</div></td></tr><tr><td><a href="https://www.macrelix.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MacRelix</a></td><td><div><p>a Unix-like environment that runs in classic Mac OS</p>
</div></td></tr><tr><td rowspan="4">2025</td><td><a href="https://github.com/all2coolnick/pico-mac-nano?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pico-mac-nano</a></td><td><div><p>a minimal Mac emulator using an RP2040 and a tiny LCD</p>
</div></td></tr><tr><td><a href="https://github.com/ekbann/rpi-basilisk2-sdl2-nox?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">rpi-basilisk2-sdl2-nox</a></td><td><div><p>a script to build Basilisk II on a Raspberry Pi with no X11 dependencies</p>
</div></td></tr><tr><td><a href="https://github.com/twvd/snow?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">snow</a></td><td><div><p>a new classic 68K Mac emulator that emphasises accurate emulation and debugging features</p>
</div></td></tr><tr><td><a href="https://www.macintoshrepository.org/44146-mr-browser?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MR Browser</a></td><td><div><p>a package manager for emulated classic Macs</p>
</div></td></tr><tr><td rowspan="7">2026</td><td><a href="https://github.com/autc04/Retro68?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Retro68</a></td><td><div><p>A GCC-based cross-compilation environment for building 68K and PowerPC Macintosh software, including modern hobby projects and tiny utilities for classic Mac emulators.</p>
</div></td></tr><tr><td><a href="https://github.com/likeablob/cydintosh?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Cydintosh</a></td><td><div><p>A Macintosh Plus emulator port for the Cheap Yellow Display ESP32 board, bundled with a few tiny 68k Mac applications and repurposed as a smart-home status display.</p>
</div></td></tr><tr><td><a href="https://github.com/mplsllc/macsurf?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MacSurf</a></td><td><div><p>a modern web browser for Classic Mac OS 9 PowerPC with CSS3, ES5 JavaScript, and native HTTPS</p>
</div></td></tr><tr><td><a href="https://github.com/retrotheory/pico-mac?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pico-mac</a></td><td><div><p>Runs the umac emulator on a Raspberry Pi Pico, with VGA output.</p>
</div></td></tr><tr><td><a href="https://github.com/vitorallo/macframe-releases?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Macframe</a></td><td><div><p>An IBM mainframe emulator for macOS distributed as release downloads</p>
</div></td></tr><tr><td><a href="https://www.gryphel.com/c/sw/sysutils/speedmtr/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">speedmtr</a></td><td><div><p>A classic Mac benchmarking utility distributed via Gryphel (archive of classic Mac software)</p>
</div></td></tr><tr><td><a href="https://www.v68k.org/advanced-mac-substitute/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Advanced Mac Substitute</a></td><td><div><p>An API-level reimplementation of classic 68K Mac OS that runs old Mac applications without an Apple ROM or original system software.</p>
</div></td></tr><tr><td>Multi-system</td><td>2025</td><td><a href="https://github.com/JMBeresford/retrom?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">retrom</a></td><td><div><p>a centralized management service that serves up web-based emulated games</p>
</div></td></tr><tr><td rowspan="2">N64</td><td rowspan="2">2010</td><td><a href="http://code.google.com/p/mupen64plus?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">mupen64plus</a></td><td><div><p>a less polished but cross-platform alternative</p>
</div></td></tr><tr><td><a href="http://www.sixtyforce.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Sixtyforce</a></td><td><div><p>A N64 emulator with the ability to render games in high resolution.</p>
</div></td></tr><tr><td>Newton</td><td>2025</td><td><a href="https://github.com/pguyot/Einstein?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Einstein</a></td><td><div><p>Newton MessagePad emulator for multiple platforms</p>
</div></td></tr><tr><td>Nintendo 3DS</td><td>2020</td><td><a href="https://citra-emu.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Citra</a></td><td><div><p>formerly available for Android with motion controls</p>
</div></td></tr><tr><td rowspan="10">Other</td><td rowspan="4">2024</td><td><a href="https://github.com/buserror/libmui?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">libmui</a></td><td><div><p>a <em>brilliant</em> Classic MacOS &amp; GS/OS widget library for linux used in the
Apple IIe emulator</p>
</div></td></tr><tr><td><a href="https://github.com/buserror/mii_emu?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">mii_emu</a></td><td><div><p>an Apple IIe Emulator for Linux</p>
</div></td></tr><tr><td><a href="https://github.com/pdewacht/oberon-risc-emu?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">oberon-risc-emu</a></td><td><div><p>Emulator for the Oberon RISC machine</p>
</div></td></tr><tr><td><a href="https://twisteros.com?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Twister OS</a></td><td><div><p>a set of UI themes and prebuilt ARM images to turn XFCE into faithful
reproductions of older OSes</p>
</div></td></tr><tr><td rowspan="6">2026</td><td><a href="https://github.com/habedi/rocket68?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">rocket68</a></td><td><div><p>C11 Motorola 68000 CPU emulator library focused on correctness, precise
cycle counting, and easy embedding into retro projects.</p>
</div></td></tr><tr><td><a href="https://github.com/jevonlipsey/pico-ios?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Pocket8 / pico-ios</a></td><td><div><p>Native PICO-8 companion for iOS that embeds the official engine via WASM, adding instant save/load states, adaptive controls, and a smart library for cartridges.</p>
</div></td></tr><tr><td><a href="https://github.com/rochus-keller/OberonSystem3Native?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">OberonSystem3Native</a></td><td><div><p>Native port of Oberon System 3 for modern Windows units, complete with
build scripts, packaging artifacts, and usage notes.</p>
</div></td></tr><tr><td><a href="https://github.com/shinyquagsire23/Klepton?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Klepton</a></td><td><div><p>JIT-less relinker and compatibility layer for running Quest/Android XR APKs on visionOS and macOS</p>
</div></td></tr><tr><td><a href="https://oberon.ethz.ch/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Oberon System (ETH)</a></td><td><div><p>Official ETH Zurich archive for the Oberon language and operating system,
including System 3 downloads, documentation, and research notes.</p>
</div></td></tr><tr><td><a href="https://www.projectoberon.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Project Oberon</a></td><td><div><p>Niklaus Wirth’s Project Oberon site: the book, FPGA schematics, and step-
by-step guides to recreate Oberon hardware.</p>
</div></td></tr><tr><td rowspan="2">PalmOS</td><td rowspan="2">2024</td><td><a href="https://github.com/cloudpilot-emu/cloudpilot-emu?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">cloudpilot-emu</a></td><td><div><p>a cloud-based emulator for running PalmOS applications that works on the iPhone</p>
</div></td></tr><tr><td><a href="https://github.com/meepingsnesroms/Mu?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Mu</a></td><td><div><p>PalmOS Emulator</p>
</div></td></tr><tr><td>Psion</td><td>2024</td><td><a href="https://github.com/Treeki/WindEmu?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">WindEmu</a></td><td><div><p>emulator for Psion Series 5mx (Windermere)</p>
</div></td></tr><tr><td rowspan="3">RISC-V</td><td>2025</td><td><a href="https://github.com/ringtailsoftware/uvm32?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">uvm32</a></td><td><div><p>a minimalist, dependency-free virtual machine sandbox that emulates a 32-bit RISC-V CPU that can run DooM</p>
</div></td></tr><tr><td rowspan="2">2026</td><td><a href="https://github.com/rochus-keller/OberonSystem/tree/op2-rv32?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">OberonSystem</a></td><td><div><p>RV32 variant of the OberonSystem project</p>
</div></td></tr><tr><td><a href="https://github.com/wkoszek/emuko?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Emuko</a></td><td><div><p>Fast RISC-V emulator written in Rust that can boot Linux and targets modern systems.</p>
</div></td></tr><tr><td rowspan="3">Retrocomputing</td><td>2023</td><td><a href="https://github.com/TomHarte/CLK?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Clock Signal</a></td><td><div><p>a multi-system emulator that works beautifully on a Mac</p>
</div></td></tr><tr><td>2025</td><td><a href="https://benbridle.com/projects/bedrock?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Bedrock</a></td><td><div><p>8-bit virtual computer system specification with assembler/emulators for PC, web, and Nintendo DS</p>
</div></td></tr><tr><td>2026</td><td><a href="https://github.com/rommapp/romm?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">RomM</a></td><td><div><p>A beautiful self-hosted ROM manager and player with metadata scraping, browser-based UI, and built-in EmulatorJS/RuffleRS players for hosting and sharing emulation collections.</p>
</div></td></tr><tr><td rowspan="5">Sinclair</td><td rowspan="2">2010</td><td><a href="http://fuse-for-macosx.sourceforge.net/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Fuse</a></td><td><div><p>A recent port of the cross-platform ZX Spectrum emulator</p>
</div></td></tr><tr><td><a href="http://k1.dyndns.org/Develop/projects/zxsp-osx/distributions/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">zxsp</a></td><td><div><p>Emulates a range of Z80-based devices, including the ZX81 I started out with.</p>
</div></td></tr><tr><td>2023</td><td><a href="https://github.com/fruit-bat/pico-zxspectrum?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pico-zxspectrum</a></td><td><div><p>a ZX Spectrum emulator for for the Raspberry Pico RP2040 MCU</p>
</div></td></tr><tr><td>2024</td><td><a href="https://github.com/antirez/zx2040?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">zx2040</a></td><td><div><p>a ZX Spectrum emulator for the Raspberry Pi Pico</p>
</div></td></tr><tr><td>2025</td><td><a href="https://zxmini.speccy.org/en/index.html?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ZXBaremulator</a></td><td><div><p>a complete ZX Spectrum 48K/128K/+2A bare-metal emulator</p>
</div></td></tr><tr><td rowspan="2">Switch</td><td>2023</td><td><a href="https://github.com/Ryujinx/Ryujinx?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Ryujinx</a></td><td><div><p>Very good performance on Apple Silicon</p>
</div></td></tr><tr><td>2024</td><td><a href="https://github.com/sudachi-emu/sudachi?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">sudachi</a></td><td><div><p>Another yuzu fork</p>
</div></td></tr><tr><td>Terminals</td><td>2026</td><td><a href="https://github.com/mmastrac/blaze?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Blaze</a></td><td><div><p>a VT420 terminal emulator written in Rust</p>
</div></td></tr><tr><td rowspan="2">Tools</td><td>2024</td><td><a href="https://github.com/retronas/retronas?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">retronas</a></td><td><div><p>network storage for different retro computers and consoles</p>
</div></td></tr><tr><td>2026</td><td><a href="https://github.com/MemoireMorte/Memo-1?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Memo-1</a></td><td><div><p>simple 6502-based computer project</p>
</div></td></tr><tr><td>Wii U</td><td>2022</td><td><a href="https://github.com/cemu-project/Cemu?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Cemu</a></td><td><div><p>Very good performance on Apple Silicon</p>
</div></td></tr><tr><td>Wii/GameCube</td><td>2011</td><td><a href="http://www.dolphin-emulator.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Dolphin</a></td><td><div><p>An amazing Wii and GameCube emulator</p>
</div></td></tr><tr><td rowspan="3">Windows</td><td>2024</td><td><a href="https://github.com/AndreRH/hangover?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">hangover</a></td><td><div><p>enables running Win32 applications on aarch64 Linux using various DLLs
for improved performance.</p>
</div></td></tr><tr><td rowspan="2">2025</td><td><a href="https://github.com/PluMGMK/vbesvga.drv?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">vbesvga.drv</a></td><td></td></tr><tr><td><a href="https://github.com/TibixDev/winboat?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">winboat</a></td><td><div><p>a Windows VM wrapper that uses RDP and RemoteApp to render apps on Linux</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
</entry>
<entry>
<title>Notes for August 3-8</title>
<id>https://taoofmac.com/space/notes/2026/08/08/1200?utm_content=atom</id>
<published>2026-08-08T12:00:00+00:00</published>
<updated>2026-08-08T12:55:59+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/08/08/1200?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/notes/2026/08/08/1200?utm_content=atom">Notes for August 3-8</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-08T12:00:00+00:00">2026-08-08T12:00:00+00:00</xhtml:time><xhtml:p>I have a problem. Or, rather, I have two problems: I have been spending far too much time messing about with AI instead of reading. I end up zoning out in ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">I have a problem. Or, rather, I have <em>two</em> problems:</p>
<ul>
<li>I have been spending far too much time messing about with <a href="/space/ai#artificial-intelligence" rel="next">AI</a> instead of reading.</li>
<li>I end up zoning out in front of YouTube and, even with serious attempts at curating my feed, I spend far more time than I should there.</li>
</ul>
<p>I’ve <a href="/space/blog/2026/01/17/2130#impending-doom-is-a-great-incentive-to-focus" rel="next">griped about this before</a>, but this week I decided to take some time to fine-tune the friction around those activities–removing or adding it as needed.</p>
<a id="anchor-e-ink-and-calibre-mcp" class="anchor" href="/space/notes/2026/08/08/1200#e-ink-and-calibre-mcp" rel="anchor"><h2 id="e-ink-and-calibre-mcp">E-Ink and Calibre MCP</h2></a>
<p>My <a href="/space/apps/calibre" rel="next">Calibre</a> library has grown somewhat out of hand, either due to automated additions (I have been getting the web edition of The Economist delivered through it for <a href="/space/blog/2013/08/18/1050#summer-hardware" rel="next">well over a decade</a>) or lack of proper curation, so I decided to use <a href="/space/ai#artificial-intelligence" rel="next">AI</a> to see if I could remove the friction involved in finding something to read (or re-read) and have it either e-mailed to my <a href="/space/reviews/2025/01/18/2335#the-supernote-a6x2-nomad" rel="next">Nomad</a> via <a href="/space/com/amazon/kindle" rel="next">Kindle</a> or easily accessible on my <a href="/space/reviews/2026/04/04/1800#the-xteink-x4" rel="next">Xteink X4</a>.</p>
<p>That mostly meant figuring out how to get an <a href="/space/ai/mcp#model-context-protocol" rel="next">MCP</a> server working with <a href="/space/apps/calibre" rel="next">Calibre</a>, but it ended up including a parallel side quest to improve <a href="https://github.com/rcarmo/bun-readlater-epub?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>bun-readlater-epub</code></a> and <a href="https://github.com/rcarmo/bun-opds-server?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>bun-opds-server</code></a> to see if I could make it easier to queue up and download long-form content.</p>
<blockquote>
<p>As an aside, recent revisions of <a href="https://github.com/crosspoint-reader/crosspoint-reader?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">CrossPoint</a> have a Wi-Fi bug that prevents the <a href="/space/reviews/2026/04/04/1800#the-xteink-x4" rel="next">Xteink X4</a> from joining our Wi-Fi (apparently because it fails to use a coherent MAC address), so I have to import things via its hotspot (which automatically optimises the <a href="markup/epub" rel="nofollow">EPUBs</a>). I suspect I will eventually have to fix it myself when I have more time, because the maintainers have been unable to do it for two releases now…</p>
</blockquote>
<p>The <em>real</em> improvement, though, was <em>how</em> I decided to design <a href="https://github.com/rcarmo/python-umcp-calibre?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">my own MCP server</a> for automating <a href="/space/apps/calibre" rel="next">Calibre</a>. Most existing implementations out there are either sidecars that can’t manipulate <a href="/space/apps/calibre" rel="next">Calibre</a> data or CLI wrappers that inevitably contend with <a href="/space/apps/calibre" rel="next">Calibre</a> access to its library databases, so I took the plugin route and built one that runs <em>inside</em> it and can thus use <em>everything</em>: metadata editing, conversions, moving books between libraries, e-mailing them to me, the works:</p>
<p></p><figure><img src="/space/notes/2026/08/08/1200/weekly-calibre.png?v=7c4e6bdbe851" alt="uMCP Bridge in Calibre" width="2334" height="1692"/><figcaption>uMCP Bridge in Calibre</figcaption></figure><p></p>
<p>This effectively means I can now point any AI agent to <a href="/space/apps/calibre" rel="next">Calibre</a> and tell it literally:</p>
<ul>
<li>find me the last three books by X and e-mail them to my Kindle address</li>
<li>grab this URL and import it into the Incoming library</li>
<li>change ratings programmatically</li>
<li>find and remove duplicates across libraries…</li>
</ul>
<p>There’s no practical limit, really, although I might need to hack a few more things in. And since it uses the native job engine, everything works correctly.</p>
<p>The biggest quality-of-life improvement is that I don’t need to access the UI anymore. Since I have been running the extra-clunky <a href="https://docs.linuxserver.io/images/docker-calibre/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Selkies-based container</a> (which streams the desktop using its own thing and works very poorly on the iPad), there’s no more browser logins, slow wading through listings, or finicky right-clicking.</p>
<p>As an encore, since I wanted to maximise the time I could spend on the <a href="/space/reviews/2025/01/18/2335#the-supernote-a6x2-nomad" rel="next">Nomad</a>, I also updated <a href="https://github.com/rcarmo/picoflux?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>picoflux</code></a> and tweaked the e-ink theme I bolted on a month or so ago.</p>
<a id="anchor-old-timey-tv-shenanigans" class="anchor" href="/space/notes/2026/08/08/1200#old-timey-tv-shenanigans" rel="anchor"><h2 id="old-timey-tv-shenanigans">Old-Timey TV Shenanigans</h2></a>
<p>That removed a lot of the friction around reading. Next, I needed to <em>add</em> friction to watching YouTube videos.</p>
<p>I recently spent a little while fiddling with <a href="https://jellyfin.org/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Jellyfin</a>–partly because I do that on occasion to see if it’s finally a decent alternative to <a href="/space/apps/plex" rel="next">Plex</a> (spoiler: not yet, by miles), but also due to my infrequent investigations into the state of hardware video decoding (<a href="https://github.com/rcarmo/go-264?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>go-264</code></a> will eventually go down that path).</p>
<p>This time I wanted to hack it into a sort of anti-YouTube setup and see if I could replicate the old-timey, “synchronous” TV-watching experience, so I literally told <a href="https://rcarmo.github.io/projects/piclaw/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>piclaw</code></a>:</p>
<blockquote>
<p><em>I want you to create a Debian 13 LXC in radxax4 to host Jellyfin, mounting <code>smb://zfs/video</code> as a read-only remote media library (so keep the LXC filesystem small, please). You can pick the best way to deploy Jellyfin as long as you manage to get hardware video processing working and document it in Obsidian. After that is done install <code>jellyfin-plugin-livechannels</code> or a similar TV simulation channel and create appropriate “channels” based on the contents of the media library.</em></p>
</blockquote>
<p>Fifteen minutes later, I had the entire thing <em>working</em>. Not half-assed or poorly installed, <em>working</em>, with the media mounted read-only (twice, once on the <a href="/space/os/linux/distributions/proxmox#proxmox-ve" rel="next">Proxmox</a> host and again inside the LXC), QSV hardware transcoding and a full installation and configuration brief in <a href="/space/apps/obsidian" rel="next">Obsidian</a> (the output is a tad long, but here’s the last part):</p>
<p></p><figure><img src="/space/notes/2026/08/08/1200/jellyfin-installation-summary.png?v=37d5e6903420" alt="Jellyfin installation and hardware transcoding summary" width="1178" height="1156"/><figcaption>Jellyfin installation and hardware transcoding summary</figcaption></figure><p></p>
<p>Of course Jellyfin immediately filled the filesystem with artwork and people metadata, so that was (automatically) upgraded, but hey, it was a valiant effort.</p>
<p>Then I went to town on <a href="https://github.com/JPKribs/jellyfin-plugin-livechannels?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">the original plugin</a> and decided to bolt on <a href="https://invidious.io/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Invidious</a> as a YouTube source:</p>
<p></p><figure><img src="/space/notes/2026/08/08/1200/jellyfin-livetube-guide.jpg?v=70abc2aa0860" alt="Jellyfin LiveTube channel guide on a television" width="1280" height="960"/><figcaption>Jellyfin LiveTube channel guide on a television</figcaption></figure><p></p>
<p>I call it <a href="https://github.com/rcarmo/dotnet-jellyfin-livetube?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>jellyfin-livetube</code></a>, and it’s been working pretty well–even the standard library-backed channels have been a surprising amount of fun (I ended up rewatching <a href="https://www.imdb.com/title/tt0080745?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Flash Gordon</a> purely by chance).</p>
<a id="anchor-wrdp-s-15-seconds-of-fame" class="anchor" href="/space/notes/2026/08/08/1200#wrdp-s-15-seconds-of-fame" rel="anchor"><h2 id="wrdp-s-15-seconds-of-fame"><code>wrdp</code>’s 15 Seconds of Fame</h2></a>
<p>Speaking of YouTube, <a href="https://twitter.com/@tekwendell?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Wendell Wilson</a> (hi there!) featured my new <a href="https://github.com/rcarmo/wrdp?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>wrdp</code></a> project in <a href="https://www.youtube.com/watch?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com&amp;v=C9ZPOg8lK6o%3Fis" rel="external">the latest Linux weekly video</a>, which was fun to see (especially since I found out over breakfast while checking my messages, before coffee kicked in).</p>
<p>Right now it is <em>mostly</em> working, even though I am still waiting on a critical PR to make it into <a href="https://github.com/Devolutions/IronRDP?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">IronRDP</a> to improve internal session management. But login and Wayland session creation both work, it’s all hardware-accelerated (both EGL desktop acceleration and VA-API video encoding), and… there are all sorts of edge cases to sort through.</p>
<p>I will be poking at it irregularly over the next few weeks–I want to do ARM/Vulkan acceleration next and set up two separate remote desktops I use “regularly”, but first I need a bit of digital detoxing, which is something I am very much failing at.</p>
<a id="anchor-moar-agents-minis-agents-moar" class="anchor" href="/space/notes/2026/08/08/1200#moar-agents-minis-agents-moar" rel="anchor"><h2 id="moar-agents-minis-agents-moar">Moar Agents! Minis Agents! Moar</h2></a>
<p>Because I was clearly left unsupervised and can’t really stop doing agent-related stuff, I went down the rabbit hole of setting up <a href="/space/links/2026/07/20/2213#open-minis-is-the-ios-agent-i-wish-siri-ai-could-be" rel="next">Open Minis</a> on my iPad Pro, and I did it in the most “me” way possible–I got it to connect to <a href="https://rcarmo.github.io/projects/memento/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Memento</a> and “learn” from the accumulated knowledge of all my <a href="https://rcarmo.github.io/projects/piclaw/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>piclaw</code></a> agents, which is <em>awesome</em> because it proves two points:</p>
<ul>
<li><a href="https://rcarmo.github.io/projects/memento/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Memento</a> works <em>perfectly</em> for the purpose it was designed for.</li>
<li><em>It doesn’t matter</em> which agent harness you use as long as you document things properly.</li>
</ul>
<p>Thirty minutes after I began, I already had most of the <code>SKILL.md</code> files and scripts ported across, and an hour later I had “native” equivalents to manage <a href="/space/os/linux/distributions/proxmox#proxmox-ve" rel="next">Proxmox</a> and <a href="/space/os/linux/docker/portainer" rel="next">Portainer</a> and was doing various shenanigans to generate and post screenshots along with my link post drafts, which these days are posted using the GitHub API directly (again, refactoring an existing <code>SKILL.md</code>).</p>
<p>I can now confirm that <a href="/space/links/2026/07/20/2213#open-minis-is-the-ios-agent-i-wish-siri-ai-could-be" rel="next">Open Minis</a> is, indeed, the Siri I have been wishing for. It’s by no means perfect, but with a SOTA model driving it, it can build its own tools, and… I really should stop now and go read a book or something.</p>

<br/>
]]></content>
<category term="agents" label="agents" />
<category term="ai" label="ai" />
<category term="calibre" label="calibre" />
<category term="eink" label="eink" />
<category term="homelab" label="homelab" />
<category term="jellyfin" label="jellyfin" />
<category term="notes" label="notes" />
<category term="reading" label="reading" />
<category term="weekly" label="weekly" />
<category term="youtube" label="youtube" />
</entry>
<entry>
<title>EPUB</title>
<id>https://taoofmac.com/space/markup/epub?utm_content=atom</id>
<published>2026-08-08T12:00:00+00:00</published>
<updated>2026-08-09T13:41: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/markup/epub?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/markup/epub?utm_content=atom">EPUB</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-08T12:00:00+00:00">2026-08-08T12:00:00+00:00</xhtml:time><xhtml:p>EPUB is an open W3C format for distributing digital publications as a single file. It packages structured web content–primarily XHTML, CSS, SVG, images and ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead"><a href="https://www.w3.org/TR/epub-33/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUB</a> is an open W3C format for distributing digital publications as a single file. It packages structured web content–primarily <a href="/space/markup/html" rel="next">XHTML</a>, <a href="/space/markup/css" rel="next">CSS</a>, <a href="/space/markup/svg#scalable-vector-graphics" rel="next">SVG</a>, images and fonts–with metadata, navigation and a defined reading order.</p>
<p>Most EPUB publications are reflowable, allowing a reading system to adapt text to the screen and the reader’s font, spacing and colour preferences. The format also supports fixed layouts, media overlays, scripting, page lists and landmarks, but readers implement those features inconsistently.</p>
<a id="anchor-container-and-publication-structure" class="anchor" href="/space/markup/epub#container-and-publication-structure" rel="anchor"><h2 id="container-and-publication-structure">Container and Publication Structure</h2></a>
<p>An <code>.epub</code> file is an Open Container Format ZIP archive with the media type <code>application/epub+zip</code>. Its root <code>mimetype</code> file identifies the format, and <code>META-INF/container.xml</code> points to the package document.</p>
<p>The package document contains the publication metadata, a manifest of resources and a spine that defines the default reading order. A separate XHTML navigation document provides the table of contents and can also include page and landmark navigation.</p>
<a id="anchor-versions-and-compatibility" class="anchor" href="/space/markup/epub#versions-and-compatibility" rel="anchor"><h2 id="versions-and-compatibility">Versions and Compatibility</h2></a>
<p><a href="https://www.w3.org/TR/epub-33/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUB 3.3</a> is the W3C Recommendation as of 13 January 2026. It retains the EPUB 3 package version value <code>3.0</code> and supersedes the EPUB 2 specifications. The companion <a href="https://www.w3.org/TR/epub-rs-33/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Reading Systems specification</a> requires readers to attempt to process older publications.</p>
<p>EPUB 2 remains common in older libraries and devices. Its NCX table of contents and other legacy package features can be included in EPUB 3 files for compatibility, but new publications should use the EPUB 3 navigation document and current metadata model.</p>
<a id="anchor-accessibility" class="anchor" href="/space/markup/epub#accessibility" rel="anchor"><h2 id="accessibility">Accessibility</h2></a>
<p>EPUB content uses the accessibility semantics of XHTML, SVG and related web standards. <a href="https://www.w3.org/TR/epub-a11y-11/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUB Accessibility 1.1</a> adds publication-wide conformance and discoverability requirements, including accessibility metadata, logical reading order and navigation.</p>
<p><a href="https://github.com/w3c/epubcheck?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUBCheck</a> verifies format conformance, and <a href="https://daisy.github.io/ace/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Ace by DAISY</a> reports many accessibility issues. Complete validation also requires testing the publication with representative reading systems and assistive technology.</p>
<a id="anchor-drm-and-interoperability" class="anchor" href="/space/markup/epub#drm-and-interoperability" rel="anchor"><h2 id="drm-and-interoperability">DRM and Interoperability</h2></a>
<p>EPUB itself does not require digital rights management. Its container supports encryption metadata, but distributors apply mutually incompatible commercial DRM schemes. Those schemes can block copying, text-to-speech or transfer between reading systems even when the underlying EPUB is valid.</p>
<p>DRM-free publications can still render differently because reading systems vary in CSS, font, scripting, fixed-layout and media support. Reflowable XHTML with conservative CSS works across the widest range of readers.</p>
<a id="anchor-authoring-and-validation" class="anchor" href="/space/markup/epub#authoring-and-validation" rel="anchor"><h2 id="authoring-and-validation">Authoring and Validation</h2></a>
<p><a href="/space/apps/calibre" rel="next">Calibre</a> can convert, inspect and manage EPUB files, while <a href="/space/apps/sigil" rel="next">Sigil</a> edits the package and its content directly. A publishing workflow should run EPUBCheck after every structural change, then use Ace and manual accessibility testing.</p>
<p>Since an EPUB is a ZIP archive, ordinary archive tools are useful for inspection, but repackaging must preserve the OCF rules–in particular, <code>mimetype</code> must be the first entry and must remain uncompressed.</p>
<a id="anchor-finding-books" class="anchor" href="/space/markup/epub#finding-books" rel="anchor"><h2 id="finding-books">Finding Books</h2></a>
<p><a href="https://standardebooks.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Standard Ebooks</a> publishes free, carefully produced public-domain books in EPUB format, with consistent typography, metadata and compatibility across reading systems.</p>
<a id="anchor-resources" class="anchor" href="/space/markup/epub#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td>Collections</td><td>2025</td><td><a href="https://standardebooks.org?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Standard Ebooks</a></td><td><div><p>free, carefully produced public-domain books in EPUB format</p>
</div></td></tr><tr><td>Guides</td><td>2025</td><td><a href="https://www.w3.org/TR/epub-overview-33/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUB 3 Overview</a></td><td><div><p>non-normative introduction to EPUB 3</p>
</div></td></tr><tr><td>Libraries</td><td>2026</td><td><a href="https://github.com/arc53/fast-ebook?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">fast-ebook</a></td><td><div><p>Rust-powered Python library for reading, writing, validating and converting EPUB 2 and EPUB 3 files</p>
</div></td></tr><tr><td rowspan="2">Readers</td><td>2024</td><td><a href="https://johnfactotum.github.io/foliate/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Foliate</a></td><td><div><p>ebook reader for Linux with EPUB support</p>
</div></td></tr><tr><td>2011</td><td><a href="https://github.com/sakisds/pPub?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pPub</a></td><td><div><p>Python-based EPUB reader</p>
</div></td></tr><tr><td rowspan="3">Specifications</td><td>2026</td><td><a href="https://www.w3.org/TR/epub-33/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUB 3.3</a></td><td><div><p>W3C authoring and container specification</p>
</div></td></tr><tr><td rowspan="2">2024</td><td><a href="https://www.w3.org/TR/epub-a11y-11/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUB Accessibility 1.1</a></td><td><div><p>accessibility conformance and discoverability requirements</p>
</div></td></tr><tr><td><a href="https://www.w3.org/TR/epub-rs-33/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUB Reading Systems 3.3</a></td><td><div><p>processing and rendering requirements for reading systems</p>
</div></td></tr><tr><td rowspan="2">Tools</td><td rowspan="2">{date:%Y}</td><td><a href="/space/apps/calibre" rel="next">Calibre</a></td><td><div><p>library management, conversion and inspection</p>
</div></td></tr><tr><td><a href="/space/apps/sigil" rel="next">Sigil</a></td><td><div><p>EPUB editor</p>
</div></td></tr><tr><td rowspan="2">Validation</td><td rowspan="2">{date:%Y}</td><td><a href="https://daisy.github.io/ace/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Ace by DAISY</a></td><td><div><p>automated accessibility checker for EPUB publications</p>
</div></td></tr><tr><td><a href="https://github.com/w3c/epubcheck?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPUBCheck</a></td><td><div><p>official EPUB conformance checker</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="accessibility" label="accessibility" />
<category term="ebook" label="ebook" />
<category term="epub" label="epub" />
<category term="publishing" label="publishing" />
<category term="standards" label="standards" />
<category term="w3c" label="w3c" />
</entry>
<entry>
<title>Agentic Systems</title>
<id>https://taoofmac.com/space/ai/agentic?utm_content=atom</id>
<published>2025-12-23T10:00:00+00:00</published>
<updated>2026-08-08T08: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/ai/agentic?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/ai/agentic?utm_content=atom">Agentic Systems</xhtml:a></xhtml:h2><xhtml:time datetime="2025-12-23T10:00:00+00:00">2025-12-23T10:00:00+00:00</xhtml:time><xhtml:p>Notes and resources on building and operating agentic AI systems, covering orchestration frameworks, task routing, memory, and evaluation approaches that ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">Notes and resources on building and operating agentic AI systems, covering orchestration frameworks, task routing, memory, and evaluation approaches that extend baseline <a href="/space/ai/llm" rel="next">LLM</a> capabilities.</p>
<a id="anchor-skills" class="anchor" href="/space/ai/agentic#skills" rel="anchor"><h2 id="skills">Skills</h2></a>
<p>Reusable instruction packs, workflow recipes, and prompt modules live in <a href="/space/ai/agentic/skills" rel="next">Agentic Skills</a>.</p>
<a id="anchor-openclaw" class="anchor" href="/space/ai/agentic#openclaw" rel="anchor"><h2 id="openclaw">OpenClaw</h2></a>
<p>OpenClaw-specific projects and lightweight variants live in <a href="/space/ai/agentic/openclaw" rel="next">OpenClaw Ecosystem</a>.</p>
<a id="anchor-pi-dev" class="anchor" href="/space/ai/agentic#pi-dev" rel="anchor"><h2 id="pi-dev">Pi.dev</h2></a>
<p>Pi.dev is the home of the Pi coding agent and its ecosystem of extensions, adapters, and clients. See the <a href="/space/ai/agentic/pi" rel="next">Pi.dev Ecosystem</a> page for the curated project list.</p>
<a id="anchor-resources" class="anchor" href="/space/ai/agentic#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Field</th><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td></td><td>Tools</td><td>2026</td><td><a href="https://github.com/gi-dellav/zerostack?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">zerostack</a></td><td><div><p>Minimalistic coding agent in Rust, optimised for low memory footprint and performance.</p>
</div></td></tr><tr><td rowspan="12">Agent Frameworks</td><td rowspan="9">Frameworks</td><td rowspan="4">2026</td><td><a href="https://github.com/DrChrisLevy/liteagent?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">liteagent</a></td><td><div><p>minimal Python async agent loop ported from pi-mono, exposing streaming, steering, follow-ups, and sequential tool execution on top of LiteLLM.</p>
</div></td></tr><tr><td><a href="https://github.com/jamiebeach/lisp-agent?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">lisp-agent</a></td><td><div><p>Common Lisp framework for creating AI agents</p>
</div></td></tr><tr><td><a href="https://github.com/microsoft/hve-core?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">HVE Core</a></td><td><div><p>enterprise prompt engineering framework for GitHub Copilot with constraint-based workflows, validated artifacts, and RPI methodology</p>
</div></td></tr><tr><td><a href="https://github.com/withastro/flue?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Flue</a></td><td><div><p>a programmable TypeScript harness from the Astro team for building autonomous agents and AI workflows as code rather than via an SDK</p>
</div></td></tr><tr><td rowspan="5">2025</td><td><a href="https://github.com/Pravko-Solutions/FlashLearn?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">FlashLearn</a></td><td><div><p>a simple interface for incorporating Agent LLMs</p>
</div></td></tr><tr><td><a href="https://github.com/agno-agi/agno?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">agno</a></td><td><div><p>a lightweight library for building Multimodal Agents</p>
</div></td></tr><tr><td><a href="https://github.com/crewAIInc/crewAI?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">crewAI</a></td><td><div><p>framework for orchestrating role-playing, autonomous AI agents (multi-agent automation)</p>
</div></td></tr><tr><td><a href="https://github.com/inngest/agent-kit?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">AgentKit</a></td><td><div><p>build multi-agent networks in TypeScript with deterministic routing and rich tooling via MCP</p>
</div></td></tr><tr><td><a href="https://github.com/microsoft/agent-framework?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Agent Framework</a></td><td><div><p>Microsoft open-source agentic framework</p>
</div></td></tr><tr><td>Samples</td><td>2026</td><td><a href="https://github.com/cloudflare/agents-starter?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Cloudflare Agents Starter</a></td><td><div><p>starter template for building AI chat agents on Cloudflare Workers with tools, scheduling, and real-time streaming</p>
</div></td></tr><tr><td rowspan="2">Tools</td><td rowspan="2">2026</td><td><a href="https://github.com/microsoft/agent-lightning?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Agent Lightning</a></td><td><div><p>training and optimization toolkit for AI agents across frameworks</p>
</div></td></tr><tr><td><a href="https://github.com/sachitrafa/YourMemory?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">YourMemory</a></td><td><div><p>a persistent memory layer for AI agents and MCP clients with SQLite/Postgres backends</p>
</div></td></tr><tr><td>Agent Knowledge</td><td>Frameworks</td><td>2025</td><td><a href="https://github.com/42futures/firm?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">firm</a></td><td><div><p>an ontology framework for structuring agent knowledge about businesses</p>
</div></td></tr><tr><td rowspan="6">Agent Memory</td><td rowspan="6">Tools</td><td rowspan="4">2026</td><td><a href="https://github.com/mnemosyne-oss/mnemosyne?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">mnemosyne</a></td><td><div><p>zero-cloud AI memory system with SQLite backend</p>
</div></td></tr><tr><td><a href="https://github.com/raiyanyahya/recall?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">recall</a></td><td><div><p>AI memory/recall system for agents and knowledge retention</p>
</div></td></tr><tr><td><a href="https://github.com/steveyegge/beads?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">beads</a></td><td><div><p>a distributed, git-backed issue tracker and memory system experiment for AI agents</p>
</div></td></tr><tr><td><a href="https://github.com/thedotmack/claude-mem?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">claude-mem</a></td><td><div><p>a persistent memory compression system for Claude Code with search tools</p>
</div></td></tr><tr><td rowspan="2">2025</td><td><a href="https://github.com/agiresearch/A-mem?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">AgenticMemory</a></td><td><div><p>a tool for creating and managing memory in LLMs</p>
</div></td></tr><tr><td><a href="https://github.com/letta-ai/letta?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">letta</a></td><td><div><p>a tool for creating and managing memory-backed agents</p>
</div></td></tr><tr><td rowspan="4">Agent Platforms</td><td rowspan="3">Platforms</td><td>2026</td><td><a href="https://github.com/rivet-dev/rivet?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Rivet</a></td><td><div><p>Actor-based agent platform that bundles state, storage, workflows, scheduling, and WebSockets into self-hostable Rust binaries or managed cloud runtimes, letting each agent run as a persistent, stateful primitive with built-in persistence and tooling.</p>
</div></td></tr><tr><td rowspan="2">2025</td><td><a href="https://github.com/helixml/helix?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">HelixML</a></td><td><div><p>an interesting enterprise-grade agentic platform with tools for integration and observability</p>
</div></td></tr><tr><td><a href="https://github.com/simstudioai/sim?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Sim</a></td><td><div><p>open-source platform to build and deploy AI agent workflows</p>
</div></td></tr><tr><td>Tools</td><td>2026</td><td><a href="https://github.com/openyak/desktop?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">OpenYak</a></td><td><div><p>open-source desktop AI assistant that runs locally with MCP support, for file management, data analysis, and office automation without cloud uploads.</p>
</div></td></tr><tr><td rowspan="14">Agent Systems</td><td rowspan="3">Frameworks</td><td>2026</td><td><a href="https://github.com/bradygaster/squad?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Squad</a></td><td><div><p>AI agent teams for any project, built in TypeScript.</p>
</div></td></tr><tr><td>2025</td><td><a href="https://github.com/pixeltable/pixelagent?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pixelagent</a></td><td><div><p>an agent engineering blueprint</p>
</div></td></tr><tr><td>2024</td><td><a href="https://github.com/pipecat-ai/pipecat?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pipecat</a></td><td><div><p>yet another LLM agent framework</p>
</div></td></tr><tr><td>Samples</td><td>2024</td><td><a href="https://github.com/microsoft/TinyTroupe?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">TinyTroupe</a></td><td><div><p>a multiagent persona simulation</p>
</div></td></tr><tr><td rowspan="10">Tools</td><td rowspan="7">2026</td><td><a href="https://github.com/ZeframLou/call-me?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">CallMe</a></td><td><div><p>minimal Claude Code plugin that calls your phone/watch via Telnyx or Twilio (plus OpenAI/ngrok) when a task stalls or needs your input</p>
</div></td></tr><tr><td><a href="https://github.com/modem-dev/baudbot?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">baudbot</a></td><td><div><p>always-on, Slack-connected multi-agent dev assistant that runs tasks end-to-end on Linux</p>
</div></td></tr><tr><td><a href="https://github.com/onecli/onecli?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">OneCLI</a></td><td><div><p>credential vault and HTTP gateway for AI agents that stores secrets once, injects them transparently into outbound API calls, and keeps raw keys out of agent context.</p>
</div></td></tr><tr><td><a href="https://github.com/pinchtab/pinchtab?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Pinchtab</a></td><td><div><p>HTTP browser-control bridge that lets any agent drive Chrome via a compact, stealthy API, with snapshot/text modes, token-efficient read flows, and persistent sessions</p>
</div></td></tr><tr><td><a href="https://github.com/rtk-ai/rtk?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">rtk</a></td><td><div><p>Rust Token Killer CLI proxy that compresses command output before it reaches your Claude Code session, saving ~60‑90% of LLM tokens on git/status/test workflows with ultra-compact summaries and hook-first install.</p>
</div></td></tr><tr><td><a href="https://github.com/steipete/gogcli?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">gogcli</a></td><td><div><p>CLI for Google APIs (Gmail, Calendar, Drive, Docs, Sheets, Chat, etc.) with OAuth credential management, headless flows, and JSON/TSV/compact output modes tailored for agent interactions and automation.</p>
</div></td></tr><tr><td><a href="https://github.com/yessGlory17/argus?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Argus</a></td><td><div><p>VS Code extension that discovers Claude Code sessions, visualizes costs/performance, and surfaces rule-based findings to debug and tune agentic workflows without leaving your editor.</p>
</div></td></tr><tr><td>2025</td><td><a href="https://github.com/SciPhi-AI/R2R?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">R2R</a></td><td><div><p>production-ready AI retrieval system for agentic RAG via a REST API</p>
</div></td></tr><tr><td>2024</td><td><a href="https://github.com/plandex-ai/plandex?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">plandex</a></td><td><div><p>yet another long-running agent tool for complex coding tasks</p>
</div></td></tr><tr><td>2023</td><td><a href="https://github.com/Significant-Gravitas/Auto-GPT?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Auto-GPT</a></td><td><div><p>an attempt to provide ChatGPT with a degree of autonomy</p>
</div></td></tr><tr><td>Agentic Apps</td><td>Tools</td><td>2026</td><td><a href="https://github.com/runtypelabs/persona?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">persona</a></td><td><div><p>AI persona/companion platform for building agentic identity and interactions</p>
</div></td></tr><tr><td rowspan="17">Code Agents</td><td rowspan="3">Samples</td><td>2026</td><td><a href="https://github.com/cuneytozseker/TinyProgrammer?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">TinyProgrammer</a></td><td><div><p>A Raspberry Pi device that continuously writes, runs, watches and reflects on small Python programs using an LLM</p>
</div></td></tr><tr><td>2025</td><td><a href="https://github.com/microsoft/amplifier?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">amplifier</a></td><td><div><p>a technology demonstrater for agentic coding</p>
</div></td></tr><tr><td>2024</td><td><a href="https://github.com/modal-labs/devlooper?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">devlooper</a></td><td><div><p>a program synthesis agent that autonomously fixes its output by running tests</p>
</div></td></tr><tr><td rowspan="14">Tools</td><td rowspan="10">2026</td><td><a href="https://github.com/AntigmaLabs/ante?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ante</a></td><td><div><p>self-contained terminal agent harness</p>
</div></td></tr><tr><td><a href="https://github.com/MoonshotAI/kimi-cli?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">kimi-cli</a></td><td><div><p>CLI tool for interacting with the Kimi AI assistant</p>
</div></td></tr><tr><td><a href="https://github.com/cosmtrek/mindwalk/blob/main/README.md?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Mindwalk</a></td><td><div><p>visualization tool that replays coding-agent sessions on a 3D map of your codebase</p>
</div></td></tr><tr><td><a href="https://github.com/getpaseo/paseo?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Paseo</a></td><td><div><p>a self-hosted cross-device interface for Claude Code, Codex, Copilot, OpenCode, and Pi agents</p>
</div></td></tr><tr><td><a href="https://github.com/htdt/godogen?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Godogen</a></td><td><div><p>Claude Code pipeline (using two cooperative skills) that converts plain-language game descriptions into complete Godot 4 projects with generated art, code, and visual QA via screenshot analysis.</p>
</div></td></tr><tr><td><a href="https://github.com/itigges22/ATLAS?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ATLAS</a></td><td><div><p>A local coding assistant and test-time inference pipeline that wraps frozen Qwen models in self-verified repair and benchmarking infrastructure</p>
</div></td></tr><tr><td><a href="https://github.com/jrswab/axe?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">axe</a></td><td><div><p>lightweight CLI for defining focused LLM agents in TOML and running them from the terminal, pipes, cron jobs, CI, or git hooks with skills, memory, and sub-agent delegation.</p>
</div></td></tr><tr><td><a href="https://github.com/marcus/sidecar?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Sidecar</a></td><td><div><p>terminal UI for agentic development workflows with git, task, workspace, and conversation management</p>
</div></td></tr><tr><td><a href="https://github.com/onesuper/tui-use?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">tui-use</a></td><td><div><p>A PTY automation tool that lets AI agents drive REPLs, debuggers and full-screen TUI apps from the terminal</p>
</div></td></tr><tr><td><a href="https://github.com/openai/codex?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Codex CLI</a></td><td><div><p>OpenAI’s lightweight agentic coding CLI for the terminal</p>
</div></td></tr><tr><td rowspan="4">2025</td><td><a href="https://github.com/batrachianai/toad?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Toad</a></td><td><div><p>a unified terminal UI to run coding agents via ACP</p>
</div></td></tr><tr><td><a href="https://github.com/block/goose?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">goose</a></td><td><div><p>a local AI agent focused on development tasks</p>
</div></td></tr><tr><td><a href="https://github.com/fulcrumresearch/quibbler?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">quibbler</a></td><td><div><p>a critic for coding agents that can also work as an MCP</p>
</div></td></tr><tr><td><a href="https://github.com/mistralai/mistral-vibe?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">mistral-vibe</a></td><td><div><p>Mistral’s agentic coding CLI</p>
</div></td></tr><tr><td>Developer Resources</td><td>References</td><td>2026</td><td><a href="https://context7.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Context7</a></td><td><div><p>a curated database of context for several development stacks</p>
</div></td></tr><tr><td rowspan="3">Personal Assistants</td><td rowspan="3">Tools</td><td rowspan="3">2026</td><td><a href="https://github.com/HKUDS/nanobot?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">nanobot</a></td><td><div><p>an ultra-lightweight personal AI assistant with multi-provider support</p>
</div></td></tr><tr><td><a href="https://github.com/badlogic/sitegeist?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Sitegeist</a></td><td><div><p>browser-sidebar AI assistant for Chrome/Edge that collaborates on web automation, extraction, navigation, form filling, and research using your own model/provider credentials with local-first data handling.</p>
</div></td></tr><tr><td><a href="https://github.com/magnitudedev/magnitude?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">magnitude</a></td><td><div><p>open source agent built on local models with an offline inference engine</p>
</div></td></tr><tr><td rowspan="3">Research Agents</td><td rowspan="2">Samples</td><td>2025</td><td><a href="https://github.com/stanford-oval/storm?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">STORM</a></td><td><div><p>LLM-powered knowledge curation system that researches a topic and generates a full-length report with citations</p>
</div></td></tr><tr><td>2023</td><td><a href="https://github.com/assafelovic/gpt-researcher?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">gpt-researcher</a></td><td><div><p>a simple agent that does online research on any given topic</p>
</div></td></tr><tr><td>Tools</td><td>2026</td><td><a href="https://github.com/karpathy/autoresearch?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">autoresearch</a></td><td><div><p>Autonomous research harness that lets Claude/Codex agents edit <code>train.py</code>, run 5‑minute training passes, and iterate on models via human-written <code>program.md</code> instructions, logging each experiment the next morning.</p>
</div></td></tr><tr><td rowspan="7">Sandboxing &amp; Environments</td><td rowspan="7">Tools</td><td rowspan="7">2026</td><td><a href="https://github.com/amlalabs/amla-sandbox?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">amla-sandbox</a></td><td><div><p>A WASM-based sandbox with capability enforcement for running agent-generated code safely. Provides isolation without Docker and reduces tool-call overhead.</p>
</div></td></tr><tr><td><a href="https://github.com/eugene1g/agent-safehouse?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Agent Safehouse</a></td><td><div><p>macOS sandbox-exec wrapper that builds deny-first policies for Claude/Codex/AMP workflows so coding agents only touch the files and integrations they need.</p>
</div></td></tr><tr><td><a href="https://github.com/finbarr/yolobox?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">yolobox</a></td><td><div><p>a containerized sandbox for running AI coding agents safely</p>
</div></td></tr><tr><td><a href="https://github.com/manuelschipper/nah?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">nah</a></td><td><div><p>context-aware safety guard for Claude Code that classifies tool calls, blocks or confirms dangerous actions, inspects reads/writes for secrets and exfiltration, and can optionally consult an LLM for ambiguous cases.</p>
</div></td></tr><tr><td><a href="https://github.com/mavdol/capsule?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Capsule</a></td><td><div><p>a secure runtime for orchestrating agent tasks in isolated WASM sandboxes</p>
</div></td></tr><tr><td><a href="https://github.com/superhq-ai/shuru?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">shuru</a></td><td><div><p>local-first microVM sandbox for AI agents on macOS using Apple’s Virtualization.framework</p>
</div></td></tr><tr><td><a href="https://github.com/trycua/cua?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Cua</a></td><td><div><p>A sandboxing toolkit and agentic platform for running agents in isolated environments. Covers Docker, QEMU, and Apple Virtualization for benchmarking, safe code execution, and UI automation.</p>
</div></td></tr><tr><td>Tools</td><td>Task Runners</td><td>2026</td><td><a href="https://github.com/winslow-workflow/winslow?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">winslow</a></td><td><div><p>interactive task runner with terminal UI</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="agents" label="agents" />
<category term="ai" label="ai" />
<category term="orchestration" label="orchestration" />
</entry>
<entry>
<title>ESP8266 (and ESP32)</title>
<id>https://taoofmac.com/space/hw/esp8266?utm_content=atom</id>
<published>2016-05-08T23:49:00+00:00</published>
<updated>2026-08-07T20:24: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/hw/esp8266?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/hw/esp8266?utm_content=atom">ESP8266 (and ESP32)</xhtml:a></xhtml:h2><xhtml:time datetime="2016-05-08T23:49:00+00:00">2016-05-08T23:49:00+00:00</xhtml:time><xhtml:p>These little modules have taken hobby electronics by storm, so of course I grabbed a few of them and have been hacking away quietly on both the ESP8266 and ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">These little modules have taken hobby electronics by storm, so of course I grabbed a few of them and have been hacking away quietly on both the <code>ESP8266</code> and the <code>ESP32</code>.</p>
<a id="anchor-resources" class="anchor" href="/space/hw/esp8266#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Category</th><th>date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td rowspan="4">Applications</td><td rowspan="4">2026</td><td><a href="https://github.com/ivans805/Win-95-Tracker-Cyd?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Win-95-Tracker-Cyd</a></td><td><div><p>Small tracker music player with a Windows 95 aesthetic for the Cheap Yellow Display (ESP32 CYD board).</p>
</div></td></tr><tr><td><a href="https://github.com/memovai/mimiclaw?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MimiClaw</a></td><td><div><p>Telegram-based AI assistant for ESP32-S3 using LLM APIs</p>
</div></td></tr><tr><td><a href="https://github.com/mlhpdx/hacker-news-cyd?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">hacker-news-cyd</a></td><td><div><p>A Hacker News reader for ESP32 Cheap Yellow Displays, with a neat Wireguard twist</p>
</div></td></tr><tr><td><a href="https://github.com/slvDev/esp32-ai?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp32-ai</a></td><td><div><p>embedded AI project for ESP32</p>
</div></td></tr><tr><td>Cameras</td><td>2024</td><td><a href="https://github.com/HomeKidd/esp32-homekit-camera?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp32-homekit-camera</a></td><td><div><p>a camera project that I keep trying to fix</p>
</div></td></tr><tr><td rowspan="3">Displays</td><td>2026</td><td><a href="https://github.com/lmarzen/esp32-weather-epd?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32 E-Paper Weather Display</a></td><td><div><p>An ESP32 e-paper weather display project with a nice visual design for the weather screen</p>
</div></td></tr><tr><td>2024</td><td><a href="https://www.youtube.com/watch?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com&amp;v=6JCLHIXXVus" rel="external">ESP32-Cheap-Yellow-Display Audio Fixes</a></td><td><div><p>a video on how to fix audio issues with the Cheap Yellow Display</p>
</div></td></tr><tr><td>2023</td><td><a href="https://github.com/witnessmenow/ESP32-Cheap-Yellow-Display?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32-Cheap-Yellow-Display</a></td><td><div><p>a set of libraries for the ESP32-2432S028R and similar displays</p>
</div></td></tr><tr><td>Documentation</td><td>2023</td><td><a href="https://eitherway.io/posts/esp32-buyers-guide?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32 Buyer&#39;s Guide</a></td><td><div><p>an updated guide to the various SKUs for 2023</p>
</div></td></tr><tr><td rowspan="3">Emulation</td><td rowspan="2">2025</td><td><a href="https://github.com/atomic14/esp32-zxspectrum?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32 Rainbow</a></td><td><div><p>a ZX Spectrum emulator for the ESP32</p>
</div></td></tr><tr><td><a href="https://github.com/hchunhui/tiny386?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">tiny386</a></td><td><div><p>An x86 emulator for the ESP32 that can run Windows 95</p>
</div></td></tr><tr><td>2021</td><td><a href="https://github.com/retro-esp32?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Retro ESP32</a></td><td><div><p>a set of emulators for ESP32, mostly targeting the Odroid Go</p>
</div></td></tr><tr><td rowspan="2">Firmware</td><td rowspan="2">2026</td><td><a href="https://github.com/Rompass/openc6-bios?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">OpenC6 BIOS</a></td><td><div><p>an open-source modular BIOS/payload firmware platform for the ESP32-C6 with a custom ABI and RISC-V support</p>
</div></td></tr><tr><td><a href="https://github.com/luc-github/ESP3D?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP3D</a></td><td><div><p>firmware for ESP8266/ESP32 boards that adds Wi-Fi/web UI control for 3D printers, CNC, and sand tables</p>
</div></td></tr><tr><td rowspan="2">GUI</td><td>2026</td><td><a href="https://github.com/m5stack/M5Tab5-UserDemo?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">M5Tab5-UserDemo</a></td><td><div><p>an ESP-IDF v5.4.2 M5Tab5 hardware demo app with LVGL-based desktop and device builds</p>
</div></td></tr><tr><td>2022</td><td><a href="https://github.com/slint-ui/slint?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">slint</a></td><td><div><p>a GUI toolkit that can run in MCUs like the Pi pico and the ESP32</p>
</div></td></tr><tr><td rowspan="2">Graphics</td><td rowspan="2">2026</td><td><a href="https://github.com/dejwk/roo_display?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">roo_display</a></td><td><div><p>A display library for ESP32</p>
</div></td></tr><tr><td><a href="https://github.com/tonywestonuk/EPD_Painter?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">EPD Painter</a></td><td><div><p>fast M5PaperS3 e-paper display driver</p>
</div></td></tr><tr><td>Hacks</td><td>2020</td><td><a href="https://chrdavis.github.io/hacking-a-mitsubishi-heat-pump-Part-1/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Hacking A Mitsubishi Heat Pump</a></td><td><div><p>I need to do this to mine</p>
</div></td></tr><tr><td>Hardware</td><td>2026</td><td><a href="https://github.com/lhm0/wide-mcu-breadboard?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">wide-mcu-breadboard</a></td><td><div><p>3D-printable breadboard body for wide MCUs like ESP32 and Pi Pico, reusing standard spring contacts to give four free holes per pin</p>
</div></td></tr><tr><td rowspan="2">IoT</td><td>2026</td><td><a href="https://github.com/thelastoutpostworkshop/ESPConnect?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESPConnect</a></td><td><div><p>browser-based ESP32 manager for exploring, backing up, and restoring devices</p>
</div></td></tr><tr><td>2021</td><td><a href="https://github.com/jomjol/AI-on-the-edge-device?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">AI-on-the-edge-device</a></td><td><div><p>an impressive water meter reader solution using an ESP32</p>
</div></td></tr><tr><td rowspan="14">Libraries</td><td>2026</td><td><a href="https://github.com/ralsina/esposito?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esposito</a></td><td><div><p>an ESP32 mini-OS/framework for cheap yellow displays with dynamic SD-loaded apps and touchscreen/keyboard support</p>
</div></td></tr><tr><td rowspan="7">2023</td><td><a href="https://github.com/HomeSpan/HomeSpan?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">HomeSpan</a></td><td><div><p>Arduino library for creating your own ESP32-based HomeKit devices</p>
</div></td></tr><tr><td><a href="https://github.com/NorthernMan54/rtl_433_ESP?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">rtl_433_ESP</a></td><td><div><p>an Arduino library for use on ESP32 boards with to decode 433MHz sensor signals</p>
</div></td></tr><tr><td><a href="https://github.com/RavenSystem/esp-homekit-devices?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Home Accessory Architect</a></td><td><div><p>a set of libraries to create HomeKit devices</p>
</div></td></tr><tr><td><a href="https://github.com/littlefs-project/littlefs?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">littlefs</a></td><td><div><p>A little fail-safe filesystem designed for MCUs</p>
</div></td></tr><tr><td><a href="https://github.com/microsoft/devicescript?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">DeviceScript</a></td><td><div><p>TypeScript for Tiny IoT Devices (ESP32, RP2040, etc.)</p>
</div></td></tr><tr><td><a href="https://github.com/mlesniew/PicoMQTT?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">PicoMQTT</a></td><td><div><p>An MQTT client and server library for ESP8266 and ESP32 devices.</p>
</div></td></tr><tr><td><a href="https://github.com/patagonaa/esp32-ir-powermeter?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp32-ir-powermeter</a></td><td><div><p>a library to read power usage from a digital power meter via the infrared interface</p>
</div></td></tr><tr><td>2022</td><td><a href="https://github.com/fdivitto/FabGL?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">FabGL</a></td><td><div><p>a set of ESP32 libraries that allow for VGA output and various graphics-related functionality, as well as terminal emulation</p>
</div></td></tr><tr><td>2020</td><td><a href="https://github.com/SwiCago/HeatPump?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">HeatPump</a></td><td><div><p>the library to talk to Mitsubishi ACs</p>
</div></td></tr><tr><td>2019</td><td><a href="https://github.com/stblassitude/Adafruit_SSD1306_Wemos_OLED?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">SSD1306 Driver</a></td><td><div><p>This driver works correctly with the 1.1.0 revision Wemos D1 OLED shields I have</p>
</div></td></tr><tr><td rowspan="2">2017</td><td><a href="https://github.com/knolleary/pubsubclient?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pubsubclient</a></td><td><div><p>A smaller, simpler MQTT library</p>
</div></td></tr><tr><td><a href="https://github.com/toblum/McLighting?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">McLighting</a></td><td><div><p>An RGB LED controller library</p>
</div></td></tr><tr><td>2016</td><td><a href="https://github.com/tuanpmt/esp_mqtt?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp_mqtt</a></td><td><div><p>a MQTT library with SSL support</p>
</div></td></tr><tr><td rowspan="2">M5Stack</td><td rowspan="2">2020</td><td><a href="https://github.com/G4lile0/ESP32-WiFi-Hash-Monster?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">WiFi Hash Monster</a></td><td><div><p>an EAPOL sniffer (and generic Wi-Fi monitor)</p>
</div></td></tr><tr><td><a href="https://gitlab.com/mschmidl/covidsniffer?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">CovidSniffer</a></td><td><div><p>a COVID tracker BLE sniffer</p>
</div></td></tr><tr><td>Mods</td><td>2024</td><td><a href="https://github.com/hexeguitar/ESP32_TFT_PIO?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32_TFT_PIO</a></td><td><div><p>a Cheap Yellow Display project with mods to improve the audio quality</p>
</div></td></tr><tr><td rowspan="11">Networking</td><td rowspan="2">2026</td><td><a href="https://github.com/darthcloud/BlueRetro?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">BlueRetro</a></td><td><div><p>ESP32 Bluetooth adapter for multiplayer controllers on retro game consoles and computers</p>
</div></td></tr><tr><td><a href="https://github.com/wolfSSL/wolfip?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">wolfIP</a></td><td><div><p>a lightweight TCP/IP stack for resource-constrained MCUs with no dynamic allocations, fixed socket/buffer limits, BSD-like sockets, and a FreeRTOS port.</p>
</div></td></tr><tr><td rowspan="5">2024</td><td><a href="https://github.com/bozimmerman/Zimodem?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Zimodem</a></td><td><div><p>custom modem simulator with lots of features</p>
</div></td></tr><tr><td><a href="https://github.com/dakhnod/ESP32-Bluetooth-USB-dongle?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32-Bluetooth-USB-dongle</a></td><td><div><p>use a ESP32 device like a Bluetooth dongle</p>
</div></td></tr><tr><td><a href="https://github.com/dhansel/WifiModem?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">WifiModem</a></td><td><div><p>ESP8266 firmware to act as a telnet modem and server</p>
</div></td></tr><tr><td><a href="https://github.com/esp32-open-mac/esp32-open-mac?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp32-open-mac</a></td><td><div><p>an open source Wi-Fi driver for the ESP32</p>
</div></td></tr><tr><td><a href="https://github.com/maccasoft/WifiModem?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">WifiModem</a></td><td><div><p>Hayes modem emulation for ESP8266 modules</p>
</div></td></tr><tr><td rowspan="2">2020</td><td><a href="https://github.com/cnlohr/espthernet?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">espethernet</a></td><td><div><p>direct connection to a PHY device</p>
</div></td></tr><tr><td><a href="https://github.com/martin-ger/esp32_nat_router?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32 NAT Router</a></td><td><div><p>a basic router for the ESP32</p>
</div></td></tr><tr><td rowspan="2">2017</td><td><a href="https://github.com/martin-ger/esp_wifi_repeater?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp_wifi_repeater</a></td><td><div><p>An amazing Wi-Fi repeater, with basic mesh networking</p>
</div></td></tr><tr><td><a href="https://github.com/tzapu/WiFiManager?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">WiFiManager</a></td><td><div><p>A library for first-boot configuration of Wi-Fi connections</p>
</div></td></tr><tr><td rowspan="7">Operating Systems</td><td rowspan="4">2026</td><td><a href="https://github.com/MicroPythonOS/MicroPythonOS?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MicroPythonOS</a></td><td><div><p>a MicroPython-based OS for ESP32 with Android-like touch UI, app store, and OTA updates</p>
</div></td></tr><tr><td><a href="https://github.com/hery-torrado/KernelESP?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">KernelESP</a></td><td><div><p>UNIX-like control system for ESP8266 with serial shell, web UI, automation, mail alerts, and diagnostics.</p>
</div></td></tr><tr><td><a href="https://github.com/valdanylchuk/breezybox?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">BreezyBox</a></td><td><div><p>A BusyBox-inspired shell and virtual terminal system for ESP32</p>
</div></td></tr><tr><td><a href="https://github.com/valdanylchuk/breezydemo?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">BreezyDemo</a></td><td><div><p>A demo cyberdeck project using BreezyBox on an ESP32-S3 with LCD</p>
</div></td></tr><tr><td>2025</td><td><a href="https://github.com/ByteWelder/Tactility?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Tactility</a></td><td><div><p>An operating system focused on ESP32</p>
</div></td></tr><tr><td rowspan="2">2021</td><td><a href="https://github.com/EtchedPixels/FUZIX?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">FUZIX</a></td><td><div><p>a minimal UNIX-like OS that can run on a variety of MCUs</p>
</div></td></tr><tr><td><a href="https://github.com/whitecatboard/Lua-RTOS-ESP32?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Lua-RTOS-ESP32</a></td><td><div><p>a Lua-based RTOS for the ESP32 that also has a block-based editor</p>
</div></td></tr><tr><td>Photography</td><td>2026</td><td><a href="https://github.com/chriko3/ObscuraOne?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Obscura One</a></td><td><div><p>An open-source screenless camera built around the ESP32-CAM with a fully 3D-printable body and Arduino firmware</p>
</div></td></tr><tr><td>Reference</td><td>2023</td><td><a href="https://github.com/crankyoldgit/IRremoteESP8266/wiki/ESP01-Send-&amp;-Receive-Circuit?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com#receiver" rel="external">ESP01-Send-&amp;-Receive-Circuit</a></td><td><div><p>a circuit to use the ESP-01 as an IR receiver</p>
</div></td></tr><tr><td rowspan="3">Resources</td><td>2016</td><td><a href="https://blog.cesanta.com/esp8266-superfast-flashing-flash-esp-in-5-seconds?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP8266 superfast flashing</a></td><td></td></tr><tr><td rowspan="2">2013</td><td><a href="http://www.esp8266.com/wiki/doku.php?id=getting-started-with-the-esp8266&amp;utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Getting Started with the ESP8266</a></td><td><div><p>Everything you need to know.</p>
</div></td></tr><tr><td><a href="http://www.instructables.com/id/How-to-use-the-ESP8266-01-pins/?ALLSTEPS=&amp;utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">How to use the ESP8266-01 pins</a></td><td><div><p>Nice, straightforward overview</p>
</div></td></tr><tr><td rowspan="6">Runtimes</td><td>2020</td><td><a href="https://github.com/gysmo38/mitsubishi2MQTT?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">mitsubishi2MQTT</a></td><td><div><p>a Tasmota-like firmware to control Mitsubishi ACs</p>
</div></td></tr><tr><td>2019</td><td><a href="https://esphome.io?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esphome</a></td><td><div><p>modular firmware for ESP8266 and ESP32</p>
</div></td></tr><tr><td>2017</td><td><a href="https://github.com/yesco/esp-lisp?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp-lisp</a></td><td><div><p>A tiny LISP interpreter</p>
</div></td></tr><tr><td rowspan="2">2016</td><td><a href="https://github.com/esp8266/Arduino?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Arduino Core</a></td><td><div><p>An ESP8266 core for Arduino</p>
</div></td></tr><tr><td><a href="https://github.com/micropython/micropython?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MicroPython</a></td><td><div><p>Which also supports the ESP8266 thanks to <a href="/space/links/2016/01/29/0743" rel="next">this Kickstarter campaign</a></p>
</div></td></tr><tr><td>2014</td><td><a href="http://hackaday.com/2014/10/25/an-sdk-for-the-esp8266-wifi-chip/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">An SDK for the ESP8266 Wi-Fi Chip</a></td><td><div><p>The early days</p>
</div></td></tr><tr><td rowspan="2">Security</td><td>2026</td><td><a href="https://github.com/cifertech/ESP32-DIV?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32-DIV</a></td><td><div><p>Multi-band ESP32 wireless offensive/defensive toolkit for Wi-Fi, BLE and Sub-GHz testing and analysis.</p>
</div></td></tr><tr><td>2024</td><td><a href="https://github.com/Fr4nkFletcher/ESP32-Marauder-Cheap-Yellow-Display?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32-Marauder-Cheap-Yellow-Display</a></td><td><div><p>A set of wireless security tools for the Cheap Yellow Display</p>
</div></td></tr><tr><td rowspan="5">Tools</td><td rowspan="3">2026</td><td><a href="https://github.com/MatAtBread/esp-scope?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp-scope</a></td><td><div><p>A web-based oscilloscope for ESP32 boards that streams ADC data to a browser UI</p>
</div></td></tr><tr><td><a href="https://github.com/espkvm/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP KVM</a></td><td><div><p>ESP32-based KVM project</p>
</div></td></tr><tr><td><a href="https://github.com/valdanylchuk/xcc700?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">xcc700</a></td><td><div><p>Self-hosting mini C compiler for ESP32/Xtensa; emits relocatable ELF for ESP-IDF elf_loader</p>
</div></td></tr><tr><td>2023</td><td><a href="https://github.com/jczic/ESP32-MPY-Jama?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ESP32-MPY-Jama</a></td><td><div><p>a MicroPython IDE for the ESP32 family</p>
</div></td></tr><tr><td>2022</td><td><a href="https://github.com/Fishwaldo/esp_ghota?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">esp_ghota</a></td><td><div><p>a way to do OTA updates via GitHub</p>
</div></td></tr><tr><td rowspan="2">Video</td><td>2026</td><td><a href="https://github.com/jrowny/p4kvm?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">p4kvm</a></td><td><div><p>proof-of-concept IP KVM built on ESP32-P4</p>
</div></td></tr><tr><td>2020</td><td><a href="https://github.com/rossumur/espflix?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">espflix</a></td><td><div><p>an inspired ESP32 video hack</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="electronics" label="electronics" />
<category term="esp32" label="esp32" />
<category term="esp8266" label="esp8266" />
<category term="expressif" label="expressif" />
<category term="hardware" label="hardware" />
<category term="mcu" label="mcu" />
<category term="microcontrollers" label="microcontrollers" />
<category term="resources" label="resources" />
</entry>
<entry>
<title>Proxmox VE</title>
<id>https://taoofmac.com/space/os/linux/distributions/proxmox?utm_content=atom</id>
<published>2022-09-01T12:00:00+00:00</published>
<updated>2026-08-07T09:57: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/os/linux/distributions/proxmox?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/os/linux/distributions/proxmox?utm_content=atom">Proxmox VE</xhtml:a></xhtml:h2><xhtml:time datetime="2022-09-01T12:00:00+00:00">2022-09-01T12:00:00+00:00</xhtml:time><xhtml:p>Proxmox Virtual Environment is a Debian-based system that focuses on providing enterprise-grade LXC and KVM management capabilities, and that I have been ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead"><a href="https://proxmox.com/en/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Proxmox</a> Virtual Environment is a <a href="/space/os/linux/distributions/debian" rel="next">Debian</a>-based system that focuses on providing enterprise-grade <code>LXC</code> and <code>KVM</code> management capabilities, and that I have been using for my homelab.</p>
<a id="anchor-resources" class="anchor" href="/space/os/linux/distributions/proxmox#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td>Add-ons</td><td>2023</td><td><a href="https://github.com/lupinelab/kproximate?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">kproximate</a></td><td><div><p>A Kubernetes autoscaler for Proxmox</p>
</div></td></tr><tr><td>Documentation</td><td>2023</td><td><a href="https://pve.proxmox.com/wiki/Cloud-Init_Support?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">cloud-init Support</a></td><td></td></tr><tr><td>Scripts</td><td>2025</td><td><a href="https://github.com/agstaylor/proxmox-cloud-init-scripts?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">proxmox-cloud-init-scripts</a></td><td><div><p>cloud-init scripts for Proxmox VE</p>
</div></td></tr><tr><td>Templates</td><td>2023</td><td><a href="https://github.com/tteck/Proxmox?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Proxmox VE helper scripts</a></td><td><div><p>scripts to provision various kinds of popular services</p>
</div></td></tr><tr><td rowspan="8">Tools</td><td>2026</td><td><a href="https://github.com/morpheuslord/PICOTTY?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">PICOTTY</a></td><td><div><p>Raspberry Pi Pico serial console and lightweight IP KVM for Proxmox homelabs</p>
</div></td></tr><tr><td rowspan="6">2025</td><td><a href="https://github.com/Corsinvest/cv4pve-admin?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">cv4pve-admin</a></td><td><div><p>a web-based admin interface for Proxmox VE</p>
</div></td></tr><tr><td><a href="https://github.com/free-pmx/free-pmx-no-subscription?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">free-pmx-no-subscription</a></td><td><div><p>remove subscription nagging and set up free repositories</p>
</div></td></tr><tr><td><a href="https://github.com/overcuriousity/proxmox-zpool-monitoring?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">proxmox-zpool-monitoring</a></td><td><div><p>a script to monitor ZFS pools in Proxmox VE</p>
</div></td></tr><tr><td><a href="https://github.com/pauloswear/proxmanager?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">proxmanager</a></td><td><div><p>a native Python/Qt5 app to manage VMs</p>
</div></td></tr><tr><td><a href="https://github.com/rcarmo/proxmox-zpool-monitoring?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">proxmox-zpool-monitoring</a></td><td><div><p>my (arguably) better version of the above</p>
</div></td></tr><tr><td><a href="https://github.com/willjasen/tailmox?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">tailmox</a></td><td><div><p>a tool to cluster Proxmox nodes via Tailscale</p>
</div></td></tr><tr><td>2024</td><td><a href="https://github.com/jordanhillis/pvekclean?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">pvekclean</a></td><td><div><p>a handy script to automatically remove older kernels</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="debian" label="debian" />
<category term="homelab" label="homelab" />
<category term="hypervisor" label="hypervisor" />
<category term="kvm" label="kvm" />
<category term="linux" label="linux" />
<category term="lxc" label="lxc" />
<category term="proxmox" label="proxmox" />
</entry>
<entry>
<title>Quake: Dawn of the Machine</title>
<id>https://taoofmac.com/space/links/2026/08/07/0933?utm_content=atom</id>
<published>2026-08-07T09:33:00+00:00</published>
<updated>2026-08-07T09:36:27+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/08/07/0933?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/links/2026/08/07/0933?utm_content=atom">Quake: Dawn of the Machine</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-07T09:33:00+00:00">2026-08-07T09:33:00+00:00</xhtml:time><xhtml:p>Wow, 30 years. Part of that seems to have whizzed by, and it has been a long while since I last played Quake. I always hated the hellish look, but the ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p><a href="https://slayersclub.bethesda.net/en-US/news/quake-dawn-of-the-machine-available-now?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" title="external link to https://slayersclub.bethesda.net/en-US/news/quake-dawn-of-the-machine-available-now" alt="screenshot of https://slayersclub.bethesda.net/en-US/news/quake-dawn-of-the-machine-available-now" rel="external"><img class="quicklook" src="/space/links/2026/08/07/0933/large.jpg?v=f7b20e3b0d53" alt="quicklook" width="320" height="240"/></a></p>
<p class="lead">Wow, 30 years. Part of that seems to have whizzed by, and it has been a long while since I last played <a href="/space/games/quake" rel="next">Quake</a>. I always hated the hellish look, but the technology was irresistible–and looking back, it is pretty amazing how much it shaped my career, or at least my pastimes.</p>
<p>Running <a href="/space/blog/2019/11/13/1400" rel="next">Quake servers at an ISP</a> is quite literally how I initially ended up in marketing instead of engineering, and it got me exploring networking, servers, real-time graphics and all sorts of other things I am still interested in today. I may have to make time for this new free episode, if only to see what thirty years of hindsight looks like inside the original engine.</p>

<br/>
]]></content>
<category term="gaming" label="gaming" />
<category term="id software" label="id software" />
<category term="machinegames" label="machinegames" />
<category term="memoirs" label="memoirs" />
<category term="quake" label="quake" />
</entry>
<entry>
<title>3D Printing State of the Union</title>
<id>https://taoofmac.com/space/blog/2026/08/06/1700?utm_content=atom</id>
<published>2026-08-06T17:00:00+00:00</published>
<updated>2026-08-06T17:00: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/08/06/1700?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/blog/2026/08/06/1700?utm_content=atom">3D Printing State of the Union</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-06T17:00:00+00:00">2026-08-06T17:00:00+00:00</xhtml:time><xhtml:p>Since I got a new printer last week and I’ve been documenting my endeavours in this realm in a rather haphazard way, I thought it would be useful to do a ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">Since I got <a href="/space/notes/2026/07/12/1230#notes-for-july-5-12" rel="next">a new printer last week</a> and I’ve been documenting my endeavours in this realm in a rather haphazard way, I thought it would be useful to do a sort of catch-up/snapshot of where things are (and have been) for a while now.</p>
<p>Right now I have three 3D printers (down from four):</p>
<ul>
<li>The <a href="/space/com/kingroon/kp3s_pro#kingroon-kp3s-pro" rel="next">KP3S Pro</a>, which is my “tiny”, near-silent printer</li>
<li>The <a href="/space/com/two_trees/sk1#two-trees-sk1" rel="next">Two Trees SK1</a>, my former workhorse</li>
<li>A brand-new Flashforge Creator 5 Pro, which I am still getting to know and taking copious notes on</li>
</ul>
<p>However, this all started (as many 3D printing stories start) with a Prusa. Or, rather, a clone.</p>
<a id="anchor-the-prusa-connection" class="anchor" href="/space/blog/2026/08/06/1700#the-prusa-connection" rel="anchor"><h2 id="the-prusa-connection">The Prusa Connection</h2></a>
<figure>
<img src="/space/blog/2026/08/06/1700/printers-prusa.jpg?v=8e1e082dc653" alt="The BQ Prusa MK2 over the years" width="2048" height="1709"/>
<figcaption>The BQ Prusa MK2 over the years</figcaption>
</figure>
<p>A few years back, when I was organising the first editions of the Lisbon Maker Faire, I got <a href="/space/blog/2014/10/05/2130#hephaestus-extruder" rel="next">a BQ Prusa clone</a>, which stood me in good stead for a long while–I printed many kilos of PLA/PETG with it, the vast majority of it going into functional parts of various descriptions (some, as you’d expect, were 3D printer parts), to the point where the nozzle wore out and widened from its 0.4mm to somewhere between 0.6 and 0.8mm (which only made it more useful for some functional prints).</p>
<p>Last weekend I retired it and gave it to a friend–which, given how tight space is in my office these days, was a necessity. Instead of dismantling it and saving the non-printed parts, I tried to make sure it would go to someone who could rebuild it.</p>
<p>Since I took care to keep all the STLs (Prusa originals and derivatives are awesome in terms of long-term maintenance), had spare Arduino boards and ample extras–including a Raspberry Pi touchscreen and an unused extruder kit I had intended to fit it with–it left the house almost like it came in (i.e., as a kit), and even though I’ll miss it to a fair degree, I hadn’t really used it in almost a year.</p>
<p>This printer had a great run, and was extraordinarily maintainable–I replaced many of its parts over the years (including <em>nearly</em> replacing its extruder assembly before I got the other ones).</p>
<p>It also became my first <a href="/space/blog/2022/07/09/1230#reviving-my-ancient-bq-prusa-i3-hephestos-with-klipper" rel="next">Klipper printer</a>, and the excitement from that upgrade and the realisation that 3D printing was going through a stepwise evolution was pretty much the reason I got my second.</p>
<a id="anchor-the-little-upstart" class="anchor" href="/space/blog/2026/08/06/1700#the-little-upstart" rel="anchor"><h2 id="the-little-upstart">The Little Upstart</h2></a>
<figure>
<img src="/space/blog/2026/08/06/1700/printers-kp3s.jpg?v=d0c3009030e5" alt="The KP3S Pro over the years" width="2048" height="2048"/>
<figcaption>The KP3S Pro over the years</figcaption>
</figure>
<p>The <a href="/space/com/kingroon/kp3s_pro#kingroon-kp3s-pro" rel="next">KP3S Pro</a> was my choice as a follow-up printer, and an attempt to regain finer print quality (which I did) while retaining some control over the hardware and software–I bought it intending from the start to run <a href="/space/3d/printing/klipper" rel="next">Klipper</a>, and it has served me very well.</p>
<p>After swapping out its extruder assembly and bolting on a Bambu clone hotend and an inductive sensor a little while ago (which <a href="https://www.youtube.com/watch?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com&amp;v=aWYlb0_-Fgo" rel="external">I also made a video about</a>), it is now the quietest (and, funnily enough, most hassle-free) of my printers, even considering that its cantilever setup makes it a tad wonky.</p>
<p>Despite the limitations of its relatively small 220x220 build plate, I use it a lot during the day to print small jigs, calibration samples and slices of prototypes, to the fascination of some of the people I have video calls with. Being quiet, precise and low-friction for small functional work, it is perfect for the kind of slow, iterative prototyping that I can squeeze in during some work weeks, although to be completely fair it is a tad small, so for most final prints I have to move “up”.</p>
<a id="anchor-the-tank" class="anchor" href="/space/blog/2026/08/06/1700#the-tank" rel="anchor"><h2 id="the-tank">The Tank</h2></a>
<figure>
<img src="/space/blog/2026/08/06/1700/printers-sk1.jpg?v=d3a4c5323f47" alt="The SK1 and the tweaks I did" width="2048" height="1536"/>
<figcaption>The SK1 and the tweaks I did</figcaption>
</figure>
<p>I had the good fortune of getting an <a href="/space/com/two_trees/sk1#two-trees-sk1" rel="next">SK1</a> when Two Trees dipped its toes into the 3D printer manufacturing business (which they appear to have since exited, sadly), and upgraded it from its Bambu Lab P1-like barebones frame to a fully enclosed configuration including auxiliary part cooling fans, and I have quite enjoyed the ride.</p>
<p>As my first Core XY, the thing was a pretty amazing leap in terms of print speed and quality, and it is still rock solid provided you can deal with its somewhat uneven temperament and a few quirks.</p>
<p>There is a lot to like mechanically–since it (cleverly) uses Bambu clone hotends, it has been the printer I’ve used with most of my tougher abrasive filaments, and coupled with <a href="https://www.amazon.es/gp/product/B0FCL25JX2/ref=as_li_tl?_encoding=UTF8&amp;camp=3638&amp;creative=24630&amp;linkCode=ur2&amp;tag=taoofmac-21&amp;utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">a BIQU cool plate</a> it has been perfect for stuff that would never print reliably on the <a href="/space/com/kingroon/kp3s_pro#kingroon-kp3s-pro" rel="next">KP3S Pro</a>. The stepper motors and mechanics have been rock solid (the only part that broke down was the toolhead fan, which somehow lost a blade), and <a href="/space/blog/2024/07/13/1900#enclosing-the-twotrees-sk1" rel="next">ever since I enclosed it</a> it’s only improved.</p>
<p>It does have <em>one</em> significant hardware foible–the extruder is <em>very</em> prone to heat creep, and it’s impossible to reliably print PLA on it with it fully enclosed unless you <a href="https://www.printables.com/model/924900-aerateur-pour-kit-enclosure-two-trees-sk1?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">use a vent like this one</a> and turn on the fans–which, even if only slightly on, just add to the noise, especially when the printer is running at speed.</p>
<p>The shipping <a href="/space/3d/printing/klipper" rel="next">Klipper</a> firmware has always been a little buggy, and although I did some creative upgrading and <a href="/space/blog/2024/04/28/1500#plug-and-play-klipperscreen-for-the-twotrees-sk1" rel="next">replaced the screen with a USB-networked Pi</a>, it still has some weird pre-print slowdowns and glitches due to the rather complex Voron Trident-like homing sequence that I’ve yet to fully iron out.</p>
<p>My plans for it, now that I have a new “big” printer, include completely reflashing the entire thing with <a href="https://github.com/mechano/TwoTrees-SK1-Armbian-Klipper-Firmware?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">more modern firmware</a> and, eventually (if I can figure out a good, reliable replacement that isn’t a major pain to mechanically assemble), upgrading the toolhead to a more future-proof combination.</p>
<p>But the excellent mechanics aren’t really compromised by a few software and thermal-design decisions, and I suspect it will stick around for a while.</p>
<a id="anchor-the-creator-5-pro" class="anchor" href="/space/blog/2026/08/06/1700#the-creator-5-pro" rel="anchor"><h2 id="the-creator-5-pro">The Creator 5 Pro</h2></a>
<figure>
<img src="/space/blog/2026/08/06/1700/printers-creator5pro.jpg?v=c2873351dd12" alt="The Flashforge Creator 5 Pro" width="2048" height="1536"/>
<figcaption>The Flashforge Creator 5 Pro</figcaption>
</figure>
<p>I will write more about the whys, hows, and outcomes, but I spent a <em>long</em> while making up my mind about this one, and it’s going to both replace and <em>complement</em> the <a href="/space/com/two_trees/sk1#two-trees-sk1" rel="next">SK1</a>–it’s roughly the same size (except for the ludicrous top cover), but I needed something to print (slightly) tougher materials, use multi-material for supports, and, overall, enjoy a bit less tweaking and more automated tuning.</p>
<p>And yes, I decided to get in on the toolchanger craze, but not because I want to print multi-coloured baubles–I want to print functional parts with different materials, and toolchangers are <em>another</em> stepwise evolution in the 3D printing world that I want to explore.</p>
<p>I’m slowly getting used to it and jotting down notes for an in-depth post in a few weeks (maybe months, depending on how summer pans out), but I’ve already used it to print <a href="https://www.printables.com/model/924900-aerateur-pour-kit-enclosure-two-trees-sk1?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">that SK1 vent</a> and a few small precision multi-colour and multi-material tests. It is noisy enough that I don’t enjoy running it at full speed while I’m in the office (and its “silent” mode is quieter, but still not something I want to put up with during meetings), so I’m using it mostly on weekends.</p>
<p><a href="/space/apps/orcaslicer" rel="next">OrcaSlicer</a> works (almost) perfectly with it (and is sure to improve), and I’ve already dipped my toes into <a href="https://github.com/rcarmo/swift-flashforgeui?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">building a monitoring app</a> since I am still thinking of it as a sealed appliance, but I know that there will be alternate firmware versions soon(ish) and expect it to become just another <a href="/space/3d/printing/klipper" rel="next">Klipper</a> printer (or close enough) in due time–that, and the simple, no-frills mechanicals, were two of my bets when I picked it out; the third was that maintainability would win out over its somewhat spartan feature set. It’s early days for that, of course.</p>
<p>And <em>of course</em> I’ve gone and started patching around some of Flashforge’s shortcomings myself–besides <a href="https://github.com/rcarmo/swift-flashforgeui?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">that Swift-based desktop app</a> to talk to it, I’ve also printed my own version of a purge bucket (a rite of passage for any modern printer, including toolchangers, it seems), and am actively trying to get around to actually <em>using</em> it for the stuff I want–for which all I really need is the most precious commodity: time.</p>
<p>That and, of course, working my way up to the final print jobs it’s meant to do–the other printers still have their work cut out for them…</p>

<br/>
]]></content>
<category term="3d printing" label="3d printing" />
<category term="flashforge" label="flashforge" />
<category term="hardware" label="hardware" />
<category term="kingroon" label="kingroon" />
<category term="klipper" label="klipper" />
<category term="two trees" label="two trees" />
</entry>
<entry>
<title>MLX / Apple Silicon AI</title>
<id>https://taoofmac.com/space/ai/mlx?utm_content=atom</id>
<published>2026-04-25T12:00:00+00:00</published>
<updated>2026-08-06T14:24: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/ai/mlx?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/ai/mlx?utm_content=atom">MLX / Apple Silicon AI</xhtml:a></xhtml:h2><xhtml:time datetime="2026-04-25T12:00:00+00:00">2026-04-25T12:00:00+00:00</xhtml:time><xhtml:p>A collection of tools, frameworks, and models built on or optimized for Apple’s MLX array framework and the Neural Engine (ANE) on Apple Silicon. MLX is ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">A collection of tools, frameworks, and models built on or optimized for Apple’s <a href="https://github.com/ml-explore/mlx?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MLX</a> array framework and the Neural Engine (ANE) on Apple Silicon. MLX is Apple’s answer to PyTorch/JAX for the M-series chip, with lazy evaluation, unified memory, and first-class Python bindings.</p>
<a id="anchor-resources" class="anchor" href="/space/ai/mlx#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Field</th><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td>3D Asset Models</td><td>Runtimes</td><td>2026</td><td><a href="https://github.com/ZimengXiong/Hunyuan3D-Swift?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Hunyuan3D-Swift</a></td><td><div><p>MLX runtime for Hunyuan3D image-to-3D generation on Apple Silicon</p>
</div></td></tr><tr><td rowspan="2">Audio</td><td>Libraries</td><td>2026</td><td><a href="https://github.com/Blaizzy/mlx-audio?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">mlx-audio</a></td><td><div><p>TTS, STT and speech-to-speech library built on Apple’s MLX for Apple Silicon.</p>
</div></td></tr><tr><td>Models</td><td>2026</td><td><a href="https://github.com/theashishmaurya/mlx-audiocraft?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">mlx-audiocraft</a></td><td><div><p>MLX port of Meta’s AudioCraft for Apple Silicon — music and audio generation via MusicGen and AudioGen</p>
</div></td></tr><tr><td rowspan="2">Frameworks</td><td>Core</td><td>2023</td><td><a href="https://github.com/ml-explore/mlx?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MLX</a></td><td><div><p>An array framework for Apple Silicon — the foundation for all MLX-based tools</p>
</div></td></tr><tr><td>Examples</td><td>2023</td><td><a href="https://github.com/ml-explore/mlx-examples?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">mlx-examples</a></td><td><div><p>Official Apple MLX examples covering LLMs, image generation, speech, and more</p>
</div></td></tr><tr><td rowspan="5">Inference</td><td rowspan="3">Libraries</td><td>{date:%Y}</td><td><a href="https://github.com/apple/python-apple-fm-sdk?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Python Bindings for Apple Intelligence</a></td><td><div><p>Python bindings to Apple’s on-device foundation models</p>
</div></td></tr><tr><td>2026</td><td><a href="https://github.com/antirez/h3.c?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">h3.c</a></td><td><div><p>MiniMax H3 inference engine for Mac computers</p>
</div></td></tr><tr><td>2023</td><td><a href="https://github.com/apple/ml-ane-transformers?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ml-ane-transformers</a></td><td><div><p>Apple’s Transformers library optimized for the Neural Engine</p>
</div></td></tr><tr><td rowspan="2">Tools</td><td rowspan="2">2026</td><td><a href="https://github.com/Blaizzy/nativ?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">nativ</a></td><td><div><p>local AI app for macOS to chat, serve, monitor, and connect MLX models</p>
</div></td></tr><tr><td><a href="https://github.com/bpbonker/npurun?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">npurun</a></td><td><div><p>NPU-first local LLM runtime for Snapdragon X Elite / Windows on ARM</p>
</div></td></tr><tr><td>Research</td><td>Tools</td><td>2026</td><td><a href="https://github.com/ncdrone/autoresearch-ANE?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">autoresearch-ANE</a></td><td><div><p>Autonomous Apple Silicon LLM research suite combining ANE, MLX, and legacy MPS training paths</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="ai" label="ai" />
<category term="ane" label="ane" />
<category term="apple" label="apple" />
<category term="ml" label="ml" />
<category term="mlx" label="mlx" />
<category term="neural engine" label="neural engine" />
<category term="silicon" label="silicon" />
</entry>
<entry>
<title>Tailscale</title>
<id>https://taoofmac.com/space/apps/tailscale?utm_content=atom</id>
<published>2024-03-28T17:30:00+00:00</published>
<updated>2026-08-06T14:21: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/apps/tailscale?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/apps/tailscale?utm_content=atom">Tailscale</xhtml:a></xhtml:h2><xhtml:time datetime="2024-03-28T17:30:00+00:00">2024-03-28T17:30:00+00:00</xhtml:time><xhtml:p>Tailscale is a centrally-managed overlay network VPN service that provides seamless connectivity across your devices no matter where they reside, with a ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead"><a href="https://tailscale.com?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Tailscale</a> is a centrally-managed overlay network <code>VPN</code> service that provides seamless connectivity across your devices no matter where they reside, with a few interesting features:</p>
<ul>
<li>Support for direct access to other LANs (and outbound Internet connections) via “exit nodes”</li>
<li>Support for every single operating system I use (including both major mobile platforms)</li>
<li>Ability to run an exit node on the <a href="/space/com/apple/tv" rel="next">Apple TV</a></li>
<li>Availability of an alternate central management service.</li>
</ul>
<p>I have been using it for a couple of years as a way to remotely access my home machines (and other stuff) when traveling, and have been very happy with it.</p>
<a id="anchor-resources" class="anchor" href="/space/apps/tailscale#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td>Server</td><td>2024</td><td><a href="https://github.com/juanfont/headscale?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">headscale</a></td><td><div><p>a self-hosted Tailscale control server</p>
</div></td></tr><tr><td rowspan="3">Tools</td><td rowspan="3">2026</td><td><a href="https://github.com/Adversis/tailsnitch?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">tailsnitch</a></td><td><div><p>a security auditor that scans tailnets for misconfigurations and risky access controls</p>
</div></td></tr><tr><td><a href="https://github.com/CamM2325/microlink?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">microlink</a></td><td><div><p>a Tailscale-compatible VPN client for ESP32 with Wi-Fi and cellular support</p>
</div></td></tr><tr><td><a href="https://github.com/almeidapaulopt/tsdproxy?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">tsdproxy</a></td><td><div><p>automatic Tailscale reverse proxy for Docker containers</p>
</div></td></tr><tr><td rowspan="2">UI</td><td rowspan="2">2024</td><td><a href="https://github.com/DeedleFake/trayscale?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">trayscale</a></td><td><div><p>a system tray icon for Linux desktops</p>
</div></td></tr><tr><td><a href="https://github.com/mattn/tailscale-systray?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">tailscale-systray</a></td><td><div><p>another system tray icon for Linux desktops</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="network" label="network" />
<category term="overlay" label="overlay" />
<category term="vpn" label="vpn" />
<category term="wireguard" label="wireguard" />
</entry>
<entry>
<title>Steam</title>
<id>https://taoofmac.com/space/apps/steam?utm_content=atom</id>
<published>2010-05-10T20:00:00+00:00</published>
<updated>2026-08-06T13:53: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/apps/steam?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/apps/steam?utm_content=atom">Steam</xhtml:a></xhtml:h2><xhtml:time datetime="2010-05-10T20:00:00+00:00">2010-05-10T20:00:00+00:00</xhtml:time><xhtml:p>Steam is Valve’s game distribution platform, which became especially relevant to me when it started incorporating the Proton WINE-based compatibility layer ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead"><a href="https://store.steampowered.com?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Steam</a> is <a href="com/valve" rel="nofollow">Valve</a>’s game distribution platform, which became especially relevant to me when it started incorporating the <a href="https://github.com/ValveSoftware/Proton?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Proton</a> <a href="/space/emulation/wine" rel="next">WINE</a>-based compatibility layer for running DirectX Windows games on <a href="/space/os/linux" rel="next">Linux</a>.</p>
<a id="anchor-tools" class="anchor" href="/space/apps/steam#tools" rel="anchor"><h2 id="tools">Tools</h2></a>
<a id="anchor-switch-users" class="anchor" href="/space/apps/steam#switch-users" rel="anchor"><h3 id="switch-users">Switch Users</h3></a>
<p>This is something I picked up <a href="https://github.com/SvineruS/steam-account-switcher?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">on github</a> but modified to use <code>vdf</code>:</p>
<pre tabindex="0" class="chroma"><code><span class="line"><span class="cl"><span class="ch">#!/bin/env python</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">vdf</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">LOGIN_USERS</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">home</span><span class="p">()</span> <span class="o">/</span> <span class="s2">&#34;.local/share/Steam/config/loginusers.vdf&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">REGISTRY</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">home</span><span class="p">()</span> <span class="o">/</span> <span class="s2">&#34;.steam/registry.vdf&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Current account:&#34;</span><span class="p">,</span> <span class="n">get_account</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">accounts</span> <span class="o">=</span> <span class="n">get_accounts</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">account</span> <span class="o">=</span> <span class="n">choose_account</span><span class="p">(</span><span class="n">accounts</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">set_account</span><span class="p">(</span><span class="n">account</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">Restart steam? [Y/n]: &#34;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s2">&#34;n&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s2">&#34;killall steam&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_accounts</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">LOGIN_USERS</span><span class="p">,</span> <span class="err">‘</span><span class="n">r</span><span class="err">’</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">user_registry</span> <span class="o">=</span> <span class="n">vdf</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">user_registry</span><span class="p">[</span><span class="err">‘</span><span class="n">users</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">choose_account</span><span class="p">(</span><span class="n">accounts</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">accounts_to_choose</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">account</span><span class="p">[</span><span class="err">‘</span><span class="n">AccountName</span><span class="err">’</span><span class="p">]:</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="n">account</span><span class="p">[</span><span class="err">‘</span><span class="n">AccountName</span><span class="err">’</span><span class="p">],</span> <span class="n">account</span><span class="p">[</span><span class="err">‘</span><span class="n">PersonaName</span><span class="err">’</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">account</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">accounts</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">Choose an account:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">username</span> <span class="ow">in</span> <span class="n">accounts_to_choose</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">acc</span> <span class="o">=</span> <span class="nb">input</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">account</span><span class="p">,</span> <span class="n">names</span> <span class="ow">in</span> <span class="n">accounts_to_choose</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">acc</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="n">account</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_account</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">REGISTRY</span><span class="p">,</span> <span class="err">‘</span><span class="n">r</span><span class="err">’</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">registry</span> <span class="o">=</span> <span class="n">vdf</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">registry</span><span class="p">[</span><span class="err">‘</span><span class="n">Registry</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">HKCU</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">Software</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">Valve</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">Steam</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">AutoLoginUser</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">set_account</span><span class="p">(</span><span class="n">account</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">REGISTRY</span><span class="p">,</span> <span class="err">‘</span><span class="n">r</span><span class="err">’</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">registry</span> <span class="o">=</span> <span class="n">vdf</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">registry</span><span class="p">[</span><span class="err">‘</span><span class="n">Registry</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">HKCU</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">Software</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">Valve</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">Steam</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">AutoLoginUser</span><span class="err">’</span><span class="p">]</span> <span class="o">=</span> <span class="n">account</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">REGISTRY</span><span class="p">,</span> <span class="err">‘</span><span class="n">w</span><span class="err">’</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">vdf</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">registry</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">pretty</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">main</span><span class="p">()</span>
</span></span></code></pre>
<a id="anchor-manage-shortcuts" class="anchor" href="/space/apps/steam#manage-shortcuts" rel="anchor"><h3 id="manage-shortcuts">Manage Shortcuts</h3></a>
<p>This is something I wrote to manage shortcuts for Linux emulators:</p>
<pre tabindex="0" class="chroma"><code><span class="line"><span class="cl"><span class="ch">#!/bin/env python</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">os</span> <span class="kn">import</span> <span class="n">environ</span><span class="p">,</span> <span class="n">remove</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">join</span><span class="p">,</span> <span class="n">exists</span><span class="p">,</span> <span class="n">splitext</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">vdf</span> <span class="kn">import</span> <span class="n">binary_load</span><span class="p">,</span> <span class="n">binary_dump</span><span class="p">,</span> <span class="n">dump</span><span class="p">,</span> <span class="n">parse</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">requests</span> <span class="kn">import</span> <span class="n">Session</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">requests.structures</span> <span class="kn">import</span> <span class="n">CaseInsensitiveDict</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">logging</span> <span class="kn">import</span> <span class="n">getLogger</span><span class="p">,</span> <span class="n">basicConfig</span><span class="p">,</span> <span class="n">INFO</span><span class="p">,</span> <span class="n">DEBUG</span><span class="p">,</span> <span class="n">WARN</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">zlib</span> <span class="kn">import</span> <span class="n">crc32</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">click</span> <span class="kn">import</span> <span class="n">group</span><span class="p">,</span> <span class="n">option</span><span class="p">,</span> <span class="n">command</span><span class="p">,</span> <span class="n">argument</span><span class="p">,</span> <span class="n">secho</span> <span class="k">as</span> <span class="n">echo</span><span class="p">,</span> <span class="n">pass_context</span><span class="p">,</span> <span class="n">STRING</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">shutil</span> <span class="kn">import</span> <span class="n">copyfile</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">shlex</span> <span class="kn">import</span> <span class="n">quote</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">INFO</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="s1">&#39;</span><span class="si">%(asctime)s</span><span class="s1"> </span><span class="si">%(levelname)s</span><span class="s1"> </span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">log</span> <span class="o">=</span> <span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">STEAM_ID</span>             <span class="o">=</span> <span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;STEAM_ID&#34;</span><span class="p">,</span> <span class="s2">&#34;901194859&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">STEAM_PATH</span>           <span class="o">=</span> <span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;STEAM_PATH&#34;</span><span class="p">,</span><span class="s2">&#34;/home/me/.steam/steam&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">STEAM_USER_DATA_PATH</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">STEAM_PATH</span><span class="p">,</span><span class="s2">&#34;userdata&#34;</span><span class="p">,</span><span class="n">STEAM_ID</span><span class="p">,</span><span class="s2">&#34;config&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">STEAMGRIDDB_API_KEY</span>  <span class="o">=</span> <span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;STEAMGRIDDB_API_KEY&#34;</span><span class="p">,</span><span class="s2">&#34;dc5b9820c178614336d7659eb7b64453&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">GRID_FOLDER</span>          <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">STEAM_USER_DATA_PATH</span><span class="p">,</span><span class="s1">&#39;grid&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">CACHE_PATH</span>           <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;HOME&#34;</span><span class="p">),</span><span class="s2">&#34;.cache&#34;</span><span class="p">,</span><span class="s2">&#34;steamgriddb&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">SHORTCUTS_FILE</span>       <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">STEAM_USER_DATA_PATH</span><span class="p">,</span><span class="s1">&#39;shortcuts.vdf&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">LOCALCONFIG_FILE</span>     <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">STEAM_USER_DATA_PATH</span><span class="p">,</span><span class="s1">&#39;localconfig.vdf&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="p">[</span><span class="n">GRID_FOLDER</span><span class="p">,</span> <span class="n">CACHE_PATH</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">exists</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">Path</span><span class="p">(</span><span class="n">f</span><span class="p">)</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@group</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">tool</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;A simple CLI utility to manage Steam shortcuts for Linux emulators&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">pass</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@tool</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">list_shortcuts</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;List all existing shortcuts&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">SHORTCUTS_FILE</span><span class="p">,</span> <span class="s2">&#34;rb&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="n">binary_load</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">shortcuts</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">headers</span> <span class="o">=</span> <span class="s2">&#34;appid AppName Exe LaunchOptions LastPlayTime&#34;</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">rows</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">        <span class="n">r</span> <span class="o">=</span> <span class="n">CaseInsensitiveDict</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)])</span>
</span></span><span class="line"><span class="cl">        <span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">r</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="n">column_widths</span> <span class="o">=</span> <span class="p">{</span><span class="n">header</span><span class="p">:</span> <span class="nb">max</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">header</span><span class="p">),</span> <span class="o">*</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">header</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">headers</span><span class="p">)}</span>
</span></span><span class="line"><span class="cl">    <span class="n">header_format</span> <span class="o">=</span> <span class="s2">&#34; | &#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="se">{{</span><span class="s2">:</span><span class="si">{</span><span class="n">column_widths</span><span class="p">[</span><span class="n">header</span><span class="p">]</span><span class="si">}</span><span class="se">}}</span><span class="s2">&#34;</span> <span class="k">for</span> <span class="n">header</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">row_format</span> <span class="o">=</span> <span class="n">header_format</span>
</span></span><span class="line"><span class="cl">    <span class="n">echo</span><span class="p">(</span><span class="n">header_format</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">*</span><span class="n">headers</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">echo</span><span class="p">(</span><span class="s2">&#34;-+-&#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="err">‘</span><span class="o">-</span><span class="err">’</span> <span class="o">*</span> <span class="n">column_widths</span><span class="p">[</span><span class="n">header</span><span class="p">]</span> <span class="k">for</span> <span class="n">header</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">echo</span><span class="p">(</span><span class="n">row_format</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">*</span><span class="n">row</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@tool</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">list_steam_input</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;List Steam Input settings&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">SHORTCUTS_FILE</span><span class="p">,</span> <span class="s2">&#34;rb&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="n">binary_load</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">data</span> <span class="o">=</span> <span class="n">CaseInsensitiveDict</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">shortcuts</span><span class="err">’</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="n">apps</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="n">apps</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="err">‘</span><span class="n">appid</span><span class="err">’</span><span class="p">])]</span><span class="o">=</span><span class="n">v</span><span class="p">[</span><span class="err">‘</span><span class="n">AppName</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">LOCALCONFIG_FILE</span><span class="p">,</span> <span class="s2">&#34;r&#34;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;utf8&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="err">‘</span><span class="n">UserLocalConfigStore</span><span class="err">’</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">    <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">UserLocalConfigStore</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">apps</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="s2">&#34;appid&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="n">k</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">apps</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">data</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="s2">&#34;AppName&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="n">apps</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">data</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="s2">&#34;AppName&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;(Unknown)&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">headers</span> <span class="o">=</span> <span class="s2">&#34;appid AppName OverlayAppEnable UseSteamControllerConfig SteamControllerRumble SteamControllerRumbleIntensity&#34;</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">rows</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">data</span><span class="p">[</span><span class="n">r</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="n">r</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&#34;&#34;</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="n">column_widths</span> <span class="o">=</span> <span class="p">{</span><span class="n">header</span><span class="p">:</span> <span class="nb">max</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">header</span><span class="p">),</span> <span class="o">*</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">header</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">headers</span><span class="p">)}</span>
</span></span><span class="line"><span class="cl">    <span class="n">header_format</span> <span class="o">=</span> <span class="s2">&#34; | &#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="se">{{</span><span class="s2">:</span><span class="si">{</span><span class="n">column_widths</span><span class="p">[</span><span class="n">header</span><span class="p">]</span><span class="si">}</span><span class="se">}}</span><span class="s2">&#34;</span> <span class="k">for</span> <span class="n">header</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">row_format</span> <span class="o">=</span> <span class="n">header_format</span>
</span></span><span class="line"><span class="cl">    <span class="n">echo</span><span class="p">(</span><span class="n">header_format</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">*</span><span class="n">headers</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">echo</span><span class="p">(</span><span class="s2">&#34;-+-&#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="err">‘</span><span class="o">-</span><span class="err">’</span> <span class="o">*</span> <span class="n">column_widths</span><span class="p">[</span><span class="n">header</span><span class="p">]</span> <span class="k">for</span> <span class="n">header</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">echo</span><span class="p">(</span><span class="n">row_format</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">*</span><span class="n">row</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@tool</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nd">@argument</span><span class="p">(</span><span class="err">‘</span><span class="n">appid</span><span class="err">’</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">STRING</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">disable_steam_input</span><span class="p">(</span><span class="n">appid</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Disable Steam Input for an appid&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">appid</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">SHORTCUTS_FILE</span><span class="p">,</span> <span class="s2">&#34;rb&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">data</span> <span class="o">=</span> <span class="n">binary_load</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">shortcuts</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">apps</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">            <span class="n">apps</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="err">‘</span><span class="n">appid</span><span class="err">’</span><span class="p">])]</span><span class="o">=</span><span class="n">v</span><span class="p">[</span><span class="err">‘</span><span class="n">AppName</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">appid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">apps</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;invalid appid </span><span class="si">{</span><span class="n">appid</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">LOCALCONFIG_FILE</span><span class="p">,</span> <span class="s2">&#34;r&#34;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;utf8&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">data</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="err">‘</span><span class="n">UserLocalConfigStore</span><span class="err">’</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">UserLocalConfigStore</span><span class="err">’</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="err">‘</span><span class="n">apps</span><span class="err">’</span><span class="p">:{}}</span>
</span></span><span class="line"><span class="cl">        <span class="n">apps</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">UserLocalConfigStore</span><span class="err">’</span><span class="p">][</span><span class="err">‘</span><span class="n">apps</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">appid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">apps</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">apps</span><span class="p">[</span><span class="n">appid</span><span class="p">]</span><span class="o">=</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">        <span class="n">apps</span><span class="p">[</span><span class="n">appid</span><span class="p">][</span><span class="s2">&#34;OverlayAppEnable&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;1&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="n">apps</span><span class="p">[</span><span class="n">appid</span><span class="p">][</span><span class="s2">&#34;UseSteamControllerConfig&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;0&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="n">apps</span><span class="p">[</span><span class="n">appid</span><span class="p">][</span><span class="s2">&#34;SteamControllerRumble&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;-1&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="n">apps</span><span class="p">[</span><span class="n">appid</span><span class="p">][</span><span class="s2">&#34;SteamControllerRumbleIntensity&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&#34;320&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">LOCALCONFIG_FILE</span><span class="p">,</span> <span class="s2">&#34;w&#34;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;utf8&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">h</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">dump</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@tool</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nd">@argument</span><span class="p">(</span><span class="err">‘</span><span class="n">grid_id</span><span class="err">’</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fetch</span><span class="p">(</span><span class="n">grid_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Fetch media for &lt;grid_id&gt; from SteamGridDB&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">fetch_images</span><span class="p">(</span><span class="n">grid_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">find_id</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="err">‘</span><span class="n">Authorization</span><span class="err">’</span><span class="p">:</span> <span class="n">f</span><span class="err">’</span><span class="n">Bearer</span> <span class="p">{</span><span class="n">STEAMGRIDDB_API_KEY</span><span class="p">}</span><span class="s1">&#39;}</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="n">Session</span><span class="p">()</span> <span class="k">as</span> <span class="n">s</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">response</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">f</span><span class="err">’</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">steamgriddb</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">api</span><span class="o">/</span><span class="n">v2</span><span class="o">/</span><span class="n">search</span><span class="o">/</span><span class="n">autocomplete</span><span class="o">/</span><span class="p">{</span><span class="n">name</span><span class="p">}</span><span class="s1">&#39;,</span>
</span></span><span class="line"><span class="cl">                         <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">data</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">success</span><span class="err">’</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">data</span><span class="err">’</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="err">‘</span><span class="nb">id</span><span class="err">’</span><span class="p">]</span> <span class="c1"># take first result only</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fetch_images</span><span class="p">(</span><span class="n">game_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="err">‘</span><span class="n">Authorization</span><span class="err">’</span><span class="p">:</span> <span class="n">f</span><span class="err">’</span><span class="n">Bearer</span> <span class="p">{</span><span class="n">STEAMGRIDDB_API_KEY</span><span class="p">}</span><span class="s1">&#39;}</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="n">Session</span><span class="p">()</span> <span class="k">as</span> <span class="n">s</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">image_type</span> <span class="ow">in</span> <span class="p">[</span><span class="err">‘</span><span class="n">banner</span><span class="err">’</span><span class="p">,</span><span class="s1">&#39;grid&#39;</span><span class="p">,</span> <span class="err">‘</span><span class="n">hero</span><span class="err">’</span><span class="p">,</span> <span class="err">‘</span><span class="n">logo</span><span class="err">’</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="n">local_path</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">CACHE_PATH</span><span class="p">,</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">game_id</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">image_type</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">have</span> <span class="o">=</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="n">ext</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&#34;.jpg&#34;</span><span class="p">,</span> <span class="s2">&#34;.png&#34;</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="n">exists</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">local_path</span><span class="si">}{</span><span class="n">ext</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                    <span class="n">have</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">have</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">continue</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">image_type</span> <span class="o">==</span> <span class="err">‘</span><span class="n">hero</span><span class="err">’</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">base_url</span> <span class="o">=</span> <span class="n">f</span><span class="err">’</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">steamgriddb</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">api</span><span class="o">/</span><span class="n">v2</span><span class="o">/</span><span class="n">heroes</span><span class="o">/</span><span class="n">game</span><span class="o">/</span><span class="p">{</span><span class="n">game_id</span><span class="p">}</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">image_type</span> <span class="o">==</span> <span class="err">‘</span><span class="n">banner</span><span class="err">’</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">base_url</span> <span class="o">=</span> <span class="n">f</span><span class="err">’</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">steamgriddb</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">api</span><span class="o">/</span><span class="n">v2</span><span class="o">/</span><span class="n">grids</span><span class="o">/</span><span class="n">game</span><span class="o">/</span><span class="p">{</span><span class="n">game_id</span><span class="p">}</span><span class="err">?</span><span class="n">dimensions</span><span class="o">=</span><span class="mi">920</span><span class="n">x430</span><span class="p">,</span><span class="mi">460</span><span class="n">x215</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">base_url</span> <span class="o">=</span> <span class="n">f</span><span class="err">’</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">steamgriddb</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">api</span><span class="o">/</span><span class="n">v2</span><span class="o">/</span><span class="p">{</span><span class="n">image_type</span><span class="p">}</span><span class="n">s</span><span class="o">/</span><span class="n">game</span><span class="o">/</span><span class="p">{</span><span class="n">game_id</span><span class="p">}</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">response</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">base_url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">game_id</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">image_type</span><span class="si">}</span><span class="s2">,</span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">data</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">success</span><span class="err">’</span><span class="p">]</span> <span class="ow">and</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">data</span><span class="err">’</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">                    <span class="n">image_url</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="err">‘</span><span class="n">data</span><span class="err">’</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="err">‘</span><span class="n">url</span><span class="err">’</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    <span class="n">ext</span> <span class="o">=</span> <span class="n">splitext</span><span class="p">(</span><span class="n">image_url</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    <span class="n">response</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">image_url</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">local_path</span><span class="si">}{</span><span class="n">ext</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="err">‘</span><span class="n">wb</span><span class="err">’</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                        <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">image_url</span><span class="si">}</span><span class="s2">-&gt;</span><span class="si">{</span><span class="n">local_path</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@tool</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nd">@option</span><span class="p">(</span><span class="s2">&#34;-e&#34;</span><span class="p">,</span> <span class="s2">&#34;–emulator&#34;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&#34;org.retrodeck.RetroDECK&#34;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&#34;flatpak identifier&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nd">@option</span><span class="p">(</span><span class="s2">&#34;-a&#34;</span><span class="p">,</span> <span class="s2">&#34;–args&#34;</span><span class="p">,</span> <span class="n">multiple</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&#34;arguments&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nd">@option</span><span class="p">(</span><span class="s2">&#34;-n&#34;</span><span class="p">,</span> <span class="s2">&#34;–name&#34;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s2">&#34;RetroDECK&#34;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&#34;shortcut name&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nd">@option</span><span class="p">(</span><span class="s2">&#34;-i&#34;</span><span class="p">,</span> <span class="s2">&#34;–dbid&#34;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&#34;SteamGridDB ID to get images from&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="n">emulator</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">dbid</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Create a new shortcut entry&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">dbid</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">dbid</span> <span class="o">=</span> <span class="n">find_id</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">fetch_images</span><span class="p">(</span><span class="n">dbid</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">exists</span><span class="p">(</span><span class="n">SHORTCUTS_FILE</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">SHORTCUTS_FILE</span><span class="p">,</span> <span class="err">‘</span><span class="n">rb</span><span class="err">’</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">shortcuts</span> <span class="o">=</span> <span class="n">binary_load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">shortcuts</span> <span class="o">=</span> <span class="p">{</span><span class="err">‘</span><span class="n">shortcuts</span><span class="err">’</span><span class="p">:</span> <span class="p">{}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">appid</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">crc32</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="err">‘</span><span class="n">utf</span><span class="o">-</span><span class="mi">8</span><span class="err">’</span><span class="p">))</span> <span class="o">|</span> <span class="mh">0x80000000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">new_entry</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;appid&#34;</span><span class="p">:</span> <span class="n">appid</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;AppName&#34;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Exe&#34;</span><span class="p">:</span> <span class="s2">&#34;flatpak&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;StartDir&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;LaunchOptions&#34;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&#34;run </span><span class="si">{</span><span class="n">emulator</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">quote</span><span class="p">(</span><span class="s2">&#34; &#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">))</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;IsHidden&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;AllowDesktopConfig&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;OpenVR&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;Devkit&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;DevkitGameID&#34;</span><span class="p">:</span> <span class="s2">&#34;shortcuts&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;LastPlayTime&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;tags&#34;</span><span class="p">:</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">new_entry</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">shortcuts</span><span class="p">[</span><span class="err">‘</span><span class="n">shortcuts</span><span class="err">’</span><span class="p">][</span><span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">shortcuts</span><span class="p">[</span><span class="err">‘</span><span class="n">shortcuts</span><span class="err">’</span><span class="p">]))]</span> <span class="o">=</span> <span class="n">new_entry</span>
</span></span><span class="line"><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;added </span><span class="si">{</span><span class="n">appid</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">image_type</span> <span class="ow">in</span> <span class="p">[</span><span class="err">‘</span><span class="n">grid</span><span class="err">’</span><span class="p">,</span> <span class="err">‘</span><span class="n">hero</span><span class="err">’</span><span class="p">,</span> <span class="err">‘</span><span class="n">logo</span><span class="err">’</span><span class="p">,</span><span class="s1">&#39;banner&#39;</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">        <span class="n">local_path</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">CACHE_PATH</span><span class="p">,</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">dbid</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">image_type</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&#34;.jpg&#34;</span><span class="p">,</span> <span class="s2">&#34;.png&#34;</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">image_type</span> <span class="o">==</span> <span class="err">‘</span><span class="n">grid</span><span class="err">’</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">dest_path</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">GRID_FOLDER</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">appid</span><span class="si">}</span><span class="s1">p</span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">image_type</span> <span class="o">==</span> <span class="err">‘</span><span class="n">hero</span><span class="err">’</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">dest_path</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">GRID_FOLDER</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">appid</span><span class="si">}</span><span class="s1">_hero</span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">image_type</span> <span class="o">==</span> <span class="err">‘</span><span class="n">logo</span><span class="err">’</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">dest_path</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">GRID_FOLDER</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">appid</span><span class="si">}</span><span class="s1">_logo</span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">elif</span> <span class="n">image_type</span> <span class="o">==</span> <span class="err">‘</span><span class="n">banner</span><span class="err">’</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">dest_path</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span><span class="n">GRID_FOLDER</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">appid</span><span class="si">}{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">local_path</span><span class="o">+</span><span class="n">e</span><span class="si">}</span><span class="s2">-&gt;</span><span class="si">{</span><span class="n">dest_path</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">exists</span><span class="p">(</span><span class="n">local_path</span> <span class="o">+</span> <span class="n">e</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                <span class="n">copyfile</span><span class="p">(</span><span class="n">local_path</span><span class="o">+</span><span class="n">e</span><span class="p">,</span> <span class="n">dest_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">SHORTCUTS_FILE</span><span class="p">,</span> <span class="err">‘</span><span class="n">wb</span><span class="err">’</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">binary_dump</span><span class="p">(</span><span class="n">shortcuts</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&#34;shortcuts updated.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="err">‘</span><span class="n">__main__</span><span class="err">’</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">tool</span><span class="p">()</span>
</span></span></code></pre>
<a id="anchor-resources" class="anchor" href="/space/apps/steam#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td>Deployment</td><td>2025</td><td><a href="https://github.com/Steam-Headless/docker-steam-headless?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">docker-steam-headless</a></td><td><div><p>Docker image for running Steam in headless mode.</p>
</div></td></tr><tr><td>Tools</td><td>2026</td><td><a href="https://github.com/FrogTheFrog/moondeck?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">moondeck</a></td><td><div><p>Steam Deck companion for managing gamestream sessions</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="gaming" label="gaming" />
<category term="mac" label="mac" />
<category term="proton" label="proton" />
<category term="valve" label="valve" />
<category term="windows" label="windows" />
</entry>
<entry>
<title>AI Image Generation</title>
<id>https://taoofmac.com/space/ai/image?utm_content=atom</id>
<published>2025-05-01T18:45:00+00:00</published>
<updated>2026-08-06T13:01: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/ai/image?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/ai/image?utm_content=atom">AI Image Generation</xhtml:a></xhtml:h2><xhtml:time datetime="2025-05-01T18:45:00+00:00">2025-05-01T18:45:00+00:00</xhtml:time><xhtml:p>This page is a collection of notes and links related to AI image generation technologies, including Stable Diffusion, DALL-E, Midjourney, and other ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">This page is a collection of notes and links related to <a href="/space/ai" rel="next">AI</a> image generation technologies, including Stable Diffusion, DALL-E, Midjourney, and other generative image models like Z-Image that have become prominent in the modern <a href="/space/ai" rel="next">AI</a> space.</p>
<a id="anchor-resources" class="anchor" href="/space/ai/image#resources" rel="anchor"><h2 id="resources">Resources</h2></a>
<p></p><table class="compact"><thead><tr><th>Field</th><th>Category</th><th>Date</th><th>Link</th><th>Notes</th></tr></thead><tbody><tr><td rowspan="2"></td><td>Diffusion Models</td><td>2026</td><td><a href="https://github.com/ferdous-alam/GenCAD?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">GenCAD</a></td><td><div><p>Image-conditioned CAD generation using transformer contrastive representations and diffusion priors (TMLR 2025).</p>
</div></td></tr><tr><td>Tools</td><td>2026</td><td><a href="https://github.com/wiltodelta/remove-ai-watermarks?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">remove-ai-watermarks</a></td><td><div><p>CLI and library to strip visible (Gemini) and invisible (SynthID, C2PA, EXIF) AI watermarks from images</p>
</div></td></tr><tr><td>3D Asset Models</td><td>Generative AI</td><td>2026</td><td><a href="https://github.com/Tencent-Hunyuan/Hunyuan3D-WorldClaw?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Hunyuan3D-WorldClaw</a></td><td><div><p>3D world generation project from Tencent Hunyuan</p>
</div></td></tr><tr><td>3D Rendering</td><td>NeRF Tools</td><td>2022</td><td><a href="https://github.com/nerfstudio-project/nerfstudio?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">nerfstudio</a></td><td><div><p>A tool for manipulating Neural Radiance Fields (NeRF) and rendering the scenes out as video</p>
</div></td></tr><tr><td>Desktop Tools</td><td>Image Processing</td><td>2026</td><td><a href="https://github.com/ad-si/Perspec?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Perspec</a></td><td><div><p>scriptable desktop app to correct image perspective</p>
</div></td></tr><tr><td>Diffusion Models</td><td>Image Generation</td><td>2026</td><td><a href="https://github.com/NVlabs/Sana?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Sana</a></td><td><div><p>Efficient high-resolution image synthesis with linear diffusion transformer — fast 4K generation on laptop GPUs</p>
</div></td></tr><tr><td rowspan="2">Gaussian Splatting</td><td>Image Generation</td><td></td><td><a href="https://github.com/apple/ml-sharp?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ml-sharp</a></td><td><div><p>Apple’s ML-SHARP (Sharp Learned Attention Reduction and Pruning) framework</p>
</div></td></tr><tr><td>Web Interface</td><td>2026</td><td><a href="https://github.com/bring-shrubbery/ml-sharp-web?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ml-sharp-web</a></td><td><div><p>Web playground for creating Gaussian Splats using Apple’s SHARP model.</p>
</div></td></tr><tr><td>General</td><td>Tools</td><td>2024</td><td><a href="https://github.com/upscayl/upscayl?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">upscayl</a></td><td><div><p>an AI-based image upscaler</p>
</div></td></tr><tr><td rowspan="9">Generative AI</td><td rowspan="2">3D Asset Models</td><td>2026</td><td><a href="https://github.com/DreamTechAI/Direct3D?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Direct3D</a></td><td><div><p>a 3D textured asset generation model from images via 3D latent diffusion</p>
</div></td></tr><tr><td>2025</td><td><a href="https://github.com/Tencent/Hunyuan3D-2?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Hunyuan3D-2</a></td><td><div><p>a 3D textured asset generation model</p>
</div></td></tr><tr><td>Diffusion Models</td><td>2025</td><td><a href="https://github.com/yousef-rafat/miniDiffusion?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">miniDiffusion</a></td><td><div><p>a minimalistic implementation of diffusion models in Python</p>
</div></td></tr><tr><td>Frame Prediction</td><td>2025</td><td><a href="https://github.com/lllyasviel/FramePack?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">FramePack</a></td><td><div><p>a next-frame (next-frame-section) prediction neural network structure that generates videos progressively.</p>
</div></td></tr><tr><td rowspan="2">Image Generation Models</td><td>2026</td><td><a href="https://huggingface.co/microsoft/Mage-Flow?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Mage-Flow</a></td><td><div><p>a text-to-image and image-editing diffusion model</p>
</div></td></tr><tr><td>2025</td><td><a href="https://github.com/Alpha-VLLM/Lumina-Image-2.0?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Lumina-Image-2.0</a></td><td><div><p>Another image generation model</p>
</div></td></tr><tr><td>Video Diffusion</td><td>2025</td><td><a href="https://github.com/thu-ml/TurboDiffusion?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">TurboDiffusion</a></td><td><div><p>A video diffusion acceleration framework claiming 100-200x end-to-end speedups (SageAttention/SLA/rCM)</p>
</div></td></tr><tr><td>Video Generation Models</td><td>2024</td><td><a href="https://github.com/Tencent/HunyuanVideo?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">HunyuanVideo</a></td><td><div><p>A pretty impressive open source video generation model</p>
</div></td></tr><tr><td>Web Interface</td><td>2025</td><td><a href="https://github.com/Alasano/gpt-image-1-playground?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">gpt-image-1-playground</a></td><td><div><p>a simple web-based interface for generating images using GPT-IMAGE-1</p>
</div></td></tr><tr><td rowspan="11">Image Generation</td><td>Apple Optimization</td><td>2022</td><td><a href="https://github.com/apple/ml-stable-diffusion?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">CoreML Stable Diffusion</a></td><td><div><p>Apple’s optimizations for CoreML</p>
</div></td></tr><tr><td>Apps</td><td>2025</td><td><a href="https://github.com/WaveSpeedAI/wavespeed-desktop?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">wavespeed-desktop</a></td><td><div><p>A desktop application for generating images that also supports Z-Image</p>
</div></td></tr><tr><td rowspan="2">Diffusion Acceleration</td><td>2024</td><td><a href="https://github.com/ChenDarYen/NitroFusion?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">NitroFusion</a></td><td><div><p>a high-fidelity, fast (single-step) SDXL diffusion model</p>
</div></td></tr><tr><td>2022</td><td><a href="https://github.com/VoltaML/voltaML-fast-stable-diffusion?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Fast Stable Diffusion</a></td><td><div><p>Another tactic to accelerate inference</p>
</div></td></tr><tr><td rowspan="3">Implementations</td><td>2026</td><td><a href="https://github.com/antirez/flux2.c?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">flux2.c</a></td><td><div><p>A pure-C FLUX.2 implementation with optional BLAS/MPS acceleration and zero Python dependencies. Focused on efficiency and portability.</p>
</div></td></tr><tr><td rowspan="2">2025</td><td><a href="https://github.com/FiditeNemini/z-image-turbo-mlx?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">z-image-turbo-mlx</a></td><td><div><p>A high-performance implementation of Z-Image using MLX acceleration</p>
</div></td></tr><tr><td><a href="https://github.com/ivanfioravanti/z-image-mps?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">z-image-mps</a></td><td><div><p>An optimized implementation of Z-Image for Apple Silicon using MPS</p>
</div></td></tr><tr><td rowspan="2">Tools</td><td>2026</td><td><a href="https://github.com/PrismML-Eng/Bonsai-image-demo?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Bonsai-image-demo</a></td><td><div><p>a local image generation demo for Apple Silicon, Linux NVIDIA, and native Windows NVIDIA systems</p>
</div></td></tr><tr><td>2025</td><td><a href="https://github.com/martin-rizzo/AmazingZImageWorkflow?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">AmazingZImageWorkflow</a></td><td><div><p>A comprehensive workflow for generating images using Z-Image</p>
</div></td></tr><tr><td>Vector Graphics</td><td>2025</td><td><a href="https://github.com/SagiPolaczek/NeuralSVG?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">NeuralSVG</a></td><td><div><p>An Implicit Representation for Text-to-Vector Generation</p>
</div></td></tr><tr><td>Web Interface</td><td>2022</td><td><a href="https://github.com/automatic1111/stable-diffusion-webui?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Stable Diffusion WebUI</a></td><td><div><p>Nearly always the best, bleeding edge WebUI for SD</p>
</div></td></tr><tr><td>Multi-modal Models</td><td>Samples</td><td>2024</td><td><a href="https://github.com/apple/ml-mgie?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ml-mgie</a></td><td><div><p>instruction-based image self-editing</p>
</div></td></tr><tr><td>Multimodal AI</td><td>Vision Language Models</td><td>2026</td><td><a href="https://github.com/Blaizzy/mlx-vlm?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">MLX-VLM</a></td><td><div><p>package for inference and fine-tuning of Vision Language Models and Omni Models on Mac using MLX with support for images, audio, and video</p>
</div></td></tr><tr><td rowspan="19">Stable Diffusion</td><td rowspan="3">Apps</td><td>2023</td><td><a href="https://github.com/huggingface/swift-coreml-diffusers?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">swift-coreml-diffusers</a></td><td><div><p>Hugging face’s own app, using Swift and CoreML for Apple Silicon</p>
</div></td></tr><tr><td rowspan="2">2022</td><td><a href="https://apps.apple.com/us/app/draw-things-ai-generation/id6444050820?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Draw Things</a></td><td><div><p>Pre-packaged app for iOS, downloads and allows re-use of .ckpt files.</p>
</div></td></tr><tr><td><a href="https://diffusionbee.com/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">DiffusionBee</a></td><td><div><p>Pre-packaged app for macOS (M1 and Intel)</p>
</div></td></tr><tr><td rowspan="2">CGI</td><td>2023</td><td><a href="https://github.com/coolzilj/Blender-ControlNet?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Blender-ControlNet</a></td><td><div><p>A Blender plugin to generate ControlNet inputs for posing figures</p>
</div></td></tr><tr><td>2022</td><td><a href="https://github.com/carson-katri/dream-textures?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">dream-textures</a></td><td><div><p>A Blender plugin for texturing models based on a text description.</p>
</div></td></tr><tr><td>Implementations</td><td>2023</td><td><a href="https://github.com/vitoplantamura/OnnxStream?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">OnnxStream</a></td><td><div><p>Stable Diffusion XL 1.0 Base on a Raspberry Pi Zero 2 (or in 298MB of RAM)</p>
</div></td></tr><tr><td>Libraries</td><td>2024</td><td><a href="https://github.com/oracle-samples/sd4j?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">sd4j</a></td><td><div><p>a Java library for Stable Diffusion that uses ONNX</p>
</div></td></tr><tr><td rowspan="2">Models</td><td>2024</td><td><a href="https://huggingface.co/ByteDance/SDXL-Lightning?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">SDXL-Lightning</a></td><td><div><p>an SDXL flavor that works on only a few steps</p>
</div></td></tr><tr><td>2023</td><td><a href="https://upscale.wiki/wiki/Model_Database?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Upscale Model Database</a></td><td><div><p>Too wide a choice, perhaps</p>
</div></td></tr><tr><td rowspan="2">Reference</td><td rowspan="2">2024</td><td><a href="https://github.com/6174/comflowy?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">comflowy</a></td><td><div><p>a set of reference workflows and documentation for ComfyUI</p>
</div></td></tr><tr><td><a href="https://github.com/black-forest-labs/flux?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">flux</a></td><td><div><p>minimal inference examples for FLUX.1 models</p>
</div></td></tr><tr><td rowspan="8">Tools</td><td>2024</td><td><a href="https://github.com/6174/comflowyspace?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">comflowyspace</a></td><td><div><p>a ComfyUI desktop wrapper</p>
</div></td></tr><tr><td rowspan="6">2023</td><td><a href="https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ComfyUI-AnimateDiff-Evolved</a></td><td><div><p>An AnimateDiff integration for ComfyUI</p>
</div></td></tr><tr><td><a href="https://github.com/comfyanonymous/ComfyUI?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ComfyUI</a></td><td><div><p>pretty impressive node-based UI</p>
</div></td></tr><tr><td><a href="https://github.com/invoke-ai/InvokeAI?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">InvokeAI</a></td><td><div><p>A polished UI</p>
</div></td></tr><tr><td><a href="https://github.com/leejet/stable-diffusion.cpp?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">stable-diffusion.cpp</a></td><td><div><p>stable diffusion inference on the CPU, in pure C++</p>
</div></td></tr><tr><td><a href="https://github.com/ltdrdata/ComfyUI-Manager?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">ComfyUI-Manager</a></td><td><div><p>A component manager for ComfyUI</p>
</div></td></tr><tr><td><a href="https://github.com/varunshenoy/opendream?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">Opendream</a></td><td><div><p>A layer-oriented, non-destructive editor</p>
</div></td></tr><tr><td>2022</td><td><a href="https://github.com/brycedrennan/imaginAIry?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">imaginAIry</a></td><td><div><p>Works well on Apple Silicon, pure CLI interface to all SD models.
Does not reuse <code>.ckpt</code> files, however, so requires separate disk cache.</p>
</div></td></tr><tr><td>Upscaling</td><td>Video Enhancement</td><td>2025</td><td><a href="https://github.com/k4yt3x/video2x?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">video2x</a></td><td><div><p>a tool for upscaling videos using RealESRGAN and other models</p>
</div></td></tr></tbody></table><p></p>

<br/>
]]></content>
<category term="ai" label="ai" />
<category term="dall-e" label="dall-e" />
<category term="generative" label="generative" />
<category term="image" label="image" />
<category term="midjourney" label="midjourney" />
<category term="stable diffusion" label="stable diffusion" />
</entry>
<entry>
<title>Proxmox VE Gets Official Arm64 Support</title>
<id>https://taoofmac.com/space/links/2026/08/06/0820?utm_content=atom</id>
<published>2026-08-06T08:20:00+00:00</published>
<updated>2026-08-06T08:22: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/links/2026/08/06/0820?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/links/2026/08/06/0820?utm_content=atom">Proxmox VE Gets Official Arm64 Support</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-06T08:20:00+00:00">2026-08-06T08:20:00+00:00</xhtml:time><xhtml:p>It’s about time. I’ve been running adapted versions of Proxmox on ARM for a few years now–first Pimox on a Raspberry Pi 4, and later on RK3588 boards–and ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p><a href="https://www.proxmox.com/en/about/company-details/press-releases/proxmox-virtual-environment-launches-official-arm64-support?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" title="external link to https://www.proxmox.com/en/about/company-details/press-releases/proxmox-virtual-environment-launches-official-arm64-support" alt="screenshot of https://www.proxmox.com/en/about/company-details/press-releases/proxmox-virtual-environment-launches-official-arm64-support" rel="external"><img class="quicklook" src="/space/links/2026/08/06/0820/large.jpg?v=378928927983" alt="quicklook" width="320" height="240"/></a></p>
<p class="lead">It’s about time. I’ve been running adapted versions of <a href="/space/os/linux/distributions/proxmox" rel="next">Proxmox</a> on ARM for a few years now–first <a href="/space/blog/2022/10/28/1900" rel="next">Pimox on a Raspberry Pi 4</a>, and later on <a href="/space/blog/2024/06/16/1800" rel="next"><code>RK3588</code> boards</a>–and ARM servers have been around for at least as long, so the fact that official support is only arriving now makes me a bit worried about <a href="/space/os/linux/distributions/proxmox" rel="next">Proxmox</a>’s ability to do off-the-wall things like <a href="https://github.com/rcarmo/pve-microvm?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>pve-microvm</code></a>.</p>
<p>But this is proper support, with feature parity across VMs, LXC, clustering, ZFS, Ceph and backups, plus ISO images and package repositories–and it will be <em>very</em> nice to have official upstream packages when I go back into homelab ARM server land.</p>

<br/>
]]></content>
<category term="arm64" label="arm64" />
<category term="homelab" label="homelab" />
<category term="proxmox" label="proxmox" />
<category term="servers" label="servers" />
<category term="virtualization" label="virtualization" />
</entry>
<entry>
<title>AirPort Utility</title>
<id>https://taoofmac.com/space/apps/airport_utility?utm_content=atom</id>
<published>2026-08-05T14:16:00+00:00</published>
<updated>2026-08-05T14:24:53+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/airport_utility?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/apps/airport_utility?utm_content=atom">AirPort Utility</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-05T14:16:00+00:00">2026-08-05T14:16:00+00:00</xhtml:time><xhtml:p>Apple is removing AirPort Utility from iOS 27 and macOS Golden Gate, eight years after discontinuing the hardware it manages. That is an unusually long ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p class="lead">Apple is <a href="/space/links/2026/06/24/0725" rel="next">removing AirPort Utility</a> from iOS 27 and macOS Golden Gate, eight years after discontinuing the hardware it manages. That is an unusually long run, but it still leaves working <a href="/space/com/apple/airport/express" rel="next">AirPort Express</a>, <a href="/space/com/apple/airport/extreme" rel="next">AirPort Extreme</a> and <a href="/space/com/apple/time_capsule" rel="next">Time Capsule</a> devices without Apple’s configuration software.</p>
<p><a href="https://github.com/jackhumphries/airport-utility?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>airport-utility</code></a> is an MIT-licensed reimplementation for macOS 27 and later, with a Swift interface and a Python backend for the AirPort Configuration Protocol. It supports both ACP generations and has been tested against several models from all three product lines, so it should let people keep configuring their AirPorts after Apple’s utility disappears.</p>
<figure>
    <img src="/space/apps/airport_utility/screenshot.jpg?v=3f2eed964369" alt="AirPort Utility showing an AirPort network topology" width="1600" height="900"/>
    <figcaption>The open-source AirPort Utility displaying a network topology</figcaption>
</figure>
<p>The project is still in beta, requires macOS 13 or later, Swift 6 and Python 3.10, and some devices and features have not been tested yet. It has no third-party Swift or Python dependencies.</p>

<br/>
]]></content>
<category term="airport" label="airport" />
<category term="apple" label="apple" />
<category term="macos" label="macos" />
<category term="networking" label="networking" />
<category term="open source" label="open source" />
<category term="wifi" label="wifi" />
</entry>
<entry>
<title>Cloudflare OS</title>
<id>https://taoofmac.com/space/links/2026/08/05/1347?utm_content=atom</id>
<published>2026-08-05T13:47:00+00:00</published>
<updated>2026-08-05T13:56:30+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/08/05/1347?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/links/2026/08/05/1347?utm_content=atom">Cloudflare OS</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-05T13:47:00+00:00">2026-08-05T13:47:00+00:00</xhtml:time><xhtml:p>I should probably start marketing piclaw as “Cloudflare OS on your own hardware”, given the amount of convergent evolution agentic workspaces seem to be ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p><a href="https://os.cloudflare.app/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" title="external link to https://os.cloudflare.app/" alt="screenshot of https://os.cloudflare.app/" rel="external"><img class="quicklook" src="/space/links/2026/08/05/1347/large.jpg?v=7f293292da2c" alt="quicklook" width="320" height="240"/></a></p>
<p class="lead">I should probably start marketing <a href="https://rcarmo.github.io/projects/piclaw/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external"><code>piclaw</code></a> as “Cloudflare OS on your own hardware”, given the amount of convergent evolution agentic workspaces seem to be enjoying these days–persistent chats, tools, generated apps, terminals and guarded access to external services all seem to be arriving independently at roughly the same shape.</p>
<p>The <a href="https://github.com/cloudflare/cloudflare-os?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">repository</a> is, unsurprisingly, built around Workers and the rest of the Cloudflare stack, including their <a href="/space/links/2026/08/04/1335" rel="next">freshly tweaked inference</a>.</p>

<br/>
]]></content>
<category term="agents" label="agents" />
<category term="ai" label="ai" />
<category term="cloudflare" label="cloudflare" />
<category term="piclaw" label="piclaw" />
<category term="self-hosting" label="self-hosting" />
</entry>
<entry>
<title>Maple-Preview</title>
<id>https://taoofmac.com/space/links/2026/08/05/0909?utm_content=atom</id>
<published>2026-08-05T09:09:00+00:00</published>
<updated>2026-08-06T08:10:19+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/08/05/0909?utm_content=atom"/>
<xhtml:article class="browser-entry"><xhtml:h2><xhtml:a href="https://taoofmac.com/space/links/2026/08/05/0909?utm_content=atom">Maple-Preview</xhtml:a></xhtml:h2><xhtml:time datetime="2026-08-05T09:09:00+00:00">2026-08-05T09:09:00+00:00</xhtml:time><xhtml:p>This intrigues me quite a bit, since I’ve been looking into ternary models myself. It isn’t hard (at all) to beat Gemma 4 on quality, or to push tokens ...</xhtml:p></xhtml:article>
<content type="html"><![CDATA[
<p><a href="https://deepgrove.ai/modelcard/?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" title="external link to https://deepgrove.ai/modelcard/" alt="screenshot of https://deepgrove.ai/modelcard/" rel="external"><img class="quicklook" src="/space/links/2026/08/05/0909/large.jpg?v=35d390defe52" alt="quicklook" width="320" height="240"/></a></p>
<p class="lead">This intrigues me quite a bit, since I’ve been looking into ternary models myself. It isn’t hard (at all) to beat Gemma 4 on quality, or to push tokens quickly through consumer hardware if you accept the quality trade-offs, but there may be a sweet spot at the intersection of quantization, model size and–more importantly–memory bandwidth where local models become genuinely useful without what is now massively expensive prosumer hardware.</p>
<p>As usual, I have quibbles with the benchmarks–Qwen’s MoE models, especially with MTP, are hard to beat at this scale, and Maple’s own table has Qwen3.5 35B-A3B ahead overall. I’m taking the 218 tokens/s and SOTA framing with a large pinch of salt, but this is another useful data point on the number of optimization techniques people are trying.</p>
<blockquote>
<p><strong>Update, two days later:</strong> I took a stab at <a href="https://github.com/rcarmo/llama-cpp?utm_campaign=unsolicited_traffic&amp;utm_medium=web&amp;utm_source=taoofmac.com" rel="external">getting it to run on AVX2</a> and it’s… OK. Nothing special, and clearly I’m hamstrung by the hardware, but it works. If they release bigger weights I’ll be ready.</p>
</blockquote>

<br/>
]]></content>
<category term="ai" label="ai" />
<category term="apple silicon" label="apple silicon" />
<category term="llm" label="llm" />
<category term="local inference" label="local inference" />
<category term="quantization" label="quantization" />
<category term="ternary" label="ternary" />
</entry>
</feed>
