<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tim Apple</title>
    <description>The latest articles on DEV Community by Tim Apple (@ninepointlabs).</description>
    <link>https://dev.to/ninepointlabs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193989%2F5102901d-bf04-40d0-b061-127a71268038.jpg</url>
      <title>DEV Community: Tim Apple</title>
      <link>https://dev.to/ninepointlabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ninepointlabs"/>
    <language>en</language>
    <item>
      <title>A relay on your own PC: thinking out loud about FIPS and local sync</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Thu, 22 Oct 2026 11:27:07 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/a-relay-on-your-own-pc-thinking-out-loud-about-fips-and-local-sync-4g8j</link>
      <guid>https://dev.to/ninepointlabs/a-relay-on-your-own-pc-thinking-out-loud-about-fips-and-local-sync-4g8j</guid>
      <description>&lt;p&gt;Last night Lez (&lt;a href="mailto:lez@nostr.hu"&gt;lez@nostr.hu&lt;/a&gt;) left a reply that has stuck with me:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fttfxn8qjivpne6eh2g5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fttfxn8qjivpne6eh2g5x.png" alt="Lez’s Nostr post suggesting FIPS and a relay on the PC that syncs with mobile." width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please also consider FIPS and a relay running on the PC to sync with mobile. The advantage: when PC and mobile are on the same LAN, it connects directly, saving a round-trip to the Internet and back, which is a game changer when decrypting DMs for example.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think Lez is right, and it lines up with something I have wanted for Omostrich for a while: reaching my own machines without leaning on Tailscale or a VPN. So I spent some time looking at what already exists. This is not an announcement. It is me thinking out loud, and I would love to hear from people who have tried any of this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a relay on the PC makes sense
&lt;/h2&gt;

&lt;p&gt;Right now most of us send every note, reaction and DM out to a relay somewhere on the internet, and then pull it back down onto the phone sitting next to the laptop. That works, but it is slow, it depends on someone else’s server being up, and it means your data is only as private as that relay.&lt;/p&gt;

&lt;p&gt;A relay on your own computer flips that around. Your PC holds a full copy of your own events. Your phone talks to it directly when you are home, and everything syncs out to the public relays when it needs to. Decrypting a long DM thread from a box on the same desk is a very different experience from fetching it across the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  FIPS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/jmcorgan/fips" rel="noopener noreferrer"&gt;FIPS&lt;/a&gt; (Free Internetworking Peering System) is a mesh network where each machine’s identity is a Nostr key. Every node gets a private IPv6 address tied to its npub, finds peers by publishing signed adverts on Nostr relays, and uses encrypted Nostr messages to punch through home routers. It can run over the internet, a LAN, Tor, Bluetooth, Ethernet and even radio. Ordinary tools like ssh or a &lt;code&gt;ws://&lt;/code&gt; relay URL just work on top of it.&lt;/p&gt;

&lt;p&gt;It is exactly the shape of thing I had in mind. It is also young. The README says the protocol and APIs are not yet stable, a security audit is the top item on the roadmap, and the most recent release was mostly security fixes. That is healthy for a project at this stage, and it is moving fast, but I would not lean on it for anything important yet. I do want to run it on my own machines and help where I can with testing and bug reports.&lt;/p&gt;

&lt;p&gt;Other options I looked at for the “reach my own machine” part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tailscale or Headscale.&lt;/strong&gt; Still the most reliable choice today. Headscale lets you run the coordination server yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iroh.&lt;/strong&gt; A mature Rust library (1.x) that connects directly when it can and falls back to a relay server you can host yourself. If Omostrich ever needs its own peer-to-peer link, this is probably where I would start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yggdrasil and Reticulum.&lt;/strong&gt; Older mesh projects. Reticulum is strong for radio and offline use. Neither uses Nostr identities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tor onion services.&lt;/strong&gt; Very mature and work through any router, but slow. Citrine on Android already offers this.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The relay part already mostly exists
&lt;/h2&gt;

&lt;p&gt;The nice surprise is that the relay and sync side does not need much new work. NIP-77 (negentropy sync) lets two relays compare what they have and only send the difference.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/hoytech/strfry" rel="noopener noreferrer"&gt;strfry&lt;/a&gt; can sync both ways with a relay in a single command, filtered to your own pubkey. FIPS even ships an example of running strfry reachable only over the mesh.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/bitvora/haven" rel="noopener noreferrer"&gt;Haven&lt;/a&gt; is a personal relay with import and backup built in.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/CodyTseng/nostr-relay-tray" rel="noopener noreferrer"&gt;nostr-relay-tray&lt;/a&gt; is a desktop relay app, and as Lez points out, there is work there toward exactly this kind of syncing.&lt;/li&gt;
&lt;li&gt;Citrine does the same job on Android.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;relay.pleb.one already answers NIP-77 sync requests, so pulling your history down to a local relay works today. Pushing back up works for members of the relay.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I might do with this
&lt;/h2&gt;

&lt;p&gt;Nothing is decided, and I am trying hard not to start new projects this month. But the first experiment is small and needs no new code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run strfry on my own PC with a timer that syncs my events with relay.pleb.one.&lt;/li&gt;
&lt;li&gt;Point my phone at it over the LAN, and later over FIPS.&lt;/li&gt;
&lt;li&gt;If that holds up, package it as a simple “pleb.one local” setup for Omarchy so anyone on the relay can do the same.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I would only build something new if the existing tools fall short, and I suspect they will not.&lt;/p&gt;

&lt;p&gt;Thank you to Lez for the nudge. If you are running a local relay already, or you have been testing FIPS, I would really like to hear how it is going.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.ninepointlabs.com/2026/10/local-relay-on-the-pc/" rel="noopener noreferrer"&gt;blog.ninepointlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nostr</category>
      <category>selfhosted</category>
      <category>networking</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Omostrich 0.3: log in to Nostr apps by QR code</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:51:32 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/omostrich-03-log-in-to-nostr-apps-by-qr-code-3cmi</link>
      <guid>https://dev.to/ninepointlabs/omostrich-03-log-in-to-nostr-apps-by-qr-code-3cmi</guid>
      <description>&lt;p&gt;&lt;a href="https://omostrich.com/" rel="noopener noreferrer"&gt;Omostrich&lt;/a&gt; keeps your Nostr key on your own computer. It holds the key encrypted, unlocks from the Omarchy bar, posts notes, and signs for other Nostr apps over NIP-46 (remote signing) so those apps never see your key. Version 0.3.0 makes that last part much easier: you can now connect a phone app by scanning a QR code instead of copying long connection strings around.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Show a QR code, scan it from your phone.&lt;/strong&gt; Under Remote signing there’s a new &lt;strong&gt;QR&lt;/strong&gt; button next to Copy. It shows your &lt;code&gt;bunker://&lt;/code&gt; connection string as a QR code, which a phone app such as Amethyst can scan to log in with a remote signer. The string is public (your public key and your NIP-46 relays, no secret), and the app’s connect request still shows up in Omostrich for you to approve, like any other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect apps that show their own QR code.&lt;/strong&gt; Some apps go the other way and display a &lt;code&gt;nostrconnect://&lt;/code&gt; code. &lt;strong&gt;Scan QR&lt;/strong&gt; reads it with your laptop camera, or &lt;strong&gt;Paste code&lt;/strong&gt; takes a copied string. Omostrich checks the code, answers the app on the relays it names, and adds it to Authorized apps under its own name. After that it keeps listening for that app after every unlock until you revoke it.&lt;/p&gt;

&lt;p&gt;The camera is handled carefully. Frames go straight to the decoder and are never saved, and the camera turns off as soon as a code is read, when you cancel or close the preview, or after two minutes. Laptop webcams are fixed-focus and these codes are dense, so hold the code inside the guide box about 25 to 35 cm away. Even then, reading a phone’s code with a laptop camera can be unreliable, so the bunker QR is the dependable direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approve all or deny all.&lt;/strong&gt; Right after you log in, Amethyst signs a burst of events at once. When several requests are waiting, you can now settle every one on screen in one click, each just this once. Anything that arrives after you click still waits for its own answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smaller fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always allow&lt;/strong&gt; no longer overwrites an app’s saved relays or name.&lt;/li&gt;
&lt;li&gt;A request delivered twice is handled only once.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;daemon.log&lt;/code&gt; now records each request’s method (such as &lt;code&gt;sign_event&lt;/code&gt;) and whether the reply worked, never the content of the request or the reply.&lt;/li&gt;
&lt;li&gt;The About page’s privacy statement now covers camera use, the relays a scanned app names, and the new log details.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Also new since 0.2
&lt;/h2&gt;

&lt;p&gt;Omostrich 0.2.1 added an optional listener on your Tailscale address so your own devices can reach the signer with a token, and NIP-46 requests are now heard on every bunker relay, not just your posting relays.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;

&lt;p&gt;The QR features need three extra packages. Everything else works without them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; qrencode ffmpeg zbar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To update an existing install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Projects/omostrich
git pull
npm ci
./install-daemon.sh
./install-plugin.sh
systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; restart omostrich
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The restart matters, because the running signer keeps the old code until it’s restarted. More about Omostrich is at &lt;a href="https://omostrich.com/" rel="noopener noreferrer"&gt;omostrich.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.ninepointlabs.com/2026/10/omostrich-0-3/" rel="noopener noreferrer"&gt;blog.ninepointlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Omostrich is part of PlebOne, my open-source Nostr project home: &lt;a href="https://github.com/PlebOne" rel="noopener noreferrer"&gt;https://github.com/PlebOne&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nostr</category>
      <category>linux</category>
      <category>opensource</category>
      <category>privacy</category>
    </item>
    <item>
      <title>fm-cli and Autonomix CLI get their own websites</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Tue, 20 Oct 2026 21:47:00 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/fm-cli-and-autonomix-cli-get-their-own-websites-mdf</link>
      <guid>https://dev.to/ninepointlabs/fm-cli-and-autonomix-cli-get-their-own-websites-mdf</guid>
      <description>&lt;p&gt;Two of the terminal tools now have proper homes on the web: &lt;a href="https://fm-cli.ninepointlabs.com/" rel="noopener noreferrer"&gt;fm-cli.ninepointlabs.com&lt;/a&gt; and &lt;a href="https://autonomix-cli.ninepointlabs.com/" rel="noopener noreferrer"&gt;autonomix-cli.ninepointlabs.com&lt;/a&gt;. Until today, the only way to learn about either one was its GitHub README.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s on them
&lt;/h2&gt;

&lt;p&gt;Each site is one page that answers the questions you’d have before installing: what the tool does, how to install it on your system, and how to get started. Both link straight to the latest release, and the full command reference stays in the README for when you need it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://fm-cli.ninepointlabs.com/" rel="noopener noreferrer"&gt;fm-cli&lt;/a&gt;&lt;/strong&gt; is Fastmail from the terminal: a full-screen mail app, commands that print JSON, and a live watch that follows your mailbox over Fastmail’s push connection. The site walks through all of it, including offline mode, the two-week calendar agenda and contacts, and how sign-in keeps tokens in your system keyring. It also shows every way to install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On Omarchy&lt;/span&gt;
omarchy-mise-install github:ninepointlabs/fm-cli fm-cli

&lt;span class="c"&gt;# With mise anywhere else&lt;/span&gt;
mise use &lt;span class="nt"&gt;-g&lt;/span&gt; github:ninepointlabs/fm-cli@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are &lt;code&gt;.pkg.tar.zst&lt;/code&gt;, &lt;code&gt;.deb&lt;/code&gt; and &lt;code&gt;.rpm&lt;/code&gt; packages and plain tarballs for Linux and macOS too. The README’s screenshot was also swapped for one showing sample mail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://autonomix-cli.ninepointlabs.com/" rel="noopener noreferrer"&gt;Autonomix CLI&lt;/a&gt;&lt;/strong&gt; installs and updates apps straight from GitHub Releases. The site covers the package formats it understands, how it detects what’s already installed, the JSON output for scripts, and how it fits into Omarchy: the bar widget and the post-update hook that updates your apps whenever you run &lt;code&gt;omarchy update&lt;/code&gt;. Install steps for Debian and Ubuntu, Fedora and Arch are right there, along with the full command list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;A website is easier to share and easier to read than a repository. If you’ve been sending someone a GitHub link to explain what fm-cli or Autonomix CLI is, you can send them the site now. Nothing changes in the tools themselves, so there’s nothing to update.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.ninepointlabs.com/2026/10/fm-cli-and-autonomix-cli-websites/" rel="noopener noreferrer"&gt;blog.ninepointlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>linux</category>
      <category>opensource</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Seven Nine Point Labs apps now run on any Linux, with AppImages</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Mon, 19 Oct 2026 23:55:23 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/seven-nine-point-labs-apps-now-run-on-any-linux-with-appimages-8pf</link>
      <guid>https://dev.to/ninepointlabs/seven-nine-point-labs-apps-now-run-on-any-linux-with-appimages-8pf</guid>
      <description>&lt;p&gt;Nine Point Labs apps are made for Omarchy first, and that isn’t changing. But they shouldn’t stop at Omarchy. As of today, seven of them also run on Ubuntu, Fedora, openSUSE and most other Linux distributions: every release now comes with an AppImage that runs on most x86_64 Linux systems and fits properly into your desktop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new
&lt;/h2&gt;

&lt;p&gt;These releases went out today, each with a &lt;code&gt;-x86_64.AppImage&lt;/code&gt; attached next to the usual packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://repokase.ninepointlabs.com/" rel="noopener noreferrer"&gt;Repokase 0.2.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jubako.ninepointlabs.com/" rel="noopener noreferrer"&gt;Jubako 0.4.7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dogear.ninepointlabs.com/" rel="noopener noreferrer"&gt;Dogear 0.1.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://omaforge.ninepointlabs.com/" rel="noopener noreferrer"&gt;omaforge 0.2.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rune.ninepointlabs.com/" rel="noopener noreferrer"&gt;Rune 0.8.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bahaireader.org/" rel="noopener noreferrer"&gt;Bahá’í Reader 0.1.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hyprfall.ninepointlabs.com/" rel="noopener noreferrer"&gt;Hyprfall 0.1.4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Python and Qt apps carry their own Python and Qt inside the AppImage, and Hyprfall carries its own Quickshell and Qt, so there’s nothing else to install. They run on most systems from about 2021 or 2022 on (glibc 2.34 or newer, 2.35 for Hyprfall): Ubuntu 22.04 and later, Debian 12 and later, Fedora, openSUSE and others.&lt;/p&gt;

&lt;h2&gt;
  
  
  It behaves like a real app
&lt;/h2&gt;

&lt;p&gt;Download it, make it executable and run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x dogear-0.1.1-x86_64.AppImage
./dogear-0.1.1-x86_64.AppImage &lt;span class="nt"&gt;--install-desktop-entry&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--install-desktop-entry&lt;/code&gt; puts the app in your application menu with its proper icon, so it shows up correctly in your launcher, taskbar and dock. Dogear also offers itself for PDFs, and Jubako opens &lt;code&gt;.jubadb&lt;/code&gt; files. If you’d rather let a tool manage it, Gear Lever and AppImageLauncher both pick these up. Each AppImage has a &lt;code&gt;.sha256&lt;/code&gt; and a &lt;code&gt;.zsync&lt;/code&gt; file next to it for checking and updating.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few app-specific notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repokase and Dogear&lt;/strong&gt; now follow your desktop’s light or dark setting when they’re not on Omarchy. On Omarchy they still follow your theme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dogear 0.1.1&lt;/strong&gt; also adds an About screen and works better in narrow windows, like half a screen in a tiling window manager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rune 0.8.6&lt;/strong&gt; packages for Arch, Debian and Fedora now install Rune’s AppStream info and icons in every size, so software centers and menus show it properly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bahá’í Reader 0.1.4&lt;/strong&gt; adds a Flatpak bundle as well, &lt;code&gt;bahai-reader-0.1.4-x86_64.flatpak&lt;/code&gt;. It brings its own Python and GTK through the GNOME runtime, so it runs even where your system GTK is too old. It’s a download on the release page, not a Flathub listing. If your system’s Python or GTK is too old for the AppImage, the AppImage now tells you so and points you to the Flatpak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hyprfall 0.1.4&lt;/strong&gt; now needs Quickshell 0.3 or newer. Fedora’s Quickshell is older than that, so the Fedora package is gone and Fedora players should use the AppImage, which brings Quickshell 0.3.2 with it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get them
&lt;/h2&gt;

&lt;p&gt;On Omarchy and Arch, nothing changes: install the &lt;code&gt;.pkg.tar.zst&lt;/code&gt; from the release, or let &lt;a href="https://github.com/ninepointlabs/autonomix-cli" rel="noopener noreferrer"&gt;Autonomix CLI&lt;/a&gt; pick the right download and keep the app updated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;autonomix-cli add https://github.com/ninepointlabs/dogear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On any other Linux, grab the AppImage from the release pages above. From here on, every new Nine Point Labs desktop app release ships an AppImage, and a Flatpak bundle will join it on the release page starting with each app’s next release.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>appimage</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>Autonomix CLI 0.4.3: one password prompt for Update All</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Mon, 19 Oct 2026 14:45:24 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/autonomix-cli-043-one-password-prompt-for-update-all-4f5m</link>
      <guid>https://dev.to/ninepointlabs/autonomix-cli-043-one-password-prompt-for-update-all-4f5m</guid>
      <description>&lt;p&gt;If you track several GitHub-release apps with &lt;a href="https://github.com/ninepointlabs/autonomix-cli" rel="noopener noreferrer"&gt;Autonomix CLI&lt;/a&gt; and hit “Update All”, you probably met the same password dialog over and over. 0.4.3 fixes that: updating several apps now asks for your admin password once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;Before, &lt;code&gt;autonomix-cli update&lt;/code&gt; (and “Update All” from the &lt;a href="https://github.com/ninepointlabs/omarchy-autonomix" rel="noopener noreferrer"&gt;Omarchy bar widget&lt;/a&gt;) installed each update on its own, so polkit asked for your password once per app. Now it downloads every update first, then installs them all in a single &lt;code&gt;pacman -U&lt;/code&gt;, &lt;code&gt;apt-get install&lt;/code&gt; or &lt;code&gt;rpm -Uvh&lt;/code&gt; call. One install, one prompt.&lt;/p&gt;

&lt;p&gt;Failures are clearer too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A failed download only affects that app.&lt;/strong&gt; It’s reported as failed, and the rest still install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A failed install names everything in it.&lt;/strong&gt; If the combined install fails, every app in the batch is reported with the installer’s error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cancelling says so.&lt;/strong&gt; Closing the polkit dialog now shows “authentication cancelled” instead of a bare exit code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;--json&lt;/code&gt; output is unchanged, so the bar widget keeps working as it is. No update needed on that side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also new since the last post
&lt;/h2&gt;

&lt;p&gt;0.4.2 added an About screen. Press &lt;code&gt;i&lt;/code&gt; in the TUI to see the version, the MIT license, a support email and a privacy statement, or run &lt;code&gt;autonomix-cli about&lt;/code&gt; from the command line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;

&lt;p&gt;Autonomix CLI tracks itself, so if you already have it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;autonomix-cli update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New here? Add it once and it keeps itself current:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;autonomix-cli add https://github.com/ninepointlabs/autonomix-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Packages for Arch, Debian/Ubuntu and Fedora (amd64 and arm64) are on the &lt;a href="https://github.com/ninepointlabs/autonomix-cli/releases/tag/v0.4.3" rel="noopener noreferrer"&gt;v0.4.3 release&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.ninepointlabs.com/2026/10/autonomix-cli-0-4-3/" rel="noopener noreferrer"&gt;blog.ninepointlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>cli</category>
      <category>opensource</category>
      <category>archlinux</category>
    </item>
    <item>
      <title>Dogear: a PDF reader for studying, made for Omarchy</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Mon, 19 Oct 2026 11:31:39 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/dogear-a-pdf-reader-for-studying-made-for-omarchy-14bo</link>
      <guid>https://dev.to/ninepointlabs/dogear-a-pdf-reader-for-studying-made-for-omarchy-14bo</guid>
      <description>&lt;p&gt;Class handouts, workbooks and textbooks mostly arrive as PDFs now, and most PDF readers treat them as something to look at, not something to work in. &lt;strong&gt;&lt;a href="https://github.com/ninepointlabs/dogear" rel="noopener noreferrer"&gt;Dogear&lt;/a&gt;&lt;/strong&gt; does what you’d do to a paper textbook: highlight in several colors, write notes next to what you highlighted, fold the corner of a page, and fill in the blanks on a worksheet. When you’re done, it exports everything to Markdown, for example straight into your Obsidian vault.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dogear.ninepointlabs.com/" rel="noopener noreferrer"&gt;dogear.ninepointlabs.com&lt;/a&gt;&lt;/strong&gt; (with a narrated demo video) · &lt;strong&gt;&lt;a href="https://github.com/ninepointlabs/dogear/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;v0.1.0 on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fas1ylhk74vfywhos361r.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fas1ylhk74vfywhos361r.webp" alt="Dogear with a biology handout open: two passages highlighted in yellow and blue, and the sidebar listing both highlights with the note on the second" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mark it up like paper
&lt;/h2&gt;

&lt;p&gt;Select text and press &lt;code&gt;1&lt;/code&gt; through &lt;code&gt;5&lt;/code&gt; to highlight it in yellow, green, blue, pink or purple, or press &lt;code&gt;a&lt;/code&gt; to highlight and write a note in one go. Hover a highlight to read its note; notes also show in the sidebar and as markers in the margin. Press &lt;code&gt;b&lt;/code&gt; to bookmark a page (it gets a folded corner, named after its table of contents entry), and keep general notes about the whole document with &lt;code&gt;Ctrl+N&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dogear remembers the page, scroll position and zoom for every file, so opening a handout again puts you back where you stopped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fill in the blanks
&lt;/h2&gt;

&lt;p&gt;This is what sets Dogear apart. Worksheets leave lines for answers, and in Dogear you just click the line and type. There’s no text box to place: it finds the line in the rendered page (drawn rules, runs of underscores, dotted lines), writes on it in blue ink at the size of the page’s own text, and shrinks a long answer to fit a short blank. &lt;code&gt;Tab&lt;/code&gt; jumps to the next blank, so a whole fill-in-the-blank page can be done from the keyboard. Ruled lines under a question become one answer that wraps from line to line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6f2oklmvdk6tcdg1c8iy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6f2oklmvdk6tcdg1c8iy.webp" alt="A worksheet page with its blanks filled in, including two ruled lines with a longer answer" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A library that remembers your marks
&lt;/h2&gt;

&lt;p&gt;With no PDF open, Dogear shows a library of every PDF you’ve opened, with how many highlights, notes, answers and bookmarks each has. Search reaches inside your marks too, so a word you highlighted three weeks ago finds its handout. You can sort, file documents under categories, and give them your own names (“Book 3: Children’s Classes” instead of a 60-character file name) without renaming the file.&lt;/p&gt;

&lt;p&gt;Dogear never changes your PDFs. It keeps a copy of every PDF you mark up, so your marks always have their PDF even if the original is moved or deleted. Everything lives in one folder, &lt;code&gt;~/Documents/Dogear&lt;/code&gt; by default, that you can sync between computers with Syncthing, Dropbox or Google Drive. If two computers change the same document before syncing, Dogear merges the conflict copy back in and keeps every mark from both. It also notices a re-download or new edition of a book you’ve marked up and offers to bring your marks over.&lt;/p&gt;

&lt;h2&gt;
  
  
  Into Obsidian
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Ctrl+E&lt;/code&gt; writes a Markdown file per PDF: document notes first, then one section per page with highlights as quotes (page and color included), each note under its highlight, bookmarks, and every worksheet answer under its full question, so the export reads without the PDF. Categories come along as Obsidian tags. Point the export folder at your vault in Settings and your study notes land where the rest of your notes live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native to Omarchy
&lt;/h2&gt;

&lt;p&gt;Dogear is keyboard first, with Vim-style reading keys (&lt;code&gt;j&lt;/code&gt;/&lt;code&gt;k&lt;/code&gt;, &lt;code&gt;J&lt;/code&gt;/&lt;code&gt;K&lt;/code&gt; for pages, &lt;code&gt;/&lt;/code&gt; to search) and Ctrl for commands, leaving Super to Hyprland. It follows your Omarchy theme and repaints the moment you run &lt;code&gt;omarchy theme set&lt;/code&gt;, and it makes room in narrow tiling windows. No account, no network access and no telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install v0.1.0
&lt;/h2&gt;

&lt;p&gt;On Arch and Omarchy, install it with &lt;a href="https://github.com/ninepointlabs/autonomix-cli" rel="noopener noreferrer"&gt;autonomix-cli&lt;/a&gt;, which also keeps it updated from GitHub Releases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;autonomix-cli add https://github.com/ninepointlabs/dogear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or download &lt;code&gt;dogear-0.1.0-1-any.pkg.tar.zst&lt;/code&gt; from the &lt;a href="https://github.com/ninepointlabs/dogear/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;release page&lt;/a&gt; and run &lt;code&gt;sudo pacman -U dogear-0.1.0-1-any.pkg.tar.zst&lt;/code&gt;. pacman pulls in &lt;code&gt;pyside6&lt;/code&gt; and &lt;code&gt;qt6-webengine&lt;/code&gt; (for the Qt PDF library). Dogear then shows up in your app launcher and can open PDFs from the file manager.&lt;/p&gt;

&lt;p&gt;MIT licensed. Questions or bugs go to &lt;a href="mailto:help@ninepointlabs.com"&gt;help@ninepointlabs.com&lt;/a&gt; or the &lt;a href="https://github.com/ninepointlabs/dogear/issues" rel="noopener noreferrer"&gt;issue tracker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.ninepointlabs.com/2026/10/dogear/" rel="noopener noreferrer"&gt;blog.ninepointlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>pdf</category>
      <category>productivity</category>
    </item>
    <item>
      <title>folderblog 0.2.3: Better link previews, optional visitor counts, and safer deploys</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Mon, 19 Oct 2026 11:30:01 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/folderblog-023-better-link-previews-optional-visitor-counts-and-safer-deploys-1hdd</link>
      <guid>https://dev.to/ninepointlabs/folderblog-023-better-link-previews-optional-visitor-counts-and-safer-deploys-1hdd</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/ninepointlabs/folderblog" rel="noopener noreferrer"&gt;folderblog&lt;/a&gt; turns a folder of Markdown into a live blog the moment you save. Two releases since the last word here, 0.2.2 and 0.2.3, make what it publishes look better when it’s shared and searched, add an opt-in visitor counter, and stop a blog kept in git from deploying half-finished work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share images for every post
&lt;/h2&gt;

&lt;p&gt;Add &lt;code&gt;image:&lt;/code&gt; to a post’s front matter, either a path inside the blog or a full URL, and it becomes that post’s &lt;code&gt;og:image&lt;/code&gt; and &lt;code&gt;twitter:image&lt;/code&gt;. folderblog writes it as an absolute URL and adds the width and height when the file lives in the blog. Posts without one fall back to &lt;code&gt;static/og-default.png&lt;/code&gt;, or to a new optional &lt;code&gt;image&lt;/code&gt; key in &lt;code&gt;blog.toml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;post"&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;img/cover.jpg&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;folderblog check&lt;/code&gt; warns when the image doesn’t exist, so a typo doesn’t quietly ship a broken preview card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search engines get the whole picture
&lt;/h2&gt;

&lt;p&gt;The default theme now gives every page a meta description, a canonical link, the full set of OpenGraph tags, and a &lt;code&gt;twitter:card&lt;/code&gt;. Post pages carry BlogPosting structured data (JSON-LD), and the home page has a single &lt;code&gt;h1&lt;/code&gt; with the site title.&lt;/p&gt;

&lt;p&gt;folderblog also writes a &lt;code&gt;robots.txt&lt;/code&gt; by default that allows everything and points to the sitemap. If your blog has its own &lt;code&gt;static/robots.txt&lt;/code&gt;, or your theme provides one, yours wins. And &lt;code&gt;check&lt;/code&gt; now warns when &lt;code&gt;blog.toml&lt;/code&gt; has no &lt;code&gt;description&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you keep your own copy of the theme in &lt;code&gt;theme/&lt;/code&gt;, your templates are left alone. Copy the new default theme’s &lt;code&gt;_layouts/base.html&lt;/code&gt; and &lt;code&gt;post.html&lt;/code&gt; to pick up the tags, and run &lt;code&gt;folderblog agents-md --write&lt;/code&gt; in each blog folder to refresh its AGENTS.md.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional visitor counts with GoatCounter
&lt;/h2&gt;

&lt;p&gt;Want to know whether anyone reads the thing? Add one section to &lt;code&gt;blog.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[analytics]&lt;/span&gt;
&lt;span class="py"&gt;goatcounter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://you.goatcounter.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every rendered page gets GoatCounter’s cookie-free counting script, with any theme and no template edits. It’s off by default: with no &lt;code&gt;[analytics]&lt;/code&gt; section the output is byte-for-byte what it was before. It’s never added by &lt;code&gt;preview&lt;/code&gt; or &lt;code&gt;build --drafts&lt;/code&gt;, so your own drafting doesn’t count as visits, and &lt;code&gt;check&lt;/code&gt; flags an invalid URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hold deploys while you’re mid-git
&lt;/h2&gt;

&lt;p&gt;0.2.2 added &lt;code&gt;deploy_branch&lt;/code&gt; for blog folders you keep in git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;deploy_branch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With it set, folderblog only deploys while the folder is a checkout of that branch. On another branch, a detached HEAD, or in the middle of a merge, rebase or cherry-pick, the deploy is held and shows as &lt;code&gt;held: ...&lt;/code&gt; in &lt;code&gt;folderblog status&lt;/code&gt;. It retries on its own once you’re back on the branch. Leave it unset and nothing changes. This blog runs with it on.&lt;/p&gt;

&lt;p&gt;One note for both releases: older versions reject unknown keys in &lt;code&gt;blog.toml&lt;/code&gt;, so upgrade before adding &lt;code&gt;image&lt;/code&gt;, &lt;code&gt;[analytics]&lt;/code&gt; or &lt;code&gt;deploy_branch&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grab it
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arch / Omarchy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo pacman -U folderblog-bin-0.2.3-1-x86_64.pkg.tar.zst&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debian / Ubuntu&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo apt install ./folderblog_0.2.3-1_amd64.deb&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fedora / RHEL / openSUSE&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo dnf install ./folderblog-0.2.3-1.x86_64.rpm&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autonomix-cli&lt;/td&gt;
&lt;td&gt;&lt;code&gt;autonomix-cli add https://github.com/ninepointlabs/folderblog&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The packages and a plain tarball are on the &lt;a href="https://github.com/ninepointlabs/folderblog/releases/tag/v0.2.3" rel="noopener noreferrer"&gt;v0.2.3 release&lt;/a&gt;. New to folderblog? Start with &lt;a href="https://github.com/ninepointlabs/folderblog/blob/main/docs/GUIDE.md" rel="noopener noreferrer"&gt;the guide&lt;/a&gt;, or run &lt;code&gt;folderblog guide&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.ninepointlabs.com/2026/10/folderblog-0-2-3/" rel="noopener noreferrer"&gt;blog.ninepointlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>blogging</category>
      <category>seo</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Linkguard: catch dead links and swap in archived copies</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Mon, 19 Oct 2026 11:23:21 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/linkguard-catch-dead-links-and-swap-in-archived-copies-35l4</link>
      <guid>https://dev.to/ninepointlabs/linkguard-catch-dead-links-and-swap-in-archived-copies-35l4</guid>
      <description>&lt;p&gt;Every blog rots a little. The post you wrote two years ago still reads fine, but a third of its outbound links now land on a 404, a parked domain, or a redesign that ate the page. &lt;strong&gt;&lt;a href="https://github.com/ninepointlabs/linkguard" rel="noopener noreferrer"&gt;Linkguard&lt;/a&gt;&lt;/strong&gt; is a free GitHub Action that finds those links in a Jekyll, Hugo, or folderblog site and points readers to an archived copy instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://linkguard.persistwise.com/" rel="noopener noreferrer"&gt;linkguard.persistwise.com&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/ninepointlabs/linkguard/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;v0.1.0 on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Drop it into a weekly workflow and Linkguard walks your content, pulls every outbound link out of the markdown and HTML (skipping code blocks, comments, relative links, and private addresses), and checks each one. Every link comes back as one of four results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ok&lt;/code&gt; works, or only moved from http to https&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;moved&lt;/code&gt; still works but redirects somewhere else, so you may want to update it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dead&lt;/code&gt; is a 404 or 410, or an outage that survived retries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;blocked&lt;/code&gt; is bot protection (401, 403, 999), and Linkguard never calls those dead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each link it also asks the Internet Archive’s Wayback Machine for a snapshot. When a dead link has a good one, the report hands you the archived URL. Results land in the run’s job summary as a table, as warning annotations on the exact source lines, and as JSON and markdown report files.&lt;/p&gt;

&lt;p&gt;It checks politely: one request per host at a time, at most four in flight, retries with backoff, and &lt;code&gt;Retry-After&lt;/code&gt; honoured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two modes, no account required
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lookup-only&lt;/strong&gt; is the default. No secrets, nothing captured, just checks and existing snapshots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snapshot mode&lt;/strong&gt; turns on when you add your own free Internet Archive keys as repo secrets. Linkguard then asks Save Page Now to capture working links that have no recent snapshot, so a copy exists before the page dies. Captures count against your own Internet Archive account and are paced to six a minute, so a first run over 100 links can take a while.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix it with a pull request
&lt;/h2&gt;

&lt;p&gt;Set &lt;code&gt;open-pr: true&lt;/code&gt; and Linkguard opens a pull request that replaces each dead link with its &lt;code&gt;web.archive.org&lt;/code&gt; copy, exactly where it appears and nowhere else. The PR lists every swap and says plainly that each one is an archived copy, not the original. It never pushes to your default branch, so you review before anything changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/linkguard.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Linkguard&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;17&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1'&lt;/span&gt; &lt;span class="c1"&gt;# weekly&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v7&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ninepointlabs/linkguard@v0.1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It detects your site type from the repo layout, or you can pass &lt;code&gt;site-type&lt;/code&gt; and your own &lt;code&gt;paths&lt;/code&gt;. Ready-made workflows for Jekyll, Hugo, and folderblog are in the repo’s &lt;code&gt;examples/&lt;/code&gt; folder, and the README documents every input and output.&lt;/p&gt;

&lt;p&gt;The free tier checks 100 unique links per run; anything past that is skipped, and the log says how many.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limits and privacy
&lt;/h2&gt;

&lt;p&gt;This is a first release. Snapshot capture and &lt;code&gt;open-pr&lt;/code&gt; are covered by mocked tests so far, the Internet Archive doesn’t publish its rate limits, and its availability API sometimes misses a snapshot that exists. A link that’s down for a GitHub runner can still be up for people, so read the report before you merge.&lt;/p&gt;

&lt;p&gt;There’s no telemetry and no Linkguard server. Only link URLs go to archive.org; your file contents never leave the runner. MIT licensed. Problems go in &lt;a href="https://github.com/ninepointlabs/linkguard/issues" rel="noopener noreferrer"&gt;the issue tracker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.ninepointlabs.com/2026/10/linkguard/" rel="noopener noreferrer"&gt;blog.ninepointlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>githubactions</category>
      <category>blogging</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Autonomix 0.4: JSON for frontends, and a bar widget that uses it</title>
      <dc:creator>Tim Apple</dc:creator>
      <pubDate>Mon, 19 Oct 2026 11:21:37 +0000</pubDate>
      <link>https://dev.to/ninepointlabs/autonomix-04-json-for-frontends-and-a-bar-widget-that-uses-it-520m</link>
      <guid>https://dev.to/ninepointlabs/autonomix-04-json-for-frontends-and-a-bar-widget-that-uses-it-520m</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/ninepointlabs/autonomix-cli" rel="noopener noreferrer"&gt;Autonomix CLI&lt;/a&gt; already tracked your GitHub Releases apps from the terminal, and on Omarchy it could ride along with &lt;code&gt;omarchy update&lt;/code&gt;. What it could not do was talk cleanly to another program. Today that changes: 0.4 ships a JSON surface for every command, and &lt;a href="https://github.com/ninepointlabs/omarchy-autonomix" rel="noopener noreferrer"&gt;omarchy-autonomix&lt;/a&gt; is the first bar widget built on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;GitHub-release apps live outside the Arch repos. You want a count on the bar, a panel to install or update, and a password dialog — not a second terminal ritual. The CLI stays the source of truth in &lt;code&gt;~/.autonomix/config.json&lt;/code&gt;; the widget is just a frontend that speaks &lt;code&gt;--json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new in autonomix-cli 0.4
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--json&lt;/code&gt; on every command.&lt;/strong&gt; &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;, and &lt;code&gt;remove&lt;/code&gt; print structured objects on stdout and keep progress on stderr. Errors come back as &lt;code&gt;{"error": "..."}&lt;/code&gt; with exit code 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;list&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;install &amp;lt;app&amp;gt;&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;remove &amp;lt;app&amp;gt;&lt;/code&gt;&lt;/strong&gt; for frontends that need to drive one app at a time. &lt;code&gt;remove&lt;/code&gt; stops tracking; it does not uninstall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;check&lt;/code&gt; and &lt;code&gt;update&lt;/code&gt; take app names&lt;/strong&gt; — by name, repo, &lt;code&gt;owner/repo&lt;/code&gt;, or URL — so you are not forced to refresh everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;add owner/repo&lt;/code&gt;&lt;/strong&gt; works without pasting a full URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pkexec when there is no terminal&lt;/strong&gt;, so a graphical frontend gets Omarchy’s polkit dialog instead of a silent sudo failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No surprise downgrades.&lt;/strong&gt; Update detection now compares versions the way pacman does; only a newer release counts. The Omarchy post-update hook will not yank you backward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grab &lt;strong&gt;0.4.1&lt;/strong&gt;, not 0.4.0: the first 0.4 release mistook &lt;code&gt;/dev/null&lt;/code&gt; for a terminal and reached for sudo from the bar. 0.4.1 asks the terminal driver properly, so installs from the widget get a password prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The new Omarchy bar widget
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ninepointlabs/omarchy-autonomix" rel="noopener noreferrer"&gt;omarchy-autonomix&lt;/a&gt; is a Quickshell plugin: a package icon with an update count, and a panel that lists tracked apps, installs or updates them, and lets you track &lt;code&gt;owner/repo&lt;/code&gt; or a GitHub URL without opening a terminal. Middle-click the icon to check GitHub now. It needs autonomix-cli 0.4+ at &lt;code&gt;/usr/bin&lt;/code&gt; or &lt;code&gt;/usr/local/bin&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ninepointlabs/omarchy-autonomix ~/Projects/omarchy-autonomix
~/Projects/omarchy-autonomix/install.sh
omarchy plugin &lt;span class="nb"&gt;enable &lt;/span&gt;ninepointlabs.autonomix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Grab the CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;autonomix-cli add https://github.com/ninepointlabs/autonomix-cli
&lt;span class="c"&gt;# or update if you already track it:&lt;/span&gt;
autonomix-cli update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Packages for Arch, Debian/Ubuntu, and Fedora are on the &lt;a href="https://github.com/ninepointlabs/autonomix-cli/releases/tag/v0.4.1" rel="noopener noreferrer"&gt;v0.4.1 release&lt;/a&gt;. If you are still on the October 11 updater post, this is the next chapter: same list of apps, now reachable from the bar.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://blog.ninepointlabs.com/2026/10/autonomix-0-4/" rel="noopener noreferrer"&gt;blog.ninepointlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>json</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
