<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Operand Chronicle</title>
    <description>produced by Calliope Youngblood in DC, USA.</description>
    <link>https://operand.online/</link>
    <lastBuildDate>Mon, 08 Jun 2026 00:00:00 </lastBuildDate>
    <pubDate>Mon, 08 Jun 2026 00:00:00 </pubDate>
    <ttl>1800</ttl>
    <atom:link href="https://operand.online/rss" rel="self" type="application/rss+xml"/>

    
      <item>
        <title>cable mess</title>
        <description><![CDATA[
          
          <hr/>

          <p>As I search my mind for ideas to communicate,
and mechanisms to employ in the practice of communication,
I am inspired and reminded of the cyclical shape of communication
by reading sources I now measure my sanity alongside:</p>
<ul>
<li><a href="https://www.dropsitenews.com/">Drop Site News</a></li>
<li><a href="https://www.404media.co/">404 Media</a></li>
<li><a href="https://lebanon.liveuamap.com/">Lebanon Bomb Map</a></li>
<li><a href="https://global-intifada.org/">Global Intifada - supply chain map</a></li>
</ul>
<p><img src="https://share.operand.online/gram/page/media/2026-06-08.cafe.jpg" alt="cafe" /></p>
<p>I'm beginning again, nearly from zero,
because I caused some serious messes by launching headlong on the road,
in an old camper, burdened under too much load.</p>
<p>The camper is having its engine fully replaced,
and here I am in Michigan,
rearranging as many cables as I could pack into three bags
on the underside of a Greyhound bus,
alongside my clothes and drumsticks.</p>
<p>This is an inglorious phase of rebuilding after failure.
I hope each day this week I can explain some of my failures,
examine how I can address them,
and propose a new cycle for communication -
one I hope can keep me from such failure modes
in the days, months, years to come.</p>
<p>The cycle for communication is one
I penned in my notebook this morning,
as I paddled a kayak around a lake.
If you need to borrow someone's kayak and lake for this exercise,
call me when you're next near Michigan.</p>
<p>Communication Cycle:</p>
<ul>
<li>Alignment</li>
<li>Composure</li>
<li>Practice</li>
<li>Harness</li>
</ul>
<p>Each day this week, as I explain my failures,
I'm going to explore the phases of this cycle
including examples from my business or co-curriculars.
I'm sure I'll be embarrased by the end,
and also more assured by some measure.</p>
<p>For now, as failures are too numerous to seriously consider,
I'll splash some silly concern;
I've gone far too long since making a latte,
and as you can see the practice is gone from my hands.</p>
        ]]></description>
        <link>https://operand.online/chronicle/cable mess</link>
        <guid isPermaLink="false">2026-06-08.cable mess</guid>
        <pubDate>Mon, 08 Jun 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>[research] Local LLMs (making Lemonade)</title>
        <description><![CDATA[
          
          <hr/>

          <p><a href="https://lemonade-server.ai">Lemonade</a> is
AMD-officiated and open-source mechanisms
for binding deep-learning models onto AMD hardware,
from integrated GPU (on the main CPU dye),
to dedicated GPU, to the Neural Processing Unit.</p>
<p>On NixOS, there is a module called <a href="https://github.com/noamsto/nix-amd-ai"><code>nix-amd-ai</code></a>; here is <a href="/gram:nux/module/gpu/amd.nix">our usage for the Framework 16</a>.</p>
<p>To begin, the most challenging idea is how an agent,
an &quot;LLM server&quot;, and accessories such as &quot;tools and skills&quot;,
relate to one another. Lemonade has guidance on these <a href="https://lemonade-server.ai/docs/guide/concepts/">mechanisms</a>.</p>
<p>Lemonade can be accessed in two modes,
because of its design as a locally-resident web app
managed through a <a href="https://lemonade-server.ai/docs/guide/cli/">command-line program</a>.</p>
<p>Mainly, lemonade is a package around the program <a href="https://lemonade-server.ai/docs/guide/configuration/llamacpp/"><code>llama-cpp</code></a>.
<a href="https://lemonade-server.ai/docs/guide/configuration/llamacpp/issues/7">I had some issues in my log</a> that originated in <code>llama-cpp</code>,
because I needed to specify through the Lemonade web UI
that <code>llama-cpp</code> use the &quot;ROCm&quot; backend commonly recommended for AMD on Linux.
The <code>llama-cpp</code> link includes guidance for Windows and MacOS.</p>
<p>The link to my issues also includes the crucial <code>--ctx-size</code> option,
which I needed to increase so <code>llama-cpp</code> could access enough GPU memory
(also called vRAM).</p>
<p>Lemonade's <a href="https://lemonade-server.ai/docs/guide/faq">FAQ</a> is a nice place to begin also,
as this page is outlined by comprehensive sections
for each of lemonade's main concerns,
such as tex-to-speech, model setup, behaviors, and hardware.</p>
<hr />
<h3>Direction: Embedded</h3>
<p>I'm eager to explore <a href="https://lemonade-server.ai/docs/embeddable/">Embedded Lemonade</a> (&quot;half &amp; half&quot;?) -
this is made for application programmers, such as I used to be,
who decide to bring lemonade onto end-user machines
for full-fleet deployments of specialized apps.</p>
<p>Embeddable lemonade brings the full scope of a machine's hardware
into the reach of an application engineer - no subscriptions needed.</p>
<p>This can be used to process sensor data in vehicles, for example -
the <a href="https://baltimorenode.org">Baltimore Node</a> recently had a visit
from a Boeing employee who was looking to process more than 1TB / engine / hour
of in-flight sensor readings.</p>
<h3>Direction: Full-OS agency</h3>
<p><a href="https://huggingface.co/blog/screenenv">Screenenv</a>,
from <a href="https://github.com/huggingface/screenenv">HuggingFace</a>
promises to bring LLM reasoning to a full desktop environment -
perhaps the <a href="https://ubuntu.com/">Ubuntu</a> &amp; <a href="https://www.xfce.org/">XFCE</a> pairing can be upgraded,
to make use of the <a href="https://niri-wm.github.io/niri/">Niri</a> desktop that I find more capable.</p>
<h3>Direction: Plugins</h3>
<p>The <a href="https://lemonade-server.ai/marketplace.html">Lemonade Marketplace</a> (&quot;stand&quot;?)
indexes many popular channels for running your LLM
in coding or generative scenarios,
and I'm likely going to experiment with the open-source options:</p>
<ul>
<li><a href="https://dify.ai/">Dify</a></li>
<li><a href="https://github.com/amd/gaia">GAIA</a></li>
<li><a href="https://github.com/Phqen1x/lemon-zest">Lemon Zest</a></li>
<li><a href="https://www.openhands.dev/">Open Hands</a></li>
<li><a href="https://anythingllm.com/">Anything LLM</a></li>
<li><a href="https://pi.dev/">Pi</a></li>
</ul>
<p>Pi is a simple, command-line replacement for my current agent program,
<a href="https://opencode.ai/">OpenCode</a>. I expect the changeover to be painless,
although I may be adding Pi to the <a href="https://github.com/nixos/nixpkgs">Nix Package Index</a>.
<a href="https://pi.dev/packages">Pi also comes with many packages</a>,
opening the lemonade stand to more purpose-designed operations.</p>
<p>If some mix of skills and procedures seems to fill your needs,
you can encode it perhaps,
using <a href="https://huggingface.co/blog/tiny-agents"><code>tiny-agents</code></a>,
packaged for <a href="https://www.npmjs.com/package/tiny-agents">node-js</a>.
This package was included and recommended in <a href="https://www.amd.com/en/developer/resources/technical-articles/2025/local-tiny-agents--mcp-agents-on-ryzen-ai-with-lemonade-server.html">AMD's announcement
for the lemonade program</a>.</p>
<p>Finally, I suppose I need to learn of all the MCP plugins;
<a href="https://mcpservers.org/">on the open web</a>, so many as to need <a href="https://glama.ai/mcp/servers">numerous indices</a>,
and in language-specific packages (<a href="https://hex.pm/packages?search=mcp&amp;sort=recent_downloads">elixir</a>, <a href="https://crates.io/search?q=mcp">rust</a>).
These mcp layers mean that you can build the core mechanisms
of a program in isolation, and arrange a process of the pieces
in a more nimble, human-commandable form.
For the AMD users on the channel,</p>
        ]]></description>
        <link>https://operand.online/chronicle/[research] Local LLMs (making Lemonade)</link>
        <guid isPermaLink="false">2026-05-14.[research] Local LLMs (making Lemonade)</guid>
        <pubDate>Thu, 14 May 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>[pending] Elixir Core, Mobile Edge</title>
        <description><![CDATA[
          
          <hr/>

          <p>I'm considering how to build an app
that makes a modicum of sense,
in a field of practice that has no discipline
and an influx of young eager energy.</p>
<hr />
<h2>How I came to care.</h2>
<p>I've been producing apps for around fifteen years,
since I last checked. After my sophomore year in college,
I spent the summer interning for Microsoft in Redmond, WA.
I learned a bunch of bad organizational practices there,
began immediately shirking my coding obligations
(sorry, I remain unpersuaded that printer drivers in JavaScript is in any manner sensible).</p>
<p>On weekends, I learned to code web apps in <a href="https://rubyonrails.org">Ruby on Rails</a>,
and that absorbed me for years through my employment at <a href="https://thoughtbot.com">thoughtbot</a>
and <a href="https://codeforamerica.org">Code for America</a>.</p>
<p>At thoughtbot I picked up on the early wave of <a href="https://react.dev">React</a>,
and then spent some months learning the core ES6 language,
which I think is really nice,
compared to the prior browser language-scape.
By 2016 at Code for America,
I began my obsession in deployment engineering,
because <a href="https://www.docker.com">Docker</a> really began changing how apps are released.</p>
<p>This odd mix of skills dangerously increased my confidence;
I assumed this was the pinnacle, all there was to know,
and that I could bank on being ahead of the game,
for the next decade or so.
And then from 2016 - 2026,
I suffered as much disillusionment as possible.</p>
<p>A <a href="https://joannecheng.me/">former colleague from thoughtbot</a>
mentioned Elixir to me when I found her in Richmond, VA one day.
She has since become a resident of Belgium and I miss her dearly,
although I'm glad for the couple days we found
for reunions on the East Coast.</p>
<h2>Problem Space</h2>
<p>Since learning of Phoenix and Elixir,
I have gone through the basics.
Really, using Elixir for web purposes
doesn't really ...click... for me.</p>
<p>How come? Elixir was made to run on the Erlang base,
made by the Ericsson telecommunications company,
and used for linking thousands of phone relays
to relay voice packets from one phone-handset to another;
replacing clunky and laborious switchboards,
and designed to minimize collisions or disconnections.</p>
<p>All that is to say,
Elixir is supposed to happen at a deeper layer than the web.
Using Elixir for web apps is possible, of course,
and we have Discord and WhatsApp as primary examples
of the possible scale the language can reach.
Though... using something so capable to render HTML? Silly. Absurd.</p>
<h3>Your choice.</h3>
<p>Of course, how you choose to build an app is going to depend
on your skills, your planned app, and the code packages you
can use to build upon.</p>
<p>In Elixir, the package for building web apps is called <a href="https://phoenixframework.org">Phoenix</a>.
Yes, [the package]. Python and Ruby both have macro-frameworks
and micro-frameworks, but Elixir really has Phoenix only.
<a href="https://elixirforum.com">People are beginning to discuss this problem</a>.
There happen to be more options for desktop gui apps,
which is nice to consider as a future career arc.</p>
<ul>
<li><a href="https://hex.pm/packages/emerge">Emerge</a></li>
<li><a href="https://hex.pm/packages/scenic">Scenic</a></li>
</ul>
<p>So, Phoenix became popular and a marginal successor
to Ruby on Rails, because of a Phoenix sub-package,
called <a href="https://hex.pm/packages/phoenix_live_view">LiveView</a>.
LiveView in turn made possible <a href="https://livebook.dev/">LiveBook</a>,
which occupies the same niche as <a href="https://jupyter.org/">Jupyter</a>.
Especially remarkable is how LiveBook has learned
to <a href="https://github.com/livebook-dev/pythonx">handle Python</a> also.</p>
<p>So, because Elixir became popular for web apps,
<a href="https://chrismccord.com/">Chris McCord</a> produced Phoenix and LiveView,
and then all of the web programmers decided to bring in
as many javascript frameworks as possible. Quick index:</p>
<ul>
<li><a href="https://hex.pm/packages/live_debugger">live_debugger</a></li>
<li><a href="https://hex.pm/packages/live_select">live_select</a></li>
<li><a href="https://hex.pm/packages/live_toast">live_toast</a></li>
<li><a href="https://hex.pm/packages/live_svelte">live_svelte</a></li>
<li><a href="https://hex.pm/packages/live_monaco_editor">live_monaco_editor</a></li>
<li><a href="https://hex.pm/packages/live_react">live_react</a></li>
<li><a href="https://hex.pm/packages/phoenix_live_react">phoenix_live_react</a>, perhaps different somehow?</li>
<li><a href="https://hex.pm/packages/live_vue">live_vue</a>, annoying to all Elixir-focused podcast speakers.</li>
<li><a href="https://hex.pm/packages/live_charts">live_charts</a></li>
<li><a href="https://hex.pm/packages/lucide_live_view">lucide_live_view</a>, and similar packages for differing icon sets.</li>
</ul>
<blockquote>
<p>This is a sample from page one, <a href="https://hex.pm/packages?search=live_&amp;sort=recent_downloads">Showing 1–30 packages of 201 total</a></p>
</blockquote>
<p>I'll pause there, because perhaps you see how these packages are going.
Eager coder says &quot;sure'd be nice if my JS app could do more backend&quot;,
and then copies all of their JS code
into a package on <a href="https://hex.pm">hex.pm</a>,
a space that should be zoned for Elixir use -
JavaScript belongs on <a href="https://www.npmjs.com">NPM</a>.</p>
<p>Old-school programmers may recognize this
to be a <a href="https://en.wikipedia.org/wiki/Coupling_(computer_programming)">coupling problem</a> (<a href="https://www.geeksforgeeks.org/software-engineering/software-engineering-coupling-and-cohesion/">see also</a>).</p>
<h3>Decoupling.</h3>
<p>In my opinion, <a href="https://github.com/phoenixframework/phoenix_live_view/blob/main/assets/js/phoenix_live_view/hooks.ts">the place where such a solution
seems to slip sidelong is simple to see</a>.
Phoenix Live View includes a module called <code>Hooks</code>,
which nearly implies coupling by name alone.</p>
<p><code>Hooks.ts</code> is a typescript file that compiles to javascript,
which then runs in the browser - if you're on mobile,
this means that the ~340 lines of code inside <code>Hooks</code>
is running on your phone whenever you examine a LiveView-based app.
That's simple enough, only... the purpose of this code
is to package up other code and to synchronize it to the domain,
the &quot;Elixir Core&quot; program based on Phoenix.</p>
<p>Three hundred lines of browser code is simple enough,
and I've used hooks to bring in special UI -
a specific calendar element from React.
Sure is nice to be able to bind a specific user experience
onto a specific back-end data layer.</p>
<p>Only, is this simple coupling any more?
Or are we building many bridges,
one for each JS package we depend on,
repackaging the API from JavaScript through the Phoenix hook module,
all so we can call up our database query before
sending the user any of the HTML page?
Are there too many of these bridges?
Are they each a bridge too far?</p>
<h2>Basic Shapes, Basic Approach.</h2>
<p>Here we are, back at the name of this piece:</p>
<h3>Elixir Core, Browser Edge.</h3>
<p>Elixir is made to run as a mesh of relays, the &quot;core&quot; of the program.
In telephonic phrasing, imagine how often an early telephone customer
would have a chance to look at a switchboard. Zero.
The telephone users should be able to ignore
how their voices are being carried.</p>
<p>Similarly, the switches should probably make no bounds on how
the end-user's telephone looks or functions.
Our Elixir code should have roughly zero concerns
with the packages or components used in the application pages.
Besides, <a href="https://popcorn.swmansion.com/">Elixir in the browser</a>?
More aspirational than functional.</p>
<p>So, as long as the relay and the home-phone agree
on the messaging scheme, the packets on the cable,
the coupling can relax.
This happened, really, in telephony also.
Two handsets that enabled encryption could exchange messages,
without the relays in the middle able to unscramble them.
Later, the relays needed no upgrades to connect internet modems,
on the same line; thus the fun AOL dial-up tones,
programmed into the CD-roms.</p>
<h3>Elixir: choosing a proper dose.</h3>
<p>[... more research needed ...]</p>
<h3>Browser: Unencumbered.</h3>
<p>[... more research needed ...]</p>
        ]]></description>
        <link>https://operand.online/chronicle/[pending] Elixir Core, Mobile Edge</link>
        <guid isPermaLink="false">2026-05-14.[pending] Elixir Core, Mobile Edge</guid>
        <pubDate>Thu, 14 May 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Code Log - Rebuild `gram:op`</title>
        <description><![CDATA[
          
          <hr/>

          <p>As I begin re-launching <code>operand.online</code>,
many problems and old pains reappear.
I had been ignoring my failed domain for months,
because I've been engrossed in occupying a new nomadic residence,
my camper has gone from Grand Rapids to Baltimore to Los Angeles,
to Baltimore to Chicago to Grand Rapids, this year alone.</p>
<p>I've been finding conferences to go to,
although they've been of less use than I assumed.
The long hours on the road and hurried composure that I normally embody
mean that I'm late to show up and a mess when I do.
I'm learning that there are other more sensible methods
of spending my days,
and this domain is one superb manner of being in many places at once.</p>
<p>Beside my human concerns, I'm spending more energy absorbing
the news of global chaos, and I'm sad as each day begins
that my sleep has likely carried me through someone elses' tragedy.
I'm aligning my business to ending these ongoing and expanding horrors.</p>
<p>Whereas before I used my essays to explore my psychology and relationships,
now I am beginning to see how much I had been lacking any purpose.
I had a chance to briefly meet and collaborate with <a href="https://www.404media.co/">404 Media</a>,
I had chances to learn from peers at <a href="https://www.opengovhub.org/">OpenGovHub</a>,
and I am coming to see how my passions are indeed aligned,
both to the quirks of my unique education and to the compelling demands of the now.</p>
<hr />
<h2>Rearrange.</h2>
<p>I begin by erasing a couple unnecessary pieces of my app's homepage,
the summary and the sidebar,
and collapse the codebase index;
these seem to only occupy space with no purpose.</p>
<p>As I record my source changes I realize that this new deployment machine
needs a copy, because I am unable to push my code.</p>
<ul>
<li>I double-check that I can access the machine using ssh, to the public ip address.</li>
<li>I double-check that I opened the router port (UDP 60001) needed by <a href="https://mosh.org/">Mosh</a>.</li>
<li>I've already loaded in some code under <code>share/gram/</code>: <code>nue</code>, <code>nux</code>, <code>mech</code>, and <code>pool</code>.
These are my baseline programs that I can use to quickly push programs into place.</li>
<li><code>mkcd share/gram/op; c init</code> on the domain machine.</li>
<li>on local, <code>cd share/gram/op; c r set-url share nixos@&lt;public-ip&gt;:share/gram/op; c k</code></li>
<li>check that <a href="https://share.operand.online/gram/op/">gram:op</a> has a basic public copy.</li>
</ul>
<hr />
<h2>Preliminaries: loading baseline code.</h2>
<p>A number of days ago I breezed through some preliminaries on this machine.</p>
<blockquote>
<p>I've already loaded in some code under <code>share/gram/</code>: <code>nue</code>, <code>nux</code>, <code>mech</code>, and <code>pool</code>.
These are my baseline programs that I can use to quickly push programs into place.</p>
</blockquote>
<p>Here's how this happened;
these are copied from a raspberry pi's
<code>~/.bash_history</code> and <code>~/.config/nushell/history.txt</code>,
as I ran through a similar process.</p>
<p>These logs are redundant because many of the commands failed,
and needed to be rephrased or re-run after changing a config.
They are here so a full and more concise deployment guide can be made someday,
by slicing through to the core commands.</p>

        <div class="collapse">
          <input type="checkbox"/>
          <div class="collapse-title">
          <h3><code>~/.bash_history</code></h3>
          </div>
          <div class="collapse-content">
          <pre><code>
          git diff
sudo rm -r /etc/nixos
sudo ln -s /home/nixos/.nux /etc/nixos
nix flake update
hx ~/.config/nixpkgs/config.nix
mkdir ~/.config/nix/
mkdir -p ~/.config/nix/
hx ~/.config/nix/nix.conf
nix flake update
hx flake.nix 
nix flake update
sudo nixos-rebuild --flake /etc/nixos/#pebble
sudo nixos-rebuild --flake /etc/nixos/#pebble build
ls -alD /etc/nixos
cd /etc/nixos
sudo nixos-rebuild --flake .#pebble build
hx flake.nix
hx cell/pebble/index.nix 
sudo nixos-rebuild --flake .#pebble build
ls /dev/disk/by-uuid/
hx cell/pebble/index.nix 
sudo nixos-rebuild --flake .#pebble build
hx cell/pebble/index.nix 
sudo nixos-rebuild --flake .#pebble build
sudo nixos-rebuild --flake .#pebble switch
hx .
sudo nixos-rebuild --flake .#pebble switch
hx .
sudo nixos-rebuild --flake .#pebble switch
sudo passwd
passwd
sudo nixos-rebuild --flake .#pebble switch
reboot
nix-shell -p elixir --run iex
hop home
ls .nue
nix-shell -p elixir --run iex
nix-shell -p elixir --run iex
ls -a
date
wget https://share.operand.online/gram/nux/?download=tar_gz
nsh wget wget https://share.operand.online/gram/nux/?download=tar_gz
nix-shell -p wget --run wget https://share.operand.online/gram/nux/?download=tar_gz
nix-shell -p wget --run 'wget https://share.operand.online/gram/nux/?download=tar_gz'
nix-shell -p gnutar --run 'tar -xzvf ./index.html?download=tar_gz'
mv nux .nux
nix-shell -p wget --run 'wget https://share.operand.online/gram/nux/?download=tar_gz -O nux.tar.gz'
mv index.html\?download\=tar_gz nux.tar.gz
nix-shell -p wget --run 'wget https://share.operand.online/gram/nue/?download=tar_gz -O nue.tar.gz'
nix-shell -p gnutar --run 'tar -xzvf ./nue.tar.gz'
nix-shell -p wget --run 'wget https://share.operand.online/gram/mech/?download=tar_gz -O mech.tar.gz'; nix-shell -p gnutar --run 'tar -xzvf ./mech.tar.gz'
ls mech
mv nue .nue
ls nue
sudo chown nixos nue
ls nue
sudo chown -R nixos nue
ls -al
ls .nux
ls .nue
ls mech
nix-shell -p wget --run 'wget https://share.operand.online/gram/mech/?download=tar_gz -O mech.tar.gz'; nix-shell -p gnutar --run 'tar -xzvf ./mech.tar.gz'; mv mech .mech
nix-shell -p wget --run 'wget https://share.operand.online/gram/mech/?download=tar_gz -O mech.tar.gz'; nix-shell -p gnutar --run 'tar -xzvf ./mech.tar.gz'; mv mech .mech
rm mech.tar.gz mech; nix-shell -p wget --run 'wget https://share.operand.online/gram/mech/?download=tar_gz -O mech.tar.gz'; nix-shell -p gnutar --run 'tar -xzvf ./mech.tar.gz'; mv mech .mech
rm mech.tar.gz mech; nix-shell -p wget --run 'wget https://share.operand.online/gram/mech/?download=tar_gz -O mech.tar.gz'; nix-shell -p gnutar --run 'tar -xzvf ./mech.tar.gz'; mv mech .mech
rm mech.tar.gz mech; nix-shell -p wget --run 'wget https://share.operand.online/gram/mech/?download=zip -O mech.zip'
hx mech.zip 
ls -al mech.zip 
rm mech.zip
sudo ls /etc/nixos/
ls /etc
ls /etc/nixos/
nixos-generate-config
sudo nixos-generate-config
sudo cp /etc/nixos/hardware-configuration.nix ~/.nux/cell/pebble/machine.nix
cd .nux
git status
nix-shell -p git
nix-shell -p git helix

          </code></pre>
          </div>
        </div>
      

        <div class="collapse">
          <input type="checkbox"/>
          <div class="collapse-title">
          <h3><code>~/.config/nushell/history.txt</code></h3>
          </div>
          <div class="collapse-content">
          <pre><code>
          rm -r ~/.config/nushell; ln -s ~/.nue ~/.config/nushell
ls ~/.config/nushell/
session hop
hx ~/.nue/page.nu
hx ~/.nue/media.nu
atuin init nushell
mkdir ~/.local/share/atuin
atuin init nu | save ~/.local/share/atuin/init.nu
$env.NU_VERSION
hx ~/.local/share/atuin/init.nu
zoxide init nu | save ~/.zoxide.nu
zoxide init nushell | save ~/.zoxide.nu
starship init nu
starship init nu | save ~/.cache/starship/init.nu
nsh elixir iex
sudo nix-channel --add https://nixos.org/channels/nixpkgs-stable nixos
sudo nix-channel --update
ip a
hx /etc/nixos
hostname
x -r
hx /etc/nixos
x -r
x
hx /etc/nixos
h -r
x
rg hypr cell
ag hypr cell
grep hypr
x -r
pwd
ls
c s
clear
ls
nsh elixir iex
sudo nix-channel --add https://nixos.org/channels/nixpkgs-stable nixos
sudo nix-channel --update
ip a
date
date now
zellij action dump-session
zellij action dump-layout
zellij action dump-layout | save ~/.config/zellij/session/home.kdl
zellij attach -c home
hop home
mkdir ~/.config/zellij/session
zellij action dump-layout | save ~/.config/zellij/session/home.kdl
zellij attach -c home
hop home
date now
sudo nix-channel --update
cycle { date now }
sudo nix-channel --update
sudo ntpdate
h
date now
x
date now
sudo ntpdate time.nist.gov
sudo systemctl stop ntpdate
h -r
http get https://python.org
ping python.org
ping nixos.org
ip a
x
iex
which elixir
h
iex
mkcd relay
cd ..
rmdir relay
mix new relay
cd relay
hx mix.exs
iex -S mix
mix deps.get
iex -S mix
mix compile
http get https://share.operand.online/gram/op/flake.nix
http get https://share.operand.online/gram/op/flake.nix | save flake.nix
hx flake.nix
nd mix compile
hx flake.nix
mix compile
nd mix compile
hx flake.nix
nd mix compile
hx flake.nix
nd mix compile
hx flake.nix
nd mix compile
iex -S mix
hx ~/.bash_history ~/.config/nushell/history.txt
x
ip a
x

          </code></pre>
          </div>
        </div>
      
<hr />
<h2>Upgrading Node Packages</h2>
<p>NodeJS is infamous for &quot;dependency hell&quot;,
a condition where a full day or occasionally a week can be expended
in researching how packages have been upgraded,
and how each package depends on others.</p>
<p>For this essay,
i'm hoping to use the <code>collapsible</code> feature of DaisyUI,
and I saw that the package had an upgrade.
As I tried to upgrade that package, I began seeing myself pulled into a dependency hell loop.
Here are the immediate symptoms;</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">error Invariant Violation: expected workspace package to exist for &quot;eslint&quot;
</div><div class="line" data-line="2">error Invariant Violation: expected workspace package to exist for &quot;ts-jest&quot;
</div><div class="line" data-line="3">error Invariant Violation: expected workspace package to exist for &quot;@babel/plugin-bugfix-firefox-class-in-computed-class-key&quot;
</div><div class="line" data-line="4">error Invariant Violation: expected workspace package to exist for &quot;@babel/plugin-bugfix-safari-class-field-initializer-scope&quot;
</div><div class="line" data-line="5">error Invariant Violation: expected workspace package to exist for &quot;@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression&quot;
</div><div class="line" data-line="6">error Invariant Violation: expected workspace package to exist for &quot;@eslint/plugin-kit&quot;
</div><div class="line" data-line="7">error Invariant Violation: expected workspace package to exist for &quot;minimatch&quot;
</div><div class="line" data-line="8">error Invariant Violation: expected workspace package to exist for &quot;glob&quot;    at invariant (/nix/store/8j2jw3v2vzjl9z4xkw2m9xsqxaxzdw89-yarn-1.22.22/libexec/yarn/lib/cli.js:2318:15)
</div><div class="line" data-line="9">error Invariant Violation: expected workspace package to exist for &quot;@babel/cli&quot;
</div><div class="line" data-line="10">error Invariant Violation: expected workspace package to exist for &quot;@eslint/config-array&quot;
</div></code></pre>
<p>Each one of these lines indicates one-or-more runs of <code>yarn install</code>,
after changing the dependency index inside <code>gram:op/assets/package.json</code>;
each of these errors also required me to head to <a href="https://npmjs.com">npm</a>,
and search for the missing package so I could include the proper recent version number.
This was a failing method, and new problems kept appearing.</p>
<p>I realized a more dominant error was higher in the logs, preceding these &quot;invariant violations&quot;: the &quot;unmet peer dependency&quot;.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">warning &quot; &gt; @babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="2">warning &quot; &gt; @babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="3">warning &quot; &gt; @babel/preset-env@7.29.5&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="4">warning &quot;@babel/preset-env &gt; @babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="5">warning &quot;@babel/preset-env &gt; @babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="6">warning &quot;@babel/preset-env &gt; @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="7">warning &quot;@babel/preset-env &gt; @babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="8">warning &quot;@babel/preset-env &gt; @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.13.0&quot;.
</div><div class="line" data-line="9">warning &quot;@babel/preset-env &gt; @babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="10">warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-corejs2@0.4.17&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="11">warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-corejs2@0.4.17&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-regenerator@0.6.8&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="12">warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-corejs2 &gt; @babel/helper-define-polyfill-provider@0.6.8&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="13">warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-corejs2 &gt; @babel/helper-define-polyfill-provider@0.6.8&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.warning &quot; &gt; postcss-import@16.1.1&quot; has unmet peer dependency &quot;postcss@^8.0.0&quot;.
</div><div class="line" data-line="14">warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-corejs3@0.14.2&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="15">warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-corejs3@0.14.2&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.warning &quot;@babel/preset-env &gt; @babel/plugin-transform-async-to-generator &gt; @babel/helper-remap-async-to-generator@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="16">warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-corejs3 &gt; @babel/helper-define-polyfill-provider@0.6.8&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="17">warning &quot;@babel/preset-env &gt; babel-plugin-polyfill-regenerator@0.6.8&quot; has unmet peer dependency &quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="18">warning &quot;@babel/preset-env &gt; @babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="19">warning &quot;@babel/preset-env &gt; @babel/plugin-syntax-import-assertions@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="20">warning &quot;@babel/preset-env &gt; @babel/plugin-syntax-import-attributes@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="21">warning &quot;@babel/preset-env &gt; @babel/plugin-syntax-unicode-sets-regex@7.18.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="22">warning &quot;@babel/preset-env &gt; @babel/plugin-syntax-unicode-sets-regex &gt; @babel/helper-create-regexp-features-plugin@7.28.5&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="23">warning &quot;@babel/preset-env &gt; @babel/plugin-syntax-unicode-sets-regex &gt; @babel/helper-create-regexp-features-plugin@7.28.5&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.warning &quot;@babel/preset-env &gt; @babel/plugin-transform-class-static-block &gt; @babel/helper-create-class-features-plugin@7.29.3&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="24">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-arrow-functions@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="25">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-async-generator-functions@7.29.0&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="26">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-async-generator-functions &gt; @babel/helper-remap-async-to-generator@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="27">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-async-to-generator@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="28">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-async-to-generator &gt; @babel/helper-remap-async-to-generator@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="29">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-block-scoped-functions@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="30">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-block-scoping@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="31">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-classes@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="32">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-classes &gt; @babel/helper-replace-supers@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="33">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-class-properties@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="34">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-class-properties &gt; @babel/helper-create-class-features-plugin@7.29.3&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="35">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-class-static-block@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.12.0&quot;.
</div><div class="line" data-line="36">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-class-static-block &gt; @babel/helper-create-class-features-plugin@7.29.3&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="37">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-computed-properties@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="38">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-destructuring@7.28.5&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="39">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-dotall-regex@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="40">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-duplicate-keys@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="41">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="42">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-dynamic-import@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="43">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-explicit-resource-management@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="44">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-exponentiation-operator@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="45">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-export-namespace-from@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="46">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-for-of@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="47">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-function-name@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="48">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-json-strings@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="49">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-literals@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="50">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-logical-assignment-operators@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="51">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-member-expression-literals@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="52">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-modules-amd@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="53">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-modules-amd &gt; @babel/helper-module-transforms@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="54">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-modules-commonjs@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="55">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-modules-commonjs &gt; @babel/helper-module-transforms@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="56">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-modules-systemjs@7.29.4&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="57">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-modules-umd@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="58">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-modules-umd &gt; @babel/helper-module-transforms@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="59">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-named-capturing-groups-regex@7.29.0&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="60">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-new-target@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="61">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-nullish-coalescing-operator@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="62">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-numeric-separator@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="63">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-object-rest-spread@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="64">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-object-super@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="65">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-optional-catch-binding@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="66">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-optional-chaining@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="67">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-parameters@7.27.7&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="68">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-private-methods@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="69">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-private-methods &gt; @babel/helper-create-class-features-plugin@7.29.3&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="70">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-private-property-in-object@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="71">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-property-literals@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="72">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-regenerator@7.29.0&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="73">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-regexp-modifiers@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="74">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-reserved-words@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="75">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-shorthand-properties@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="76">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-spread@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="77">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-sticky-regex@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="78">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-template-literals@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="79">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-typeof-symbol@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="80">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-unicode-escapes@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="81">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-unicode-property-regex@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="82">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-unicode-regex@7.27.1&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="83">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-unicode-regex &gt; @babel/helper-create-regexp-features-plugin@7.28.5&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="84">warning &quot;@babel/preset-env &gt; @babel/plugin-transform-unicode-sets-regex@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="85">warning &quot;@babel/preset-env &gt; @babel/preset-modules@0.1.6-no-external-plugins&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="86">warning &quot; &gt; @babel/preset-typescript@7.28.5&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="87">warning &quot;@babel/preset-typescript &gt; @babel/plugin-syntax-jsx@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="88">warning &quot;@babel/preset-typescript &gt; @babel/plugin-transform-modules-commonjs@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="89">warning &quot;@babel/preset-typescript &gt; @babel/plugin-transform-modules-commonjs &gt; @babel/helper-module-transforms@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="90">warning &quot;@babel/preset-typescript &gt; @babel/plugin-transform-typescript@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="91">warning &quot;@babel/preset-typescript &gt; @babel/plugin-transform-typescript &gt; @babel/helper-create-class-features-plugin@7.29.3&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="92">warning &quot;@babel/preset-typescript &gt; @babel/plugin-transform-typescript &gt; @babel/helper-create-class-features-plugin &gt; @babel/helper-replace-supers@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="93">warning &quot;@babel/preset-typescript &gt; @babel/plugin-transform-typescript &gt; @babel/plugin-syntax-typescript@7.28.6&quot; has unmet peer dependency &quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="94">warning: Git tree &#39;/home/calliope/share/gram/op&#39; is dirty
</div><div class="line" data-line="95">warning &quot; &gt; postcss-import@16.1.1&quot; has unmet peer dependency &quot;postcss@^8.0.0&quot;.
</div><div class="line" data-line="96">warning &quot; &gt; ts-jest@29.4.9&quot; has unmet peer dependency &quot;jest@^29.0.0 || ^30.0.0&quot;.
</div><div class="line" data-line="97">warning &quot; &gt; ts-jest@29.4.9&quot; has unmet peer dependency &quot;typescript@&gt;=4.3 &lt;7&quot;.
</div><div class="line" data-line="98">warning &quot; &gt; ts-jest@29.4.9&quot; has unmet peer dependency &quot;typescript@&gt;=4.3 &lt;7&quot;.warning &quot; &gt; vite-plugin-babel@1.6.0&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="99">warning &quot; &gt; vite-plugin-babel@1.6.0&quot; has unmet peer dependency &quot;@babel/core@^7.0.0&quot;.
</div></code></pre>
<p>If you take these ~100 errors, place them in a helix buffer,
place a cursor on each line, skim to the third quote, and erase the preceding phrase,
you have ~100 lines of only the peer dependencies that are being called for.
If you then select the full buffer and run <code>:pipe sort </code>, you can see the minimal requirements:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">&quot;@babel/core@^7.0.0&quot;.
</div><div class="line" data-line="2">&quot;@babel/core@^7.0.0-0&quot;.
</div><div class="line" data-line="3">&quot;@babel/core@^7.0.0-0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="4">&quot;@babel/core@^7.12.0&quot;.
</div><div class="line" data-line="5">&quot;@babel/core@^7.13.0&quot;.
</div><div class="line" data-line="6">&quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="line" data-line="7">&quot;jest@^29.0.0 || ^30.0.0&quot;.
</div><div class="line" data-line="8">&quot;postcss@^8.0.0&quot;.
</div><div class="line" data-line="9">&quot;typescript@&gt;=4.3 &lt;7&quot;.
</div></code></pre>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">&lbrace;</span><span style="color: #d2a8ff;">rm</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">r</span> <span style="color: #e6edf3;">deps</span> <span style="color: #e6edf3;">assets/node_modules</span><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">nd</span> <span style="color: #e6edf3;">mix</span> <span style="color: #e6edf3;">deps.get</span>
</div><div class="line" data-line="3"><span style="color: #d2a8ff;">nd</span> <span style="color: #e6edf3;">yarn</span> <span style="color: #e6edf3;">install</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">cwd</span> <span style="color: #e6edf3;">assets</span>
</div><div class="line" data-line="4"><span style="color: #d2a8ff;">nd</span> <span style="color: #e6edf3;">mix</span> <span style="color: #e6edf3;">assets.build</span>
</div></code></pre>
<p>This really did nothing for me;
after going through the process I had remaining invariant violations,
and my <code>package.json</code> was expanding beyond means.</p>
<p>Before:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-json" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: #7ee787;">&quot;private&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #79c0ff;">true</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="3">  <span style="color: #7ee787;">&quot;workspaces&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #e6edf3;">[</span>
</div><div class="line" data-line="4">    <span style="color: #a5d6ff;">&quot;../deps/*&quot;</span>
</div><div class="line" data-line="5">  <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="6">  <span style="color: #7ee787;">&quot;dependencies&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="7">    <span style="color: #7ee787;">&quot;daisyui&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^5.5&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="8">    <span style="color: #7ee787;">&quot;phoenix&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;workspace:*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="9">    <span style="color: #7ee787;">&quot;phoenix_html&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;workspace:*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="10">    <span style="color: #7ee787;">&quot;phoenix_live_view&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;workspace:*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="11">    <span style="color: #7ee787;">&quot;postcss-import&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^16.1&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="12">    <span style="color: #7ee787;">&quot;tailwindcss&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^4.3&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="13">    <span style="color: #7ee787;">&quot;theme-change&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^2.5&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="14">    <span style="color: #7ee787;">&quot;topbar&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^3.0&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="15">    <span style="color: #7ee787;">&quot;vite&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^8.0&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="16">  <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="17"><span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<p>an hour in:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-json" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: #7ee787;">&quot;private&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #79c0ff;">true</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="3">  <span style="color: #7ee787;">&quot;workspaces&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #e6edf3;">[</span>
</div><div class="line" data-line="4">    <span style="color: #a5d6ff;">&quot;../deps/*&quot;</span>
</div><div class="line" data-line="5">  <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="6">  <span style="color: #7ee787;">&quot;dependencies&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="7">    <span style="color: #7ee787;">&quot;@babel/core&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^7.0&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="8">    <span style="color: #7ee787;">&quot;@babel/preset-env&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^7.29&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="9">    <span style="color: #7ee787;">&quot;@eslint/config-array&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="10">    <span style="color: #7ee787;">&quot;@eslint/plugin-kit&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="11">    <span style="color: #7ee787;">&quot;@jest/reporters&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="12">    <span style="color: #7ee787;">&quot;@tailwindcss/vite&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^4.3&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="13">    <span style="color: #7ee787;">&quot;daisyui&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^5.5&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="14">    <span style="color: #7ee787;">&quot;eslint&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^10.3&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="15">    <span style="color: #7ee787;">&quot;glob&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^13.0&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="16">    <span style="color: #7ee787;">&quot;json5&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="17">    <span style="color: #7ee787;">&quot;minimatch&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^10.2&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="18">    <span style="color: #7ee787;">&quot;phoenix&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;workspace:*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="19">    <span style="color: #7ee787;">&quot;phoenix_html&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;workspace:*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="20">    <span style="color: #7ee787;">&quot;phoenix_live_view&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;workspace:*&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="21">    <span style="color: #7ee787;">&quot;postcss&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^8&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="22">    <span style="color: #7ee787;">&quot;postcss-import&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^16.1&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="23">    <span style="color: #7ee787;">&quot;tailwindcss&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^4.3&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="24">    <span style="color: #7ee787;">&quot;theme-change&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^2.5&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="25">    <span style="color: #7ee787;">&quot;topbar&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^3.0&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="26">    <span style="color: #7ee787;">&quot;typescript&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^6.0&quot;</span><span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="27">    <span style="color: #7ee787;">&quot;vite&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #a5d6ff;">&quot;^8.0&quot;</span>
</div><div class="line" data-line="28">  <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="29"><span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<h2>Re-sparking</h2>
<p>I rigged up most of my JS-compiler procedure using <a href="https://hex.pm/packages/phoenix_vite">phoenix_vite</a>,
and this package includes an <a href="https://hex.pm/packages/igniter">Igniter</a> module to spark the necessary code and configs.
I decide to erase the <code>package.json</code> index and begin again.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">rm</span> <span style="color: #e6edf3;">package.json</span>
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">rm</span> <span style="color: #e6edf3;">assets/yarn.lock</span>
</div><div class="line" data-line="3"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">nd</span> <span style="color: #e6edf3;">mix</span> <span style="color: #e6edf3;">igniter.install</span> <span style="color: #e6edf3;">phoenix_vite</span>
</div></code></pre>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1">warning: Git tree <span style="color: #a5d6ff;">&#39;/home/calliope/share/gram/op&#39;</span> is dirty
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">checking</span> <span style="color: #e6edf3;">for</span> <span style="color: #e6edf3;">igniter</span> <span style="color: #e6edf3;">in</span> <span style="color: #e6edf3;">project</span> <span style="color: #e6edf3;">✔</span>
</div><div class="line" data-line="3"><span style="color: #d2a8ff;">Updating</span> project<span style="color: #a5d6ff;">&#39;s igniter dependency ✔
</div><div class="line" data-line="4">compiling igniter ✔
</div><div class="line" data-line="5">compile ✔
</div><div class="line" data-line="6">Dependency phoenix_vite is already in mix.exs. Should we replace it?
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">Desired: `&lbrace;:phoenix_vite, &quot;~&gt; 0.4&quot;&rbrace;`
</div><div class="line" data-line="9">Found: `&lbrace;:phoenix_vite, &quot;~&gt; 0.4.3&quot;&rbrace;`
</div><div class="line" data-line="10"> [Y/n] n
</div><div class="line" data-line="11">`phoenix_vite.install` x
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">Issues:
</div><div class="line" data-line="14">
</div><div class="line" data-line="15">* assets/vite.config.mjs: File already exists
</div><div class="line" data-line="16">* Cannot move priv/static/corp/dlcp.cert.pdf to assets/public/corp/dlcp.cert.pdf, as assets/public/corp/dlcp.cert.pdf already exists.
</div><div class="line" data-line="17">* Cannot move priv/static/corp/2024-04-21.dlcp.png to assets/public/corp/2024-04-21.dlcp.png, as assets/public/corp/2024-04-21.dlcp.png already exists.
</div><div class="line" data-line="18">* Cannot move priv/static/corp/dlcp.CorpForProfitDomesticInitialFiling.pdf to assets/public/corp/dlcp.CorpForProfitDomesticInitialFiling.pdf, as assets/public/corp/dlcp.CorpForProfitDomesticInitialFiling.pdf already exists.
</div><div class="line" data-line="19">* Cannot move priv/static/cache_manifest.json to assets/public/cache_manifest.json, as assets/public/cache_manifest.json already exists.
</div><div class="line" data-line="20">* Cannot move priv/static/corp/CP575Notice_1704499942839.pdf to assets/public/corp/CP575Notice_1704499942839.pdf, as assets/public/corp/CP575Notice_1704499942839.pdf already exists.
</div><div class="line" data-line="21">* Cannot move priv/static/images/favicon.ico to assets/public/images/favicon.ico, as assets/public/images/favicon.ico already exists.
</div><div class="line" data-line="22">* Cannot move priv/static/robots.txt to assets/public/robots.txt, as assets/public/robots.txt already exists.
</div><div class="line" data-line="23">* Cannot move priv/static/images/logo.svg to assets/public/images/logo.svg, as assets/public/images/logo.svg already exists.
</div><div class="line" data-line="24">* Cannot move priv/static/fonts/fa-solid-900.ttf to assets/public/fonts/fa-solid-900.ttf, as assets/public/fonts/fa-solid-900.ttf already exists.
</div><div class="line" data-line="25">* Cannot move priv/static/images/screen.png to assets/public/images/screen.png, as assets/public/images/screen.png already exists.
</div><div class="line" data-line="26"></span>
</div></code></pre>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">rm</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">r</span> <span style="color: #e6edf3;">assets/vite.config.mjs</span> <span style="color: #e6edf3;">priv/static</span> <span style="color: #e6edf3;">assets/package.json</span> <span style="color: #e6edf3;">assets/yarn.lock</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">nd</span> <span style="color: #e6edf3;">mix</span> <span style="color: #e6edf3;">igniter.install</span> <span style="color: #e6edf3;">phoenix_vite</span>
</div></code></pre>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">These</span> <span style="color: #e6edf3;">folders</span> <span style="color: #e6edf3;">will</span> <span style="color: #e6edf3;">be</span> <span style="color: #e6edf3;">created:</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: #d2a8ff;">/assets/public</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: #d2a8ff;">These</span> <span style="color: #e6edf3;">files</span> <span style="color: #e6edf3;">will</span> <span style="color: #e6edf3;">be</span> <span style="color: #e6edf3;">removed:</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">assets/vendor/daisyui-theme.js</span>
</div><div class="line" data-line="9"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">assets/vendor/daisyui.js</span>
</div><div class="line" data-line="10"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">assets/vendor/topbar.js</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"><span style="color: #d2a8ff;">The</span> <span style="color: #e6edf3;">following</span> <span style="color: #e6edf3;">installer</span> <span style="color: #e6edf3;">was</span> <span style="color: #e6edf3;">found</span> <span style="color: #e6edf3;">and</span> <span style="color: #e6edf3;">executed:</span> <span style="color: #a5d6ff;">`phoenix_vite.install`</span> <span style="color: #e6edf3;">-</span> <span style="color: #e6edf3;">Warnings:</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">Failed</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">remove</span> <span style="color: #e6edf3;">dependency</span> <span style="color: #e6edf3;">:esbuild</span> <span style="color: #e6edf3;">from</span> <span style="color: #a5d6ff;">`mix.exs`</span>.
</div><div class="line" data-line="16">
</div><div class="line" data-line="17">  <span style="color: #d2a8ff;">Please</span> <span style="color: #e6edf3;">remove</span> <span style="color: #e6edf3;">the</span> <span style="color: #e6edf3;">old</span> <span style="color: #e6edf3;">dependency</span> <span style="color: #e6edf3;">manually.</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">Failed</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">remove</span> <span style="color: #e6edf3;">dependency</span> <span style="color: #e6edf3;">:tailwind</span> <span style="color: #e6edf3;">from</span> <span style="color: #a5d6ff;">`mix.exs`</span>.
</div><div class="line" data-line="20">
</div><div class="line" data-line="21">  <span style="color: #d2a8ff;">Please</span> <span style="color: #e6edf3;">remove</span> <span style="color: #e6edf3;">the</span> <span style="color: #e6edf3;">old</span> <span style="color: #e6edf3;">dependency</span> <span style="color: #e6edf3;">manually.</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23">
</div><div class="line" data-line="24">
</div><div class="line" data-line="25"><span style="color: #d2a8ff;">These</span> <span style="color: #e6edf3;">tasks</span> <span style="color: #e6edf3;">will</span> <span style="color: #e6edf3;">be</span> <span style="color: #e6edf3;">run</span> <span style="color: #e6edf3;">after</span> <span style="color: #e6edf3;">the</span> <span style="color: #e6edf3;">above</span> <span style="color: #e6edf3;">changes:</span>
</div><div class="line" data-line="26">
</div><div class="line" data-line="27"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">deps.clean</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">unlock</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">unused</span> <span style="color: #e6edf3;">esbuild</span>
</div><div class="line" data-line="28"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">deps.clean</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">unlock</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">unused</span> <span style="color: #e6edf3;">tailwind</span>
</div><div class="line" data-line="29"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">assets.setup</span>
</div><div class="line" data-line="30">
</div><div class="line" data-line="31"><span style="color: #d2a8ff;">Warning!</span> <span style="color: #e6edf3;">Uncommitted</span> <span style="color: #e6edf3;">git</span> <span style="color: #e6edf3;">changes</span> <span style="color: #e6edf3;">detected</span> <span style="color: #e6edf3;">in</span> <span style="color: #e6edf3;">the</span> <span style="color: #e6edf3;">project.</span>
</div><div class="line" data-line="32">
</div><div class="line" data-line="33"><span style="color: #d2a8ff;">You</span> <span style="color: #e6edf3;">may</span> <span style="color: #e6edf3;">want</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">save</span> <span style="color: #e6edf3;">these</span> <span style="color: #e6edf3;">changes</span> <span style="color: #e6edf3;">and</span> <span style="color: #e6edf3;">rerun</span> <span style="color: #e6edf3;">this</span> <span style="color: #e6edf3;">command.</span>
</div><div class="line" data-line="34"><span style="color: #d2a8ff;">This</span> <span style="color: #e6edf3;">ensures</span> <span style="color: #e6edf3;">that</span> <span style="color: #e6edf3;">you</span> <span style="color: #e6edf3;">can</span> <span style="color: #e6edf3;">run</span> <span style="color: #a5d6ff;">`git reset`</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">undo</span> <span style="color: #e6edf3;">the</span> <span style="color: #e6edf3;">changes.</span>
</div><div class="line" data-line="35">
</div><div class="line" data-line="36"><span style="color: #d2a8ff;">Output</span> <span style="color: #e6edf3;">of</span> <span style="color: #a5d6ff;">`git status -s --porcelain`</span>:
</div><div class="line" data-line="37">
</div><div class="line" data-line="38"> <span style="color: #d2a8ff;">D</span> <span style="color: #e6edf3;">assets/package.json</span>
</div><div class="line" data-line="39"> <span style="color: #d2a8ff;">D</span> <span style="color: #e6edf3;">assets/vite.config.mjs</span>
</div><div class="line" data-line="40"> <span style="color: #d2a8ff;">D</span> <span style="color: #e6edf3;">assets/yarn.lock</span>
</div><div class="line" data-line="41"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">config/dev.exs</span>
</div><div class="line" data-line="42"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">config/prod.exs</span>
</div><div class="line" data-line="43"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">config/runtime.exs</span>
</div><div class="line" data-line="44"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">flake.lock</span>
</div><div class="line" data-line="45"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">flake.nix</span>
</div><div class="line" data-line="46"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">lib/op_web/live/chronicle/show.ex</span>
</div><div class="line" data-line="47"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">lib/op_web/router.ex</span>
</div><div class="line" data-line="48"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">lib/render.ex</span>
</div><div class="line" data-line="49"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">mix.exs</span>
</div><div class="line" data-line="50"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">mix.lock</span>
</div><div class="line" data-line="51"> <span style="color: #d2a8ff;">D</span> <span style="color: #e6edf3;">priv/static/images/logo.svg</span>
</div><div class="line" data-line="52">
</div><div class="line" data-line="53">
</div><div class="line" data-line="54"><span style="color: #d2a8ff;">Proceed</span> <span style="color: #e6edf3;">with</span> <span style="color: #e6edf3;">changes?</span>
</div><div class="line" data-line="55"> <span style="color: #e6edf3;">[</span><span style="color: #a5d6ff;">Y/n</span><span style="color: #e6edf3;">]</span> y
</div><div class="line" data-line="56"><span style="color: #d2a8ff;">Resolving</span> <span style="color: #e6edf3;">Hex</span> <span style="color: #e6edf3;">dependencies...</span>
</div><div class="line" data-line="57"><span style="color: #d2a8ff;">Resolution</span> <span style="color: #e6edf3;">completed</span> <span style="color: #e6edf3;">in</span> <span style="color: #e6edf3;">0.274s</span>
</div><div class="line" data-line="58"><span style="color: #d2a8ff;">Unchanged</span>:
</div><div class="line" data-line="59">  <span style="color: #d2a8ff;">bandit</span> <span style="color: #e6edf3;">1.11.0</span>
</div><div class="line" data-line="60">  <span style="color: #d2a8ff;">cachex</span> <span style="color: #e6edf3;">4.1.1</span>
</div><div class="line" data-line="61">  <span style="color: #d2a8ff;">call</span> <span style="color: #e6edf3;">0.0.2</span>
</div><div class="line" data-line="62">  <span style="color: #d2a8ff;">db_connection</span> <span style="color: #e6edf3;">2.10.1</span>
</div><div class="line" data-line="63">  <span style="color: #d2a8ff;">decimal</span> <span style="color: #e6edf3;">3.1.0</span>
</div><div class="line" data-line="64">  <span style="color: #d2a8ff;">dns_cluster</span> <span style="color: #e6edf3;">0.2.0</span>
</div><div class="line" data-line="65">  <span style="color: #d2a8ff;">earmark_parser</span> <span style="color: #e6edf3;">1.4.44</span>
</div><div class="line" data-line="66">  <span style="color: #d2a8ff;">eternal</span> <span style="color: #e6edf3;">1.2.2</span>
</div><div class="line" data-line="67">  <span style="color: #d2a8ff;">ex_ast</span> <span style="color: #e6edf3;">0.11.2</span>
</div><div class="line" data-line="68">  <span style="color: #d2a8ff;">ex_doc</span> <span style="color: #e6edf3;">0.40.2</span>
</div><div class="line" data-line="69">  <span style="color: #d2a8ff;">ex_hash_ring</span> <span style="color: #e6edf3;">6.0.4</span>
</div><div class="line" data-line="70">  <span style="color: #d2a8ff;">ex_heroicons</span> <span style="color: #e6edf3;">3.1.0</span>
</div><div class="line" data-line="71">  <span style="color: #d2a8ff;">expo</span> <span style="color: #e6edf3;">1.1.1</span>
</div><div class="line" data-line="72">  <span style="color: #d2a8ff;">file_system</span> <span style="color: #e6edf3;">1.1.1</span>
</div><div class="line" data-line="73">  <span style="color: #d2a8ff;">finch</span> <span style="color: #e6edf3;">0.22.0</span>
</div><div class="line" data-line="74">  <span style="color: #d2a8ff;">floki</span> <span style="color: #e6edf3;">0.38.1</span>
</div><div class="line" data-line="75">  <span style="color: #d2a8ff;">gettext</span> <span style="color: #e6edf3;">0.26.2</span>
</div><div class="line" data-line="76">  <span style="color: #d2a8ff;">git_cli</span> <span style="color: #e6edf3;">0.3.0</span>
</div><div class="line" data-line="77">  <span style="color: #d2a8ff;">glob_ex</span> <span style="color: #e6edf3;">0.1.11</span>
</div><div class="line" data-line="78">  <span style="color: #d2a8ff;">hpax</span> <span style="color: #e6edf3;">1.0.3</span>
</div><div class="line" data-line="79">  <span style="color: #d2a8ff;">igniter</span> <span style="color: #e6edf3;">0.8.0</span>
</div><div class="line" data-line="80">  <span style="color: #d2a8ff;">jason</span> <span style="color: #e6edf3;">1.4.5</span>
</div><div class="line" data-line="81">  <span style="color: #d2a8ff;">jumper</span> <span style="color: #e6edf3;">1.0.2</span>
</div><div class="line" data-line="82">  <span style="color: #d2a8ff;">live_debugger</span> <span style="color: #e6edf3;">0.3.2</span>
</div><div class="line" data-line="83">  <span style="color: #d2a8ff;">lumis</span> <span style="color: #e6edf3;">0.5.0</span>
</div><div class="line" data-line="84">  <span style="color: #d2a8ff;">makeup</span> <span style="color: #e6edf3;">1.2.1</span>
</div><div class="line" data-line="85">  <span style="color: #d2a8ff;">makeup_elixir</span> <span style="color: #e6edf3;">1.0.1</span>
</div><div class="line" data-line="86">  <span style="color: #d2a8ff;">makeup_erlang</span> <span style="color: #e6edf3;">1.1.0</span>
</div><div class="line" data-line="87">  <span style="color: #d2a8ff;">mdex</span> <span style="color: #e6edf3;">0.12.2</span>
</div><div class="line" data-line="88">  <span style="color: #d2a8ff;">mime</span> <span style="color: #e6edf3;">2.0.7</span>
</div><div class="line" data-line="89">  <span style="color: #d2a8ff;">mint</span> <span style="color: #e6edf3;">1.8.0</span>
</div><div class="line" data-line="90">  <span style="color: #d2a8ff;">nimble_options</span> <span style="color: #e6edf3;">1.1.1</span>
</div><div class="line" data-line="91">  <span style="color: #d2a8ff;">nimble_parsec</span> <span style="color: #e6edf3;">1.4.2</span>
</div><div class="line" data-line="92">  <span style="color: #d2a8ff;">nimble_pool</span> <span style="color: #e6edf3;">1.1.0</span>
</div><div class="line" data-line="93">  <span style="color: #d2a8ff;">owl</span> <span style="color: #e6edf3;">0.13.0</span>
</div><div class="line" data-line="94">  <span style="color: #d2a8ff;">phoenix</span> <span style="color: #e6edf3;">1.8.7</span>
</div><div class="line" data-line="95">  <span style="color: #d2a8ff;">phoenix_html</span> <span style="color: #e6edf3;">4.3.0</span>
</div><div class="line" data-line="96">  <span style="color: #d2a8ff;">phoenix_html_helpers</span> <span style="color: #e6edf3;">1.0.1</span>
</div><div class="line" data-line="97">  <span style="color: #d2a8ff;">phoenix_live_dashboard</span> <span style="color: #e6edf3;">0.8.7</span>
</div><div class="line" data-line="98">  <span style="color: #d2a8ff;">phoenix_live_reload</span> <span style="color: #e6edf3;">1.6.2</span>
</div><div class="line" data-line="99">  <span style="color: #d2a8ff;">phoenix_live_view</span> <span style="color: #e6edf3;">1.1.30</span>
</div><div class="line" data-line="100">  <span style="color: #d2a8ff;">phoenix_pubsub</span> <span style="color: #e6edf3;">2.2.0</span>
</div><div class="line" data-line="101">  <span style="color: #d2a8ff;">phoenix_template</span> <span style="color: #e6edf3;">1.0.4</span>
</div><div class="line" data-line="102">  <span style="color: #d2a8ff;">phoenix_vite</span> <span style="color: #e6edf3;">0.4.3</span>
</div><div class="line" data-line="103">  <span style="color: #d2a8ff;">plug</span> <span style="color: #e6edf3;">1.19.1</span>
</div><div class="line" data-line="104">  <span style="color: #d2a8ff;">plug_crypto</span> <span style="color: #e6edf3;">2.1.1</span>
</div><div class="line" data-line="105">  <span style="color: #d2a8ff;">postgrex</span> <span style="color: #e6edf3;">0.22.2</span>
</div><div class="line" data-line="106">  <span style="color: #d2a8ff;">req</span> <span style="color: #e6edf3;">0.5.17</span>
</div><div class="line" data-line="107">  <span style="color: #d2a8ff;">rewrite</span> <span style="color: #e6edf3;">1.3.0</span>
</div><div class="line" data-line="108">  <span style="color: #d2a8ff;">rustler_precompiled</span> <span style="color: #e6edf3;">0.9.0</span>
</div><div class="line" data-line="109">  <span style="color: #d2a8ff;">sleeplocks</span> <span style="color: #e6edf3;">1.1.4</span>
</div><div class="line" data-line="110">  <span style="color: #d2a8ff;">sobelow</span> <span style="color: #e6edf3;">0.14.1</span>
</div><div class="line" data-line="111">  <span style="color: #d2a8ff;">sourceror</span> <span style="color: #e6edf3;">1.12.0</span>
</div><div class="line" data-line="112">  <span style="color: #d2a8ff;">spitfire</span> <span style="color: #e6edf3;">0.3.11</span>
</div><div class="line" data-line="113">  <span style="color: #d2a8ff;">telemetry</span> <span style="color: #e6edf3;">1.4.2</span>
</div><div class="line" data-line="114">  <span style="color: #d2a8ff;">telemetry_metrics</span> <span style="color: #e6edf3;">1.1.0</span>
</div><div class="line" data-line="115">  <span style="color: #d2a8ff;">telemetry_poller</span> <span style="color: #e6edf3;">1.3.0</span>
</div><div class="line" data-line="116">  <span style="color: #d2a8ff;">text_diff</span> <span style="color: #e6edf3;">0.1.0</span>
</div><div class="line" data-line="117">  <span style="color: #d2a8ff;">thousand_island</span> <span style="color: #e6edf3;">1.4.3</span>
</div><div class="line" data-line="118">  <span style="color: #d2a8ff;">tox</span> <span style="color: #e6edf3;">0.2.3</span>
</div><div class="line" data-line="119">  <span style="color: #d2a8ff;">unsafe</span> <span style="color: #e6edf3;">1.0.2</span>
</div><div class="line" data-line="120">  <span style="color: #d2a8ff;">websock</span> <span style="color: #e6edf3;">0.5.3</span>
</div><div class="line" data-line="121">  <span style="color: #d2a8ff;">websock_adapter</span> <span style="color: #e6edf3;">0.5.9</span>
</div><div class="line" data-line="122">  <span style="color: #d2a8ff;">yamerl</span> <span style="color: #e6edf3;">0.10.0</span>
</div><div class="line" data-line="123">  <span style="color: #d2a8ff;">yaml_elixir</span> <span style="color: #e6edf3;">2.12.1</span>
</div><div class="line" data-line="124">  <span style="color: #d2a8ff;">yaml_front_matter</span> <span style="color: #e6edf3;">1.0.0</span>
</div><div class="line" data-line="125"><span style="color: #d2a8ff;">All</span> <span style="color: #e6edf3;">dependencies</span> <span style="color: #e6edf3;">are</span> <span style="color: #e6edf3;">up</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">date</span>
</div><div class="line" data-line="126"><span style="color: #d2a8ff;">**</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">File.Error</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">could</span> <span style="color: #e6edf3;">not</span> <span style="color: #e6edf3;">remove</span> <span style="color: #e6edf3;">file</span> <span style="color: #a5d6ff;">&quot;assets/vendor/daisyui-theme.js&quot;</span>: no such file or directory
</div><div class="line" data-line="127">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">elixir</span> <span style="color: #e6edf3;">1.18.4</span><span style="color: #e6edf3;">)</span> lib/file<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">ex</span>:1222: File<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">rm</span><span style="color: #e6edf3;">!</span><span style="color: #79c0ff;">/</span><span style="color: #79c0ff;">1</span>
</div><div class="line" data-line="128">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">elixir</span> <span style="color: #e6edf3;">1.18.4</span><span style="color: #e6edf3;">)</span> lib/enum<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">ex</span>:987: Enum<span style="color: #e6edf3;">.</span><span style="color: #a5d6ff;">&quot;-each/2-lists^foreach/1-0-&quot;</span><span style="color: #79c0ff;">/</span><span style="color: #79c0ff;">2</span>
</div><div class="line" data-line="129">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">igniter</span> <span style="color: #e6edf3;">0.8.0</span><span style="color: #e6edf3;">)</span> lib/igniter<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">ex</span>:1253: Igniter<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">do_or_dry_run/2</span>
</div><div class="line" data-line="130">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">igniter</span> <span style="color: #e6edf3;">0.8.0</span><span style="color: #e6edf3;">)</span> lib/igniter/util/install<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">ex</span>:211: Igniter<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">Util</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">Install</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">run_installers/5</span>
</div><div class="line" data-line="131">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">mix</span> <span style="color: #e6edf3;">1.18.4</span><span style="color: #e6edf3;">)</span> lib/mix/task<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">ex</span>:495: anonymous fn/3 in Mix<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">Task</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">run_task/5</span>
</div><div class="line" data-line="132">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">mix</span> <span style="color: #e6edf3;">1.18.4</span><span style="color: #e6edf3;">)</span> lib/mix/cli<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">ex</span>:107: Mix<span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">CLI</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">run_task/2</span>
</div><div class="line" data-line="133">    /nix/store/4nvnygngnha29ycn4lilh5iazc6hikff-elixir-1.18.4/bin/mix:2: <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">file</span><span style="color: #e6edf3;">)</span>
</div></code></pre>
<p>So, an error appears after much helpful guidance. good enough. obey guidance.</p>
<p>I check <code>mix.exs</code> and see there is no dependency on <code>esbuild</code> or <code>tailwindcss</code>. odd.
Maybe my dependencies are old.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">rm</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">r</span> <span style="color: #e6edf3;">deps</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #e6edf3;">;</span> <span style="color: #d2a8ff;">nd</span> <span style="color: #e6edf3;">mix</span> <span style="color: #e6edf3;">deps.update</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">all</span>
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">rm</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">r</span> <span style="color: #e6edf3;">assets/vendor</span> <span style="color: #e6edf3;">assets/vite.config.mjs</span> <span style="color: #e6edf3;">priv/static</span> <span style="color: #e6edf3;">assets/package.json</span> <span style="color: #e6edf3;">assets/yarn.lock</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #e6edf3;">;</span> <span style="color: #d2a8ff;">nd</span> <span style="color: #e6edf3;">mix</span> <span style="color: #e6edf3;">igniter.install</span> <span style="color: #e6edf3;">phoenix_vite</span>
</div></code></pre>
<p>This final error occurred again,</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">**</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">File.Error</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">could</span> <span style="color: #e6edf3;">not</span> <span style="color: #e6edf3;">remove</span> <span style="color: #e6edf3;">file</span> <span style="color: #a5d6ff;">&quot;assets/vendor/daisyui-theme.js&quot;</span>: no such file or directory
</div></code></pre>
<p>so I added some quirky placeholder-insertions into my command:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">assets/vendor</span> <span style="color: #a5d6ff;">assets/vite.config.mjs</span> <span style="color: #a5d6ff;">priv/static</span> <span style="color: #a5d6ff;">assets/package.json</span> <span style="color: #a5d6ff;">assets/yarn.lock</span> <span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">each</span> <span style="color: #e6edf3;">&lbrace;</span><span style="color: #79c0ff;">|</span><span style="color: #e6edf3;">n</span><span style="color: #79c0ff;">|</span> <span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">rm</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">r</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">n</span> <span style="color: #e6edf3;">&rbrace;</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="2"><span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">assets/vendor/daisyui-theme.js</span>
</div><div class="line" data-line="3"><span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">each</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">mkdir</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span>in <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">dirname</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">;</span> <span style="color: #d2a8ff;">touch</span> <span style="color: #e6edf3;">$</span>in<span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="4"><span style="color: #d2a8ff;">nd</span> <span style="color: #e6edf3;">mix</span> <span style="color: #e6edf3;">igniter.install</span> <span style="color: #e6edf3;">phoenix_vite</span>
</div></code></pre>
<p>This also failed.</p>
<p>Why was I doing all this?</p>
<p>I remembered the reason - I planned to make those code snippets above accordion-able.
This is not worth the hours of dependency upgrades.
I was miserable and pulled in so deep.</p>
<p>One source of my misery here is that I am currently supposed to be in DC;
these computer upgrades have had me pegged to the desk for 24 hours longer than planned,
and there's more hardware issues to address before I go.
I need to pull back out of this unplanned upgrade cycle.</p>
<hr />
<h2>Undue.</h2>
<p>I run <code>c co -b vite</code>, making a branch for my changes.
I run <code>cap</code>, my alias for <code>git add -p</code>.</p>
<p>Anything to do with these dependency upgrades goes into the branch.</p>
<p>I commit, then change back to main. Clean branch.</p>
<p>As I try to rebuild again and reclaim the normal experience,
I see a line inside <code>mix.exs</code> for installing dependencies.
<code>yarn install --production</code>.</p>
<p>I run:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">nd</span> <span style="color: #e6edf3;">yarn</span> <span style="color: #e6edf3;">install</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">cwd</span> <span style="color: #e6edf3;">assets</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">production</span>
</div></code></pre>
<p>Success. Goddamn, one missing option this whole day.</p>
<h2>Resume, deploy.</h2>
<p>So, up and running locally. Yay? Seems like a small consolation.
Now I need to log on to the lab and proxy the code to the domain.</p>
<p>Begin by seeing if I can push the changes, to [gram:op] and [gram:page].</p>
<p>I had some code to help on this, inside [gram:nue/gram.nu] (naming issue?)
though that's basically useless now, obscured through many broken layers.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">c</span> <span style="color: #e6edf3;">r</span> <span style="color: #e6edf3;">set-url</span> <span style="color: #e6edf3;">share</span> <span style="color: #e6edf3;">nixos@76.112.8.171:unshare/page</span>
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">c</span> <span style="color: #e6edf3;">k</span> <span style="color: #e6edf3;">share</span>
</div><div class="line" data-line="3"><span style="color: #d2a8ff;">Enumerating</span> <span style="color: #e6edf3;">objects:</span> <span style="color: #e6edf3;">5,</span> <span style="color: #e6edf3;">done.</span>
</div><div class="line" data-line="4"><span style="color: #d2a8ff;">Counting</span> <span style="color: #e6edf3;">objects:</span> <span style="color: #e6edf3;">100%</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">5/5</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">,</span> done<span style="color: #e6edf3;">.</span>
</div><div class="line" data-line="5"><span style="color: #d2a8ff;">Delta</span> <span style="color: #e6edf3;">compression</span> <span style="color: #e6edf3;">using</span> <span style="color: #e6edf3;">up</span> <span style="color: #e6edf3;">to</span> <span style="color: #79c0ff;">24</span> <span style="color: #e6edf3;">threads</span>
</div><div class="line" data-line="6"><span style="color: #d2a8ff;">Compressing</span> <span style="color: #e6edf3;">objects:</span> <span style="color: #e6edf3;">100%</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">3/3</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">,</span> done<span style="color: #e6edf3;">.</span>
</div><div class="line" data-line="7"><span style="color: #d2a8ff;">Writing</span> <span style="color: #e6edf3;">objects:</span> <span style="color: #e6edf3;">100%</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">3/3</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">,</span> 548 bytes <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">548.00</span> <span style="color: #e6edf3;">KiB/s,</span> <span style="color: #e6edf3;">done.</span>
</div><div class="line" data-line="8"><span style="color: #d2a8ff;">Total</span> <span style="color: #79c0ff;">3</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">delta</span> <span style="color: #79c0ff;">1</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">,</span> reused 0 <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">delta</span> <span style="color: #79c0ff;">0</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">,</span> pack-reused 0 <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">from</span> <span style="color: #79c0ff;">0</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="9"><span style="color: #d2a8ff;">remote</span>: <span style="color: #79c0ff;">error</span>: refusing to update checked out branch: refs/heads/main
</div><div class="line" data-line="10"><span style="color: #d2a8ff;">remote</span>: <span style="color: #79c0ff;">error</span>: By default<span style="color: #e6edf3;">,</span> updating the current branch in a non-bare repository
</div><div class="line" data-line="11"><span style="color: #d2a8ff;">remote</span>: is denied<span style="color: #e6edf3;">,</span> because it will make the index and work tree inconsistent
</div><div class="line" data-line="12">remote: with what you pushed<span style="color: #e6edf3;">,</span> and will require <span style="color: #a5d6ff;">&#39;git reset --hard&#39;</span> to match
</div><div class="line" data-line="13"><span style="color: #d2a8ff;">remote</span>: the work tree to HEAD.
</div><div class="line" data-line="14"><span style="color: #d2a8ff;">remote</span>:
</div><div class="line" data-line="15">remote: You can set the <span style="color: #a5d6ff;">&#39;receive.denyCurrentBranch&#39;</span> configuration variable
</div><div class="line" data-line="16">remote: to <span style="color: #a5d6ff;">&#39;ignore&#39;</span> <span style="color: #79c0ff;">or</span> <span style="color: #a5d6ff;">&#39;warn&#39;</span> <span style="color: #79c0ff;">in</span> <span style="color: #a5d6ff;">the</span> remote repository to allow pushing into
</div><div class="line" data-line="17"><span style="color: #d2a8ff;">remote</span>: its current branch<span style="color: #e6edf3;">;</span> <span style="color: #d2a8ff;">however</span><span style="color: #e6edf3;">,</span> this is not recommended unless you
</div><div class="line" data-line="18"><span style="color: #d2a8ff;">remote</span>: arranged to update its work tree to match what you pushed in some
</div><div class="line" data-line="19"><span style="color: #d2a8ff;">remote</span>: other way.
</div><div class="line" data-line="20"><span style="color: #d2a8ff;">remote</span>:
</div><div class="line" data-line="21"><span style="color: #d2a8ff;">remote</span>: To squelch this message and still keep the default behaviour<span style="color: #e6edf3;">,</span> set
</div><div class="line" data-line="22">remote: &#39;receive.denyCurrentBranch&#39; configuration variable to <span style="color: #a5d6ff;">&#39;refuse&#39;</span>.
</div><div class="line" data-line="23"><span style="color: #d2a8ff;">To</span> <span style="color: #e6edf3;">76.112.8.171:unshare/page</span>
</div><div class="line" data-line="24"> <span style="color: #d2a8ff;">!</span> <span style="color: #e6edf3;">[</span><span style="color: #a5d6ff;">remote</span> <span style="color: #a5d6ff;">rejected</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">main</span> -&gt; main <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">branch</span> <span style="color: #e6edf3;">is</span> <span style="color: #e6edf3;">currently</span> <span style="color: #e6edf3;">checked</span> <span style="color: #e6edf3;">out</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="25">error: failed to push some refs to <span style="color: #a5d6ff;">&#39;76.112.8.171:unshare/page&#39;</span>
</div></code></pre>
        ]]></description>
        <link>https://operand.online/chronicle/Code Log - Rebuild `gram:op`</link>
        <guid isPermaLink="false">2026-05-12.Code Log - Rebuild `gram:op`</guid>
        <pubDate>Tue, 12 May 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Code for America, sums'it up.</title>
        <description><![CDATA[
          
          <hr/>

          <p>I'm in Michigan again,
after being engrossed in the proceedings
of the 2026 Code for America Summit in Chicago.
The main lesson? Where government meets technology,
there is only room for CEOs or politicians to speak up.
The old party, -on'line.</p>
<p>The corollary to this lesson seems to be,
that there is no place to mention
the foreign or domestic humanitarian implications
of the current US federal policies.
No mention of our national commerce in munitions,
or aggression aimed at the ruling bodies of neighboring peoples.
No dialogue to address policies,
only to accomodate their implementation.</p>
<hr />
<p>Here's some background on my relationship with the organization;
copied from my recent cover letter to them in an application from January.</p>
<blockquote>
<p>I remember the long run of Wednesday nights
that I spent at CfA headquarters in SoMa,
before I ever applied to be a fellow,
pushing along on the program at
<a href="%22https://codeforsanfrancisco.netlify.app/%22">Code for San Francisco</a>
(now called <a href="%22https://www.sfcivictech.org/%22">SF Civic Tech</a>).
The next year, as a fellow in Seattle,
we had a chance to speak to <a href="%22https://openseattle.org/%22">Open Seattle</a>.
Years on, I checked in on <a href="%22https://codeforphilly.org/%22">Code for Philly</a>.
They turned me away that night,
because I had forgotten to bring my vaccination card.
Ironically, by then my vaccination card was being signed
by a medical officer in the House of Representatives.</p>
</blockquote>
<blockquote>
<p>Zoom into the middle of that span, though -
and during the pandemic I also honed in
on <a href="%22https://www.youtube.com/@ChiHackNight%22">Chi Hack Night</a>,
and <a href="%22https://www.lansing.codes/%22">Lansing Codes</a>.
This was a challenging moment for all of us,
because the organization where we had found a home
seemed to be closing the doors on its most public forum, the brigades.
<a href="%22https://discourse.codeforamerica.org/t/announcing-the-network-revisioning-project/1058/6?u=c4lliope%22">I had one good idea of what could happen</a>,
though none of us had any idea of all that would.</p>
</blockquote>
<p>More than any other group,
Code for America had seemed like a philosophical approach;
their name appears to command, or demand, the action they seek.
&quot;Code, now! for America!&quot;</p>
<p>Now, rather than being read as an order,
their name displays as a menu, only a single option:
&quot;Code, for America, from Anthropic AI.
Constitution included, deliberation unnecessary.&quot;</p>
<hr />
<p>Code for America announced their recent partnership with Claude;
and I am saddened beyond measure to see the consequences clear as day.</p>
<p>CfA has become a handy vehicle, a ship,
to package and bundle through the procurement issues
for municipal, state, and federal agencies
seeking access to AI products
as a guarantee for early, phased-in retirement.
Now, the AI that Anthropic has been selling is going to be packaged cleanly,
in vibe-coded and tailored-to-size apps for one purpose or another;
from food aid to, someday, automated evictions;
including those conducted at gunpoint, or remotely by missile.</p>
<p>&quot;The strategy is delivery&quot;, after all,
in a nation whose primary product is munitions.</p>
<p>How much is able to be cleanly disposed of,
brushed under the rug of &quot;AI policy&quot;?
How many people shall be disenfranchised
from an education in the nuances of policymaking, and
equally so from learning of the machinery
that is here to replace policymaking?</p>
<p>There had once been room for the audience to draft plans;
now we are asked to calmly take our chairs in the lecture hall.
How many of these people,
barred from taking action to care for their future in a direct manner,
aching from the numbness of shepherding inhuman agents,
discouraged from composing a real decision
when a machine could describe a similar one,
are going to finally be eager for the role-model guidance
they've so far been lacking,
when it lands upon them in the form of a military draft notice?</p>
<hr />
<p>Through the many main-stage discussions, rather than dialogues,
a common theme had been how to &quot;catalyze and scale our impact&quot;;
how some people were still &quot;searching for a magic bullet&quot;;
how to measure the consequences when &quot;an impact lands&quot;.
Nobody seemed to notice that this language is an echo of the explosions,
produced and sold by US companies as clean, slick, packaged missiles,
aimed at people also disenfranchised by their rulers.
Perhaps the &quot;catalyzed reactions&quot; our conference leaders are searching for
happens to be the <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12331754/">white phosphorous</a>
being deployed in Lebanon by Israel, our supposed national ally.</p>
<p>My problem with Code for America has been their lack of public engagement.
Before 2021, the organization had been a hub of discussion through the nation,
because of the local brigades who circulated ideas day in and day out.
When Jennifer Pahlka handed the reigns over,
and the organization decided to abandon their grassroots base,
they became fully closed to ideas from the public.
There seemed to be a cost-benefit decision at play -
the cost of moderating discussion boards full of active engineers
seemed to surpass the benefit of a thousand considerate and concerned coders,
thoroughly embodying the mission of the organization,
engaging in local action in hundreds of municipalities - in and beyond the USA.</p>
<hr />
<p>Sadly, this could be flipped around easily.
Bring an engineer rather than a CEO onto the stage,
and we may be reaching through to the demands and clear direction
that solidarity groups have been promoting for decades, normally unheard:
open access to the means of production.</p>
<p>In this hype cycle, AI is the product;
the means of production is access to the underlying, open-source mechanisms:</p>
<ul>
<li>the vector databases,</li>
<li>the encoding models,</li>
<li>the decoding models,</li>
<li>the tokenization models,</li>
<li>the similarity search engines,</li>
<li>the graph databases for mapping knowledge,</li>
</ul>
<p>the many pieces whose &quot;sum of the parts&quot; is called AI,
though which each in measured additions or absence in a product
form the desired recipe that is called for on one occasion or another.
An example? You can make more humane decisions by handing a case-manager
direct access to a knowledge graph (basically imagine Notion or AirTable),
rather than obscuring the facts of the case
through an encoder (email correspondence -&gt; assumed facts),
and a decoder (recorded facts -&gt; assumed conclusion and irrevocable consequence).</p>
<hr />
<p>The one session I did find some solace in though,
was the discussion of the group collaborating with IRS direct file;
they open-sourced their &quot;fact graph&quot; of dependencies for IRS tax return forms.
For more research and open-source programming along those lines,
see <a href="https://www.policyengine.org/us">PolicyEngine</a>.</p>
<p>I made a small proposal to a colleague in the first breakout room of the conference,
to examine how often we would hear the phrase &quot;AI&quot; compared to &quot;vector database&quot;;
the concluding ratio was as predicted, many-to-zero.</p>
<p>These CEOs charging headlong into the camera lens on stage
know that their product is made of a delicate balance of internal mechanisms,
that a small shuffle from one direction to another, a dialing in of temperature,
can produce the difference between a swell of emergency housing response
and a cascade of evictions when people become a problem.
The logic of resettlement can be run from a single dial:
&quot;Population from 11 to 3, please.&quot;</p>
<p>This experiment has played out before,
during the election cycle for John F Kennedy,
in a corporation called <a href="https://en.wikipedia.org/wiki/Simulmatics_Corporation">Simulmatics</a>.
Simulmatics built a &quot;People Machine&quot; for the 1952 presidential election,
which predicted the electoral consequence of polling inputs.</p>
<p>Our modern &quot;People Machine&quot; goes much deeper than polling numbers -
it has a full model of the language
used to relate and grasp hold of our emotions.
How real can this &quot;People Machine&quot; be when making humane decisions,
and how shell-shocking the consequences when they fail to comprehend
that the've been raised, and hired, in the absence of humanity?</p>
<hr />
<blockquote>
<p>Contasia, Arlene, Amanda;</p>
<p>I'm on the road to DC and then NYC today after Chicago.
I had been either been eager or dreading the summit for months,
and I'm sorry to see how the days played out.</p>
<p>My paranoias played a serious role, of course,
and my physical exhaustion and lack of company.
There seem to be few friends remaining after so many years of changes.</p>
<p>Your organization's productions are emotionally charged for me,
especially once again seeing old partners-in-crim(inal justice)
amplifying messages that seem designed to keep people in their proper camp.</p>
<p>I hope this opens discussion,
and I hope to begin helping those left behind.
<a href="https://operand.online/chronicle/cfa.2026">https://operand.online/chronicle/cfa.2026</a></p>
<p>To begin a dialogue, if you choose to respond,
I'd ask how government is &quot;for the people, by the people&quot; -
if the only programming skills on the menu
are &quot;Discrete Logic 211&quot; fact-graphs,
and the user manual collection for Anthropic products?</p>
<p>I'm glad to see your user researhers are reaching new depths in the Grand Canyon,
though for us subscribed to the Baltimore PD's media relations list,
the daily shooting briefings imply we cannot do so much to  keep our heads down.</p>
<p>If your purpose is to ensure policies are delivered as ordered,
please consider how damnable those orders can be.</p>
<p>(Once again,)<br />
Peace,<br />
Calliope Y</p>
<p>in Proton Mail,  confer@operand.online<br />
in Signal,       <code>c4lliope.**</code><br />
in secure,       <code>202-***-****</code></p>
</blockquote>
        ]]></description>
        <link>https://operand.online/chronicle/Code for America, sums'it up.</link>
        <guid isPermaLink="false">2026-05-10.Code for America, sums'it up.</guid>
        <pubDate>Sun, 10 May 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>[hope-26][speaker] Open-Source Legal Research</title>
        <description><![CDATA[
          
          <hr/>

          <p>Legal research in the USA is fully dependent on two products;
Lexis Nexis and WestLaw - these both use incredible fees
to keep out small business and independent researchers,
in essence producing a scarcity
of the most crucial resource in any democracy:
a basic comprehension of the legal rules of the game.
Layers of academia and law have been designed
to guard access to these resources,
and in recent years we are all feeling the consequences -
money alone buys access to the rulebook.</p>
<p>These companies build their program fully on public records,
sourcing from the <a href="https://congress.gov">Library of Congress</a>, <a href="https://govinfo.gov">GovInfo</a>,
the <a href="https://ecfr.gov">Code of Federal Regulations</a>,
and Harvard's more recent <a href="https://case.law">CaseLaw Access Project</a>.
These public records are the original framing of open-source;
the public needs to access and learn from these same sources
to either comply, or to change the rules that bind us.</p>
<p>See how simple web scrapers and advanced databases combine into
an open-source replacement for the legal gridlock we're used to,
and learn how to connect directly behind the scenes at Congress
to the people publishing these records each day.
This HOPE talk marks the release of a new public legal search engine -
open source from the homelab hardware to the public records request.</p>
<hr />
<h3>Speaker Bio: Calliope Youngblood</h3>
<p>Calliope has learned from a decade of experience
including <a href="https://thoughtbot.com">SF startups</a>,
<a href="https://codeforamerica.org">national nonprofits</a>,
<a href="https://seattle.gov/police">city governments</a>,
and the office of <a href="https://clerk.house.gov">Clerk of the House of Representatives</a>.</p>
<p>They were hired to the Clerk's office
based on a prototype of this talk's app,
made five years ago during a more sane administration.
Since being fired by the Clerk for &quot;too many prototypes&quot; in 2023,
Calliope has focused on running apps from home -
using NixOS, NuShell, Elixir, and Rust.
Each of these play a role in this open-source research program.</p>
<p>In 2026, Calliope is conference-hopping
in a camper van as a cyber nomad,
exploring hacker spaces and feeding open-mic musicians.</p>
<hr />
<h3>Appendix (the problem is real!)</h3>
<blockquote>
<p>&quot;Search charges range from $0 to $469.&quot;</p>
<ul>
<li>LexisNexis <a href="https://www.lexisnexis.com/en-us/terms/21/pricing.page">&quot;Law Firm Per Search Pricing&quot;</a></li>
</ul>
<p>Basic pricing reference for one user:</p>
<ul>
<li><a href="https://store.lexisnexis.com/lawfirms">Lexis Nexis</a> ($150/mo)</li>
<li><a href="https://sales.legalsolutions.thomsonreuters.com/en-us/products/westlaw-advantage/plans-pricing">WestLaw</a> ($1210/mo)</li>
</ul>
</blockquote>
        ]]></description>
        <link>https://operand.online/chronicle/[hope-26][speaker] Open-Source Legal Research</link>
        <guid isPermaLink="false">2026-04-30.[hope-26][speaker] Open-Source Legal Research</guid>
        <pubDate>Thu, 30 Apr 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Khepri</title>
        <description><![CDATA[
          
          <hr/>

          <p>( ideas licensed public domain / product of https://operand.online )</p>
<p>@kura - splendid issue to raise;
this is the main reason I'm focusing on the <code>import_export</code> module before I find my app in a bind.</p>
<p>My search for a db began from a blog post by fjall:
https://fjall-rs.github.io/post/recreating-webtable
The fjall blog made me see the mechanisms of LSM trees more clearly,
and this page specifically emphasized how practical they can be for page indexing.</p>
<p>I feel like a small package in Rustler could be able to locate a fjall db on disc,
and use a query to load a subset into a khepri db.
Elixir could use the shared khepri store to coordinate across nodes.</p>
<p>Perhaps khepri should be used only for &quot;receipts&quot;  of scraped pages -</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">@example.com/addr/@cache -&gt; @example.com/addr/@2026-04-15_12-59-59
</div><div class="line" data-line="2">@example.com/addr/@2026-04-15_12-59-59.hash -&gt; &lt;hash&gt;
</div><div class="line" data-line="3">@example.com/addr/@2026-04-15_12-59-59.api_key -&gt; &lt;key&gt;
</div><div class="line" data-line="4">@example.com/addr/@2026-04-15_12-59-59.module -&gt; Scraper.ExampleCom
</div></code></pre>
<p>So, how to bring the scraped pages from the nodes, back into fjall?
seems like this could easily be RabbitMQ / Broadway / plain old Elixir.</p>
<p>The full process is</p>
<ol start="0">
<li>spin up cpu-node and connect to disc-node.</li>
<li>cpu-node queries for a record to process.</li>
<li>disc-node loads record receipts -&gt; fjall (in rustler) -&gt; khepri.</li>
<li>cpu-node checks receipts, enriches original record.</li>
<li>rabbitmq sends enriched fields back to disc-node.</li>
<li>disc-node pushes records &amp; receipts to fjall.</li>
</ol>
<p>In 1. and 3., the same query could be used to decide if the enriched keys are added to kehpri;
this is an optimistic-update that khepri can use to keep nodes coordinated.
for example, links between pages and their associated keywords &amp; addresses.
this could mean other nodes in the cluster could do downstream processing based on keywords like &quot;github&quot;.</p>
<p>This general approach means that many small khepri clusters <em>should</em> be able to sync off of the same fjall db,
where each khepri cluster is using a group of queries designed for that cluster's unique purpose.
This semantic-partitioning seems like it could keep memory use small even for complex domains.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Khepri</link>
        <guid isPermaLink="false">2026-04-15.Khepri</guid>
        <pubDate>Wed, 15 Apr 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>How Broken. (?)</title>
        <description><![CDATA[
          
          <hr/>

          <p>I've been coding since my first year of high school, in 2005.
No day in any of those 20 years has been spent on vibe-coding.</p>
<p>I imagine this solid run of legacy coding practice is going to end soon,
because I do see the use of using LLMs for learning a new language,
and I have a clear idea of my needs as I approach Rust.
I'm on pace to make it through the Rustlings course this weekend,
and the language has nice guard rails;
I'm confident that I can guide the language model in proper directions.</p>
<p>Though there has been no vibe coding,
there has probably been too much &quot;crucial rush&quot; coding.
Readers realize I am <a href="/chronicle/learn.2026">eager to speak
about my homelessness and nomadism</a>,
and these scenarios mean paring down
the energy I spend on my cyber practice.
<a href="/chronicle/lab.propose">Looking ahead</a> now that I am in a proper camper home,
I am making too many promises to be so lacksidasical any more.</p>
<hr />
<p>I've recently circled back up with colleagues at <a href="https://opengovhub.org">Open Gov Hub</a>,
where I made my third or fourth round of promises
to put <a href="https://case.law">case.law</a> to use.</p>
<p>During the <a href="https://www.house.gov/Hackathon">Congressional Hackathon</a> --
with only a small break to heckle and curse
Michael Johnson as he hoarded the stage and microphone
to announce the House's succumbing to Microsoft's AI expansion --
I produced a scraper for the case law documents,
and began to pull the corpus.</p>
<p>That scraper was made in [NuShell] and had been called <code>domain.nu</code>;
later on I pulled the logic into <a href="/gram/nue/index.nu">index.nu</a>,
to add logic for processing documents
from the <a href="https://www.justice.gov/epstein">DoJ's Epstein document releases</a>.
I acquired documents from the original dump,
breaking the <a href="https://case.law">case.law</a> parser in the process,
and made no progress in processing either record corpus
in the ensuing weeks, wherein I was finding shelter from blizzards
and shuffling broken cars around (as legally as possible)
in three states.</p>
<p>So I've long been burdened
by barely-good-enough processes
that are simply holding me back.</p>
<hr />
<p>The final mishap came last weekend,
after I had spent four days in Baltimore during the blizzard,
learning the basics of solar camping under layers of ice,
and running to the camper for 15 minute spells
before my fingers began to ache.
I had a good many hours in the Baltimore Node,
where I definitely kept from closing my eyes for too long
on the new comfy couch.
I also lost a good many hours of sleep in the process,
and am realizing that recovery from sleep debt
carries symptoms much like depression.</p>
<p>All the same, I finally packed up from Baltimore on Friday,
and headed to George Mason University
to join into the <a href="https://globalgamejam.org/">Global Game Jam</a>.
I had big ideas on Friday night about how to approach the theme, &quot;Mask&quot;.
As soon as I logged on, Saturday morning,
I checked and could see that my domain failed to respond.</p>
<p>No one shall ever be able to say for sure
if this is a case of corporate espionage or sabotage,
because the small miniPC that I had been running my domain on
from the minimal security on-premise shelf at <a href="https://baltimorenode.org">Baltimore Node</a>
had once again had the power strip kicked or nudged or plucked.
This seems to have happened on three occasions,
always when I leave Baltimore after a long coding session.
When I finally end up where I need to be,
I find that the computer has gone offline,
and I need to come to grips with my lack of a recovery option.</p>
<p>So, I've long been ready to upgrade.</p>
<hr />
<p>Here's a quick summary of the problems and security lapses
I can recall in this moment.</p>
<ul>
<li>[ ] crucial <code>.nu</code> code has no specs or test harness.</li>
<li>[ ] the <a href="/gram/op">elixir app</a> has no specs or tests.</li>
<li>[ ] the <a href="/gram/op">elixir app</a> has no solid road map.</li>
<li>[ ] the <a href="/gram/pool">MicroVM deployments</a> can only handle a couple of hand-spun apps.</li>
<li>[ ] the <a href="/gram/guide">Resource Guide</a> has broken and is basically disengaged.</li>
<li>[ ] I am the only user; maybe I need to <a href="https://gaiwan.co/blog/announcing-oak-1-0/">examine open-source auth</a></li>
<li>[ ] <a href="https://github.com/svenstaro/miniserve">miniserve</a> has likely had no security appraisal.</li>
<li>[ ] my main coding machine had passcode-based SSH access enabled for 1-2 months.</li>
<li>[ ] I did nothing to sign my git commits.</li>
</ul>
<hr />
<p>There's more to say, tho I became distracted by making the diagram
at the beginning of the page.</p>
<p>All of these problems began making me anxious,
so I had to think ahead.
Sorry if you read through all of this,
some days simply is nice to spill your mind.</p>
<p>I do think that diagram's going to help tho,
I'll see how much of that I can make use of next week.</p>
        ]]></description>
        <link>https://operand.online/chronicle/How Broken. (?)</link>
        <guid isPermaLink="false">2026-02-06.How Broken. (?)</guid>
        <pubDate>Fri, 06 Feb 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Domain "Static Site Generation"</title>
        <description><![CDATA[
          
          <hr/>

          <p>“Static Site Generation” is the process of rendering html from a codebase, where you can describe the pages succinctly using humane markup languages like <a href="https://www.markdownguide.org/">Markdown</a>. They are more secure than Wordpress or other dynamically-rendered content management systems, because any changes require access to the source code - in our case, permissions in <a href="https://github.com/baltimorenode">the GitHub org</a>. This thread is a place to explore libraries and themes.</p>
<p>Before the library dump, I should include that we could do interactive elements through <code>iframes</code>, including the popular <a href="https://giscus.app/">giscus</a> and <a href="https://utteranc.es/">utterances</a>. These need nearly no management and can be easily moderated through GitHub issues; basically making our GitHub codebase a public discussion running parallel to this forum.</p>
<h2>So, choices.</h2>
<p><a href="https://getzola.org">Zola</a> builds domains using Rust. Some of these themes are more for blogging, but I think you may like some.</p>
<ul>
<li><a href="https://www.getzola.org/themes/serene/">serene</a></li>
<li><a href="https://www.getzola.org/themes/zola-theme-nivis/">zola-theme-nivis</a></li>
<li><a href="https://www.getzola.org/themes/tanuki/">tanuki</a></li>
<li><a href="https://www.getzola.org/themes/terminus/">terminus</a></li>
<li><a href="https://www.getzola.org/themes/zap/">zap</a></li>
<li><a href="https://www.getzola.org/themes/apollo/">apollo</a></li>
<li><a href="https://www.getzola.org/themes/boring/">boring</a></li>
<li><a href="https://www.getzola.org/themes/pico/">pico</a></li>
<li><a href="https://www.getzola.org/themes/papermod/">papermod</a></li>
<li><a href="https://www.getzola.org/themes/zola-theme-terminimal/">zola-theme-terminimal</a></li>
<li><a href="https://www.getzola.org/themes/juice/">juice</a></li>
<li><a href="https://www.getzola.org/themes/shadharon/">shadharon</a></li>
<li><a href="https://www.getzola.org/themes/papaya/">papaya</a></li>
<li><a href="https://www.getzola.org/themes/zola-386/">zola-386</a></li>
</ul>
<p><a href="http://gohugo.io/">Hugo</a> is an option using Go (of course) (<a href="https://themes.gohugo.io/">Themes</a>)</p>
<ul>
<li><a href="https://rooms.netlify.app/">Newsroom</a> has a nice look</li>
</ul>
<p><a href="https://lume.land/">Lume</a> is popping up in the <a href="https://deno.land">Deno land</a>. (<a href="https://lume.land/themes/">Themes</a>)</p>
<p><a href="https://docusaurus.io/">Docusaurus</a> is based on simple and approachable ideas, designed for readable guides.</p>
<p><a href="https://www.gatsbyjs.com/">Gatsby</a> is Javascript &amp; React. Discouraged, because things seem up in the air during an acquisition.</p>
<p><a href="https://nextjs.org/">NextJS</a> is popular, had a full hype cycle.</p>
<p><a href="https://quartz.jzhao.xyz/">Quartz</a> is like a knowledge base similar to Obsidian, but public on the web. Could be plugged on top of a wiki or some such arrangement.</p>
<p><a href="https://quarto.org/">Quarto</a> is more for data dashboards, probably beyond scope. Same for <a href="https://observablehq.com/framework/">Framework</a>.</p>
<h2>Deploys</h2>
<p>GitHub can handle all of the publishing for us using GitHub actions; this takes less than an hour to set up, and then you never have to think of it again. If you do have to make changes, it’s easy to find people who have used it or can pick it up quickly.</p>
<p><a href="https://deno.com/deploy">Deno Deploy</a> is a new option that is based on similar principles, and is designed for Lume or Fresh (below). I helped a friend deploy here once, and the process had been easy as can be. Requires a credit card on file for antispam purposes; their free plan is the most generous I’ve seen. They also support dynamic-rendered apps, which brings us to…</p>
<h2>Bonus: Dynamic Rendering</h2>
<p>I’m already dumping links, so here are directions to look if we outgrow SSG.</p>
<ul>
<li><a href="https://js.wiki/">WikiJS</a> is a fully managed wiki with a one-line deploy. I’d recommend upgrading our wiki to this soon. Has serious benefits for content management.</li>
<li><a href="https://data-star.dev/">DataStar</a></li>
<li><a href="https://htmx.org/">HTMX</a></li>
<li><a href="https://fresh.deno.dev/">Deno Fresh</a></li>
<li><a href="https://astro.build/">Astro</a></li>
</ul>
        ]]></description>
        <link>https://operand.online/chronicle/Domain "Static Site Generation"</link>
        <guid isPermaLink="false">2026-01-28.Domain "Static Site Generation"</guid>
        <pubDate>Wed, 28 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Pardon Our Mess!</title>
        <description><![CDATA[
          
          <hr/>

          <h2>0. Sidebar:</h2>
<p>As you may see, <code>a rogue sidebar appeared!</code></p>
<p>See <a href="https://elixirforum.com/t/gradually-upgrading-phoenix-nex-using-pluggable-routes/74007">dialogues concerning <code>Nex</code></a>;
a minimal Elixir package
seemingly able to speed up our production process.
Many of these plans are going to be made
using new approaches based on <code>Nex</code>.</p>
<!-- [nex]: /dialog?q=nex -->
<p>Now, here are the planned modules to be added,
already marked by sidebar placeholders.</p>
<h2>1. <a href="/">chronicle</a></h2>
<p>The main experience you already recognize.
Much of the logic behind these essay pages
is included in the <a href="/gram/op/lib/source/page.ex">Source.Page</a> module,
which makes it simple to pull into Nex someday.</p>
<p>That said, there is no hurry to do so.
I'm going to bypass this migration,
until Nex is already up and running
for some of the pending pages.</p>
<p>One odd coincidence that I learned today
is the similarity between my approach,
and something from Ruby called <a href="https://postwave.blog">Postwave</a>;
both approaches read the file
using a preconfigured package,
and the application logic has full reign
to reshape the source as needed before the page render.</p>
<p>Since <a href="https://postwave.blog">Postwave</a> seems to be a success,
perhaps you'll see our approach packaged into a hex dependency,
so others in the Elixir space can make equal use.</p>
<h2>2. <a href="/dialog">dialog</a> <code>[pend]</code></h2>
<p>Look here, we already needed a link to another domain
so you could read up on our plans to use Nex!</p>
<p>I'd like to be able to discuss things openly
on forums across the web,
with no concerns for &quot;syndicating&quot;
(linking, or copy-pasting) to this domain.</p>
<p>Luckily, many of my discussions happen on <a href="https://discourse.org">Discourse</a>,
and there is a <a href="https://docs.discourse.org/#tag/Users/operation/listUserActions">premade channel</a>
for subscribing to my actions.
Similarly for GitHub issues;
I can use the <a href="https://docs.github.com/en/graphql">GraphQL</a> scheme to
<a href="https://operand.online/gram/op/.iex.exs">query the precise records needed</a>.</p>
<h2>3. <a href="/org">org mode</a> &amp; 4. <a href="/people">people</a> <code>[pend]</code></h2>
<p>You should realize I do research;
I go more broad than deep, like so.</p>
<p><a href="https://share.operand.online/gram/page/media/2026-01-21.paper.jpg"><img src="https://share.operand.online/gram/page/media/2026-01-21.paper.jpg" alt="paper" /></a></p>
<p>I have [some grand aims] for linking ideas across cyberspace
into a large graph database using Rust and the <a href="https://opencypher.org">Cypher</a> query language.
Perhaps I'm only eager to appear someday on Andy Pavlo's annual <a href="https://www.cs.cmu.edu/~pavlo/blog/2026/01/2025-databases-retrospective.html">db roundup</a>.</p>
<p>I'm going to begin some much scrappier approaches,
using <code>.yml</code> and <a href="https://hexdocs.pm/cachex/overview.html">cachex</a>,
to produce an explorable index of organizations and people
similar to <a href="https://www.splcenter.org/resources/extremist-files/">SPLC's extremist index</a>,
only for cyberspace!</p>
<p>In <a href="/gram/nue">gram:nue</a>, <a href="https://operand.online/gram/nue/page.nu"><code>page dump</code></a> is a simple, reliable command
designed to produce a <code>.yml</code> backup of all pages open in my browser.
I'd like to begin depending on this as a daily source of leads,
each of which are then processed through a series of scrapers and mungers.</p>
<p>There's many directions to explore here,
so as soon as those addresses are cached inside the app,
I'll begin displaying them and discussing how to enrich the resources.</p>
<h2>5. <a href="/gloss">gloss</a> <code>[pend]</code></h2>
<p>Look up in #2 -
I had to describe the process of &quot;syndication&quot;,
which makes sense to you already
if you do journalism or production,
and perhaps is a new idea
if you are a casual online denizen.</p>
<p>I see many examples where jargon holds up discussion,
and I'd like to fully re-organize how jargon is used;
imagine a pop-up mechanically similar to <a href="https://ncase.me/nutshell/">nutshell</a>.</p>
<p>A primary aim is that using jargon
should do nothing to hold up the essay process;
I should be able to simply mark a phrase as gloss-arizable,
and then upon publishing,
see a queue of phrases that need description.
This process is inspired by numerous examples
of language-translations for apps.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Pardon Our Mess!</link>
        <guid isPermaLink="false">2026-01-26.Pardon Our Mess!</guid>
        <pubDate>Mon, 26 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Data Brokerage is Insecure</title>
        <description><![CDATA[
          
          <hr/>

          <p>Please bookmark <a href="https://tosdr.org/en">ToS;DR</a>.
This is one of your main search engines this year.</p>
<p>Specifically,
you are looking for rules in the theme of &quot;data brokerage&quot;;
rules such as:</p>
<ul>
<li><a href="https://tosdr.org/en/service/190">Amazon</a>'s &quot;Voice data is collected and shared with third-parties&quot;,</li>
<li><a href="https://tosdr.org/en/service/182">Facebook</a>'s &quot;Deleted content is not really deleted&quot;,</li>
<li><a href="https://tosdr.org/en/service/158">Apple</a>'s &quot;Your personal data may be disclosed to comply with government requests without notice to you&quot;,</li>
<li><a href="https://tosdr.org/en/service/194">Reddit</a>'s &quot;Tracking via third-party cookies for other purposes without your consent.&quot;,</li>
<li><a href="https://tosdr.org/en/service/274">YouTube</a>'s &quot;This service can view your browser history&quot;,</li>
<li><a href="https://tosdr.org/en/service/314">Quora</a>'s &quot;They store data on you even if you did not interact with the service&quot;,</li>
<li><a href="https://tosdr.org/en/service/230">PayPal</a>'s &quot;This service still tracks you even if you opted out from tracking&quot;</li>
</ul>
<p>These are only chosen from the homepage!
You're responsible for searching the apps you use.
Ignorance may be a popular excuse,
but when apps sell your data,
<a href="https://www.404media.co/inside-ices-tool-to-monitor-phones-in-entire-neighborhoods/">these are the buyers</a>.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Data Brokerage is Insecure</link>
        <guid isPermaLink="false">2026-01-22.Data Brokerage is Insecure</guid>
        <pubDate>Thu, 22 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Crucial Browser Plugins</title>
        <description><![CDATA[
          
          <hr/>

          <p>To begin, I use <a href="https://brave.com/">Brave</a>.</p>
<p><a href="https://brave.com/">Brave</a> is more secure than normal;
imagine Chrome with a bunch of the Google ripped out.
This means any Google plugin runs in Brave.</p>
<p>Also, Firefox copied the plugins from Chrome,
so you can probably find the same plugins in their web stores.</p>
<p>You may see plugins called &quot;extensions&quot;; that's a hairy issue.</p>
<p>Here are the plugins I use daily.</p>
<ul>
<li>
<p><a href="https://ublockorigin.com/">uBlock Origin</a></p>
<p>Blocks so many ads that some days I forget that most people still have ads. Also keeps me from clicking through on some clickbait.</p>
</li>
<li>
<p><a href="https://chromewebstore.google.com/detail/terms-of-service-didn%E2%80%99t-r/hjdoplcnndgiblooccencgcggcoihigg">ToS;DR</a></p>
<p>If you pin this to the menu bar, you'll see an A -&gt; F letter grade for each domain. Click to read the main concerns before signing up, or flushing your cookies and running.</p>
</li>
<li>
<p><a href="https://chromewebstore.google.com/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb">Vimium</a> (<a href="https://github.com/philc/vimium">source</a>)</p>
<p>Move around and through pages using your keyboard alone.
The mouse-to-keyboard loop is gradually breaking your mobility,
so load this up and press <code>?</code> on any page to see your new commands.</p>
</li>
<li>
<p><a href="https://chromewebstore.google.com/detail/proton-pass-free-password/ghmbeldphafepmbegfdlkpapadhbakde?hl=en">Proton Pass</a> (<a href="https://proton.me/pass">sign up!</a>)</p>
<p>You need a password manager that has encrypted sync,
and your browser's built-in one is a cheap replica.
As you use Proton Pass you'll be pleased to see
the pop-ups for &quot;passkeys&quot;, which enable one-click, no-pass logins.</p>
</li>
<li>
<p><a href="https://omar.website/tabfs/">TabFS</a></p>
<p>For the real hackers in the audience,
because this plugin requires moving some config files around.
When you're done though, you'll see a local file share
that mirrors the open tabs in your browser.
This plugin encouraged me to change from Firefox -&gt; Brave,
because independent plugin management is simpler in Chromium.
Omar's one-page explanation is superb.</p>
</li>
</ul>
        ]]></description>
        <link>https://operand.online/chronicle/Crucial Browser Plugins</link>
        <guid isPermaLink="false">2026-01-22.Crucial Browser Plugins</guid>
        <pubDate>Thu, 22 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>I'll pass on your zoom call.</title>
        <description><![CDATA[
          
          <hr/>

          <p>In 2026, there are some amazing programs
being made by genius coders,
who are happy to hand out their code for free
so that people can be sure of their security.</p>
<p>One such program is <a href="https://jitsi.org">Jitsi</a> -
their biggest offense in my book is their name,
which is hard to say is or is not really offensive.</p>
<p>This group of coders made all good decisions.
One, they open-sourced their code
so that people can be sure of their security.</p>
<p>Using the in-browser model
familiar to anyone who has used Google Meet,
you can be sure that you are able to manage the permissions
that the app is asking for from your machine;
microphone, sure! camera, maybe another day. files, hell no!
Because you already are using a browser now,
you know you can be on any call in a couple quick clicks.</p>
<p>People say Zoom is secure, but nobody knows this!
Any app that claims to be end-to-end encrypted
needs to share their code if they aim for their claim to be credible.
In 2025, the rulebook changed in many crucial places;
if we are unable to rely on our health insurance companies
to keep our records secure,
who seriously imagines that unimaginably young,
unimaginably rich coders are going to handle the vault keys properly?</p>
<p>...and, they don't even claim to!
Reading through their policies,
you only have to go a few paragraphs before you see
that they group their users into two camps;
their super-special paying organizations,
which have the threat of legal action on their side,
and the large mass of casual users,
who share reunions, medical discussions,
holiday celebrations, and phone sex.</p>
<p>Coders are creeps!</p>
<p>Yes, I am also a creep. Of course I am! I code online!
And I know precisely how much I could access if I cared to look.
The difference is that I'm a smidge more scientific,
much more self-obsessed,
and uphold a really unique philosophy
around commercial success.</p>
<p>To me, success in 2026 is being able to keep a goddamn secret!
Is being able to choose which business you share,
and which you share with specific people!</p>
<p>So, I'm going to pass on your creepy-ass Zoom calls!
If there's one that I really need to be on,
I'm going to spin up a VM on my computer
so that it has no idea of the other files laying around,
such as my <code>~/passcodes.csv</code>.
If you are such a negligent bullhead as to get me onto your call,
you'll be unable to see me because my VM cannot access my camera!
By design! Same for my microphone,
so I'll plug in a USB mic if I really need to speak up.
More likely than not though, I'm exhausted by now.
I'll spend the full duration of the call eeking a small echo of pleasure
from the continuation of this rambling alarm,
for your sheepish audience to rub their enablist shame in.</p>
<p>And if we're really lucky,
we'll still have something to talk about by the end,
so I'll follow along to your marginally-less harmful
Slack or Discord channels, where I'll keep.
name. dropping. <a href="https://jitsi.org">Jitsi</a>.</p>
<p>Please remember that our holier-than-health Zoom
took the world by storm in the middle of a panicked response
to an airborne toxic event!</p>
<p>No one read the conditions back then,
and those conditions have changed
on numerous occasions - each - year - since then.</p>
<p><a href="https://tosdr.org/en/service/2198">Here's where those conditions are now, according to ToS;DR.</a>
There are so many angry red data horrors
that the following green &quot;You maintain ownership of your data&quot;
is seriously the most disrespectful sentence I have ever come across.
That's so goddamnfuckingbumasshurt meaningless!</p>
<p>Here's some big ones:</p>
<ul>
<li>This service may collect, use, and share location data</li>
<li>This service gives your personal data to third parties involved in its operation</li>
<li>This service may keep personal data after a request for erasure for business interests or legal obligations</li>
<li>The service may sell your data unless you opt out</li>
<li>This service forces users into binding arbitration in the case of disputes</li>
<li>The service may use tracking pixels, web beacons, browser fingerprinting, and/or device fingerprinting on users.</li>
<li>This service gathers information about you through third parties</li>
<li>You waive your right to a class action.</li>
<li>Your personal data may be used for marketing purposes</li>
<li>Instead of asking directly, this Service will assume your consent merely from your usage.</li>
<li>The service uses your personal data to employ targeted third-party advertising</li>
<li>This service gives your personal data to third parties involved in its operation</li>
<li>Your data may be processed and stored anywhere in the world</li>
<li>Any liability on behalf of the service is only limited to the fees you paid as a user</li>
</ul>
<p>Many of the &quot;green thumbs&quot; are meaningless when combined alongside the red alarms.
Compare:</p>
<ul>
<li>You can request access, correction and/or deletion of your data</li>
<li>This service may keep personal data after a request for erasure for business interests or legal obligations</li>
</ul>
<p>If you really need to see me so exposed,
find me at <a href="https://the-crucible.com/">the local sex club</a>.
If you need me on board for your cause,
<a href="https://jitsi.org">begin securing your business</a>.</p>
<p>Goddamn.</p>
        ]]></description>
        <link>https://operand.online/chronicle/I'll pass on your zoom call.</link>
        <guid isPermaLink="false">2026-01-21.I'll pass on your zoom call.</guid>
        <pubDate>Wed, 21 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Learning Aims in 2026</title>
        <description><![CDATA[
          
          <hr/>

          <h2>2023</h2>
<h3>Loose Ends</h3>
<p>In Jan 2023, my role at the House of Reps Clerk's office ended.
I had been calling for in-house program design
and building many experimental programs,
some of which are being used today,
and all of which I found far more engaging than the assignments.</p>
<p>On the side, I had a hodgepodge of apps running,
so I could explore new languages and approaches.
I had a far-too-broad aim of building a search index for legal sources.</p>
<h3>Fresh Leads</h3>
<p>During that summer I reconnected, briefly,
with <a href="http://joannecheng.me">a former colleage</a> in nearby Richmond.
She explained the ideas behind <a href="https://elixir-lang.org">Elixir</a>,
and this seemed like a good change of pace from Ruby + JavaScript.
I began gradually rebuilding my core apps from Ruby to Elixir,
and shared the ideas at a &quot;Pitch Labs&quot; group for local independent businesses.</p>
<p>I engaged with <a href="https://hacdc.org">the local hackerspace</a>,
where I had become secretary.
I spent many days speaking with one of the members,
a gamer who had more home-lab experience,
who talked me off of my raspberry-pi bundle
and onto a real [ProxMox] deployment.
I quickly used the VM management therein,
to deploy many programs I designed and produced, alongside:</p>
<ul>
<li><a href="https://proxmox.com">ProxMox</a></li>
<li><a href="https://mailu.io">Mailu</a></li>
<li><a href="https://gitea.com">Gitea</a></li>
<li><a href="https://penpot.app">Penpot</a></li>
<li><a href="https://www.passbolt.com">Passbolt</a></li>
<li><a href="https://livebook.dev">Livebook</a></li>
<li><a href="https://js.wiki">Wiki.js</a></li>
</ul>
<h3>Side Missions</h3>
<p>HacDC had been abuzz that year -
we had a spinoff group called <a href="https://huggingface.co/hyperdemocracy">hyperdemocracy</a>
inspired by the earlier <code>assembled</code> app I had produced.
The Hyperdemocracy bunch ran an 8-hour public-library hackathon,
where around a dozen coders learned to use LLMs on federal legislation.</p>
<p>Other HacDC members had been explaining <a href="https://nixos.org">NixOS</a>,
and it took me until October to pick up the charge and make the change.
<a href="https://github.com/NixOS/nixpkgs/pull/268348">I managed to change the <code>nixpkgs</code> recipe for Elixir</a>,
before the <code>23.11</code> release window - my first month!
This change helped me compile Elixir as a mobile app on Android,
in a proof-of-concept app that for a global hackathon.</p>
<p>That same fall, I had my first (and only) Elixir commission.
I charged next-to-nothing, if you know the industry rates,
because my friend needed the app and I needed the practice.
All along, I had been checking off my learning aims for the year.</p>
<h2>2024</h2>
<h3>Long Haul</h3>
<p>The one remaining language I had aimed
to learn in 2023 had been <a href="https://nushell.sh">Nushell</a>.
I began picking this up in January 2024.</p>
<p>I found the experience far nicer
than onboarding to any other command line,
although I really could have used more guidance
in the form of screencasts;
I really like the small episodes of <a href="http://railscasts.com">railscasts</a> and <a href="https://elixircasts.io">elixircasts</a>,
and I feel that now I'm finally in a place to begin producing these.</p>
<h3>Spiraling</h3>
<p>I also began that year by filing for a business, Operand Company.
Looking back, I had no business running a business.
When I heard back about the incorporation in April,
my first week became a hellish sequence of slip-ups.</p>
<ul>
<li>PayPal dropped my business and perma-banned me
for concerns of money laundering.</li>
<li>I failed to pay, and therefore failed to hire,
a collaborator who had agreed to help.
(...after 18 months of mutual silence,
we came back to discuss the problems on Discord DMs)</li>
</ul>
<p>I quickly decided, or realized, that I had to produce alone,
because by then my money was basically up.
I took my deceased grandpa's old pickup from my parents,
readied up my emergency housing plan - a sailboat,
and moved my home-lab to my parents' place of business in Michigan.</p>
<h3>Gale</h3>
<p>I had a couple weeks on the Chesapeake bay,
examining how to handle the quirks of seaborne domesticity.
Whereas 2023 had been full of cyber exploration,
2024 had been a harsh and deeply physical experience.</p>
<p>By that winter, I would commute most nights
back to the marina in Deale, MD.
The drive was around an hour
and by the time I parked,
the car was much warmer than the surroundings
and the radio lulled me to sleep.
In the early hours of the morning,
the cold would rouse me,
long enough to charge down the frigid dock
into the hold of the boat,
where I turned on the electric heater,
burrowed in blankets,
and on a couple occasions had to scream myself to sleep;
shivers did no good.</p>
<h2>2025</h2>
<h3>Cadence</h3>
<p>As the winter thawed, I came to my senses.
I had been making poor spending decisions,
and my money was up.</p>
<p>I had been depending on chemical consumption,
and as nomadic as I was,
a couple collisions raised the price
of my car and insurance beyond reach.</p>
<p>Even with monthly help from my parents,
Most months ended with no budge in my
$10k in credit card debt,
and I could only access $10 - $100.</p>
<p>Renewed aggression between my parents and I
caused me to re-think keeping my machines at their place.
In March, I plugged in at a friend's home and carried on.</p>
<h3>Rebuild</h3>
<p>I rigged up my pickup truck as a camper,
and began exploring more places from where I could log on.
From NYC to Baltimore, I checked in on hackerspaces.
I spent 4 days in Brooklyn, and spent $0 -
though on the final day I met a friend
and purchased a $4 coffee before heading home.</p>
<p>At <a href="https://www.nycresistor.com">NYC Resistor</a>, I heard people speaking of <a href="http://hope.net">HOPE</a>.
At <a href="http://opengovhub.org">Open Gov Hub</a>, I heard of the <a href="https://events.linuxfoundation.org/open-source-summit-north-america">Open Source Summit</a>;
I applied and acquired a scholarship pass.</p>
<p>I reached Brooklyn for HOPE and Denver for the Summit;
In Denver I connected to leaders in <a href="https://chaoss.community">CHAOSS</a>.
I headed home, and after long weeks on the road,
crashed a marina birthday party;
I soon had a message from management,
who had cameras recording
as I hopped the fence around the swimming pool.
They asked me to ship off, in ten days.</p>
<p>I spent seven of those days at <a href="https://www.usaikifed.com/summer-camp">Aikido Summer Camp</a>.
I spent eleven days that month choosing a course North,
to the Baltimore Harbor; I chose a berth in Pasadena,
and had no more energy
for sailing that rickety scrap lumber another inch.
I still need to repair all the broken boards,
and find sails in good shape.</p>
<h3>Dim</h3>
<p>During this period, I had been camping most nights in my pickup in DC;
the national guard began deploying around the city,
and I came to learn the boundaries of their engagement.
I began to learn to beatbox at <a href="http://7drumcity.com">7DrumCity</a>'s Monday open mics.
At <a href="https://baltimorenode.org">Baltimore Node</a>, I began to examine synthesizer circuitboards.</p>
<p>One of my friends is going through housing problems,
and I began thinking of how to help.
After months of hardly speaking,
I expressed many of these challenges to my mom.
In prior years, they had repeatedly
used nonconsensual legal and medical approaches,
to address my unique issues.</p>
<p>By now, they began to see the purpose behind the process,
and realized that their enormous resources enabled them to help.
They chose a camper, I clambered in.
I ended 2025 in a sequence of bus/train/pickup/camper runs,
to get the pickup parked securely at the marina,
where I can cancel the insurance for a few months and do repairs.</p>
<h2>2026</h2>
<h3>Sobering</h3>
<p>For the first moment in 18 months,
I can be sure of my housing in a real sense.
I can begin to make plans, looking ahead
further than the end of the month.</p>
<p>I can spend all day plugged in, on solar,
cooking and pushing ahead on my cyber aims as much as need be.
And after so long, the need is really there.</p>
<p>I can finally begin considering how to help
in the broad range of emergencies all around,
rather than fearing my presence is a burden
that needs to be carried by my peers.</p>
<p>Being able to check in more-than-sporadically,
I can hold up my end of some crucial online dialogues.
On Thursday this week, I held up my promise
to lead a small lesson on Nushell at <a href="https://iffybooks.net">Iffy Books</a> in Philadelphia.
I'm re-learning the feeling of sharing among peers,
rather than chasing endless leads in isolation.</p>
<p>More so, a recent relationship has helped me re-learn
some of the empathy that has so long
been obscured behind layers of sharpened aggression.
The odd combination of martial arts and nomadism
has made me a challenge to approach, or address;
many egos end up bruised when they bounce off of me.</p>
<h3>Eyes Open</h3>
<p>So, how to embrace the year ahead?
I am eager to focus on problems larger than mine alone.</p>
<p>I'd like to engage in more public communication,
and hone in on how these many unique experiences
can be aimed at raising the conditions of my neighbors.</p>
<p>On the coding side, I think that open-source
is pushing into a cadence that is fully inspiring.
I am finally pleased with my local machine,
so I'll get back into deployments
and focus specifically on approachable documentation.</p>
<p>I explained my <a href="/chronicle/lab.propose">production goals</a> already.
To complement my normal essays,
I'll be learning <a href="https://typst.app">typst</a> and sharing my process more graphically.</p>
<h3>Reaching People</h3>
<p>I'd like to engage the many hackerspace connections
towards producing similar purposeful resources on a plural scale.
Perhaps this means building modular homes;
acquiring open land in cities,
doing the challenging legal research
around zoning and building codes.</p>
<p>I'd like to produce music if possible,
because my peers at the weekly open mic
have seen me through all the ecstasies and horrors.
Music is real magic,
in a sense that you can share deeper meaning
than language alone.
The exercise of an open mic
is deeply bio-mechanical,
in addition to social.</p>
<p>These are practices that need to be amplified in the year ahead.
How are you going to engage? Speak up.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Learning Aims in 2026</link>
        <guid isPermaLink="false">2026-01-19.Learning Aims in 2026</guid>
        <pubDate>Mon, 19 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>39C3 so spicy.</title>
        <description><![CDATA[
          
          <hr/>

          <blockquote>
<p>&quot;Yeah I saw that cccongress was spicy this year&quot;<br />
-- Waffles, on Signal.</p>
</blockquote>
<p>I'll add more as I consume more.</p>
<hr />
<p>Cory Doctorow,
<a href="https://media.ccc.de/v/39c3-a-post-american-enshittification-resistant-internet">&quot;A post-American, enshittification-resistant internet&quot;</a></p>
<video class="video" controls="controls" data-id="16187" data-timeline="https://static.media.ccc.de/media/congress/2025/1421-c9f5a6df-6c79-5492-b3e0-110347358445.timeline.jpg" height="100%" poster="https://static.media.ccc.de/media/congress/2025/1421-c9f5a6df-6c79-5492-b3e0-110347358445_preview.jpg" preload="metadata" width="100%">
<source data-lang="eng" data-quality="high" src="https://cdn.media.ccc.de/congress/2025/h264-hd/39c3-1421-eng-A_post-American_enshittification-resistant_internet.mp4" title="eng 1080p h264-hd" type="video/mp4">
<source data-lang="fra" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-hd/39c3-1421-fra-A_post-American_enshittification-resistant_internet.mp4" title="fra 1080p h264-hd" type="video/mp4">
<source data-lang="deu" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-hd/39c3-1421-deu-A_post-American_enshittification-resistant_internet.mp4" title="deu 1080p h264-hd" type="video/mp4">
<source data-lang="eng-deu-fra" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-hd/39c3-1421-eng-deu-fra-A_post-American_enshittification-resistant_internet_hd.mp4" title="eng-deu-fra 1080p h264-hd" type="video/mp4">
<source data-lang="eng-deu-fra" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/webm-hd/39c3-1421-eng-deu-fra-A_post-American_enshittification-resistant_internet_webm-hd.webm" title="eng-deu-fra 1080p webm-hd" type="video/webm">
<source data-lang="eng-deu-fra" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/av1-hd/39c3-1421-eng-deu-fra-A_post-American_enshittification-resistant_internet_av1-hd.webm" title="eng-deu-fra 1080p av1-hd" type="video/webm">
<source data-lang="eng-deu-fra" data-quality="low" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-sd/39c3-1421-eng-deu-fra-A_post-American_enshittification-resistant_internet_sd.mp4" title="eng-deu-fra 576p h264-sd" type="video/mp4">
<source data-lang="eng-deu-fra" data-quality="low" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/webm-sd/39c3-1421-eng-deu-fra-A_post-American_enshittification-resistant_internet_webm-sd.webm" title="eng-deu-fra 576p webm-sd" type="video/webm">
<!-- / hide placehoder vtt files for now -->
<track kind="subtitles" label="eng (auto)" src="https://static.media.ccc.de/media/congress/2025/1421-c9f5a6df-6c79-5492-b3e0-110347358445-eng.vtt" srclang="en">
<track kind="metadata" label="thumbnails" src="https://static.media.ccc.de/media/congress/2025/1421-c9f5a6df-6c79-5492-b3e0-110347358445.thumbnails.vtt" srclang="">
<link href="/postroll/39c3-a-post-american-enshittification-resistant-internet" rel="postroll">
</video>
<p>Martha Root,
<a href="https://media.ccc.de/v/39c3-the-heartbreak-machine-nazis-in-the-echo-chamber">&quot;The Heartbreak Machine: Nazis in the Echo Chamber&quot;</a>
(english dubbing optional)</p>
<video class="video" data-id="16315" data-timeline="https://static.media.ccc.de/media/congress/2025/1695-958d3055-3929-56b8-b71c-25b3a64f1902.timeline.jpg" height="100%" poster="https://static.media.ccc.de/media/congress/2025/1695-958d3055-3929-56b8-b71c-25b3a64f1902_preview.jpg" preload="metadata" width="100%" id="mejs_9776620441055148_html5" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-hd/39c3-1695-deu-The_Heartbreak_Machine_Nazis_in_the_Echo_Chamber.mp4">
<source data-lang="deu" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-hd/39c3-1695-deu-The_Heartbreak_Machine_Nazis_in_the_Echo_Chamber.mp4" title="deu 1080p" type="video/mp4">
<source data-lang="eng" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-hd/39c3-1695-eng-The_Heartbreak_Machine_Nazis_in_the_Echo_Chamber.mp4" title="eng 1080p" type="video/mp4">
<source data-lang="deu-eng" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-hd/39c3-1695-deu-eng-The_Heartbreak_Machine_Nazis_in_the_Echo_Chamber_hd.mp4" title="deu-eng 1080p" type="video/mp4">
<source data-lang="deu-eng" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/webm-hd/39c3-1695-deu-eng-The_Heartbreak_Machine_Nazis_in_the_Echo_Chamber_webm-hd.webm" title="deu-eng 1080p" type="video/webm">
<source data-lang="deu-eng" data-quality="high" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/av1-hd/39c3-1695-deu-eng-The_Heartbreak_Machine_Nazis_in_the_Echo_Chamber_av1-hd.webm" title="deu-eng 1080p" type="video/webm">
<source data-lang="deu-eng" data-quality="low" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/h264-sd/39c3-1695-deu-eng-The_Heartbreak_Machine_Nazis_in_the_Echo_Chamber_sd.mp4" title="deu-eng 576p" type="video/mp4">
<source data-lang="deu-eng" data-quality="low" src="https://us.mirror.ionos.com/projects/media.ccc.de//congress/2025/webm-sd/39c3-1695-deu-eng-The_Heartbreak_Machine_Nazis_in_the_Echo_Chamber_webm-sd.webm" title="deu-eng 576p" type="video/webm">
<track kind="metadata" label="thumbnails" src="https://static.media.ccc.de/media/congress/2025/1695-958d3055-3929-56b8-b71c-25b3a64f1902.thumbnails.vtt" srclang="">
<link href="/postroll/39c3-the-heartbreak-machine-nazis-in-the-echo-chamber" rel="postroll">
</video>
        ]]></description>
        <link>https://operand.online/chronicle/39C3 so spicy.</link>
        <guid isPermaLink="false">2026-01-19.39C3 so spicy.</guid>
        <pubDate>Mon, 19 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Fiscal Progress.</title>
        <description><![CDATA[
          
          <hr/>

          <p>Another day, more progress on <a href="https://operand.online/gram/fiscal">an assignment no one asked for</a>.</p>
<p>So, another day in on preparing fiscal records.
This round, I'm recording from my camper,
and chose a vertical display to help anyone using their phone.</p>
<p>Signal is bad here, so my 1.9GB recording is really plugging up the 5g connection.
I'll see when I can upload, and sorry for the delay.</p>
<blockquote>
<p>Upload finished on highway.... hands free?</p>
</blockquote>
<video controls>
  <source src="https://share.operand.online/prod/2026-01-13.fiscal.webm" type="video/webm"/>
</video>
        ]]></description>
        <link>https://operand.online/chronicle/Fiscal Progress.</link>
        <guid isPermaLink="false">2026-01-13.Fiscal Progress.</guid>
        <pubDate>Tue, 13 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Small holdups in process.</title>
        <description><![CDATA[
          
          <hr/>

          <h2><code>do</code>ing as much as I can.</h2>
<p><a href="/gram/do">gram:do</a> is a new exercise in recording my daily progress.
I'd like to make a dedicated rendering layer to place these on a calendar.
Perhaps! Anything is possible if you ignore how much energy is required.</p>
<p>I've been focusing on keeping calm,
as I acclimate to changing domestic scenario;
going from pickup-nomadism (18 months) to proper camper-home nomadism (2 weeks).
I do experience panic attacks, especially when becoming sleepy,
which make sense in a pickup; sleep implies
the approach of each day's freezing dark hours.
Oddly, I also feel an uneasy sense of guilt from being able to sleep inside,
warm and cozy, when so many of the surrounding neighbors are unable to secure a home.</p>
<p>I suppose the issue is that I spent the last 18 months,
and in a larger sense the last 6 years,
learning so much about nomadism and proper homelessness -
including crisis management infrastructure designed
more for their capacity to suck up peoples' money
than to inflate their ego or (common) senses.</p>
<p>All this said, there really is no equal to a proper secure home.
I slept until noon for the first time in ages, a couple days ago.
After that I spent a few nights nocturnal,
which made sense because I was hopping cars around Maryland,
to manage registration and insurance concerns.
I had some late-night bicycle and bus rides to follow some damp rainy nap days.</p>
<p>Today, I'm back to early-hours, in essence because I &quot;phased around&quot;
by lagging through a sleep cycle. This also seems good;
I like the quiet hours in the hackerspace when I can click record
with no background machinery running.</p>
<p>This week, I'll need to spend those early morning hours
<a href="https://iffybooks.net/event/nushell-basics/">preparing to speak at Iffy Books</a> in Philadelphia on Thursday.</p>
<p>I <code>do</code> indeed hope this is all coming through in the daily progress log,
and I'll be upgrading this to be more explorable, soon as possible.</p>
<hr />
<h2>Morning Recording</h2>
<p>A couple days ago I had been able to record coding session,
including my screen and accompanying audio.
This morning, I spent a similar duration to record more progress on <a href="/gram/fiscal">gram:fiscal</a>.</p>
<p>Once I neared the end, I looked across to see that my audio recordery
had been keyed to a &quot;monitor&quot; source rather than the USB mic.
The audio dial was immobile, meaning no signal appears in the recording.
I finished up, and loaded the two screen captures into <a href="https://kdenlive.org">kdenlive</a>.
Oddly, the video sources had the proper dimensions (I'd been recording a vertical screen)
although the signal had also been blank; a dark screen.</p>
<p>There is one more option for producing the session recording;
I had <a href="https://asciinema.org">asciinema</a> running to capture the console session directly.</p>
<p>Embedding an <code>asciinema</code> player in this domain is a little too much for my purposes,
so I'll come back and drop that here if I find some spare hours.
For now, there is too much to do so I'll simply run through a summary of the changes.</p>
<hr />
<h2><a href="/gram/fiscal">gram:fiscal</a> changes</h2>
<p>In my original session,
I had produced a cache full of separated reports, by month.
As I looked back through these this morning,
I recognized that each page had a header, and possible tailing lines.
I made up some line-based parsing logic to shed this baggage.</p>
<p>I looked ahead some, and found that the paging scheme differed from my expectations.
Page numbers are described as, e.g. <code>PAGE: 1(1)</code>,
wherein the pages are scanning in both rows and columns,
like vertical and horizontal-scrolling a spreadsheet,
with the first row and the column header pinned (frozen) on screen.</p>
<p>This is a good realization,
and a consequence of small page sizes in legacy ASCII reporting programs.
Text-based tabular reporting is common across industry
largely because these reports underlie processes so crucial,
they were modernized... before the modern era.</p>
<p>Hard to imagine that governments were once the leading edge of procurement.
Once they upgraded themselves into the mainframe era,
no one realized how challenging an escape had become.</p>
<p>I'll spend one more morning on this,
and then you'll be able to grab <code>.csv</code> or <code>.xlsx</code> directly from the cache,
or run the nu code on your computer to reproduce the process locally,
learning as you go.</p>
<p>For now, you can find the intermediate <code>.noheader</code> files in the <a href="https://share.operand.online/gram/fiscal/cache/">cache</a> (<a href="https://share.operand.online/gram/fiscal/cache/?download=tar_gz">.tar.gz</a> or <a href="https://share.operand.online/gram/fiscal/cache/?download=zip">.zip</a>).</p>
<hr />
<h2>Employment on Horizon.</h2>
<p>As much as I have done to learn the boundaries and rules of nomadism,
I do feel many days as though I am simply running from place to place,
unable to lend anyone use of my skills or experience,
because I am simply too preoccupied with the demands of keeping up.</p>
<p>Recently, I've been subscribing to employment postings
that are aligned with my background,
so I am considering once again how to apply to the corporate sphere.
In case I'm able to secure something soon,
I'll be crunging numbers to see about refilling my 401(k),
paying off my credit card, and perhaps paying back the camper
that I begrudgingly (as in all aspects of our relationship)
am assigned to by my mom and dad. Let's keep from dwelling on this too much.</p>
<hr />
<h2>Resume, in progress.</h2>
<p>The new roles mean I need to become more serious about the application process,
and I'm going to re-build my resume as needed.
I have some ideas that can help make this unique and exceptional;
in the past I've coded my resume by hand as a web page,
including the option to render as a PDF.</p>
<p>On this occasion, I'm going to take that approach again,
and as I re-phrase many sections to more align to my career goals,
I'll seek to make the resume easier to compose and re-arrange on the fly.
I'm going to make a codebase, using the new elixir <code>nex</code> library,
that is able to compose a resume on-demand from pre-made pieces,
or the basic &quot;claims&quot; I make regarding my career experiences.</p>
<hr />
<h2>More secure coding isolation.</h2>
<p>Because I, like anyone else, am new to the <code>nex</code> package -
or, more precisely, because the package is new to us,
I'd like to minimize the risk of exposure to supply-chain attacks.
These insiduous security holes come around when someone embeds a problem
inside a crucial code package, thereby reaching coders on their local machines.</p>
<p>Because of several insecure practices I'm cleaning up on my local machine,
I'm pausing the addition of any new programs until I clean up.
Rather than run new code directly,
I am using VM isolation for programs that I'm unsure of.</p>
<p>Some people are already seeing me explain that,
sure - I can join you on Zoom,
although I remain unable to patch my webcam through to the VM.
Of course, if Zoom's closed-source app is not scary enough,
a quick glance through their terms and conditions
makes me quickly recommend <a href="https://jitsi.org">Jitsi</a> in any of those scenarios.</p>
<p>I'm rebuilding [gram:pool] as much as need be,
to begin doing much of my local coding inside an isolated minimal VM.
I'm already pleased with how easy the networking has been,
and for web-apps this is a clear and sensible direction
for sampling complex libraries,
including niche and hypereffective graph databases,
and keeping my base machine as secure as possible in the process.</p>
<p>Thinking ahead, these changes to <code>pool</code> are likely going to cause ripples,
when I begin publishing code packages again.
Any process I make up for building or testing a package inside a VM
is going to be far simpler to automate on a dedicated build machine,
because my dependency on the nix flake
is going to include each necessary build recipe,
regardless of any decisions for the build pipeline.</p>
<p>Sure sounds like a bunch is cooking here...
all you can do is all you can do.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Small holdups in process.</link>
        <guid isPermaLink="false">2026-01-12.Small holdups in process.</guid>
        <pubDate>Mon, 12 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Pulling and arranging treasury.gov fiscal records.</title>
        <description><![CDATA[
          
          <hr/>

          <p><a href="https://operand.online/gram/fiscal">gram:fiscal</a> is an example of how NuShell &quot;excels&quot; in mundane minutiae.</p>
<p>In days ahead, shall add code to expose records in more common and accessible forms.</p>
<video controls>
  <source src="https://share.operand.online/prod/2026-01-10.fiscal.webm" type="video/webm"/>
</video>
        ]]></description>
        <link>https://operand.online/chronicle/Pulling and arranging treasury.gov fiscal records.</link>
        <guid isPermaLink="false">2026-01-10.Pulling and arranging treasury.gov fiscal records.</guid>
        <pubDate>Sat, 10 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Mixing Audio</title>
        <description><![CDATA[
          
          <hr/>

          <p>For podcasts, here are the phases I remember:</p>
<ul>
<li>bring speakers into a shared, recorded dialogue.</li>
<li>arrange and clip recordings to size, drop any bloopers.</li>
<li>record the sign-on and sign-off segments.</li>
<li>(no ads to be concerned for here).</li>
<li>overlay recognizable leading and trailing music clips.</li>
<li>publish to RSS syndication.</li>
</ul>
<p>Keeping these in mind, here's a process I'd recommend:</p>
<ul>
<li>(you may already have a good process); Hook up a <a href="https://www.mumble.info/">Mumble</a> room, and record per-track so each source is clear.</li>
<li>Bring recordings into <a href="https://www.audacityteam.org">Audacity</a> and mix as needed.</li>
<li><a href="https://ardour.org">Ardour</a> is able to do many special effects for a higher learning curve.</li>
<li>Need any video for a change? You can also use OSS. <a href="https://pitivi.org">PiTiVi</a>, <a href="https://kdenlive.org">KdenLive</a></li>
<li>You'll be sharing many audio files! I'm looking to hook up <a href="https://rustfs.com">RustFS</a> or <a href="https://www.min.io">MinIO</a> to as independent and scalable online storage.</li>
<li>Each producer can use <a href="https://rclone.org">RClone</a> or <a href="https://syncthing.net">SyncThing</a> to push and pull copies of the media, much like DropBox.</li>
</ul>
<p>You can adopt these pieces one by one, beginning with Audacity perhaps. I'd like to help by running the Mumble relay, and setting up file sharing beyond the (assumed) normal Google Drive. As a bonus, during my link-grab I came across a business that Audacity recommends - <a href="https://audio.com/">Audio.com</a> seems like they can handle publishing and syndication.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Mixing Audio</link>
        <guid isPermaLink="false">2026-01-07.Mixing Audio</guid>
        <pubDate>Wed, 07 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Appraisal Proposal: Nushell</title>
        <description><![CDATA[
          
          <hr/>

          <p>Hello, from operand.online</p>
<p>I publish a collection of Nushell commands that I use daily, at <a href="https://operand.online/gram/nue">gram:nue</a> - here's how I reached where I am now.</p>
<p>In October 2023, coders at <a href="https://hacdc.org">HacDC</a> had persuaded me to learn NixOS, and a former colleague persuaded me to check on <a href="https://elixir-lang.org/">Elixir</a>. I began to build in these languages, because I'd been unemployed since February when the House of Reps said, &quot;no need for experimental prototypes, goodbye.&quot;</p>
<p>As I began to pick up the pace with these two languages in January 2024, I realized that I'd fallen behind on my learning commitment. I had aimed to pick up Nushell in 2023 also. I had been through innumerable shells by now, so I grit my teeth to dig in, expecting all the pain of migration-and-abandonment that had come from <code>fish</code> and <code>xiki</code>.</p>
<p>There was no &quot;aha&quot; moment. There were many. Too many. Each day seemed like, &quot;Why would I build an app for this when I can do the query I need in my shell?&quot; My full career path as a web-app coder collapsed into &quot;do I really need more than the command-line and a capable package manager?&quot;</p>
<p>So, in December I finally broke up my <a href="https://operand.online/gram/build"><code>build</code> codebase</a> that had been running since 2016 and documents my progression through each shell. I expanded these configs into dedicated code for NuShell, <a href="https://operand.online/gram/nue">called <code>nue</code></a>, and NixOS, called <a href="https://operand.online/gram/nux"><code>nux</code></a>.</p>
<p>NuShell has clicked to such a degree that I no longer had a need to learn Rust. I'm finally exploring that language for game-development and webassembly ( https://bfnightly.bracketproductions.com/ ), after accomplishing years of crucial use cases in the much more user-space landscape that Nu encompasses.</p>
<hr />
<p>Meanwhile, my web app had paused progress. The Elixir web framework Phoenix had become too cumbersome to program for. I'd been long used to a hodgepodge of languages from my days on Ruby on Rails, and Phoenix seemed to be pushing me in that direction also. Why would I learn such a cumbersome web library when i need to use React at the end of the day regardless?</p>
<p>So, 8 days ago when <a href="https://elixirforum.com/t/nex-a-minimalist-web-framework-for-indie-hackers-and-startups/73789">the library Nex</a> released, I decided to rebuild.</p>
<p>My app already focuses on the display of code, and as I rebuild I'd like to embrace the approaches of <a href="http://www.literateprogramming.com">Literate Programming</a> to encourage discussions amid the lines of code. This is an area that GitHub has abandoned, compared to their focus on the proceduralism of code review pipelines, and the recommendation modalities of AI. NuShell is one of a few codebases that I'm eager to hold up as examples, alongside the code of <a href="https://inkandswitch.com">Ink &amp; Switch</a> and chosen Elixir libraries.</p>
<p>I'm opening <a href="https://github.com/nushell/nushell/discussions/17293">a discussion on the NuShell GitHub codebase</a>
to discuss an appraisal of their source code for security purposes.
I'd like to also examine the directions they aim to adopt for concerns like <code>nu</code>-language package management.
As much as I can encourage adoption, I'm glad to do so. This language is going to echo in my brain for the remainder of my career.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Appraisal Proposal: Nushell</link>
        <guid isPermaLink="false">2026-01-05.Appraisal Proposal: Nushell</guid>
        <pubDate>Mon, 05 Jan 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Re: Deploy</title>
        <description><![CDATA[
          
          <hr/>

          <blockquote>
<p>Look for the code on <a href="/gram/nue/flash.nu">gram:nue/flash.nu</a>.</p>
</blockquote>
<h2>Year-End Lab Problems!</h2>
<p>I'm spending much of the holiday season in a small crisis,
my mobility reduced by crucial repairs for a new camper I'll be using next year.
As I camp on my friends' couch, a common theme in my career,
I am held back from many of my aims because my domain seems to keep dropping offline;
rather than heading back to Baltimore to cycle the machine once again,
I'd like to come to grips with a more reliable deploy method.</p>
<p><a href="./rebuild.lab">Since mid-summer</a>,
the apps are running through a combination of two machines:</p>
<ul>
<li><code>pebble</code> (a raspberry pi), running:
<ul>
<li><a href="https://nixos.org">NixOS</a></li>
<li>a <a href="https://nebula.defined.net">Nebula</a> beacon (&quot;lighthouse&quot;)</li>
<li>a WAN-to-LAN <a href="https://caddyserver.com">Caddy</a> reverse-proxy</li>
</ul>
</li>
<li><code>baseboard</code> (a mini-pc), running:
<ul>
<li><a href="https://nixos.org">NixOS</a></li>
<li>a local <a href="https://caddyserver.com">Caddy</a> reverse-proxy</li>
<li><a href="https://github.com/svenstaro/miniserve">miniserve</a></li>
<li><a href="https://microvm-nix.github.io/microvm.nix/">MicroVM.nix</a>, managed by <a href="/gram/pool">gram:pool</a>
<ul>
<li><a href="/gram/op">gram:op</a>, through:
<ul>
<li><a href="/gram/pool/drop/op.nix">gram:pool/drop/op.nix</a></li>
<li><a href="/gram/pool/gram/elixir.nix">gram:pool/gram/elixir.nix</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><code>baseboard</code> runs a couple other open-source programs,
including <a href="https://immich.app/">immich</a> as an image library,
and <a href="https://www.traccar.org/">traccar</a> as a GPS logger.
These are amazing programs for your lab,
and help you upgrade your phone to &quot;basically normal&quot;
with no dependency on Apple or Google.</p>
<p>These programs are possibly also the reasons that this computer is going offline,
because each one is public and may include security errors or imperceptible backdoors.
I am so incredibly bad at checking log files, at least until I hook up <a href="https://grafana.com/">Grafana</a>.
They should probably be running hidden from the global internet,
instead of my all-in approach of exposing each app under public subdomains.</p>
<p>Of course, I'm focused today on bringing the main app online again.
I'm going to assume all of my machines are compromised,
for a fun exercise.</p>
<hr />
<h2>Upgrading &quot;Phase One&quot;.</h2>
<p>One of the real missions of Operand
is to reduce our dependency on so-called &quot;cloud&quot; resources.</p>
<p>For today's changes,
I have two additional Framework Mainboard computers,
ready to go.</p>
<p>One of them has an SSD onboard already,
and this used to be a backup lab machine.
I'll begin by backing up anything on that disc
so we can re-image the OS and record the process from the beginning.</p>
<p>Normally, for a clean install of NixOS I'd begin by flashing an install disc -
a &quot;live image&quot;, onto a microSD card. I keep a case of around 30 spare microSDs,
and nearly all of them are full of some install disc or other.
The labeling is becoming a real problem.</p>
<p>To simplify this &quot;phase one&quot; process, I'd like to skip the SD cards
and head directly to the m.2 NVMe SSD that I'll be booting the new computer from.</p>
<p>According to the <a href="https://nixos.org/manual/nixos/stable/index.html#sec-installation-manual-partitioning-UEFI">NixOS &quot;manual installation&quot; guide</a>
I should be able to do this by erasing the disc,
formatting it properly for a UEFI boot sequence,
and then binding the disc to <code>/mnt</code>.</p>
<p>I copied the procedures described under
&quot;Partitioning &gt; UEFI (GPT)&quot;, &quot;Formatting&quot;, and &quot;Installing&quot; in the manual.</p>
<p>I then reorganize the partitions so their numbers are sequential.
I add a couple additional partitions, <code>nix</code> and <code>home</code>,
as an early basis for <a href="http://wiki.nixos.org/wiki/Impermanence">impermanence</a>.</p>
<p>Because my shell of choice is <a href="https://nushell.sh">Nushell</a>,
some of the commands have been broken into segments,
passing the desired disc label into the <code>main</code> function
to make the procedure more generic.
I begin by sourcing three helper modules from <a href="/gram/nue">gram:nue</a></p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #ff7b72;">#!/usr/bin/env nu
</div><div class="line" data-line="2"></span><span style="color: #ff7b72;">source</span> <span style="color: #e6edf3;">~/.nue/nix.nu</span>
</div><div class="line" data-line="3"><span style="color: #ff7b72;">source</span> <span style="color: #e6edf3;">~/.nue/disc.nu</span>
</div><div class="line" data-line="4"><span style="color: #ff7b72;">source</span> <span style="color: #e6edf3;">~/.nue/grammar.nu</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">mem</span> <span style="color: #79c0ff;">=</span> <span style="color: #a5d6ff;">&#39;32GB&#39;</span>
</div><div class="line" data-line="7"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">swap</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #e6edf3;">(</span><span style="color: #a5d6ff;">&#39;-&#39;</span> <span style="color: #79c0ff;">+</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">mem</span><span style="color: #e6edf3;">)</span> <span style="color: #a5d6ff;">&#39;100%&#39;</span> <span style="color: #e6edf3;">]</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">boot</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">&#39;1MB&#39;</span> <span style="color: #a5d6ff;">&#39;512MB&#39;</span> <span style="color: #e6edf3;">]</span>
</div><div class="line" data-line="10"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">nix</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">boot</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">last</span><span style="color: #e6edf3;">)</span> <span style="color: #a5d6ff;">&#39;128GB&#39;</span> <span style="color: #e6edf3;">]</span>
</div><div class="line" data-line="11"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">root</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">nix</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">last</span><span style="color: #e6edf3;">)</span> <span style="color: #a5d6ff;">&#39;256GB&#39;</span> <span style="color: #e6edf3;">]</span>
</div><div class="line" data-line="12"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">home</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">root</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">last</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">swap</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">first</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">]</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14"><span style="color: #ff7b72;">def</span> <span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">disc</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">part</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&#39;&#39;</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">into</span> <span style="color: #e6edf3;">string</span><span style="color: #e6edf3;">)</span> <span style="color: #79c0ff;">+</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">part</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16"><span style="color: #ff7b72;">def</span> <span style="color: #d2a8ff;">main</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">disc</span><span style="color: #e6edf3;">?</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">recycle</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">r</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">timeit</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="17">  <span style="color: #d2a8ff;">unbind</span>
</div><div class="line" data-line="18">  <span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">assure</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #a5d6ff;">&quot;/dev/&quot;</span> <span style="color: #79c0ff;">+</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">disc</span> <span style="color: #e6edf3;">choose</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="19">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">--</span> <span style="color: #e6edf3;">mklabel</span> <span style="color: #e6edf3;">gpt</span>
</div><div class="line" data-line="20">
</div><div class="line" data-line="21">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">--</span> <span style="color: #e6edf3;">mkpart</span> <span style="color: #e6edf3;">ESP</span> <span style="color: #e6edf3;">fat32</span> <span style="color: #e6edf3;">...(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">boot</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="22">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">--</span> <span style="color: #e6edf3;">set</span> <span style="color: #79c0ff;">1</span> <span style="color: #e6edf3;">esp</span> <span style="color: #e6edf3;">on</span>
</div><div class="line" data-line="23">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkfs.fat</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">F</span> <span style="color: #79c0ff;">32</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">n</span> <span style="color: #e6edf3;">BOOT</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">1</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="24">
</div><div class="line" data-line="25">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">--</span> <span style="color: #e6edf3;">mkpart</span> <span style="color: #e6edf3;">nix</span> <span style="color: #e6edf3;">ext4</span> <span style="color: #e6edf3;">...(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">nix</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="26">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkfs.ext4</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">L</span> <span style="color: #e6edf3;">nix</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">2</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="27">
</div><div class="line" data-line="28">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">--</span> <span style="color: #e6edf3;">mkpart</span> <span style="color: #e6edf3;">root</span> <span style="color: #e6edf3;">ext4</span> <span style="color: #e6edf3;">...(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">root</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="29">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkfs.ext4</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">L</span> <span style="color: #e6edf3;">nixos</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">3</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="30">
</div><div class="line" data-line="31">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">--</span> <span style="color: #e6edf3;">mkpart</span> <span style="color: #e6edf3;">home</span> <span style="color: #e6edf3;">ext4</span> <span style="color: #e6edf3;">...(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">home</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="32">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkfs.ext4</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">L</span> <span style="color: #e6edf3;">home</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">4</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="33">
</div><div class="line" data-line="34">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">--</span> <span style="color: #e6edf3;">mkpart</span> <span style="color: #e6edf3;">swap</span> <span style="color: #e6edf3;">linux-swap</span> <span style="color: #e6edf3;">...(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">swap</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="35">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkswap</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">L</span> <span style="color: #e6edf3;">swap</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">5</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="36">
</div><div class="line" data-line="37">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">parted</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">--</span> <span style="color: #e6edf3;">p</span>
</div><div class="line" data-line="38">
</div><div class="line" data-line="39">  <span style="color: #8b949e;"># mount discs!</span>
</div><div class="line" data-line="40">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mount</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">3</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">/mnt</span>
</div><div class="line" data-line="41">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkdir</span> <span style="color: #e6edf3;">/mnt/boot</span><span style="color: #e6edf3;">;</span> <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mount</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">o</span> <span style="color: #e6edf3;">umask=077</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">1</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">/mnt/boot</span>
</div><div class="line" data-line="42">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkdir</span> <span style="color: #e6edf3;">/mnt/nix</span><span style="color: #e6edf3;">;</span>  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mount</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">2</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">/mnt/nix</span>
</div><div class="line" data-line="43">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkdir</span> <span style="color: #e6edf3;">/mnt/home</span><span style="color: #e6edf3;">;</span> <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mount</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">4</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">/mnt/home</span>
</div><div class="line" data-line="44">
</div><div class="line" data-line="45">  <span style="color: #d2a8ff;">disc</span> <span style="color: #e6edf3;">ls</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">where</span> <span style="color: #e6edf3;">source</span> <span style="color: #79c0ff;">=~</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">print</span>
</div><div class="line" data-line="46">  <span style="color: #d2a8ff;">tree</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">afFix</span> <span style="color: #e6edf3;">/mnt</span>
</div><div class="line" data-line="47">  <span style="color: #a5d6ff;">&quot;Copying in codebases.&quot;</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">print</span>
</div><div class="line" data-line="48">  <span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">all</span>
</div><div class="line" data-line="49">  <span style="color: #d2a8ff;">unbind</span>
</div><div class="line" data-line="50">  <span style="color: #d2a8ff;">me</span>
</div><div class="line" data-line="51"><span style="color: #e6edf3;">&rbrace;</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="52">
</div><div class="line" data-line="53"><span style="color: #ff7b72;">def</span> <span style="color: #d2a8ff;">unbind</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="54">  <span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">umount</span> <span style="color: #e6edf3;">/mnt/boot</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="55">  <span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">umount</span> <span style="color: #e6edf3;">/mnt/nix</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="56">  <span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">umount</span> <span style="color: #e6edf3;">/mnt/home</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="57">  <span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">umount</span> <span style="color: #e6edf3;">/mnt</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="58"><span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<p>The final lines run <code>parted</code> and then <code>disc ls</code>, as quick checks.
We can run <code>nu flash.nu /dev/sdb</code> directly,
or a simple <code>nu flash.nu</code> displays a choice of plugged-in discs.</p>
<p>Near the end of the command, we see the consequences:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">chmod</span> <span style="color: #e6edf3;">+x</span> <span style="color: #e6edf3;">flash.nu</span>
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">./flash.nu</span>
</div><div class="line" data-line="3"><span style="color: #8b949e;"># ... subcommand logs</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">parted</span><span style="color: #e6edf3;">)</span><span style="color: #79c0ff;">&gt;</span> <span style="color: #a5d6ff;">sudo</span> parted /dev/sdb <span style="color: #79c0ff;">-</span>- p
</div><div class="line" data-line="6">Model: WDC WDS5 00G2B0C-00PXH0 <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">scsi</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="7"><span style="color: #d2a8ff;">Disk</span> <span style="color: #e6edf3;">/dev/sdb:</span> <span style="color: #79c0ff;">500</span><span style="color: #e6edf3;">GB</span>
</div><div class="line" data-line="8"><span style="color: #d2a8ff;">Sector</span> <span style="color: #e6edf3;">size</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">logical/physical</span><span style="color: #e6edf3;">)</span>: 512B/8192B
</div><div class="line" data-line="9"><span style="color: #d2a8ff;">Partition</span> <span style="color: #e6edf3;">Table:</span> <span style="color: #e6edf3;">gpt</span>
</div><div class="line" data-line="10"><span style="color: #d2a8ff;">Disk</span> <span style="color: #e6edf3;">Flags:</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12"><span style="color: #d2a8ff;">Number</span>  <span style="color: #e6edf3;">Start</span>   <span style="color: #e6edf3;">End</span>    <span style="color: #e6edf3;">Size</span>    <span style="color: #e6edf3;">File</span> <span style="color: #e6edf3;">system</span>     <span style="color: #e6edf3;">Name</span>  <span style="color: #e6edf3;">Flags</span>
</div><div class="line" data-line="13"> <span style="color: #d2a8ff;">1</span>      <span style="color: #79c0ff;">1051</span><span style="color: #e6edf3;">kB</span>  <span style="color: #79c0ff;">512</span><span style="color: #e6edf3;">MB</span>  <span style="color: #79c0ff;">511</span><span style="color: #e6edf3;">MB</span>   <span style="color: #e6edf3;">fat32</span>           <span style="color: #e6edf3;">ESP</span>   <span style="color: #e6edf3;">boot,</span> <span style="color: #e6edf3;">esp</span>
</div><div class="line" data-line="14"> <span style="color: #d2a8ff;">2</span>      <span style="color: #79c0ff;">512</span><span style="color: #e6edf3;">MB</span>   <span style="color: #79c0ff;">128</span><span style="color: #e6edf3;">GB</span>  <span style="color: #79c0ff;">127</span><span style="color: #e6edf3;">GB</span>   <span style="color: #e6edf3;">ext4</span>            <span style="color: #e6edf3;">nix</span>
</div><div class="line" data-line="15"> <span style="color: #d2a8ff;">3</span>      <span style="color: #79c0ff;">128</span><span style="color: #e6edf3;">GB</span>   <span style="color: #79c0ff;">256</span><span style="color: #e6edf3;">GB</span>  <span style="color: #79c0ff;">128</span><span style="color: #e6edf3;">GB</span>   <span style="color: #e6edf3;">ext4</span>            <span style="color: #e6edf3;">root</span>
</div><div class="line" data-line="16"> <span style="color: #d2a8ff;">4</span>      <span style="color: #79c0ff;">256</span><span style="color: #e6edf3;">GB</span>   <span style="color: #79c0ff;">468</span><span style="color: #e6edf3;">GB</span>  <span style="color: #79c0ff;">212</span><span style="color: #e6edf3;">GB</span>   <span style="color: #e6edf3;">ext4</span>            <span style="color: #e6edf3;">home</span>
</div><div class="line" data-line="17"> <span style="color: #d2a8ff;">5</span>      <span style="color: #79c0ff;">468</span><span style="color: #e6edf3;">GB</span>   <span style="color: #79c0ff;">500</span><span style="color: #e6edf3;">GB</span>  <span style="color: #79c0ff;">32.0</span><span style="color: #e6edf3;">GB</span>  <span style="color: #e6edf3;">linux-swap</span><span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">v1</span><span style="color: #e6edf3;">)</span>  <span style="color: #e6edf3;">swap</span>  <span style="color: #e6edf3;">swap</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: #d2a8ff;">╭───┬───────────┬───────────┬────────┬──────╮</span>
</div><div class="line" data-line="20"><span style="color: #d2a8ff;">│</span> <span style="color: #8b949e;"># │   bind    │  source   │ scheme │ name │</span>
</div><div class="line" data-line="21"><span style="color: #d2a8ff;">├───┼───────────┼───────────┼────────┼──────┤</span>
</div><div class="line" data-line="22"><span style="color: #d2a8ff;">│</span> <span style="color: #79c0ff;">0</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">/mnt</span>      <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">/dev/sdb3</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">ext4</span>   <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">mnt</span>  <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="23"><span style="color: #d2a8ff;">│</span> <span style="color: #79c0ff;">1</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">/mnt/boot</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">/dev/sdb1</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">vfat</span>   <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">boot</span> <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="24"><span style="color: #d2a8ff;">│</span> <span style="color: #79c0ff;">2</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">/mnt/nix</span>  <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">/dev/sdb2</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">ext4</span>   <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">nix</span>  <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="25"><span style="color: #d2a8ff;">│</span> <span style="color: #79c0ff;">3</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">/mnt/home</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">/dev/sdb4</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">ext4</span>   <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">home</span> <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="26"><span style="color: #d2a8ff;">╰───┴───────────┴───────────┴────────┴──────╯</span>
</div><div class="line" data-line="27"><span style="color: #d2a8ff;">/mnt/</span>
</div><div class="line" data-line="28"><span style="color: #d2a8ff;">/mnt/boot/</span>
</div><div class="line" data-line="29"><span style="color: #d2a8ff;">/mnt/home/</span>
</div><div class="line" data-line="30"><span style="color: #d2a8ff;">/mnt/lost+found/</span>  <span style="color: #e6edf3;">[</span><span style="color: #a5d6ff;">error</span> <span style="color: #a5d6ff;">opening</span> <span style="color: #a5d6ff;">dir</span><span style="color: #e6edf3;">]</span>
</div><div class="line" data-line="31"><span style="color: #d2a8ff;">/mnt/nix/</span>
</div><div class="line" data-line="32">
</div><div class="line" data-line="33"><span style="color: #d2a8ff;">5</span> <span style="color: #e6edf3;">directories,</span> <span style="color: #79c0ff;">0</span> <span style="color: #e6edf3;">files</span>
</div></code></pre>
<hr />
<h2>Add Operand's Code.</h2>
<p>Day by day, I add code to a few programs (called <code>grams</code> in our lingo),
used to make lab-management procedures much easier to handle.</p>
<p>The core of these programs, for those new here,
lie in <a href="/gram/nux">gram:nux</a> (for <a href="https://nixos.org">NixOS</a> code) and <a href="/gram/nue">gram:nue</a> (for <a href="https://nushell.sh">Nushell</a> code).</p>
<p>There is also <a href="/gram/mech">gram:mech</a>, which is probably crucial somehow,
although less production-ready than the others.
Used to be, all three of these were included in a single codebase,
called <a href="/gram/build">gram:build</a> - the pieces were unique enough to break them up.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;clone home&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">u</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">nixos</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">home</span> <span style="color: #79c0ff;">=</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">/mnt/home/</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&quot;</span>
</div><div class="line" data-line="3">  <span style="color: #ff7b72;">if</span> <span style="color: #79c0ff;">not </span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">home</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">exists</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">mkdir</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">home</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="4"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;clone base&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">base</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">u</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">nixos</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="7">  <span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">loc</span> <span style="color: #79c0ff;">=</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">/mnt/home/</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">/</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">base</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&quot;</span>
</div><div class="line" data-line="8">  <span style="color: #ff7b72;">if</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">loc</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">exists</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">print</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">Oh no! </span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">loc</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;"> is already loaded.</span><span style="color: #a5d6ff;">&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #ff7b72;">return</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="9">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">gitoxide</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">gix</span> <span style="color: #e6edf3;">clone</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">~/</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">base</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&quot;</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">/mnt/home/</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">/</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">base</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&quot;</span>
</div><div class="line" data-line="10"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;clone loc&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">base</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">path</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">u</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">nixos</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="13">  <span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">loc</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">/mnt/home/</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">join</span>
</div><div class="line" data-line="14">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">rsync</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">rsync</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">av</span> <span style="color: #e6edf3;">~/share</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">home</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">u</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="15"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;clone all&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">u</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">nixos</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="18">  <span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">home</span>
</div><div class="line" data-line="19">  <span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">.nue</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span>
</div><div class="line" data-line="20">  <span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">.nux</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span>
</div><div class="line" data-line="21">  <span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">.mech</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span>
</div><div class="line" data-line="22">  <span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">page</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span>
</div><div class="line" data-line="23">  <span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">diagram</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">user</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span>
</div><div class="line" data-line="24">  <span style="color: #d2a8ff;">nsh</span> <span style="color: #e6edf3;">rsync</span> <span style="color: #e6edf3;">sudo</span> <span style="color: #e6edf3;">rsync</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">av</span> <span style="color: #e6edf3;">~/share</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">/mnt/home/</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">/</span><span style="color: #a5d6ff;">&quot;</span>
</div><div class="line" data-line="25"><span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<hr />
<h2>Nix Machine Config?</h2>
<p>Nix has a command to generate config files,
and I'm skipping that recommended config because after two years,
I know enough to rebuild the good pieces and skip the unnecessary.</p>
<p>The challenging piece here is the file commonly called <code>hardware-configuration.nix</code>;
this specifies a number of boot options,
alongside the disc labels and paths they should bind to during boot.</p>
<p>Lucky us, we're already working with those.
Rather than the fickle <code>/dev/sda</code> and so on,
we'll grab the device UUIDs, which should be reliable
even when the disc is moved to a different machine.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;label&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">disc</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">part</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">any</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">ls</span> <span style="color: #e6edf3;">/dev/disk/by-uuid</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">name</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">where</span> <span style="color: #e6edf3;">&lbrace;</span><span style="color: #79c0ff;">|</span><span style="color: #e6edf3;">id</span><span style="color: #79c0ff;">|</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">id</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">expand</span><span style="color: #e6edf3;">)</span> <span style="color: #79c0ff;">==</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">part</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">part</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">&rbrace;</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">first</span>
</div><div class="line" data-line="3"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">source</span> <span style="color: #e6edf3;">~/disc/flash.nu</span><span style="color: #e6edf3;">;</span> <span style="color: #d2a8ff;">label</span> <span style="color: #e6edf3;">/dev/sda</span> <span style="color: #79c0ff;">2</span>
</div><div class="line" data-line="6"><span style="color: #d2a8ff;">/dev/disk/by-uuid/bf6fd2e3-b0f2-44fe-99c5-9237ad751a48</span>
</div></code></pre>
<p>I can use this helper to build up a new nix config,
depending on the architecture of the processor
and assuming our 5-partition scheme.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;nix bind&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">disc</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">part</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">int</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">bind</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">form</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">f</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">ext4</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">fileSystems.&#39;&#39;</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">bind</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&#39;&#39; = &lbrace; device = &#39;&#39;</span><span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">label</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">part</span>
</div><div class="line" data-line="3">  <span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&#39;&#39;; fsType = &#39;&#39;</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">form</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&#39;&#39;; &rbrace;;</span><span style="color: #a5d6ff;">&quot;</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">str</span> <span style="color: #e6edf3;">replace</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">a</span> <span style="color: #a5d6ff;">&quot;&#39;&#39;&quot;</span> <span style="color: #a5d6ff;">&#39;&quot;&#39;</span>
</div><div class="line" data-line="4"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;nix swap&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">disc</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">part</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">int</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="7">  <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">swapDevices = [
</div><div class="line" data-line="8">    &lbrace; device = &#39;&#39;</span><span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">label</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">part</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&#39;&#39;; options = [ &#39;&#39;discard=once&#39;&#39; ]; &rbrace;
</div><div class="line" data-line="9">  ];</span><span style="color: #a5d6ff;">&quot;</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">str</span> <span style="color: #e6edf3;">replace</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">a</span> <span style="color: #a5d6ff;">&quot;&#39;&#39;&quot;</span> <span style="color: #a5d6ff;">&#39;&quot;&#39;</span>
</div><div class="line" data-line="10"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;nix machine&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">disc</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">arch</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">kernel</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="13">  <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">[</span> <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">preamble</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="14">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">arch</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">arch</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">kernel</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="15">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">bind</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">1</span> <span style="color: #a5d6ff;">&quot;/boot&quot;</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">f</span> <span style="color: #e6edf3;">vfat</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="16">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">bind</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">2</span> <span style="color: #a5d6ff;">&quot;/nix&quot;</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="17">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">bind</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">3</span> <span style="color: #a5d6ff;">&quot;/&quot;</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="18">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">bind</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">4</span> <span style="color: #a5d6ff;">&quot;/home&quot;</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="19">    <span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">swap</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span> <span style="color: #79c0ff;">5</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="20">  <span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">flatten</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">each</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #a5d6ff;">&quot;  &quot;</span> <span style="color: #79c0ff;">+</span> <span style="color: #e6edf3;">$</span>in <span style="color: #e6edf3;">&rbrace;</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">str</span> <span style="color: #e6edf3;">join</span> <span style="color: #a5d6ff;">&quot;</span><span style="color: #a5d6ff;">\n</span><span style="color: #a5d6ff;">&quot;</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">str</span> <span style="color: #e6edf3;">trim</span><span style="color: #e6edf3;">)</span> <span style="color: #79c0ff;">+</span> <span style="color: #a5d6ff;">&quot;</span><span style="color: #a5d6ff;">\n</span><span style="color: #a5d6ff;">&rbrace;</span><span style="color: #a5d6ff;">\n</span><span style="color: #a5d6ff;">&quot;</span>
</div><div class="line" data-line="21"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;nix preamble&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="24"><span style="color: #a5d6ff;">&#39;&#39;</span> <span style="color: #79c0ff;">+</span> <span style="color: #a5d6ff;">`&lbrace; config, lib, modulesPath, ... &rbrace;:
</div><div class="line" data-line="25">&lbrace;
</div><div class="line" data-line="26">  imports = [
</div><div class="line" data-line="27">    (modulesPath + &quot;/installer/scan/not-detected.nix&quot;)
</div><div class="line" data-line="28">  ];
</div><div class="line" data-line="29">
</div><div class="line" data-line="30">  boot.loader = &lbrace; systemd-boot.enable = true; efi.canTouchEfiVariables = true; &rbrace;;
</div><div class="line" data-line="31">  boot.initrd.availableKernelModules = [ &quot;xhci_pci&quot; &quot;thunderbolt&quot; &quot;nvme&quot; &quot;usb_storage&quot; &quot;usbhid&quot; &quot;sd_mod&quot; ];
</div><div class="line" data-line="32">  boot.initrd.kernelModules = [ ];
</div><div class="line" data-line="33">  boot.extraModulePackages = [ ];
</div><div class="line" data-line="34">`</span>  
</div><div class="line" data-line="35"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="36">
</div><div class="line" data-line="37"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;nix arch&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">arch</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">kernel</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="38">  <span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">nixpkgs.hostPlatform = lib.mkDefault </span><span style="color: #a5d6ff;">\&quot;</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">arch</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">-</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">kernel</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">\&quot;</span><span style="color: #a5d6ff;">;</span><span style="color: #a5d6ff;">&quot;</span> <span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">++</span> <span style="color: #e6edf3;">(</span>
</div><div class="line" data-line="39">  <span style="color: #ff7b72;">if</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">arch</span> <span style="color: #79c0ff;">==</span> <span style="color: #a5d6ff;">&#39;x86_64&#39;</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">[</span>
</div><div class="line" data-line="40">    <span style="color: #a5d6ff;">&quot;hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;&quot;</span>
</div><div class="line" data-line="41">    <span style="color: #a5d6ff;">&quot;boot.kernelModules = [ &#39;&#39;kvm-intel&#39;&#39; ];&quot;</span>
</div><div class="line" data-line="42">  <span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&rbrace;</span> <span style="color: #ff7b72;">else</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="43">    <span style="color: #a5d6ff;">&quot;boot.kernelModules = [];&quot;</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="44"><span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<p>This means a simple one-liner prepares the necessary <code>machine.nix</code>:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">source</span> <span style="color: #e6edf3;">~/disc/flash.nu</span><span style="color: #e6edf3;">;</span> <span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">machine</span> <span style="color: #e6edf3;">/dev/sda</span> <span style="color: #e6edf3;">x86_64</span> <span style="color: #e6edf3;">linux</span>
</div></code></pre>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">config</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">lib</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">modulesPath</span><span style="color: #e6edf3;">,</span> ... <span style="color: #e6edf3;">&rbrace;</span>:
</div><div class="line" data-line="2"><span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="3">  <span style="color: #e6edf3;">imports</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">[</span>
</div><div class="line" data-line="4">    <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">modulesPath</span> <span style="color: #79c0ff;">+</span> <span style="color: #a5d6ff;">&quot;/installer/scan/not-detected.nix&quot;</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="5">  <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">  <span style="color: #e6edf3;">boot</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">loader</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">systemd-boot</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">enable</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">true</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">efi</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">canTouchEfiVariables</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">true</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="8">  <span style="color: #e6edf3;">boot</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">initrd</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">availableKernelModules</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">&quot;xhci_pci&quot;</span> <span style="color: #a5d6ff;">&quot;thunderbolt&quot;</span> <span style="color: #a5d6ff;">&quot;nvme&quot;</span> <span style="color: #a5d6ff;">&quot;usb_storage&quot;</span> <span style="color: #a5d6ff;">&quot;usbhid&quot;</span> <span style="color: #a5d6ff;">&quot;sd_mod&quot;</span> <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="9">  <span style="color: #e6edf3;">boot</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">initrd</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">kernelModules</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="10">  <span style="color: #e6edf3;">boot</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">extraModulePackages</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">  <span style="color: #e6edf3;">nixpkgs</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">hostPlatform</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">lib</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">mkDefault</span> <span style="color: #a5d6ff;">&quot;x86_64-linux&quot;</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="13">  <span style="color: #e6edf3;">hardware</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">cpu</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">intel</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">updateMicrocode</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">lib</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">mkDefault</span> <span style="color: #e6edf3;">config</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">hardware</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">enableRedistributableFirmware</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="14">  <span style="color: #e6edf3;">boot</span><span style="color: #e6edf3;">.</span><span style="color: #e6edf3;">kernelModules</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">&#39;&#39;kvm-intel&#39;&#39;</span> <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="15">  <span style="color: #e6edf3;">fileSystems</span><span style="color: #e6edf3;">.</span><span style="color: #a5d6ff;">&quot;/boot&quot;</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">device</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;/dev/disk/by-uuid/D7F2-26FE&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">fsType</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;vfat&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="16">  <span style="color: #e6edf3;">fileSystems</span><span style="color: #e6edf3;">.</span><span style="color: #a5d6ff;">&quot;/nix&quot;</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">device</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;/dev/disk/by-uuid/bf6fd2e3-b0f2-44fe-99c5-9237ad751a48&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">fsType</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;ext4&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="17">  <span style="color: #e6edf3;">fileSystems</span><span style="color: #e6edf3;">.</span><span style="color: #a5d6ff;">&quot;/&quot;</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">device</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;/dev/disk/by-uuid/847b4009-0ae6-4219-9799-635092ea6879&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">fsType</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;ext4&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="18">  <span style="color: #e6edf3;">fileSystems</span><span style="color: #e6edf3;">.</span><span style="color: #a5d6ff;">&quot;/home&quot;</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">device</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;/dev/disk/by-uuid/f425a3b1-82e6-4c3b-89f0-cbd85e952162&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">fsType</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;ext4&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="19">  <span style="color: #e6edf3;">swapDevices</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">[</span>
</div><div class="line" data-line="20">    <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">device</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">&quot;/dev/disk/by-uuid/8c6c0ee0-9226-43e2-92fb-5adbef5225c9&quot;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">options</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">&quot;discard=once&quot;</span> <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="21">  <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">;</span>
</div><div class="line" data-line="22"><span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<p>Because of the odd permission scheme,
we need to make a new shell to record this file inside our disc,
overwriting the prior config.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">nu</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">c</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">nix</span> <span style="color: #e6edf3;">machine</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">disc</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">arch</span><span style="color: #e6edf3;">)</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">kernel</span><span style="color: #e6edf3;">)</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">to</span> <span style="color: #e6edf3;">nuon</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;"> | save -f &#39;</span><span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">home</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">u</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">/.nux/cell/</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">machine</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">/machine.nix&#39;</span><span style="color: #a5d6ff;">&quot;</span>
</div></code></pre>
<p>Now, we can add the kicker to the end of our <code>main</code> function;</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: #d2a8ff;">sudo</span> <span style="color: #e6edf3;">nixos-install</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">flake</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #e6edf3;">(</span><span style="color: #d2a8ff;">clone</span> <span style="color: #e6edf3;">home</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">u</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">user</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">/.nux#</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">machine</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&quot;</span>
</div></code></pre>
<h2>Build, Error, and Rebuild.</h2>
<p>From here on, I began running the code again and again.
I added a rough idea of user accounts,
and made sure the code to clone our codebases honors the chosen user.</p>
<p>I spent some hours seeing if I could cross-compile,
because I have deployed <code>nux</code> configs on both x86_64 (intel)
and <code>aarch64</code> (arm) processors before.
The problem seems deep, so I'm going to pull back.
I can choose a pre-made config
for arm or x86 on a case-by-case basis,
the configs are similar enough.</p>
<p>There seems to be an incredible delay because <a href="/gram/pool">gram:pool</a>
needs to be copied to the nix cache;
this seems to depend on an 18.5 GB <code>source</code> directory,
so the disc seems to take an endless span to build.</p>
<p>I displaced <code>/pool/disc</code> on my local computer,
so nix should be able to proceed quicker - and yep!</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">Choose</span> <span style="color: #e6edf3;">arch:</span>    <span style="color: #e6edf3;">x86_64</span>
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">Choose</span> <span style="color: #e6edf3;">kernel:</span>  <span style="color: #e6edf3;">linux</span>
</div><div class="line" data-line="3"><span style="color: #d2a8ff;">Choose</span> <span style="color: #e6edf3;">machine:</span> <span style="color: #e6edf3;">baseboard</span>
</div><div class="line" data-line="4">warning: Git tree <span style="color: #a5d6ff;">&#39;/mnt/root/.nux&#39;</span> is dirty
</div><div class="line" data-line="5">warning: Git tree <span style="color: #a5d6ff;">&#39;/mnt/root/.nux&#39;</span> is dirty
</div><div class="line" data-line="6"><span style="color: #d2a8ff;">copying</span> <span style="color: #e6edf3;">channel...</span>
</div><div class="line" data-line="7"><span style="color: #d2a8ff;">building</span> <span style="color: #e6edf3;">the</span> <span style="color: #e6edf3;">flake</span> <span style="color: #e6edf3;">in</span> <span style="color: #e6edf3;">git+file:///mnt/root/.nux...</span>
</div><div class="line" data-line="8">warning: Git tree <span style="color: #a5d6ff;">&#39;/mnt/root/.nux&#39;</span> is dirty
</div><div class="line" data-line="9"><span style="color: #d2a8ff;">evaluation</span> <span style="color: #e6edf3;">warning:</span> <span style="color: #e6edf3;">You</span> <span style="color: #e6edf3;">have</span> <span style="color: #e6edf3;">set</span> <span style="color: #e6edf3;">specialArgs.pkgs,</span> <span style="color: #e6edf3;">which</span> <span style="color: #e6edf3;">means</span> <span style="color: #e6edf3;">that</span> <span style="color: #e6edf3;">options</span> <span style="color: #e6edf3;">like</span> <span style="color: #e6edf3;">nixpkgs.config</span>
</div><div class="line" data-line="10">                    <span style="color: #d2a8ff;">and</span> <span style="color: #e6edf3;">nixpkgs.overlays</span> <span style="color: #e6edf3;">will</span> <span style="color: #e6edf3;">be</span> <span style="color: #e6edf3;">ignored.</span> <span style="color: #e6edf3;">If</span> <span style="color: #e6edf3;">you</span> <span style="color: #e6edf3;">wish</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">reuse</span> <span style="color: #e6edf3;">an</span> <span style="color: #e6edf3;">already</span> <span style="color: #e6edf3;">created</span>
</div><div class="line" data-line="11">                    <span style="color: #d2a8ff;">pkgs</span><span style="color: #e6edf3;">,</span> which you know is configured correctly for this NixOS configuration<span style="color: #e6edf3;">,</span>
</div><div class="line" data-line="12">                    <span style="color: #d2a8ff;">please</span> <span style="color: #e6edf3;">import</span> <span style="color: #e6edf3;">the</span> <span style="color: #a5d6ff;">`nixosModules.readOnlyPkgs`</span> <span style="color: #e6edf3;">module</span> <span style="color: #e6edf3;">from</span> <span style="color: #e6edf3;">the</span> <span style="color: #e6edf3;">nixpkgs</span> <span style="color: #e6edf3;">flake</span> <span style="color: #e6edf3;">or</span>
</div><div class="line" data-line="13">                    <span style="color: #a5d6ff;">`(modulesPath + &quot;/misc/nixpkgs/read-only.nix&quot;), and set `</span><span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">nixpkgs.pkgs</span> <span style="color: #e6edf3;">=</span> <span style="color: #e6edf3;">&lt;your</span> <span style="color: #e6edf3;">pkgs&gt;</span><span style="color: #e6edf3;">;</span> <span style="color: #e6edf3;">&rbrace;</span><span style="color: #a5d6ff;">`.
</div><div class="line" data-line="14">                    This properly disables the ignored options to prevent future surprises.
</div><div class="line" data-line="15">evaluation warning: Using &#39;addressConfig&#39; is deprecated! Move all attributes inside one level up and remove it.
</div><div class="line" data-line="16">evaluation warning: Using &#39;addressConfig&#39; is deprecated! Move all attributes inside one level up and remove it.
</div><div class="line" data-line="17">evaluation warning: Using &#39;ipv6PrefixConfig&#39; is deprecated! Move all attributes inside one level up and remove it.
</div><div class="line" data-line="18">installing the boot loader...
</div><div class="line" data-line="19">setting up /etc...
</div><div class="line" data-line="20">Created &quot;/boot/EFI&quot;.
</div><div class="line" data-line="21">Created &quot;/boot/EFI/systemd&quot;.
</div><div class="line" data-line="22">Created &quot;/boot/EFI/BOOT&quot;.
</div><div class="line" data-line="23">Created &quot;/boot/loader&quot;.
</div><div class="line" data-line="24">Created &quot;/boot/loader/keys&quot;.
</div><div class="line" data-line="25">Created &quot;/boot/loader/entries&quot;.
</div><div class="line" data-line="26">Created &quot;/boot/EFI/Linux&quot;.
</div><div class="line" data-line="27">Copied &quot;/nix/store/kiplbb6yv7rmjf21hf9ky01b9kmgmnqn-systemd-257.10/lib/systemd/boot/efi/systemd-bootx64.efi&quot; to &quot;/boot/EFI/systemd/systemd-bootx64.efi&quot;.
</div><div class="line" data-line="28">Copied &quot;/nix/store/kiplbb6yv7rmjf21hf9ky01b9kmgmnqn-systemd-257.10/lib/systemd/boot/efi/systemd-bootx64.efi&quot; to &quot;/boot/EFI/BOOT/BOOTX64.EFI&quot;.
</div><div class="line" data-line="29">Random seed file /boot/loader/random-seed successfully written (32 bytes).
</div><div class="line" data-line="30">Created EFI boot entry &quot;Linux Boot Manager&quot;.
</div><div class="line" data-line="31">setting up /etc...
</div><div class="line" data-line="32">setting up /etc...
</div><div class="line" data-line="33">setting root password...
</div><div class="line" data-line="34">New password:
</div><div class="line" data-line="35">Retype new password:
</div><div class="line" data-line="36">passwd: password updated successfully
</div><div class="line" data-line="37">installation finished!
</div><div class="line" data-line="38"></span>
</div></code></pre>
<p>Now to <code>reboot</code> and see...</p>
<hr />
<h2>Disc Label Problems.</h2>
<p>All my nice code for binding disc labels to nix code seems to be...
meh.</p>
<p>I guess I should say - and perhaps already did -
that disc labels can be super fickle.</p>
<p>I spent around six build cycles trying to map the disc based on ID / UUID / label,
by the disc and by the partition, and during the boot cycle none of these picked up.
I have no idea how these labels are applied during phase one of nixos boot.</p>
<p>The piece I did know of is that my specific computer has an internal disc bay,
and that shows up as <code>/dev/nvme0n1</code>. This had been my final chance at a boot sequence.</p>
<p>I re-coded the <code>nix machine</code> command to take an <code>aim</code>,
and placed each partition according to the <code>aim</code> of the disc.
This means that the boot is going to be much less generic than I'd hoped,
and I do plan to come back to this problem,
and look deeper at the phase one boot sequence.</p>
<p>For now, I chose <code>nvme0n1p</code> from the menu and imaged the disc.
I ran <code>shutdown now</code>, opened the disc enclosure and my laptop,
and exchanged the memory cards.</p>
<p>I pressed the power cycle, and held my breath.</p>
<p>The disc booted.</p>
<hr />
<h2>Epilogue.</h2>
<p>For the remainder of the day I'm going to be in manual mode,
because I need to be on the road soon as possible (as usual!).
My main issues are to hook up networking,
and then drop nebula certificates onto the machine so I can log in from anyplace.</p>
<p>From there, I'll be able to redeploy the app and share this saga with you all.
Look for the code on <a href="/gram/nue/flash.nu">gram:nue/flash.nu</a>.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Re: Deploy</link>
        <guid isPermaLink="false">2025-12-31.Re: Deploy</guid>
        <pubDate>Wed, 31 Dec 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Gone, numb.</title>
        <description><![CDATA[
          
          <hr/>

          <p>Years ago I'd been relaxing alongside my brother and some of his friends from high school,
at our parent's home where they began their retirement in Michigan a few years ago.</p>
<p>Around October - December, I'd guess -
we'd been outside for a fire because they're back in the woods,
and seems like there hadn't been snow yet that year
because someone began speaking of the lake,
down the hill and through the swamp, where we had spent a few years
building a boardwalk to gain access to the small pond called Quiggle Lake.</p>
<p>Quiggle, oddly, is an old name of some ancestors on my mom's side.
Unsure how we peeled off from that group,
or how my parents found the old Quiggle farm to retire on.
They bought the place from the German architect who had designed the home,
after his messy divorce. Sounds like he left behind the magnificent lodge
that he had designed from the bare scraps of his dreams,
where he had plans to raise his grandchildren,
and he shuffled off to a small apartment building for his old age instead.</p>
<p>Plans are easier to make than to keep.</p>
<hr />
<p>Someone began speaking of the lake,
and from the chill of the air we were beginning to plan a polar plunge,
where we go leap into the deep dense abyss,
sense the pain and panic of the scenario,
and scramble back up the ladder and the boardwalk and the hill
to have a second plunge in the hot tub, near the fire.</p>
<p>I'd been eager, and one of my bro's pals also,
so we braced up and headed there.</p>
<p>On the end of the dock we felt the cold air coursing by,
and decided to hold hands as we ran and leap'd from the floating boards.</p>
<p>In the air, I held his hand and he began pulling away.
For a moment his recoil pulled us closer together, I guess -
and then the cold rushed in.</p>
<p>Cold can make you numb, though you need to embrace it for long enough
if that's going to happen. Usually, cold makes you panic -
there's no pain, in a physical-harm sense,
though an unconditioned brain
usually sees panic and pain through the same lens. You become shocked.</p>
<p>For us, the shock is soon rewarded by a dip and a soak in the hot tub up the hill.
I've seen that pal once since,
at my brother's marriage ceremony in San Gregorio California,
a rare gathering we all arranged during the lonely pandemic years.</p>
<hr />
<p>Cold can make you numb,
though you need to embrace it for long enough if that's going to happen.</p>
<p>The sensation begins as shock,
and I shared the shock I had
from a polar plunge in a Michigan lake.</p>
<p>I'd like to share in the shock all of us are sensing this season,
learning of the cold scene surrounding us,
and in the early moments of recognizing the harms we can slip into.</p>
<hr />
<video controls>
  <source src="https://share.operand.online/gram/page/share/2025-12-25.eps.webm" type="video/webm"/>
</video>
<p><a href="https://operand.online/gram/eps">Sorry, hours passed</a>.
<a href="https://www.justice.gov/epstein/files/DataSet%208/EFTA00025010.pdf">There had been something to take care of</a>.</p>
<hr />
<p>I'd like to share some of my procedures for exploring records,
because the more people seeing the depths,
the more there is to discuss.</p>
<p>There's a shock from the exposure,
and a panic begins to place a grip and a horrible hold;
so keep company you can rely on and reach for a caring hand.</p>
<hr />
<p>I used to have a scheme for easing my discomfort around people;
my body dysmorphia has been really serious in years prior,
and in my adolescence I was anxious around the idea of sex.</p>
<p>My biological parents were raised in Michigan,
so I'm rather sure they have no idea sex is possible.</p>
<p>I was raised on the East coast near Philadelphia,
so friends around school would discuss casual hookups
that would make me blush, in my grandmother's place.</p>
<p>Being so aroused, and unable to find the language for my predicament,
I learned that you can ease the quickening qualms of pubescence
by focusing your mind on challenges, such as math puzzles.</p>
<p><a href="https://www.justice.gov/epstein/files/DataSet%208/EFTA00025010.pdf">Here are some number puzzles that may help hush your ol' bones.</a></p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">1984 - 13 = 1971
</div><div class="line" data-line="2">2025 - 79 = 1946
</div><div class="line" data-line="3">1984 - 1946 = 38
</div><div class="line" data-line="4">13 + 13 + 13 = 39
</div></code></pre>
<hr />
<p>Can you do simple maths in your head,
especially during occasions where you are becoming aroused?</p>
<p>How do your physiological conditions
make it challenging or easy to go numb,
so as to focus on numbers such as dates and years?</p>
<p>Do your mental conditions
keep you from seeing, or thinking, or empathizing clearly,
especially when you are called upon
to relate intimately and compassionately?</p>
<p>Maybe I'm thinking too much like my dad,
who had a career in finance
and did a bunch to emphasize math problems.</p>
<p>He is usually clueless,
though occasionally he sees when the scene fails to add up.
He likes to say, if you find yourself in a hole - stop digging.</p>
<hr />
<p>Quiggle Lake is deep, and the bottom surface is murky and silty,
so the rumor passed around is that indigenous people
said the lake had no bottom to it.</p>
<p>Seems too deep for something its size,
and maybe someday there could be a chance
to use submersible cameras or scanners around there.</p>
<p>Being from Michigan,
I feel like water is a calling as much as a surrounding.
Sure feels ethereal when you drop something meaningful,
and realize some things are impossible to undo;
some burdens and losses that mark a mind by their absence,
more than they had a chance to, by their presence.</p>
<hr />
<p>As I said in the page I prepared mid-day...</p>
<blockquote>
<p>Please email <a href="mailto:public@operand.online">public@operand.online</a> if you'd like to discuss, or ask for help, or lend help, in examining this record collection.</p>
</blockquote>
<p>The immediate concern when you are flooded in shock,
is how to reduce your panic by pursuing a clear course of action.</p>
<p>Occasionally,
this becomes your chance to explore how capable you really are.
Perhaps you had failed to prepare the clothes to dry off properly,
so you need to see how quickly you can run to a cozy perch in the House.</p>
<p>Perhaps you also realize you need to increase your circulation,
and blood pressure and glucose levels,
because the shock has knock-on effects.
I like to keep fresh produce around for these emergencies,
such as oranges and peaches.</p>
<p>They go together,
although mind the bitterness and be ready for the fuzz.</p>
<p>These approaches are sure to bring you back to your senses;
as a cold plunge is accompanied by the anguish of panic,
simple remedies are crucial, regardless of how commonly used,
and are your only recourse during such unusual horrors.</p>
<hr />
<p>Remember, hold people close;
and hold your breath as you go under.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Gone, numb.</link>
        <guid isPermaLink="false">2025-12-25.Gone, numb.</guid>
        <pubDate>Thu, 25 Dec 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Lab Proposal</title>
        <description><![CDATA[
          
          <hr/>

          <p>You see the wind-up, and here's the pitch.</p>
<hr />
<h1>Build Missing Pieces, in Public.</h1>
<p>Operand Company has an ongoing marriage to open-source programming.
This is a challenging dynamic to uphold,
because the year is 2025 and we're all challenged beyond measure.
Global telepathy landed on Earth around 45 years ago,
and in 45 small years all of us slipped loose our sanity.</p>
<p>In the end, global communication really sucks.
There's so many people to care for, so much pain to sense,
that all of us go numb from the simple reckoning.</p>
<p>There's no turning back the dial on this one, though.
The speedometer is cranked up and the brakes line snapped,
so let's keep heading for the open spaces and seek
a means of adding some friction to the mix.</p>
<p>Here's how to build some new brakes into the speeding global economy,
at 299,792,458 meters per second. Buckle up.</p>
<hr />
<h2>Missing Piece # 1: Media ON-line (MON)</h2>
<p>Music production is big business, and so are the programs used to make modern songs.
You need sample packs, percussion patterns, bass lines, input controllers for MIDI.
Then you get into live playback and recording, using loop pedals and sequencers.
You can build a full rack of gear,
for plug-and-play operation of your precisely-tuned signals.</p>
<p>Many people leap the queue, and purchase Logic Studio, ProTools, Ableton, or BitWig.
These programs are the big incumbents, and there are others besides.
The open-source choices are unable to keep pace;
although more of the building blocks for these programs are ready to go than ever before.</p>
<p>Full programming languages and sound-rendering playgrounds are up and running today:
<a href="https://faust.grame.fr/">Faust</a>, <a href="https://strudel.cc/">Strudel</a>, and <a href="https://vcvrack.com/Rack">VCV Rack</a> are the primaries.
Of these, more colourful combinations can be mixed.</p>
<p>Audio? Sounds like a good place to begin, sure.
I'm especially eager to see how graphics and motion can be blended into the mix;
made of a signal, channel, frame - all the same.
You may also see some <a href="https://friction.graphics/">Friction</a> animations
used to explain coding ideas on this domain soon!</p>
<p>Open Source programming has a rare chance to leap a full industry ahead in the music space,
based on research being done in a field of programming called <a href="https://www.inkandswitch.com/local-first-software">Local-First</a>;
mainly based on a collaboration library called <a href="https://automerge.org">Automerge</a> by <a href="https://inkandswitch.com">Ink and Switch</a>
alongside a messaging layer called <a href="https://www.iroh.computer">Iroh</a> by <a href="https://n0.computer">number0</a>.</p>
<p>Sorry, in build-mode already. Hurry up and help!</p>
<p>These programming approaches enable full production groups,
small media businesses, and independent band members
to all log onto the same program space,
modifying the same media landscape with all cursors on one page.</p>
<p>I've spoken to band members who assembled albums
by emailing home recordings to one another.</p>
<p>Seriously, dudes. Upgrade already!</p>
<p>Build in the open, or share your media broadly
so more people can remix than anyone heresofar has imagined possible.</p>
<p>The age of open-source code
needs to embrace and enable the age of open-source media.</p>
<blockquote>
<p>Pass the mic around!
I need that new sound.
(open-mic freestyle session at <a href="https://www.7drumcity.com/the-pocket.html">The Pocket, DC</a>)</p>
</blockquote>
<h2>Missing Piece # 2: 3D-grees (D3G)</h2>
<p>Once you're done splicing Faust, Strudel and VCV Rack -
hold on, hurry up!</p>
<p>We're gonna take on this one in parallel.
To begin, here's some background on how open-source is coming along in realspace.</p>
<div style="position:relative;height:0;padding-bottom:56.25%">
<iframe src="https://embed.ted.com/talks/marcin_jakubowski_open_sourced_blueprints_for_civilization" width="1024px" height="576px" title="Open-sourced blueprints for civilization" style="position:absolute;left:0;top:0;width:100%;height:100%"  frameborder="0" scrolling="no" allowfullscreen>
</iframe>
</div>
<p>If you click around the <a href="https://opensourceecology.dozuki.com/c/Root">documentation</a> pages of <a href="https://www.opensourceecology.org/">Open Source Ecology</a>,
you'll come across designs for fully-functional housing modules,
industrial-grade farm equipment, a car, a bakery oven, bioplastics extruders and welders --
seriously, go click on the <a href="https://opensourceecology.dozuki.com/c/Root">documentation</a> and be as amazed as I am.</p>
<p>All of this gear is designed to be rapidly-reproducible from basic supplies.
These designs can be passed freely across the globe
for a shipping fee of zero point zero.
Once someone with a need has the designs, though --
how are they to use them?</p>
<p>Even basic 3d-printing has had a hurdle to hop for beginners,
and many are limited in the field by the lack of knowledge of 3d-modeling programs.
3d catalogues like <a href="https://www.thingiverse.com">Thingiverse</a>, <a href="https://thangs.com">Thangs</a>,
and company are all good for the quick fix,
but complex pieces are held up from - existence? production? realization? -
because so many people need to learn complex modeling programs.</p>
<p>Again, the industry has been siezed up in an iron-clad grip
by <a href="https://www.solidworks.com">SolidWorks</a>, <a href="https://www.autodesk.com">AutoDesk</a>'s <a href="https://www.autodesk.com/products/fusion-360/overview">Fusion360</a>, and now the modern challenger <a href="https://zoo.dev/">Zoo</a>.
These and similar programs that place the opening bid at a corporate or academic license.</p>
<p>Such predatory pricing policies place precarious pressures
precisely on pupils preparing precious public production plans.
Please, people.</p>
<p>Already in this space? If you're dedicated to building re-usable designs,
you're likely using the cumbersome combination of <a href="https://openscad.org/">OpenSCAD</a> or <a href="https://www.freecad.org/">FreeCAD</a>.
Perhaps you've had to bend <a href="https://www.blender.org/">Blender</a>, a 3d-animation program,
to the requirements of solid engineering.
<a href="https://www.shapr3d.com/">Shapr3d</a> promises to do all they can to lock your designs in the cloud
until they're properly mined for machine-learning models.
If you're using anything else that doesn't require corporate or academic sponsorship,
please message me because there's a species on Earth that dearly needs to know about it.</p>
<p>So, the moment we've all been eagerly asking for:
a mission up to the serious skills
of all those misguided and misanthropic
independent game production businesses (mine included?).</p>
<p>People know how to do 3d modeling for games,
and they'll push silicon to the edge of physics and back
for a chance to see the machine humming through complex scenarios.</p>
<p>A simple forum and <strong>all the moderation</strong> should be all it takes
to get this ball rolling. And screws turning. And cylinders firing.</p>
<p>Solid plan!</p>
<h2>Missing Piece # 3: Mesh INDex (MIND)</h2>
<p>Here's a lesser-recognized issue to cap off the tables.</p>
<p>I've heard here and there, rumors of a &quot;graph database&quot;, called <a href="https://neo4j.com">Neo4j</a>
that is able to accomplish some miraculous indexing and domain-modeling challenges.</p>
<p>In this sense, &quot;domain-modeling&quot; means
we are no longer producing signals as in missing piece #1 (MON),
or shapes as in missing piece #2 (D3G).
We're modeling a space to explore ideas,
and the links from one idea to another.
If you've had a chance to explore <a href="https://www.wikidata.org/wiki/Wikidata:Main_Page">WikiData</a>, this needs no explanation.</p>
<p>So, I had some luck running Neo4j and quickly asked if anything else is out there.
I had a read-up on the curiously-named Apache <a href="https://tinkerpop.apache.org/providers.html">Tinkerpop</a>,
which has a nice summary of the current options for graph databases in production.
26 currently, is my enumeration, and once I clicked through to the source code,
I learned that one is obsolete, one fails to support the common <a href="https://opencypher.org/">Cypher</a> query language,
and the remaining 24 are made in Java.</p>
<p>This is the reason no one uses open-source,
because there's a huge missing piece in the middle.</p>
<p><a href="https://www.youtube.com/watch?v=QoKzDyH2MEA">Databases are becoming simply incredible.</a>
As long as you use relational databases.
I could explain all that's going on these days
in <a href="https://electric-sql.com/">ElectricSQL</a>, <a href="https://jazz.tools/">Jazz</a>, <a href="https://graft.rs/">Graft</a>, and heck -
I'll throw in a bonus document-store database because we already spoke of <a href="https://automerge.org">Automerge</a>.</p>
<p>All that's going on these days in <a href="https://electric-sql.com/">ElectricSQL</a>, <a href="https://jazz.tools/">Jazz</a>, <a href="https://graft.rs/">Graft</a>, and <a href="https://automerge.org">Automerge</a> -
is sync.</p>
<p><a href="https://www.youtube.com/@localfirstconf/videos">Sync is here</a>.
Sync is good.
Use sync.</p>
<p>Sync also needs to happen in graph databases.</p>
<p>Sync to graph databases means offline Wikipedia -
only the pages you care for, or the search results you choose,
or the idea you're researching plus the pages reachable in 3 - no, 4 clicks.
Sync means offline mode. Offline social media. Sync means &quot;I SAID DO NOT DISTURB!&quot;</p>
<p>Sync means so much, and graph exploration means so much,
because there's simply too much of this online mess to care for all of it at once.
So graph the pieces you see, map the links you care to see,
and finally query using a model that has a clear analogy
to the way we all already see the online sphere.</p>
<p>Once you see the problem space clearly,
you can make the connections you need.
These graphing problems are the basis of Operand's <a href="https://d2lang.com/">diagrams in D2</a>;
these nuanced maps could be made in seconds,
from real sources rather than LLM hallucinations.</p>
<p>Best yet? That <a href="https://opencypher.org/">Cypher</a> query language I lobbed up earlier
is really <a href="https://opencypher.org/">OpenCypher</a>,
a full spec of how graph databases should operate.
A full spec that can be clicked into any programming language we choose (<a href="https://rust-lang.org/">Rust</a>)
to put production into hyperspeed.</p>
<p>Since we're in Rust already,
you know we're going for client-side <a href="https://webassembly.org/">webassembly</a>.
You can be sure we're going to do in-memory programming-language embedding,
so you can graph database from your <a href="https://www.python.org/">Python</a> or your <a href="https://www.ruby-lang.org/en/">Ruby</a> or your <a href="https://elixir-lang.org/">Elixir</a> or your <a href="https://go.dev/">Go</a>.
Rust means all languages are good to go from day one,
and the people who like clicking the keys on their mouse more than on their keyboard
are on equal ground for exploring the scenes.</p>
<p><a href="https://meta.wikimedia.org/wiki/Research:Wikipedia_Knowledge_Graph_with_DeepDive">There's so much to explore!</a>
And so much more we can do,
once we add meaning to and purpose to the scene.</p>
<hr />
<p>I hope to speak on these ideas soon,
and perhaps record some ensuing discussions.
There shall be forums for sure.
Please message <a href="mailto:sponsor@operand.online">sponsor@operand.online</a>,
because my parents are sick of paying for my 5g charges,
and the builders in Baltimore are gulping up all our cheap ramen.</p>
<p>Peace, please people. Happy to help.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Lab Proposal</link>
        <guid isPermaLink="false">2025-12-20.Lab Proposal</guid>
        <pubDate>Sat, 20 Dec 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>2025-12 / Build Diagram</title>
        <description><![CDATA[
          
          <hr/>

          <p>So as to keep my mind as clear as possible, here are my plans. again.</p>
<h1>Pool</h1>
<p>Pool is designed to be the hub of your local-web;
keeping your primary relay online and secure
by using MicroVMs and local networking
to deploy and manage open-source web apps.</p>
<p><a href="https://share.operand.online/gram/page/share/2025.build.diagram/pool.svg">POOL: <img src="https://share.operand.online/gram/page/share/2025.build.diagram/pool.svg" alt="POOL" /></a></p>
<hr />
<h1>Relay</h1>
<p>Relay is a desktop or local-web app,
designed to run sandboxed peer-to-peer communication using <a href="https://atomvm.org">AtomVM</a>,
and using permissioned message channels to manage OS operations,
through a local rust compile-and-plugin procedure.</p>
<p><a href="https://share.operand.online/gram/page/share/2025.build.diagram/relay.svg">RELAY: <img src="https://share.operand.online/gram/page/share/2025.build.diagram/relay.svg" alt="RELAY" /></a></p>
<hr />
        ]]></description>
        <link>https://operand.online/chronicle/2025-12 / Build Diagram</link>
        <guid isPermaLink="false">2025-11-26.2025-12 / Build Diagram</guid>
        <pubDate>Wed, 26 Nov 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Program Drop</title>
        <description><![CDATA[
          
          <hr/>

          <p>Ages ago at HacDC, in October 2023, people sparked my curiosity for NixOS.
Early on, I became inspired by a guy named <code>astro</code>
who was building the slickest VM-management layer I’d seen.</p>
<p><a href="https://media.ccc.de/v/nixcon-2023-34861-microvm-nix">Obligatory CCC link enclosed</a>.</p>
<p>2 years passed as I learned enough Nix to make sense of the docs. I have gone without docker or containers for too damn long. No one should need to learn all the edge cases of <code>astro</code>’s package, and all of us should be using his approach. So, how do?</p>
<p>I’m rather pleased today to launch a new package, for pooling programs as NixOS VMs:</p>
<p><a href="/gram/pool">gram/pool</a></p>
<h2>Launch Dialogues</h2>
<blockquote>
<p>Calliope, 1:05 AM</p>
</blockquote>
<p>There has been so much consideration placed behind this,
I'm thrilled to begin building up from here.
Maybe I'll finally climb back down from the<code>ops</code> peak soon
and head back to the rolling hills of app design.</p>
<blockquote>
<p>Calliope, 10:56 AM</p>
</blockquote>
<p>Here is a real deployment-grade program running on pool.
This dense screen is displaying, from left to right, top-to-bottom:</p>
<ul>
<li>A running microVM, on a local-only IP address of 10.0.0.31, running Neo4j
<ul>
<li><code>lsmem</code></li>
<li><code>ip a</code></li>
<li><code>journalctl -fu neo4j</code></li>
</ul>
</li>
<li>An Elixir/Phoenix connection to this Neo4j db
<ul>
<li>setup guide (neo4j password)</li>
<li>phoenix config</li>
<li>phoenix console using boltx library</li>
</ul>
</li>
<li><a href="https://microvm-nix.github.io/microvm.nix">https://microvm-nix.github.io/microvm.nix</a></li>
<li><a href="https://hexdocs.pm/boltx/readme.html">https://hexdocs.pm/boltx/readme.html</a></li>
</ul>
<p>Search for neo4j on:
<a href="https://operand.online/gram/pool/flake.nix">https://operand.online/gram/pool/flake.nix</a></p>
<p>and see more options on:
<a href="https://search.nixos.org/options?channel=25.05&amp;query=services.neo4j">https://search.nixos.org/options?channel=25.05&amp;query=services.neo4j</a></p>
<p>There are a half-dozen other apps I'd like to add in, at a pace of 2-3 per day,
before I give this a spin on my lab at the Baltimore Node hackerspace.</p>
<blockquote>
<p>Calliope, 11:03 AM</p>
</blockquote>
<p>Remaining issues:</p>
<ul>
<li>
<p>per-pod namespacing</p>
<blockquote>
<p>VMs are now named only per-app,
so only one copy of an app can be running at any moment.
This error comes across when accessing <code>tap</code> on <code>/dev/net/tun</code>.</p>
</blockquote>
</li>
<li>
<p>reliable networking</p>
<blockquote>
<p><a href="https://nebula.defined.net/">Nebula</a> should be used to ensure
programs can be dropped on myriad machines in an ad-hoc manner,
and IP mappings and routing remain in place.</p>
</blockquote>
</li>
<li>
<p>prepare subdomains using caddy</p>
<blockquote>
<p>caddy can proxy traffic and assign SSL certs,
for easy domain-name management;
with all unencrypted networking confined to a single machine.</p>
</blockquote>
</li>
</ul>
        ]]></description>
        <link>https://operand.online/chronicle/Program Drop</link>
        <guid isPermaLink="false">2025-10-13.Program Drop</guid>
        <pubDate>Mon, 13 Oct 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Lab Rebuild / Summer 2025</title>
        <description><![CDATA[
          
          <hr/>

          <p>For me, August 2025 is going to remain
the most spectacularly unplanned and chaotic mess of garbled memories,
where each day carried so much nuance,
and so many challenges,
that there has been scarce occasion to pause and breathe,
to reshape the experiences into more than the layered percussions
of sun, moon, sea, sail, spoke, and signal.</p>
<p>I hope there is a chance to re-use that opening paragraph,
in a closer examination of the days of August,
only I need to begin by describing changes happening across this domain.</p>
<p>If you happen to be reading this,
or perhaps if your RSS reader is doing a refresh,
before 6pm on Thurs 09-04,
you may only see a partial essay.</p>
<hr />
<h2>Background: Realizing a long-held dream.</h2>
<p>I had good reason, cause, and chance to move my app deployment,
from the basement where I lease a static IP address,
to my local laptop, which I've had to leave up and running all night,
in a hacker-space called the <a href="baltimorenode.org">Baltimore Node</a>.</p>
<p>I'm sure others have likely managed before me,
a production online app running from a laptop.
In my case I am especially pleased to do so,
as a reinforcement of the aims described
in the business' <a href="/chronicle/corp">incorporación proposal</a>.</p>
<p>When I composed the proposal in 2024 I was inexperienced in essays,
and I need to apologize to the DC employees
who had to read through that rubbish;
moreso because as I began this company I was also in a phase
of psychedelic experimentación.</p>
<p>If you dig through that essay,
in a sense a legally binding one,
you'll see the key theme is an idea I call &quot;sublimación&quot;.</p>
<p>I realize now that my founding essay
was simply a poor re-hashing of an idea
explained much more clearly and simply
in the <a href="https://www.inkandswitch.com/essay/local-first/">Local-First Essay</a> by Ink &amp; Switch.
They open by saying:</p>
<blockquote>
<p>Cloud apps like Google Docs and Trello are popular
because they enable real-time collaboration with colleagues,
and they make it easy for us to access our work from all of our devices.
However, by centralizing data storage on servers,
cloud apps also take away ownership and agency from users.
If a service shuts down, the software stops functioning,
and data created with that software is lost.</p>
</blockquote>
<p>It has been said before in the &quot;local-first space&quot;
that numerous people are reaching the same conclusion
from different initial conditions.
The realización that our building processes are flawed,
doomed to someday fail, is a process that can occur in a dispersed manner,
like the many [origins of infintessimal calculus],
or the rich explosion of humanist philosophies during the <a href="https://en.wikipedia.org/wiki/Axial_Age">Axial Age</a></p>
<p>However the conclusion is reached, here we are.</p>
<p>Each of hundreds of programmers and small businesses
are choosing a small niche in the local-first space.
<a href="https://www.localfirstsoftware.com/">A full index</a> is a good place to begin for end-users
who are sick of usual app-store norms,
and <a href="https://lofi.so/">LoFi.so</a> has many resources to choose from,
including the <a href="https://discord.gg/ZRrwZxn4rW">Local-First Discord</a>.
Need to read more? See <a href="https://www.localfirstnews.com/2025-09-04/">Local-First News</a>.</p>
<p>The area I chose as a primary concern is unusual for the space,
which is likely why I had been such a late-comer,
missing the forest for the trees.</p>
<p>I chose to focus on web-app deployments.</p>
<hr />
<h2>2025 Aim: Reliable Deploys</h2>
<p>Of course, 'web-app' can be seen as an antithesis to 'local-first'.
If you agree, maybe I can change your mind.</p>
<p>Yesterday I came across an app I'd like to build into the mix,
called <a href="https://github.com/go-shiori/shiori">Shiori</a>. The purpose is to aggregate and label bookmarks,
and enable an offline-reader mode for easy mobile access.
There is no cloud-based company managing the program,
and the features drop it categorically into the local-first space.</p>
<p>Shiori remains a web-app,
and is capable enough for many users to access,
although the primary audience is for a single-user per deployment.
To run Shiori, users are encouraged to launch a web domain themselves.</p>
<p>Many apps are being produced in this manner
because of the rising popularity of home-labbing,
perhaps known to some as self-hosting.
Besides, the web has made up some really amazing norms
for apps that are dynamic and accessible,
and is much more pleasing to build for than most &quot;native&quot; OS apps.</p>
<p>To launch your app's domain,
the normal approach is to lease a machine from a cloud company.
In this case, for such a simple app, the easiest option may be <a href="https://www.pikapods.com/apps">PikaPods</a>.
More experienced coders are familiar - and correspondingly sick of -
flexible options like <a href="https://www.linode.com/">Linode</a> and <a href="https://www.digitalocean.com/">DigitalOcean</a>,
which probably are happy to lend our login credentials
to the nearest NSA field office at the mere whisper of enforcement.</p>
<p>So, until now every domain manager had two choices:</p>
<ul>
<li>
<p>add to Amazon AWS or Akamai's global reach,
by signing on to use their machines
(usually repackaged by a cloud middle-manager)</p>
</li>
<li>
<p>order a business internet plan,
and consent to days-on-end
of random phone calls with your ISP,
to order a static IP address rigged up.</p>
</li>
</ul>
<p>I'm partial to the second option,
because reaching local-first dominance
has to both amplify the share of local apps and programs,
and crucially,
<strong>reduce our dependence on cloud data centers</strong>.</p>
<p>I'd like to see a report each billing cycle,
describing how much water my apps drank
while they were being cooled by Google's
electron-warehouse plumbing.</p>
<p>The deplorable shape of our industry is plain to see
when passing through Ashburn, VA -
a close suburb for me to reach,
where there is no business, no one in sight,
and only a bland shopping mall for amusement.</p>
<p>These are human prices of our industry
that need to be recognized and addressed.</p>
<hr />
<h2>March 2025: Baseline Lab</h2>
<p>Although my company's purpose is to bring the web back to the home,
a further complicación had been... my lack of a home.</p>
<p>I am nomadic,
carrying my home around in a pickup truck or a sailboat each day,
and so I'd like to accomplish
as many of my aims as possible
while being as locación-independent as possible.</p>
<p>For the static IP address, I called up my pals in Upper Marlboro, MD;
there is a home there full of the most generous people I know.
I arranged for a business internet line to their home,
and placed a couple machines in their basement.</p>
<p>I'd been commuting from place to place,
and would occasionally find a chance to go by and check on the machines,
manage upgrades, plug and unplug cords.
The biggest flub had been encrypting the boot drive;
each reboot required hands on a physical keybard.
Nonetheless, the process remained in place through much of August.
Six months on a static IP address!</p>
<p>Then... let's discuss how August went.</p>
<hr />
<h2>(beginning) August 2025: Sailing Fiasco</h2>
<p>The &quot;friend's basement&quot; playbook is, eh,
more or less manageable when you live in close proximity,
are capable of a deep bond of co-reliance,
and are equal shareholders in the success of the program.</p>
<p>I'm unsure how I scored on any one of those marks,
though the deployment held up until
a small crisis landed on Aug 1,
requiring me to immediately set sail.</p>
<p>A sailboat is an ideal place to run cyber exercises.
Because there is no escape from the physical isolación,
the only connección you are likely to find to other humans
has to be relayed to you through radio signals.</p>
<p>I dove deep into the <a href="https://selfhosted.show/">Self-Hosted Podcast</a>
and <a href="https://linuxunplugged.com/">Linux Unplugged</a>,
and called into many <a href="https://compbio.dmvpetridish.com/">cancer research calls</a>,
where the group was far more eager (or enabled)
for me to put the &quot;comp&quot; into &quot;computational biology&quot;
than they were to put it into &quot;compensation&quot;.</p>
<p>Of course, I had experiments to run.
I launched <a href="https://www.mumble.info/">Mumble</a>.
I launched <a href="https://www.traccar.org/">Traccar</a>.
I launched <a href="https://n8n.io/">n8n</a>, and shoe-horned comment fields into the essay pages.</p>
<p>And I broke the lab. Again. And again.</p>
<p>To the dear residents of <u>Larry Cat House</u>,</p>
<blockquote>
<p>I am so so sorry, sincerely and immensely so,
for the endless calls on Signal
where I explained complex passcodes and cable-plugging procedures,
and the &quot;quick sanity checks&quot; where none was found.</p>
</blockquote>
<p>I had to balance downtime for a <a href="https://book.painawayofphilly.com">core-business client app</a>,
my need for experimentación as a coping mechanism, for lonely breezeless days,
and the superb annoyance I caused my pals back on land each day,
immediately after promising it (probably?) wouldn't happen again.</p>
<p>I hung on like this until I got back to land,
and spent one day fixing up the lab
to get the blog running again before heading to <a href="https://hope.net/">HOPE</a>.
I promised myself I would do no experiments while I was in NYC,
and besides I had no more energy to do so.</p>
<p>I was getting enough of a cyber-social buzz from the conference,
and NYC is the deepest end of the social spectrum to drown in,
after two weeks on a rolling bouncing bay.</p>
<p>After NYC, I headed back to the lab.
I had ideas to manage, more <a href="/chronicle/publishing.plan">grand plans</a>.
I had decided to separate the apps and the experiments,
leave the production app running as I brought the bulk of the lab
to Baltimore Node, where I could exhaust days on end
running necessary experiments and building at high speed.</p>
<p>With all but the core production machine &quot;baseboard&quot; loaded into my truck,
I locked the door to my friend's house behind me
and began to pull out of their neighborhood.</p>
<p>Then I remembered. I should check if the app is online!</p>
<p>Not only no app, but no signal. No SSH.</p>
<p>I spun around, rang the doorbell, met the new roommate,
and pulled the final cord out of Baseline Lab.</p>
<hr />
<h2>(end) August 2025: (re)Building Blocks</h2>
<p>However much sleep I had lost in the preceding days,
I was soon to lose more.
My usually inattentive client quickly messaged me,
saying &quot;the app is down. Can we host it somewhere else?&quot;
and of course I said &quot;yes, please&quot;.</p>
<p>I recommended <a href="https://fly.io/">fly.io</a> because heck,
I'm finally beginning to recognize my mission
as a smidge on the idealistic side.
If at all possible I can keep my ideals from holding up my pals' business,
I suppose I should.</p>
<p>I burned a couple days building a proper Elixir/Phoenix <code>Dockerfile</code>,
double-checking port and IP bindings between my <code>config/*.exs</code> files,
and I <strong>finally</strong> had a reliable deployment that no longer breaks the memory limits.</p>
<p>On my breaks, I honed my process for launching NixOS on a Raspberry Pi,
and soon headed back to Larry Cat House to plug one in; then a second.</p>
<p>The first pi I launched is called <code>pebble</code>,
and for around a week this had been running the blog.
On a couple occasions, I checked in, and thought I saw
that the pi had crashed; then, a few hours or the next day,
the app would be online again.</p>
<p>Clearly, the app is seeing more than zero traffic,
and the pi is unable to keep up.
No problem; the second pi I plugged in
enabled me to experiment with <a href="https://github.com/slackhq/nebula">Nebula</a>.
Nebula, in essence, enables me to spread the lab out
to any number of geographically dispersed areas.</p>
<p>I placed some Nebula certificates on the two lab Pi's,
assigned certs for my laptop (<code>chesapeake</code>),
and with only a few days
of config &amp; network-address munging behind me,
I can finally keep a reliable connection up between my
<code>chesapeake</code>, in Baltimore, and <code>pebble</code>, in Upper Marlboro.</p>
<hr />
<h2>September 2025: Dispersed</h2>
<p>As much as I like the reliable connection between here and there,
the glory lies in the opposite direction:
I can keep up a reliable connection from <strong>there to here</strong>.</p>
<p>Remember, <code>there</code>, where <code>pebble</code> is running,
is the business line static IP address.
<code>pebble</code> is only a low-grade Raspberry Pi 4B with 2GB RAM,
purchased before I knew what to look for in a single-board computer.
<code>pebble</code> kept choking and lagging
when asked to compile markdown for a blogging engine.</p>
<p>When <code>pebble</code> can reach me here, on <code>chesapeake</code>,
a full-blown x86 coding machine, the game fully changes.
I kept the blog running at full capacity,
by disabling my idle timer through the night,
leaving the laptop plugged in to charge,
on a residential wifi connection,
reaching far higher speeds than the pi could manage.</p>
<p>I kept the blog running even as I ran Blender,
and downloaded a bunch of YouTube videos explaining how to use Blender.
I kept the blog running even as I <strong>compiled Blender from scratch</strong>,
because that's how things go on NixOS,
and there was no single hiccup in the response or lag from the app.</p>
<p>Finally, I logged on this morning and began
playing around with the essay,
and realized that as I saved my progress,
the rendered page displayed the changes -
on the public <code>://operand.online</code> domain.</p>
<p>In essence, I signed up my pals for a static IP address,
and made sure my domain's DNS records all point to that address.
Then, I rigged up Nebula and Caddy to reference an address
on a Nebula virtual-LAN; the magical, ephemeral, dispersed layer
that replaces all networking headaches with certificate-management headaches.</p>
<p>As long as Nebula and Caddy agree on an IP address for the app machine,
and Caddy and the app-machine agree on a port number for the app,
and Caddy and the app agree on a domain name,
then the app can be run on any machine, any place,
regardless of network setup.</p>
<p>Of course, this experimentation process
has required me to make serious changes
to the <a href="/chronicle/publishing.plan">business plan</a>,
so that much of what was described under <code>BASE</code>
is now marked as 'broken' in red,
and moved to <code>NODE</code>,
where I can be more hands-on with my experiments,
for much less risk.</p>
<hr />
<h2>A Moment, to Breathe</h2>
<p>Some may say I am in a precarious posición, with my business.
Why be nomadic, why go sailing, why be so un-employ-<s>ed</s> -able?
There are few role models to choose from, when breaking so many norms,
so I am lucky to rely on <a href="http://threadings.io/">essays that stretch the seams on this world.</a></p>
<p>In her essays Ismatu examines the social scenarios of her tribe,
and the consequences of being raised a child of two nacións.</p>
<p>I feel an immense bond with this composer,
who I hope I shall be lucky enough to speak to,
and collaborate alongside someday,
by my own happenstance of being born in London,
raised in Tokio, by midwestern parents.</p>
<p>Global children like us
are fully incapable of considering the nonsense
of a flat-earth hypotheses,
because we have seen the curvature of the earth
from the window seats of numerous long cross-oceanic flights.</p>
<p>Global children like us are less prone to ensnarement
by a corporate mission statement,i spun around, rang the doorbell, met the new roommate, and pulled the final cord out of baseline lab.
when we recognize that the mission ends where the state's boundary lies,
less prone to being hooked by a viral ad campaign
when we can examine a global virus campaigning through places once called home.</p>
<p>I'm sure that in the middle of the largest rapidly globalizing crisis
our species has yet encountered,
all one can hope to do is find an area where their skills can shine,
press them into full gear,
and share the consequences publicly as loud and openly as possible.</p>
<p>In my case, this consequence seems to be the simultaneous dissolución
of the core mechanic underlying the business models
of Amazon AWS, Google Cloud, and Microsoft Azure;
the mechanism laid in place by ISP providers such as Comcast, AT&amp;T, and Verizon,
many years ago when the first phone lines began being repurposed for internet purposes.</p>
<p>The static IP has been the bane of my career,
and in the end this windmill has been blown away by the deployment
of a single Raspberry Pi, running a background Nebula process.</p>
<hr />
<h2>Going ahead: a Reproducible Base</h2>
<p>Again, nearly nobody I know has a static IP address,
and more and more people I know have apps they'd like to launch,
and spare old machines lying around home with no purpose,
and gradually depreciating innards. This is the problem of sublimación;
the economic resource of silicon doomed to disuse,
by lack of access to the demanded use cases.</p>
<p>By chance, Baseline Lab is my second failed static-IP experiment;
the first one being in my parents' place of business in Michigan.
Seeing as I have two static IPs to make use of,
a business model comes to mind.</p>
<p>Soon, you'll be able to log in to <code>://operand.online</code>,
and for a choose-your-donación price,
or pay-by-bandwidth for larger apps,
you can send along your domain name to us,
and I'll issue you a Nebula certificate.
You can choose a static IP address from our list of nodes,
to use as a relay for your web app.
Any one should do, so choose based on geography.</p>
<p>You can assign your DNS records to our static IP,
and our Caddy reverse proxy can begin handling your app's
call-and-response through our Nebula mesh.</p>
<p>For memberships needing more nodes on a single mesh,
perhaps you'd be open to on-demand cert allocación &amp; revocación
from a secure app, on a dedicated nebula mesh.</p>
<p>Of course,
no one can build on such a core open-source library such as Nebula,
unless you also run open-source.
No problems here, this has been the case for Operand since day one.</p>
<p>I can see many docs pages ahead,
for gradually-sharpened essay skills to go to use.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Lab Rebuild / Summer 2025</link>
        <guid isPermaLink="false">2025-09-04.Lab Rebuild / Summer 2025</guid>
        <pubDate>Thu, 04 Sep 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Space to Build</title>
        <description><![CDATA[
          
          <hr/>

          <p>I'm beginning to imagine the nuances of a peer-to-peer product,
similar to <a href="https://livebook.dev/">LiveBook</a> and <a href="https://observablehq.com/">Observable</a>, based on <a href="https://tauri.app/">Tauri</a>,
and embracing the ideals of <a href="https://www.inkandswitch.com/local-first-software">Local First</a> programming.</p>
<p><a href="/chronicle/feudalism">Why bother?</a></p>
<p>To approach Tauri, the desktop-app layer, I am upskilling in <a href="http://rust-lang.org/">Rust</a> -
and gearing up a dependable <a href="https://webassembly.org/">webassembly</a> compiler pipeline.
Tauri 2.0 adds mobile apps to the mix, including iOS and Android.</p>
<p>My primary lang, <a href="https://elixir-lang.org/">Elixir</a>, can run code dispersed on thousands of machines,
and is the same base layer chosen by WhatsApp, Discord, and Telecom of old.
Elixir and similar langs are making inroads to webassembly through <a href="https://www.atomvm.net/">AtomVM</a>.</p>
<p>A bunch of pixels (electrons?) <a href="/chronicle/publishing.plan">have been spilled</a>
in discussion of client-side libraries, rendering pipelines,
and <a href="/chronicle/bundles">the issue of a dense bundler landscape</a>.</p>
<p>These are the pieces that I feel I needed to learn,
simply to build at the level that an end-user expects.</p>
<p>Since my first company in 2017,
I had the idea that a single human should be able
to harness the energy of machines to build useful apps,
and fly in the face of the market and industry if needed.</p>
<p>There are too many apps that I'd like to build,
to choose only one; so I focus on the process of app-making.</p>
<p>As a consequence...
I'm ready to build a seamless channel from GPU to GUI,
so people can build and share from any machine,
either in a board room or on a beach,
in café or construction,
factory floor or farm field.</p>
<hr />
<p>With all the chaos of change in the air these prior few years,
I'm sure the remaining online boom of the 2020s
has to focus on education, to rebuild a common language around our programs,
and condense new labor pools from the displaced employees of the recession.</p>
<p>Only, am I going to be the one to lead the lesson?</p>
<p>No; I only know code and how to apply code to build programs.
I'd like to learn from others,
people who manage more serious problems than code.
The program is designed around helping
people share and discuss their learnings, in any discipline.</p>
<p>I spent years helping people, young and old, learn code -
and there needs to be a clear place to land once a child outgrows Scratch.</p>
<p>I spent years among lawyers learning the nuances of the business -
and they need an app to change a spare GPU into an on-premise pipeline.</p>
<p>It is impossible for our machine learning apps
to find - or build - audiences
that resemble the era of blogs, consumer SAAS, or B2B products.
In a sense, 'audience' is no longer meaningful.</p>
<p>We need to keep in mind that a &quot;Fortune 500 Product&quot;
is now being challenged by a $500 ebay purchase.</p>
<p>We need to realize that anyone can build, if they have the space.</p>
<p>We need to make space to build.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Space to Build</link>
        <guid isPermaLink="false">2025-08-10.Space to Build</guid>
        <pubDate>Sun, 10 Aug 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Bundles of Problems.</title>
        <description><![CDATA[
          
          <hr/>

          <p>A bunch of our daily experience on our processing machines
is managed by online browsers;
these commonly run packages of code that they demand on-the-go
from relays positioned across the globe.</p>
<p>This is probably the single most compelling mechanism
of modern human communication,
and the idea is so simple and reliable
that we've come up with many incredibly nuanced
modes of description for the phenomenon.</p>
<p>To begin, the packages of code that are handled by your browser app,
are composed of a few languages operating in harmony;</p>
<ul>
<li><code>.html</code>: hyper-text markup language</li>
<li><code>.css</code>: cascading style sheets</li>
<li><code>.js</code>: java-script</li>
</ul>
<p>These have been around for years,
to the degree that if someone who has never opened a code editor
happens across a broken web page,
they are likely to be able to say which of these three languages
the error has occurred in.</p>
<p>Although the boundaries among these languages
are becoming uncommonly blurred,
mainly because of the promiscuous dalliances of <code>.js</code>
in the business of the others,
there seems to be a baseline recognition
of the purpose each one promises to uphold.</p>
<hr />
<p>To speak more of these blurred bounds;
the three languages are normally passed from a relay
to a consumer's machine
in seemingly a single moment,
and to keep this exchange as quick as possible,
millions of engineering hours are poured
into a problem space called &quot;bundling&quot;.</p>
<p>A quick index of the different bundlers through the years;
because they more or less accomplish the same aim,
and are designed to be unseen and unheard,
they become remarkably interchangeable
until one of them fails to keep up with the pace of change.</p>
<ul>
<li><a href="https://gruntjs.com">Grunt</a></li>
<li><a href="https://gulpjs.com">Gulp</a></li>
<li><a href="https://rollupjs.org">Rollup</a></li>
<li><a href="https://parceljs.org">Parcel</a></li>
<li><a href="http://esbuild.github.io">Esbuild</a></li>
<li><a href="http://vitejs.dev">Vite</a></li>
<li><a href="https://docs.deno.com/runtime/reference/bundling/">Deno bundle</a></li>
</ul>
<p>To dramatically complicate the scene,
this cambrian explosion is echoed on the opposing side
of a coder's experience:
how to manage the dependencies of a code base,
that one's app needs to rely upon,
and that are bundled up alongside the bespoke code in each app.</p>
<p>This problem is called &quot;package management&quot;,
and for the web space the canonical package index
is <a href="https://www.npmjs.com/">npmjs.com</a>.
The process of sourcing and arranging your dependency packages
can be managed by numerous programs also, such as:</p>
<ul>
<li><a href="https://www.npmjs.com/package/npm">npm</a> - node package manager</li>
<li><a href="https://bun.sh">bun</a></li>
<li><a href="https://deno.com">deno</a></li>
<li><a href="https://yarnpkg.com">yarn</a></li>
</ul>
<p>Yikes, oh no.</p>
<p>Finally, there is one more layer of choice
that a coder needs to make:</p>
<p>The bundling process, from beginning to end,
is all managed using JavaScript,
although the more dedicated engineers among us
have learned to build the core machinery in a
quicker and more reliable language,
usually <a href="https://rust-lang.org">Rust</a></p>
<p>Now, all of this code we chose to depend on needs to run somehow,
and JavaScript is considered to be rather loose around the edges.
Rather than a single simple engine to run this programming language,
the language is being pulled in many different directions,
because in essence each browser has a company of people behind the scenes,
building new ideas into their own javascript-running engines,
to get the lead compared to their competition
in market niches like mobile phones or media streaming.</p>
<p>So, again in a gradually changing landscape,
these execución engines are:</p>
<ul>
<li><a href="https://nodejs.org/en">Node.js®</a>
<ul>
<li>based on <a href="https://v8.dev">v8</a></li>
</ul>
</li>
<li><a href="https://bun.sh">bun</a></li>
<li><a href="https://deno.com">deno</a></li>
<li><a href="https://wasmtime.dev">wasmtime</a> - for special cases.</li>
</ul>
<p>Having said all this,
I can proceed to make a choice among the options
that I may be happy to build upon for years to come,
and that I may be equally happy to recommend to my peers.</p>
<hr />
<p><code>Node.js®</code> (<code>node</code>) had been the original engine in the bundling space,
and prior to its release the JavaScript language had only really been used
in web browsers. This becomes clear by examining <code>v8</code>,
which had been running in the Chromium code bases long before
being repackaged into <code>node</code>.</p>
<p>Although basically enabled the bundling scene in the olden days,
<code>node</code> seems to be lagging behind especially in the package manager space.</p>
<p>The included <code>node</code> package manager, <code>npm</code>,
began to see doppelgangers appear years ago,
such as <code>yarn</code>, which promised to be more secure and speedier,
with additional debugging features for thorny issues.
This promise played out as planned,
and <code>yarn</code> is as ubiquitous as any choice these days.</p>
<p>I used <code>yarn</code> for long enough without looking deeply at the code,
and I essentially assumed that the piece would also be replaced someday,
especially as <code>rust</code> libraries became more popular.
Sure enough, <code>bun</code> took a huge leap ahead,
and replaced both the package manager and the engine in one go.</p>
<p>For a while I had no need to make a change,
until I began a more serious examinación of <a href="https://www.inkandswitch.com/local-first-software/">local-first</a> apps.
Suddenly, the bundler problem was <strong>the problem</strong>, numero uno.</p>
<p>I eagerly applied <code>bun</code> to my peculiar mix of <a href="/gram/build">build codes</a>,
and although the package manager was running splendidly,
I was able to make no progress on the bundling problem -
for a scary span of time. Months. Seasons.
I could build, but I kept feeling things break in ambiguous directions,
and it was only this morning that I finally pinned down the location
of the problem, in the middle of this mess.</p>
<p>You see, coders have no patience;
we know that our full career is a race,
both against our younger leaner competition
who are spoiled with more graphics cards,
and against the carpal tunnel syndrome we incur,
and beckon on with each keypress.</p>
<p>The bundlers we use to build and ship our online apps
decided to help here,
and they came up with an idea called <code>hot module reloading</code>.
In essence, the bundler realizes that to make an app,
a coder needs to see what they are making -
and the bundler is standing directly in the path
from code to rendered page.</p>
<p>It is only good manners, then, to help open the doors in the corridor;
on each file change that a coder makes in their editor,
the bundler is commissioned to sense the change and reload the browser.</p>
<p>In essence,
this reduces the price of making each change by nearly 6 key-presses:</p>
<ul>
<li><code>[cmd-tab]</code> to change to the browser</li>
<li><code>[cmd-r]</code> to reload the page</li>
<li><code>[cmd-tab]</code> to regress to the editor</li>
</ul>
<p>When recording a file change requires two key-presses,
a coder can measure this as 75% savings,
on a procedure that needs to happen hundreds of times a day.
Beyond silly numerical measurements,
this is the kind of change that <strong>makes people happier</strong>,
in their employment, and ensures that they can keep their precious focus
on the problem they are hired to do.</p>
<p>If you'd like to discuss burnout and demoralización
among open-source coders, drop a reply.
There's an endless discussion that needs to be unleashed.</p>
<hr />
<p>So how did I reach my burnout phase for bundling?</p>
<p>I realize this is a core piece of the program I need to build;
to run locally, an app needs to be bundled for local consumption,
and there is no way of escaping the reliance on a bundler these days.
<a href="https://tauri.app/">Even good desktop apps</a> are based on this process.</p>
<p>But I had no confidence in the bundlers I chose -
and the problem was hidden from me.</p>
<p>Everyone raved about the bundler <a href="https://vitejs.dev">Vite</a>,
saying things were good to go out of the box,
and there was no end to what you could do.</p>
<p>In practice, I could not even get the page to reload consistently.</p>
<ul>
<li>I could bundle the code, and see the rendered page.</li>
<li>I could make a change in the code, and the page would reload.</li>
<li>Any additional changes to the code were ignored.
<ul>
<li>Even a manual browser reload ignored the changes</li>
<li>I had to re-start the bundler command to pick up any changes.</li>
</ul>
</li>
</ul>
<p>I sensibly assumed the problem was the bundler,
and looked through the dependency -
<a href="https://github.com/paulmillr/chokidar">chokidar</a>.</p>
<p>Being based on <a href="https://nixos.org/">NixOS</a> does mean
that occasionally things like this break,
but that was odd to me - I had gone through this before,
which is why I now include the <code>inotify-tools</code> package
as a dependency in each of my <code>flake.nix</code> files.</p>
<p>Besides, the first page-reload does imply
that <code>chokidar</code> sees the change. Infuriating.</p>
<p>A few months ago I traced out the course of this issue,
and realized I was trying about eight options in parallel,
without reliably tracking my methods.</p>
<p>This round, I began to add rigor using <code>git</code> branches:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">* 3f65b69 [bun] rearrange dependencies.  (HEAD -&gt; marko-manual)
</div><div class="line" data-line="2">* 95f0047 [marko] manual setup using v6 docs.
</div><div class="line" data-line="3">| * 9610601 [esbuild] begin adding bun commands.  (esbuild)
</div><div class="line" data-line="4">| * 5b88e2b [esbuild] manage `esbuild` using nix.
</div><div class="line" data-line="5">|/
</div><div class="line" data-line="6">| * 9be1bae [vite] dead-end using `vite_phoenix` and `lit`.  (vite)
</div><div class="line" data-line="7">| * 8645b56 [vite] add `vite_phoenix` hex pkg.
</div><div class="line" data-line="8">|/
</div><div class="line" data-line="9">* 5d4c6d9 [bun] add `bun`, manage libs using nix.  (base/main, marko-a, marko, main, lit)
</div><div class="line" data-line="10">| * cfd6339 [marko] reach a dead-end based on numerous guides.  (base/inert-marko, inert-marko)
</div><div class="line" data-line="11">| * b130e92 [inertia] clean up rough edges.
</div><div class="line" data-line="12">| * 7e5f9c6 [tailwind] use nix-managed `tailwindcss_4`.
</div><div class="line" data-line="13">| * 8ffe251 [bun] use nix-managed `bun` binary.
</div><div class="line" data-line="14">| * c00ff15 [inertia] copy in nordbeam/exinertia-templates
</div><div class="line" data-line="15">| * cec3f19 [inertia] igniter.install exinertia, #3
</div><div class="line" data-line="16">| * 1e6633d [inertia] igniter.install exinertia, #2
</div><div class="line" data-line="17">| * 18662cd [inertia] igniter.install exinertia, #1
</div><div class="line" data-line="18">|/
</div><div class="line" data-line="19">* 14747ff [nix] add `flake.nix` &amp; `flake.lock`
</div><div class="line" data-line="20">* 07d71f3 [base]&gt; nsh elixir mix phx.new operable
</div></code></pre>
<p>After a full day of this I was angry and sad and depressed again.
This is a damn easy, &quot;step #1&quot; kind of problem for many people.
On top of my <a href="https://operand.online/chronicle/charges.due">money problems</a>,
the only amusement I could find as I cried to sleep in the rolling boat
was to imagine the experience of sinking, tied to an anchor.</p>
<p>The silicon machines I am beholden to are made from crystallized sand,
and I am fond of saying that on many days,
composing in this landscape feels like building a house on quicksand.</p>
<p>Luckily, as Shakespeare describes in &quot;The Tempest&quot;,</p>
<blockquote>
<p>We are such stuff as dreams are made on,
and our little life is rounded with a sleep.</p>
</blockquote>
<p>At risk of misinterpretation,
my little (sub-microscopic) problems were indeed rounded out
by refreshing my memory in dreams.</p>
<p>When I rose this morning I plunged once more into the quick-sand-scape,
and picked through each thread I had arranged out the day before.
Then I recalled a small conclusion I had reached months ago,
and failed to record in my exhaustion at the time.</p>
<blockquote>
<p>Changing back to <code>yarn</code> and <code>node</code> repairs <code>HMR</code> using <code>vite</code> on <code>nixos</code>.</p>
</blockquote>
<p>If only I had found this phrase somewhere online,
or in the responses of some desparate GPT bot chat,
I'd be holding on a small measure of hope today.</p>
<p>I know that nobody reads these blogs
for the emotional dialogue included,
because I also search, find the clue I need,
and close the page.</p>
<p>I record my mood mainly for a reminder of the pains
when no such clue exists online,
and days can be spent spinning in circles on anchor,
hoping for some manner of release from the silent building anger.</p>
<p>Bun, fix your shit.</p>
<p>Maybe I'll have more fun riding a <code>deno</code>saur.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Bundles of Problems.</link>
        <guid isPermaLink="false">2025-08-10.Bundles of Problems.</guid>
        <pubDate>Sun, 10 Aug 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>End Online Feudalism</title>
        <description><![CDATA[
          
          <hr/>

          <p>On my long sailing expeditions,
which can take a week or more to measure the same distance
that a car can run in an hour,
I rely on my propane grill for cheer,
and my chosen podcast dialogues for company.</p>
<p>Yesterday, caught up in a flurry of programming errors
and managing a video call to relaunch some sleepy machines,
I pressed pause in the middle of
<a href="https://www.localfirst.fm/21/transcript">Seph Gentle's Local-First Podcast interview</a>.</p>
<p>I had the pleasure this morning,
as I plugged the 5g modem back in,
sipped my coffee, and logged on to manage
my corporate financial crisis,
to hear Seph describe some really compelling ideas
that ring loud and clear in my ears.</p>
<p>Since coming to DC I have had a serious challenge in finding peers
who obsess on their programming language opinions in the same manner that I do;
the impulse to sign on to a corporate contract
is usually how people end up in this area,
and any nascent start-ups here
have only the machine-learning boom to credit.</p>
<p>This example Seph gives, at around 1:14,
seems like a clear summary of the problems I hope to challenge,
bridging the domains of legal policy and online policy,
where communicación norms are being chosen in a clearly un-democratic manner:</p>
<blockquote>
<p>The cloud always feels like... feudal city states, you know?
So back before we had democracy,
and before we had countries,
you have these towns, and the town?
It's not a democracy; there's one ruler, the noble, the local noble.
And if you upset the noble, there's no laws necessarily; that's a recent invention.</p>
<p>The noble would say, no, not you.
And you'd either be exiled if you're lucky or like,
you know, hung from the town square,
if you did something the noble didn't like.</p>
<p>And no one owns property.
Only the noble owns the whole town.
That's the rule, right?
And so if you have a house, you have a house
because the noble has graciously allowed you to live there.
And that's the rule, you know?</p>
<p>And if the noble wants to do, whatever they want to do,
There's no higher law than the noble.</p>
<p>And that feels like the software ecosystem that we exist in today,
where, you know, there's the Google city.
And as much as I have endless respect for so many individuals that I know
who I've worked with at Google. I think they're amazing people.</p>
<p>But - the experience is Google is a feudal city state.
Where you walk into the gates and if the noble, if the local Lord
doesn't like you, then you can get banished at any moment out of Google.</p>
<p>There's no recourse.
There's no laws.
There's no rules.
It's not a democracy.
you don't have any privacy.
Everything you do is monitored 24/7
by the Google cameras that exist everywhere.</p>
<p>You know, in their nice little plastic,
you know, beautiful designed, whatever.</p>
<p>And if you don't like it, you can go down the street to the Apple town where
everything is run by Apple and Apple has slightly different values from Google.
And I happen to like Apple's philosophy on privacy more than Google's,
but it's the same kind of world.</p>
<p>And I personally believe in democracy,
and I like that my streets aren't owned by a company,
call me crazy, but yeah.</p>
<p>And I don't know how it interacts with AI, but I feel like we've got, I don't know.
It's like, we've got this opportunity to being more creative, to make
more stuff, to not need billions of dollars of funding, and it's up
to us what we want to do with that.</p>
</blockquote>
<p>There are some ideas that compel because they inspire,
and there are some ideas that compel because they scare.</p>
<p>So much of the corporate landscape online is focused on inspiring people -
as an example, I clicked through the landing page of <a href="https://n8n.io/">n8n</a> a bunch
in the last couple days,
and their product branding seems to promise the capabilities
of either <a href="https://en.wikipedia.org/wiki/Thor">Thor</a>, <a href="https://en.wikipedia.org/wiki/The_Flash">The Flash</a>, or <a href="https://en.wikipedia.org/wiki/Shazam_(DC_Comics)">Shazam</a>.</p>
<p>So, no one needs a reminder of why techies are seen as children.</p>
<p>2025 is here, and all of us agree that we woke up to a hellscape.
Here I am, falling asleep on the Chesapeake Bay,
and looking out on a horizon that is as smog-filled
as the Beijing weekdays I remember from 2013.</p>
<p>All of us have made connections to friends from across the globe,
simply soon enough to see their neighborhoods pummeled by bombs
into rubble on our media feeds.</p>
<p>The rate of censorships from our own government this year
has us asking if 1984 really could be a simple 40-year anachronism,
rather than a spooky and silly dystopia.</p>
<p>So I'm happy to be holding onto a real idea here,
that our communicacións are more or less broken,
because of decisions made decades ago
that should be more challenged by the public than they are.</p>
<hr />
<p>Of course, I need to think of how I can lend my skills
to this scenario.</p>
<p>A couple minutes before the feudalism discussion,
Seph raises the issue of Dharma:</p>
<blockquote>
<p>there's this idea of Dharma that's talked about,
in some Eastern philosophy, which is like,
what is the duty that's your sacred duty?
That's yours alone to reach.</p>
</blockquote>
<blockquote>
<p>And that duty, by the way, might just be to like, be a really great parent.
It doesn't have to be anything grand or grandiose in any way,
but asking that question of what is it yours to do in the world?
That's yours uniquely that no one else will do if you don't do it.</p>
</blockquote>
<blockquote>
<p>I think that's really the question
that we want to be asking ourselves as creative workers.</p>
</blockquote>
<p>Of course I am unable to nicely ask Google or Amazon
to please explain the business purposes behind their legal agreements.
Please give me a chance to read through them before deciding
if I should sign up for another email provider.
The busy-ness of our lives, the quick pace we all embrace and rely on,
keeps us from yelling about the abuse,
keeps us coming back to the same horrid relationship
that gives us the sense of reward we crave.</p>
<p>In the end, domestic abuse is also how dogs were domesticated.
I'm far too much of a lone wolf to obey capricious calls from an alien lord,
in exchange for gaudy toys, and <a href="https://www.simplypsychology.org/pavlov.html">saliva-inducing snacks</a>.</p>
<hr />
<p>So I bounce and roll around on the sailboat
(the spin from shade to sun now indicating
that the tide is changing, and I should be going),
and I consider how to arm the peasant rebellion,
in 2025, using code and phone and new languages of expression.</p>
<p>I am the one on a soap-box,
largely of my own making,
yelling in the town square of the impending bloodbath.</p>
<p>The wages of our labor,
spelled out in songs and images on screens across the globe,
are of course becoming repurposed behind the horizon
by managers in a board room,
who run the psychology experiments
using the metrics of click and spend,
cheerfully ignorant of our basic unmet needs,
as we ride to anyplace we can call home,
in a subway car beside someone tuned into
a streamers popping head-shots and yelling obscenity into the abyss.</p>
<p>The escapism we are being sold is supposed to inspire?
No; speaking of scary.</p>
        ]]></description>
        <link>https://operand.online/chronicle/End Online Feudalism</link>
        <guid isPermaLink="false">2025-08-08.End Online Feudalism</guid>
        <pubDate>Fri, 08 Aug 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Grand plan.</title>
        <description><![CDATA[
          
          <hr/>

          <p><a href="https://share.operand.online/gram/page/share/2025-summer.diagram/legend.svg">LEGEND: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/legend.svg" alt="LEGEND" /></a></p>
<p>In case you go through the backlog on this domain
you'll likely see some real ad-hoc pages,
ones that seem to be leading no place,
more poetry and emoción and inercia,
than prose and progress and momentum.</p>
<p>I guess the problem had been,
ideas came and were gone too easily, too soon.</p>
<p>Before now I had no place to map out my <a href="https://share.operand.online/gram/page/share/2025-summer.diagram">plans</a>;</p>
<p>I produce this plan using the superb <a href="https://d2lang.com/">D2 language</a>,
and <a href="/gram/page/diagram.nu">re-compile on each published change</a> to <a href="/gram/page">gram:page</a>.</p>
<p>Here is the <a href="/gram/page/diagram/plan.d2">diagram source</a>, referencing each sub-diagram.</p>
<h2>Current plan sub-diagrams</h2>
<p><a href="https://share.operand.online/gram/page/share/2025-summer.diagram/operable.svg">OPERABLE: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/operable.svg" alt="OPERABLE" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/base.svg">BASE: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/base.svg" alt="BASE" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/node.svg">NODE: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/node.svg" alt="NODE" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/build.svg">BUILD: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/build.svg" alt="BUILD" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/micro.svg">MICRO: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/micro.svg" alt="MICRO" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/gramme.svg">GRAMME: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/gramme.svg" alt="GRAMME" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/legal.svg">LEGAL: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/legal.svg" alt="LEGAL" /></a></p>
<h2>Some more, sidelined sub-plans:</h2>
<p><a href="https://share.operand.online/gram/page/share/2025-summer.diagram/op.svg">OP: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/op.svg" alt="OP" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/ledger.svg">LEDGER: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/ledger.svg" alt="LEDGER" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/bio.svg">BIO: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/bio.svg" alt="BIO" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/media.svg">MEDIA: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/media.svg" alt="MEDIA" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/psql.svg">PSQL: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/psql.svg" alt="PSQL" /></a>
<a href="https://share.operand.online/gram/page/share/2025-summer.diagram/hex.svg">HEX: <img src="https://share.operand.online/gram/page/share/2025-summer.diagram/hex.svg" alt="HEX" /></a></p>
        ]]></description>
        <link>https://operand.online/chronicle/Grand plan.</link>
        <guid isPermaLink="false">2025-07-11.Grand plan.</guid>
        <pubDate>Fri, 11 Jul 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Dump your WordPress.</title>
        <description><![CDATA[
          
          <hr/>

          <p>So, you're managing WordPress?<br />
That's a popular thing to be doing!<br />
How long have you had this running?</p>
<p>Oh, how rude of me to ask;
probably much longer than you'd like to admit.</p>
<p>Here is how you can quickly back up a WordPress domain -
focusing on the content of the pages,
rather than the themes &amp; style.</p>
<p>Throughout this guide we'll be making use of
the <a href="https://developer.wordpress.org/rest-api/">WordPress REST API</a>.
Our code samples are prepared using <a href="https://nushell.sh">Nushell</a>.</p>
<hr />
<h2>Discover the API.</h2>
<p>WordPress relies on a <a href="https://developer.wordpress.org/rest-api/using-the-rest-api/discovery/">discovery</a> mechanism
to communicate each site's public API to one another.</p>
<p>In this example, we use <a href="https://wordpress.org">wordpress.org</a> -
the same code applies, in theory, to any wordpress domain.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;wp base&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">domain</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: #d2a8ff;">http</span> <span style="color: #e6edf3;">get</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">full</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">domain</span> <span style="color: #79c0ff;">|</span>
</div><div class="line" data-line="3">  <span style="color: #d2a8ff;">get</span> <span style="color: #e6edf3;">headers.response</span> <span style="color: #79c0ff;">|</span>
</div><div class="line" data-line="4">  <span style="color: #d2a8ff;">where</span> <span style="color: #e6edf3;">name</span> <span style="color: #79c0ff;">==</span> <span style="color: #a5d6ff;">link</span> <span style="color: #79c0ff;">|</span>
</div><div class="line" data-line="5">  <span style="color: #d2a8ff;">get</span> <span style="color: #e6edf3;">value.0</span> <span style="color: #79c0ff;">|</span>
</div><div class="line" data-line="6">  <span style="color: #d2a8ff;">parse</span> <span style="color: #a5d6ff;">&#39;&lt;&lbrace;link&rbrace;&gt;; rel=&quot;https://api.w.org/&quot;&#39;</span> <span style="color: #79c0ff;">|</span>
</div><div class="line" data-line="7">  <span style="color: #d2a8ff;">get</span> <span style="color: #e6edf3;">link.0</span>
</div><div class="line" data-line="8"><span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">base</span> <span style="color: #79c0ff;">=</span> <span style="color: #d2a8ff;">wp</span> <span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">https://wordpress.org</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">tee</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">print</span> <span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<p>Solid! We have a base URL.</p>
<p>Using the <a href="https://developer.wordpress.org/rest-api/reference/">reference</a>, we see that <code>/wp/v2/posts</code>
is the path we need to use.</p>
<p>Depending on how your WordPress has been managed,
other nice places to look are:</p>
<ul>
<li><code>/wp/v2/pages</code></li>
<li><code>/wp/v2/tags</code></li>
<li><code>/wp/v2/categories</code></li>
<li><code>/wp/v2/comments</code></li>
<li><code>/wp/v2/media</code></li>
<li><code>/wp/v2/users</code></li>
</ul>
<p>Again, see the <a href="https://developer.wordpress.org/rest-api/reference/">reference</a> for a more thorough appraisal.</p>
<p>To help us progress here, let's make a couple quick helper functions:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #ff7b72;">def</span> <span style="color: #a5d6ff;">&quot;wp dump&quot;</span> <span style="color: #e6edf3;">[</span><span style="color: #e6edf3;">base</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">path</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span><span style="color: #e6edf3;">,</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">form</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">f</span><span style="color: #e6edf3;">)</span><span style="color: #e6edf3;">:</span> <span style="color: #ffa657;">string</span> <span style="color: #e6edf3;">=</span> <span style="color: #a5d6ff;">yml</span><span style="color: #e6edf3;">]</span> <span style="color: #e6edf3;">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">node</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span><span style="color: #a5d6ff;">.</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">base</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">url</span> <span style="color: #e6edf3;">parse</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">get</span> <span style="color: #e6edf3;">host</span><span style="color: #e6edf3;">)</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">path</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">.</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">form</span><span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&quot;</span> <span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span>
</div><div class="line" data-line="3">    <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">join</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">expand</span>
</div><div class="line" data-line="4">  <span style="color: #d2a8ff;">mkdir</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">node</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">dirname</span><span style="color: #e6edf3;">)</span>
</div><div class="line" data-line="5">  <span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">http</span> <span style="color: #e6edf3;">get</span> <span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">[</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">base</span> <span style="color: #a5d6ff;">wp</span> <span style="color: #a5d6ff;">v2</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">path</span> <span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">path</span> <span style="color: #e6edf3;">join</span><span style="color: #e6edf3;">)</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">save</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">f</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">node</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="6"><span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<p>Ready? Here goes.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">base</span> <span style="color: #79c0ff;">=</span> <span style="color: #d2a8ff;">wp</span> <span style="color: #e6edf3;">base</span> <span style="color: #a5d6ff;">&#39;https://wordpress.org&#39;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: #d2a8ff;">timeit</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">[</span>
</div><div class="line" data-line="4"> <span style="color: #a5d6ff;">posts</span> <span style="color: #a5d6ff;">pages</span> <span style="color: #a5d6ff;">comments</span> <span style="color: #a5d6ff;">media</span> <span style="color: #a5d6ff;">users</span>
</div><div class="line" data-line="5"> <span style="color: #a5d6ff;">categories</span> <span style="color: #a5d6ff;">tags</span> <span style="color: #a5d6ff;">taxonomies</span> <span style="color: #a5d6ff;">types</span> <span style="color: #a5d6ff;">statuses</span>
</div><div class="line" data-line="6"> <span style="color: #a5d6ff;">settings</span> <span style="color: #a5d6ff;">themes</span> <span style="color: #a5d6ff;">search</span> <span style="color: #a5d6ff;">plugins</span>
</div><div class="line" data-line="7"> <span style="color: #a5d6ff;">block-types</span> <span style="color: #a5d6ff;">blocks</span> <span style="color: #a5d6ff;">block-renderer</span> <span style="color: #a5d6ff;">block-directory/search</span>
</div><div class="line" data-line="8"><span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">each</span> <span style="color: #e6edf3;">&lbrace;</span><span style="color: #79c0ff;">|</span><span style="color: #e6edf3;">label</span><span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">wp</span> <span style="color: #e6edf3;">dump</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">label</span> <span style="color: #e6edf3;">&rbrace;</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: #8b949e;"># for a colleague&#39;s domain:</span>
</div><div class="line" data-line="11"><span style="color: #8b949e;"># 21sec 895ms 964µs 817ns</span>
</div></code></pre>
<p>Of course, if you prefer a non-yml dump,
pass in one of <a href="https://www.nushell.sh/commands/docs/save.html">these extensions</a> under <code>-f</code>:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">scope</span> <span style="color: #e6edf3;">commands</span>
</div><div class="line" data-line="2">    <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">where</span> <span style="color: #e6edf3;">name</span> <span style="color: #79c0ff;">starts-with</span> <span style="color: #a5d6ff;">&quot;to &quot;</span>
</div><div class="line" data-line="3">    <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">insert</span> <span style="color: #e6edf3;">extension</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #d2a8ff;">get</span> <span style="color: #e6edf3;">name</span> <span style="color: #79c0ff;">|</span> str <span style="color: #e6edf3;">replace</span> <span style="color: #e6edf3;">-</span>r <span style="color: #a5d6ff;">&quot;</span><span style="color: #a5d6ff;">^to </span><span style="color: #a5d6ff;">&quot;</span> <span style="color: #a5d6ff;">&quot;&quot;</span> <span style="color: #79c0ff;">|</span> <span style="color: #a5d6ff;">$&quot;</span><span style="color: #a5d6ff;">*.</span><span style="color: #e6edf3;">(</span><span style="color: #e6edf3;">$</span>in<span style="color: #e6edf3;">)</span><span style="color: #a5d6ff;">&quot;</span> <span style="color: #e6edf3;">&rbrace;</span>
</div><div class="line" data-line="4">    <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">select</span> <span style="color: #e6edf3;">extension</span> <span style="color: #e6edf3;">name</span>
</div><div class="line" data-line="5">    <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">rename</span> <span style="color: #e6edf3;">extension</span> <span style="color: #e6edf3;">command</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: #d2a8ff;">╭────┬────────────┬─────────────╮</span>
</div><div class="line" data-line="8"><span style="color: #d2a8ff;">│</span>  <span style="color: #8b949e;"># │ extension  │   command   │</span>
</div><div class="line" data-line="9"><span style="color: #d2a8ff;">├────┼────────────┼─────────────┤</span>
</div><div class="line" data-line="10"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">0</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.csv</span>      <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">csv</span>      <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="11"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">1</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.html</span>     <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">html</span>     <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="12"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">2</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.json</span>     <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">json</span>     <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="13"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">3</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.md</span>       <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">md</span>       <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="14"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">4</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.msgpack</span>  <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">msgpack</span>  <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="15"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">5</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.msgpackz</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">msgpackz</span> <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="16"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">6</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.nuon</span>     <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">nuon</span>     <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="17"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">7</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.text</span>     <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">text</span>     <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="18"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">8</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.toml</span>     <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">toml</span>     <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="19"><span style="color: #d2a8ff;">│</span>  <span style="color: #79c0ff;">9</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.tsv</span>      <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">tsv</span>      <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="20"><span style="color: #d2a8ff;">│</span> <span style="color: #79c0ff;">10</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.xml</span>      <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">xml</span>      <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="21"><span style="color: #d2a8ff;">│</span> <span style="color: #79c0ff;">11</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.yaml</span>     <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">yaml</span>     <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="22"><span style="color: #d2a8ff;">│</span> <span style="color: #79c0ff;">12</span> <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">*.yml</span>      <span style="color: #e6edf3;">│</span> <span style="color: #e6edf3;">to</span> <span style="color: #e6edf3;">yml</span>      <span style="color: #e6edf3;">│</span>
</div><div class="line" data-line="23"><span style="color: #d2a8ff;">╰────┴────────────┴─────────────╯</span>
</div></code></pre>
<p>For completeness, here is a multi-format dump:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">base</span> <span style="color: #79c0ff;">=</span> <span style="color: #d2a8ff;">wp</span> <span style="color: #e6edf3;">base</span> <span style="color: #a5d6ff;">&#39;https://wordpress.org&#39;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">labels</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span>
</div><div class="line" data-line="4"> <span style="color: #a5d6ff;">posts</span> <span style="color: #a5d6ff;">pages</span> <span style="color: #a5d6ff;">comments</span> <span style="color: #a5d6ff;">media</span> <span style="color: #a5d6ff;">users</span>
</div><div class="line" data-line="5"> <span style="color: #a5d6ff;">categories</span> <span style="color: #a5d6ff;">tags</span> <span style="color: #a5d6ff;">taxonomies</span> <span style="color: #a5d6ff;">types</span> <span style="color: #a5d6ff;">statuses</span>
</div><div class="line" data-line="6"> <span style="color: #a5d6ff;">settings</span> <span style="color: #a5d6ff;">themes</span> <span style="color: #a5d6ff;">search</span> <span style="color: #a5d6ff;">plugins</span>
</div><div class="line" data-line="7"> <span style="color: #a5d6ff;">block-types</span> <span style="color: #a5d6ff;">blocks</span> <span style="color: #a5d6ff;">block-renderer</span> <span style="color: #a5d6ff;">block-directory/search</span>
</div><div class="line" data-line="8"><span style="color: #e6edf3;">]</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: #ff7b72;">let</span> <span style="color: #e6edf3;">forms</span> <span style="color: #79c0ff;">=</span> <span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">csv</span> <span style="color: #a5d6ff;">json</span> <span style="color: #a5d6ff;">yml</span> <span style="color: #e6edf3;">]</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12"><span style="color: #d2a8ff;">timeit</span> <span style="color: #e6edf3;">&lbrace;</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">labels</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">each</span> <span style="color: #e6edf3;">&lbrace;</span><span style="color: #79c0ff;">|</span><span style="color: #e6edf3;">l</span><span style="color: #79c0ff;">|</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">forms</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">each</span> <span style="color: #e6edf3;">&lbrace;</span><span style="color: #79c0ff;">|</span><span style="color: #e6edf3;">f</span><span style="color: #79c0ff;">|</span>
</div><div class="line" data-line="13">  <span style="color: #d2a8ff;">wp</span> <span style="color: #e6edf3;">dump</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">f</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">f</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">base</span> <span style="color: #e6edf3;">$</span><span style="color: #e6edf3;">l</span>
</div><div class="line" data-line="14"><span style="color: #e6edf3;">&rbrace;</span> <span style="color: #e6edf3;">&rbrace;</span> <span style="color: #e6edf3;">&rbrace;</span>
</div></code></pre>
<p>Yeah! Such a nice backup already.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">tree</span> <span style="color: #e6edf3;">wordpress.org</span>
</div><div class="line" data-line="2"><span style="color: #d2a8ff;">wordpress.org</span>
</div><div class="line" data-line="3"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">block-directory</span>
</div><div class="line" data-line="4"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">blocks.csv</span>
</div><div class="line" data-line="5"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">blocks.json</span>
</div><div class="line" data-line="6"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">blocks.yaml</span>
</div><div class="line" data-line="7"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">blocks.yml</span>
</div><div class="line" data-line="8"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">categories.json</span>
</div><div class="line" data-line="9"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">categories.yaml</span>
</div><div class="line" data-line="10"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">categories.yml</span>
</div><div class="line" data-line="11"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">comments.json</span>
</div><div class="line" data-line="12"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">comments.yaml</span>
</div><div class="line" data-line="13"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">comments.yml</span>
</div><div class="line" data-line="14"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">media.json</span>
</div><div class="line" data-line="15"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">media.yaml</span>
</div><div class="line" data-line="16"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">media.yml</span>
</div><div class="line" data-line="17"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">pages.json</span>
</div><div class="line" data-line="18"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">pages.yaml</span>
</div><div class="line" data-line="19"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">pages.yml</span>
</div><div class="line" data-line="20"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">posts.json</span>
</div><div class="line" data-line="21"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">posts.yaml</span>
</div><div class="line" data-line="22"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">posts.yml</span>
</div><div class="line" data-line="23"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">search.json</span>
</div><div class="line" data-line="24"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">search.yaml</span>
</div><div class="line" data-line="25"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">search.yml</span>
</div><div class="line" data-line="26"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">statuses.json</span>
</div><div class="line" data-line="27"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">statuses.yaml</span>
</div><div class="line" data-line="28"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">statuses.yml</span>
</div><div class="line" data-line="29"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">tags.json</span>
</div><div class="line" data-line="30"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">tags.yaml</span>
</div><div class="line" data-line="31"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">tags.yml</span>
</div><div class="line" data-line="32"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">taxonomies.json</span>
</div><div class="line" data-line="33"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">taxonomies.yaml</span>
</div><div class="line" data-line="34"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">taxonomies.yml</span>
</div><div class="line" data-line="35"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">types.json</span>
</div><div class="line" data-line="36"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">types.yaml</span>
</div><div class="line" data-line="37"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">types.yml</span>
</div><div class="line" data-line="38"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">users.json</span>
</div><div class="line" data-line="39"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">users.yaml</span>
</div><div class="line" data-line="40"><span style="color: #d2a8ff;">└──</span> <span style="color: #e6edf3;">users.yml</span>
</div></code></pre>
<p>If you have a local copy of <code>zip</code>, yay!</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">zip</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">r</span> <span style="color: #e6edf3;">wordpress.zip</span> <span style="color: #e6edf3;">wordpress.org/*</span>
</div></code></pre>
<p>Since I'm on NixOS I'm going to use a small prefix here:</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: #d2a8ff;">nix-shell</span> <span style="color: #e6edf3;">-</span><span style="color: #79c0ff;">p</span> <span style="color: #e6edf3;">zip</span> <span style="color: #e6edf3;">--</span><span style="color: #79c0ff;">run</span> <span style="color: #a5d6ff;">&#39;zip -r wordpress.zip wordpress.org/*&#39;</span>
</div></code></pre>
<p>Now, I'm going through this process to help a colleague,
so this is a good place to email off the ZIP file,
to see if she has any issues with how the records came back.</p>
<p>I'm eager to press ahead and look at a few newer CMS options for her!
A couple ones I already have my eye on:</p>
<ul>
<li><a href="https://hexdocs.pm/beacon/your-first-site.html">Beacon</a></li>
<li><a href="https://www.solidjs.com/">Solid</a> &amp; <a href="https://mdxjs.com/">MDX</a></li>
</ul>
<p>Plus, the <a href="https://github.com/awesome-selfhosted/awesome-selfhosted?tab=readme-ov-file#content-management-systems-cms">Awesome SelfHosted page</a>
has 40 more options for a CMS upgrade - of course, including WordPress.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Dump your WordPress.</link>
        <guid isPermaLink="false">2025-07-07.Dump your WordPress.</guid>
        <pubDate>Mon, 07 Jul 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Hope 2025</title>
        <description><![CDATA[
          
          <hr/>

          <p><a href="https://store.2600.com/products/tickets-to-hope_16">HOPE</a> you're buying a pass also.</p>
<p><img src="https://share.operand.online/gram/page/media/2025-07-01.hope.png" alt="HOPE conference pass page, run by 2600 Magazine in Queens, NYC." /></p>
        ]]></description>
        <link>https://operand.online/chronicle/Hope 2025</link>
        <guid isPermaLink="false">2025-07-01.Hope 2025</guid>
        <pubDate>Tue, 01 Jul 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Codebase Relay</title>
        <description><![CDATA[
          
          <hr/>

          <p>A day ago I discussed <a href="/chronicle/oss.backlog">a broad plan</a> to rebuild ://operand.online;
the challenges are already becoming clear. All the same, some progress!</p>
<p>I focused today on the first motion necessary to upgrade the blog -
changing from the clunky <code>share.operand.online</code> to a real <code>git</code> relay,
so that someday I can run <code>git clone</code> to copy the markdown to the web client,
where I'll rely on <a href="https://solidjs.com">SolidJS</a> and <a href="https://mdxjs.com">MDX</a> to compile the pages.</p>
<p>The essays are in <a href="/gram/page">gram:page</a>, the web code is in <a href="/gram/op">gram:op</a>,
and the deployment code is in <a href="/gram/build">gram:build</a>.</p>
<p>So far I'm doing all of the rendering for the essays
in Elixir, a fabulous language that has a higher calling
than the rendering of markdown.</p>
<p>To change this, I need to first focus on deploying
a new relay program, called <code>soft-serve</code>;
you can <code>ssh git.charm.sh</code> as an example,
or see my deployed copy at: <code>ssh -p 2202 base.operand.online</code>.
I recorded a console session as I <a href="https://search.nixos.org/options?channel=25.05&amp;show=services.soft-serve.settings&amp;size=50&amp;sort=relevance&amp;type=packages">hooked this up in NixOS</a>.</p>
<p>Now, the relay is up and running. Yay!
That is as far as I made it,
because the next piece is so uncommon....
that no one really goes that far yet.
This is the cool, unknown-frontier piece of coding.
We're gonna be in a danger zone from here on.</p>
<p>To be specific about today's errors that are holding me up,
I'm seeing different problems locally and in deployment.</p>
<p>Locally, there seems to be a CORS error when I make a connection
to <code>https://base.operand.online</code> - an HTTP 405 &quot;Method Not Allowed&quot;.
I see <a href="https://github.com/charmbracelet/soft-serve/pull/516">someone else</a> added code to handle this problem,
and somehow it does me no good.
Perhaps the issue is that on my local machine,
I am running the app on HTTP rather than HTTPS.
CORS (cross-origin request security) becomes picky on such conditions.</p>
<p>So, I merged my branch into main and pushed -
and the compilation broke because in 2025,
compiling to webassembly remains a hard problem somehow.
I'm usually amused when I see errors decrying a bad &quot;<a href="https://github.com/WebAssembly/design/issues/1328">magic number</a>&quot;;
though today I am less than amused - I need this connection.</p>
<p>Now, <code>libgit2.c</code> is a shady binary to compile to webassembly,
because the compilation target has been pinned like a donkey-tail
to the braying ass of a language.</p>
<p>If I'm going to proceed, I'll be much happier using <a href="https://crates.io/crates/gitoxide">GitOxide</a>,
since much less can go badly when cross-compiling Rust,
and I'm beginning to learn a sense of the language tooling.</p>
<p>I'm surprised to say that I'm no longer scared to dig through Rust code -
somehow speaking to a bunch of open-source coders who depend on Rust
makes the language seem more human, more approachable.</p>
<p>My textbook from No Starch Press has no mention of webassembly, though!
I'll be choosing from some capable blog guidance.
(
<a href="https://developer.mozilla.org/en-US/docs/WebAssembly/Guides/Rust_to_Wasm">1</a>,
<a href="https://surma.dev/things/rust-to-webassembly/">2</a>,
<a href="https://rustwasm.github.io/book/">3</a>,
<a href="https://depth-first.com/articles/2020/06/29/compiling-rust-to-webassembly-a-simple-example/">4</a>,
)</p>
<hr />
<p>Although the blog rendering procedure remains unchanged,
I now have a new git codebase relay up and running,
happily secured and managed using SSH,
and honoring my user SSH keys.</p>
<p>I can now confidently synchronize code again!</p>
<p>Since I spun up the &quot;baseline lab&quot; in Maryland,
I've been doing a bunch of on-relay code changes,
especially for the code I'm using to clone <a href="https://static.case.law">static.case.law</a>.</p>
<p>Those code changes are soon going to be added
to the <a href="/gram/build">gram:build</a> codebase,
although I'm not looking forward to the merges
after a few weeks of divergence between my laptop and the lab.</p>
<p>Sundays are my de facto day off,
based on library schedules,
and I'm lucky to be busy tomorrow with the Denver Pride fest.
I'll sign off here and hope to be back on Monday,
sharing anything I picked up around Rust and WASM in the meanwhile.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Codebase Relay</link>
        <guid isPermaLink="false">2025-06-28.Codebase Relay</guid>
        <pubDate>Sat, 28 Jun 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Open Source Summit, days 2-4</title>
        <description><![CDATA[
          
          <hr/>

          <p>The days passed quickly!</p>
<p>Because being precise in the midst of such a blur is impossible,
I'll relay that I had some really good discussions!
Only some of them concerned linux or open source.</p>
<p>Somehow, my Hyprland desktop came up and someone mentioned
that the lead coder has some... people issues,
as <a href="/chronicle/chills">so many of us do</a>.</p>
<p>Because I missed the day 1 description of <a href="https://system76.com/cosmic/">Cosmic DE</a>,
I changed a couple lines in my Nix configs and after a long,
conference-wifi download I was up and running.
The <a href="https://user-images.githubusercontent.com/57502897/191095328-d6f0d2f8-54ee-4732-9852-62440c3d19e8.png">keybindings</a> make basic sense, and I'm making progress as usual.</p>
<p>Somehow System76 has no presence in the sponsor's playground,
so I spent a piece of an hour speaking to Framework!
They had their new touchscreen on display,
alongside their desktop and a sleek rack-mount 4x desktop lab.
The 16&quot; input modules are some peak engineering;
I had an engineer run <code>lsusb</code> as he plugged and unplugged them.
I'm super impressed, needless to say.</p>
<p>Incidentally, the Framework lads had been amused
to pull up my old Jira ticket -
on Jan 4, 2022 I had been the first order shipping to Washington, DC;
I asked someone to add the district to their e-commerce form.</p>
<hr />
<p>In the middle of the conference I paused
to message one of my collaborator groups on Slack:</p>
<blockquote>
<p>Hi, clicking in from the Linux Open Source Summit in Denver;
A couple people are discussing distributed (dispersed) data lakes (record collections).
These include:</p>
</blockquote>
<blockquote>
<ul>
<li><a href="https://lfedge.org/projects/edgelake/">https://lfedge.org/projects/edgelake/</a></li>
<li><a href="https://gravitino.apache.org/">https://gravitino.apache.org/</a></li>
</ul>
</blockquote>
<blockquote>
<p>these options are groundbreaking ways to solve a problem we may have someday:
connecting different databases and sources.</p>
</blockquote>
<blockquote>
<p>Our lab-location problem is more properly called &quot;High Availability&quot; or &quot;Disaster Recovery&quot;.
The usual approach is to combine &quot;Replication&quot; and &quot;Failover&quot;.
This normally requires reading long incomprehensible explanations:</p>
</blockquote>
<blockquote>
<ul>
<li><a href="https://www.enterprisedb.com/postgres-tutorials/postgresql-replication-and-automatic-failover-tutorial">https://www.enterprisedb.com/postgres-tutorials/postgresql-replication-and-automatic-failover-tutorial</a></li>
</ul>
</blockquote>
<blockquote>
<p>We can be unusual though!</p>
</blockquote>
<blockquote>
<p>This open-source DB is designed to be multi-machine, and a drop-in replacement for postgres.
The other apps like Airflow or Tableau should have no idea the underlying program is changing.</p>
</blockquote>
<blockquote>
<ul>
<li><a href="https://www.yugabyte.com/">https://www.yugabyte.com/</a></li>
<li><a href="https://github.com/yugabyte/yugabyte-db">https://github.com/yugabyte/yugabyte-db</a></li>
</ul>
</blockquote>
<hr />
<p>And speaking of Slack,
I am a new member of some buzzing new groups:
<a href="https://app.slack.com/client/T01QQ0Q5GMA">OpenSearch</a> and <a href="https://app.slack.com/client/TV03AS82H">CHAOSS</a>.</p>
<p>Now, in the 4th-day mini-summit,
I'm on the special <a href="https://chaoss.community/">CHAOSS</a> track.
After a couple days of high-IQ discussions,
I found some refuge in discussions of docs, inclusion, onboarding,
and the more human sides of open source management.</p>
<p>CHAOSS is the main group appraising open-source health on a global basis.
They produce <a href="https://chaoss.community/chaoss-education-project/">education programs</a> and open-source apps to help us explore
the science of coding, using the public records of authorship
inherent to open-source.</p>
<hr />
<p>Today is a deep examination of how to measure open-source community.</p>
<p>Phase one in the process is to mine the rich resource collections:
you can use <a href="https://chaoss.github.io/grimoirelab">GrimoireLab</a> or <a href="https://github.com/chaoss/augur">Augur</a>.
Augur is the source behind <a href="https://metrix.chaoss.io">8knot</a>, a dashboard core to CHAOSS.</p>
<p>One of the speakers mentioned having authored a blog post for
<a href="https://opensource.com/">opensource.com</a>, which seems to be experiencing
many Drupal and AJAX errors!</p>
<p>I'm in the middle of an employment application as a Drupal manager,
so I may seek to help on their app if possible.
Oddly enough, I see no source-code links among their pages.</p>
<p>These authors mentioned the <a href="https://cardano.org/">Cardano</a> blockchain
as a peer-reviewed blockchain geared towards paying open-source coders.
Yay! These speakers also authored <a href="https://report.mozilla.community/">Mozilla &amp; the Rebel Alliance</a>
and <a href="https://bitergia.com/radar-report-hedera-crypto-ecosystems-2024/">similar reports</a> examining community relationships.</p>
<p>I'm marginally sad to have missed a discussion on <a href="https://ecosyste.ms/">Ecosyste.ms</a>,
and eager to explore this domain more as soon as possible.
I had absconded from the CHAOSS track for that talk,
to go see how to apply <a href="https://foundation-model-stack.github.io/fms-guardrails-orchestrator">Guardrails for AI apps</a>.</p>
<hr />
<p>Hopping back to Tuesday as I examine my open pages,
I had been super pleased to see the author of Wireshark
explain <a href="https://stratoshark.org/">StratoShark</a>, an analogous program he has made to explore
system calls.</p>
<p>The key idea behind this program is to be
essentially a clone of WireShark;
the <code>.pcap</code> capture file for packets uses the same
encoding as the <code>.scap</code> files for system calls.
The audience asked around the possibility of building an app,
perhaps a web UI, to display both captures in chronological order.</p>
<p>&quot;Sure&quot;, he said. &quot;In the base of the repo there is a <a href="https://gitlab.com/wireshark/wireshark/-/blob/master/sharkd.h">sharkd</a> daemon,
and someone has had success communicating to that process
from a WebUI before.&quot; [paraphrased]</p>
<hr />
<p>Now, I'm sure more is going to emerge from this conference
in the days to come; I'll spend many more public-library sessions
in my email inbox and blog, perhaps uploading images from my camera.</p>
<p>Which reminds me - I had a chance to ask a Sony patent engineer
about my Alpha DLSR; we discussed how nearly all
serious camera companies are made in Japan,
and we double-checked where [Hombu Dojo] is (Shinjuku).</p>
<p>I need to spend much more time learning Japanese,
and besides, this may be the primary appeal of the Open Source Summit;
the highly international audience in attendence.</p>
<p>I'm making connections, and am eager build a much broader dialogue
around these ideas in the days and months ahead.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Open Source Summit, days 2-4</link>
        <guid isPermaLink="false">2025-06-26.Open Source Summit, days 2-4</guid>
        <pubDate>Thu, 26 Jun 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Open Source Summit, day 1.</title>
        <description><![CDATA[
          
          <hr/>

          <p>The Linux Foundation's 2025 Open Source Summit launched today,
at the Colorado Convention Center in Denver -
where I've spent the last day collapsing on the ground
and engaging in Wim Hof breathing exercises,
to simply remain conscious through the day and recuperate from
many long hours on the road the prior week.</p>
<p>I am spending the conference camping in my pickup during the nights,
and have access to $150 or so for the next week.
I'm passing up on some of Denver's cuisine while I'm here,
although I am eager for a biscuit somehow.
I'll address the money issue soon enough.</p>
<p>So, rather than park in the conference center for $25/day,
I spent the morning in my brother's Boulder home rearranging the cab,
then found a place to park in Paco Sanchez park.
I rode my bicycle in for the lunch hour, missing the main keynotes.</p>
<p>The lunch had been arranged inside the sponsor gallery,
so I'd been pleased to run into Ericsson telecom -
the company behind Erlang (crucially underlying this domain),
and Automattic - the company behind <a href="https://wordpress.org">Wordpress</a>.</p>
<p>I told Ericsson's rep that they need to sieze their chance to build
a YouTube clone, using <a href="https://membrane.stream/">Membrane</a> (or,
perhaps in a less captured market, a video compositor?).</p>
<p>For Automattic, I began discussing the issues I had seen
spread across a number of <a href="https://phoenixnap.com/kb/what-is-a-lamp-stack">LAMP</a>-stack applications;
the core ones being: Wordpress, Drupal, and MediaWiki.</p>
<p>I'd been super-pleased to hear that in my quest to export
a bunch of Wordpress domains for re-use in other CMS harnesses,
I'd fully overlooked the public <a href="https://developer.wordpress.org/rest-api/">REST API</a>
built into each Wordpress domain.</p>
<p>This alone is a breakthrough that is considerable for my purposes -
I had reached a similar approach for exporting Wiki pages,
using the built-in <a href="https://wikiapiary.com/wiki/Special:AllPages">Special:AllPages</a> and <a href="https://wikiapiary.com/wiki/Special:Export">Special:Export</a> combo.</p>
<p>Realizing that there is similar, fully public access to Wordpress pages
made my day before it really had a chance to begin.</p>
<p>Since the vegan lunch also sacrificed gluten from the bread recipe,
I peeled the foam off of the sandwich and nibbled down my salad
before loading up the <a href="https://events.linuxfoundation.org/open-source-summit-north-america/program/schedule/">schedule</a> and preparing for my speed run.</p>
<p>The main themes of the day seemed to be:</p>
<ul>
<li>Software Bill of Materials (SBOM)</li>
<li>AI hype of course</li>
<li>Embedded deployments, mainly using <a href="https://www.zephyrproject.org/">Zephyr</a></li>
</ul>
<p><a href="https://www.cisa.gov/sbom">SBOM</a> concerns are most closely related to my government focus,
because they are crucial for supply-chain appraisal
and security assurances. Alongside those talks I sprinkled others,
such as documentation and continuous delivery,
as I dashed from room to room amid the hallway overflow discussions.</p>
<p>One talk focusing on open-source hardware
examined <a href="https://protocentral.com/">ProtoCentral</a>, and the <a href="https://www.crowdsupply.com/protocentral/healthypi-5">HealthyPi</a> boards.
The health focus of his group is super aligned to the engineers
I collaborate with each week, and as I become more engaged in making
I'd like to crack in to one of those boards - perhaps the mobile option.</p>
<p>The next speaker I chose had been discussing SBOM approaches,
and recommending how to respond to the endless cascade of <a href="https://www.cve.org/">CVEs</a>
published each day - the vulnerabilities all of us dread.</p>
<p>The group leading the discussion had been <a href="https://www.deployhub.com/open-source-vulnerability-management/">DeployHub</a>,
and I picked up links for <a href="https://pkg.go.dev/github.com/bomctl/bomctl">bomctl</a> and <a href="https://ortelius.io/">Ortelius</a>.
The speaker had been asking for 10 users to lead an adoption study,
so we exchanged ideas and are planning to discuss tomorrow
how to de-bloat an application's dependencies.
I'm eager as can be, and introduced by email before the talk ended.
I also need to look up <a href="https://openssf.org/">OpenSSF</a>, as a related group here in Denver.</p>
<p>Then began the conference zoomies,
because I sat down in the hall and pulled up each talk for the next hour,
chose the compelling ones, and mapped their location in the hall.</p>
<p>Then in no real order, I peeked in on:</p>
<ul>
<li>The <a href="https://todogroup.org/">TODO</a> group -
advocating for corporate recognition of their open-source obligations.</li>
<li><a href="https://openmobilehub.org/sdk/">Open Mobile Hub</a>,
a panel with no real cohesion and an unsure mood. Meh?</li>
<li><a href="https://opensearch.org/">OpenSearch</a>, which may be the only laudable
product I've ever heard promoted by an Amazon engineer.
The open-source program seems to have minimal corporate reliance.</li>
</ul>
<p>Then, once I thought I'd been done for the third time,
I found the <a href="https://cd.foundation/">CD Foundation</a>.
The discussion here was led by the <a href="https://edgemonsters.dev/">Edge Monsters</a>,
and they had on stage a real, running mobile lab -
seemingly pulled out of a Pelican case,
and ready to be loaded onto an airplane.</p>
<p>One of the speakers, a member of the Air Force,
claimed that the lab had been to 7 countries,
in over 40 demos - and he happily pulled different blades
from the rig with no ceremony, sure that the balance
would be rearranged in the absence of 1/3 the silicon resources.</p>
<p>There was some impressively granular discussion of the components,
although more happily the design
has been approved for open-source release... soon?
I need to email to double-check the link and release plans.</p>
<p>So concludes the open source summit day 1.
I'm happy for a chance to record many of these experiences
before the convention center closes in... 10 minutes.</p>
<p>I'll need each spare second to run the 6 miles to the other side
of the building, by the blue bear, where my bike is parked,
before picking up some dinner fixin's at the local Sprout's.</p>
<p>Is a really big building, and the peaks look good from up here.
Perhaps more pictures to come - for now, big ideas to explore.</p>
<p><img src="https://share.operand.online/gram/page/media/2025-06-23.bear.jpg" alt="A big, blue, bear peering in on the Colorado Convention Center." /></p>
        ]]></description>
        <link>https://operand.online/chronicle/Open Source Summit, day 1.</link>
        <guid isPermaLink="false">2025-06-23.Open Source Summit, day 1.</guid>
        <pubDate>Mon, 23 Jun 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Basics (o' composición)</title>
        <description><![CDATA[
          
          <hr/>

          <p>I commonly come across programs I'd like to use.</p>
<p>I load them up, begin running them for a day or so,
or perhaps only a couple of hours,
and quickly decide.... nah.</p>
<hr />
<p>The programs could be good, and be-longer in use,
and belong in my arsenal, only they lack some pieces I require:</p>
<ul>
<li>More and more, I need my programs to be <a href="https://www.inkandswitch.com/">local-first (LoFi)</a>
to keep up with my nomadism.</li>
<li>My programs need to be open-source so I can change them.</li>
<li>My programs need permissible licensing so I can keep them running.</li>
<li>My programs need to be free.
I am an economics essayist, hence dismally broke.</li>
</ul>
<hr />
<p>Here are how some programs compare on the rubric:</p>
<table>
<thead>
<tr>
<th align="right">program</th>
<th align="left">purpose</th>
<th align="right">LoFi</th>
<th align="right">source</th>
<th align="right">license</th>
<th>price</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right"><code>logseq</code></td>
<td align="left">local notes</td>
<td align="right">x</td>
<td align="right"></td>
<td align="right"></td>
<td>$0 - x</td>
</tr>
<tr>
<td align="right"><code>patchwork</code></td>
<td align="left">local notes, dashboards</td>
<td align="right">x</td>
<td align="right"></td>
<td align="right">nope</td>
<td>$0</td>
</tr>
<tr>
<td align="right"><code>obsidian</code></td>
<td align="left">local notes</td>
<td align="right">x</td>
<td align="right"></td>
<td align="right"></td>
<td>$x</td>
</tr>
<tr>
<td align="right"><code>linear</code></td>
<td align="left">issue management</td>
<td align="right"></td>
<td align="right"></td>
<td align="right"></td>
<td>$0 - x</td>
</tr>
<tr>
<td align="right"><code>helix</code></td>
<td align="left">editor</td>
<td align="right">x</td>
<td align="right">x</td>
<td align="right">x</td>
<td>$0</td>
</tr>
<tr>
<td align="right"><code>zellij</code></td>
<td align="left">session manager</td>
<td align="right">x</td>
<td align="right">x</td>
<td align="right">x</td>
<td>$0</td>
</tr>
<tr>
<td align="right"><code>nushell</code></td>
<td align="left">command-line</td>
<td align="right">x</td>
<td align="right">x</td>
<td align="right">x</td>
<td>$0</td>
</tr>
</tbody>
</table>
<p>From looking at this graph, you could properly assume I am much less able
to organize my ideas as I am to execute on them.</p>
<p>Each day I begin doing <em>something or other</em>, probably using Nushell.
I quickly realize I need to build a cleaner experience,
and build up a couple uh, <em>new</em> shell functions - maybe 5 minutes,
maybe half an hour.</p>
<p>This is a nice approach for me because I've accumulated
a big bunch of functions I can rely on.
I re-use them again and again, and my progress gradually speeds up as I go.
Of course, I basically only use Nushell... for anything I need.</p>
<p>This is one of the reasons I'm so amped up around <a href="https://automerge.org">AutoMerge</a>.
The promises made by [Patchwork] seem to echo all of my ideals,
in a nice clean vaporware all of us can idolize prior to release.</p>
<p>Maybe I need more solid benchmarks.</p>
<hr />
<p>All the same, my nushell command bundles
are reaching a place I'd like to expand on;
and bring into my normal web-app procedures.</p>
<p>I'm making pushes to help more in nushell,
and some of the additional core codebases I depend on.
As automerge progresses I'm keeping an eye on the discussions;
the research is beyond my usual relaxed pace.</p>
<p>Of course, I'm learning Rust as I go,
and my leaning towards the language is pulled by my happy experiences
with programs rather than an ideological language theory.
The Rust-based programs I depend on are simply
quicker, easier, and more reliable. More snappy.</p>
<p>All in all, the idea I'm most on board with
in the [AutoMerge] landscape,
is the &quot;malleable software&quot; goal.</p>
<p>I'd much rather use a collección of small programs I can easily rearrange on a whim,
than spend hours or days repurposing something collosal like Blender
into a usable process.</p>
<p>This is one of the main issues keeping me from progress on animation,
or video editing. Some of the programs are good, all are bulky.
I'd like to see core building blocks in a performant language,
repurposable on demand at least to the degree that <code>gstreamer</code> had been.
My price point aside, there is a large market for cross-platform animation,
demanding to be filled. The incumbents ignore full OS channels,
while falling behind on any use case beyond their chosen primary mechanic.
No coincidence that there is such a chasm separating animation from graphic design,
when at first blush they seem to be close siblings.
Imagine how much may change if that one boundary could be bridged.</p>
<hr />
<p>So, as I go I'm going to look at core Rust libraries for vectors, for graphics,
for sequencing and animation and paths maths.
The changes are going to come some day,
and for a long duración they are going to be unable to compare to the prior generación.
Their only hope for success is to build up core libraries, piece by piece;
imagine if <a href="https://www.raylib.com/">raylib</a> became a core dependency in a large range of programs,
and how many chances for interoperable exchange such a scene could bring.</p>
<p>Only dreams so far, although I've been ignoring the hype cycles long enough,
gradually building up my lonely basis,
that I feel I can reliably lead this charge.</p>
<p>One of the main issues needing to be addressed here?</p>
<p>Finding small, re-applicable problem descripcións
able to be cleanly handled by a small codebase.
Proliferación of solucións is both desirable, and <em>inescapable</em>
once a small problem is comprehensively labeled and scoped.</p>
<p>And speaking of scope,
there's news to announce this summer, once I reach the Linux Foundation's
<a href="./open-source-summit.app">Open Source Summit</a> early next week.
I need to do a small measure of finagling to bind audio to an <a href="https://asciinema.org/">Asciinema</a> recording.</p>
<p>This announcement follows the recipe;
I looked at the problem I had been trying to address for nearly 3 years,
using NixOS and Nix Flakes.
I call this problem &quot;reproducible deploys&quot;.
I examine how the problem space is riddled by incumbent challenges,
and I cleanly arrange a language to bring more meaning to the space,
using common analogies already popularized by
today's popular deployment languages.</p>
<p>This language is called <em>scope</em>, and I'm more than thrilled
to have hashed through the basic language design at <a href="https://baltimorenode.org/">Baltimore Node</a>
on Thursday night.</p>
<p>Language design is one piece -
I need to learn a bunch of Rust to apply the ideas.
Only... now that I realize the issue,
the &quot;bunch of Rust&quot; has a clear purpose,
and seems easy to approach,
and is mainly only a basic dependency graph to encode and decode.</p>
<p>I'm sure there's a small package of code I can re-use for the purpose...</p>
        ]]></description>
        <link>https://operand.online/chronicle/Basics (o' composición)</link>
        <guid isPermaLink="false">2025-06-15.Basics (o' composición)</guid>
        <pubDate>Sun, 15 Jun 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>A solid base.</title>
        <description><![CDATA[
          
          <hr/>

          <p>As I go along, in my career, I come across good ideas.</p>
<p>I rarely produce any of the caliber I see becoming popular online,
so I become good at learning the currents around me,
riding on the tide of popular opinion,
and adopting the drills and exercises of my peers.</p>
<p>Some people call me a mimic; this is fine.</p>
<hr />
<p>Today I am looking back at my progress for the preceding year,
and I am realizing - there have been many false launches,
rugs pulled from under my feet, and otherwise unpredictable
occurrences keeping me from producing.
Sure, I keep sharp in some domains -
and occasionally I am able to build a solid base,
such as this essay engine you are reading, only -
as soon as I'm done building, I back up from the program and examine.</p>
<p>This Elixir app is nice. There are a couple unique, bespoke pieces.
You can change color schemes, and it reads source from git directly.</p>
<p>Those shiny angles are pleasing to me as a builder,
only they are rather silly in comparison to all of the shiny gems
I've passed up as I focused on this path.</p>
<p>As an example, I opened up a large box, labeled &quot;Pandora&quot; -
and a menagérie of <a href="https://www.inkandswitch.com/local-first-software/">local-first designs</a> leaped hence.</p>
<p>As I explored the curious animals in this terrarium,
I came across one such who had compiled <a href="https://wasm-git.petersalomonsen.com/"><code>git</code> into <code>webassembly</code></a>.</p>
<p>Amazing! Here I am, forcing you to ask my machine
to read a codebase for you, and relay the measures of code page by page.</p>
<p>Much simpler, here, to use the normal procedures for sharing code,
and help your machine learn to parse and display the pages locally.
And so, my gleaming aims of 2024 are seeming pale and dull already.</p>
<hr />
<p>And alongside, I had imagined dynamic programs,
helping many people collaborate &quot;on the same page&quot;.
Elixir and Phoenix are a superb approach to reach this baseline,
as I experienced. Only... they grew up a'fore my eyes.</p>
<p><a href="https://electric-sql.com/">ElectricSQl</a>
became a drop-in engine able to bring your records to users,
and immensely more usable alongside browser JavaScript packages
than the cludgy <a href="https://hexdocs.pm/phoenix_live_view/js-interop.html">Phoenix Hooks</a> paradigm I had been using before.</p>
<p>This comparison, indeed, made me reconsider some of the compromises
I made along the road. How did my apps all come to look bland,
seem similar in appearance, and lack a unique flair?
Ah, the prevailing <a href="https://tailwindcss.com">Tailwind</a> of the day.</p>
<p>Once I caught hold of the breeze, I fell for the allure of speed,
and had no eye for the rocky shoals ahead.
Here I am, praising color changes on an app,
when all of my styling rules reside in a single <code>.css</code> file.</p>
<p>In olden years, I'd harp on co-located styling rules,
and had even charted courses through web components,
the shipping lanes of the large corporate fleets.</p>
<p>And ho! Is this no less than the approach made possible by <a href="https://unocss.dev/">UnoCSS</a>,
or the colocation <a href="https://github.com/solidjs/solid/pull/2492/files">explained by the solid-element</a> plugin?</p>
<hr />
<p>Alas, faded ambición.
My searches had persuaded me that the hull I had made
is shabby, dank, and dim.
In any case, far from able to carry me on to far-off seas.</p>
<p>And so, demoralized by my small corner hole I needed to huddle in,
I disconnected from the keyboard and pursued more music,
essays and lyrics replacing expressions and logic.</p>
<p>I am sincerely glad I did so, primarily for the sole memory I earned,
of being onstage, spotlights in my eyes, peering through the shine
into the deep silhouettes of an audience, ready to share and bare
the small remnants of soul I carry. Is a memory to seek again.</p>
<p>And so energized and dedicated, I come back aboard my small shabby ship,
and gaze around and realize, here is the place I abandoned my depression;
I see signs of the languid days piled all around,
and as I doze here the old emoción seeps back and the grip seals on me.</p>
<p>I need be quick, decide on impulse and act in assurance,
to build a road from this den of despair,
and reach once again through perspire and pursuance,
a small glimpse of sky and some much fresher air.</p>
<hr />
<p>And this has brung me, by shedding assumpcións and implicacións,
to consider <a href="https://solidjs.com/">Solid</a> as a replacement for my aims.</p>
<p>There is once again room to explore, to reach far horizons,
to build a base capable enough to carry real cargo,
to build up a hardy crew,
and to design courses pursuing liberacións more than escapes.</p>
<p>My ambivalence and disillusionment towards the course of React
has opened my gaze to an alternative line of attack;
one promising a broader channel and calmer passage,
and opening up choice of dirección for any heading one could choose.</p>
        ]]></description>
        <link>https://operand.online/chronicle/A solid base.</link>
        <guid isPermaLink="false">2025-05-27.A solid base.</guid>
        <pubDate>Tue, 27 May 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Open Source Summit / scholarship applicación</title>
        <description><![CDATA[
          
          <hr/>

          <h2>10. Briefly describe the ways in which you are involved in the technology and/or open source communities.</h2>
<p>I am collaborating with engineers across the East Coast to build a curriculum for communications modernization, from program to policy.</p>
<p>Our discussions aim to bring local-first programs (https://inkandswitch.com) into legislative offices, to expand the use of secure and censorship-resistant deployment principles, and to share resources through mesh networking and peer auth.</p>
<p>Our association is composed of the eager learners who are commonly found in maker-spaces, hackerspaces, and public libraries. In a normal week, I can be seen in Rockville Science Center (MD), Baltimore Node, Baltimore Hackerspace, and NYC Resistor - usually drilling someone on a practical lesson plan based on NixOS and Nushell. This course has become solid enough to launch a screencast domain explaining common use cases - planned to launch on June 1.</p>
<p>I have a rich background leading programs, as secretary of HacDC (2023), Code for America fellow (2016), and VP of MSU's ACM student chapter (2011 - 2014). I began many of the current Congressional modernization programs as a coder in the House Clerk's office, where I began a collaboration with the House Digital Service - to build room for open-source deployments and in-house program design alongside legacy House processes.</p>
<h2>11. Why would you like to attend this event?</h2>
<p>Our group is under-resourced, and is beginning to align on common language and aims after years of loose dialogue. To amplify our reach, we are launching a series of screencasts to focus on the new generation of coding basics: memory-safe and machine-portable programs, designed to expand peoples' horizons, rather than bind them to a desktop.</p>
<p>The human concerns are something core to my philosophy - I take the laborious approach of a cyber nomad to ensure that our programs are accessible in some of the most challenging edge-cases, such as under sail and solar energy. Hackerspaces and libraries are used as kindling to spark curiosity, while connections to serious research groups and sponsors help ensure the mission remains on solid ground.</p>
<p>Some of our most reassuring discussions have happened in online message boards, where we can learn from groups including Ink &amp; Switch, Radicle, and Muni.Town how to build for resilience and our common humane concerns. Our local human-to-human discussions are always engaging, and all of us are eager to bring our day-to-day practice to the builders we admire in the open source scene.</p>
<p>Our main hope is to decrease reliance on commercial programs offered by corporations who are more eager to sell out their consumers than help them. Our approach is to build dispersed online labs in our homes and shared spaces, to build, share, and re-deploy openly-licensed source code, and to share our skills and experience through public demonstrations: through blogs, screen captures, pair programming, and guided hackathon challenges.</p>
<p>As more people lend their experiences, we begin to chip down the many barriers to online communication, that keep the mass public from the education they need to make use of open source. The resources and lessons are all here; our engineers simply need a chance to engage in - and share - the practice.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Open Source Summit / scholarship applicación</link>
        <guid isPermaLink="false">2025-05-12.Open Source Summit / scholarship applicación</guid>
        <pubDate>Mon, 12 May 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Splice - Potluck, Cambria, and Wildcard</title>
        <description><![CDATA[
          
          <hr/>

          <p>Hello, Peter and Geoffrey;</p>
<p>Especially Geoffrey; I spent the day poring through many of your PhD publications; these seemed to clarify many ideas of user experience I'd been aiming for subconsciously. I'd like to describe a serious problem space in the middle of your three research programs: Wildcard, Potluck, and Cambria.</p>
<p>Of these examples, the most inspiring experience to me is wildcard - I am an enthused and eager web scraper, and migrating from Ruby / Capybara to Elixir / Wallaby has hardly been enough for me - I'd like equal access to web pages that require sign-in, or pages that make use of doom-scrolling; accomplishing these aims requires the JavaScript execution layer. Earlier, I learned some of the <a href="https://gleam.run">Gleam</a> language by compiling <a href="/gram/panel">a simple plugin</a>, and I am eager to build upon this base again.</p>
<p>I did mess around, and had no luck spinning up a copy of Wildcard. Typescript has changed a bunch since 2021 (~1500 errors), so I am simply reading many of the modules and learning how much I can apply from the early approach. The core pieces all changed a bunch since embedded SQLite, handsontable, and bootstrap, so a ground-up rebuild seems simpler.</p>
<hr />
<h2>Sidebar: Launch Wildcard.</h2>
<p>Spoke much too soon! I came back around to examine the error, now using <a href="https://extensionworkshop.com/documentation/develop/getting-started-with-web-ext/">web-ext</a> to speed up the process. I also added <a href="/gram/card/flake.nix">a minimal <code>flake.nix</code></a>, so I could ensure all dependencies in a reproducible local shell.</p>
<p>In my normal commands, I rely on my <a href="https://operand.online/gram/build/config/nushell/nix.nu">nushell helper <code>nd</code></a>, so <code>web-ext run</code> becomes <code>nd web-ext run</code>. On a normal machine, such a command reads as: <code>nix develop --command 'web-ext run'</code>. These prefixes are simply assurance that all the dependencies are in place, so I'll assume you can manage dependencies on your machine and ignore the prefixes here.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">yarn install
</div><div class="line" data-line="2">node build.js # many errors! no problem, ignore all.
</div><div class="line" data-line="3">web-ext run -u news.ycombinator.com
</div></code></pre>
<p>I had been really surprised that web-ext managed to open a firefox panel at all - in my opinion, the compilation had failed under the burden of endless typescript semicolon concerns. Only, there was an installed plugin in the window, and I could see in the console an error message referencing the HackerNews site adapter.</p>
<p>I poked around and realized that the HN markup has changed since 2021 - the selector <code>a.storylink</code> is now <code>.title a</code>. I made the change <a href="/gram/card/src/site_adapters/hackerNews.ts">in my copy</a>, and upon <code>node ./build.js</code> the running <code>web-ext</code> process picked up on the change.</p>
<p><img src="https://share.operand.online/gram/page/media/2025-03-27.card.png" alt="@geoffreylitt's wildcard running locally!" /></p>
<p>I needed a second to realize the page already had the wildcard pane open, happily rendering all of the HN records as promised. Research needs to be reproducible, no? I'm incredibly pleased to accomplish this at the end of a 36-hour in-office research marathon.</p>
<hr />
<p>I managed to fill a dry-erase board, merging ideas from the three programs into a single experience. From a blank browser pop-up panel, I imagined adding pglite; simple enough, I'm sure. At this phase I realized the core logic of wildcard is the bidirectional mapping, from the html page to the database table. I read a couple of the site adapters, and can see that each one maps a recognized URL into a pre-coded arrangement of columns in the table. Nice and simple, and I'd like to praise Geoffrey's efficiency in cracking these specific use cases.</p>
<p>Again, much progress has happened since 2021. I considered how to splice Cambria and Wildcard. In addition to mapping one JSON body to another, Cambria also handles incremental changes using the JSON patch spec. So ideal! Browser execution means open websockets, so a scraper can stream rather than poll. This is the only (sensible) approach on pages that rely on doom-scrolling mechanics. Patch streams may also help someone roll up group discussions into periodical summaries - you could keep Slack open in a long-running background tab, on a headless machine, and sync the pglite table to the eerily absent command-line program all of us need.</p>
<p><img src="https://share.operand.online/gram/page/media/2025-03-26.splice.jpg" alt="dry erase exploración of program recombinación" /></p>
<p>Yes, I realize - Cambria is JSON! Wildcard is HTML! Potluck is language! There is a challenge here, to expand Cambria to ingress / egress HTML and beyond, alongside the normal JSON use case. There is surely promise here - Cambria, Wildcard, and Potluck are all based on bidirectional synchronization, and all operate on the principle of reshaping.</p>
<p>Although Cambria definitions are much more specified, Wildcard uses the full JS language to apply the adapters to the page. Otherwise, site adapters and lenses share a common purpose. Additionally, both languages are deeply structured, and can be made to comply to schemas:</p>
<p>JSON-schema is a rich and common language for describing the shape of a JSON blob. No surprises.</p>
<p>HTML can be described using numerous schema languages, such as DTD - document type definitions. These are usually gnarly. The Cambria page has a (pessimistic) reference also to XSLT.</p>
<p>So, how do you properly consider, that - many HTML pages include embedded JSON. JSON can easily embed HTML. And these are only two of many schema-bound languages we may care to parse through. YAML and TOML are in the same mold. Markdown can include code samples in any language. And if you manage to approach plaintext documents using a Cambrian lens, perhaps you'd easily reproduce Potluck.</p>
<p>Here is a core issue I'd like to consider;</p>
<p>Maybe someday, a Cambrian lens could recognize meaningful shapes in numerous languages. In this case, do any of XML or JSON or YAML make sense to describe the lens any more? If a lens is responsible for parsing a source in one language, could the lens recognize a sub-measure of the source made up of an embedded language, and slice the pieces accordingly? How could a single lens description address changes bidirectionally (sourcemaps, maybe)? Can a logical calculation, applied to a shape mapped from any source, carry a conclusion through to the original source location (all signs say yes)? <a href="https://github.com/mergestat/treequery">How could a schema language possibly map across numerous source languages?</a></p>
<blockquote>
<p>Spurred by success, I proceeded to clone and upgrade <a href="/gram/luck">gram:luck</a> and <a href="/gram/shape">gram:shape</a>, alongside <a href="/gram/card">gram:card</a>. All of these easily run in a local, offline mode, so I'm happy to head back to the sailboat and pick them to pieces as needed. <a href="/gram/shape">gram:shape</a> (<code>json-sheets</code>) required a small upgrade to run on Vite.</p>
<p>Much obliged to Geoffrey, and much more to come!</p>
</blockquote>
        ]]></description>
        <link>https://operand.online/chronicle/Splice - Potluck, Cambria, and Wildcard</link>
        <guid isPermaLink="false">2025-03-26.Splice - Potluck, Cambria, and Wildcard</guid>
        <pubDate>Wed, 26 Mar 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Compose</title>
        <description><![CDATA[
          
          <hr/>

          <p>Hi, Peter and Alex;</p>
<p>I'm glad you messaged, especially to learn how the House of Representatives is doing business these days. I could speak for hours and hours on this theme, and I'm glad for a chance to organize some of these ideas prior to sharing more broadly on my domain.</p>
<hr />
<p>A good place to begin is by glancing through the House XML schemas, shared on <a href="https://xml.house.gov">xml.house.gov</a>.</p>
<p>for years, those schemas have described all ofthe legislation shared on <a href="https://congress.gov/">congress.gov</a>. You can see one of these schemas, called <a href="https://operand.online/gram/page/src/schema.js">bill_dtd</a>, copied into Automerge &amp; Prosemirror code (although the prosemirror code precedes automerge, and the binding is surely lacking).</p>
<p>Aside from these now-legacy schemas, some composition is already happening in a new model, <a href="https://github.com/usgpo/uslm">US Legislative Markup</a>. USLM is far from the daily use you'd hope to see after years in incubation, mainly because of the horrid inaccessibility of the composition engine in use since 1985; <a href="https://xmetal.com">XMetaL</a>.</p>
<p>XMetaL has been in use far longer than any normal enterprise program, because of the organization's inability to make a sensible upgrade. WYSIWYG is top-of-mind for lawyers, and combined alongside legislation's need for a rigorous schema, and burdensome procurement policies, my first glance at XMetaL involved combing through 3000+ macros, in a combination of JavaScript, Perl, and VBScript, to bind the editor to the needs of the House. Meanwhile, the Senate procedures around drafting had diverged, producing another unique collection of thousands of macros.</p>
<p>After months of pain and dread caused by this predicament, <a href="https://share.operand.online/2023-01-04.xmetal.mkv">I recorded my screen</a> one day so I could remember the horrors; otherwise, this program has earned its place in the so-called online dark ages.</p>
<video controls>
  <source src="https://share.operand.online/2023-01-04.xmetal.webm" type="video/webm"/>
</video>
<p>So, I'm sure such a program made sense in the beginning, when WordPerfect had been in common use and the internet was for email. The one serious concern to be raised about using this in the 2020's is, how do you educate hundreds of new staffers to use such a hodgepodge program, each couple years?</p>
<p>Uh... and so the horror becomes an embarrassment. Because no one does learn to use this; there is no congressional member office that composes legislation directly. Those staffers, and I'm sure some adventurous members, all use Microsoft Word, and then email a support office called <a href="https://legcounsel.house.gov/">Legislative Counsel</a>. The LegCounsel has a couple - shockingly few - career lawyers who smush all these amazing-or-dangerous policy ideas into an amazing-or-dangerous legal schema. So one small and sad office of lawyers types all the laws congress passes or fails to pass, year after year. This old XML program has them chained to their keyboards and inboxes.</p>
<p>Once their draft, made in XMetaL, properly imagines the ideas from the members' email attachments, they need to clear the language with the member. So, one of the many macros is able to export a Microsoft Word document. Uh. Yeah. The draft goes back to Microsoft Word. And the drafted language <code>.docx</code> (I was responsible for adding the <code>x</code>) is marked for &quot;Track Changes&quot;, and once again attached to an email. Clearly, the aim of this email is the generation of another word document, designed to capture any corrections the member has in mind. I'd like to say this is all handled in less than three round trips; because this is the only case in my career I've felt a need to describe NFS shares to lawyers. Only please do bear in mind the couple bills surpassing 3000 pages, proposed and passed during each year's appropriations season. If you're close to crying or screaming then you're beginning to realize the cause of Congressional unpopularity.</p>
<p>Ah, yeah. You're also seeing why I am so eager to make new connections; especially among coders again, and especially among those who are re-imagining applications. I made a big push as an employee for in-house program design, and I deployed numerous open-source programs on premise, all of which were met with demands from my boss to return to our vendor-contracted waterfall design process on an app to smash more email attachments, now through some proprietary Microsoft Azure pipelines. I recall some Microsoft employees being daily regulars on our planning calls, mainly to echo and encourage the one House employee who has experience deploying to Kubernetes. After 15 months, I gladly said goodbye; then took another two years to clean up the damage to my sobriety, which has included moving onto a sailboat in the Chesapeake Bay; another splendid use case for local programs on low-energy machines (see <a href="https://100r.co">100r.co</a>).</p>
<p>I am gradually impressing upon my former colleagues that far from being bliss, their ignorance is causing their pain to progress to an incurable degree; I am also making a case that there are new approaches being made, and I had a chance to play key pieces of your LocalFirstFM interview during Tuesday's meeting. Really though, I can only describe their 250-year-old operation as a circus, dressed for church and singing to the percussion of a hammer on a podium.</p>
<hr />
<p>Luckily, I had chances to bond connections to nearly all of the responsible support offices in the House, and momentum for change nearly always begins in the 430-member house before reaching the deliberate, languid echelon of 100 Senators who seem to imagine some quill-smudges on parchment can hold up for a quarter-millenium.</p>
<p>These support offices are full of people who can explain in narcolepsy-inducing depth (and indeed, my narcolepsy began here in DC) the specific causes and reasons behind each procedure - clearly mixing up reasonable and sensible. In all cases, they came to the Capitol complex in admiration of the elected paragons of democracy who demand that anyone in a support office &quot;pay grade&quot; shall remain nameless in any designs. Once I recognized that this dynamic causes all decisions of consequence to be shelled out; commissioned to private companies, I happily embraced the arguments that led to termination; and then quickly re-incorporated my solo LLC company as a DC corporation, able to raise nearly a million USD in capital. In essence, all this means is that I published an essay in a blog; I do remain proud of <a href="https://operand.online/chronicle/corp">the essay</a>.</p>
<p>I also spent many hours in local engineering groups, such as <a href="https://hacdc.org">HacDC</a> - where <a href="https://huggingface.co/hyperdemocracy">HyperDemocracy</a> came to be. The LLM craze has all my neighbors in a serious hype, while I am simply preoccupied by how to access my coding dependencies offshore. As HacDC's secretary and one of the few who has seen the energy of an early career in San Francisco (also during Rdio's days), I did a bunch of research on where local programs are going - during one hackathon I packaged up Elixir/Erlang's BEAM VM, alongside SQLite, into a native Android app. I began reading as much Ink &amp; Switch as I could, and I'm glad to see you all picking up your pace, as you release production apps and packages. I seriously considered ending my coding career long ago, because all roads began looking like dead ends; your philosophies share a rare coherence that leads to much more humane experiences.</p>
<p>As I gather courage again to aim at the issues surrounding Congress, I am also digging in on a problem raised by HacDC - the need to migrate their domain from the common combination of WordPress &amp; MediaWiki; I'd like to enable both programs to dump pages to a <code>.git</code> codebase, to be equally rendered by a local offline reader (hat-tip to Aaron Swartz and the enduring legacy of RSS readers), or an online domain process necessary for search-engine propagation (and I hope we can discuss how to apportion granular search indices across machines, perhaps under sail near the Puget Sound someday).</p>
<hr />
<p>This message has clearly become the embodiment of a deep and rich mess of problems, unique to the boundary line of aeons-old legal code, and decades-old machine code. I am seriously glad to speak to you as you consider how to mature the idea of application programming to a new generation; the nascent approaches are nonsense in the nation-building landscape. Although the 12-factor essay made for good reading in 2015, the other side of the coin has 10 commandments etched in.
I clearly need nothing more than a space to share and discuss this summary of issues; it all seems much to serious for Discord and much too drab for many of the social circles in DC, where currency and security issues choke all considerations of consumer experience.</p>
<p>I am eager for any impressions you can share, before discussing resources. These ideas are all bound for the blog, and I am sure there are places I can sharpen or dull the language as needed.</p>
<p>Because there is such a deep scope in play, I'd like to coordinate among my local engineering groups before mirroring the discussions and code on GitHub or more popular domains. Peer coordination seems to be a special focus of your company's mission, so I am eager for recommendations on arranging dialogue and managing the build's progress. After years of managing the gradual decay of homelabs, my only lead is to spin up <a href="https://github.com/charmbracelet/soft-serve">soft-serve</a> as soon as possible.</p>
<p>More than anything, I am immensely pleased to add to the dialogue around these approaches - I imagine that birds of a feather flock together, simply because they're all sick of where they've been so far, can smell the seasons changing, and realize it's going to be far too long a haul to manage alone.</p>
<p>Building up;
Calliope</p>
        ]]></description>
        <link>https://operand.online/chronicle/Compose</link>
        <guid isPermaLink="false">2025-03-13.Compose</guid>
        <pubDate>Thu, 13 Mar 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Operand Company; Incorporación Proposal</title>
        <description><![CDATA[
          
          <hr/>

          <h2>Operand Company</h2>
<p>Operand seeks to increase resilience in chosen open-source programs,
including many necessary code packages and compilación processes
underlying each of them.</p>
<p><a href="/chronicle/corp-a">See prior, abandoned, incorporación ideas.</a></p>
<hr />
<h2>Appraisal: Programs as commercial resources.</h2>
<p>Programs need broad public reach to accomplish commercial success;
meaning adopción raises endurance.</p>
<p>Large commercial companies rely on the success of core programs
to subsidize the bills of smaller more niche experimentation.
Such experiments are usually closed, and their producción ended,
so long as no approach to commercial income can be seen.
More unique or promising experiences
may cause the publicación of research papers, on occasion.</p>
<p>Besides company labs,
many popular onscreen experiences are produced in the open,
using nearly no commercial resources -
in some cases merely a thesis carried through as a hobby,
commonly as learning exercises
or as a necessary repair to someone's chosen processes.</p>
<p>Such code, called open-source,
is produced across innumerable homes and offices globally,
and is generally licensable for many commercial or noncommercial purposes.</p>
<p>Programmers need open-source codebases to keep up to modern machinery,
or many cherished onscreen experiences begin a process of sublimación;
no longer running on consumers' machines and no longer reproducible by peers.</p>
<h2>Sublimación, explained economically.</h2>
<p><em>Sublimación</em>; in our descripción, is the ephemeral degradación of a resource
as surrounding condicións become unable to hold the resource in place reliably.
A resource's niche of operación becomes increasingly small,
in essence 'drying up' and disappearing.</p>
<p>Sublimación is a challenge seen in nearly all occupacións,
although as disciplines age and are aided by shared research
and commonly agreed-upon language,
spaces capable of upholding shared resources are expanded,
so as to increase the resources' endurance in human mind-space;
making all necessary resources more reliable.
As examples;</p>
<ul>
<li>
<p><em>Legal code</em> can be read many hundreds of years since publicación,
and hold nearly the original meaning in the minds of readers;
humans' minds are comparable,
and many people can closely imagine scenarios applicable to the original authors.
In essence, learning of the human condicións of millenia ago
help us in a process of emulación; bringing sense back to logics described in archaic languages.</p>
</li>
<li>
<p><em>Engineering and architecture diagrams</em> are a medium capable of being read
globally and across language barriers, because of a common base comprehension
of maths and number theories.</p>
</li>
</ul>
<p>Curiously, a similarly-dangerous process of sublimación is in process annually,
in the biological domain of agriculture.
Original seed germs are increasingly being replaced by synthesized clones;
the niches germane to breeding of original-seed crops are shrinking -
again using popular phrasing, causing populations of organic crops to 'dry up'.</p>
<p>Such sublimación is much more a problem in machine coding disciplines than in similar occupacións,
supposedly because the discipline's young economic age
causes commercial cycles of hyper-adopción and reckless abandonment,
recognizable to any guardians or cleaners of small childrens' playrooms.</p>
<p>Popular incomprehension among consumers leads to dangerous presumpcións
around duración, price, and energy use of onscreen experiences,
leading to reckless abandonment of the precious machines used to express them,
and disregard for the enormous burden of coordinación essenciál in their producción.</p>
<hr />
<blockquote>
<p>Much more could be said around themes comparing machine coding
to numerous human occupacións and hobbies -
from meal preparación to consumer producción to the embroidery of images.
Our company, in the course of incorporación,
is able to comprehend the landscape more clearly
by relying on lenses of biology and language;
in essence, considering the biographies of popular programs
as they progress an inescapable course from birth to death;
composición to erasure.</p>
</blockquote>
<hr />
<h2>Operand makes open-source adopción simpler.</h2>
<p>Large global corporacións keep commercial dominance by means of closing borders;
users of Gmail bound to be users of Google Drive,
and similarly does Outlook encourage use of Office 360.
Rarely are users encouraged or enabled to explore the expanding number
of equally usable, though usually more disconnected,
open source replacements made and published under no regard for commercialización.</p>
<p>An organizing body is necessary to encourage consumers to choose open source programs;
these programs can be made more secure than many closed-source, corporación-beholden codebases,
so a moral obligación demands our company to make public-domain programs
equally as appealing as the more popular choices in use globally today.</p>
<p>Our iniciál plan for encouraging adopción includes code-based and machine-based approaches.</p>
<h3>Approach A: Ensure reliable open-source codebases.</h3>
<p>Many open-source coders are unpaid and challenged to manage a barrage of issues each day,
raised by users of their code across the globe; rarely do such producers see income in response.</p>
<p>Operand seeks to channel resources to the managers of key codebases,
chosen on a basis of resiliency and endurance,
as a means of ensuring decades of operación for many necessary programs.
Using sponsorships and cash prizes as primary means of encouragment
can help align coders' energy to the needs of public-domain users.</p>
<p>Our company's <em>operación leads</em> are commissioned to sponsor public-good open-source missions.
Of 9 possible, some likely ones are already chosen:</p>
<ul>
<li>Produce NixOS and Nix-language bindings across more accessible programming languages.</li>
<li>Upgrade common legacy PHP programs, including WordPress, MediaWiki, and Joomla,
by plugging in their popular database schemas to more modern application layers.</li>
<li>Ensure Graphene OS becomes reliable on many mobile machines.</li>
<li>Ensure Mobile NixOS becomes reliable on many mobile machines.</li>
<li>Encourage adopción of open-source discussion boards, code and graphic design producción programs,
passcode managers, and graphic design programs.</li>
<li>Encourage use of the Gleam language as a general-purpose any-machine applicación base.</li>
</ul>
<p>Addiciónally, produccións such as code readings and appraisals
can help encourage educación around secure coding approaches,
and express the need to keep the public resource of necessary code
held by the shared commons.</p>
<h3>Approach B: Share program access on deployed machine banks.</h3>
<p>Learning to change the programs one uses can be enough of a challenge,
disregarding the burden of operación for many open-source programs.</p>
<p>As businesses begin to consider dropping their dependencies
on incumbent and dangerously opaque programs,
Operand remains ready to shoulder the burden of managing shared resources.</p>
<p>In place of the common game plan among cloud companies -
leasing colocación space in enormous buildings -
Operand plans to mobilize in order to chase demand.</p>
<p>Our company's conneccións among companies like <a href="https://ascxnd.com">Ascxnd</a>
promise unique deployments of small, cloud-like modular boxes;
in essence, repurposed shipping containers made up as modular processing blocks.</p>
<p>Such processing rigs can be placed on a trailer and hauled,
to be plugged in as response to numerous supposed demands;
including the needs of construction companies or emergency responders.</p>
<p>In addición to mobile lab builds,
our company plans to enable libraries, schools, and small businesses
to keep smaller business-essenciál deployments running in-house.</p>
<hr />
<h2>Share summaries</h2>
<p>Our company shares are designed to be co-held by our employees;
only employee shareholders are able to earn a salary.</p>
<p>Sponsors each help decide on deployments of company-managed gear.</p>
<table>
<thead>
<tr>
<th align="right">share class</th>
<th align="left">summary</th>
<th align="right">#</th>
<th align="right">$ per</th>
<th align="right">$ sum</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right"><em>operación lead</em></td>
<td align="left">hires or sponsor employees.</td>
<td align="right">9</td>
<td align="right">$400</td>
<td align="right">$3,600</td>
</tr>
<tr>
<td align="right"><em>employee</em></td>
<td align="left">deploys and runs shared machines.</td>
<td align="right">90</td>
<td align="right">$400</td>
<td align="right">$36,000</td>
</tr>
<tr>
<td align="right"><em>sponsor</em></td>
<td align="left">chooses lab and gear deployments.</td>
<td align="right">3200</td>
<td align="right">$300</td>
<td align="right">$960,000</td>
</tr>
<tr>
<td align="right">peak cap</td>
<td align="left"></td>
<td align="right"></td>
<td align="right"></td>
<td align="right"><strong>$999,600</strong></td>
</tr>
</tbody>
</table>
        ]]></description>
        <link>https://operand.online/chronicle/Operand Company; Incorporación Proposal</link>
        <guid isPermaLink="false">2024-04-21.Operand Company; Incorporación Proposal</guid>
        <pubDate>Sun, 21 Apr 2024 00:00:00 </pubDate>
      </item>
    
  </channel>
</rss>
