<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>codesthings.com</title>
  <subtitle>Senior Software Engineer. Full-stack, cloud and mobile.</subtitle>
  <link href="https://codesthings.com/feed.xml" rel="self"/>
  <link href="https://codesthings.com/"/>
  <id>https://codesthings.com/</id>
  <updated>2026-05-01T00:00:00Z</updated>
  <author><name>James Macmillan</name></author>
  <entry>
    <title>ZeroCalc</title>
    <link href="https://codesthings.com/blog/2026-05-01-zerocalc.html"/>
    <id>https://codesthings.com/blog/2026-05-01-zerocalc.html</id>
    <updated>2026-05-01T00:00:00Z</updated>
    <summary>From delivery box to a standalone Pico-8 dev machine. The ZeroCalc build, minus the forum digging.</summary>
    <content type="html">&lt;p&gt;How to go from delivery to a ZeroCalc in 2026: My happy standalone little Pico-8 dev machine.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;what-to-expect&quot;&gt;What to expect&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#what-to-expect&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: What to expect&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Here&apos;s a quick demo of Pico-8 running on my ZeroCalc.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=A72Jcj_3LAM&quot; rel=&quot;noopener&quot;&gt;Watch on YouTube: ZeroCalc demo: Pico-8 running on a ZeroCalc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ignore the 3d printer sounds, I&apos;m printing a handle for the thing.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;why-write-this&quot;&gt;Why write this?&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#why-write-this&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Why write this?&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;There&apos;s a bunch of awesome people over at &lt;a href=&quot;https://forum.clockworkpi.com/&quot; rel=&quot;noopener&quot;&gt;forum.clockworkpi.com&lt;/a&gt; who have worked out how to make this work. But, the forum post is a bit difficult to navigate, and find out what you absolutely need, vs. what&apos;s just cool tinkering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For my purposes:&lt;/strong&gt; the PicoCalc hits a great form factor and price point for a standalone &lt;a href=&quot;https://www.lexaloffle.com/pico-8.php&quot; rel=&quot;noopener&quot;&gt;Pico-8&lt;/a&gt; dev machine. I love the &lt;a href=&quot;https://www.lexaloffle.com/pico-8.php&quot; rel=&quot;noopener&quot;&gt;Pico-8 platform&lt;/a&gt; and regularly tinker with small game ideas.&lt;/p&gt;
&lt;p&gt;I&apos;ve previously used a &lt;a href=&quot;https://www.clockworkpi.com/uconsole&quot; rel=&quot;noopener&quot;&gt;uConsole&lt;/a&gt; with a Raspberry Pi CM5 for this purpose, but it&apos;s overkill.&lt;/p&gt;
&lt;p&gt;The Raspberry Pi Pico that the PicoCalc uses by default lacks power to run Pico-8 well, like I&apos;d like it to.&lt;/p&gt;
&lt;p&gt;My aim was to get the PicoCalc to run on a Pi Zero 2 W with &lt;code&gt;pico8&lt;/code&gt; and &lt;code&gt;git&lt;/code&gt;. So that I can tinker with ideas, and hand them off to a repo and pick up elsewhere.&lt;/p&gt;
&lt;p&gt;I don&apos;t need external USB, GPIO or anything similar.&lt;/p&gt;
&lt;p&gt;Just &lt;code&gt;pico8&lt;/code&gt;, a display, a keyboard, audio and internet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If your needs are different, don&apos;t worry!&lt;/em&gt; I&apos;ve left links to all the resources and hints about where to look for different setups throughout this guide. The Pi Zero 2 W is fairly capable compute with a lot of versatility, you could use it for all sorts.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;what-you-need&quot;&gt;What you need&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#what-you-need&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: What you need&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.clockworkpi.com/picocalc&quot; rel=&quot;noopener&quot;&gt;A PicoCalc kit&lt;/a&gt; - I got mine from AliExpress.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/&quot; rel=&quot;noopener&quot;&gt;A Raspberry Pi Zero 2 WH&lt;/a&gt; - The WH stands for Wi-Fi + Headers (presoldered headers). You can also just get a 2 W and solder the headers yourself.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.uk/dp/B0B7NTY2S6?ref=ppx_yo2ov_dt_b_fed_asin_title&quot; rel=&quot;noopener&quot;&gt;A reasonably speedy microSD card with a bit of space (32 GB+)&lt;/a&gt; - I use SanDisk Ultras because I trust them, I wanted about 128 GB so this is what I went with.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pcbway.com/project/shareproject/Picocalc_Zero_Mod_for_Raspberry_Pi_Zero_2W_1c0c1a06.html&quot; rel=&quot;noopener&quot;&gt;The adapter board&lt;/a&gt; - I purchased from PCBWay, they sold me 5 for about US$1 each. Shipped to the UK in 3-4 days for a reasonable cost (about US$20).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.uk/dp/B0DXKP8Y8S?ref=ppx_yo2ov_dt_b_fed_asin_title&quot; rel=&quot;noopener&quot;&gt;2x20 pin headers with 2.54mm pitch&lt;/a&gt; - I bought mine from amazon in a set, I only used 2 of the 20pin headers. My Pi Zero 2 W came with headers presoldered. If you get the Pi Zero 2 W without headers you&apos;ll need some more for that too.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nubattery.co.uk/panasonic-ncr18650b-18650-battery&quot; rel=&quot;noopener&quot;&gt;2x 18650 batteries from a good source&lt;/a&gt; - I bought mine (flat top) from NuBattery in the UK. There&apos;s &lt;a href=&quot;https://forum.clockworkpi.com/t/picocalc-18650-battery-advice/16209/6&quot; rel=&quot;noopener&quot;&gt;forum posts on battery options&lt;/a&gt; if you&apos;re stuck.&lt;/li&gt;
&lt;li&gt;A trusty soldering iron and some solder.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;optional-soldering-helpers&quot;&gt;Optional: soldering helpers&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#optional-soldering-helpers&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Optional: soldering helpers&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I also used 2 female 8 pin headers (2.54mm pitch) to help with soldering. Mine came from &lt;a href=&quot;https://www.amazon.co.uk/dp/B095Y8L12Z?ref=ppx_yo2ov_dt_b_fed_asin_title&quot; rel=&quot;noopener&quot;&gt;this kit&lt;/a&gt; some time ago.&lt;/p&gt;
&lt;p&gt;TL;DR: if you plug the male headers into the female and sit the adapter board on top it&apos;s super easy to solder them straight.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://codesthings.com/assets/img/30d6f7b8eb62-480.webp&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://codesthings.com/assets/img/30d6f7b8eb62-480.avif 480w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://codesthings.com/assets/img/30d6f7b8eb62-480.webp 480w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;img src=&quot;https://codesthings.com/assets/img/30d6f7b8eb62-480.webp&quot; alt=&quot;Like this&quot; width=&quot;605&quot; height=&quot;399&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;optional-case&quot;&gt;Optional: Case&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#optional-case&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Optional: Case&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;There are other optional features like external USB, and a custom case. Most of the details of those can be found
on &lt;a href=&quot;https://www.printables.com/model/1399739-picocalc-zero-mod-case&quot; rel=&quot;noopener&quot;&gt;Michael&apos;s Printables project&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;shameless-plug-handle-stand-grip-for-the-zerocalc&quot;&gt;Shameless Plug: Handle, stand, grip for the ZeroCalc&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#shameless-plug-handle-stand-grip-for-the-zerocalc&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Shameless Plug: Handle, stand, grip for the ZeroCalc&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;image-carousel&quot;&gt;
&lt;a href=&quot;https://codesthings.com/assets/img/254f602ea91e-960.webp&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://codesthings.com/assets/img/254f602ea91e-480.avif 480w, https://codesthings.com/assets/img/254f602ea91e-960.avif 960w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://codesthings.com/assets/img/254f602ea91e-480.webp 480w, https://codesthings.com/assets/img/254f602ea91e-960.webp 960w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;img src=&quot;https://codesthings.com/assets/img/254f602ea91e-960.webp&quot; alt=&quot;Front of the ZeroCalc with the printed grip fitted&quot; width=&quot;1280&quot; height=&quot;814&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/picture&gt;&lt;/a&gt;
&lt;a href=&quot;https://codesthings.com/assets/img/d3fccb030223-960.webp&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://codesthings.com/assets/img/d3fccb030223-480.avif 480w, https://codesthings.com/assets/img/d3fccb030223-960.avif 960w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://codesthings.com/assets/img/d3fccb030223-480.webp 480w, https://codesthings.com/assets/img/d3fccb030223-960.webp 960w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;img src=&quot;https://codesthings.com/assets/img/d3fccb030223-960.webp&quot; alt=&quot;Side-on view of the ZeroCalc grip and stand&quot; width=&quot;1280&quot; height=&quot;832&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/picture&gt;&lt;/a&gt;
&lt;a href=&quot;https://codesthings.com/assets/img/01029f978de4-960.webp&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://codesthings.com/assets/img/01029f978de4-480.avif 480w, https://codesthings.com/assets/img/01029f978de4-960.avif 960w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://codesthings.com/assets/img/01029f978de4-480.webp 480w, https://codesthings.com/assets/img/01029f978de4-960.webp 960w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;img src=&quot;https://codesthings.com/assets/img/01029f978de4-960.webp&quot; alt=&quot;Rear of the ZeroCalc showing the back of the grip&quot; width=&quot;1280&quot; height=&quot;817&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/picture&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;If you like the grip in the cover image, you can find it at Makerworld: &lt;a href=&quot;https://makerworld.com/en/models/2759394-picocalc-grip-stand-handle-comfy-edition&quot; rel=&quot;noopener&quot;&gt;PicoCalc Grip Stand Handle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you like it, check out the other things I make!&lt;/p&gt;
&lt;p&gt;Heads up: there&apos;s a version you can print without the Pico-8 logo on the front. It&apos;s plate 2 in the print profile, and the &lt;code&gt;.step&lt;/code&gt; files are included in the 3D model files if you want to modify it yourself.&lt;/p&gt;
&lt;p&gt;Pictured and link is version 2 of the handle, that I made more comfy!&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;flashing-the-sd-card&quot;&gt;Flashing the SD Card&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#flashing-the-sd-card&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Flashing the SD Card&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://github.com/nibheis/picocalc_trixie#step-1-install-raspberry-pi-os-lite-64-bit-debian-trixie-using-the-raspberry-pi-imager&quot; rel=&quot;noopener&quot;&gt;github.com/nibheis/picocalc_trixie: Step 1&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download and install &lt;a href=&quot;https://www.raspberrypi.com/software/&quot; rel=&quot;noopener&quot;&gt;Raspberry Pi Imager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plug in your microSD card&lt;/li&gt;
&lt;li&gt;Open Raspberry Pi Imager&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In Imager:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On the select device page choose &amp;quot;Raspberry Pi Zero 2 W&amp;quot; and hit next&lt;/li&gt;
&lt;li&gt;On the Choose OS page, choose &amp;quot;Raspberry Pi OS (other)&amp;quot; and hit next&lt;/li&gt;
&lt;li&gt;On the next page, choose &amp;quot;Raspberry Pi OS Lite (64 Bit)&amp;quot; (A port of Debian Trixie) and hit next&lt;/li&gt;
&lt;li&gt;On the storage page, select your microSD card&lt;/li&gt;
&lt;li&gt;On the Customization page, set your hostname. I used &amp;quot;zerocalc&amp;quot; for mine, but you can choose whatever you like.&lt;/li&gt;
&lt;li&gt;On the Localisation page, set your locale. But! Set your keyboard layout to &amp;quot;us&amp;quot;.&lt;/li&gt;
&lt;li&gt;On the User page, set your username, and password.&lt;/li&gt;
&lt;li&gt;On the Wi-Fi page, set up your Wi-Fi credentials; so we can ssh for the rest of the install.&lt;/li&gt;
&lt;li&gt;On the remote access page, enable SSH and set your authentication method as you wish.&lt;/li&gt;
&lt;li&gt;Hit &amp;quot;Write&amp;quot; and wait for it to finish.&lt;/li&gt;
&lt;li&gt;Unplug the microSD card and plug it into your Pi Zero 2 W.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;building-the-hardware&quot;&gt;Building the hardware&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#building-the-hardware&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Building the hardware&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Michael&apos;s video is a great walkthrough, and the summary below is the steps I took.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;video&quot;&gt;Video&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#video&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Video&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Michael posted a great build video that &lt;a href=&quot;https://www.youtube.com/watch?v=wgE0R1M0_ZE&quot; rel=&quot;noopener&quot;&gt;goes over the soldering&lt;/a&gt;, and physical build.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;text-summary&quot;&gt;Text Summary&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#text-summary&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Text Summary&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Solder the 20pin headers to the adapter board&lt;/li&gt;
&lt;li&gt;Solder the Pi to the adapter board as well&lt;/li&gt;
&lt;li&gt;Plug in your microSD card to the Pi Zero 2 W (Flash instructions below)&lt;/li&gt;
&lt;li&gt;Plug the adapter board into your PicoCalc&lt;/li&gt;
&lt;li&gt;Add batteries&lt;/li&gt;
&lt;li&gt;Screw everything together&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://codesthings.com/assets/img/79350c52c39d-480.webp&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://codesthings.com/assets/img/79350c52c39d-480.avif 480w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://codesthings.com/assets/img/79350c52c39d-480.webp 480w&quot; sizes=&quot;(min-width: 760px) 720px, 100vw&quot;&gt;&lt;img src=&quot;https://codesthings.com/assets/img/79350c52c39d-480.webp&quot; alt=&quot;It should look like this&quot; width=&quot;880&quot; height=&quot;892&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: in this image my microSD card isn&apos;t plugged in, it should be plugged into the Pi Zero 2 W.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;software-setup&quot;&gt;Software setup&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#software-setup&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Software setup&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://github.com/nibheis/picocalc_trixie&quot; rel=&quot;noopener&quot;&gt;github.com/nibheis/picocalc_trixie&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;power-on&quot;&gt;Power on&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#power-on&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Power on&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Once you have flashed the microSD card and completed the hardware build. Power it on. You&apos;ll find it may reboot a couple times the first time you hit it; don&apos;t worry, it&apos;ll eventually come up stable. I think it&apos;s doing SD card expansion and initial setup at that time.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;find-your-pi-on-the-network&quot;&gt;Find your Pi on the network&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#find-your-pi-on-the-network&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Find your Pi on the network&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The easiest way to find your ZeroCalc on the network is to use &lt;code&gt;ping&lt;/code&gt; with the hostname you set in the imager. For example, if you set your hostname to &lt;code&gt;zerocalc&lt;/code&gt; you can ping it with:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;ping&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; zerocalc.local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# or&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;ping&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; zerocalc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;ssh-into-the-pi&quot;&gt;SSH into the Pi&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#ssh-into-the-pi&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: SSH into the Pi&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use the same hostname or IP address to SSH in:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;ssh&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; zerocalc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# You can prepend your username to set the correct user to log in to as well.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;ssh&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; james@zerocalc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;update-installed-software&quot;&gt;Update installed software&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#update-installed-software&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Update installed software&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Out the gate you want to run apt update.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; upgrade&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;install-git&quot;&gt;Install git&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#install-git&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Install git&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; git&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;clone-the-picocalc-trixie-repo&quot;&gt;Clone the picocalc_trixie repo&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#clone-the-picocalc-trixie-repo&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Clone the picocalc_trixie repo&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; https://github.com/nibheis/picocalc_trixie.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;It should be cloned into &lt;code&gt;~/picocalc_trixie&lt;/code&gt;(&lt;code&gt;/home/your-username/picocalc_trixie&lt;/code&gt;)&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;in-the-picocalc-trixie-directory-copy-the-display-firmware&quot;&gt;In the picocalc_trixie directory, copy the display firmware&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#in-the-picocalc-trixie-directory-copy-the-display-firmware&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: In the picocalc_trixie directory, copy the display firmware&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; picocalc_trixie&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; cp&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; display/picomipi.bin&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /lib/firmware/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;set-up-the-display&quot;&gt;Set up the display&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#set-up-the-display&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Set up the display&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h4 id=&quot;activate-the-spi-interface-for-the-display&quot;&gt;Activate the SPI Interface for the display&lt;/h4&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#activate-the-spi-interface-for-the-display&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Activate the SPI Interface for the display&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; nano&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /boot/firmware/config.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Add the following lines to the end of the file:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Enable SPI for the display&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtparam=spi=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;on&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Driver configuration for the display&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtoverlay=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;mipi-dbi-spi,spi0-0,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;speed=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;70000000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtparam=compatible=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;picomipi\0panel-mipi-dbi-spi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtparam=width=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;320,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;height=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;320,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;width-mm=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;43,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;height-mm=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;43&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtparam=reset-gpio=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;25,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dc-gpio=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;24&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtparam=backlight-gpio=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;18&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtparam=clock-frequency=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;50&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h4 id=&quot;configure-the-framebuffer-configuration-in-the-kernel-command-line&quot;&gt;Configure the framebuffer configuration in the kernel command line&lt;/h4&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#configure-the-framebuffer-configuration-in-the-kernel-command-line&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Configure the framebuffer configuration in the kernel command line&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; nano&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /boot/firmware/cmdline.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Add the following to the end of the line:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;fbcon=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;map:1 &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;fbcon=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;font:MINI4x6&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h4 id=&quot;reboot&quot;&gt;Reboot&lt;/h4&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#reboot&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Reboot&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; reboot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;When you reboot this time, your display should work, but your keyboard won&apos;t be set up yet.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;set-up-the-keyboard&quot;&gt;Set up the keyboard&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#set-up-the-keyboard&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Set up the keyboard&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h4 id=&quot;navigate-to-the-keyboard-firmware-directory&quot;&gt;Navigate to the keyboard firmware directory&lt;/h4&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#navigate-to-the-keyboard-firmware-directory&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Navigate to the keyboard firmware directory&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;SSH back into the Pi&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt; to the &lt;code&gt;picocalc_trixie&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt; into the &lt;code&gt;keyboard&lt;/code&gt; directory&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h4 id=&quot;if-you-need-the-mouse-edit-the-firmware&quot;&gt;If you need the mouse, edit the firmware&lt;/h4&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#if-you-need-the-mouse-edit-the-firmware&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: If you need the mouse, edit the firmware&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you need the mouse emulation that comes with the PicoCalc:
&lt;code&gt;press shift to turn the arrow keys into the mouse, and the square brackets into lmb and rmb&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You need to update the &lt;code&gt;picocalc_kbd.c&lt;/code&gt; file to uncomment the disabled mouse emulation.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; nano&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; picocalc_kbd/picocalc_kbd.c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Remove the &lt;code&gt;//|&lt;/code&gt; in front of the lines commented out.&lt;/li&gt;
&lt;li&gt;They are the only lines commented out with this pattern &lt;code&gt;//|&lt;/code&gt; so it should be easy to find.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nibheis/picocalc_trixie/blob/dccf9c22fa913b1abc67eb5e682ed41a95d40792/keyboard/picocalc_kbd/picocalc_kbd.c&quot; rel=&quot;noopener&quot;&gt;At the time of writing it&apos;s lines 223-311&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Delete the &lt;code&gt;//|&lt;/code&gt; from the start of each line in that block, and save the file.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h4 id=&quot;build-and-install-the-keyboard-firmware&quot;&gt;Build and install the keyboard firmware&lt;/h4&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#build-and-install-the-keyboard-firmware&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Build and install the keyboard firmware&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# In the picocalc_trixie/keyboard directory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;chmod&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; +x&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; setup_keyboard.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; ./setup_keyboard.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h4 id=&quot;confirm-the-keyboard-setup-worked&quot;&gt;Confirm the keyboard setup worked&lt;/h4&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#confirm-the-keyboard-setup-worked&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Confirm the keyboard setup worked&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; cat&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /boot/firmware/config.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;The start of the file should now have the following lines:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtparam=i2c_arm=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;on&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtoverlay=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;picocalc_kbd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;set-up-audio&quot;&gt;Set up Audio&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#set-up-audio&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Set up Audio&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; nano&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /boot/firmware/config.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Add the following lines to the end of the file:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtparam=audio=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;on&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;dtoverlay=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;audremap,pins_12_13&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;aside class=&quot;callout callout--note&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__title&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot; /&gt;&lt;path d=&quot;M12 16v-4&quot; /&gt;&lt;path d=&quot;M12 8h.01&quot; /&gt;&lt;/svg&gt;&lt;span&gt;Note&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You may already see the &lt;code&gt;dtparam=audio=on&lt;/code&gt; line in your config.txt. If so, just add the &lt;code&gt;dtoverlay=audremap,pins_12_13&lt;/code&gt; line.&lt;/p&gt;
&lt;/aside&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h4 id=&quot;reboot-1&quot;&gt;Reboot&lt;/h4&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#reboot-1&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Reboot&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; reboot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Once you&apos;ve rebooted you should have most things working! The rest is optional but might be handy.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;optional-configure-your-terminal-font-for-a-better-display-experience&quot;&gt;Optional: Configure your terminal font for a better display experience&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#optional-configure-your-terminal-font-for-a-better-display-experience&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Optional: Configure your terminal font for a better display experience&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://forum.clockworkpi.com/t/raspberry-pi-zero-2-on-picocalc/17946/235?u=jamescodesthings&quot; rel=&quot;noopener&quot;&gt;a comment by Lachlan_Beveridge&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; dpkg-reconfigure&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; console-setup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;When you run this command, you&apos;ll be prompted with a series of questions. Here&apos;s how to answer them for the best experience on the PicoCalc display:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;encoding: UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;character set: Guess optimal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;font: Terminus&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;size: 6×12&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;optional-fix-keyboard-layout&quot;&gt;Optional: Fix keyboard layout&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#optional-fix-keyboard-layout&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Optional: Fix keyboard layout&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If, like me, you flashed with the wrong keyboard layout, you can fix it with:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; nano&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /etc/default/keyboard&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Find the line that starts with &lt;code&gt;XKBLAYOUT=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Change the value to &lt;code&gt;us&lt;/code&gt; (or your desired layout)&lt;/li&gt;
&lt;li&gt;Save the file and exit&lt;/li&gt;
&lt;li&gt;Reboot the Pi&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;optional-copy-useful-scripts-to-your-path&quot;&gt;Optional: Copy useful scripts to your path&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#optional-copy-useful-scripts-to-your-path&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Optional: Copy useful scripts to your path&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://github.com/nibheis/picocalc_trixie&quot; rel=&quot;noopener&quot;&gt;github.com/nibheis/picocalc_trixie&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;picocalc_trixie&lt;/code&gt; repo has some useful scripts for running Pico-8 and other utilities. You can copy them to a directory in your &lt;code&gt;PATH&lt;/code&gt; for easier access.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Go to the picocalc_trixie directory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; ~/picocalc_trixie&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Copy the scripts to /usr/local/bin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; cp&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; user_bin/*&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /usr/local/bin/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# one is called &quot;shutdown&quot; which will lead to an infinite loop. rename it.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; mv&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /usr/local/bin/shutdown&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /usr/local/bin/shutdown-pi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# alternatively, modify the script and have it point to /usr/sbin/shutdown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; nano&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /usr/local/bin/shutdown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Change &apos;shutdown&apos; to &apos;/usr/sbin/shutdown&apos; and save the file.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;optional-power-off-shutdown-script&quot;&gt;Optional: Power off shutdown script&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#optional-power-off-shutdown-script&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Optional: Power off shutdown script&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;fix-problems-with-the-original-commands&quot;&gt;Fix problems with the original commands&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#fix-problems-with-the-original-commands&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Fix problems with the original commands&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Enable i2c in &lt;code&gt;raspi-config&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Run raspi-config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; raspi-config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Navigate to &quot;Interface Options&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Select &quot;I2C&quot; and enable it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Finish and reboot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;i2c-tools&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; i2c-tools&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Follow the original guide here: &lt;a href=&quot;https://github.com/nibheis/picocalc_trixie#step-7-make-the-pi-turn-off-the-main-board-when-powering-off&quot; rel=&quot;noopener&quot;&gt;Picocalc Trixie Guide&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;ez-mode&quot;&gt;EZ Mode&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#ez-mode&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: EZ Mode&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Enable i2c in &lt;code&gt;raspi-config&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Run raspi-config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; raspi-config&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Navigate to &quot;Interface Options&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Select &quot;I2C&quot; and enable it&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Finish and reboot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Clone my fork of the repo with a full install script&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; https://github.com/jamescodesthings/picocalc_trixie.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Run the install script for the shutdown utility&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;pre class=&quot;shiki css-variables&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground)&quot; tabindex=&quot;0&quot; data-copy=&quot;&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; picocalc_trixie&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; poweroff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;./install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; class=&quot;code-block__copy&quot; data-copy-button hidden aria-label=&quot;Copy code&quot;&gt;&lt;span class=&quot;code-block__icon code-block__icon--idle&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot; /&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;code-block__icon code-block__icon--done&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;path d=&quot;M20 6 9 17l-5-5&quot; /&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;&lt;span class=&quot;code-block__status visually-hidden&quot; role=&quot;status&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;aside class=&quot;callout callout--note&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__title&quot;&gt;&lt;svg class=&quot;icon &quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.75&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; aria-hidden=&quot;true&quot; focusable=&quot;false&quot; &gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot; /&gt;&lt;path d=&quot;M12 16v-4&quot; /&gt;&lt;path d=&quot;M12 8h.01&quot; /&gt;&lt;/svg&gt;&lt;span&gt;Note&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you run it from one of the parent directories the path to the service and script file won&apos;t be right.&lt;/p&gt;
&lt;/aside&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#resources&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Resources&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Here&apos;s the main resources I used when working this out.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.clockworkpi.com/t/raspberry-pi-zero-2-on-picocalc&quot; rel=&quot;noopener&quot;&gt;The forum post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wgE0R1M0_ZE&quot; rel=&quot;noopener&quot;&gt;The hardware build video (from michael_mayer)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pcbway.com/project/shareproject/Picocalc_Zero_Mod_for_Raspberry_Pi_Zero_2W_1c0c1a06.html&quot; rel=&quot;noopener&quot;&gt;The adapter board PCBWay project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nibheis/picocalc_trixie/&quot; rel=&quot;noopener&quot;&gt;The Trixie 64bit install instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forum.clockworkpi.com/t/raspberry-pi-zero-2-on-picocalc/17946/235?u=jamescodesthings&quot; rel=&quot;noopener&quot;&gt;A comment in the forum post about making the default font easier to work with&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;fin&quot;&gt;Fin&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-05-01-zerocalc.html#fin&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Fin&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;That&apos;s it for this one! I hope it&apos;s useful to anyone looking to do something similar. If you have any questions, or suggestions for improvements, feel free to reach out.&lt;/p&gt;
&lt;p&gt;Many thanks to everyone mentioned in the resources, and anyone else who&apos;s worked on this in the forums. It&apos;s a great community and I&apos;m grateful for all the work that&apos;s gone into making this possible.&lt;/p&gt;
&lt;p&gt;If anyone involved in the project wants to add anything, or correct any mistakes, just let me know!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Personal Website</title>
    <link href="https://codesthings.com/blog/2026-03-30-how-this-site-works.html"/>
    <id>https://codesthings.com/blog/2026-03-30-how-this-site-works.html</id>
    <updated>2026-03-30T00:00:00Z</updated>
    <summary>The whole site is about 3000 lines of JavaScript and a folder of JSON. Here&apos;s how it works, and why there&apos;s no framework.</summary>
    <content type="html">&lt;p&gt;This is how codesthings.com is built, from data files to deployed website. It is a small Node program that reads JSON and Markdown, fills in EJS templates, and writes plain HTML into a folder.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;the-shape-of-it&quot;&gt;The shape of it&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#the-shape-of-it&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: The shape of it&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The pattern is &lt;strong&gt;data in, pipeline, files out&lt;/strong&gt;, borrowed from my &lt;a href=&quot;https://github.com/jamescodesthings/campsnap-filters&quot; rel=&quot;noopener&quot;&gt;campsnap-filters&lt;/a&gt; project. Nothing runs on a server and no page content is rendered in the browser. The pages are finished HTML before anyone asks for them.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;data&quot;&gt;Data&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#data&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Data&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;All content lives in &lt;code&gt;data/&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;site.json&lt;/code&gt;, &lt;code&gt;now.json&lt;/code&gt;, &lt;code&gt;uses.json&lt;/code&gt; and &lt;code&gt;links.json&lt;/code&gt; hold the homepage copy, the Now page, the Uses page and the link list.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;projects/&lt;/code&gt; has one JSON file per project, with a &lt;code&gt;lane&lt;/code&gt; of &lt;code&gt;work&lt;/code&gt; or &lt;code&gt;make&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;photos/&lt;/code&gt; has one JSON file per photo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blog/&lt;/code&gt; has one Markdown file per post. The file name gives the slug and the date.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To change the site, I edit one of those files. A project or photo file with a missing key or a bad &lt;code&gt;lane&lt;/code&gt; fails the build and names the file, rather than rendering a broken card.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;the-build&quot;&gt;The build&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#the-build&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: The build&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;src/index.js&lt;/code&gt; is orchestration only. It loads the data, builds the assets, and renders every page through a single &lt;code&gt;renderPage&lt;/code&gt; function. The work happens in small modules under &lt;code&gt;src/lib/&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;data.js&lt;/code&gt; reads and validates everything under &lt;code&gt;data/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;validate.js&lt;/code&gt; checks project and photo files.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;frontmatter.js&lt;/code&gt; splits a post into its front matter and body.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;markdown.js&lt;/code&gt; renders posts with markdown-it, adds heading anchors, callouts and copy buttons, and highlights code with Shiki at build time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reading.js&lt;/code&gt; works out the reading time.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;images.js&lt;/code&gt; is the image pipeline.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;css.js&lt;/code&gt; bundles the stylesheets with Lightning CSS.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buildstamp.js&lt;/code&gt; reads the git commit for the version in the footer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Templates are EJS files in &lt;code&gt;src/templates/&lt;/code&gt;, and every page is built from the same header, footer and head partials.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;images&quot;&gt;Images&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#images&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Images&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Every image a post, project or photo refers to goes through &lt;a href=&quot;https://sharp.pixelplumbing.com/&quot; rel=&quot;noopener&quot;&gt;sharp&lt;/a&gt;. It writes AVIF and WebP at 480, 960 and 1600 pixels wide, wraps them in a &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; with the real width and height, and lazy-loads everything except the first image. Results are cached in &lt;code&gt;.cache/images/&lt;/code&gt;, keyed by a hash of the source, so a rebuild only does new work. Only images that something refers to are shipped. If a post points at an image that doesn&apos;t exist, the build fails and names the post and the path.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;styling-and-scripts&quot;&gt;Styling and scripts&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#styling-and-scripts&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Styling and scripts&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The stylesheet is plain CSS in ordered files: tokens, base, layout, components, pages and print. The build joins and minifies them into one file. Dark is the default and light is a switch on &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;, set by a tiny inline script before first paint. The JavaScript is plain ES modules with no framework and no bundler, and the post-only scripts (the contents list, the copy buttons and the video facade) only load on posts.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h3 id=&quot;tests&quot;&gt;Tests&lt;/h3&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#tests&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Tests&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The pure parts have unit tests that run with &lt;code&gt;node --test&lt;/code&gt;: front matter, validation, the build stamp, the image pipeline, the Markdown renderer, reading time and the theme and floating-button scripts. &lt;code&gt;npm test&lt;/code&gt; runs them all.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;the-cv-is-a-separate-site&quot;&gt;The CV is a separate site&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#the-cv-is-a-separate-site&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: The CV is a separate site&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;My CV lives in its own repository, built the same way: JSON in &lt;code&gt;data/&lt;/code&gt; (experience, skills, education, projects and the cover letter), EJS templates, and a small Node build. It has two runtime dependencies, &lt;code&gt;ejs&lt;/code&gt; and &lt;code&gt;debug&lt;/code&gt;. It builds an HTML page and also a set of PDFs, which it makes by sending the page to a &lt;a href=&quot;https://gotenberg.dev/&quot; rel=&quot;noopener&quot;&gt;Gotenberg&lt;/a&gt; container that turns HTML into PDF. This site links to it at &lt;code&gt;/cv/&lt;/code&gt;, and both repositories publish to the same domain.&lt;/p&gt;
&lt;p&gt;I split them because the CV changes for different reasons. It gets edited when I change jobs or apply for one, and this site gets edited when I write or make something.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;deploying&quot;&gt;Deploying&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#deploying&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Deploying&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A push to &lt;code&gt;main&lt;/code&gt; runs &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;. It runs &lt;code&gt;make build&lt;/code&gt;, which runs the same Node build inside a &lt;code&gt;node:24-alpine&lt;/code&gt; container, and publishes the &lt;code&gt;public/&lt;/code&gt; folder to the &lt;code&gt;pages&lt;/code&gt; branch. GitHub Pages serves that branch at codesthings.com. There is no server to look after.&lt;/p&gt;
&lt;div class=&quot;heading-wrap&quot;&gt;
&lt;h2 id=&quot;why-no-framework&quot;&gt;Why no framework?&lt;/h2&gt;
&lt;a class=&quot;heading-anchor&quot; href=&quot;https://codesthings.com/blog/2026-03-30-how-this-site-works.html#why-no-framework&quot;&gt;&lt;span class=&quot;visually-hidden&quot;&gt;Link to section: Why no framework?&lt;/span&gt; &lt;span aria-hidden=&quot;true&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The site is a handful of pages that change when I write something. A framework would add a build step, a dependency tree and a runtime for no visible gain, and this version is easier to read in an afternoon than to configure.&lt;/p&gt;
</content>
  </entry>
</feed>
