<?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>Tue, 08 Sep 2026 00:00:00 </lastBuildDate>
    <pubDate>Tue, 08 Sep 2026 00:00:00 </pubDate>
    <ttl>1800</ttl>
    <atom:link href="https://operand.online/rss" rel="self" type="application/rss+xml"/>

    
      <item>
        <title>buy my codes (!)</title>
        <description><![CDATA[
          
          <hr/>

          <p>As anyone can see,
programs and code can be either used for liberation, access, and education -
or for harassment, intimidation, surveillance, and terrorization.</p>
<p><a href="https://buymy.codes"><code>buymy.codes</code></a> is a chance to decide properly.</p>
<hr />
<p>Engineers really fumbled, it seems.
The heady rush of early online communication
threw us into a frenzy;
with <code>hackers</code> leading the charge,
and of course hoarding all of the keys to the kingdom they came across -
the keys to the engines, machines, and programs.</p>
<p>Threatened by the hackers,
the lawyers and business managers huddled up as usual.
They decided on the <a href="https://www.justice.gov/jm/jm-9-48000-computer-fraud">Computer Fraud and Abuse Act</a>,
and began criminalizing some common norms of online conduct.</p>
<p>Popular media began to engage in online discussions,
through blogs - although the media conglomerates had more reach.
The <code>2000</code> merger of <a href="https://www.history.com/this-day-in-history/january-10/aol-time-warner-formed">AOL and Time Warner</a> began to herald
the inexhaustible push of cinema and television,
their sails full of advertising currents.</p>
<p>Only a couple years earlier in <code>1998</code>, Google had launched.
They now needed to earn their place in competition
among AOL, MSN, and Yahoo - all major <code>news</code> sources
that could only repackage considerable journalism pieces
into click-bait five-minute dead-end reads;
the dominant form of media in our reach today.</p>
<hr />
<p>Far from the public gaze,
the machinery of immediate advertising was being passed around;
from Facebook to Instagram to Amazon &amp; Google Shopping,
the moment was poised to cascade into the current machine-learning hypnoscape.
The media had decayed beyond common sense,
beyond uncommon sense, into mere commercial (<code>non</code>)sense.</p>
<p>Bad morals became good business,
around the same moment <a href="https://en.wikipedia.org/wiki/Gordon_Gekko">Gordon Gekko</a>'s
resurgence characterized the raison d'être
of the modern financial-tech boom.
High-speed trading became less fashionable than
hyper-speed ad bidding.</p>
<p>Bidding on peoples' conscious energy
sure made more sense for business, also -
more measurable consequences to be sure.
This subcurrent lurked far enough from public gaze
to be eerily effective at making us second-guess our human agency
in a communication landscape whose rules remained hidden.</p>
<p>Then, only when a small collusion of the most greed-compelled media firms
launched a state-capture operation on the American empire,
decapitating its figurehead role
and replacing it with the tropes and icons of reality television,
did we begin to realize that bids on a placement
is no measure of an articles' journalistic soul.</p>
<p>Only when we could finaly examine the mechanisms of bidding
could we realize that propaganda by hundreds of corporations
does as much social damage as the ideologies of a single demagogue.
Our generation tasted each flavor in succession.</p>
<hr />
<p>Soon, the means of propaganda fed a popular ideology;
allegiance to corporation and party ahead of land and neighbor.
The commerce of high-speed bids began to auction off people,
as has happened in the early days of our nation,
now sending people already insecure in employment, healthcare, education,
into forced migration - labeled as <code>trafficking</code> in any other era,
forcing an existential crisis surgically choosing some homes
and encouraging bliss, and ignorance-of-any-issue-at-all,
in the buildings next door.</p>
<p>Our generation's collection of corporations,
who choose to sell people,
forcing displacement from home and family bonds,
ending a life and career and a home all in one go,
so as to punish full nations of people
for seeming to scare the old guard of leaders
into yelling a bit too loudly and insensibly;
as though erasure of an ecology could make some damn crazy men
suddenly find peace, and as though we could find peace in the ensuing silence.</p>
<p>Perhaps other means could be found to silence some damn crazy men,
before the price of their loudness adds more days and more thousands
to the names of those who no longer are.</p>
<hr />
<p>The propaganda is as banal as ever; uninspired puns, mainly,
and designed to inspire only those who are the most desparate for air.</p>
<p>The man whose buddy runs <a href="https://www.boringcompany.com">the boring company</a> happens to be <a href="https://boardofpeace.org/members">bored of peace</a> -
and uses the membership role to emphasize his upbringing's forced masculinity
by holding the singular profiled lady-on-board in a position under-standing,
compared to the clearly-proud dicks surrounding.</p>
<p>The sad piece of propaganda at the core of our problem
could be said to be a discussion on deficit;
the nation has failed to sell enough, perhaps?
Only our advanced manufacturing has long been monogamously embraced to warfare;
&quot;selling more&quot; can only mean more munitions,
in hands of people eager to cause death.</p>
<p>Our nation, or empire, is pleased and peachy keen to keep an image
as the &quot;world's police&quot;.
Indeed, some American police do sell arms to violent murderers.
&quot;America's Finest&quot; are then eager to sell out their customers when payday comes up short.</p>
<p>The shame is inescapable in the propaganda engine also;
violent members of the military,
alongside any aggressor of the mob or criminal syndicate,
are commonly known through the ages as &quot;goons&quot;;
they rebranded to <code>pipe hitter</code>,
as though that were a nod to the <code>gooner</code> label now passed along
to the aimless masses of conscientious objectors.
These drugged-under-influence cyber consumers
can only seek company to mourn and commiserate,
as their chances of peaceful employment now require a passport;
and good luck if you can acquire one any more.</p>
<p>If you fail to help in manufacturing the machinery of war,
you can help in the planning,
the logical complex of code and inference.
Or the hospice and venues and psychological healthcare
positioned as required brakes
on a moving train running too close to the tracks' limits.</p>
<hr />
<p>Enough has long been enough,
and years are going by in the same scenario.
The propaganda, as deployed by the thousands of small page-cuts,
has displayed more resilience to our demands for sense and decency
than we are able to comprehend.</p>
<p>If one is to pursue education,
and social upbringing,
and humane social roles,
then their communications
need to challenge the mechanisms of propaganda.</p>
<p>Any challenge to a social problem begins by assailing
the biases that reflect the problem in our minds.
Propaganda especially occurs in our minds,
and so our language and norms of relationship
need to be rearranged for more guarded composure.</p>
<p>These are the core philosophical and social underpinnings
of a new domain and program by Operand Company;
<a href="https://buymy.codes"><code>buymy.codes</code></a> encourages engineers to decide
more nuance in the causes and applications
their code is used to accomplish.</p>
<hr />
<p><a href="https://buymy.codes"><code>buymy.codes</code></a> is going through a build process,
in parallel to <a href="https://0.legal"><code>0.legal</code></a> and <a href="https://haiku.space"><code>haiku.space</code></a>,
all based on the <a href="https://operand.online/gram/nucleus"><code>nucleus</code></a> program base.</p>
<p>The design needs include...</p>
<ul>
<li>describe a program's aims and boundaries (non-aims).</li>
<li>describe chosen uses the program's composer espouses.</li>
<li>ensure uses are humane.</li>
<li>engage program consumers aligned to chosen usage.</li>
<li>encourage user pledges in exchange for code access.</li>
<li>encourage reciprocal payment for coders' energies,
by binding pledges to a release cycle.
Imagine, rather than &quot;bug bounties&quot;,
&quot;feature bounties&quot; paid to the publisher.</li>
<li>encourage modular program design,
by packaging small releases.</li>
<li>fail to equip or arm social aggressors.</li>
</ul>
<p>Please <a href="mailto:pledge@operand.online">email your pledges for now</a>;
and read more soon.</p>
        ]]></description>
        <link>https://operand.online/chronicle/buy my codes (!)</link>
        <guid isPermaLink="false">2026-09-08.buy my codes (!)</guid>
        <pubDate>Tue, 08 Sep 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Mapping our plan</title>
        <description><![CDATA[
          
          <hr/>

          <p>I missed my handy guidance -
the grand plan that I published long ago.
I figured enough has changed to rebuild this,
and the process was far smoother now;
<a href="https://operand.online/gram/nue/diagram.nu">the <code>diagram</code> command</a>
is now able to quickly reload the browser
(brave, change the code if necessary)
for each change I make in my <code>.d2</code> code.
I was done in only a few considerable hours,
and could spend more energy rearranging -
to keep the dependency lines and my own ideas
from colliding too much.</p>
<p><a href="https://share.operand.online/gram/diagram/share/2026-09.svg">See and zoom the combined map</a>,
or click on the images for a zoomable copy.</p>
<h2>Real</h2>
<p><a href="https://share.operand.online/gram/diagram/share/2026-09.real.svg"><img src="https://share.operand.online/gram/diagram/share/2026-09.real.svg" alt="real" /></a></p>
<h2>Cyber</h2>
<p><a href="https://share.operand.online/gram/diagram/share/2026-09.cyber.svg"><img src="https://share.operand.online/gram/diagram/share/2026-09.cyber.svg" alt="cyber" /></a></p>
        ]]></description>
        <link>https://operand.online/chronicle/Mapping our plan</link>
        <guid isPermaLink="false">2026-09-07.Mapping our plan</guid>
        <pubDate>Mon, 07 Sep 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>HOPE'26 - An Open Forum for Legal Research</title>
        <description><![CDATA[
          
          <hr/>

          <iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/-36ize327Wo?si=XF-AJHZA5TQM5w6l&amp;start=7686" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
        ]]></description>
        <link>https://operand.online/chronicle/HOPE'26 - An Open Forum for Legal Research</link>
        <guid isPermaLink="false">2026-08-16.HOPE'26 - An Open Forum for Legal Research</guid>
        <pubDate>Sun, 16 Aug 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>change</title>
        <description><![CDATA[
          
          <hr/>

          <p>Philosophy teachers say, &quot;All things change.&quot;</p>
<p>Economics teachers say, &quot;Some things never change.&quot;</p>
<p>Political Science teachers say, &quot;Some things <em>are</em> never changed.&quot;</p>
<p>Grammar teachers say, &quot;My career prospects changed.&quot;</p>
<hr />
<p>My remaining grandparents are dying (more quickly each day)
and I'm heading away from them towards New York City.
I'll likely say goodbye to someone(s) before spring is here,
so I suppose this is going to be a cold Michigan winter for me.</p>
<p>I sure am sorry I spent so many years
failing at relationships.
People can be so complex,
and death always renders us so simple.</p>
        ]]></description>
        <link>https://operand.online/chronicle/change</link>
        <guid isPermaLink="false">2026-08-11.change</guid>
        <pubDate>Tue, 11 Aug 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Peace Game: Legislatures Passes Law to Examine Users' Online Presence</title>
        <description><![CDATA[
          
          <hr/>

          <p>A peace game is similar to a war game.
The same, I suppose,
only the rules are more encouraging of diplomacy.</p>
<hr />
<h2>Legislatures Passes Law to Examine Users' Online Presence.</h2>
<p>A ring of three mass shootings occur in large cities,
within hours of each other.
The murderers are each young men,
and detectives manage to unlock their computers
and gain access to their social media pages.
They keep a minimal presence on social media,
and their browser histories are all cleaned up.</p>
<p>One of the computers has a folder called <code>~/.mozilla</code>,
and although Firefox is no longer installed,
this folder includes the remnants of the users' actions
while briefly using Firefox a few months before.
The page log displays domain names for a number of forums,
and the detectives quickly locate
the murderers' social media handles as users on those forums.</p>
<p>A couple weeks of stake-out on the forums
earns FBI agents enough permission to glimpse the discussions,
leading up to the bloody hour.
These three men had corresponded,
and been encouraged by peers who preyed on loneliness and isolation,
and promised glory and immortality;
perhaps the same reason the forum discussions
remained inside of semi-public reach.</p>
<p>The forum's users each notched up another rung in the FBI's alarm profiles,
and the forum operators gained some new hidden admirers
among international intelligence profilers.</p>
<p>The three nations that experienced the murders on this day
reached a new echelon of diplomacy,
and decided that response is no good in comparison to thorough preparation.
Banking on the lessons learned in the aftermath of January 6,
intelligence officers globally began complaining and affirming the record
of how unprepared and blind they, ahead of threats to the public;
how unequipped to disarm or lead the threat into submission.</p>
<p>These nations' legislatures, fearing rapid duplication
of the pre-planned horrors,
demanded a glimpse of the planning phases.
Modernized nations pushed forth from &quot;war on terror&quot;,
into a phase for &quot;disruption of terror&quot;.
Of course; unless disrupted, horrors erupt.</p>
<p>The legislators,
each of them conditioned by childhoods
wherein buildings crumbled and train stations exploded,
where cars barreled into crowds,
and wherein select social media messaging could spur a protest into deadly riot,
siezed their means and demanded thorough comprehension of the cyber-landscape;
the federated enemy's real stronghold.</p>
<p>Browsers were a losing field, being so numerous and niche,
and so the legislatures closed in on the internet service providers (ISP),
whose close franchised relationships to one another
and prior compliance to FCC and similar regulatory schemes
seemed to display clearer inroads.
New policies ensured that three months of each users' online sessions
should be recorded for examination,
that specific online actions
could send users through additional channels for presumptive risk appraisal,
and that - crucially for the bid to earn the sordid public's reluctant shrug,
a user could quickly sample an immediate reading of their logged records.</p>
<hr />
<h2>Dialogue.</h2>
<ol>
<li>Which agencies are quick to abuse this new mechanism?</li>
<li>Describe properly gainful businesses that experience harm from the profiling.</li>
<li>Does this lead to additional policies such as &quot;license to publish&quot;?</li>
<li>Play through the ensuing discussions from the angle of &quot;freedom of speech&quot; / &quot;ban hate speech&quot;.</li>
</ol>
        ]]></description>
        <link>https://operand.online/chronicle/Peace Game: Legislatures Passes Law to Examine Users' Online Presence</link>
        <guid isPermaLink="false">2026-08-02.Peace Game: Legislatures Passes Law to Examine Users' Online Presence</guid>
        <pubDate>Sun, 02 Aug 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>upgrades</title>
        <description><![CDATA[
          
          <hr/>

          <ul>
<li>[ ] combine uscode releases into single git codebase</li>
</ul>
        ]]></description>
        <link>https://operand.online/chronicle/upgrades</link>
        <guid isPermaLink="false">2026-07-31.upgrades</guid>
        <pubDate>Fri, 31 Jul 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>channel</title>
        <description><![CDATA[
          
          <hr/>

          <p><a href="https://youtube.com/@c4lliope/streams">On @c4lliope's channel</a>,
(and <code>c4lliope</code> online, many places),
see some upcoming and prior recording sessions:</p>
<p>recorded in michigan, amerinordo.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=mUcuEWZcd0Q">[code] record hopping! (plumber deploys nushell; pipes shudder).</a></li>
<li>07-31 04:00 <a href="https://www.youtube.com/watch?v=tHs0ZJTs0oA">[code] Spelunc! Legal Rules-as-Code engine from Axiom.</a></li>
<li>07-29 23:30 <a href="https://www.youtube.com/watch?v=7oJfFxjsW9o">[code] add legal sources!</a></li>
<li>07-25 <a href="https://www.youtube.com/watch?v=ADRi9wTwsWg">[code] query congress.gov!</a></li>
<li>07-24 <a href="https://www.youtube.com/watch?v=wX3Zn5n20cU">pick up the pace! deploying operand.</a></li>
<li>07-24 <a href="https://www.youtube.com/watch?v=sud_-ZI3S5M">problems around the globe.</a></li>
<li>07-23 <a href="https://www.youtube.com/watch?v=jBeQeRg33EY&amp;t=15s">coding session! page index.</a></li>
<li>07-22 <a href="https://www.youtube.com/watch?v=2tq4qk9ttQA">a bordering-on-magic show!</a></li>
<li>07-21 <a href="https://www.youtube.com/watch?v=KVp3trvec8M">superuser (Zero Day!)</a></li>
</ul>
        ]]></description>
        <link>https://operand.online/chronicle/channel</link>
        <guid isPermaLink="false">2026-07-30.channel</guid>
        <pubDate>Thu, 30 Jul 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>rain</title>
        <description><![CDATA[
          
          <hr/>

          <p>Rainy days remind me of the sound and lakes
around the city called by the name of <a href="https://en.wikipedia.org/wiki/Chief_Seattle">Seattle</a>,
the sloping roads draining a simple,
measurable flow of the sky into the sea.</p>
<p>These days remind me of Tokyo,
and I hope they could possibly drag on, and on,
seemingly endless days of bored focus,
charging into the sudden moment
wherein a necessary errand can no longer be delayed -
the dash to a normally immemorable shop
requiring a full dress of slicked armor,
umbrellas held high and shaken before binned at the door.</p>
<p>The mood on these days helps me feel human,
more real than the clinical square boxes of our era.
As my fingers pad around sqares inside a metal square beneath a shining square,
on a squared-off desk on four square legs,
and each sharp edge of our language reinforcing this as righteous,
that 90 is the only permissible degree wherein sanity can be found.</p>
<p>Odd, no?</p>
<p>The 90, this four-square slice of 360,
is an homage to the philosophers of greece
from aeons long dust,
philosophers who cared deeply for ideas and communication,
and care nothing for the home you designed
as a perpetually diminishing blend of a parthenon or athena's temple.</p>
<p>In Tokyo, a holiday means seeing a shrine,
serious labor of legs and laces for such a young age.
Those shrines held their place for hundreds of years,
through the bouncing pressure of many millions
of pilgrims plodding through.
Many thousands of rainy days, when the typhoons pounded for a month
as reliably and unbreakingly as the sea onshore.</p>
<p>I can embrace my memories, on rainy days,
the moments of reckless negligence on a ship I scarcely could handle,
moments after escaping harbor in the Chesapeake,
no plan or reading of the weather to prepare me for the sudden onrush,
of sky into sea, and there being me in the middle,
hugging the sail that asked to rip through me,
that spent the dark hours curled beside me in bed,
both of us dripping the fresh drops of dense cloud.</p>
<p>Commotion is in my core, is the lesson I embodied more than any.
Expedition is the calling I ache to respond to,
if our chosen social leaders could call us any place
aside from the office desk or into the path of munitions.</p>
<p>A desk causes me anger, causes me pain and the aches of age.
Send me to a dojo to shake free of those holds.
Send me on a long road to find connections to a place,
to a people, to a land.</p>
<p>How do you suppose we should manage our current crises?
The burning Boreal ash in the air,
some including some small pieces now drying in my hair,
is supposed to be remedied from your desk?
The complex boundary zones of shoreline and basin and levee,
or the insensible flush of landslide,
are supposed to be mapped in real time,
and barely addressed in real space?</p>
<p>I took a class for dance yesterday,
because the burden of days at desk had me sinking.
I long again, now, for motion -
for a chance to honor the body I occupy,
after 34 years of memory gradually has persuaded me
that my body is most excellent in the frigid cold early-morning damp,
or the rush of a close-held grip on a cliffside,
as I ease through a hazardous path for a purposeful aim.</p>
<p>Architecture has been held up as an honorable hobby, or career.
The honor has all fallen on the arches;
the tectonics simply a challenge of quarrying,
a plunge of hand, or spade, or blade, or drill into soil.
A pull and push of perilous loads,
craning higher as all of us chase closer to the sky.</p>
<p>As some go up, many sink.
Those radios that keep us on air
require minerals to read the frequencies we seek;
the lines of communication demanding a fractured labyrinth,
chiseled by bloody hands, unmapped to the the public eye,
whose air is recycled again, and again by the mouths and lungs
of those who go their to take up their place,
their spades and drills, the managed combustions and explosions
an unpurgeable echo in their memories,
though unheard and no alarm to those whose pay calls them forth.</p>
        ]]></description>
        <link>https://operand.online/chronicle/rain</link>
        <guid isPermaLink="false">2026-07-27.rain</guid>
        <pubDate>Mon, 27 Jul 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="l-line" data-line="1">error Invariant Violation: expected workspace package to exist for &quot;eslint&quot;
</div><div class="l-line" data-line="2">error Invariant Violation: expected workspace package to exist for &quot;ts-jest&quot;
</div><div class="l-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="l-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="l-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="l-line" data-line="6">error Invariant Violation: expected workspace package to exist for &quot;@eslint/plugin-kit&quot;
</div><div class="l-line" data-line="7">error Invariant Violation: expected workspace package to exist for &quot;minimatch&quot;
</div><div class="l-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="l-line" data-line="9">error Invariant Violation: expected workspace package to exist for &quot;@babel/cli&quot;
</div><div class="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-line" data-line="94">warning: Git tree &#39;/home/calliope/share/gram/op&#39; is dirty
</div><div class="l-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="l-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="l-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="l-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="l-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="l-line" data-line="1">&quot;@babel/core@^7.0.0&quot;.
</div><div class="l-line" data-line="2">&quot;@babel/core@^7.0.0-0&quot;.
</div><div class="l-line" data-line="3">&quot;@babel/core@^7.0.0-0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="l-line" data-line="4">&quot;@babel/core@^7.12.0&quot;.
</div><div class="l-line" data-line="5">&quot;@babel/core@^7.13.0&quot;.
</div><div class="l-line" data-line="6">&quot;@babel/core@^7.4.0 || ^8.0.0-0 &lt;8.0.0&quot;.
</div><div class="l-line" data-line="7">&quot;jest@^29.0.0 || ^30.0.0&quot;.
</div><div class="l-line" data-line="8">&quot;postcss@^8.0.0&quot;.
</div><div class="l-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="l-line" data-line="1"><span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">{</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;">}</span>
</div><div class="l-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="l-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="l-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="l-line" data-line="1"><span style="color: #e6edf3;">{</span>
</div><div class="l-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="l-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="l-line" data-line="4">    <span style="color: #a5d6ff;">&quot;../deps/*&quot;</span>
</div><div class="l-line" data-line="5">  <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">,</span>
</div><div class="l-line" data-line="6">  <span style="color: #7ee787;">&quot;dependencies&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #e6edf3;">{</span>
</div><div class="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-line" data-line="16">  <span style="color: #e6edf3;">}</span>
</div><div class="l-line" data-line="17"><span style="color: #e6edf3;">}</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="l-line" data-line="1"><span style="color: #e6edf3;">{</span>
</div><div class="l-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="l-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="l-line" data-line="4">    <span style="color: #a5d6ff;">&quot;../deps/*&quot;</span>
</div><div class="l-line" data-line="5">  <span style="color: #e6edf3;">]</span><span style="color: #e6edf3;">,</span>
</div><div class="l-line" data-line="6">  <span style="color: #7ee787;">&quot;dependencies&quot;</span><span style="color: #e6edf3;">:</span> <span style="color: #e6edf3;">{</span>
</div><div class="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-line" data-line="28">  <span style="color: #e6edf3;">}</span>
</div><div class="l-line" data-line="29"><span style="color: #e6edf3;">}</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="l-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="l-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="l-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="l-line" data-line="1">warning: Git tree <span style="color: #a5d6ff;">&#39;/home/calliope/share/gram/op&#39;</span> is dirty
</div><div class="l-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="l-line" data-line="3"><span style="color: #d2a8ff;">Updating</span> project<span style="color: #a5d6ff;">&#39;s igniter dependency ✔
</div><div class="l-line" data-line="4">compiling igniter ✔
</div><div class="l-line" data-line="5">compile ✔
</div><div class="l-line" data-line="6">Dependency phoenix_vite is already in mix.exs. Should we replace it?
</div><div class="l-line" data-line="7">
</div><div class="l-line" data-line="8">Desired: `{:phoenix_vite, &quot;~&gt; 0.4&quot;}`
</div><div class="l-line" data-line="9">Found: `{:phoenix_vite, &quot;~&gt; 0.4.3&quot;}`
</div><div class="l-line" data-line="10"> [Y/n] n
</div><div class="l-line" data-line="11">`phoenix_vite.install` x
</div><div class="l-line" data-line="12">
</div><div class="l-line" data-line="13">Issues:
</div><div class="l-line" data-line="14">
</div><div class="l-line" data-line="15">* assets/vite.config.mjs: File already exists
</div><div class="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">try</span> <span style="color: #e6edf3;">{</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;">}</span>
</div><div class="l-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="l-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="l-line" data-line="2">
</div><div class="l-line" data-line="3"><span style="color: #d2a8ff;">/assets/public</span>
</div><div class="l-line" data-line="4">
</div><div class="l-line" data-line="5">
</div><div class="l-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="l-line" data-line="7">
</div><div class="l-line" data-line="8"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">assets/vendor/daisyui-theme.js</span>
</div><div class="l-line" data-line="9"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">assets/vendor/daisyui.js</span>
</div><div class="l-line" data-line="10"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">assets/vendor/topbar.js</span>
</div><div class="l-line" data-line="11">
</div><div class="l-line" data-line="12">
</div><div class="l-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="l-line" data-line="14">
</div><div class="l-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="l-line" data-line="16">
</div><div class="l-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="l-line" data-line="18">
</div><div class="l-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="l-line" data-line="20">
</div><div class="l-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="l-line" data-line="22">
</div><div class="l-line" data-line="23">
</div><div class="l-line" data-line="24">
</div><div class="l-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="l-line" data-line="26">
</div><div class="l-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="l-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="l-line" data-line="29"><span style="color: #d2a8ff;">*</span> <span style="color: #e6edf3;">assets.setup</span>
</div><div class="l-line" data-line="30">
</div><div class="l-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="l-line" data-line="32">
</div><div class="l-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="l-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="l-line" data-line="35">
</div><div class="l-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="l-line" data-line="37">
</div><div class="l-line" data-line="38"> <span style="color: #d2a8ff;">D</span> <span style="color: #e6edf3;">assets/package.json</span>
</div><div class="l-line" data-line="39"> <span style="color: #d2a8ff;">D</span> <span style="color: #e6edf3;">assets/vite.config.mjs</span>
</div><div class="l-line" data-line="40"> <span style="color: #d2a8ff;">D</span> <span style="color: #e6edf3;">assets/yarn.lock</span>
</div><div class="l-line" data-line="41"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">config/dev.exs</span>
</div><div class="l-line" data-line="42"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">config/prod.exs</span>
</div><div class="l-line" data-line="43"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">config/runtime.exs</span>
</div><div class="l-line" data-line="44"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">flake.lock</span>
</div><div class="l-line" data-line="45"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">flake.nix</span>
</div><div class="l-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="l-line" data-line="47"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">lib/op_web/router.ex</span>
</div><div class="l-line" data-line="48"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">lib/render.ex</span>
</div><div class="l-line" data-line="49"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">mix.exs</span>
</div><div class="l-line" data-line="50"> <span style="color: #d2a8ff;">M</span> <span style="color: #e6edf3;">mix.lock</span>
</div><div class="l-line" data-line="51"> <span style="color: #d2a8ff;">D</span> <span style="color: #e6edf3;">priv/static/images/logo.svg</span>
</div><div class="l-line" data-line="52">
</div><div class="l-line" data-line="53">
</div><div class="l-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="l-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="l-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="l-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="l-line" data-line="58"><span style="color: #d2a8ff;">Unchanged</span>:
</div><div class="l-line" data-line="59">  <span style="color: #d2a8ff;">bandit</span> <span style="color: #e6edf3;">1.11.0</span>
</div><div class="l-line" data-line="60">  <span style="color: #d2a8ff;">cachex</span> <span style="color: #e6edf3;">4.1.1</span>
</div><div class="l-line" data-line="61">  <span style="color: #d2a8ff;">call</span> <span style="color: #e6edf3;">0.0.2</span>
</div><div class="l-line" data-line="62">  <span style="color: #d2a8ff;">db_connection</span> <span style="color: #e6edf3;">2.10.1</span>
</div><div class="l-line" data-line="63">  <span style="color: #d2a8ff;">decimal</span> <span style="color: #e6edf3;">3.1.0</span>
</div><div class="l-line" data-line="64">  <span style="color: #d2a8ff;">dns_cluster</span> <span style="color: #e6edf3;">0.2.0</span>
</div><div class="l-line" data-line="65">  <span style="color: #d2a8ff;">earmark_parser</span> <span style="color: #e6edf3;">1.4.44</span>
</div><div class="l-line" data-line="66">  <span style="color: #d2a8ff;">eternal</span> <span style="color: #e6edf3;">1.2.2</span>
</div><div class="l-line" data-line="67">  <span style="color: #d2a8ff;">ex_ast</span> <span style="color: #e6edf3;">0.11.2</span>
</div><div class="l-line" data-line="68">  <span style="color: #d2a8ff;">ex_doc</span> <span style="color: #e6edf3;">0.40.2</span>
</div><div class="l-line" data-line="69">  <span style="color: #d2a8ff;">ex_hash_ring</span> <span style="color: #e6edf3;">6.0.4</span>
</div><div class="l-line" data-line="70">  <span style="color: #d2a8ff;">ex_heroicons</span> <span style="color: #e6edf3;">3.1.0</span>
</div><div class="l-line" data-line="71">  <span style="color: #d2a8ff;">expo</span> <span style="color: #e6edf3;">1.1.1</span>
</div><div class="l-line" data-line="72">  <span style="color: #d2a8ff;">file_system</span> <span style="color: #e6edf3;">1.1.1</span>
</div><div class="l-line" data-line="73">  <span style="color: #d2a8ff;">finch</span> <span style="color: #e6edf3;">0.22.0</span>
</div><div class="l-line" data-line="74">  <span style="color: #d2a8ff;">floki</span> <span style="color: #e6edf3;">0.38.1</span>
</div><div class="l-line" data-line="75">  <span style="color: #d2a8ff;">gettext</span> <span style="color: #e6edf3;">0.26.2</span>
</div><div class="l-line" data-line="76">  <span style="color: #d2a8ff;">git_cli</span> <span style="color: #e6edf3;">0.3.0</span>
</div><div class="l-line" data-line="77">  <span style="color: #d2a8ff;">glob_ex</span> <span style="color: #e6edf3;">0.1.11</span>
</div><div class="l-line" data-line="78">  <span style="color: #d2a8ff;">hpax</span> <span style="color: #e6edf3;">1.0.3</span>
</div><div class="l-line" data-line="79">  <span style="color: #d2a8ff;">igniter</span> <span style="color: #e6edf3;">0.8.0</span>
</div><div class="l-line" data-line="80">  <span style="color: #d2a8ff;">jason</span> <span style="color: #e6edf3;">1.4.5</span>
</div><div class="l-line" data-line="81">  <span style="color: #d2a8ff;">jumper</span> <span style="color: #e6edf3;">1.0.2</span>
</div><div class="l-line" data-line="82">  <span style="color: #d2a8ff;">live_debugger</span> <span style="color: #e6edf3;">0.3.2</span>
</div><div class="l-line" data-line="83">  <span style="color: #d2a8ff;">lumis</span> <span style="color: #e6edf3;">0.5.0</span>
</div><div class="l-line" data-line="84">  <span style="color: #d2a8ff;">makeup</span> <span style="color: #e6edf3;">1.2.1</span>
</div><div class="l-line" data-line="85">  <span style="color: #d2a8ff;">makeup_elixir</span> <span style="color: #e6edf3;">1.0.1</span>
</div><div class="l-line" data-line="86">  <span style="color: #d2a8ff;">makeup_erlang</span> <span style="color: #e6edf3;">1.1.0</span>
</div><div class="l-line" data-line="87">  <span style="color: #d2a8ff;">mdex</span> <span style="color: #e6edf3;">0.12.2</span>
</div><div class="l-line" data-line="88">  <span style="color: #d2a8ff;">mime</span> <span style="color: #e6edf3;">2.0.7</span>
</div><div class="l-line" data-line="89">  <span style="color: #d2a8ff;">mint</span> <span style="color: #e6edf3;">1.8.0</span>
</div><div class="l-line" data-line="90">  <span style="color: #d2a8ff;">nimble_options</span> <span style="color: #e6edf3;">1.1.1</span>
</div><div class="l-line" data-line="91">  <span style="color: #d2a8ff;">nimble_parsec</span> <span style="color: #e6edf3;">1.4.2</span>
</div><div class="l-line" data-line="92">  <span style="color: #d2a8ff;">nimble_pool</span> <span style="color: #e6edf3;">1.1.0</span>
</div><div class="l-line" data-line="93">  <span style="color: #d2a8ff;">owl</span> <span style="color: #e6edf3;">0.13.0</span>
</div><div class="l-line" data-line="94">  <span style="color: #d2a8ff;">phoenix</span> <span style="color: #e6edf3;">1.8.7</span>
</div><div class="l-line" data-line="95">  <span style="color: #d2a8ff;">phoenix_html</span> <span style="color: #e6edf3;">4.3.0</span>
</div><div class="l-line" data-line="96">  <span style="color: #d2a8ff;">phoenix_html_helpers</span> <span style="color: #e6edf3;">1.0.1</span>
</div><div class="l-line" data-line="97">  <span style="color: #d2a8ff;">phoenix_live_dashboard</span> <span style="color: #e6edf3;">0.8.7</span>
</div><div class="l-line" data-line="98">  <span style="color: #d2a8ff;">phoenix_live_reload</span> <span style="color: #e6edf3;">1.6.2</span>
</div><div class="l-line" data-line="99">  <span style="color: #d2a8ff;">phoenix_live_view</span> <span style="color: #e6edf3;">1.1.30</span>
</div><div class="l-line" data-line="100">  <span style="color: #d2a8ff;">phoenix_pubsub</span> <span style="color: #e6edf3;">2.2.0</span>
</div><div class="l-line" data-line="101">  <span style="color: #d2a8ff;">phoenix_template</span> <span style="color: #e6edf3;">1.0.4</span>
</div><div class="l-line" data-line="102">  <span style="color: #d2a8ff;">phoenix_vite</span> <span style="color: #e6edf3;">0.4.3</span>
</div><div class="l-line" data-line="103">  <span style="color: #d2a8ff;">plug</span> <span style="color: #e6edf3;">1.19.1</span>
</div><div class="l-line" data-line="104">  <span style="color: #d2a8ff;">plug_crypto</span> <span style="color: #e6edf3;">2.1.1</span>
</div><div class="l-line" data-line="105">  <span style="color: #d2a8ff;">postgrex</span> <span style="color: #e6edf3;">0.22.2</span>
</div><div class="l-line" data-line="106">  <span style="color: #d2a8ff;">req</span> <span style="color: #e6edf3;">0.5.17</span>
</div><div class="l-line" data-line="107">  <span style="color: #d2a8ff;">rewrite</span> <span style="color: #e6edf3;">1.3.0</span>
</div><div class="l-line" data-line="108">  <span style="color: #d2a8ff;">rustler_precompiled</span> <span style="color: #e6edf3;">0.9.0</span>
</div><div class="l-line" data-line="109">  <span style="color: #d2a8ff;">sleeplocks</span> <span style="color: #e6edf3;">1.1.4</span>
</div><div class="l-line" data-line="110">  <span style="color: #d2a8ff;">sobelow</span> <span style="color: #e6edf3;">0.14.1</span>
</div><div class="l-line" data-line="111">  <span style="color: #d2a8ff;">sourceror</span> <span style="color: #e6edf3;">1.12.0</span>
</div><div class="l-line" data-line="112">  <span style="color: #d2a8ff;">spitfire</span> <span style="color: #e6edf3;">0.3.11</span>
</div><div class="l-line" data-line="113">  <span style="color: #d2a8ff;">telemetry</span> <span style="color: #e6edf3;">1.4.2</span>
</div><div class="l-line" data-line="114">  <span style="color: #d2a8ff;">telemetry_metrics</span> <span style="color: #e6edf3;">1.1.0</span>
</div><div class="l-line" data-line="115">  <span style="color: #d2a8ff;">telemetry_poller</span> <span style="color: #e6edf3;">1.3.0</span>
</div><div class="l-line" data-line="116">  <span style="color: #d2a8ff;">text_diff</span> <span style="color: #e6edf3;">0.1.0</span>
</div><div class="l-line" data-line="117">  <span style="color: #d2a8ff;">thousand_island</span> <span style="color: #e6edf3;">1.4.3</span>
</div><div class="l-line" data-line="118">  <span style="color: #d2a8ff;">tox</span> <span style="color: #e6edf3;">0.2.3</span>
</div><div class="l-line" data-line="119">  <span style="color: #d2a8ff;">unsafe</span> <span style="color: #e6edf3;">1.0.2</span>
</div><div class="l-line" data-line="120">  <span style="color: #d2a8ff;">websock</span> <span style="color: #e6edf3;">0.5.3</span>
</div><div class="l-line" data-line="121">  <span style="color: #d2a8ff;">websock_adapter</span> <span style="color: #e6edf3;">0.5.9</span>
</div><div class="l-line" data-line="122">  <span style="color: #d2a8ff;">yamerl</span> <span style="color: #e6edf3;">0.10.0</span>
</div><div class="l-line" data-line="123">  <span style="color: #d2a8ff;">yaml_elixir</span> <span style="color: #e6edf3;">2.12.1</span>
</div><div class="l-line" data-line="124">  <span style="color: #d2a8ff;">yaml_front_matter</span> <span style="color: #e6edf3;">1.0.0</span>
</div><div class="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">try</span> <span style="color: #e6edf3;">{</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;">}</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="l-line" data-line="2"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">try</span> <span style="color: #e6edf3;">{</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;">}</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="l-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="l-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;">{</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;">{</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;">}</span> <span style="color: #e6edf3;">}</span>
</div><div class="l-line" data-line="2"><span style="color: #e6edf3;">[</span> <span style="color: #a5d6ff;">assets/vendor/daisyui-theme.js</span>
</div><div class="l-line" data-line="3"><span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">each</span> <span style="color: #e6edf3;">{</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;">}</span>
</div><div class="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-line" data-line="13"><span style="color: #d2a8ff;">remote</span>: the work tree to HEAD.
</div><div class="l-line" data-line="14"><span style="color: #d2a8ff;">remote</span>:
</div><div class="l-line" data-line="15">remote: You can set the <span style="color: #a5d6ff;">&#39;receive.denyCurrentBranch&#39;</span> configuration variable
</div><div class="l-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="l-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="l-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="l-line" data-line="19"><span style="color: #d2a8ff;">remote</span>: other way.
</div><div class="l-line" data-line="20"><span style="color: #d2a8ff;">remote</span>:
</div><div class="l-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="l-line" data-line="22">remote: &#39;receive.denyCurrentBranch&#39; configuration variable to <span style="color: #a5d6ff;">&#39;refuse&#39;</span>.
</div><div class="l-line" data-line="23"><span style="color: #d2a8ff;">To</span> <span style="color: #e6edf3;">76.112.8.171:unshare/page</span>
</div><div class="l-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="l-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>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>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>No Other World</title>
        <description><![CDATA[
          
          <hr/>

          <p>Hi, I am here to tell you about Argentina's Shamballa Permaculture Project. We are representatives of Armenia's ARK Armenia, happy to be here. Down in Australia we've connected up our Aboriginal Wetland Burning, Shoalwater Culture, Gawula, Greening Australia, How Aboriginals Made Australia, Kachana Land Restoration, One Acre Small Permaculture Project, Permaculture Research Institute, Purple Pear Farm, Rehydrating the Landscape, Regenerate Australia, and the Yarra Yarra Biodiversity Corridor. We're a busy crowd!</p>
<p>We are from Belize's Coral Reef Restoration. I represent Bolivia's Food Security. I, Borneo's How to Restore a Rainforest. We are from Brazil's Centro de Experimentos Forestasis, also Restoration Through Agroforestry. We come to you from Burkina Faso's The Forest of Lilengo, and the group Reforesting with Ancient African Farming Practices. Cameroon here: the Bafut Ecovillage.</p>
<p>Canada's delegation represents Bkejwanong Traditional Knowledge, Jardins d'Ambroisie, the Great Bear Rainforest, Miracle Farms, Taking Root, and Water for the Future. China's delegation is happy to speak for A Man Plants a Forest, Eco-Civilization, Greening China's Desert, Horqin Desert Reforestation, Karamay Ecological District, Kbuqi Desert Greening the Silk Road, Loess Plateau Watershed Restoration, Transforming Deserts to Cropland, World's Largest Man-made Forest, and Zhejiang Green Rural Revival Program.</p>
<p>From the Congo we are Bonobo Conservation, Participatory Mapping, and Virunga National Park. From Costa Rica, we are the Orange Peel Experiment, Punta Mona, and Vida Verde Water Retention. I am here to proudly speak for Cuba's Sustainable Agriculture Revolution, on its eighty-fifth birthday. We are from Denmark's Vitsohus Permakultur. I have been sent to you by Ecuador's Cloudforest Agroforestry. I from Egypt's Creating a Forest in the Desert. From England we represent Agroforestry Research Trust, the Eden Project, Knepp Estate Rewilding, Rewilding Britain, and River Restoration.</p>
<p>From Eritrea we are Manazares Mango Regeneration, from Ethiopia, Ethiopia Rising, the Miracle of Merere, Regreening Ethiopia's Highlands, Restoring Ecosystems, and the Watershed Movement. For France we happily represent Pur Projet Agroforestry. From Guatemala we are Reserva de Biosfera Maya and the Asociac'on de Comunidades Forestales. We speak for Reforesting Haiti. From Holland we represent the Land Life Company and Tiny Forest.</p>
<p>Honduras sends you the Roots of Migration. The Hopi Nation is here with Hopi Raincatchers. Iceland sends you Afforesting Iceland, and Regenerating Forests. From India we come to tell you of Agroforestry in Arau, Aravali Institute of Management, Barren Land into Luscious Forest, Cooperative Sustainable Agriculture, Creating a Forest in a Cold Desert, Crowd Foresting, the Farmer Scientist, Fishing Cat Conservancy, Food Sovereignty, Foundation for Ecological Security, Hand-Planting a 300-Acre Forest, Mangrove Restoration in the Sundarbans, Miracle Water Village, Miyawaki Afforestation Program, Natural Farming, Navdanya Biodiversity Farm, Planting 50 Million Trees in One Day, Planting 66 Million Trees in 12 Hours, Protecting Rice Diversity, Rejuvenated Lakes in Bangalore, Sadhana Forest, Sai Sanctuary, Seeds of Life, Sikkim the First Organic State, Water Fields, Water Harvesting, and River Restoration.</p>
<p>Indonesia greets you with its Biorock Coral Reef Restoration, Mangrove Action Project, Mangrove Restoration, and Manta Reef Restoration Project. Israel present its Growing Forests in the Desert, and Kibbutz. We are from Japan and bring news of Creating Forests to Reduce Tsunamis. I come from Jordan to tell you of Greening the Desert. We Kenyans are proud to represent East African Hydrologic Corridor, Green Belt Movement, Kaikipia Permaculture Center, Northern Rangelands Trust, and Rainwater Harvesting. Madagascar celebrates its Great Forest Restoration by the example of Project Moringa, and Using Trees to Save Lives.</p>
<p>Mexico presents Greening the Chihuahuan Desert, Intensive Silvopasture, Hidden Rivers, Reforestation and Water Protection Group, and Via Organica. Morocco brings you its organization Making the Desert Bloom. We come from Nepal to describe the Beyul Project and the Anthropocene Wilderness Group. New Zealand here: Hinewai Reserve, Mangarara Ecco Farm, and the Regenerators. As with all the other countries gathered here, tip of the iceberg really.</p>
<p>I come from Niger to tell you of Farmer Managed Natural Regeneration, and Re-greening in Niger. From Norway we speak of Polar Permaculture Solutions. The Oglala Lakota Nation sense a representative from the Oglala Lakota Culture Economic Revitalization. We are from Panama's Mamoni Valley Preserve. Peru wants to tell you of its Biocorredor Martin Sagrado. We from the Philippines have news of Forest Regernation, National Greening Program, and Saving a Fishery and Coral Reef.</p>
<p>We from Portugal celebrate the Fazenda Tomati Permaculture, Sown Biodiverse Pastures, Tamera Water Retention Landscape, and Wildlings. I am from Qatar's Sahara Forest Projet. From Russia with love: Pleistocene Park, Wet Carbon Storage, and Siberian Wildlife Support. I am from Rwanda's Forests of Hope. We Scots are here for Britain's Oldest Forest, Dendreggan Forest Restoration, Isle Martin Regeneration, On  the Deep Wealth of This Nation, and Peat Bog Restoration. I speak to you for Senegal's Great Green Wall Initiative, also Rolling Back the Desert. From South Africa we speak about EcoPlanet Bamboo, Joe's Garden, Making the Desert Bloom, and Restoring the Baviaanskloof.</p>
<p>I am from the South Korean project Reforestation with 350+ Million Trees. I am from the Syrian project The Art of Regeneration, please help us. I come from Tajikistan to tell you of Reforesting Tajikistan. From Tanzania we speak for Reforesting Kokota Island and Reforesting Gombe's Surround. Tasmania here, we've got a great Giant Kelp Restoration Project, also Restoring Pine Plantations. I am from Thailand to tell you about Indigenous Knowledge and Forestry, Planting Mangroves, and Sahainan Permaculture Farm. Uganda sent me to speak of Permagardens and Uganda's New Forests.</p>
<p>We come from the United States as representatives of Accelerating Appalachia, American Prairie Reserve, Broken Ground Permaculture, Food Forest Farm, Holistically Managed Bison, Homegrown Revolution, Institute of Permaculture, Kiss the Ground, Klamath River Basin Restoration, Lake Erie Bill of Rights, the Land Institute, the Leopold Institute, Los Angeles Green Regeneration, Mirroring Nature's Management, Permaculture for the People, Planetary Healing, Planting Justice Farms, Regenerative Ranching, Restoring the Colorado River, Restoring the Redwoods, Restoring the Snake River, Rodale Institute, Saving the West, the Sierra Club, Singing Frogs Farm, Soil Health Institute, Stewards of the Wild Sea, Tabula Rasa Farms, Tending the Wild, Weaving Earth, Wild Idea Buffalo Company, and Wild Oyster Project.</p>
<p>I am from Zambia to tell you of the Betterworld Mine Regeneration. I am from Zimbabwe to speak for the Africa Centre for Holistic Management, and the Chikukwa Ecological Land Use Community Trust.</p>
<p>We are all here together to share what we are doing, to see each other, and to tell you our stories. We are already out there working hard, everywherere around this Earth. Healing the Earth is our sacred work, our duty to the seven generations. There are many more projects like ours already in existence, look us up on your YourLock account and see, maybe support us, maybe join us. You will find us out there already, now, and then you must also realize we are only about one percent of all the projects out there doing good things. And more still are waiting to be born. Come in, talk to us. Listen to our stories. See where you can help. Build your own project. You will love it as we do. There is no other world.</p>
        ]]></description>
        <link>https://operand.online/chronicle/No Other World</link>
        <guid isPermaLink="false">2025-11-24.No Other World</guid>
        <pubDate>Mon, 24 Nov 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>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="l-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;">{</span>
</div><div class="l-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="l-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="l-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="l-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="l-line" data-line="6">  <span style="color: #d2a8ff;">parse</span> <span style="color: #a5d6ff;">&#39;&lt;{link}&gt;; rel=&quot;https://api.w.org/&quot;&#39;</span> <span style="color: #79c0ff;">|</span>
</div><div class="l-line" data-line="7">  <span style="color: #d2a8ff;">get</span> <span style="color: #e6edf3;">link.0</span>
</div><div class="l-line" data-line="8"><span style="color: #e6edf3;">}</span>
</div><div class="l-line" data-line="9">
</div><div class="l-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;">{</span> <span style="color: #d2a8ff;">print</span> <span style="color: #e6edf3;">}</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="l-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;">{</span>
</div><div class="l-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="l-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="l-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="l-line" data-line="5">  <span style="color: #79c0ff;">try</span> <span style="color: #e6edf3;">{</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;">}</span>
</div><div class="l-line" data-line="6"><span style="color: #e6edf3;">}</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="l-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="l-line" data-line="2">
</div><div class="l-line" data-line="3"><span style="color: #d2a8ff;">timeit</span> <span style="color: #e6edf3;">{</span> <span style="color: #e6edf3;">[</span>
</div><div class="l-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="l-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="l-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="l-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="l-line" data-line="8"><span style="color: #e6edf3;">]</span> <span style="color: #79c0ff;">|</span> <span style="color: #d2a8ff;">each</span> <span style="color: #e6edf3;">{</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;">}</span> <span style="color: #e6edf3;">}</span>
</div><div class="l-line" data-line="9">
</div><div class="l-line" data-line="10"><span style="color: #8b949e;"># for a colleague&#39;s domain:</span>
</div><div class="l-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="l-line" data-line="1"><span style="color: #d2a8ff;">➜</span> <span style="color: #e6edf3;">scope</span> <span style="color: #e6edf3;">commands</span>
</div><div class="l-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="l-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;">{</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;">}</span>
</div><div class="l-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="l-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="l-line" data-line="6">
</div><div class="l-line" data-line="7"><span style="color: #d2a8ff;">╭────┬────────────┬─────────────╮</span>
</div><div class="l-line" data-line="8"><span style="color: #d2a8ff;">│</span>  <span style="color: #8b949e;"># │ extension  │   command   │</span>
</div><div class="l-line" data-line="9"><span style="color: #d2a8ff;">├────┼────────────┼─────────────┤</span>
</div><div class="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-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="l-line" data-line="2">
</div><div class="l-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="l-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="l-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="l-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="l-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="l-line" data-line="8"><span style="color: #e6edf3;">]</span>
</div><div class="l-line" data-line="9">
</div><div class="l-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="l-line" data-line="11">
</div><div class="l-line" data-line="12"><span style="color: #d2a8ff;">timeit</span> <span style="color: #e6edf3;">{</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;">{</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;">{</span><span style="color: #79c0ff;">|</span><span style="color: #e6edf3;">f</span><span style="color: #79c0ff;">|</span>
</div><div class="l-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="l-line" data-line="14"><span style="color: #e6edf3;">}</span> <span style="color: #e6edf3;">}</span> <span style="color: #e6edf3;">}</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="l-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="l-line" data-line="2"><span style="color: #d2a8ff;">wordpress.org</span>
</div><div class="l-line" data-line="3"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">block-directory</span>
</div><div class="l-line" data-line="4"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">blocks.csv</span>
</div><div class="l-line" data-line="5"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">blocks.json</span>
</div><div class="l-line" data-line="6"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">blocks.yaml</span>
</div><div class="l-line" data-line="7"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">blocks.yml</span>
</div><div class="l-line" data-line="8"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">categories.json</span>
</div><div class="l-line" data-line="9"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">categories.yaml</span>
</div><div class="l-line" data-line="10"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">categories.yml</span>
</div><div class="l-line" data-line="11"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">comments.json</span>
</div><div class="l-line" data-line="12"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">comments.yaml</span>
</div><div class="l-line" data-line="13"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">comments.yml</span>
</div><div class="l-line" data-line="14"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">media.json</span>
</div><div class="l-line" data-line="15"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">media.yaml</span>
</div><div class="l-line" data-line="16"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">media.yml</span>
</div><div class="l-line" data-line="17"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">pages.json</span>
</div><div class="l-line" data-line="18"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">pages.yaml</span>
</div><div class="l-line" data-line="19"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">pages.yml</span>
</div><div class="l-line" data-line="20"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">posts.json</span>
</div><div class="l-line" data-line="21"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">posts.yaml</span>
</div><div class="l-line" data-line="22"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">posts.yml</span>
</div><div class="l-line" data-line="23"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">search.json</span>
</div><div class="l-line" data-line="24"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">search.yaml</span>
</div><div class="l-line" data-line="25"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">search.yml</span>
</div><div class="l-line" data-line="26"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">statuses.json</span>
</div><div class="l-line" data-line="27"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">statuses.yaml</span>
</div><div class="l-line" data-line="28"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">statuses.yml</span>
</div><div class="l-line" data-line="29"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">tags.json</span>
</div><div class="l-line" data-line="30"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">tags.yaml</span>
</div><div class="l-line" data-line="31"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">tags.yml</span>
</div><div class="l-line" data-line="32"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">taxonomies.json</span>
</div><div class="l-line" data-line="33"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">taxonomies.yaml</span>
</div><div class="l-line" data-line="34"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">taxonomies.yml</span>
</div><div class="l-line" data-line="35"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">types.json</span>
</div><div class="l-line" data-line="36"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">types.yaml</span>
</div><div class="l-line" data-line="37"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">types.yml</span>
</div><div class="l-line" data-line="38"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">users.json</span>
</div><div class="l-line" data-line="39"><span style="color: #d2a8ff;">├──</span> <span style="color: #e6edf3;">users.yaml</span>
</div><div class="l-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="l-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="l-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>
    
  </channel>
</rss>
