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

    
      <item>
        <title>How to be humane in the late 2020s?</title>
        <description><![CDATA[
          
          <hr/>

          <p>I am experienced; I'll begin here.
As in any discussion,
please bring any ideas you'd be pleased to share,
and consider me only one,
among many sides on this issue.</p>
<p>I spend many days doing research online;
in cyber-space, and this seems to be disconnecting me
from many of my peers,
in a geographic sense and also emotionally.
One of the big challenges I come across,
I experience each day, lies in an issue
that I find rather easy to describe.</p>
<p>Recognizing this problem required years of research,
because in my mind, I'd been seeking something
that I could perhaps find online,
inside the echoes of ideas that people share in public.
Because the space of our shared ideas is so large,
and in so many senses anonymous,
that how could the idea I seek fail to be seen
in such online space?</p>
<p>Then, as in any issue that plagues anyone,
I began to realize the source of my dis-ease.
The cause of my annoyances, of my angers,
of my impulse to push aside closeness
in any of my relationships,
perhaps came from a problem in me?</p>
<p>A simple social reel described this phenomenon,
when a popular folk musician sat down
to learn from other guitarists.
Someone in the room said,
&quot;you don't change how the instrument plays,
you change how you play.&quot;</p>
<p>And after this idea echoing in my mind for months,
after examining from each angle my connection to my research,
I began to sense differently the space I am in.</p>
<p>My problem in online spaces is how big our online spaces seem to be.</p>
<hr />
<p>Online space, &quot;cyber space&quot;
as originally coined by William Gibson in <em>Neuromancer</em>,
is described as &quot;a consentual hallucination&quot;.
This is the sum of the ideas that people choose to share in public.
The recordings of real spaces,
and the imaginings of endless impulsing minds.</p>
<p>The raging rush of ideas that passes us by
in each moment is incalculable.
In each hour, immeasurable.
In each sleep, in each day, incomprehensible.</p>
<p>Lucky us, that so much of this rush is meaningless.
And such a burden, in deciding where the meaning seems to lie.</p>
<hr />
<p>Cyber space seems to be big, because in essence,
our ideas can become so small.</p>
<p>As I record my ideas here, on my keyboard
(measuring around 12&quot; across),
the nuances of my penmanship are meaningless;
only the sequence of alphanumerics and grammar
are recognized by the machine. These are the keys.</p>
<p>The keys I impress in my machine are recorded,
in magnetic spaces no human eye can possibly see,
far smaller than a single pixel on the screens
we use to replay the recordings,
those pixels also inordinately small and indiscernable.</p>
<p>No more pyramids or walls,
no more bridges or towers,
the engineering of our modern age seeks to build the miniscule.</p>
<p>How odd our obsession.</p>
<hr />
<p>I call the ideas you're reading here an &quot;echo&quot;,
as I call most online media an &quot;echo&quot; rather than a &quot;recording&quot;,
because when there are so many records to go through,
the cacophony and discordance has no other summary.</p>
<p>My echoes are going to be displayed in some index,
alongside the musings of similarly sleepless composers,
and biased to appear in proximity to others
deemed to be in a similar education range and career path.
The audience un-sensible, the copies numerous,
the relays pushing our echoes as quickly as possible
into the memory chips of our peers -
our contemporaries, our colleagues,
our companion humans on earth.
Their screens read back the echoes,
in hopes that the meaning remains clear
as the signal propagates through precise rules of replay,
replay, replaying as years and years go by.</p>
<p>As the keys I press are encoded,
they shrink into spaces smaller than they perhaps should be.
Smaller than they need be.
Small is easy to copy, easy to reproduce, and easy to echo.</p>
<p>By making our ideas small, more of us can pass them around.
The speed of ideas increases, and the emotional connection
of each is compressed, becoming sharper and punchier.</p>
<p>'Shock and awe', 'clickbait', 'pornographic',
and your page may be punchy enough to spread,
may become a virus able to reproduce,
may be a memory burned on our conscience
as in so many other scars.
There's language to describe this obsession,
the scrolling, the doomsday repetition
of small scars on a punished psyche,
the inescapable loop of call and response,
ping and pong, a gamification of pleasure and pain.</p>
<hr />
<p>A chemical dependency is normally
used to describe substance abuse,
a drug-caused compulsion.</p>
<p>The rush of ideas and superficial connections
that are being commercialized globally
is also a dependency,
and far more a problem of the masses
than any opioid or opiate crisis could possibly become.
Someone needs to be clear-headed to keep opiates flowing, no?
Though in cyber-space,
we rely on the communication channels in place
to help us produce higher-pace replacements for the same.</p>
<p>How to be humane, then, when the increasing pace
has no describable escape,
and when the machines seem to learn the channels of action,
of democratic and bureaucratic decisions and roles,
of commerce and ecology and language and boundary,
that slip and spill into the consequences of bloodshed?</p>
<p>This is the condition I seem to be seeing;
less 'war' so much, and less 'blood-letting' in a medical sense,
and less 'shed' as in a loss of excess -</p>
<p>'bloodshed' as in 'watershed',
where a full region of geography,
of culture and of humanity seems to be spilling into a sea.</p>
<hr />
<p>How to be humane, in the late 2020s?</p>
<p>How to echo properly? How to amplify the meaningful,
and examine for meaning in the rush of ideas that may harbor any?</p>
<p>If humans are anything compared to other animals,
in this ecology of immediate communication,
our condition is to be susceptible.</p>
<p>Susceptible to dis-ease, to apathy, to negligence, to reckless abandon.
Susceptible to excess and rage and the dispassionate logic of numbers.
Susceptible to numbness.</p>
<p>'Viral' is a real description,
and the spread of these memes and earworms and eyecandies
is as medically concerning as the debilit-ability
of the animals who endure the afflictions.</p>
<hr />
<p>Please no longer chase 'impact', 'hot news', or 'explosive growth';
these are signs of bad business,
signs of high-frequency trading-blows.</p>
<p>Please build upon homes, meals, common ground, blooms;
these are the solid pieces that bring us into company of peers.</p>
<p>And speaking of peers,
there seems to be a slip in how we discuss them online;
&quot;peer-to-peer&quot; relays are a sign of mechanics,
and of how eager we are to adopt the machines
(relays of simple encoded messages) as equals,
our peers, perhaps our leaders.</p>
<p>No; please chase sunshine.
Please chase clean scrubs and numerous grasses
and a sea's crisp breeze.
Poems beyond rhymes,
meaning deeper than seems secure to discuss.</p>
<p>Spend less energy leading machines,
and more in the sensation and encouragement
of humane emotions.
Learn again the basics of language,
including the nuanced shapes and shades of each ones' bodies,
those irreplicable prizes of animaldom,
whom for each of us only one can be called ours.</p>
        ]]></description>
        <link>https://operand.online/chronicle/How to be humane in the late 2020s?</link>
        <guid isPermaLink="false">2026-07-18.How to be humane in the late 2020s?</guid>
        <pubDate>Sat, 18 Jul 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Lies, and Liars.</title>
        <description><![CDATA[
          
          <hr/>

          <p>One of my underlying communication challenges has been
how to produce genuine meaning and connection,
when my role models excel in speaking
out of both sides of their mouths.</p>
<p>If you see recordings of people in interviews,
the higher the stakes rise the more likely you are to see
someone glance to the side as the other is speaking,
and the speaker takes the chance to lick their lips.</p>
<p>Today I'm examining the reasons people lie,
how this has seeped through our social dialogues,
and how honesty (genuity) can be seen as a bridge of solidarity
to people who are lower-confidence, or less secure, than the speaker.</p>
<hr />
<h2>Lies I've Heard</h2>
<p>&quot;Get used to your new life ...&quot;,
she said over a luxurious dinner in a luxurious home
in San Francisco's Haight Ashbury neighborhood.
Perhaps this was a promise aimed to put me at ease,
although she spoke in the airs of a domme,
denying me the space to make any decision about this life.</p>
<p>My head had already been spinning;
nothing about this moment corresponded to any plans of mine.
My recent months of homelessness
made the surrounding comforts seem choking and hostile;
though I'm sure this emotion had been amplified
by her searching gaze, which offered me no escape.</p>
<p>I'm sure she'd been proud of the home she'd arranged,
and the dinner she'd prepared,
and I'm sorry to say that I'd had nothing to be proud of, in that moment.
Recent recognition of my queer gender had broken my family bonds,
pushed me through long periods of housing and unemployment insecurity,
and conditioned a dependency on cannabis to quell anxiety.
The anxiety, of course, had an emotional basis
in a plague of fear for the consequences of dishonest help.</p>
<p>I couldn't see a place for me in the 'new life' she proposed,
and though she saw my discomfort, displacement, and missing purpose -
these were too challenging for us to dig into after the years gone by.
Both of us chose to lie, in ignoring these inadequacies.</p>
<p>Had we the assurance of months ahead
to go through our uniquely damaged psyches,
I'd be able to recognize that this scene,
the dinner table and large portions,
was one I recognized from each day of my childhood.
She'd been appraising my capacity for family,
and her searching gaze that I'd become so desparate to hide from
began to confuse my memories from childhood,
where I never had a voice at the table,
with the recent panic attack I experienced at the same table,
when my parents began seizing my healthcare decisions from me,
beginning with the choice of counselor.</p>
<p>The counselor they chose through <a href="http://catholictherapists.com/">CatholicTherapists.com</a>
I handled with the same cold,
sharp gaze that carried me through
my high-school breakup with the Catholic church to begin with.
See, I'm good at finding lies and attacks hidden among genuine concern.</p>
<hr />
<h2>Lies I've Spoken</h2>
<p>In high school, I sat in the catholic-school cafeteria
across from the monsignor of my church,
who had until now been employing me as a recepitionist in the rectory.
He'd been the biggest role model in the community, of course,
and though he used any authority he could to undermine my decision,
I'd already persuaded my mind
of the senseless harms that religion causes;
how then could he use a spiritual authority to appeal?</p>
<p>I sat through the discussion with a cold mix of shrugs and apathy,
refusing any motion to change my mind or share my reasons,
until he found he had no purchase on my mind or soul;
none that could dissuade the silent sociology
that a queer child practices daily for survival.</p>
<p>In 2017, I applied the same cold, reactionless inertia
to the therapist in Philadelphia.
This man had gained his respect by learning the rulebook,
keeping problems at bay, and using any remaining chances
to aggressively reshape the minds that came to him for help.
He had an ugly demeanor and composure,
and I know that ugly people often succeed
by hiding behind an affront.</p>
<p>The therapist, Peter, thrilled in applying labels to me,
explaining how unfathomable he found me,
in a manner that now reminds me of seduction.
When he had chances to, he attacked the appearances
of trans women, objectifying and genericizing.
I no longer rely on, or place confidence in, any psycho-therapy;
after years of absence from the scene,
I can say that the practice of professional counseling
seems to enable many forms of sexual policing,
meanwhile robbing sexual relationships of their emotional confidence
through the promotion of a higher authority, in the eyes of law.</p>
<p>And so in 2019, I became too anxious and she too eager;
the difference a reliable home can cause.
She'd been going to therapy, and I'd been seeking
someone who could keep me out of therapy for good.
She laid on the couch, closed her eyes,
and when I came to sit nearby on the floor,
placing my hand on her leg, she shrugged me aside.
I asked for a dance, and we chose an album for her record player.
We slept on either side of her bed in silence until morning,
candle burning beside the bedside potted plant.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Lies, and Liars.</link>
        <guid isPermaLink="false">2026-07-14.Lies, and Liars.</guid>
        <pubDate>Tue, 14 Jul 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>happiness</title>
        <description><![CDATA[
          
          <hr/>

          <p>I've been forgetting to pursue happiness;
I suppose I could, if I remembered to.
People seem to be used to doing so.
Or. Do they? People seem to be used to pursuing.</p>
<p>Happiness seems to be something that eludes more,
the more pursued such becomes.
You can chase the ideal in your mind endlessly,
and there shall keep appearing more to be chased.</p>
<p>I am learning to pursue calm,
to borrow the phrase.
Really, a peacable calm abhors pursuit.
I am learning to embody calm.</p>
<hr />
<p>I've been learning that I can pursue happiness,
according to some age-old decree.
How so am I to decide if such a decree
any longer carries meaning?</p>
<p>I am forgetting how to pursue.
There seem to be so many barriers,
from my mind to my surroundings,
to the physical conditions that keep me in place.</p>
<p>I forget that I pursue so much that makes me unhappy.
How so, do I come to hone in on such despair?
How so do I choose again the hollow absences?
How lonely should I become before I ask for you?</p>
<p>Once asked, I suppose you'll be preoccupied.
I suppose you're so used to my ignorant negligence,
that you'll pass up on this chance,
as so many chances passed us by already.</p>
<hr />
<p>How do I pass on such happiness?</p>
<p>You came to be by my side, again in a recurring loop.
I in a cycle of denial, looked beyond, or ahead,
or failed to see through my pain,
and paused as the chances passed.</p>
<p>I persuaded my fears they had grounding;
I engaged those fears and raised them into real scenes.
I embraced my lonely absences. I exercised dismissal.</p>
<hr />
<p>How come I choose such?
The passed moments seem to deny that choice had a say,
so hurried in a chemical rush as I had been.
So submerged in a pheromonal haze.</p>
<p>I've been forgetting to smile.
Perhaps I missed my chance to learn,
and as I see my expressions on camera
I am surprised by my grim demeanor.</p>
<p>How did I become so dim, hopeless and cynical?
How am I failing to engage in cheer?
So much do I shrink, so much do I hide,
and so much do I amplify the horrors inside.</p>
<p>Yes, the paranoias began as a response to the absences.
They began before our disagreements,
and you had a proper reason to condemn them,
although I heard your condemnation as applicable to me.</p>
<p>Had I recognized the paranoia, the paralysis,
I'd brush aside your condemnation and say,
&quot;yes, so dumb of me.&quot; &quot;yes, of course I'm broken.&quot;
Condemn my failings, I can dissociate from those.</p>
<p>Only I failed to recognize, and I held my paranoias close.
Your condemnation became the reason,
or the proof, or the underlying maligned logic,
that caused bubbling fear to splash forth as anger, again.</p>
<hr />
<p>I should be glad that few others seem to experience all this,
these emotions could easily break many.
These feelings changed how I see, and speak, and hear,
and compose my body and mind, and connect to anyone.</p>
<p>I've been forgetting to pursue you; you seemed happy enough,
and how could I do so much as to ask for happiness,
if this should require you to piece through your share,
and reduce your measure for my meager sake?</p>
        ]]></description>
        <link>https://operand.online/chronicle/happiness</link>
        <guid isPermaLink="false">2026-07-13.happiness</guid>
        <pubDate>Mon, 13 Jul 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>abuses</title>
        <description><![CDATA[
          
          <hr/>

          <p>Our day here in the Northern American landmass,
middle ladditudes,
is a celebracion of abuses.</p>
<p>A signed agreement,
by men combined in purpose by miscomprehension of similar biologies,
and enriched mainly by blood upon soil.</p>
<p>I decline;
and only say so much as recognizing the source of our miseries,
a deep sadness of a burdensome legacy,
and scared realizacion of decisions in our momentous hold,
and consequences of dis-spelling or mis-spelling,
and of many abuses enabled by absence of conscience.</p>
<hr />
<h2>Cabin John</h2>
<p>I arose early morning in the Palisades, Western DC.
There is a parade here soon.</p>
<p>I hauled home up to Bethesda,
and am paused alongside an Exxon shop.
I can simply proceed up the road to Frederick,
or respond as needed in Palisades.</p>
<p>This page shall soon include more happenings, per-haps.</p>
<p>I hope calm ensues.</p>
<hr />
<p>Passing near a farmer's market on my course to Malcom X Park,
on a lead I picked up from Free DC organizers on Instagram.</p>
<p>I loaded Instagram on my Samsung Pad,
my current quickest camera -&gt; upload channel.</p>
<p>I unloaded yesterday and packed this morning my DSLR,
charging in-bag.</p>
<p>I'll lodge my camper near the park,
carry my monopod and camera gear,
and a pair of large drumsticks.
You'll see some soon.</p>
<hr />
<h2>Malcom X / Hill</h2>
<p>@ 09:30</p>
<p>Around a block from Malcom X hill;
going around.</p>
<hr />
<p>Reached hill, see grass is open again.
Recorded a couple drum riffs.</p>
<p>As I played one of the presidential helis passed bearing NW.</p>
<hr />
<h2>Adams Morgan</h2>
<p>Descending on Colombia Ave,
a number of ambulances were deployed,
and a large number of national guard members
were on marches through the farmers' market,
and coalescing from the building
on the corner of Columbia &amp; 18th.</p>
<p>I paused to record a number of discussions,
and herded them back around to their van to deploy someplace else.
I do hope our neighbors keep cameras up and aimed today.</p>
<p>Around again to the Palisades for the parade,
accompanying <a href="https://freedcproject.org">Free DC</a>.</p>
<p>@ 11:05</p>
<hr />
<p>@ 14:45</p>
<h2>Palisades</h2>
<p>Parade has been good;
I simply accompanied as a camera operator.
No sign of Free DC, though!
Complicated because many of the groups dressed in the sharp red tee
that I'm used to seeing on the Free DC column.</p>
<p>Rather, I spoke to some of the politicians who were in the parade.
Especially surprised to see my former neighbor
in the campaign squad for our presumed mayor-elect,
Janeese Lewis George.</p>
<p>I was hoping to find my friends and explain
that I'll be going for a week or so.
By now, most people are used to &quot;Calli shows up when they choose&quot;,
so I think no one shall be surprised by my absence.
Rather, I hope that a dedicated push through to Michigan
helps me prepare the builds that are mulling through my mind.</p>
<p>I'll pull the innards from the camper,
re-lay and seal the roof accessories,
slide under and re-plumb the drains,
and find many small chances
to make progress on my cyberspace missions.</p>
<p>I'm now in a small cafe in the Palisades,
cooling from the obnoxious heat.
Next is Frederick, to load up in the storage locker.
I should care not to over-pack,
as I'll be around soon enough with a UHaul,
to clear the remainders from the locker.</p>
<p>I assume there is no cooking,
because the batteries need a small harness
to re-habitate them
after a couple-week discharge in the mechanic's bay.</p>
<p>I suppose I'm saying,
I basically chose and prepared for isolation here,
and I should be pleased rather than dreading its onset.</p>
<p>Here goes.</p>
        ]]></description>
        <link>https://operand.online/chronicle/abuses</link>
        <guid isPermaLink="false">2026-07-04.abuses</guid>
        <pubDate>Sat, 04 Jul 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>sins</title>
        <description><![CDATA[
          
          <hr/>

          <p>Here again, head spinning in a mire of slop;
gleaned from the rash of a dizzying nocturn
from one corner to another in the dim Baltimore hours.</p>
<p>Music, though I missed the show.
Dinner, though I bungled the meal.
Company, though she spared me no glance.
Elegance, though my dress laid threadbare.</p>
<p>I seem to make no impression on people,
or too many, such that the noise surrounds me
as a chrysalis that I peer through.</p>
<p>My guarded zone, occasionally broken
by piercing stabs of aggression,
chiseled to seem cute, cut and dry
from all angles besides the one I embody.</p>
<p>&quot;I'm unused to being naked in a bar&quot;,
I explained to the lady who I'd soon learn had my sister's name,
easy enough to be pleased that I shared the couch beside her,
and as anyone, concerned for my seeming mis-composure.</p>
<p>In the moments prior,
I'd lost my seat on the first bench
as a bearded jack-off leaned in for his &quot;wild proposal&quot;,
one which I had made no indication of agreeing to.
Silence seems to be heard as acquiescence.</p>
<p>In the moments prior,
I had explained to the first person to ask &quot;are you okay&quot; -
&quot;no, I don't need water. I'm meditating.
They do call this trance music, you know.&quot;</p>
<p>Prior to the bar, I'd been on the curb -
spinning the bo (pole) as I'd learned through many bruises,
in parades and musical gatherings,
and in Aikido dojos for years prior.
I had seen a musician I recognized,
who had seemed busy smoking,
and guessing she headed into the bar,
I headed back to my car for the purse;
My skirt had no pockets for my card clip,
and I find the purse a problem in the flow of the bo.</p>
<p>Prior to pulling the bo from my car,
I had to park it at the hackerspace,
in the alley, for enough charge to finish cooking dinner.
I had a larger meal than normal,
on batteries that carry less charge,
now that they've gone through the mechanic's shop
for a couple of unplanned and unchaperoned weeks.</p>
<p>Prior to parking the car,
which is more of a large camper conversion,
I'd been parked on the curb near the bars.
I'd hoped to share the dinner with others around,
though when the inverter begins beeping,
and the cooktop surrenders inside of 30 seconds,
I'd decided to surrender those plans also.
Simpler near the hackerspace,
an extension cord run under the door to the parking lot.</p>
<p>And I'd done this earlier in the day,
at the hackerspace of course,
prior to my shopping for groceries and skirts.
I'd been charging the batteries as much as possible,
as I showered and cleaned and organized the dishes -
some aside for cleaning in the days ahead,
some disposable ones on hand for dispensation.</p>
<p>Once I finally found the skirts I needed,
and the food supplies I'd been ignoring
on these recent cloudy days,
as my fridge demanded hours off...
I parked before I reached the bars,
and the final location for Baltimore's Pride month,
to dress up in my shibari harness.</p>
        ]]></description>
        <link>https://operand.online/chronicle/sins</link>
        <guid isPermaLink="false">2026-06-28.sins</guid>
        <pubDate>Sun, 28 Jun 2026 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Happy?</title>
        <description><![CDATA[
          
          <hr/>

          <p>Oh, she doesn't make me happy.
No, she makes me groan and beg.
She sees me as a lonesome dog
all hunched up on her leg.</p>
<p>I'd sooner choose somebody else
to lay beside, in bed.
Our psycho-social mania
is messing up my head.</p>
<p>She lures me upon loose damp ground,
her spade digs around the edges.
I drop inside a dim abyss
in memories she dredges.</p>
<p>I hear she has some children now,
tho I've not been where they're from.
She asked me under cover,
and I had no chance to come.</p>
<p>So big sis, I guess, or cousin dear,
you really had me clenched;
and I lie in bed each morning,
seems you since became so drenched.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Happy?</link>
        <guid isPermaLink="false">2026-06-28.Happy?</guid>
        <pubDate>Sun, 28 Jun 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>Code for America, sums'it up.</title>
        <description><![CDATA[
          
          <hr/>

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

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

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

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

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

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

          <p>I am becoming unusually calm,
perhaps due to lack of sleep,
in the breaking of the case around Jeffrey Epstein,
and the many people and organizations in association.</p>
<p>There are so many angles from which to approach this scheme,
and I am sure I could spend a career digging through the mess.</p>
<!-- If other coders are similarly occupied, -->
<!-- please email [public@operand.online][p@op] - -->
<!-- or perhaps I'll need to launch a forum for the purpose. -->
<!-- [p@op]: mailto:public@operand.online -->
<hr />
<blockquote>
<p>Seems to be, I've been under immense pressure for many years
to describe my predicament,
the emotion that I've experienced since my memories began,
the same emotion I recognize in innumerable people from any background,
that helps me make immediate connection to all,
aside from the most socially secured.</p>
</blockquote>
<p>Those socially secured are usually paper dragons,
cardboard clones of a dogma they had no choice in,
conditioned through years by the prize of unearned recognition.
They are usually the church choir children,
who ask you if you'd like to go to church,
who are so fragile that they depend for their security
on being able to impose their fragility as someone elses' burden.</p>
<p>These people I recognize,
and I'd been unusually scared by,
largely because I'd been raised by a couple of them.</p>
<p>My dad probably had the worse end,
because his dad is the churchiest deacon I know,
who hardly bothers to speak aside from practicing his bible readings,
or an occasional outburst towards a football game on screen.
Perhaps the mercy he seeks may also apply
to those he shall say goodbye to soon enough.</p>
<p>His name is Gary, and he scolded and became more or less enraged,
using a belt on the boys and causing deep issues among the six children.</p>
<p>My mom's childhood seemed looser and more relaxed,
and so I aligned more to that group during summer holidays.
We'd have the splendid chance to hear of how those siblings
raised a bunch of animals, my mom bringing home ducks and racoons,
and when they adopted a couple retired horses,
once bringing the equine inside the foyer of their home.</p>
<p>Her dad, Henry (Skip) passed more than six years ago already,
and though her mom Martha had a stroke I had been pleased to see her
pick up the knitting needles when I saw her this year,
even if only to show me the basics to begin a (since abandoned) scarf.</p>
<p>That couple also raised six children, oddly enough.
I guess that becomes possible,
on so much land as western Michigan has to spare.</p>
<hr />
<p>If you cross Lake Michigan to go see Chicago,
as in the common first hop from or final hop to the Grand Rapids airport,
you see the incredible change in housing density.</p>
<p>Of course there are some farms, though in many places
those fields have become changed into long large yards,
and the only relation the occupants keep to their once-fields
is to pass a mower across it each week of the growing seasons.</p>
<p>If you do use a car,
and manage to ignore the lingering odor of the campaign signs,
normally from the prior seasons,
you'll round the southern edge of Lake Michigan
and poke for a few miles through Indiana,
near a place called Gerry.</p>
<p>Gerry, Indiana - somehow became recognized enough
to land a place in a popular musical number.
The only thing you see now is the industrial remains,
an open quarry that the highway passing through,
implying sharp cliffs on either edge of the roadside.
The smog is there somehow,
and I'm unclear of the modern lurking processes
behind this phenomenon.</p>
<p>From there, you're in the suburbs of Chicago,
an endless mesh of municipal zones called &quot;______ Park&quot;.
Your commute is accompanied by the L, or perhaps the &quot;el&quot;? -
the elevated rail leading into the city,
double-decker train cars that are your final likely chance
to relax for the day.</p>
<p>Such is the course around Lake Michigan's southern edge,
marked so clearly by polar opposing conditions,
on one side or the other of the tracks.</p>
<hr />
<p>I began keeping a sharp eye open for the places I've been,
and my geographic memory is as good as anyone's,
you can be sure.</p>
<p>I had to begin recognizing my place, and other places,
and the places in the middle,
while most other people were learning the nuance
of their close companion's facial expressions.</p>
<p>Eh, enough comparison to my peers -
my skill lies in places.
And you can learn a bunch of people,
by passing through the places they recognize as a home.</p>
<p>Each home is a place made by people, in the end.
Or perhaps this is simply a piece of the problem.</p>
<hr />
<p>Each year, both during the end-of-year holiday season,
and for a couple summer weeks,
my older sib and younger sib
and older mom and one-year junior dad
had to make a migration, more or less,
from our home near Philadelphia, PA
to the places in Michigan that our kin resided.</p>
<p>In our much younger years,
this had begun as a legal requirement;
a condition of our residential Japanese visas,
which perhaps applied only nine or ten months of the year.</p>
<p>Each summer then, we headed to a condominium in Michigan,
close to my mom's childhood home,
and such maps have been lodged into my mind,
as surely as they are recorded on the GPS logs,
which I could dig up from my memory cards and display,
if a chance so happens.</p>
<p>After August, we'd be on a plane and then back in our Tokyo apartment,
and I'm amazed that this logistical theater had been possible to manage,
for three years on end.</p>
<p>My dad, in his role for corporate finance,
and my mom, who focused on baking specialty Americanized cakes for birthdays,
both began learning colloquial Japanese,
and had to manage two large moves each year.
They needed some help to manage the logic of dual-residency,
plus their three early-school-age children.
I remember, more or less as an ambiguous, reassuring sensation,
our nana, a Philipino lady named Bing.</p>
<hr />
<p>Being such a globehopper at such a young age
should have occurred to me as unusual,
and an exhilirating experience,
although I had bigger problems to endure -
I began to embrace the sensation that each place I passed through
is impermanent, a brief experience.</p>
<p>Many years later,
as I came upon my first sporadic experiences of homelessness in 2019,
I began to recognize and label these immense childhood challenges
as an abnormal sense of displacement.</p>
<p>This reassured me for years, although I missed the mark to be precise.</p>
<hr />
<blockquote>
<p>Seems to be, I've been under immense pressure for many years
to describe my predicament,
the emotion that I've experienced since my memories began,
the same emotion I recognize in innumerable people from any background,
that helps me make immediate connection to all,
aside from the most socially secured.</p>
</blockquote>
<p>My mom and my dad are each deeply conditioned by their childhoods in Michigan,
surrounded by endless sibling bonds and the norms and schedules of their church circles.
Religion is the refuge, in their experience,
for any challenges beyond the daily norm.</p>
<p>Religion, then, had been their ironclad approach
to deny me any means of expressing my gender.</p>
<p>To be sure, I had been up against numerous real problems
as I learned to express my ideas;
religion simply became the point of inflamation
in our familiar relationship.</p>
<hr />
<p>By means of explanation,
consider that second grade had been my first year in an American public school.
I had already been going in Japan, for three years by then,
and each year I had been enrolled in a different school.</p>
<p>In essence, my earliest education had been that friends come and go -
relationships are only durable enough for one year.</p>
<p>I am amazed that my pals from middle and high school kept putting up with me for so long,
because I am sure I never managed to open up to any of them.</p>
<p>Because friends come and go, sooner than you'd like,
and the only reliable ones around are going to be arguing religious dogma,
or staging gross humiliations, whenever a chance comes for you to express your mind.</p>
<p>This model of upbringing,
I am learning to recognize today at 33 years old,
is simple enough to be called dereliction.</p>
<hr />
<p>I am unsure when the first signs began appearing,
because my parents recognized long before I could
that I had been as gay as a bluebird who wanders into a food fight
between Andy Warhol and Kieth Haring,
during the AIDS crisis in San Francisco's Castro neighborhood.</p>
<p>They recognized this though,
and so began the grueling schedule of humiliations on one hand,
religious programming and masculine bonding exercises on the other.
Our childhood rooms were assigned chromizonally;
my first roommate and I were enrolled in Aikido classes,
while my elder sib missed the chance.</p>
<p>When we moved to Pennsylvania the dynamic continued,
her room at the end of the hall, sharing a wall beside my parent's bedroom,
and the male-bodied at the far end of the upper floor,
down a hall near the bathroom.</p>
<p>Precarious memories, for sure.</p>
<hr />
<p>By middle school, the humiliation began peaking again,
and I was largely too obsessed with my problems
to recognize the pains expressed by my siblings.</p>
<p>I've since spoken to my younger sib about his challenges, picked on by a close friend.</p>
<p>I imagine my older sib has much to say that so far remains unspoken;
she is already raising more small children
and is probably glad that I no longer am around to bother too much.</p>
<p>Again, humiliation on the one hand and religion on the other.</p>
<p>The religious arc had been to enroll us in the church programs,
the youth group, altar hands, lectors; younger sib dug into choir singing.</p>
<p>The humiliation began as an image from Japan resurfaced.
There had been a day, during my early bathroom conditioning,
when I had used the toilet and left the door open behind me;
likely my dad had been the one to snap the image of my bare ass as I took a piss,
and now in middle school I found this image on display in our home,
regardless of whether we had company around or no.</p>
<p>I sank into despair, really.
Here I am, long since learned that these familial people
are the only ones who are going to be around for me.
Friends come and go; and only your abusers remain.</p>
<hr />
<p>And so I am lucky to now recognize my childhood as derelict.</p>
<p>There is much to say,
if we are going to really examine the years from then to now.
I am only one mind among many,
who can speak and share my memories.</p>
<p>I'm sure you'll see more along these lines if you choose to pull up the page again,
and so I'll pause here to express a concern that preoccupies me on this theme.</p>
<hr />
<blockquote>
<p>Seems to be, I've been under immense pressure for many years
to describe my predicament,
the emotion that I've experienced since my memories began,
the same emotion I recognize in innumerable people from any background,
that helps me make immediate connection to all,
aside from the most socially secured.</p>
</blockquote>
<p>I see derelict people all around;
most clearly in the urban core,
where no one can be bothered to help source or share a meal,
and where the passers-by claim a pass,
rather than any form of neighborhood responsibility.
Also in our elders,
including my grandma Martha who has no one to knit with, or for, any more.
I do hope I see her again to keep building our scarf.</p>
<p>In searching for this phrase, a label to apply to my experiences,
I also caused more pain than anyone should;
and I derelicted more relationships than I can recall.
I consider my search irresponsible because
I carried through this inquiry in isolation,
hoping to grasp the one label capable of holding all my moods.</p>
<p>In San Francisco, I did so much along this course
that I derelicted a real, physical sailboat in the bay.
The Army Corps of Engineers had been on hand to clean up and scrap the ship,
only my mind keeps imagining the squalls of weather that the ship had been exposed to,
abandoned on anchor and relying on chance and the decaying anchor lines to hold firm.</p>
<p>This mood, the experience of dereliction, is an education alone.
My mind is plagued by loose ends,
by recognizing that I played a serious, consequential role in many poor conclusions,
simply because absence is a poor role to choose.</p>
        ]]></description>
        <link>https://operand.online/chronicle/D'relic'd</link>
        <guid isPermaLink="false">2025-12-26.D'relic'd</guid>
        <pubDate>Fri, 26 Dec 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>2025-12 / Build Diagram</title>
        <description><![CDATA[
          
          <hr/>

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

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

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

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

          <p>Winston!</p>
<p>We only met during the one meal prep class for dumplings,
but your class was the reason for me to finally see NYC Resistor,
and test out the pickup-truck urban camper
in the middle of Queens (4 days, spending $0).</p>
<blockquote>
<p>my jet-lagged pal missed the discussion about freezing the dumplings,
and had to throw out a bunch of them while I was going hungry
on rice and peanuts a couple miles away.</p>
</blockquote>
<p>All of us have so many ambitions
that we are conditioned to keep from expressing,
and I am so glad to experience the camaraderie
of reading your essays, and plans,
and learning about people like <a href="https://andreagibson.org">Andrea Gibson</a>;
I hope you find space to share more of your ideas as you go,
because you are as inspiring as you are inspired.
I am proud to see that although NYC has perhaps shaped you,
it has done nothing to reduce you, as it does to so many people.</p>
<p>I am composing this to you from a small sailboat on the Chesapeake Bay,
as the back of my mind ponders where to place the solar panel today,
and how to rig up my broken tiller long enough for a calm night-sail in a couple days.
My main schedule for now is &quot;when shops open up on Monday&quot;,
and I can dig around the parts piles for a replacement.
When you leave the land behind, there is an inescapable queasiness
as your body learns to roll on the incoming waves -
and from the calm mornings to the raging evenings,
you begin to absorb the emotions of the air and sea around you.</p>
<p>If you'd like to include me in your postcard group,
I'd be happy for more decorations on board.
I tend to over-do the post-it notes at expense of mementos.</p>
<p>Calliope Youngblood
********************, Basement
Washington, DC 20005</p>
<hr />
<p>I hope you have a chance to glance at my essays also,
when you need a signal from the home you're departing.
I am gradually expanding the publishing program,
and may soon begin raising sponsorship income
and bringing more composer/producers on board.
For now I need to recommend the RSS link in the header.</p>
<p><a href="https://operand.online">://operand.online</a></p>
<p>I'm glad to keep my eyes pacing across your messages,
and especially hope if you choose to move to online publishing,
you share a link where I can read more from you.
There's no assurances of where any of us are bound from here,
so keep your plans in mind and be ready to bounce and roll as you go.</p>
<p>Easy goes!
Calliope</p>
        ]]></description>
        <link>https://operand.online/chronicle/(qu)Easy goes!</link>
        <guid isPermaLink="false">2025-08-02.(qu)Easy goes!</guid>
        <pubDate>Sat, 02 Aug 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Unsteady</title>
        <description><![CDATA[
          
          <hr/>

          <p>Freedom of speech, the first amendment, is a special one.</p>
<blockquote>
<p>Congress shall make no law respecting an establishment of religion,
or prohibiting the free exercise thereof;
or abridging the freedom of speech, or of the press;
or the right of the people peaceably to assemble,
and to petition the Government for a redress of grievances.</p>
</blockquote>
<p>Oddly enough, the inability of our legislature to make laws concerning speech
has made it superbly easy for the executive to use his openly-invisible hand.</p>
<p>If you are already sick of the political discussions this year,
no one can blame you - so I'll do as much as I can to keep from being polite here.</p>
<hr />
<p>Please realize, you dumbass,
that the first thing our nation's congress did,
as a legal organization on planet earth -
was decide to censor itself.</p>
<p>If you can realize that,
you'll perhaps see a piece of what makes America a special place,
as much as that reputation has been abused
by the imbecile hicks lurking behind each and every hillside.</p>
<p>You had your warning before, I'm sick of being polite.
All of us are. Political correctness simply upholds the corrections officers,
the private business of private companies who make a buck on
privatizing the national sin,
the profile pickers who keep a color-coded red line
between the admissions brochures and the mugshot glasses.</p>
<hr />
<p>At least we can say anything we like about those goddamn politicians,
the electeds who make a career on popularity,
who polished their smiles and grins and handshakes,
for the simple and compelling and crucial illusion
that <strong>they can't hear you.</strong></p>
<p>Of course they can; of course they know they're despised,
they grew up despising people like themselves,
their role models who incessantly failed,
their predecessors who would not fold into the soil quickly enough.</p>
<p>These people chose a goddamn career based on arguing with their neighbors.
And you think they can't hear you,
see you smirking as you turn your backs on their long commute
to raise your glasses at the bar to the football game on screen,
and as they pass the many sober miles rolling under rubber tread,
they're doing the silent math <strong>on your bill</strong>, your bar tab,
your friends and your career, your bar's payroll and suppliers,
the line at the front door and the lines of coke in the alley.
The logic of the parking lot needed to pack a stadium at this time of night,
the communications required to keep an image on the screen,
the energy needed to course through the cables to keep the lights on,
and to keep the light-skinned side on the right-side write-up.</p>
<hr />
<p>And you think they can't hear your derision,
when they put up with it throughout high school
after being silent for too long through their childhood.</p>
<p>You say they're a jerk because they don't raise a glass beside you,
they're a piece of work because they are on call all day,
an asshole because they haven't shared a bed with anyone you've shared with,
corrupted because they bend a rule for a donor instead of a knee to an employer.</p>
<p>Instead of friendship, they choose recognition,
and that goes deeper than you realize.</p>
<p>They recognize the illusions behind your friendships,
how all your peers you met in your church,
how all your sundays call you back to the same neighborhood,
how all your dreams succumbed to the pressures of the children,
whose dependence on you hardly compares to your codependence on them.</p>
<p>You used to squeeze your steady's hand,
and now you both hold one hand of your child,
and then someday you'll make the child choose,
because who can be so close to someone for so long.</p>
<p>Who can be steady at all any more,
when all of us are so goddamn sick?</p>
<hr />
<p>Say, pass that orbit around again -
I'm not as dizzy as I need to be.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Unsteady</link>
        <guid isPermaLink="false">2025-07-15.Unsteady</guid>
        <pubDate>Tue, 15 Jul 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Grand plan.</title>
        <description><![CDATA[
          
          <hr/>

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

          <p>So, you're managing WordPress?<br />
That's a popular thing to be doing!<br />
How long have you had this running?</p>
<p>Oh, how rude of me to ask;
probably much longer than you'd like to admit.</p>
<p>Here is how you can quickly back up a WordPress domain -
focusing on the content of the pages,
rather than the themes &amp; style.</p>
<p>Throughout this guide we'll be making use of
the <a href="https://developer.wordpress.org/rest-api/">WordPress REST API</a>.
Our code samples are prepared using <a href="https://nushell.sh">Nushell</a>.</p>
<hr />
<h2>Discover the API.</h2>
<p>WordPress relies on a <a href="https://developer.wordpress.org/rest-api/using-the-rest-api/discovery/">discovery</a> mechanism
to communicate each site's public API to one another.</p>
<p>In this example, we use <a href="https://wordpress.org">wordpress.org</a> -
the same code applies, in theory, to any wordpress domain.</p>
<pre class="lumis" style="color: #e6edf3; background-color: #0d1117;"><code class="language-nushell" translate="no" tabindex="0"><div class="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>
    
      <item>
        <title>Business Roadmap</title>
        <description><![CDATA[
          
          <hr/>

          <p>Here in Sioux Falls, I had a nice and prolific day
of blogging from the local library,
finally digging into the lessons I learned about WordPress.</p>
<p>I had planned to be around here tomorrow also,
only the rain has come in and I'm eager to spin the rubber again.</p>
<p>Here are the pending goals on the business road map:</p>
<p><img src="https://share.operand.online/gram/page/media/2025-07-07.roadmap/Screenshot_20250707-165605.png" alt="android map screencap" />
<img src="https://share.operand.online/gram/page/media/2025-07-07.roadmap/Screenshot_20250707-165531.png" alt="android map screencap" />
<img src="https://share.operand.online/gram/page/media/2025-07-07.roadmap/Screenshot_20250707-165345.png" alt="android map screencap" />
<img src="https://share.operand.online/gram/page/media/2025-07-07.roadmap/Screenshot_20250707-165316.png" alt="android map screencap" /></p>
<p>I'm unsure how far I'll go tonight, especially in dense rain and darkness.
Either Sioux City or Omaha sounds good.</p>
<p>I'll log in from one of those public libraries tomorrow,
and then put more miles on in the evening each day.</p>
<p>My main concern, and hurry,
is that I've run out of protein -
and after adding up that $1 of gas buys me 10km of progress on road,
my $96 (+ $50 bank courtesy margin) has no additional room for food.</p>
<p>Rather than end up in a panic in a couple days,
or try to rush headlong in one day burning more gas than I can afford,
I'm going to edge closer and gradually closer each day,
snacking on bare pasta &amp; curry mixes, and crumbling cookies into my morning oats.</p>
<p>Oh yes, if you are concerned to see me in good shape by the end of this,
the only payments I can process now need to go through Venmo;
Stripe is examining my submissions to clear me
for the subscription &amp; sponsorship model I hope to add to the blog soon.</p>
<p>Glad you're along for the ride! GPS logs are in the backlog.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Business Roadmap</link>
        <guid isPermaLink="false">2025-07-07.Business Roadmap</guid>
        <pubDate>Mon, 07 Jul 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Charges Due</title>
        <description><![CDATA[
          
          <hr/>

          <p>Tony,</p>
<p>How generous, or perhaps unduly hopeful, of you
to imply that the only thing holding up payment of my membership fees
is a failure of billing receipt.
On three separate occasions in the prior six weeks,
my access to money has dropped to four dollars or less,
ignoring the sizable balance due on banking credit,
and monthly bills that upon any passable chance,
are delayed to be paid on the final possible day.</p>
<p>As you properly recalled,
I've been on the road for two weeks for a conference in Denver,
and I did find a number of new colleagues there,
one of whom is eager to pay for my help.
Although I have been denied by payment processors before -
PayPal accused me of laundering money in a recorded call
during my first week of business -
if I can secure a Stripe account I may be able this week to process
my company's first income after being incorporated more than a year.
As is, the first invoices I charge may hardly be enough
to secure gasoline to reach the Chesapeake again.
Describing this as a dry spell is equally both comical and real;
I run an incredibly dry, spelling business.</p>
<p>Of course there is more to say concerning this predicament,
and of course I am also eager for a drop of liquid money,
especially because I am so unskilled in demanding any.</p>
<p>By one direction or another,
the process shall reach a clean resolution;
I am also behind on my biannual corporate filing,
and unless I pay the late fee due to DC in a month,
there shall no longer be a legal body for you to charge -
I'd remain happy to read any emails you send,
until the domain expires,
and you have my number so long as you can reach me on the line.</p>
<p>Cheers,<br />
Calliope Y</p>
<p>in Proton Mail,  ########@operand.online<br />
in Signal,       ########.##<br />
in secure,       202-###-####</p>
        ]]></description>
        <link>https://operand.online/chronicle/Charges Due</link>
        <guid isPermaLink="false">2025-07-07.Charges Due</guid>
        <pubDate>Mon, 07 Jul 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Chills</title>
        <description><![CDATA[
          
          <hr/>

          <p>I'm unsure when I saw you last;
coulda been a few occasions this year,
or more likely six years ago.
I'm unsure I'd recognize you,
because so many people seem to bear close resemblance,
and I lack courage to speak to any of them,
so sharp the reacción condicióned in me.</p>
<p>My body somehow responds to the idea of you,
even six years on,
perhaps because of unhandled psychoses
that you played a special role in amplifying,
or quelling, or reshaping.
Psychosis normally binds to its surroundings,
and for a year you had become my primary surrounding.</p>
<p>Then, an absence you described as necessary;
I had been too much bound up in the churn to say.</p>
<p>And as I came back again, I could only see the idea
of your surrounding me again,
although both of our condicións had changed
in differing direccións.
No connección could be held,
either on line or on schedule.</p>
<p>Besides, my psychosis had become depression
and I'd quickly reach despair.
Maybe I'd already been there.</p>
<p>By now I could probably do a clinical appraisal of my psychosis,
although I'm more curious today to share the main symptom,
the sensación that creeps up to hold me back,
to produce the lack of sleep and cheer,
keeping no one near as I regress in fear.</p>
<p>So, dear;</p>
<hr />
<p>I left you to go home to my family,
because my childhood had raised me, condicióned me,
to imagine them as the only people who could reliably be around.
The only people I could come back to.
I guess my brother escaped this problem,
being young enough to keep the school years
from coinciding with the nomadism.
He'd come upon his share of psychic problems soon enough,
and some of them I see that his elder siblings may have misguided him to.</p>
<p>My sister and I squarely realized the challenges of losing friends,
early and often, as we moved from place to place.</p>
<p>She seemed to use this to a degree she could build upon,
becoming socially curious and building an image to please her peers,
making sensible relaciónship choices so as to ground her in an upholdable posición.</p>
<p>I seemed too eager to be lost in my mind.</p>
<p>I <a href="./silence">already explained some</a>,
the scenario surrounding my childhood displacement.
Can probably say no more here.
Only consequence remains.</p>
<hr />
<p>The first year we shared had been one to bounce around cities,
occupying numerous homes,
making do on quick morning coffee and donut runs
in shops we'd never see again.</p>
<p>I guess the only Voodoo donuts we ordered to share
presaged the dirección of our relación;
the courier who carried our order pulled onto the platform,
moments after our train pulled out of Portland's station.
Our enthusiasm for celebración following a long train ride
quickly chilled to make sense of landing in a new city,
hungry and poorly prepared.
Alas, such is deployment.</p>
<p>The mood had been chilled even approaching the train ride,
as we began to depart from the station in Oakland,
and I needed a moment in my head to guard against all the memories.
Train lines run through my head since my earliest recolleccións,
across one continent or another,
from child's toy tracks to high speed manga,
express lines and sleeper cars thunder in my dreams.</p>
<p>All the same, I remember the ride that February to be magnificent.
Of course I had my camera on, snapping, rolling;
the records now reside on some disc among thousands I no longer look through;
magnetic zeroes in a null space, chilled signals.</p>
<hr />
<p>You and our colleague succeeded that year while I succumbed,
deeper and deeper to my unspoken psychosis.
I'm unsure how to describe the full breadth of the issue,
for fear of implicating the people who deserve nor earned no sympathy.</p>
<p>By the end of the year we had made a company,
and I declined to be on board,
and I ran home because my experience said
that friends expire after a year.</p>
<p>Your car pulled from the platform,
and I'm riding home on my bike carrying all the baggage.</p>
<hr />
<p>The following few years are now a challenge to recall;
they began a process where I enabled my parents,
bullies throughout my childhood,
to begin dehumanizing me to a degree that chills,
and has me holding back screams each day,
learning to use a calm demeanor to keep anyone from approaching.</p>
<p>The calm is practiced,
an exercise learned from being undermined again and again,
whenever emoción is displayed.</p>
<p>I no longer experience normal, baseline emoción;
the ones that bind people together in relaciónships,
the ones that build camaraderie or happy dependence.</p>
<p>The emocións I display to my peers are ones of concern -
or occasional accusación, scalding scolding, challenges to endure.
The emocións I keep for myself are the anger and pain and longing and misery.
On Tuesday I decided I'm done with anger,
and so now I am seeking a means of chilling the pain,
before I proceed farther.</p>
<p>In any case, the dehumanización had a solid hold on me,
from housing (basements seem the only place appropriate for me),
to employment (financial bondage to the oppression).</p>
<p>By now too many people read these pages
for me to properly curse the memories
and summon the hellish doom of my parents,
in the usual manner,
that has been healing to me for the same reasons
that it has kept them from speaking to me.</p>
<p>I sense some small solace in realizing they are scared of me,
and although this had to begin physically,
through years of learning and applying martial arts,
and carrying blades to use on nearby furniture,
I am of course eager to bring that respect into the psychich domain.</p>
<p>Hence, I impress how simple the process
of exposing my adolescent experiences may be,
in case I choose to do so,
although I am unsure how I can learn to laugh at the process,
I guess I'd find some amusing humor in forcing them to explain
their decisions or accións.</p>
<p>And as I go off on them again, I realize this is precisely
how they earn a place in my mind;
they creep up and re-apply a hold on me
for reasons I'm unsure I can guard off.</p>
<p>All I can do is realize their despicable condicióning,
once it begins gripping me again,
and chill the impulses.
Undermine the scream before release.
Channel the sound to song,
as I am learning from the bouyant birds and the bards.</p>
<hr />
<p>Odd, how so much leads me back to my experiences of today,
of this season, of this year;
as soon as I begin remembering those years ago.
Perhaps the years of bouncing from place to place
disrupted my learning of object permanence.</p>
<p>Sure seems like I abandon people more quickly than normal,
imagining that holding on is useless,
embracing the emoción is dangerous,
sharing the pain is impossible.</p>
<p>As is, when I engage in discussion of an emociónal caliber,
among my peers and in the mood of building one another up,
I usually collapse and hold back and sink deeper into the memories
of years ago, the places gone by,
the people I abandoned and am hopeless to see again,
the relaciónships that <em>did</em> expire,
more because of my poisoned and hopeless aura
than of a core problem in their makeup or composición.</p>
<p>And realizing that the problem has a source in my choices,
I do on occasion persuade my body to examine those abandonments,
to realize the absence is mine more than anyone else's,
and to choose to be present in places I had once sensed home.</p>
<p>So much can be done to address psychosis
simply by looking on faces you recognize,
hearing the circles of dialogue hold you in place
and lead you along, realizing you are embedded in a fluid medium,
a biology of many bodies held up by mutual embrace.</p>
<hr />
<p>And of course the memory I am unable to escape;
the sharp slice of the judge's hammer onto the bench,
and your departure from the room and from any possible reach.</p>
<p>In a year I'd already lost my home,
and the only relacións to seem reliable to me,
and hope of normal employment...</p>
<p>the barrage reached new depths;
your &quot;no&quot; had been a glimmer of a whisper
until it became a guillotine,
and any remaining hope I had held to
cleanly disappeared from my body
as you ambled from the room, careless, holding your chin high.</p>
<p>My progress towards rebuilding my career suddenly became
numbed reaccións aimed at bandaging the financial bleeding;
I had in one moment become unable to depend either on friend,
or colleague, or seducción; you had been all three,
and the only one remaining of each.</p>
<p>Even today I collect many business cards, phone numbers, names,
I never call upon. I hold them, a social hoard of unmade conneccións.</p>
<p>I suppose I could make plans, only I see no place they could lead to.</p>
<hr />
<p>The deepest pain of the psychosis is how people all begin looking the same;
sounding the same, discussing in the same circular rhythm and cadence,
that has no break, no chance for silence or end,
absorbing the insanity around and compounding the problems of one season
into the riddle or moan of the following.</p>
<p>And back then you had seemed to be saying something to me
that I missed, again and again;
riddles that I could hardly grasp at,
odd phrases that seemed to send me deeper into loneliness,
rather than asking for my engagement or presence.
Maybe the only thing we recognized in each other was a similar psychosis,
siblings who have been displaced again and again,
for whom no corner of the globe is an enduring home.</p>
<p>Even that condición had us more than sure we would cross paths again;
there are only so many roads from one place to the next,
and an area only begins to seem spacious
when you're used to hiding in a small den.</p>
<hr />
<p>So, I had been burning of rage,
my collapsing despair blooming
into a rebellious flame of acción, reacción, compacción.</p>
<p>And thereupon, in such a mood, carrying gloom and grim hellish resignación,
I came back to see you, the abandoner finally abandoned.</p>
<p>And all I could do had been to see those around me,
examine the bridges closely before burning them up.</p>
<p>And I came to you asking for the depths of your sadness to cool my rage,
and you shared them, and we lie in bed mociónless and soundless and lonely as can be.</p>
<p>And I gave you permission,
said these bridges hold you back,
seem unable to hold you up,
as their base begins to crack.</p>
<p>And so you used your chance,
and burned the bridge arching across our common ground,
and as the collapsing span of years ago
echoes as daily fears of hearing &quot;no&quot;,
I rise again this summer morning and feel the chills.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Chills</link>
        <guid isPermaLink="false">2025-06-15.Chills</guid>
        <pubDate>Sun, 15 Jun 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Key & Card</title>
        <description><![CDATA[
          
          <hr/>

          <p><a href="/chronicle/communicacion">As I had been saying</a>,
research can assume all manner of shapes and procedures.
The &quot;social sciences&quot; are simply a more squishy and bumpy area to explore
than an equipment-lined clean room.</p>
<p>Operand is primarily concerned by the research of homelessness,
and the resilience of cyber communicación in such scenarios.</p>
<p>In essence, hou come so many people become blocked from the social dialogue?</p>
<p>The applicación of research can perhaps someday be used in emergency response,
in the coordinación of meal prep and dispensación,
and in the organizing of labor for mutual aid and co-operación.</p>
<p>This is research of local organizing,
of group formación, religion, and litigación,
of composición and deposición.</p>
<p>The shape of this research has changed by some crucial measures
in the course of business, as we learn neu means of exploring and explaining such þemes.</p>
<blockquote>
<p>Some day þese pages are going to add an opción to change grapheme clusters,<br />
such as español's <code>-ción</code> -&gt; english's <code>-tion</code>,<br />
and the runic <code>þ</code> -&gt; <code>th</code> or <code>θ</code>.<br />
soon enough, full languages could be co-mapped alongside one another.</p>
</blockquote>
<hr />
<p>Language concerns aside (for now) -
I'd like to press my keys this morning in deference to the primary concerns
of many people who, like me, experience occasional homelessness or nomadism.</p>
<p>Access to social scenes and dialogue requires only a couple basic resources.
Many can be ignored or neglected, although care should be applied
to ensure that a balance is held - slipping social norms need to be measured by peers,
and in many cases the loss of such peer relaciónships spells social suicide, on a local scale.</p>
<p>These basic resources, aside from the biological,
can be spelled out simply as: key &amp; card.</p>
<p>Your key may be a home, or a shelter - an electronic fob or a metal-encoded shape.
A key endorses someone's admission to a secure place.</p>
<p>In case of a home, the key is accompanied by re-energizing access to water, fire, and repose.</p>
<p>In case of a car, the key is permission for moción, for escape, for exploración.</p>
<p>Neither one does much good unless you're carrying a card;
either issued by a bank or by a state,
displaying further permission to make social progress.</p>
<p>For an ID issued by government, you may gain license for mobility;
or by a business, license for income.
Issued by a bank, permission to demand resources from others,
in the customary norms of the markets.</p>
<hr />
<p>I had lost my driver's license a few months ago,
and sought eagerly any chance to replace it from the state;
such efforts had quickly been found out after the mail was returned.</p>
<p>At the DMV, I had been handed pages of referrals to social service agencies,
and told to pursue an ID voucher before I came back.</p>
<p>Of three pages of listed agencies,
I asked around the city and learned that one, or perhaps two,
remain in operación this year after harsh cuts to their funding.</p>
<p>I had been asked to appear in line by 6:45 for admission to the agency at 9am;
alongside nearly 50 others, I stood in line to see scarcely any of us make the cut.</p>
<p>The recepciónista explained, there is only one case manager here.</p>
<p>I exclaimed, there is only one agency in the city.</p>
<p>And so here I am, applying.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Key & Card</link>
        <guid isPermaLink="false">2025-06-03.Key & Card</guid>
        <pubDate>Tue, 03 Jun 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Mic Drip</title>
        <description><![CDATA[
          
          <hr/>

          <p>The preceding four days are immensely memorable,
up to and including the dreams I had on each night
and the morning coffee rituals.</p>
<p>I am drained. I cried in the office gazing at blank walls and windows,
and then pulled over driving home to cry again on the sidewalk.</p>
<p>I picked up drawing again for the first time in six years,
and swam for the second time in the same span.</p>
<p>I missed my normal open mic night on Tuesday because I had to deploy
a production client app from the bed of my pickup in a rainstorm,
in Capitol Hill in DC before all of my energy expended.</p>
<p>I could go on, and on, and on -
only I already filled four pages of my diary
to explain three days of this saga.</p>
<p>I'm splashing through memories I have had no recollection of for years,
in sharp clarity and agonizing scope.
I am seriously changing how I carry my body and my reactions
to any of the scenarios I am coming across.</p>
<hr />
<p>So, rather than drive home in that mood, I pulled over, as I said, to cry.</p>
<p>And I checked the schedule of my local bar, called As You Are.
And I see that there is &quot;Shower Karaoke&quot; tonight
and I remember some of the singers there
had been leading some really good discussions.</p>
<p>And I'd like one more sample of the scene there.
My songs are coming along, and I'm gaining experience,
only I think they may end up only as poems.</p>
<p>I'm ready to see how much I can expand my range,
and pop into the popular song selection,
and see how my cooing cadence aligns alongside the normal repetetetoire.</p>
<p>So, one more drip in the ocean of emoción I'm carrying along these days,
hope to see people I recognize and scream as much moody blue bliss as possible.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Mic Drip</link>
        <guid isPermaLink="false">2025-05-29.Mic Drip</guid>
        <pubDate>Thu, 29 May 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Sorry for þe silence.</title>
        <description><![CDATA[
          
          <hr/>

          <p>A loud scream, harmonious enough alone,
commanded silence in the room - only long enough,
and quickly concluded by
&quot;please get away from me.&quot;</p>
<p>I quickly passed the paper crane I'd been folding
onto the glass DJ cabinet beside us,
and headed to collect my bags near the door.
I needed a couple more passes to grab my bo
and the origami paper that had somehow been
absorbed into the board game pile near the end of the bar.</p>
<p>I'd been unsurprised, because really -
anything could'a gone down that night.
I'd abandoned my hold on the place,
on any sensible discretion,
and passed the obligation along to someone else.
Besides, I'd long ago realized hardly anyone likes me around.</p>
<hr />
<p>I'd been going to the shows for around six months,
mainly as a dancer, because her band's synth and percussion mix
had been beyond any other genre I'd heard -
after the first show when I had seen her play solo,
I surprised my diary by adding some lyrics -
a couple of songs, edging in on rap.</p>
<p>In the six months from then to now I've had a chance
to speak 2 of them at open mic nights around DC -
there's another open mic that is more musically inclined,
and so I need to prepare some melodies properly to gain access.</p>
<p>The one piece of lyrics I've not performed,
aside from the many song fragments on my phone's audio recorder,
is the song I originally made in response to her music;
I read her one of the lines I'd made from that piece, the 3rd show:</p>
<p>&quot;A spark explodes, forbodes attack
of fear and panic and dread,
how I can see, how you can hear
how much is going unsaid.&quot;</p>
<p>And largely, this is all I'd been able to share
in the following six months;
from October through to May I'd been in the audience,
sharing my odd series of motions,
absorbing the shake of the air from the speakers,
demanding my body to bounce, spin, roll, on the drop of each drum stick.</p>
<hr />
<p>And I expanded my range by an incredible measure, in dancing and beyond;
since realizing my lyrics are simplest to express as rap,
I am focusing on my breathing in the middle of rapid, busy scenarios.
This has led me to examine slam poetry, and beat boxing;
one night after a show at Holy Frijoles in Baltimore,
I happened across a homeless man who heard my whistle
and challenged me to join him in a song -
he began a rhythm on a nearby table as I chirped birdsong to accompany.</p>
<p>And, realizing that festival season means large outdoor celebrations,
I emphasized my bo exercises from my martial arts background -
a large, un-dense, flexible wooden staff I could spin in
innumerable stanzas of mechanical moción.</p>
<p>I use this daily to capture the gaze of onlookers in festivals,
as soon as I come into range of a band,
permitting enough space in the surroundings,
I pick up my cadence to theirs,
and close off my mind from all,
beside the barest glimpses of the world beyond the reach of my hands.</p>
<p>A mime can imagine they are bound inside of a box;
they demarc their posición by clear signage,
and use the space they command in a dramatically unique manner
compared to their peers looking on.
In my case, I equally choose a region of space to command,
and mine becomes fluidic; beginning open, permeable,
and as I lean my bo across my body,
clench my wrist to send the other end up and through a memorable cycle,
I build a boundary line; good for ten seconds or so,
until I come around again and refresh the marc - to remind onlookers.</p>
<hr />
<p>And so the bo is already spinning, and my hands are dancing as quickly
as an eye can keep up, and I do glimpse many eyes;
I learn to hold gazes only for the quickest span of milliseconds,
because more than I like - someone's gaze pulls me so fiercely,
or they approach in such a manner as to command my consideration,
and the necessary focus on the bo slips,
and a loud smack on the ground reminds me that I had a role to play here.
I lose no moment before I re-acquire my grip, and the spin resumes.</p>
<p>I do a common cadence in front of my body,
both hands in the middle and flashing fore and back,
each peck at the bo bringing another full cycle,
as my wrists form opposing bends to equal the momentum.</p>
<p>As my assurance builds, and I gain a feel for the speed,
and my hands and arms and core and hips and legs
shake the sleep or complacency or road rage from the prior hours,
I begin to pause the spin, or bend the arc, to accomplish new paþs;
a neu boundary line, perhaps by changing the arm I use,
or by taking a step through the middle of the cycle,
and bringing my back to the audience,
or by expanding my range in a lurching forward roll;
the bo collapsing to a single line by my side,
or in some cases, demanding sacrifice of a nearby tree branch,
as I display the speed and precision I can embed into the opposite end.
Each explosion of moción, each change in boundary, requires regression.</p>
<p>As I resume a common cadence,
and ease my mood to a calm pace,
and use a small moment to breathe easier,
and perhaps re-learn the gaze of those people around me,
who have seen nothing similar beyond the bounds of cinema,
I decide how much energy I can use in the follo'ing phrase.</p>
<p>As I explore the fair, going from one zone to another,
perhaps chasing the sound stages,
I ease the moción, nearly to equal a simple hiking staff;
only on each placement of the staff, I bring my hand around,
allowing my moción to bring the bo into a rolling amble by my side;
one end, then the other, taps the ground
in a measure proporciónal to my speed,
and as the crowd becomes dense or sparse,
I add a small flourish, or else hold in place,
my energy reaching across to amplify those people nearest to me.</p>
<hr />
<p>I had considered on many occasions that I am seen perhaps as a nuisance.
This band I'd been playing groupie, or roadie, for -
they had made no ask of me for my participación.
I suppose that my road-bound rituals
keep me from making, or holding, normal friendships;
and so concert announcements on Instagram
can seem to fill the missing gap of invitación, inclusion,
that anyone begins to yearn for.</p>
<p>Too much exclusion, of being held on the periphery of social circles,
begins to bear in on a psyche; isolación needs to be learned,
and is a dangerous enemy for a mind used to social confinement.
The liberación of solitude is only realized
by learning the skills of resilience,
the demand that a body needs to be in moción
to earn the comforts a body demands.</p>
<p>And so there is no couch for me to lean on,
no reclining until I am ready for sleep,
no sleep until I reach the end of my chosen road,
no road until I fill my belly and clear my mind,
and no meal until I clean and expel the grime of the prior night.
The grueling demands of unclear, endlessly changing surroundings.</p>
<p>This in my mind, I call resilience; and as much as I imagine
that I need to harden myself for the rigors of the cycle,
I find that such hardening can quickly drain my mood, or energy,
or physical endurance; and for sure it keeps me at odds to my peers,
who are more likely than anything to spin a day
into an upredic'able debacle.</p>
<p>And so isolación builds resilience,
only leads one into an unclear landscape of imaginación;
are those people in the audience speaking of me, and how so?
Is my appearance drab, or scary, and do I have the energy to care?
Should I have shaved or done make-up,
before pulling myself from the car to dance for all of their amusement?</p>
<p>And hardening yourself to these social morés, is necessary;
social scenes depend on compliance to keep all in a calm mood.
To be seen, to be remembered, requires your noncompliance,
and so a hardening phase is necessary, an isolación to explore
the cases where you can indeed abandon the human conneccións around you,
and the cases where to do so is a horror, or a danger, or suicide.</p>
<hr />
<p>So long under isolación's spell,
and I had been bearing silence in large rooms.
So many of the discussions I bring myself to
use language I'm unsure around -
I no longer rely or depend or am reassured,
by ideas of joy or love; and this may be a phrasing issue.
Passion, amor, seem more applicable.</p>
<p>Only none of my peers use such language;
they see me dance and they say I dance beautifully.
When I explain the martial arts I studied, they explain theirs.
We both agree that dancing is a more noble pursuance,
only I have no phrase to offer in the moment to express this idea.
I lapse on my end of the discussion, remembering this to bring up again.</p>
<hr />
<p>I could explain my qualms around English;
the amalgamación of ideas being so clumsy in applicación,
and unusually garish in expression.</p>
<p>I can apologize for my silence in language by saying,
many of the earliest sounds I remember came from speakers of Japanese,
where language is a percussive drumming of reassuring consonance.</p>
<p>Only, to argue a king you need to speak in a king's language.</p>
<p>To challenge a monarch head-on, you need to dance in their hall.</p>
<hr />
<p>And is the energy there, to do so?</p>
<p>Expulsion is assured as soon as one breaks their assigned or chosen role,
and can come across as relief in comparison to the daily caprice,
the bending and breaking of one's body to earn a smile, or a glance.</p>
<p>The halls of memory, echoing age upon age,
are cold, and lined in sharp edges.</p>
<p>The easy day comes in goes in a flash of decadence;
a memory designed to endure decades has to be fired in pain.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Sorry for þe silence.</link>
        <guid isPermaLink="false">2025-05-26.Sorry for þe silence.</guid>
        <pubDate>Mon, 26 May 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Composed</title>
        <description><![CDATA[
          
          <hr/>

          <p>I arose gradually,
this morning in the bed of my pickup,
and composed a day.</p>
<p>The day is a rare one, and one I am inexperienced in,
although necessarily one I should be happy to recycle again and again as I age.</p>
<p>I made my coffee, and peering through a scrying glass
to see peers across our globe share unique and demanding skills,
I had been inspired to examine the changes I'd made in my surroundings,
since this period a year ago. One solar cycle carries so much space.</p>
<p>Composing a reliable day, in essence, requires abandoning some ideals.
Daily experience has led me to realize my base assumpcións are misplaced,
and hence so the imagined scenarios of social order and relacións,
long imagined, that could place me securely in a role I had aimed for.</p>
<p>My composed day should, more than any glorious or prideful aims,
be in the least a possible one, and one unburdensome on my energies.
Human social roles change, as commercial scenes demand,
and perhaps human social success may also be changing in appearance,
from embodying pride, to securing a much more humble peace.
My composed day is here included:</p>
<hr />
<blockquote>
<p>I arose gradually,
this morning in the bed of my pickup,
and composed an essay.</p>
</blockquote>
<blockquote>
<p>I recall the locación I landed, the miles spun under the rubber shed a day ago.
Grasping on the final breeze of dreamy psychosis,
I spin and reach ahead, leaning through the cloudy fog of days to come,
as the glen I parked in exhales the dew it soaked in through the cold night.</p>
</blockquote>
<blockquote>
<p>I made my coffee, and peering inside a local pane of pixels
I laboriously press on, my rythmic cadence reaching to encode symbols
and small shards of logic into a memory card,
so I can soon send messsages along pulsing radiación,
to be echoed in grand display across some-anon's unseen screen.</p>
</blockquote>
<blockquote>
<p>My coffee expended and recycled and sealed aside,
and my organs pushed to their peak gear, I clean my body upon damp cloth
and roll from the bed to do some physical drills;
my muscles happily engaged in an exercise they occasionally hum in my sleep.</p>
</blockquote>
<blockquote>
<p>My social obligacións beginning once those of my peers are ended,
I am able to spend a couple hours searching a map of nearby businesses,
or else lend my hand to building my innocuous mobile home;
the fading green of my car-plant reminding me of how small psychic energies,
once made physical and properly cared to,
repay the same generous energy again and again,
in small doses as they labor inside their binds to oppose decay.</p>
</blockquote>
<blockquote>
<p>Near dusk, the roads become dense again, so I'm happily in place and parked
near the peers I pledged the day to. Perhaps I spun more miles, by car or bike,
and surely more are needed to de-urbanize, to escape before sleep claims me again.
The roads and radio programs drain my mind as darkness drains the sky,
and perhaps I am held conscious for some hours in the grips
of the animal sounds around me, as I compose my dreams of more days to come.</p>
</blockquote>
        ]]></description>
        <link>https://operand.online/chronicle/Composed</link>
        <guid isPermaLink="false">2025-05-15.Composed</guid>
        <pubDate>Thu, 15 May 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Scrubcore; a summary.</title>
        <description><![CDATA[
          
          <hr/>

          <ul>
<li>Scrubcore, beginnings.</li>
<li>[Hou come scraping is necessary?][#necessary]</li>
<li>[Hou come scraping is dangerous?][#dangerous]</li>
</ul>
<hr />
<p>Scrubcore began online and physically;
in online spaces designed around sharing physical experiences,
and in physical spaces organized around producing more, on line.</p>
<p>So, as to be precise and clear; the DC region had a bunch of disillusioned engineers,
seeking refuge from the predominant corporaciónal pseudo-order.
Also seeking companionship, rare laughs, occasional chemical escapes,
and a more nuanced sense of their posición and dirección, long careers impending.</p>
<p>Hold on, did I say engineers?
Probably is a simple reason the remainder had been incomprehensible.</p>
<hr />
<p>Online spaces are broken. I could say they suffer from a lack of open-ness,
or commercialización, only I'm realizing those accusacións only make heads nod;
and my need is to induce grasping hands, and punching fingerpads,
and limber lips and lengua, channeling lunges of loud lungs.</p>
<p>So I'll describe my experience.</p>
<hr />
<p>I am only an engineer by lack of more applicable label;
really, engines scare me.
I could probably lose a finger, and I'd be lost without any of my fingers.</p>
<p>All of this space you see around these phrases - produced by my fingers.
They're close to my soul, and carry the soul ahead and usually lead the soul on.</p>
<p>My fingers learned to play music, and they bring the percussion
of music to bear on the language I speak and impress in keys.</p>
<p>So engines are really dangerous to someone in my position,
and I mainly operate as a consumer of the moción an engine produces,
so I can bring my skilled fingers from one place to another, to plug
in cables and compose essays and share code I imagine can help people.</p>
<hr />
<p>So, lacking a proper label on my career, this 'formerly-called' engineer
has a rich experience in an also-poorly-labeled practice called &quot;web scraping&quot;.</p>
<p>Web scraping - uh, is the idea behind search engines.
I build logical programs to copy online pages, enough said.</p>
<hr />
<p>Only, are these logical programs, or mechanical?
The pages are assuredly less than logical.
And mechanics are present all across online spaces,
because those spaces are managed by innumerable machines.</p>
<p>Some people describe the different &quot;logics&quot; of social media domains,
in in the same breath can discuss the &quot;mechanics&quot; of a video game.</p>
<p>To me this is nonsense, they are made of the same pieces - machine code. Procedures.</p>
<p>So, because &quot;machine&quot; may also be a bad descripción,
I'll err on the side of processors and procedures,
and label the essence of programming to be 'logic'.
This seems to be aligned to the origins of the discipline;
the deposición of logical analogues into electrical meshes.</p>
<p>Those electrical meshes are the real machines,
and you can go deeply enough in the idea space to imagine
that all logic really is a machine; and so is all math and language.</p>
<p>I do encourage you to aspire to such insanity; as the prizes are numerous, rich, and amusing.</p>
<hr />
<p>Web scraping is a bad idea - legally in many cases,
and also once again because of the encumberances of language.
People really imagine the space nonsensically,
so I hope I can reduce the pace enough to glimpse the core issue.</p>
<p>Here goes:</p>
<ul>
<li>[Hou come scraping is necessary?][#necessary]</li>
<li>[Hou come scraping is dangerous?][#dangerous]</li>
</ul>
<hr />
<h2>Hou come scraping is necessary?</h2>
<p>Chances are, there are search engines older than you are.
This only holds for some of the audience here,
although my guess is that people older than search engines
are going to need a long while to come around to this publicación.
The young are leading our ideology these days.</p>
<p>Only the oldest social media, forums (including email groups),
are older than search engines;
forums had been enough for the needs of early online denizens,
because there had hardly been enough internet to go around;
you could be sure that if someone made a website you liked,
they'd be talking about it on their nearest forum.</p>
<p>Simple recipe, and had held up for years.</p>
<p>Only, more people published, and genres and themes became mixed up.
Forums needed to be spread by lip-speak, in analog sound-space.
Sloppy and slou.</p>
<p>So Larry Page designed a huge ungainly index,
by draining the large bank accounts that had probably purchased him admission to U of M.
No problem, I hear he filled them back up soon enough.</p>
<p>Suddenly, he had the slickest forum-slayin' asocial social net(worth) of all.
He became a librarian of the unbound volumes across cyberspace.
Please, hold your applause.</p>
<p>This is the recipe behind so-called &quot;scraping&quot;</p>
<ul>
<li>Choose an online address.</li>
<li>Make code to copy the page, so you can read the page locally &amp; offline.</li>
<li>Make code to pull all the meaningful links from your copy of the page.</li>
<li>These links are new online addresses, and you probably care enough to scrape them also.</li>
<li>Hold up! There's paragraphs and images and sounds and so on!
<ul>
<li>Make up meaning from the madness,
and arrange that mess into a readable or searchable shape.</li>
<li>Call this re-shaped arrangement an index.</li>
</ul>
</li>
<li>(optional) Make code to permit anyone to search your index.</li>
<li>(optional) Make logs of all the searches your users run.</li>
<li>(optional) Sell your logs and page space to hungry corporations.</li>
</ul>
<p>So this is hou Google came to be,
and they remain to this day the only search engine on earth.</p>
<p>Only, Larry had a problem in the humanities courses as a child,
and only learned to use 4 crayon colors and spell basic nonsense.
Although he liked to doodle, he had much more luck in maths.</p>
<p>So Larry, seemingly in admiración for Tom Sawyer's fencing efficiencies,
began calling loudly about how simple it could be to paint a screen blanc.</p>
<p>This angered many of his peers, who liked being busy more than doing good business,
and they all agreed to pay him for a chance to de-muralize his pages.
Really, the commercialización of search engines is an homage to the iconic success
of urban graffiti programmes, in an age when access to good taggable turf
had been rarer than real grass roots.</p>
<h2>Hou come scraping is dangerous?</h2>
<p>I'm glad we came across to a graffiti analogy, because paint &amp; scraping go hand-in-hand.
Although two hands so pre-occupied are unlikely to be-hold each other as friendly,
both occupacións are in the end, handy analogies.</p>
<p>In common cases of graffiti causing serious offense to the sensible official
whose parking space has been re-de-sign-ated as an in-sign-ificant peanut's galleria,
a scraper may be commissioned to clean the space;
replacing a blanc-et ing aura of calm to the parking place.
Parks should be calm, no? Sensible as usual.</p>
<p>So, this cleaning occurs in a couple phases:</p>
<ul>
<li>Scrape da colors, causing bonded chemical chips
to be carried off in the breeze to the underground
passages and from thence to the nearby rivers, streams, and oceans,
to finally be rearranged and made palatable
by your neighborhood sushi supplier.</li>
<li>Apply thorough layers of the original
(usually un-)colored chemical poción,
normally years ahead of the recommended replacement schedule.</li>
</ul>
<p>In the process, the place under inquiry has been erased of the compelling media!</p>
<p>A clean space beckons more eager hands to learn skills of graphic expression;
because if such expressionism were in less demand,
the large newspapers would be happy enough to use the same spread day after day,
rather than expending on neu composicións.
Human spaces require applicación of meaning and media.</p>
<hr />
<p>Sorry, once again, how come <strong>scraping</strong> is dangerous?</p>
<p>Oh, uh. because, um. Eh.
I guess the machines you're using,
to copy from other machines, require energy.
The other machines also have many people to speak to today, see?
their calendars are very full and they can't have you barging
in here just like that to demand all the hours of the day
when there is a line out the door a thousand people long -
and there's going to be another thousand coming in the next hour,
so this DMV really does need to trim the line here and ask you to come back another day,
<strong>YES</strong> with a real appointment this time,
and see if you can capture the manager's attention with this request,
which I'm sure is as big a concern to me as it seems to be to you.</p>
<p>If you don't buzz off soon, pal, I'm calling the firm of Flair &amp; McLeod,
who would be happy to take up your case in the rate-limited alley parking space.</p>
<hr />
<p>So, in conclusion, scraping is a horrible descripción of the problem space.
All you're doing is asking for copies of your records,
when other people are in line to do the same.
And sure, you need to honor peoples' time and energy
and make sure you're copying as quickly as possible
and leaving enough for the people behind you to also make do -
it sure would be nice if the terms of the on-premise lawyers would ease up -
the office is making like you're walking into the Louvre with a chisel in one hand,
and bucket of dry-erase in the other.</p>
<hr />
<h2>Oh yeah, scrub core.</h2>
<p>Sure is lucky some dumb apes like us are more skilled using machines than coins'n'phrases.</p>
<p>Long ago, all of us agreed the proper means of sharing a cool rock is to place paper on it,
and then rub charcoal on that.
And yeah, Larry - you need to bring your own paper.
The labs here at U of M charge $0.05 a page,
and maybe you could help us find the 'cent' symbol on our keyboards again.</p>
<p>This process of rudimentary copy-making has since been called 'rubbing one out',
and is the basis for a neu genre of prose and humanity (humanities, singular) hereby labeled 'scrub-core'.</p>
<p>Because the problems cleanly described by our many arguments
about scraping seem to be illuminated by scrubbing the <code>sc</code> from the phrase,
and realizing that some dialects imagine the phrase to be a cleaning process,
while others are more inclined to see the damages of a rape as inseperable from the experience.</p>
<p>Meanwhile, erryone likes rubbing.</p>
<p>Yeah, erryone. I see you.</p>
<hr />
<p>I mean, really, I do see you all more than you see me;
and that's the issue I'm hoping to clean up here.
All of us coders are really practiced at hiding meaning inside of decisions,
and then hiding decisions inside of experiences,
and then hiding experiences behind messages,
and then messages under dialogue. Social engineering.
Less scary than you'd imagine, and as normal - a huge mess to scrub.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Scrubcore; a summary.</link>
        <guid isPermaLink="false">2025-03-16.Scrubcore; a summary.</guid>
        <pubDate>Sun, 16 Mar 2025 00:00:00 </pubDate>
      </item>
    
      <item>
        <title>Iced anger.</title>
        <description><![CDATA[
          
          <hr/>

          <p>Dependency rings oddly in my mind;
a combinación of necessary and despicable,
a condición I'd like to erase from my presence,
and a condición inescapable, a consequence of biology and sociology.</p>
<p>As a young one, my dependencies on my mom and dad held me up;
I had no language and hardly enough educación to speak up enough,
to say I disagreed when I did; and I did often.</p>
<p>My primary philosophy as a child became obedience;
my primary emotion a smouldering, silent, and borderline dangerous anger.
I could hardly be made to respond to aggression or similar baitings;
I rehearsed a deadening glare that chilled anyone seeking to press me.</p>
<p>I suppose this hardening process, spun into and around my childhood to such a degree,
has endured into the beginnings of my middle age - 32 for another couple months.
I am beginning to shed some of the anger,
and some curious images come to mind during the process.</p>
<hr />
<p>Someone has been open and eager enough to hold me,
on occasional evenings I roam the area with no easy home lined up.
They push me, and I make small noises, and embrace their dominance,
and become happy in how much they can do,
and how much I see them change from night to morning.</p>
<p>As they push me, I am realizing how rare my choice of submission may be;
so many years of spinning my anger inwards has made me happy to be depressed,
pliable in response to impression,
and shapable as clay when someone has an idea to express on me.</p>
<p>I absorb the anger she places on me, and I sense emotions I long ago became bored by.
Yes, anger begins as a searing heat and quaking dread,
a realization of suffocation and a panic of rebellion.</p>
<p>As age creeps in and the anger has no place to go,
the density of the emotion seeps into your bones,
rather than your muscles. The endurance of anger brings... calm, oddly.</p>
<p>The calm is not comfortable, or cozy, or desirable.
A calmed anger is a much more cold calculus,
a complex that consumes a psyche and rebases any id it comes across,
a response reflex that produces immediate changes,
absorbing and compounding and rebounding offending stimuli,
to amplify dangers through parry and backlash,
so that years of learned and sharpened precision and accuracy
can someday claim succession over the oppression of one's surroundings -
only as much as needed, and only aligned to the harms one has undergone.</p>
<hr />
<p>My sample size of psyche is only one, and maybe
my experiences are unique enough to keep me from speaking broadly.</p>
<p>Although, I see in my companions how much these emotions are mirrored,
in moods that come and go easily, in anger that is quick to recede
and in compassion that can only be hard-earned.</p>
<p>I am surrounded by conscious minds that are immensely guarded,
and seek to guard the peers among us whose boundaries occasionally slip.
Those who need more space and comprehension to learn
that no one else besides a body can be responsible for a body,
or else necessarily succumbs to repression.</p>
<p>These peers embody repression, the condición of childhood experiences
passed along by earlier generacións, when open discussion had been shunned
and public spaces clearly delineated by rules of colony and pseudoreligion.</p>
<p>Among all else I can say of these peers, all of us are pleased to break the rules.</p>
<hr />
<p>Lucky there are so many to break, and sad to say so.
Those rules are solemnly upheld by ferocious soldiers,
who subscribe, describe, and prescribe a godly mythology,
thousands of years debunked.</p>
<p>Senseless of the pain their educación can cause,
the pupils who escape unharmed - the normalized ones,
are happy to spread the boundaries of normal,
to middle their posición among <em>their</em> peers,
and push the bounds of <em>their</em> normal into the shrinking margins,
to claim that boundaries of sociology are as real as physical phenomena,
and the norms of ancient religious breeding programs
can cause no possible damage when embraced by a species,
which has become 1000x more populous than the originators of the dogma.</p>
<p>This species, spread as densely as possible among such scarce resources,
is doubling down on gambles made millenia ago.</p>
<p>Taboo, ceremony, shunning, and a lack of nuance all long predate
our human exploración of biology,
and the lessons shared by innumerable sibling species,
screaming '¡reproducción no es sufficiente!'</p>
<p>And biology's lessons here are echoed in those smaller sects,
the ones the Europeans like to call &quot;hidden&quot;,
the ones who are in their essence, sufficient enough alone.</p>
<p>These groups all realized,
as early or long before the Mediteranean ideal of fruitful multiplication,
that animalism and humanism go far beyond organic reproducción.
That there are necessary and sensible consequences
that can only be accomplished by pursuing less.
That a populación's numbers only become significant
when one group has bloodlust for another,
and that a process as complex and precious as sexual combinación
is impaled as a specimen by legal codes requiring monogamy,
or condemning freedoms of choice, bodily autonomy, and open expression.</p>
<hr />
<p>As my anger begins receding, I realize how icy I'd become.
People who seemed to be warm to me, quickly realize how much of that warmth I suck up,
and how minimal the response they gain from the exchange.</p>
<p>For a few months, I'd been an adventurous game to some,
how close could you come before being bitten by the cold.
Those days nearly exposed the dangerous snap of emoción,
as the blizzard in my body yearned to chase the happiness
I'd been perplexed to be surrounded by.</p>
<p>I can describe by numerous methods the consequence of this psychology;
an early-life reliance on quantitative measures of success,
and a consequential loss of purpose accompanying independence.
No desire to help peers accomplish their happiness,
because my analogy of happiness had been an escape from danger,
an open space where no one could charge or challenge me.
I imagined the most I could do for anyone could be to leave them alone,
and so I soon began embracing loneliness as a guide.</p>
<p>Loneliness becomes misery; as age progresses,
one realizes chances to fill in the lessons they missed as a child.
One realizes that there had been precious moments of rare emotion,
aside from panic and anger and pain.
And one begins, gradually and screaming through the immobilización of old scars,
to pursue those shimmering dreams that nearly all hope has disappeared from.</p>
<p>To me this process seems like dredging the floor of a lake,
holding one's breath and peering through murk,
small moción kicking up sandy sod, a grimy scene to drain all energies.</p>
<p>Although, how has one come to be so submerged,
where once there had been a cold ice-scape of anger all around?</p>
<p>Those companions who lend their warmth and charms,
who share the heat of body and song and soul,
do succeed in thawing and reducing the icy lake's surface.
The liquid bubbling up is no longer sharp shards of anger,
only a deep pool of sadness that challenges one's breath
and saps their consciousness. Dangerous to sink into for long,
if you plan on rising again someday.</p>
<p>All the same, passable. Liquid. Mobile and embracing.</p>
<p>And in case one progresses deeply enough and endure,
and hold enough air inside your lungs,
permits one to reach solid ground again.</p>
        ]]></description>
        <link>https://operand.online/chronicle/Iced anger.</link>
        <guid isPermaLink="false">2025-02-21.Iced anger.</guid>
        <pubDate>Fri, 21 Feb 2025 00:00:00 </pubDate>
      </item>
    
  </channel>
</rss>
