<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Small dose of nothing</title>
  <subtitle>subtitles are overrated</subtitle>
  <link href="https://nothing.pcarrier.com/feed.xml" rel="self" />
  <link href="https://nothing.pcarrier.com/" />
  <updated>2026-08-02T00:00:00Z</updated>
  <id>https://nothing.pcarrier.com/</id>
  <author>
    <name>Pierre Carrier</name>
    <email>pc@rrier.fr</email>
  </author>
  <entry>
    <title>Blitception</title>
    <link href="https://nothing.pcarrier.com/posts/blitception/" />
    <updated>2026-08-02T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/blitception/</id>
    <content type="html">&lt;p&gt;I&#39;ve been working on &lt;a href=https://blit.sh&gt;blit&lt;/a&gt;, which streams terminals and graphical apps to your browser with very low latency. Naturally, I had to see how deep it goes.&lt;/p&gt;&lt;p&gt;&lt;a href=https://nothing.pcarrier.com/assets/blit/rick.avif&gt;&lt;picture&gt;&lt;source type=image/avif srcset=&quot;https://nothing.pcarrier.com/img/0vfKrJgcKM-512.avif 512w, https://nothing.pcarrier.com/img/0vfKrJgcKM-1024.avif 1024w, https://nothing.pcarrier.com/img/0vfKrJgcKM-2048.avif 2048w, https://nothing.pcarrier.com/img/0vfKrJgcKM-4336.avif 4336w&quot; sizes=auto&gt;&lt;img loading=lazy decoding=async src=https://nothing.pcarrier.com/img/0vfKrJgcKM-512.jpeg alt=&quot;blit connected to a remote server, with two nested views of the same music video in the bottom panes&quot; width=4336 height=2806 srcset=&quot;https://nothing.pcarrier.com/img/0vfKrJgcKM-512.jpeg 512w, https://nothing.pcarrier.com/img/0vfKrJgcKM-1024.jpeg 1024w, https://nothing.pcarrier.com/img/0vfKrJgcKM-2048.jpeg 2048w, https://nothing.pcarrier.com/img/0vfKrJgcKM-4336.jpeg 4336w&quot; sizes=auto&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is blit in my browser in France, connected to a server on the US East Coast. The two bottom panes show the same video, arriving through two very different routes.&lt;/p&gt;&lt;p&gt;On the left, blit streams a remote Chromium. That Chromium loaded another blit instance, which shows yet another browser playing the video in fullscreen. Every frame is decoded and re-encoded at each hop before crossing the Atlantic.&lt;/p&gt;&lt;p&gt;On the right, that same inner blit instance is loaded in an iframe, with its networking tunneled through the outer blit. Same fullscreen browser at the bottom of the stack, one less video hop, one more layer of plumbing.&lt;/p&gt;&lt;p&gt;Both panes play smoothly, in sync, with subtitles. Blit all the way down, Rick all the way up.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Vanity SSH keys at 300M/s on OpenCL</title>
    <link href="https://nothing.pcarrier.com/posts/vanity-keygen-opencl/" />
    <updated>2026-07-18T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/vanity-keygen-opencl/</id>
    <content type="html">&lt;p&gt;A few years ago I published &lt;a href=https://github.com/pcarrier/vanity-keygen&gt;vanity-keygen&lt;/a&gt;, a small Go program that brute-forces ed25519 SSH keypairs until the public key matches a regex. It did about 250k keys per second on my 32-core machine: a minute for &lt;code&gt;love$&lt;/code&gt;, days for &lt;code&gt;[pP][cC][aA][rR][rR][iI1][eE][rR]&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This week an LLM rewrote it from scratch in Rust, with all of the cryptography hand-rolled in a single OpenCL kernel. I provided direction, benchmarks on my hardware, and an RTX 4090; every line of code, including the test suite, is its. Kudos Kimi K3! It now does 300 million keys per second, 1200× faster, and my pattern lands in minutes.&lt;/p&gt;&lt;h2 id=everything-on-the-device&gt;Everything on the device&lt;/h2&gt;&lt;p&gt;Each work item derives candidates end-to-end in &lt;a href=https://github.com/pcarrier/vanity-keygen/blob/main/kernels/vanity.cl&gt;&lt;code&gt;kernels/vanity.cl&lt;/code&gt;&lt;/a&gt;, with no library code:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SHA-512 of a 32-byte seed, specialized to a single block;&lt;/li&gt;&lt;li&gt;clamping, then scalar multiplication against the ed25519 basepoint;&lt;/li&gt;&lt;li&gt;field arithmetic mod 2^255−19, donna-style, 5 unsigned 64-bit limbs in radix 2^51;&lt;/li&gt;&lt;li&gt;compressed-point encoding, SSH blob, base64;&lt;/li&gt;&lt;li&gt;matching against a compiled filter.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A GPU can&#39;t run an arbitrary regex, so the host compiles the pattern (through &lt;a href=https://docs.rs/regex-syntax&gt;&lt;code&gt;regex-syntax&lt;/code&gt;&lt;/a&gt;&#39;s HIR) into per-position bitmasks over the base64 alphabet: literals become singleton masks, &lt;code&gt;[pP]&lt;/code&gt; a 2-bit mask, &lt;code&gt;love$&lt;/code&gt; a suffix-anchored window. The kernel only uses that as a prefilter; the host re-derives every survivor with &lt;code&gt;ed25519-dalek&lt;/code&gt; and applies the real regex. A kernel filter bug can cost speed, never correctness.&lt;/p&gt;&lt;h2 id=wrong-in-ways-ref10-knew-about&gt;Wrong in ways ref10 knew about&lt;/h2&gt;&lt;p&gt;The first kernels produced plausible-looking but wrong public keys. The trail (right scalar, wrong point, encoding off by exactly 19) led to two transcription errors:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;In &lt;code&gt;fe_mul&lt;/code&gt;, it wrote the schoolbook product with a uniform &lt;code&gt;19·g_j&lt;/code&gt; factor on wrap-around terms. The alternating 26/25-bit radix means products with both indices odd carry an extra factor of 2, so those wraps need 38, not 19. That&#39;s why ref10 doubles the odd &lt;code&gt;f&lt;/code&gt; limbs (&lt;code&gt;f1_2&lt;/code&gt;, &lt;code&gt;f3_2&lt;/code&gt;, …).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In &lt;code&gt;fe_tobytes&lt;/code&gt;, it added a &lt;code&gt;h0 += 19 * carry9&lt;/code&gt; that ref10 deliberately drops. The canonicalization already accounts for it, so outputs came out as &lt;code&gt;y − 19&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Both were caught in minutes: the test suite it had written compares the kernel against &lt;code&gt;ed25519-dalek&lt;/code&gt; on scalars, public keys, and edge cases (&lt;code&gt;0·B&lt;/code&gt;, &lt;code&gt;L·B&lt;/code&gt;, &lt;code&gt;0xff…&lt;/code&gt;). I wouldn&#39;t let it hand-roll crypto without one.&lt;/p&gt;&lt;h2 id=making-it-fast&gt;Making it fast&lt;/h2&gt;&lt;p&gt;The naive kernel (double-and-add, generic square-and-multiply inversion) did 6.4M keys/s. Classic tricks, applied one benchmark at a time, multiplied that by 47:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A fixed-window table of precomputed basepoint multiples in &lt;code&gt;(y+x, y−x, 2d·xy)&lt;/code&gt; form, generated on-device at startup, so no host-side bignum. 32 unsigned 8-bit windows: 98.5M keys/s.&lt;/li&gt;&lt;li&gt;ref10&#39;s &lt;code&gt;fe_sq&lt;/code&gt; and an addition-chain inversion: 146M keys/s.&lt;/li&gt;&lt;li&gt;Montgomery batch inversion, one field inversion shared across the 32 keys each work item derives (64 spills registers and halves throughput): 167M keys/s.&lt;/li&gt;&lt;li&gt;Radix 2^51 limbs, 5×u64 with &lt;code&gt;mul_hi&lt;/code&gt; for 128-bit products: 175M keys/s.&lt;/li&gt;&lt;li&gt;Signed 12-bit windows, down to 22, negating table points by swapping &lt;code&gt;(y+x, y−x)&lt;/code&gt; and flipping &lt;code&gt;2d·xy&lt;/code&gt;: 230M keys/s.&lt;/li&gt;&lt;li&gt;Signed 16-bit windows, down to 16 lookups, with a bug the tests caught immediately: 16 windows cover exactly 256 bits, the recode&#39;s final carry escapes, and the computed point loses &lt;code&gt;2^256·B&lt;/code&gt;. One more table slot adds that point back when the carry fires: 300M keys/s.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Even pocl on CPU went from 117k to 3M keys/s, 12× the old Go version without a GPU.&lt;/p&gt;&lt;h2 id=fine-print&gt;Fine print&lt;/h2&gt;&lt;p&gt;Patterns must compile to the mask form: literals and character classes over the base64 alphabet, optional &lt;code&gt;^&lt;/code&gt;/&lt;code&gt;$&lt;/code&gt; anchors. I believe this covers everybody&#39;s needs; alternation and repetitions get a clear error.&lt;/p&gt;&lt;p&gt;Build and run with the included flake (&lt;code&gt;nix build&lt;/code&gt;, or &lt;code&gt;nix develop&lt;/code&gt; for a shell with cargo, clinfo and pocl). The binary picks your first GPU; &lt;code&gt;-device N&lt;/code&gt; overrides. &lt;code&gt;cargo test&lt;/code&gt; runs the kernel comparisons on any available OpenCL device, pocl included, so CI works too. The default launch is 1M candidates wide, 64k on CPU runtimes after pocl choked on the private-memory footprint.&lt;/p&gt;&lt;pre class=language-text&gt;&lt;code class=language-text&gt;$ vanity-keygen &#39;zz$&#39;
2026/07/18 18:08:58Z Looking for a public key matching zz$ on NVIDIA GeForce RTX 4090
2026/07/18 18:08:58Z Public key:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILV3mLbw7VC7VLOkTxGQkyogoGFTq4fbZpJbsRZv5hzz&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;a href=https://github.com/pcarrier/vanity-keygen&gt;code is on GitHub&lt;/a&gt;, ISC-licensed, small enough to read in one sitting.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>I&#39;m alive</title>
    <link href="https://nothing.pcarrier.com/posts/alive/" />
    <updated>2026-07-15T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/alive/</id>
    <content type="html">&lt;p&gt;It&#39;s been quiet here, but I&#39;m alive! Work is keeping me busy these days, and what&#39;s left over is split between building new stuff and writing about it. Writing gets very little.&lt;/p&gt;&lt;p&gt;The building side shows over on &lt;a href=https://xmit.dev&gt;xmit.dev&lt;/a&gt;: &lt;a href=https://xmit.dev/posts/cc-me-found-as/ &gt;cc.me, and found.as grows a contact page&lt;/a&gt; and &lt;a href=https://xmit.dev/posts/cc-me-more/ &gt;four more utilities on cc.me&lt;/a&gt;. Building in public what I need when I need it is super enjoyable.&lt;/p&gt;&lt;p&gt;Work also produced &lt;a href=https://blit.sh&gt;blit.sh&lt;/a&gt;, terminal streaming to the browser in a single binary. And for my own productivity, I built &lt;a href=https://zz.surf&gt;zz.surf&lt;/a&gt;, a tiling browser for iPad, and &lt;a href=https://moo.pcarrier.com&gt;moo.pcarrier.com&lt;/a&gt;, my web-based coding agent. Combined, they allow a nice workflow on an iPad Pro.&lt;/p&gt;&lt;p&gt;I also redesigned &lt;a href=https://pcarrier.com&gt;my home page&lt;/a&gt;, now a cleaner map of everything I make, and much lighter to load as I moved from &lt;code&gt;iframe&lt;/code&gt;s to baked screenshots, tailored PragmataPro to only the glyphs I need. And I now carry an NFC keyfob that points to &lt;a href=https://found.as/p&gt;found.as/p&lt;/a&gt;, so I&#39;m drinking my own champagne.&lt;/p&gt;&lt;p&gt;More here when time allows.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>AYN Odin 3: NixOS SD</title>
    <link href="https://nothing.pcarrier.com/posts/odin3-sd/" />
    <updated>2026-01-26T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/odin3-sd/</id>
    <content type="html">&lt;p&gt;This assumes your Odin 3 can boot on EFI thanks to &lt;a href=https://nothing.pcarrier.com/posts/odin3-abl&gt;my previous post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We use Nix flakes to build an image. Everything is defined in &lt;code&gt;flake.nix&lt;/code&gt; at &lt;a href=https://github.com/pcarrier/sys&gt;pcarrier/sys&lt;/a&gt;. The most important part is in &lt;a href=https://github.com/pcarrier/sys/blob/main/hw/odin3.nix&gt;hw/odin3.nix&lt;/a&gt; as we need a custom kernel today.&lt;/p&gt;&lt;p&gt;Being careful to target the right device, we generate an ISO and write it to the microSD card:&lt;/p&gt;&lt;pre class=language-fish&gt;&lt;code class=language-fish&gt;nix build .#nixosConfigurations.odin3iso.config.system.build.isoImage
lsblk # find the SD card device for the next command
sudo dd if=result/iso/nixos-minimal-….iso of=/dev/sd… bs=4M
sync&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>AYN Odin 3: Rocknix ABL</title>
    <link href="https://nothing.pcarrier.com/posts/odin3-abl/" />
    <updated>2026-01-25T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/odin3-abl/</id>
    <content type="html">&lt;p&gt;This assumes your Odin 3 can boot on EFI thanks to &lt;a href=https://nothing.pcarrier.com/posts/odin3-abl&gt;my previous post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=https://github.com/pcarrier/rocknix-abl&gt;ROCKNIX-ABL&lt;/a&gt; describes itself as &lt;em&gt;a custom Qualcomm ABL created specifically for the emulation community and Qualcomm-based devices&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;It allows dual-booting betwen Android and an EFI loader like &lt;code&gt;systemd-boot&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Before we switch bootloaders, let&#39;s back up the current one:&lt;/p&gt;&lt;pre class=language-fish&gt;&lt;code class=language-fish&gt;edl-ng --loader iqoo_13.melf read-part abl_a abl_backup.img&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then download &lt;a href=https://github.com/ROCKNIX/abl/raw/refs/heads/master/abl_signed-SM8650.elf&gt;abl_signed-SM8650.elf&lt;/a&gt; and flash it with:&lt;/p&gt;&lt;pre class=language-fish&gt;&lt;code class=language-fish&gt;edl-ng --loader iqoo_13.melf write-part abl_a abl_signed-SM8650.elf&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can now boot Android by holding volume up and pressing power.&lt;/p&gt;&lt;p&gt;In &lt;a href=https://nothing.pcarrier.com/posts/odin3-sd&gt;the next installment&lt;/a&gt;, we&#39;ll boot NixOS from a microSD card.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>AYN Odin 3: backup</title>
    <link href="https://nothing.pcarrier.com/posts/odin3-backup/" />
    <updated>2026-01-24T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/odin3-backup/</id>
    <content type="html">&lt;p&gt;I acquired an &lt;a href=https://www.ayntec.com/products/ayn-odin-3&gt;AYN Odin 3 Ultra&lt;/a&gt; in the hopes to run a complete Linux environment on it.&lt;/p&gt;&lt;p&gt;This starts my explorations with a full backup of the stock Android storage.&lt;/p&gt;&lt;p&gt;I needed:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=https://github.com/strongtz/edl-ng&gt;edl-ng&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=https://nothing.pcarrier.com/assets/iqoo_13.melf&gt;iqoo_13.melf&lt;/a&gt; from AYN&#39;s Discord&lt;/li&gt;&lt;li&gt;&lt;a href=https://github.com/pcarrier/sys/commit/33d14d62bdcc8784530fc836d3f7650a74bb4fb7&gt;A udev rule to let users access USB devices&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;After powering the device while pressing volume up and volume down at the same time (display goes black after flashing AYN&#39;s logo), I could examine the partition tables in my &lt;code&gt;fish&lt;/code&gt; shell with:&lt;/p&gt;&lt;pre class=language-fish&gt;&lt;code class=language-fish&gt;for lun in (seq 0 5); echo === $lun ===; edl-ng --loader iqoo_13.melf printgpt --lun $lun; end&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The full map is available &lt;a href=https://gist.github.com/pcarrier/c6e4b60a13baecea7bb710e552593fce&gt;as a gist&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;To back up, I ran:&lt;/p&gt;&lt;pre class=language-fish&gt;&lt;code class=language-fish&gt;for lun in (seq 0 5); edl-ng --loader iqoo_13.melf dump-rawprogram --lun $lun $lun/; end&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;From there I can mess with the system as much as I want, and to restore it to stock Android whenever needed with:&lt;/p&gt;&lt;pre class=language-sh&gt;&lt;code class=language-sh&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;lun&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;seq &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; edl-ng &lt;span class=&quot;token parameter variable&quot;&gt;--loader&lt;/span&gt; iqoo_13.melf rawprogram &lt;span class=&quot;token parameter variable&quot;&gt;--lun&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$lun&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$lun&lt;/span&gt;/rawprogram0.xml &lt;span class=&quot;token variable&quot;&gt;$lun&lt;/span&gt;/patch0.xml&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; end&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Thanks to gio on the AYN and Rocknix Discord servers for all the help.&lt;/p&gt;&lt;p&gt;In &lt;a href=https://nothing.pcarrier.com/posts/odin3-abl&gt;the next installment&lt;/a&gt;, we&#39;ll switch to a bootloader that supports &lt;code&gt;systemd-boot&lt;/code&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>xmit galore</title>
    <link href="https://nothing.pcarrier.com/posts/xmit-galore/" />
    <updated>2025-12-01T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/xmit-galore/</id>
    <content type="html">&lt;p&gt;Made a bunch of improvements to xmit as I&#39;ve found myself with plenty of time to spare.&lt;/p&gt;&lt;h2 id=faster-site-uploads&gt;Faster site uploads&lt;/h2&gt;&lt;p&gt;A few improvements behind the scenes (mostly parallelization) to make sure your sites upload faster than ever.&lt;/p&gt;&lt;h2 id=ui-revamp&gt;UI revamp&lt;/h2&gt;&lt;p&gt;From the overall page structure and landing page to the admin interface split into more pages, through the docs completely rethought to guide you through the process. The fastest path is a lot shorter thanks to…&lt;/p&gt;&lt;h2 id=oncle-bob&gt;Oncle Bob&lt;/h2&gt;&lt;p&gt;A simple and lightweight graphical interface to start, build, and launch your site. It&#39;s not particularly tied to xmit other than not supporting any other providers yet. You can find it at &lt;a href=https://onclebob.com&gt;onclebob.com&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=analytics&gt;Analytics&lt;/h2&gt;&lt;p&gt;Long awaited feature, analytics let you analyze your site&#39;s traffic in hits or bytes. You can slice and dice by domain, path, client type, referrer, HTTP status, content type, and response size. Available at &lt;a href=https://xmit.co/analytics&gt;xmit.co/analytics&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Reliable storage</title>
    <link href="https://nothing.pcarrier.com/posts/offsite/" />
    <updated>2025-09-19T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/offsite/</id>
    <content type="html">&lt;p&gt;I&#39;ve been storing a lot of data somewhat reliably at home, but with my family now entrusting me with their photographs, it was time to up my game.&lt;/p&gt;&lt;p&gt;&lt;a href=https://nothing.pcarrier.com/assets/nas.avif&gt;&lt;picture&gt;&lt;source type=image/avif srcset=&quot;https://nothing.pcarrier.com/img/i2cBlHWRoc-512.avif 512w, https://nothing.pcarrier.com/img/i2cBlHWRoc-1024.avif 1024w, https://nothing.pcarrier.com/img/i2cBlHWRoc-2048.avif 2048w&quot; sizes=auto&gt;&lt;img loading=lazy decoding=async src=https://nothing.pcarrier.com/img/i2cBlHWRoc-512.jpeg alt=&quot;A photo of my storage elements&quot; width=2048 height=2048 srcset=&quot;https://nothing.pcarrier.com/img/i2cBlHWRoc-512.jpeg 512w, https://nothing.pcarrier.com/img/i2cBlHWRoc-1024.jpeg 1024w, https://nothing.pcarrier.com/img/i2cBlHWRoc-2048.jpeg 2048w&quot; sizes=auto&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I&#39;m setting up an HDD NAS for offsite backups. My home storage and media server was already running NixOS, ZFS, sanoid &amp;amp; syncoid (between a zpool of 4 SSDs and a zpool of 8 HDDs and 1 L2ARC SSD partition). A little bit of copy-pasting in my flake repository, &lt;code&gt;nixos-install --flake &lt;a href=https://github.com/pcarrier/sys&gt;github:pcarrier/sys&lt;/a&gt;#hare&lt;/code&gt;, and I&#39;m now mirroring the most critical data to this cheap device over tailscale.&lt;/p&gt;&lt;p&gt;It&#39;ll relocate to a family member this week end. At that point I&#39;ll have a fast raidz regularly snapshot, with snapshots mirrored to a local raidz and a remote RAID1.&lt;/p&gt;&lt;p&gt;If you&#39;re serious about self-hosting and would like a similar setup, I can help you get started. Feel free to &lt;a href=mailto:pc@rrier.fr&gt;reach out&lt;/a&gt;!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>≤255-byte HTML</title>
    <link href="https://nothing.pcarrier.com/posts/255/" />
    <updated>2025-09-17T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/255/</id>
    <content type="html">&lt;p&gt;&lt;a href=https://tantek.com/2025/257/t1/happy-8bitday-255-bytes-max&gt;tantek suggested building tiny pages&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I made two: &lt;a href=https://pcarrier.com/smol&gt;one valid HTML5&lt;/a&gt;, &lt;a href=https://pcarrier.com/packed&gt;one not&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Dispensing iron</title>
    <link href="https://nothing.pcarrier.com/posts/dispensing-iron/" />
    <updated>2025-09-15T00:00:00Z</updated>
    <id>https://nothing.pcarrier.com/posts/dispensing-iron/</id>
    <content type="html">&lt;p&gt;Imagine a push‑button soldering iron that feeds molten solder right from the tip. Press the handle button and a controlled bead flows exactly where you need it. No separate wire to juggle. You get one‑handed precision, faster work, and cleaner joints, especially in tight spaces or field repairs.&lt;/p&gt;&lt;p&gt;Make it work. Make it affordable. Send me one.&lt;/p&gt;</content>
  </entry>
</feed>