<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Lagomorph</title><link>https://lagomor.ph/</link><description>Recent content in Home on Lagomorph</description><generator>Hugo</generator><language>en</language><copyright>Alex S.</copyright><lastBuildDate>Wed, 04 Mar 2026 00:00:00 -0700</lastBuildDate><atom:link href="https://lagomor.ph/index.xml" rel="self" type="application/rss+xml"/><item><title>About</title><link>https://lagomor.ph/info/about/</link><pubDate>Thu, 25 Feb 2021 10:17:12 -0700</pubDate><guid>https://lagomor.ph/info/about/</guid><description>&lt;img class="float-right" src="headshot.jpg" alt="Alex"&gt;
&lt;div class="text-justify"&gt;
&lt;p&gt;I&amp;rsquo;m Alex, a technologist, previously based in Canada, but now operating internationally. My goal in life is to build things that operate, and last, on the timeline of eons.&lt;/p&gt;
&lt;p&gt;By day I work as a Technical Sales Lead at &lt;a href="https://jenni.ai" rel="noopener noreferrer" target="_blank"&gt;Jenni AI&lt;/a&gt;. Half forward deployed engineer, half glad-hander, my day to day is mostly solving problems for academics and Universities.&lt;/p&gt;
&lt;p&gt;Before that I built &lt;a href="./2026/01/a-professor-in-every-pocket/"&gt;learning management systems&lt;/a&gt;, &lt;a href="./projects/axiom/"&gt;logic proof tools&lt;/a&gt;, and various infrastructure projects that, at their best, still serve millions of students a year, and at their worst, are probably blinking away in a closet somewhere.&lt;/p&gt;</description></item><item><title>Values</title><link>https://lagomor.ph/info/values/</link><pubDate>Tue, 09 May 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/info/values/</guid><description>&lt;p&gt;Inspired by &lt;a href="https://evy.garden/manifesto/" rel="noopener noreferrer" target="_blank"&gt;evy&amp;rsquo;s ever-changing manifesto&lt;/a&gt;, this evolving document helps guide me towards the life I want to live.&lt;/p&gt;
&lt;h1 id="responsibility"&gt;Responsibility&lt;/h1&gt;
&lt;p&gt;Responsibility is the willingness to take ownership of one&amp;rsquo;s actions and obligations. It reflects a strong sense of duty and the ability to fulfill commitments with diligence and integrity.&lt;/p&gt;
&lt;p&gt;I embrace responsibility when I consider the impact of my choices and strive to make positive contributions throughout my life.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Ernest_Hemingway" rel="noopener noreferrer" target="_blank"&gt;Ernest Hemmingway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/K%C5%8Dnosuke_Matsushita" rel="noopener noreferrer" target="_blank"&gt;Kōnosuke Matsushita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="bookshelf"&gt;
 
 &lt;div class="book"&gt;
 &lt;div class="cover"&gt;
 &lt;img src="https://ik.imagekit.io/lagomorph/2024/covers/lies_5C9fjNCpt.jpg" alt="The Book of Lies by Aleister Crowley" loading="lazy" decoding="async"&gt;
 &lt;a class="link" href="https://en.wikipedia.org/wiki/The_Book_of_Lies_%28Crowley%29" target="_blank" rel="noopener noreferrer"&gt;&amp;nbsp;&lt;/a&gt;
 &lt;/div&gt;
 &lt;span class="media-title"&gt;The Book of Lies&lt;/span&gt;
 &lt;/div&gt;

 &lt;div class="book"&gt;
 &lt;div class="cover"&gt;
 &lt;img src="https://ik.imagekit.io/lagomorph/2024/covers/mastermarg_seTNIDndb.jpg" alt="The Master and Margarita by Mikhail Buglakov" loading="lazy" decoding="async"&gt;
 &lt;a class="link" href="https://en.wikipedia.org/wiki/The_Master_and_Margarita" target="_blank" rel="noopener noreferrer"&gt;&amp;nbsp;&lt;/a&gt;
 &lt;/div&gt;
 &lt;span class="media-title"&gt;The Master and Margarita&lt;/span&gt;
 &lt;/div&gt;


&lt;/div&gt;


&lt;h1 id="cleverness"&gt;Cleverness&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://ik.imagekit.io/lagomorph/FoxMask_aqR7NmKnL.jpg"
 alt="What a beautiful head - Alas, there are no brains in it"
 loading="lazy"
 decoding="async"&gt;

&lt;div class="caption"&gt;
 &lt;span class="caption-arrow"&gt;↳&lt;/span&gt;
 &lt;span class="caption-text"&gt;What a beautiful head - Alas, there are no brains in it.&lt;/span&gt;
&lt;/div&gt;

&lt;/p&gt;</description></item><item><title>Work</title><link>https://lagomor.ph/info/work/</link><pubDate>Tue, 20 Feb 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/info/work/</guid><description>&lt;p&gt;&lt;em&gt;DevOps / Full Stack / Hacker&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hello, I&amp;rsquo;m &lt;a href="./info/values"&gt;Alex Spezowka&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With over a decade of experience building scalable systems, I architect complete technology solutions from infrastructure to user interface. I specialize in transforming legacy systems into modern architectures, implementing AI-powered applications, and solving complex technical challenges across the full stack.&lt;/p&gt;
&lt;p&gt;Currently Freelancing. &lt;strong&gt;If you need a Hacker in Residence, &lt;a href="#contact"&gt;let&amp;rsquo;s talk&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="core-philosophy"&gt;Core Philosophy&lt;/h2&gt;
&lt;p&gt;My &lt;a href="./info/design"&gt;design philosophy&lt;/a&gt; is hyper-&lt;a href="https://en.wikipedia.org/wiki/Functionalism_%28architecture%29" rel="noopener noreferrer" target="_blank"&gt;functionalist&lt;/a&gt;: build systems that outlast tenure, scale beyond current needs, and can be maintained by future teams. Every architecture decision prioritizes resilience, observability, and developer experience.&lt;/p&gt;</description></item><item><title>Design</title><link>https://lagomor.ph/info/design/</link><pubDate>Sun, 05 Nov 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/info/design/</guid><description>&lt;p&gt;Inspired by Gwern Branwen&amp;rsquo;s &lt;a href="https://gwern.net/design" rel="noopener noreferrer" target="_blank"&gt;design outline&lt;/a&gt;, this page documents the design philosophy behind not only this website, but also every other project I work on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lagomor.ph&lt;/strong&gt; is implemented as a static website, compiled via &lt;a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank"&gt;Hugo&lt;/a&gt; from Standard Markdown, and hosted on a cloud server in Toronto.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Indifference towards people and the reality in which they live is actually the one and only cardinal sin in design.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Dieter Rams&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is designed to be readable, pleasing to the eye, and easy to navigate.
The logo, which is often the singular image on each page, was drawn by &lt;a href=""&gt;Rek Bell&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Things</title><link>https://lagomor.ph/info/things/</link><pubDate>Tue, 06 Jun 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/info/things/</guid><description>&lt;p&gt;This list has been curated together after a half dozen or so years looking for the &amp;ldquo;perfect solution&amp;rdquo; for a number of problems I regularly face.&lt;/p&gt;
&lt;p&gt;I spend a lot of time deeply considering the items and tools I have and use. It seems silly to me to use something with any degree of regularity that I do not find 100% satisfying or functional. Some of them are material things, but I&amp;rsquo;ve also taken the time to highlight software that makes my life better.&lt;/p&gt;</description></item><item><title>A Monk in Brno</title><link>https://lagomor.ph/2026/03/a-monk-in-brno/</link><pubDate>Wed, 04 Mar 2026 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2026/03/a-monk-in-brno/</guid><description>&lt;p&gt;&lt;img src="https://ik.imagekit.io/lagomorph/hero/monk-header.png"
 alt="A Monk in a Pea Garden"
 loading="lazy"
 decoding="async"&gt;
&lt;br&gt;
The peas were not, as a matter of historical correction, his first love. That distinction belonged to fuchsias, which he had grown in the window of his childhood bedroom in Hynčice and which, owing to some defect of soil or devotion, produced a single white bloom among the expected purples in the autumn of his eleventh year. The white bloom died. He kept it pressed in a schoolbook for thirty years. The schoolbook is gone. The fuchsia, as a species, persists; it does not remember him, and this is fine, because he does not require it to.&lt;/p&gt;</description></item><item><title>A Professor in Every Pocket</title><link>https://lagomor.ph/2026/01/a-professor-in-every-pocket/</link><pubDate>Sun, 18 Jan 2026 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2026/01/a-professor-in-every-pocket/</guid><description>&lt;p&gt;&lt;img src="https://ik.imagekit.io/lagomorph/hero/professor_pocket.png"
 alt="A Professor In Every Pocket"
 loading="lazy"
 decoding="async"&gt;&lt;/p&gt;
&lt;p&gt;The scale of the cheating crisis in higher education is staggering. Depending on the survey, between &lt;a href="https://ed.stanford.edu/news/what-do-ai-chatbots-really-mean-students-and-cheating" rel="noopener noreferrer" target="_blank"&gt;60%&lt;/a&gt; and &lt;a href="https://doi.org/10.1038/d41586-025-03915-7" rel="noopener noreferrer" target="_blank"&gt;92%&lt;/a&gt; of college students now regularly use AI for their coursework. Professors are ill-equipped, and administrators are broadly turning a blind eye to the entire situation. Treating this as wholly the fault of AI is, however, a grave mistake.&lt;/p&gt;
&lt;p&gt;The truth is that education has been broken for a long time, and AI was the accelerant that made the bonfire bright enough to see from a distance. In a system where degrees now primarily function as an expensive IQ screening mechanism, where learning is wholly secondary to certification, and where industrial-age teaching methods clash with information-age realities, AI has finally revealed the plastered-over fractures that have been growing for decades.&lt;/p&gt;</description></item><item><title>Axiom</title><link>https://lagomor.ph/projects/axiom/</link><pubDate>Thu, 08 Jan 2026 00:00:00 -0700</pubDate><guid>https://lagomor.ph/projects/axiom/</guid><description>&lt;p&gt;Axiom is an ecosystem of formal logic tools for education. If you&amp;rsquo;ve used &lt;a href="https://carnap.io/" rel="noopener noreferrer" target="_blank"&gt;Carnap&lt;/a&gt; or &lt;a href="https://github.com/frabjous/logicpenguin" rel="noopener noreferrer" target="_blank"&gt;Logic Penguin&lt;/a&gt;, you know the idea — but those platforms send proofs to a server for validation. Axiom runs entirely client-side. No network latency. No tracking. Works offline.&lt;/p&gt;
&lt;p&gt;The core is a TypeScript reimplementation of Kevin Klement&amp;rsquo;s &lt;a href="https://github.com/frabjous/fitch-checker" rel="noopener noreferrer" target="_blank"&gt;fitch-checker&lt;/a&gt;, the PHP validator that powered the original Logic Penguin. The JavaScript version means you can embed proof checking anywhere: static sites, LMS platforms via SCORM, Electron apps, interactive textbooks. Build your own interface or use the provided Web Components.&lt;/p&gt;</description></item><item><title>Logistics is Dying; or - Dude, Where's my Mail?</title><link>https://lagomor.ph/2026/01/logistics-is-dying-or-dude-wheres-my-mail/</link><pubDate>Thu, 08 Jan 2026 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2026/01/logistics-is-dying-or-dude-wheres-my-mail/</guid><description>&lt;p&gt;&lt;img src="https://ik.imagekit.io/lagomorph/hero/ponyexpressrider.jpg"
 alt="Painting of a Pony Express rider on galloping horse across an expansive grassy landscape under a cloudy sky."
 loading="lazy"
 decoding="async"&gt;

&lt;div class="caption"&gt;
 &lt;span class="caption-arrow"&gt;↳&lt;/span&gt;
 &lt;span class="caption-text"&gt;Pony Express Rider, oil painting possibly by Lloyd Branson (1853-1925)&lt;/span&gt;
&lt;/div&gt;

&lt;/p&gt;
&lt;p&gt;In March 1860, William H. Russell established the Overland Express Route, colloquially called the &lt;a href="https://about.usps.com/who-we-are/postal-history/pony-express.pdf" rel="noopener noreferrer" target="_blank"&gt;Pony Express&lt;/a&gt;, to carry express mail between St. Joseph, Missouri, and California; an area with no colonialist settlements between. Russell failed repeatedly to get funding from the Senate Post Office for the project, as most considered year-round transportation between the two areas impossible due to extreme weather conditions, but Russell forged ahead on his own for two reasons:&lt;/p&gt;</description></item><item><title>llms.txt</title><link>https://lagomor.ph/2025/08/llms.txt/</link><pubDate>Mon, 04 Aug 2025 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2025/08/llms.txt/</guid><description>&lt;p&gt;Imagine my shock and surprise to discover that when I submit resumes now, I quickly see LLM research agents in my access logs pouring over my &lt;a href="./info/work"&gt;portfolio page&lt;/a&gt;. As time moves ever forward, I suspect I&amp;rsquo;ll be dealing with AI agents more frequently, especially in the job market.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not &lt;em&gt;thrilled&lt;/em&gt; about this, but I can&amp;rsquo;t do anything about it - so, if you can&amp;rsquo;t beat them, join them.&lt;/p&gt;
&lt;p&gt;My website is already fairly straight-forward HTML and CSS, but in my own testing, models still seem to get confused about content on my site - theres a lot to parse, even on a simple site.&lt;/p&gt;</description></item><item><title>Truth Functional Logic for Hackers - Part One</title><link>https://lagomor.ph/2025/02/truth-functional-logic-for-hackers-part-one/</link><pubDate>Wed, 26 Feb 2025 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2025/02/truth-functional-logic-for-hackers-part-one/</guid><description>&lt;p&gt;Bob and Alice are two hackers working on an embedded system with a severe computational constraint - there is a bug in their low-cost microcontroller making OR operations significantly slower than any other operation on the chipset.&lt;/p&gt;
&lt;p&gt;When they profiled their micropython code, they found that OR operations were up to 5x slower than any other operation.&lt;/p&gt;






&lt;style&gt;
 .dialog-container {
 margin: 2em 0;
 font-family: et-book, Palatino, "Palatino Linotype", "Palatino LT STD", "Book Antiqua", Georgia, serif;
 }
 
 .dialog-message {
 display: flex;
 margin-bottom: 1.5em;
 align-items: flex-start;
 }
 
 .dialog-avatar-container {
 display: flex;
 flex-direction: column;
 align-items: center;
 margin-right: 15px;
 flex-shrink: 0;
 }
 
 .dialog-character2 .dialog-avatar-container {
 margin-right: 0;
 margin-left: 15px;
 }
 
 .dialog-avatar {
 max-width: 80px;
 flex-shrink: 0;
 }

 .dialog-avatar img {
 max-width: 100%;
 height: auto;
 border: none;
 }
 
 .dialog-name {
 font-weight: bold;
 font-size: 0.85em;
 margin-top: 0.4em;
 text-align: center;
 }
 
 .dialog-bubble {
 position: relative;
 max-width: 80%;
 padding: 0.8em 1.2em;
 background-color: #f1f1f1;
 box-shadow: 0 1px 2px rgba(0,0,0,0.1);
 }
 
 .dialog-bubble::before {
 content: "";
 position: absolute;
 top: 14px;
 width: 0;
 height: 0;
 border: 8px solid transparent;
 }
 
 .dialog-character1 .dialog-bubble {
 background-color: var(--calloutcolor);
 color: var(--textcolor);
 margin-right: auto;
 }
 
 .dialog-character1 .dialog-bubble::before {
 left: -15px;
 border-right-color: var(--calloutcolor);
 }
 
 .dialog-character2 {
 flex-direction: row-reverse;
 }
 
 .dialog-character2 .dialog-bubble {
 background-color: var(--maincolor);
 color: #fafafa;
 margin-left: auto;
 }
 
 .dialog-character2 .dialog-bubble::before {
 right: -15px;
 border-left-color: var(--maincolor);
 }
 
 .dialog-content p:first-child {
 margin-top: 0;
 }
 
 .dialog-content p:last-child {
 margin-bottom: 0;
 }
 
 .dialog-content img {
 max-width: 100%;
 border: 1px solid var(--maincolor);
 margin: 0.5em 0;
 }
&lt;/style&gt;

&lt;div id="dialog-1773604990798339956" class="dialog-container"&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;div class="dialog-message dialog-character1"&gt;
 
 &lt;div class="dialog-avatar-container"&gt;
 &lt;div class="dialog-avatar"&gt;
 &lt;img src="https://ik.imagekit.io/lagomorph/my-notion-face-transparent.png" alt="Alice"&gt;
 &lt;/div&gt;
 &lt;div class="dialog-name"&gt;Alice&lt;/div&gt;
 &lt;/div&gt;
 
 &lt;div class="dialog-bubble"&gt;
 &lt;div class="dialog-content"&gt;This is a big problem! We could replace the faulty chips with better ones, if they arrive before the deadline.&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;div class="dialog-message dialog-character2"&gt;
 
 &lt;div class="dialog-avatar-container"&gt;
 &lt;div class="dialog-avatar"&gt;
 &lt;img src="https://ik.imagekit.io/lagomorph/bob.png" alt="Bob"&gt;
 &lt;/div&gt;
 &lt;div class="dialog-name"&gt;Bob&lt;/div&gt;
 &lt;/div&gt;
 
 &lt;div class="dialog-bubble"&gt;
 &lt;div class="dialog-content"&gt;I don&amp;rsquo;t think we can afford to wait - the deadline is in 3 days. A better option is to rewrite the code to avoid the OR operation.&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 &lt;div class="dialog-message dialog-character1"&gt;
 
 &lt;div class="dialog-avatar-container"&gt;
 &lt;div class="dialog-avatar"&gt;
 &lt;img src="https://ik.imagekit.io/lagomorph/my-notion-face-transparent.png" alt="Alice"&gt;
 &lt;/div&gt;
 &lt;div class="dialog-name"&gt;Alice&lt;/div&gt;
 &lt;/div&gt;
 
 &lt;div class="dialog-bubble"&gt;
 &lt;div class="dialog-content"&gt;How could we do that? We&amp;rsquo;re using the OR operation in a lot of critical places. Look:&lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 
 
 
 
&lt;/div&gt; 
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#000;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5317ac"&gt;def&lt;/span&gt; &lt;span style="color:#721045"&gt;authorize_access&lt;/span&gt;(request):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#505050"&gt;# A user is denied if they are on a blacklist OR &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#505050"&gt;# their account is expired&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5317ac"&gt;if&lt;/span&gt; (user_is_blacklisted(request&lt;span style="color:#00538b"&gt;.&lt;/span&gt;user_id) &lt;span style="color:#00538b"&gt;or&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; account_is_expired(request&lt;span style="color:#00538b"&gt;.&lt;/span&gt;account)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5317ac"&gt;return&lt;/span&gt; &lt;span style="color:#2544bb"&gt;&amp;#34;Access denied&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5317ac"&gt;return&lt;/span&gt; &lt;span style="color:#2544bb"&gt;&amp;#34;Access granted&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s take a moment to understand the problem. The &lt;code&gt;authorize_access&lt;/code&gt; function is used to check if a user is authorized to access a resource. The &lt;code&gt;or&lt;/code&gt; operation is used to combine the conditions. How could we rewrite this function to avoid the OR operation?&lt;/p&gt;</description></item><item><title>Greg &amp; the Eternal Brunch</title><link>https://lagomor.ph/2025/02/greg-the-eternal-brunch/</link><pubDate>Tue, 04 Feb 2025 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2025/02/greg-the-eternal-brunch/</guid><description>&lt;style&gt;
article strong {
 font-family: var(--font-mono);
 font-weight: 300;
 font-size: 0.85em;
}
&lt;/style&gt;
&lt;p&gt;The year was 2036. OpenAI had finally done it. After decades of press releases, quarterly existential crises, and machine learning papers so esoteric they made &lt;em&gt;Finnegans Wake&lt;/em&gt; read like PopSci, they&amp;rsquo;d finished gpt-6z (revision 3) - a perfect, autonomous general intelligence.&lt;/p&gt;
&lt;p&gt;Its unveiling was a lavish affair. Tech billionaires in artisanal graphene turtlenecks mingled with venture capitalists who had fully replaced their blood with bespoke Turkish CBD nanofluid. The baristas hired to cater the event - a final nod to &amp;ldquo;human craftsmanship&amp;rdquo; - steamed oat milk lattes with the grim precision of soldiers in the trenches, loading rifles for a war already lost.&lt;/p&gt;</description></item><item><title>All These People Are Vampires - Building the Contra-Economy</title><link>https://lagomor.ph/2025/01/all-these-people-are-vampires-building-the-contra-economy/</link><pubDate>Fri, 03 Jan 2025 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2025/01/all-these-people-are-vampires-building-the-contra-economy/</guid><description>&lt;p&gt;In the 1980&amp;rsquo;s, Robert L. Crandall, head of American Airlines, removed one single olive from the salad they served passengers. He thought they wouldn&amp;rsquo;t notice - and he was right. This removal of the olive saved the company $40,000 a year.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; and began the downfall of Service Capitalism. This was the subtle but profound shift in how business viewed their relationships with customers: from competition through service excellence to a methodical calculation of what could be taken away without prompting customer exodus. The olive was just the beginning. In the decades that followed, this mindset transformed from careful optimization into something vampiric, cannibalistic, as companies discovered they could feed not just on garnishes, but on essential services and basic human comforts. The story of modern capitalism is a story of this transformation - from competing to see who could offer more, to how much could be taken away.&lt;/p&gt;</description></item><item><title>2024 in Review - 100 Books</title><link>https://lagomor.ph/2024/12/2024-in-review-100-books/</link><pubDate>Tue, 31 Dec 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2024/12/2024-in-review-100-books/</guid><description>&lt;p&gt;I read 100 books this year as a challenge to myself. The hardest part about reading 100 books in a year is fomatting them cleanly afterward on your website. The second hardest part is tracking them all. The actual activity is a cinch.&lt;/p&gt;
&lt;p&gt;Reading 100 books this year was directly inspired from stories of Theodore Roosevelt, who read one book a day, often multiple. The thing I&amp;rsquo;ve learned about reading serious literature in quantity is that most books are phenomenally forgettable. Tiago Forte, in &amp;ldquo;Building a Second Brain&amp;rdquo;, talks about saving quotations from every book you read, either on index cards or digitally - and when you&amp;rsquo;re reading so much, thats literally all you can do to try and keep track of the different ideas presented to you.&lt;/p&gt;</description></item><item><title>The $500 Question - How Media Framing Shapes Our Reality</title><link>https://lagomor.ph/2024/12/the-500-question-how-media-framing-shapes-our-reality/</link><pubDate>Sat, 28 Dec 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2024/12/the-500-question-how-media-framing-shapes-our-reality/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;In this season of giving, what are we to make of a billionaire with a soft spot for striving graduates who draws a hard line on being present for the pomp and circumstance, no matter the circumstances?&amp;rdquo; - &lt;a href="https://www.nytimes.com/2024/12/25/your-money/umass-dartmouth-billionaire-charity.html" rel="noopener noreferrer" target="_blank"&gt;New York Times&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The modern media apparatus doesn&amp;rsquo;t just report news - it manufactures reality through carefully constructed narratives that shape how we process and respond to events. This process has become so refined that different outlets can take the same event and create entirely separate realities, each designed to reinforce specific worldviews and emotional responses in their target audiences.&lt;/p&gt;</description></item><item><title>Core Values Wizard</title><link>https://lagomor.ph/projects/values/</link><pubDate>Mon, 16 Dec 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/projects/values/</guid><description>&lt;p&gt;This interactive wizard guides you through a structured introspective journey to discover your 5 most essential core values. Based on the classic values card sort exercise, it helps you explore 235+ values across 7 categories, then progressively refine your selections until you identify what matters most.&lt;/p&gt;
&lt;p&gt;Your progress is automatically saved in your browser, so you can take your time and return whenever you&amp;rsquo;re ready.&lt;/p&gt;
&lt;hr&gt;

&lt;link rel="stylesheet" href="./css/core-values.f93f4533aa41267d1e7c38a7f3d91e7c5bf4e50b81c4a229b4323e12615fdd2f.css" integrity="sha256-&amp;#43;T9FM6pBJn0efDin89kefFv05QuBxKIptDI&amp;#43;EmFf3S8="&gt;
&lt;link rel="stylesheet" href="./css/core-values-additional.e30bbccdc4ae6b93b6816b5a82e9fe7ad109b592165b05c52d78bafe28f3a091.css" integrity="sha256-4wu8zcSua5O2gWtagun&amp;#43;etEJtZIWWwXFLXi6/ijzoJE="&gt;

&lt;div class="cv-container" id="cv-app"&gt;
 
 &lt;div class="cv-stage active" data-stage="start"&gt;
 &lt;div class="cv-start"&gt;
 &lt;h2&gt;Discover Your Core Values&lt;/h2&gt;
 &lt;p&gt;Core values are the fundamental beliefs that guide your decisions and behavior. This exercise helps you identify the 5 values most essential to who you are.&lt;/p&gt;</description></item><item><title>Mixtape Maker</title><link>https://lagomor.ph/projects/cassette/</link><pubDate>Thu, 21 Nov 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/projects/cassette/</guid><description>&lt;p&gt;Tired of hand-calculating how you should split up your playlist between the two sides of a cassette tape? This widget is designed to make it simple; set your tape length, drag your music files directly onto this page, and move your tracks between the two playlists.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re ready to record, connect your computer to your tape deck (however you prefer to do so) and press play!&lt;/p&gt;
&lt;p&gt;The player will automatically play blank gaps between songs - but it doesn&amp;rsquo;t add gaps to the beginning or end, so be sure your tape is ready to record.&lt;/p&gt;</description></item><item><title>Film Development Calculator</title><link>https://lagomor.ph/projects/filmdevelopment/</link><pubDate>Thu, 14 Nov 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/projects/filmdevelopment/</guid><description>&lt;style&gt;
.calculator-container {
 --calc-main: var(--maincolor);
 --calc-text: var(--textcolor);
 --calc-border: var(--maincolor);
 --calc-callout: var(--calloutcolor);
 --calc-bg: var(--color-bg, #fafafa);
 --calc-text-muted: color-mix(in srgb, var(--calc-text) 60%, transparent);
 margin: 20px auto;
 max-width: 900px;
}

.calc-columns {
 display: flex;
 flex-wrap: wrap;
 gap: 1.5rem;
 margin: 1.5rem 0;
 align-items: flex-start;
}

.calc-column {
 flex: 1 1 calc(50% - 0.75rem);
 min-width: 0;
}

.calc-column &gt; *:first-child {
 margin-top: 0;
}

.calc-column &gt; *:last-child {
 margin-bottom: 0;
}

@media screen and (max-width: 768px) {
 .calc-column {
 flex: 1 1 100%;
 }

 .calc-columns {
 gap: 1rem;
 }
}

.calculator-container .input-section {
 background-color: var(--calc-callout);
 padding: 1rem;
 margin-bottom: 1rem;
}

.calculator-container .input-section h3 {
 margin-top: 0;
 margin-bottom: 0.75rem;
 color: var(--calc-main);
 font-size: 1.1rem;
}

.calculator-container .input-group {
 margin-bottom: 1rem;
}

.calculator-container .input-group:last-child {
 margin-bottom: 0;
}

.calculator-container .input-group label {
 display: block;
 margin-bottom: 0.5rem;
 font-weight: 500;
 color: var(--calc-text);
}

.calculator-container .input-group input[type="number"],
.calculator-container .input-group input[type="text"],
.calculator-container .input-group select {
 width: 140px;
 padding: 0.5rem;
 border: 1px solid var(--calc-border);
 background: var(--calc-bg);
 color: var(--calc-text);
 margin-right: 10px;
 font-family: inherit;
}

.calculator-container .input-group input[type="number"]:focus,
.calculator-container .input-group input[type="text"]:focus,
.calculator-container .input-group select:focus {
 outline: 2px solid var(--calc-main);
 outline-offset: 1px;
}

.calculator-container .input-row {
 display: flex;
 align-items: center;
 flex-wrap: wrap;
 gap: 0.5rem;
}

.calculator-container .slider-container {
 margin: 10px 0;
}

.calculator-container .slider-container input[type="range"] {
 width: 100%;
 margin-right: 10px;
 margin-bottom: 0.5rem;
}

.calculator-container .note {
 font-size: 0.85rem;
 color: var(--calc-text-muted);
 font-style: italic;
}

.calculator-container .preset-note {
 font-size: 0.85rem;
 color: var(--calc-main);
 font-style: italic;
 margin-top: 0.5rem;
}

.calculator-container .process-steps,
.calculator-container .result {
 background-color: var(--calc-callout);
 padding: 1rem;
 margin-bottom: 1rem;
}

.calculator-container .step,
.calculator-container .result-row {
 display: flex;
 justify-content: space-between;
 margin-bottom: 0.4rem;
 padding: 0.2rem 0;
}

.calculator-container .step:last-child,
.calculator-container .result-row:last-child {
 margin-bottom: 0;
}

.calculator-container .process-steps h3,
.calculator-container .result h3 {
 margin-top: 0;
 margin-bottom: 0.75rem;
 color: var(--calc-main);
 font-size: 1.1rem;
}

.calculator-container .timer-section {
 text-align: center;
 background-color: var(--calc-callout);
 padding: 1rem;
 margin-top: 1.5rem;
}

.calculator-container .timer-display {
 font-size: 3em;
 margin: 1rem 0;
 font-family: 'IBM Plex Mono', monospace;
 color: var(--calc-main);
 transition: color 0.15s, transform 0.15s;
}

.calculator-container .timer-display.flash {
 color: var(--calc-bg);
 background: var(--calc-main);
 transform: scale(1.05);
}

.calculator-container .timer-step {
 margin-bottom: 1rem;
 font-weight: 500;
 font-size: 1.1rem;
}

.calculator-container .agitation-alert {
 font-size: 1.2rem;
 font-weight: bold;
 color: var(--calc-main);
 min-height: 1.5em;
 margin-bottom: 0.5rem;
}

.calculator-container .timer-progress {
 width: 100%;
 height: 24px;
 background: var(--calc-callout);
 margin-bottom: 1rem;
 position: relative;
 border: 1px solid var(--calc-border);
 overflow: hidden;
}

.calculator-container .timer-progress-fill {
 height: 100%;
 width: 100%;
 background: var(--calc-main);
 position: absolute;
 left: 0;
 top: 0;
 transition: width 0.2s linear;
}

.calculator-container .timer-progress-segments {
 display: flex;
 height: 100%;
 position: relative;
 z-index: 1;
}

.calculator-container .timer-progress-segment {
 height: 100%;
 border-right: 2px solid var(--calc-border);
 display: flex;
 align-items: center;
 justify-content: center;
 font-size: 0.7rem;
 color: var(--calc-text);
 position: relative;
}

.calculator-container .timer-progress-segment:last-child {
 border-right: none;
}

.calculator-container .timer-progress-segment.active {
 font-weight: 600;
}

.calculator-container .timer-progress-segment.completed {
 color: var(--calc-text-muted);
}

.calculator-container .timer-controls {
 display: flex;
 justify-content: center;
 flex-wrap: wrap;
 gap: 0.5rem;
}

.calculator-container .timer-controls button {
 background: none;
 border: 2px solid var(--calc-main);
 padding: 0.5rem 1rem;
 cursor: pointer;
 font-family: inherit;
 font-size: 1rem;
 color: var(--calc-text);
 transition: background-color 0.15s, color 0.15s;
}

.calculator-container .timer-controls button:hover {
 background-color: var(--calc-main);
 color: var(--calc-bg);
}

.calculator-container .timer-controls button:disabled {
 opacity: 0.5;
 cursor: not-allowed;
}

.calculator-container .timer-controls button:disabled:hover {
 background: none;
 color: var(--calc-text);
}

.calculator-container .settings-toggle {
 background: none;
 border: none;
 color: var(--calc-main);
 cursor: pointer;
 font-family: inherit;
 font-size: 0.9rem;
 padding: 0;
 border-bottom: 2px solid var(--calc-main);
 margin-bottom: 1rem;
}

.calculator-container .settings-toggle:hover {
 background: var(--calc-main);
 color: var(--calc-bg);
}

.calculator-container .advanced-settings {
 display: none;
 margin-top: 1rem;
 padding-top: 1rem;
 border-top: 1px solid var(--calc-border);
}

.calculator-container .advanced-settings.visible {
 display: block;
}

.calculator-container .step-times-grid {
 display: grid;
 grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
 gap: 0.75rem;
}

.calculator-container .step-time-input {
 display: flex;
 flex-direction: column;
 gap: 0.25rem;
}

.calculator-container .step-time-input label {
 font-size: 0.85rem;
}

.calculator-container .step-time-input input {
 width: 100%;
 box-sizing: border-box;
}

.calculator-container .unit-toggle {
 display: inline-flex;
 border: 1px solid var(--calc-border);
 margin-left: 0.5rem;
}

.calculator-container .unit-toggle button {
 background: none;
 border: none;
 padding: 0.25rem 0.5rem;
 cursor: pointer;
 font-family: inherit;
 font-size: 0.85rem;
 color: var(--calc-text);
}

.calculator-container .unit-toggle button.active {
 background: var(--calc-main);
 color: var(--calc-bg);
}

.calculator-container .toolbar {
 display: flex;
 justify-content: flex-end;
 gap: 0.5rem;
 margin: 1rem 0;
 flex-wrap: wrap;
}

.calculator-container .toolbar button {
 background: none;
 border: none;
 color: var(--calc-main);
 cursor: pointer;
 font-family: inherit;
 font-size: 0.85rem;
 padding: 0.25rem 0.5rem;
 border-bottom: 2px solid var(--calc-main);
}

.calculator-container .toolbar button:hover {
 background: var(--calc-main);
 color: var(--calc-bg);
}

.calculator-container .adjustments-full {
 margin-top: 0;
}

.calculator-container .adjustments-grid {
 display: grid;
 grid-template-columns: repeat(3, 1fr);
 gap: 1.5rem;
 align-items: start;
}

.calculator-container .adjustments-grid .slider-container {
 margin: 0.5rem 0 0 0;
}

@media screen and (max-width: 768px) {
 .calculator-container .adjustments-grid {
 grid-template-columns: 1fr;
 gap: 1rem;
 }
}
&lt;/style&gt;

&lt;div class="calculator-container"&gt;
 &lt;div class="calc-columns"&gt;
 &lt;div class="calc-column"&gt;
 &lt;div class="input-section"&gt;
 &lt;h3&gt;Film &amp; Developer&lt;/h3&gt;
 &lt;div class="input-group"&gt;
 &lt;label for="filmStock"&gt;Film Stock:&lt;/label&gt;
 &lt;select id="filmStock"&gt;
 &lt;option value="custom"&gt;Custom&lt;/option&gt;
 &lt;option value="tri-x-400"&gt;Tri-X 400&lt;/option&gt;
 &lt;option value="hp5-400" selected&gt;HP5+ 400&lt;/option&gt;
 &lt;option value="fp4-125"&gt;FP4+ 125&lt;/option&gt;
 &lt;option value="tmax-400"&gt;T-Max 400&lt;/option&gt;
 &lt;option value="delta-400"&gt;Delta 400&lt;/option&gt;
 &lt;option value="pan-f-50"&gt;Pan F+ 50&lt;/option&gt;
 &lt;option value="apx-100"&gt;APX 100&lt;/option&gt;
 &lt;option value="fomapan-400"&gt;Fomapan 400&lt;/option&gt;
 &lt;/select&gt;
 &lt;/div&gt;

 &lt;div class="input-group"&gt;
 &lt;label for="developer"&gt;Developer:&lt;/label&gt;
 &lt;select id="developer"&gt;
 &lt;option value="custom"&gt;Custom&lt;/option&gt;
 &lt;option value="rodinal-1:25"&gt;Rodinal 1:25&lt;/option&gt;
 &lt;option value="rodinal-1:50" selected&gt;Rodinal 1:50&lt;/option&gt;
 &lt;option value="rodinal-1:100"&gt;Rodinal 1:100 (Stand)&lt;/option&gt;
 &lt;option value="d76-stock"&gt;D-76 Stock&lt;/option&gt;
 &lt;option value="d76-1:1"&gt;D-76 1:1&lt;/option&gt;
 &lt;option value="hc110-b"&gt;HC-110 Dilution B&lt;/option&gt;
 &lt;option value="xtol-stock"&gt;XTOL Stock&lt;/option&gt;
 &lt;option value="xtol-1:1"&gt;XTOL 1:1&lt;/option&gt;
 &lt;option value="ddx-1:4"&gt;DD-X 1:4&lt;/option&gt;
 &lt;/select&gt;
 &lt;/div&gt;
 &lt;div id="presetNote" class="preset-note"&gt;&lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="input-section"&gt;
 &lt;h3&gt;Setup Parameters&lt;/h3&gt;
 &lt;div class="input-group"&gt;
 &lt;label for="volume"&gt;Tank Volume (ml):&lt;/label&gt;
 &lt;input type="number" id="volume" value="375" min="100" max="5000" step="5"&gt;
 &lt;/div&gt;

 &lt;div class="input-group"&gt;
 &lt;label for="ratio"&gt;Developer Ratio (1:x):&lt;/label&gt;
 &lt;div class="input-row"&gt;
 &lt;input type="number" id="ratio" value="50" min="1" max="200"&gt;
 &lt;span class="note"&gt;e.g., 50 for 1:50&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="input-group"&gt;
 &lt;label for="baseTime"&gt;Base Development Time (minutes):&lt;/label&gt;
 &lt;input type="number" id="baseTime" value="11" min="1" max="120" step="0.5"&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="calc-column"&gt;
 &lt;div class="result"&gt;
 &lt;h3&gt;Dilution Results&lt;/h3&gt;
 &lt;div class="result-row"&gt;
 &lt;span&gt;Developer needed:&lt;/span&gt;
 &lt;span&gt;&lt;span id="developerAmount"&gt;7.5&lt;/span&gt; ml&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="result-row"&gt;
 &lt;span&gt;Water needed:&lt;/span&gt;
 &lt;span&gt;&lt;span id="waterAmount"&gt;367.5&lt;/span&gt; ml&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="result-row"&gt;
 &lt;span&gt;Adjusted development time:&lt;/span&gt;
 &lt;span&gt;&lt;span id="adjustedTime"&gt;11&lt;/span&gt; minutes&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="process-steps"&gt;
 &lt;h3&gt;Process Timeline&lt;/h3&gt;
 &lt;div class="step"&gt;
 &lt;span&gt;Pre-soak:&lt;/span&gt;
 &lt;span id="presoak-display"&gt;1:00&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="step"&gt;
 &lt;span&gt;Development:&lt;/span&gt;
 &lt;span id="developmentStep"&gt;11:00&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="step"&gt;
 &lt;span&gt;Stop Bath:&lt;/span&gt;
 &lt;span id="stopbath-display"&gt;1:00&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="step"&gt;
 &lt;span&gt;Fix:&lt;/span&gt;
 &lt;span id="fix-display"&gt;5:00&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="step"&gt;
 &lt;span&gt;Rinse:&lt;/span&gt;
 &lt;span id="rinse-display"&gt;10:00&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="step" style="border-top: 1px solid var(--calc-border); padding-top: 0.5rem; margin-top: 0.5rem;"&gt;
 &lt;strong&gt;Total Time:&lt;/strong&gt;
 &lt;strong id="totalTime"&gt;28:00&lt;/strong&gt;
 &lt;/div&gt;

 &lt;button type="button" class="settings-toggle" id="toggleAdvanced"&gt;Customize Step Times&lt;/button&gt;
 &lt;div class="advanced-settings" id="advancedSettings"&gt;
 &lt;div class="step-times-grid"&gt;
 &lt;div class="step-time-input"&gt;
 &lt;label for="presoak"&gt;Pre-soak (min):&lt;/label&gt;
 &lt;input type="number" id="presoak" value="1" min="0" max="10" step="0.5"&gt;
 &lt;/div&gt;
 &lt;div class="step-time-input"&gt;
 &lt;label for="stopbath"&gt;Stop Bath (min):&lt;/label&gt;
 &lt;input type="number" id="stopbath" value="1" min="0.5" max="5" step="0.5"&gt;
 &lt;/div&gt;
 &lt;div class="step-time-input"&gt;
 &lt;label for="fix"&gt;Fix (min):&lt;/label&gt;
 &lt;input type="number" id="fix" value="5" min="2" max="15" step="0.5"&gt;
 &lt;/div&gt;
 &lt;div class="step-time-input"&gt;
 &lt;label for="rinse"&gt;Rinse (min):&lt;/label&gt;
 &lt;input type="number" id="rinse" value="10" min="5" max="30" step="1"&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="input-section adjustments-full"&gt;
 &lt;h3&gt;Adjustments&lt;/h3&gt;
 &lt;div class="adjustments-grid"&gt;
 &lt;div class="input-group"&gt;
 &lt;label for="temperature"&gt;
 Temperature:
 &lt;span class="unit-toggle"&gt;
 &lt;button type="button" id="unitC" class="active"&gt;°C&lt;/button&gt;
 &lt;button type="button" id="unitF"&gt;°F&lt;/button&gt;
 &lt;/span&gt;
 &lt;/label&gt;
 &lt;div class="slider-container"&gt;
 &lt;input type="range" id="temperature" min="18" max="24" value="20" step="0.5"&gt;
 &lt;span id="tempValue"&gt;20°C&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="input-group"&gt;
 &lt;label for="pushPull"&gt;Push/Pull Adjustment:&lt;/label&gt;
 &lt;div class="slider-container"&gt;
 &lt;input type="range" id="pushPull" min="-4" max="4" value="0"&gt;
 &lt;span id="pushValue"&gt;0 stops&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="input-group"&gt;
 &lt;label for="agitationInterval"&gt;Agitation Reminder:&lt;/label&gt;
 &lt;select id="agitationInterval"&gt;
 &lt;option value="0"&gt;Off&lt;/option&gt;
 &lt;option value="30"&gt;Every 30 seconds&lt;/option&gt;
 &lt;option value="60" selected&gt;Every 60 seconds&lt;/option&gt;
 &lt;option value="120"&gt;Every 2 minutes&lt;/option&gt;
 &lt;/select&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="toolbar"&gt;
 &lt;button type="button" id="copySettings"&gt;Copy Settings&lt;/button&gt;
 &lt;button type="button" id="resetDefaults"&gt;Reset to Defaults&lt;/button&gt;
 &lt;/div&gt;

 &lt;div class="timer-section"&gt;
 &lt;h3&gt;Development Timer&lt;/h3&gt;
 &lt;div class="agitation-alert" id="agitationAlert"&gt;&lt;/div&gt;
 &lt;div class="timer-display" id="timerDisplay"&gt;00:00&lt;/div&gt;
 &lt;div class="timer-progress" id="timerProgress"&gt;
 &lt;div class="timer-progress-fill" id="progressFill"&gt;&lt;/div&gt;
 &lt;div class="timer-progress-segments" id="progressSegments"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="timer-step"&gt;
 Current step: &lt;span id="currentStep"&gt;Not started&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="timer-controls"&gt;
 &lt;button type="button" id="startTimer"&gt;Start&lt;/button&gt;
 &lt;button type="button" id="skipStep" disabled&gt;Skip to Next&lt;/button&gt;
 &lt;button type="button" id="resetTimer" disabled&gt;Reset&lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
(function() {
 'use strict';

 function debounce(fn, delay) {
 let timeoutId = null;
 return function(...args) {
 if (timeoutId) clearTimeout(timeoutId);
 timeoutId = setTimeout(() =&gt; fn.apply(this, args), delay);
 };
 }

 function clampToInput(input) {
 const value = parseFloat(input.value);
 const min = parseFloat(input.min);
 const max = parseFloat(input.max);
 if (!isNaN(min) &amp;&amp; value &lt; min) input.value = min;
 if (!isNaN(max) &amp;&amp; value &gt; max) input.value = max;
 }

 const presets = {
 films: {
 'tri-x-400': { name: 'Tri-X 400', iso: 400 },
 'hp5-400': { name: 'HP5+ 400', iso: 400 },
 'fp4-125': { name: 'FP4+ 125', iso: 125 },
 'tmax-400': { name: 'T-Max 400', iso: 400 },
 'delta-400': { name: 'Delta 400', iso: 400 },
 'pan-f-50': { name: 'Pan F+ 50', iso: 50 },
 'apx-100': { name: 'APX 100', iso: 100 },
 'fomapan-400': { name: 'Fomapan 400', iso: 400 }
 },
 developers: {
 'rodinal-1:25': { name: 'Rodinal 1:25', ratio: 25 },
 'rodinal-1:50': { name: 'Rodinal 1:50', ratio: 50 },
 'rodinal-1:100': { name: 'Rodinal 1:100', ratio: 100 },
 'd76-stock': { name: 'D-76 Stock', ratio: 0 },
 'd76-1:1': { name: 'D-76 1:1', ratio: 1 },
 'hc110-b': { name: 'HC-110 B', ratio: 31 },
 'xtol-stock': { name: 'XTOL Stock', ratio: 0 },
 'xtol-1:1': { name: 'XTOL 1:1', ratio: 1 },
 'ddx-1:4': { name: 'DD-X 1:4', ratio: 4 }
 },
 times: {
 'tri-x-400': {
 'rodinal-1:50': { time: 11, notes: 'Standard contrast' },
 'rodinal-1:25': { time: 6, notes: 'High acutance' },
 'rodinal-1:100': { time: 60, notes: 'Stand development, minimal agitation' },
 'd76-stock': { time: 8, notes: 'Classic look' },
 'd76-1:1': { time: 10.5, notes: 'Slightly finer grain' },
 'hc110-b': { time: 6, notes: 'Good sharpness' },
 'xtol-stock': { time: 7, notes: 'Fine grain, good shadow detail' },
 'xtol-1:1': { time: 9, notes: 'Economical' },
 'ddx-1:4': { time: 10, notes: 'Professional results' }
 },
 'hp5-400': {
 'rodinal-1:50': { time: 11, notes: 'Normal agitation' },
 'rodinal-1:25': { time: 6, notes: 'High acutance' },
 'rodinal-1:100': { time: 60, notes: 'Stand development' },
 'd76-stock': { time: 7.5, notes: 'Standard' },
 'd76-1:1': { time: 11, notes: 'Slightly finer grain' },
 'hc110-b': { time: 6.5, notes: 'Good sharpness' },
 'xtol-stock': { time: 7, notes: 'Fine grain' },
 'xtol-1:1': { time: 9.5, notes: 'Economical' },
 'ddx-1:4': { time: 9, notes: 'Professional results' }
 },
 'fp4-125': {
 'rodinal-1:50': { time: 9, notes: 'Standard contrast' },
 'rodinal-1:25': { time: 5, notes: 'High acutance' },
 'rodinal-1:100': { time: 60, notes: 'Stand development' },
 'd76-stock': { time: 6, notes: 'Classic look' },
 'd76-1:1': { time: 8, notes: 'Finer grain' },
 'hc110-b': { time: 5, notes: 'Good sharpness' },
 'xtol-stock': { time: 6, notes: 'Fine grain' },
 'xtol-1:1': { time: 8, notes: 'Economical' },
 'ddx-1:4': { time: 8, notes: 'Professional results' }
 },
 'tmax-400': {
 'rodinal-1:50': { time: 12, notes: 'Continuous agitation first minute' },
 'rodinal-1:25': { time: 7, notes: 'High acutance' },
 'rodinal-1:100': { time: 60, notes: 'Stand development' },
 'd76-stock': { time: 7, notes: 'Standard' },
 'd76-1:1': { time: 9, notes: 'Finer grain' },
 'hc110-b': { time: 6, notes: 'Good sharpness' },
 'xtol-stock': { time: 7, notes: 'Fine grain, recommended' },
 'xtol-1:1': { time: 9, notes: 'Economical' },
 'ddx-1:4': { time: 8, notes: 'Professional results' }
 },
 'delta-400': {
 'rodinal-1:50': { time: 12, notes: 'Gentle agitation' },
 'rodinal-1:25': { time: 7, notes: 'High acutance' },
 'rodinal-1:100': { time: 60, notes: 'Stand development' },
 'd76-stock': { time: 8, notes: 'Standard' },
 'd76-1:1': { time: 11, notes: 'Finer grain' },
 'hc110-b': { time: 6.5, notes: 'Good sharpness' },
 'xtol-stock': { time: 8, notes: 'Fine grain' },
 'xtol-1:1': { time: 10, notes: 'Economical' },
 'ddx-1:4': { time: 9, notes: 'Recommended by Ilford' }
 },
 'pan-f-50': {
 'rodinal-1:50': { time: 8, notes: 'Fine grain' },
 'rodinal-1:25': { time: 4.5, notes: 'High acutance' },
 'rodinal-1:100': { time: 60, notes: 'Stand development' },
 'd76-stock': { time: 5.5, notes: 'Classic look' },
 'd76-1:1': { time: 7.5, notes: 'Finer grain' },
 'hc110-b': { time: 4.5, notes: 'Good sharpness' },
 'xtol-stock': { time: 6, notes: 'Fine grain' },
 'xtol-1:1': { time: 8, notes: 'Economical' },
 'ddx-1:4': { time: 7, notes: 'Professional results' }
 },
 'apx-100': {
 'rodinal-1:50': { time: 9, notes: 'Sharp negatives' },
 'rodinal-1:25': { time: 5, notes: 'High acutance' },
 'rodinal-1:100': { time: 60, notes: 'Stand development' },
 'd76-stock': { time: 6, notes: 'Standard' },
 'd76-1:1': { time: 8, notes: 'Finer grain' },
 'hc110-b': { time: 5, notes: 'Good sharpness' },
 'xtol-stock': { time: 6.5, notes: 'Fine grain' },
 'xtol-1:1': { time: 8.5, notes: 'Economical' },
 'ddx-1:4': { time: 8, notes: 'Professional results' }
 },
 'fomapan-400': {
 'rodinal-1:50': { time: 10, notes: 'Economy option' },
 'rodinal-1:25': { time: 5.5, notes: 'High acutance' },
 'rodinal-1:100': { time: 60, notes: 'Stand development' },
 'd76-stock': { time: 8, notes: 'Standard' },
 'd76-1:1': { time: 11, notes: 'Finer grain' },
 'hc110-b': { time: 6, notes: 'Good sharpness' },
 'xtol-stock': { time: 8, notes: 'Fine grain' },
 'xtol-1:1': { time: 10, notes: 'Economical' },
 'ddx-1:4': { time: 9, notes: 'Professional results' }
 }
 }
 };

 const defaults = {
 volume: 375,
 ratio: 50,
 baseTime: 11,
 temperature: 20,
 pushPull: 0,
 agitationInterval: 60,
 presoak: 1,
 stopbath: 1,
 fix: 5,
 rinse: 10,
 filmStock: 'hp5-400',
 developer: 'rodinal-1:50',
 useCelsius: true
 };

 const STORAGE_KEY = 'filmCalcSettings';

 let audioCtx = null;

 function initAudio() {
 if (audioCtx) return;
 try {
 audioCtx = new (window.AudioContext || window.webkitAudioContext)();
 } catch (e) {
 console.warn('Web Audio API not supported');
 }
 }

 function ensureAudioResumed() {
 if (audioCtx &amp;&amp; audioCtx.state === 'suspended') {
 audioCtx.resume().catch(() =&gt; {});
 }
 }

 function playBeep(frequency, duration, type = 'sine') {
 if (!audioCtx) return;
 ensureAudioResumed();
 try {
 const oscillator = audioCtx.createOscillator();
 const gainNode = audioCtx.createGain();
 oscillator.connect(gainNode);
 gainNode.connect(audioCtx.destination);
 oscillator.frequency.value = frequency;
 oscillator.type = type;
 gainNode.gain.setValueAtTime(0.3, audioCtx.currentTime);
 gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + duration);
 oscillator.start(audioCtx.currentTime);
 oscillator.stop(audioCtx.currentTime + duration);
 } catch (e) {}
 }

 function playAgitationBeep() {
 playBeep(880, 0.1);
 setTimeout(() =&gt; playBeep(880, 0.1), 150);
 }

 function playStepChangeBeep() {
 playBeep(660, 0.15);
 setTimeout(() =&gt; playBeep(880, 0.15), 200);
 setTimeout(() =&gt; playBeep(1100, 0.2), 400);
 }

 function playCompleteBeep() {
 playBeep(1100, 0.2);
 setTimeout(() =&gt; playBeep(880, 0.2), 250);
 setTimeout(() =&gt; playBeep(660, 0.2), 500);
 setTimeout(() =&gt; playBeep(880, 0.3), 750);
 }

 const calculator = {
 elements: {},
 state: { ...defaults },

 init() {
 this.elements = {
 volume: document.getElementById('volume'),
 ratio: document.getElementById('ratio'),
 baseTime: document.getElementById('baseTime'),
 temperature: document.getElementById('temperature'),
 pushPull: document.getElementById('pushPull'),
 tempValue: document.getElementById('tempValue'),
 pushValue: document.getElementById('pushValue'),
 developerAmount: document.getElementById('developerAmount'),
 waterAmount: document.getElementById('waterAmount'),
 adjustedTime: document.getElementById('adjustedTime'),
 developmentStep: document.getElementById('developmentStep'),
 totalTime: document.getElementById('totalTime'),
 filmStock: document.getElementById('filmStock'),
 developer: document.getElementById('developer'),
 presetNote: document.getElementById('presetNote'),
 agitationInterval: document.getElementById('agitationInterval'),
 presoak: document.getElementById('presoak'),
 stopbath: document.getElementById('stopbath'),
 fix: document.getElementById('fix'),
 rinse: document.getElementById('rinse'),
 presoakDisplay: document.getElementById('presoak-display'),
 stopbathDisplay: document.getElementById('stopbath-display'),
 fixDisplay: document.getElementById('fix-display'),
 rinseDisplay: document.getElementById('rinse-display'),
 toggleAdvanced: document.getElementById('toggleAdvanced'),
 advancedSettings: document.getElementById('advancedSettings'),
 unitC: document.getElementById('unitC'),
 unitF: document.getElementById('unitF'),
 copySettings: document.getElementById('copySettings'),
 resetDefaults: document.getElementById('resetDefaults')
 };

 this.loadSettings();
 this.bindEvents();
 this.calculate();
 },

 bindEvents() {
 const debouncedCalculate = debounce(() =&gt; this.calculate(), 150);
 const debouncedSave = debounce(() =&gt; this.saveSettings(), 300);

 ['volume', 'ratio', 'baseTime'].forEach(id =&gt; {
 this.elements[id].addEventListener('input', debouncedCalculate);
 this.elements[id].addEventListener('change', () =&gt; this.calculate());
 });

 ['temperature', 'pushPull'].forEach(id =&gt; {
 this.elements[id].addEventListener('input', () =&gt; {
 this.updateSliderDisplay(id);
 debouncedCalculate();
 });
 });

 ['presoak', 'stopbath', 'fix', 'rinse'].forEach(id =&gt; {
 this.elements[id].addEventListener('input', debouncedCalculate);
 this.elements[id].addEventListener('change', () =&gt; this.calculate());
 });

 this.elements.agitationInterval.addEventListener('change', debouncedSave);
 this.elements.filmStock.addEventListener('change', () =&gt; this.applyPreset());
 this.elements.developer.addEventListener('change', () =&gt; this.applyPreset());

 this.elements.toggleAdvanced.addEventListener('click', () =&gt; {
 this.elements.advancedSettings.classList.toggle('visible');
 this.elements.toggleAdvanced.textContent =
 this.elements.advancedSettings.classList.contains('visible')
 ? 'Hide Step Times'
 : 'Customize Step Times';
 });

 this.elements.unitC.addEventListener('click', () =&gt; this.setTempUnit(true));
 this.elements.unitF.addEventListener('click', () =&gt; this.setTempUnit(false));

 this.elements.copySettings.addEventListener('click', () =&gt; this.copyToClipboard());
 this.elements.resetDefaults.addEventListener('click', () =&gt; this.resetToDefaults());
 },

 updateSliderDisplay(id) {
 if (id === 'temperature') {
 const tempValue = parseFloat(this.elements.temperature.value);
 const tempUnit = this.state.useCelsius ? '°C' : '°F';
 this.elements.tempValue.textContent = `${tempValue}${tempUnit}`;
 } else if (id === 'pushPull') {
 const pushStops = parseInt(this.elements.pushPull.value);
 this.elements.pushValue.textContent = `${pushStops} stops`;
 }
 },

 setTempUnit(useCelsius) {
 this.state.useCelsius = useCelsius;
 this.elements.unitC.classList.toggle('active', useCelsius);
 this.elements.unitF.classList.toggle('active', !useCelsius);

 const slider = this.elements.temperature;
 const currentCelsius = useCelsius
 ? parseFloat(slider.value)
 : (parseFloat(slider.value) - 32) * 5 / 9;

 if (useCelsius) {
 slider.min = 18;
 slider.max = 24;
 slider.step = 0.5;
 slider.value = currentCelsius;
 } else {
 slider.min = 64;
 slider.max = 75;
 slider.step = 1;
 slider.value = currentCelsius * 9 / 5 + 32;
 }

 this.calculate();
 this.saveSettings();
 },

 applyPreset() {
 const film = this.elements.filmStock.value;
 const dev = this.elements.developer.value;

 if (film === 'custom' || dev === 'custom') {
 this.elements.presetNote.textContent = '';
 return;
 }

 const devInfo = presets.developers[dev];
 if (devInfo &amp;&amp; devInfo.ratio &gt; 0) {
 this.elements.ratio.value = devInfo.ratio;
 }

 const timeData = presets.times[film]?.[dev];
 if (timeData) {
 this.elements.baseTime.value = timeData.time;
 this.elements.presetNote.textContent = timeData.notes;
 } else {
 this.elements.presetNote.textContent = 'No preset data - using manual values';
 }

 this.calculate();
 },

 formatTime(minutes) {
 const wholeMinutes = Math.floor(minutes);
 const seconds = Math.round((minutes - wholeMinutes) * 60);
 return `${wholeMinutes}:${String(seconds).padStart(2, '0')}`;
 },

 calculate() {
 ['volume', 'ratio', 'baseTime', 'presoak', 'stopbath', 'fix', 'rinse'].forEach(id =&gt; {
 clampToInput(this.elements[id]);
 });

 const tempValue = parseFloat(this.elements.temperature.value);
 const tempUnit = this.state.useCelsius ? '°C' : '°F';
 this.elements.tempValue.textContent = `${tempValue}${tempUnit}`;

 const pushStops = parseInt(this.elements.pushPull.value);
 this.elements.pushValue.textContent = `${pushStops} stops`;

 const totalVolume = parseFloat(this.elements.volume.value) || 1;
 const ratio = parseFloat(this.elements.ratio.value) || 1;
 const developerMl = totalVolume / (ratio + 1);
 const waterMl = totalVolume - developerMl;

 let adjustedTime = Math.max(0.5, parseFloat(this.elements.baseTime.value) || 0);

 const tempCelsius = this.state.useCelsius
 ? tempValue
 : (tempValue - 32) * 5 / 9;
 const tempDiff = tempCelsius - 20;
 adjustedTime *= Math.pow(0.9, tempDiff);

 if (pushStops &gt; 0) {
 adjustedTime *= Math.pow(1.5, pushStops);
 } else if (pushStops &lt; 0) {
 adjustedTime *= Math.pow(0.7, Math.abs(pushStops));
 }

 this.elements.developerAmount.textContent = developerMl.toFixed(1);
 this.elements.waterAmount.textContent = waterMl.toFixed(1);
 this.elements.adjustedTime.textContent = adjustedTime.toFixed(1);
 this.elements.developmentStep.textContent = this.formatTime(adjustedTime);

 const presoak = Math.max(0, parseFloat(this.elements.presoak.value) || 0);
 const stopbath = Math.max(0, parseFloat(this.elements.stopbath.value) || 0);
 const fix = Math.max(0, parseFloat(this.elements.fix.value) || 0);
 const rinse = Math.max(0, parseFloat(this.elements.rinse.value) || 0);

 this.elements.presoakDisplay.textContent = this.formatTime(presoak);
 this.elements.stopbathDisplay.textContent = this.formatTime(stopbath);
 this.elements.fixDisplay.textContent = this.formatTime(fix);
 this.elements.rinseDisplay.textContent = this.formatTime(rinse);

 const totalMinutes = presoak + adjustedTime + stopbath + fix + rinse;
 this.elements.totalTime.textContent = this.formatTime(totalMinutes);

 this.saveSettings();

 if (typeof timer !== 'undefined' &amp;&amp; timer.updateProgressBarOnChange) {
 timer.updateProgressBarOnChange();
 }
 },

 loadSettings() {
 try {
 const saved = localStorage.getItem(STORAGE_KEY);
 if (saved) {
 const settings = JSON.parse(saved);
 Object.assign(this.state, settings);

 this.elements.volume.value = settings.volume ?? defaults.volume;
 this.elements.ratio.value = settings.ratio ?? defaults.ratio;
 this.elements.baseTime.value = settings.baseTime ?? defaults.baseTime;
 this.elements.pushPull.value = settings.pushPull ?? defaults.pushPull;
 this.elements.agitationInterval.value = settings.agitationInterval ?? defaults.agitationInterval;
 this.elements.presoak.value = settings.presoak ?? defaults.presoak;
 this.elements.stopbath.value = settings.stopbath ?? defaults.stopbath;
 this.elements.fix.value = settings.fix ?? defaults.fix;
 this.elements.rinse.value = settings.rinse ?? defaults.rinse;
 this.elements.filmStock.value = settings.filmStock ?? defaults.filmStock;
 this.elements.developer.value = settings.developer ?? defaults.developer;

 const useCelsius = settings.useCelsius ?? defaults.useCelsius;
 this.state.useCelsius = useCelsius;
 this.elements.unitC.classList.toggle('active', useCelsius);
 this.elements.unitF.classList.toggle('active', !useCelsius);

 if (useCelsius) {
 this.elements.temperature.min = 18;
 this.elements.temperature.max = 24;
 this.elements.temperature.step = 0.5;
 this.elements.temperature.value = settings.temperature ?? defaults.temperature;
 } else {
 this.elements.temperature.min = 64;
 this.elements.temperature.max = 75;
 this.elements.temperature.step = 1;
 this.elements.temperature.value = settings.temperature ?? 68;
 }
 }
 } catch (e) {}
 },

 saveSettings() {
 try {
 const settings = {
 volume: parseFloat(this.elements.volume.value),
 ratio: parseFloat(this.elements.ratio.value),
 baseTime: parseFloat(this.elements.baseTime.value),
 temperature: parseFloat(this.elements.temperature.value),
 pushPull: parseInt(this.elements.pushPull.value),
 agitationInterval: parseInt(this.elements.agitationInterval.value),
 presoak: parseFloat(this.elements.presoak.value),
 stopbath: parseFloat(this.elements.stopbath.value),
 fix: parseFloat(this.elements.fix.value),
 rinse: parseFloat(this.elements.rinse.value),
 filmStock: this.elements.filmStock.value,
 developer: this.elements.developer.value,
 useCelsius: this.state.useCelsius
 };
 localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
 } catch (e) {}
 },

 resetToDefaults() {
 try {
 localStorage.removeItem(STORAGE_KEY);
 } catch (e) {}

 this.state = { ...defaults };
 this.elements.volume.value = defaults.volume;
 this.elements.ratio.value = defaults.ratio;
 this.elements.baseTime.value = defaults.baseTime;
 this.elements.temperature.min = 18;
 this.elements.temperature.max = 24;
 this.elements.temperature.step = 0.5;
 this.elements.temperature.value = defaults.temperature;
 this.elements.pushPull.value = defaults.pushPull;
 this.elements.agitationInterval.value = defaults.agitationInterval;
 this.elements.presoak.value = defaults.presoak;
 this.elements.stopbath.value = defaults.stopbath;
 this.elements.fix.value = defaults.fix;
 this.elements.rinse.value = defaults.rinse;
 this.elements.filmStock.value = defaults.filmStock;
 this.elements.developer.value = defaults.developer;
 this.elements.unitC.classList.add('active');
 this.elements.unitF.classList.remove('active');
 this.elements.presetNote.textContent = '';

 this.calculate();
 },

 copyToClipboard() {
 const film = this.elements.filmStock.selectedOptions[0]?.text || 'Custom';
 const dev = this.elements.developer.selectedOptions[0]?.text || 'Custom';
 const tempUnit = this.state.useCelsius ? '°C' : '°F';

 const text = `Film Development Settings
========================
Film: ${film}
Developer: ${dev}
Tank Volume: ${this.elements.volume.value}ml
Dilution: 1:${this.elements.ratio.value}
Developer: ${this.elements.developerAmount.textContent}ml
Water: ${this.elements.waterAmount.textContent}ml
Temperature: ${this.elements.temperature.value}${tempUnit}
Push/Pull: ${this.elements.pushPull.value} stops
Adjusted Dev Time: ${this.elements.adjustedTime.textContent} min

Process Times
-------------
Pre-soak: ${this.elements.presoak.value} min
Development: ${this.elements.adjustedTime.textContent} min
Stop Bath: ${this.elements.stopbath.value} min
Fix: ${this.elements.fix.value} min
Rinse: ${this.elements.rinse.value} min
Total: ${this.elements.totalTime.textContent}`;

 navigator.clipboard.writeText(text).then(() =&gt; {
 const btn = this.elements.copySettings;
 const original = btn.textContent;
 btn.textContent = 'Copied!';
 setTimeout(() =&gt; btn.textContent = original, 1500);
 }).catch(() =&gt; {});
 },

 getAdjustedTime() {
 return parseFloat(this.elements.adjustedTime.textContent) || 11;
 },

 getStepTimes() {
 return {
 presoak: parseFloat(this.elements.presoak.value) || 0,
 stopbath: parseFloat(this.elements.stopbath.value) || 0,
 fix: parseFloat(this.elements.fix.value) || 0,
 rinse: parseFloat(this.elements.rinse.value) || 0
 };
 },

 getAgitationInterval() {
 return parseInt(this.elements.agitationInterval.value) || 0;
 }
 };

 const timer = {
 steps: [],
 currentStepIndex: -1,
 isRunning: false,
 stepStartTime: 0,
 stepDuration: 0,
 pausedTimeLeft: 0,
 animationFrame: null,
 lastAgitationTime: 0,
 totalDuration: 0,
 elapsedBeforeCurrentStep: 0,
 agitationTimeout: null,

 elements: {},

 init() {
 this.elements = {
 startButton: document.getElementById('startTimer'),
 skipButton: document.getElementById('skipStep'),
 resetButton: document.getElementById('resetTimer'),
 display: document.getElementById('timerDisplay'),
 stepDisplay: document.getElementById('currentStep'),
 progressFill: document.getElementById('progressFill'),
 progressSegments: document.getElementById('progressSegments'),
 agitationAlert: document.getElementById('agitationAlert')
 };

 this.elements.startButton.addEventListener('click', () =&gt; {
 initAudio();
 this.toggleTimer();
 });
 this.elements.skipButton.addEventListener('click', () =&gt; this.skipToNext());
 this.elements.resetButton.addEventListener('click', () =&gt; this.reset());

 this.buildProgressBar();
 this.updateDisplay();
 },

 buildSteps() {
 const devTime = calculator.getAdjustedTime();
 const stepTimes = calculator.getStepTimes();

 this.steps = [];
 this.totalDuration = 0;

 const addStep = (name, shortName, minutes, hasAgitation = false) =&gt; {
 if (minutes &gt; 0) {
 const duration = minutes * 60;
 this.steps.push({ name, shortName, duration, hasAgitation });
 this.totalDuration += duration;
 }
 };

 addStep('Pre-soak', 'Soak', stepTimes.presoak);
 addStep('Development', 'Dev', devTime, true);
 addStep('Stop Bath', 'Stop', stepTimes.stopbath);
 addStep('Fix', 'Fix', stepTimes.fix);
 addStep('Rinse', 'Rinse', stepTimes.rinse);
 },

 buildProgressBar() {
 this.buildSteps();

 if (!this.elements.progressSegments) return;
 this.elements.progressSegments.innerHTML = '';

 if (this.totalDuration === 0) return;

 if (this.elements.progressFill) {
 this.elements.progressFill.style.width = '100%';
 }

 for (let i = this.steps.length - 1; i &gt;= 0; i--) {
 const step = this.steps[i];
 const segment = document.createElement('div');
 segment.className = 'timer-progress-segment';
 const widthPercent = (step.duration / this.totalDuration) * 100;
 segment.style.width = widthPercent + '%';
 segment.dataset.index = i;
 segment.textContent = step.shortName;
 this.elements.progressSegments.appendChild(segment);
 }
 },

 toggleTimer() {
 if (!this.isRunning) {
 if (this.currentStepIndex === -1) {
 this.buildProgressBar();
 if (this.steps.length === 0) return;
 this.currentStepIndex = 0;
 this.stepDuration = this.steps[0].duration;
 this.pausedTimeLeft = this.stepDuration;
 this.lastAgitationTime = 0;
 this.elapsedBeforeCurrentStep = 0;
 }

 this.stepStartTime = performance.now();
 this.elements.startButton.textContent = 'Pause';
 this.elements.skipButton.disabled = false;
 this.elements.resetButton.disabled = false;
 this.isRunning = true;
 this.tick();
 } else {
 this.pausedTimeLeft = this.getTimeLeft();
 this.elements.startButton.textContent = 'Resume';
 this.isRunning = false;
 if (this.animationFrame) {
 cancelAnimationFrame(this.animationFrame);
 this.animationFrame = null;
 }
 }
 },

 getTimeLeft() {
 if (!this.isRunning) return this.pausedTimeLeft;
 const elapsed = (performance.now() - this.stepStartTime) / 1000;
 return Math.max(0, this.pausedTimeLeft - elapsed);
 },

 tick() {
 if (!this.isRunning) return;

 const timeLeft = this.getTimeLeft();
 const currentStep = this.steps[this.currentStepIndex];

 if (currentStep.hasAgitation) {
 const interval = calculator.getAgitationInterval();
 if (interval &gt; 0) {
 const elapsed = this.stepDuration - timeLeft;
 const agitationCount = Math.floor(elapsed / interval);
 if (agitationCount &gt; this.lastAgitationTime &amp;&amp; elapsed &gt; 0) {
 this.lastAgitationTime = agitationCount;
 this.showAgitationAlert();
 playAgitationBeep();
 }
 }
 }

 if (timeLeft &lt;= 0) {
 this.skipToNext();
 return;
 }

 this.updateDisplay();
 this.animationFrame = requestAnimationFrame(() =&gt; this.tick());
 },

 showAgitationAlert() {
 if (this.agitationTimeout) clearTimeout(this.agitationTimeout);
 this.elements.agitationAlert.textContent = 'AGITATE!';
 this.agitationTimeout = setTimeout(() =&gt; {
 this.elements.agitationAlert.textContent = '';
 this.agitationTimeout = null;
 }, 2000);
 },

 skipToNext() {
 this.elapsedBeforeCurrentStep += this.steps[this.currentStepIndex].duration;
 this.currentStepIndex++;

 if (this.currentStepIndex &gt;= this.steps.length) {
 playCompleteBeep();
 this.flashDisplay();
 this.reset();
 this.elements.stepDisplay.textContent = 'Complete!';
 return;
 }

 playStepChangeBeep();
 this.flashDisplay();

 const nextStep = this.steps[this.currentStepIndex];
 this.stepDuration = nextStep.duration;
 this.pausedTimeLeft = this.stepDuration;
 this.stepStartTime = performance.now();
 this.lastAgitationTime = 0;

 this.updateDisplay();

 if (this.isRunning) {
 this.animationFrame = requestAnimationFrame(() =&gt; this.tick());
 }
 },

 flashDisplay() {
 this.elements.display.classList.add('flash');
 setTimeout(() =&gt; {
 this.elements.display.classList.remove('flash');
 }, 300);
 },

 reset() {
 if (this.animationFrame) {
 cancelAnimationFrame(this.animationFrame);
 this.animationFrame = null;
 }
 if (this.agitationTimeout) {
 clearTimeout(this.agitationTimeout);
 this.agitationTimeout = null;
 }
 this.currentStepIndex = -1;
 this.pausedTimeLeft = 0;
 this.stepDuration = 0;
 this.isRunning = false;
 this.lastAgitationTime = 0;
 this.elapsedBeforeCurrentStep = 0;
 this.elements.startButton.textContent = 'Start';
 this.elements.skipButton.disabled = true;
 this.elements.resetButton.disabled = true;
 this.elements.agitationAlert.textContent = '';
 this.updateDisplay();
 },

 updateDisplay() {
 const timeLeft = this.getTimeLeft();
 const minutes = Math.floor(timeLeft / 60);
 const seconds = Math.floor(timeLeft % 60);
 this.elements.display.textContent = `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;

 const segments = this.elements.progressSegments ? this.elements.progressSegments.children : [];

 if (this.currentStepIndex === -1) {
 this.elements.stepDisplay.textContent = 'Not started';
 if (this.elements.progressFill) {
 this.elements.progressFill.style.width = '100%';
 }
 for (let i = 0; i &lt; segments.length; i++) {
 segments[i].classList.remove('active', 'completed');
 }
 } else {
 this.elements.stepDisplay.textContent = this.steps[this.currentStepIndex].name;

 const stepElapsed = this.stepDuration - timeLeft;
 const totalElapsed = this.elapsedBeforeCurrentStep + stepElapsed;
 const remainingPercent = this.totalDuration &gt; 0
 ? ((this.totalDuration - totalElapsed) / this.totalDuration) * 100
 : 0;

 if (this.elements.progressFill) {
 this.elements.progressFill.style.width = Math.min(100, Math.max(0, remainingPercent)) + '%';
 }

 for (let i = 0; i &lt; segments.length; i++) {
 const stepIndex = parseInt(segments[i].dataset.index, 10);
 if (stepIndex &lt; this.currentStepIndex) {
 segments[i].classList.add('completed');
 segments[i].classList.remove('active');
 } else if (stepIndex === this.currentStepIndex) {
 segments[i].classList.add('active');
 segments[i].classList.remove('completed');
 } else {
 segments[i].classList.remove('active', 'completed');
 }
 }
 }
 },

 updateProgressBarOnChange() {
 if (this.currentStepIndex === -1) {
 this.buildProgressBar();
 }
 }
 };

 if (document.readyState === 'loading') {
 document.addEventListener('DOMContentLoaded', () =&gt; {
 calculator.init();
 timer.init();
 });
 } else {
 calculator.init();
 timer.init();
 }
})();
&lt;/script&gt;

&lt;hr&gt;
&lt;details class="custom-details"&gt;
&lt;summary&gt;Working Chemical Dilutions &amp; Stock Life&lt;/summary&gt;
&lt;div class="details-content"&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;Developer&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Working Dilution&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Stock Life&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;D-76&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:1&lt;/td&gt;
 &lt;td style="text-align: left"&gt;6 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Life improves in full bottles&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;HC-110&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Dilution B (1:31)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;2+ years&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Syrupy concentrate very stable&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Dilution E (1:47)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;2+ years&lt;/td&gt;
 &lt;td style="text-align: left"&gt;For lower contrast&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Dilution H (1:63)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;2+ years&lt;/td&gt;
 &lt;td style="text-align: left"&gt;For stand development&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;XTOL&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Stock&lt;/td&gt;
 &lt;td style="text-align: left"&gt;2-3 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Sudden death - test before critical use&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:1&lt;/td&gt;
 &lt;td style="text-align: left"&gt;2-3 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;More economical&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Rodinal&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:25&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Decades&lt;/td&gt;
 &lt;td style="text-align: left"&gt;High acutance, pronounced grain&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:50&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Decades&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Standard development&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;DD-X&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:4&lt;/td&gt;
 &lt;td style="text-align: left"&gt;6 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Professional choice, fine grain&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Microphen&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Stock&lt;/td&gt;
 &lt;td style="text-align: left"&gt;6 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Best for push processing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:1&lt;/td&gt;
 &lt;td style="text-align: left"&gt;6 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Normal development&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Pyrocat-HD&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:1:100&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1 year (A), 6 months (B)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Excellent for alternative processes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;ID-11&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Stock&lt;/td&gt;
 &lt;td style="text-align: left"&gt;6 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Similar to D-76&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:1&lt;/td&gt;
 &lt;td style="text-align: left"&gt;6 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Economy option&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Perceptol&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Stock&lt;/td&gt;
 &lt;td style="text-align: left"&gt;4 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Ultra-fine grain&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;1:1&lt;/td&gt;
 &lt;td style="text-align: left"&gt;4 months&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Extended development&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>School is not Enough</title><link>https://lagomor.ph/indieweb/20241028/2024-10-28/</link><pubDate>Mon, 28 Oct 2024 12:59:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20241028/2024-10-28/</guid><description/></item><item><title>An AI Horror Story</title><link>https://lagomor.ph/2024/10/an-ai-horror-story/</link><pubDate>Wed, 23 Oct 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2024/10/an-ai-horror-story/</guid><description>&lt;p&gt;So I&amp;rsquo;m reading the &lt;a href="https://www.reddit.com/r/teachers/" rel="noopener noreferrer" target="_blank"&gt;teachers subreddit&lt;/a&gt; for my daily dose of misery and sense of doom about the future when I come across an unusually worded comment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As an educator, I&amp;rsquo;ve got to agree - while crystals and essential oils can be lovely, they won&amp;rsquo;t replace a solid IEP or therapy. Let&amp;rsquo;s save the throwing for the baseball field, not the classroom!&lt;/p&gt;
&lt;p&gt;~ /u/mohsinali- (343 Karma pre Suspension)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This comment reeked of ChatGPT. This is exactly the way an un-tuned AI writes, so I follow the rabbit hole downward to see what this is all about.&lt;/p&gt;</description></item><item><title>(Almost) Everything You Need to Run a Blog</title><link>https://lagomor.ph/2024/10/almost-everything-you-need-to-run-a-blog/</link><pubDate>Mon, 21 Oct 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2024/10/almost-everything-you-need-to-run-a-blog/</guid><description>&lt;p&gt;We&amp;rsquo;re living in the cyber dark ages. The primary &lt;a href="https://en.wikipedia.org/wiki/List_of_most-visited_websites" rel="noopener noreferrer" target="_blank"&gt;way most people interact with the internet&lt;/a&gt; is through social media. This is the default space people not only listen to others, but also try to make their voices heard - which is sad, because social media isn&amp;rsquo;t very good for that.&lt;/p&gt;
&lt;p&gt;It is liberating to have complete control of your own cyberspace. I&amp;rsquo;ve been running &lt;a href="https://lagomor.ph" rel="noopener noreferrer" target="_blank"&gt;lagomor.ph&lt;/a&gt;, or some derivative of it, for almost ten years, and it&amp;rsquo;s been an incredibly fulfilling project - Without it, I would have missed out on countless opportunities to express myself and interact with interesting people - the number of friends I have made on account of this blog are countless.&lt;/p&gt;</description></item><item><title>Ricotta Cheese is a PsyOp</title><link>https://lagomor.ph/2024/08/ricotta-cheese-is-a-psyop/</link><pubDate>Wed, 07 Aug 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2024/08/ricotta-cheese-is-a-psyop/</guid><description>&lt;p&gt;I categorically refuse to believe anybody actually enjoys ricotta cheese. For those unfamiliar, this Italian cheese comes out of a mistaken way to boil milk in the Bronze age, and for some reason hundreds of years later, it&amp;rsquo;s still an ingredient people try to eat.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s tasteless, so all you really have to go off of is its texture, which is chewy, grainy, and offputting - it has the same consistency of curdled milk (because it is), except unlike curdled milk we&amp;rsquo;ve somehow been convinced we&amp;rsquo;re supposed to eat it.&lt;/p&gt;</description></item><item><title>Timewaste Tracker for Reddit &amp; Youtube</title><link>https://lagomor.ph/projects/waste-timer/</link><pubDate>Wed, 07 Aug 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/projects/waste-timer/</guid><description>&lt;p&gt;It is incredibly easy to waste time. It is particularly sinister that certain corporations are dedicated to distracting me and wasting my time, when it is in fact a limited resource.&lt;/p&gt;
&lt;p&gt;I do not need to be spending on Reddit or Youtube, being sucked down random rabbit holes of wholy useless information.&lt;/p&gt;
&lt;p&gt;However, blocking them outright is not effective, as often useful information is gated on Reddit, so I&amp;rsquo;ll disable my blocker then get distracted.&lt;/p&gt;</description></item><item><title>Abbreviations 7x7</title><link>https://lagomor.ph/puzzle/07-10/</link><pubDate>Wed, 10 Jul 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/puzzle/07-10/</guid><description>&lt;iframe style="height: 90vh; width: 100%; border: none;" src="https://crosshare.org/embed/6zCfUn835V62PIH1mf7E/17p0WKPdfFO1ZQWNIwtHAzHWdus1" allowfullscreen title="Crossword puzzle" loading="lazy"&gt;&lt;/iframe&gt;
&lt;p&gt;🧩 Download the &lt;a href="https://crosshare.org/api/puz/u6zCfUn835V62PIH1mf7E" rel="noopener noreferrer" target="_blank"&gt;.puz file&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🖨️ Download the &lt;a href="https://crosshare.org/api/pdf/6zCfUn835V62PIH1mf7E" rel="noopener noreferrer" target="_blank"&gt;printable&lt;/a&gt;&lt;/p&gt;</description></item><item><title>They Don't Make It like They Used To</title><link>https://lagomor.ph/2024/07/they-dont-make-it-like-they-used-to/</link><pubDate>Wed, 10 Jul 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2024/07/they-dont-make-it-like-they-used-to/</guid><description>&lt;p&gt;Nostalgia for the past has supplanted our yearnings for the future, becoming the default marketing tool for corporations. Instead of asking &amp;lsquo;what&amp;rsquo;s new?&amp;rsquo;, they ask &amp;lsquo;what have we done before that you liked?&amp;rsquo;. This trend transcends marketing tactics, reflecting a destabilizing era of remakes and reboots. Crucially, nostalgia is a finite resource, and its exhaustion bears unknown consequences.&lt;/p&gt;
&lt;p&gt;Jean Baudrillard&amp;rsquo;s notions of simulacra and simulation offer a valuable framework for understanding this phenomenon. In the post-postmodern era, the line between reality and representation has blurred into hyperreality, where simulations precede and replace the real.&lt;/p&gt;</description></item><item><title>May Chaos Take The World</title><link>https://lagomor.ph/indieweb/20240611/2024-06-11/</link><pubDate>Tue, 11 Jun 2024 09:11:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20240611/2024-06-11/</guid><description/></item><item><title>The Incredible Power of Oil &amp; Steel</title><link>https://lagomor.ph/2024/05/the-incredible-power-of-oil-steel/</link><pubDate>Tue, 07 May 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2024/05/the-incredible-power-of-oil-steel/</guid><description>&lt;p&gt;There is Teflon in your bloodstream.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Dupont knew about the toxicity of their chemicals since as far back as 1976, and to this day fight responsibility for their part in creating a ubiqitous chemical that does not naturally deteriorate. &lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The chemicals used in the production of Teflon (PFOAs and PFOs) were finally deemed toxic enough that DuPont, and the 13 other producers of it, don&amp;rsquo;t make it anymore - and have replaced it with New Teflon, and new chemicals. They claim these new chemicals are safe, despite the larger scientific body calling this into question&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;. To quote these scientists directly:&lt;/p&gt;</description></item><item><title>Three Dimensions - An Analysis</title><link>https://lagomor.ph/2024/04/three-dimensions-an-analysis/</link><pubDate>Thu, 18 Apr 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2024/04/three-dimensions-an-analysis/</guid><description>&lt;p&gt;Marman &amp;amp; Borins &amp;ldquo;Three Dimensions&amp;rdquo; was a tri-installation pop-minimalist art exhibition open at &lt;a href="https://www.contemporarycalgary.com/" rel="noopener noreferrer" target="_blank"&gt;Contemporary Calgary&lt;/a&gt; until March 17th, 2024, composed of three mini installations: Balancing Act, THX2020, and ABCD.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We wanted the viewer to walk away with ideas that we didn&amp;rsquo;t even think of when creating the work
Jennifer Marman&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All three installations were interesting, but &amp;ldquo;Balancing Act&amp;rdquo;, the first of the three, was most striking to me, and I would like to walk you through my own interpretation of it, filtered through the lens of my own biases and thought process.&lt;/p&gt;</description></item><item><title>Changing Grocery Shopping Habits</title><link>https://lagomor.ph/2024/03/changing-grocery-shopping-habits/</link><pubDate>Tue, 26 Mar 2024 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2024/03/changing-grocery-shopping-habits/</guid><description>&lt;p&gt;It is easy to forget how recent the phenomenon of the modern grocery store actually is - it only dates back to 1916, when the first &lt;a href="https://en.wikipedia.org/wiki/Piggly_Wiggly" rel="noopener noreferrer" target="_blank"&gt;Piggly Wiggly&lt;/a&gt; was opened in Memphis, Tennessee. Before that, grocers operated as &amp;ldquo;over the counter&amp;rdquo;, as in you would walk up to the counter at the front of the store, and ask the clerk to retrieve whatever quantity of items you actually needed, instead of wander around the store with a basket and select what you wanted from the shelves.&lt;/p&gt;</description></item><item><title>Samsara</title><link>https://lagomor.ph/indieweb/20240314/2024-03-14/</link><pubDate>Thu, 14 Mar 2024 12:52:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20240314/2024-03-14/</guid><description/></item><item><title>Skiff - Or: Why Venture Capital is Bad for You</title><link>https://lagomor.ph/2024/02/skiff-or-why-venture-capital-is-bad-for-you/</link><pubDate>Mon, 12 Feb 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2024/02/skiff-or-why-venture-capital-is-bad-for-you/</guid><description>&lt;aside class="aside-note" style="border-left-color: #c9a832;"&gt;
 &lt;svg class="feather" aria-hidden="true" width="18" height="18" fill="none" stroke="#c9a832" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="position: relative; top: 3px; margin-right: 4px;"&gt;&lt;use href="./css/feather-sprite.svg#alert-triangle"/&gt;&lt;/svg&gt;Warning: This Diatribe was written in anger, but contains grains of truth
&lt;/aside&gt;

&lt;p&gt;Around a year ago, I decided to shutdown my self-hosted email service after running it for about ten years. My choice in doing such was simply cost related - for the scale of email I was processing, it was not viable to run my own servers to do as such, accounting for time in maintenance and ensuring deliverability. At the time, Skiff mail had been around for around two years, and offered an extremely price competive option for far less than I would be able to setup myself, with more features then I was able to offer, so I made the (incredibly infrastructurly challenging) choice of migrating my mail services over to Skiff.&lt;/p&gt;</description></item><item><title>Using Tailscale in builds.sr.ht</title><link>https://lagomor.ph/indieweb/20240205/1209-note/</link><pubDate>Mon, 05 Feb 2024 12:09:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20240205/1209-note/</guid><description>&lt;p&gt;Using Tailscale inside your builds on sr.ht are a little trickier then you might expect, since it&amp;rsquo;s done in a way thats counter to how Tailscale outlines the process of using it in CI &lt;a href="https://tailscale.com/kb/1287/tailscale-gitlab-runner" rel="noopener noreferrer" target="_blank"&gt;inside their own docs&lt;/a&gt;. I had to learn this the hard way trying to get my own &lt;code&gt;.builds.yml&lt;/code&gt; configured for this very blog, as the server it&amp;rsquo;s hosted on can only be accessed outside of HTTPS via the tailnet, and am now able to pass this knowledge onto you.&lt;/p&gt;</description></item><item><title>Kentucky Fried Zero - Part Three</title><link>https://lagomor.ph/indieweb/20240124/kentucky-fried-zero-act-3/</link><pubDate>Wed, 24 Jan 2024 14:36:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20240124/kentucky-fried-zero-act-3/</guid><description>&lt;aside class="aside-note" style="border-left-color: #a0a0c9;"&gt;
 &lt;svg class="feather" aria-hidden="true" width="18" height="18" fill="none" stroke="#a0a0c9" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="position: relative; top: 3px; margin-right: 4px;"&gt;&lt;use href="./css/feather-sprite.svg#info"/&gt;&lt;/svg&gt;Published in English 21.04.13 under a &lt;a href="https://creativecommons.org/licenses/by-nc-nd/3.0/de/deed.en" rel="noopener noreferrer" target="_blank"&gt;CC BY-NC-ND 3.0 DE&lt;/a&gt; license on &lt;a href="https://www.superlevel.de/" rel="noopener noreferrer" target="_blank"&gt;superlevel.de&lt;/a&gt;, this article has been republished - without edits - here, for posterity.
&lt;/aside&gt;

&lt;p&gt;&lt;em&gt;This is the third part of our analysis of Kentucky Route Zero.&lt;/em&gt;
&lt;em&gt;Original by Magnus Hildebrandt, translation by Josefiene Pertosa&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lateness, delayed projects and the kind of Faustian bargains one strikes in order to not have to give up. Just as we did in the previous parts, we will once again delve deep into the background of and inspiration for &lt;a href="https://cardboardcomputer.com/" rel="noopener noreferrer" target="_blank"&gt;Cardboard Computer’s&lt;/a&gt; surrealistic adventure. This time it’s about mathematics, romantic poetry, Olivia Newton-John and why Heaven on Earth is almost always destined to fail. Before we go on, here is your obligatory spoiler warning. First spoiler: Olivia Newton-John will not make an appearance.&lt;/p&gt;</description></item><item><title>Kentucky Fried Zero - Part Two</title><link>https://lagomor.ph/indieweb/20240124/kentucky-fried-zero-act-2/</link><pubDate>Wed, 24 Jan 2024 14:36:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20240124/kentucky-fried-zero-act-2/</guid><description>&lt;aside class="aside-note" style="border-left-color: #a0a0c9;"&gt;
 &lt;svg class="feather" aria-hidden="true" width="18" height="18" fill="none" stroke="#a0a0c9" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="position: relative; top: 3px; margin-right: 4px;"&gt;&lt;use href="./css/feather-sprite.svg#info"/&gt;&lt;/svg&gt;Published in English 21.04.13 under a &lt;a href="https://creativecommons.org/licenses/by-nc-nd/3.0/de/deed.en" rel="noopener noreferrer" target="_blank"&gt;CC BY-NC-ND 3.0 DE&lt;/a&gt; license on &lt;a href="https://www.superlevel.de/" rel="noopener noreferrer" target="_blank"&gt;superlevel.de&lt;/a&gt;, this article has been republished - without edits - here, for posterity.
&lt;/aside&gt;

&lt;p&gt;&lt;em&gt;This is the second part of an Analysis of Kentucky Route Zero&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Original by Magnus Hildebrandt, translation by Dennis Kogel&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Welcome back, welcome back, I hope you thoroughly enjoyed the short break, had some lively small talk and tried some of our criminally overprized canapés. But break’s over, so please head back to your seats, because the second act of &lt;a href="http://kentuckyroutezero.com/" rel="noopener noreferrer" target="_blank"&gt;Kentucky Route Zero&lt;/a&gt; is about to start.&lt;/p&gt;</description></item><item><title>Is the internet dead? Are we?</title><link>https://lagomor.ph/indieweb/20240122/2024-01-24/</link><pubDate>Mon, 22 Jan 2024 18:46:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20240122/2024-01-24/</guid><description/></item><item><title>Daily Carry 2024</title><link>https://lagomor.ph/2024/01/daily-carry-2024/</link><pubDate>Mon, 22 Jan 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2024/01/daily-carry-2024/</guid><description>&lt;p&gt;I maintain a living document called my &lt;a href="./things"&gt;things list&lt;/a&gt;, where I track all the different tools and such that I use in my daily life. I try to update this when I remember to, throughout the year, but I also thought it might be interesting to track how my daily carry changes over time. So, here is what I usually have in my pockets as of the start of 2024.&lt;/p&gt;
&lt;img src="https://images.lagomor.ph/2024/EDC2024.jpg" width=75%&gt;
&lt;h1 id="what-i-wear"&gt;What I Wear&lt;/h1&gt;
&lt;p&gt;I am supposed to wear glasses when reading or at the computer, but I often forget to do so.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; These glasses are &lt;a href="https://www.olliequinn.ca/products/arlo" rel="noopener noreferrer" target="_blank"&gt;Ollie Quinn Arlo&amp;rsquo;s&lt;/a&gt;. I also have a sunglasses set from them - the Noramy - which are discontinued.&lt;/p&gt;</description></item><item><title>Christine Emba: Rethinking Sex</title><link>https://lagomor.ph/indieweb/20240118/2024-01-18/</link><pubDate>Thu, 18 Jan 2024 15:32:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20240118/2024-01-18/</guid><description>&lt;p&gt;I have a lot of thoughts about this book but I&amp;rsquo;ll try to keep this brief.&lt;/p&gt;
&lt;p&gt;To start, this book has a very odd citation format. The author directly cites journalists, blog posts, magazine surveys directly in line, but then deeper resources, ie Academic Studies, Medical Journals, are cited at the back of the book - and not many are cited compared to how many Journalists are. This creates a problem where many times in the book the author will say something along the lines of &amp;ldquo;many studies show&amp;hellip;&amp;rdquo; but not actually directly link to a study.&lt;/p&gt;</description></item><item><title>Make Certbot Certs Readable by Non-Root Users</title><link>https://lagomor.ph/indieweb/20240109/2024-01-09/</link><pubDate>Tue, 09 Jan 2024 18:23:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20240109/2024-01-09/</guid><description/></item><item><title>John Micklethwait: The Company</title><link>https://lagomor.ph/indieweb/20240105/2024-01-05/</link><pubDate>Fri, 05 Jan 2024 15:46:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20240105/2024-01-05/</guid><description>&lt;p&gt;&lt;img src="https://ik.imagekit.io/lagomorph/archive/0105-cover_hIGRggEb6.jpg"
 alt="Cover of the Book &amp;ldquo;The Company&amp;rdquo;"
 loading="lazy"
 decoding="async"&gt;&lt;/p&gt;
&lt;p&gt;While occasionally simplistic and revisionist, The Company is a fascinating foray into the history of human organization, corporate profits, and human society.&lt;/p&gt;
&lt;p&gt;An interesting reminder that things have not always been the way they are, humanity pushes forward through progress and chaos alike, and shows that even in the largest bureaucratic machines in the world, any choice can be traced back to an individual.&lt;/p&gt;</description></item><item><title>Gator On A Bike on Paper</title><link>https://lagomor.ph/indieweb/20240103/2024-01-03/</link><pubDate>Wed, 03 Jan 2024 13:32:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20240103/2024-01-03/</guid><description>&lt;span class="embed video-player"&gt;
 &lt;iframe style="display:block; margin: 0 auto; width: 100%; max-width: 700px; height: 42px; border: none;"
 src="https://bandcamp.com/EmbeddedPlayer/album=1307602548/size=small/bgcol=ffffff/linkcol=7137dc/transparent=true/"
 title="Bandcamp player" loading="lazy"&gt;&lt;/iframe&gt;
&lt;/span&gt;
&lt;p&gt;Musical equivalent of having a tooth pulled out at the dentist and then having to walk a mile home. Love it.&lt;/p&gt;
&lt;p&gt;Favorite track: &lt;a href="https://raredemo.bandcamp.com/track/bring-me-a-berban" rel="noopener noreferrer" target="_blank"&gt;Bring me a berban&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Resolutions 2024</title><link>https://lagomor.ph/2024/01/resolutions-2024/</link><pubDate>Mon, 01 Jan 2024 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2024/01/resolutions-2024/</guid><description>&lt;p&gt;Wow. What a year. There were many challenges and I accomplished little. The irony that it was the year of the rabbit is not lost on me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to thank all my friends and various associates for being a guiding light this year, as it would have been a lot more harrowing to do this one alone.&lt;/p&gt;
&lt;p&gt;Anyways, good riddance - here&amp;rsquo;s an outline of what I intend to accomplish by the end of this year. Resolutions, if you will.&lt;/p&gt;</description></item><item><title>A Quick and Brutal Match</title><link>https://lagomor.ph/indieweb/20231208/1515/</link><pubDate>Fri, 08 Dec 2023 15:15:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20231208/1515/</guid><description>&lt;p&gt;I&amp;rsquo;ve had the ability to post chess games on this blog for a while but have found few games I have really wanted to highlight - this one is one I&amp;rsquo;m proud of.&lt;/p&gt;
&lt;p&gt;Hopefully I&amp;rsquo;ll be willing to start posting &lt;em&gt;losses&lt;/em&gt; I&amp;rsquo;m proud of, too.
&lt;div&gt;
 &lt;iframe
 src="https://lichess.org/embed/game/66diyE9N?theme=newspaper&amp;bg=light#4"
 width="100%"
 height="500"
 style="border: none;"
 title="Chess game on Lichess"
 loading="lazy"
 &gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;</description></item><item><title>Unlocking the Bootloader on the Kyocera 902KC</title><link>https://lagomor.ph/indieweb/20231205/1530-note/</link><pubDate>Tue, 05 Dec 2023 15:30:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20231205/1530-note/</guid><description>&lt;p&gt;There have been &lt;a href="https://www.reddit.com/r/dumbphones/comments/184f2jm/keitai_digno_a203kc_bootloader_unlocked_lets/" rel="noopener noreferrer" target="_blank"&gt;mixed&lt;/a&gt; &lt;a href="https://www.reddit.com/r/dumbphones/comments/179vreg/some_personal_notes_on_configuring_the_kyocera/" rel="noopener noreferrer" target="_blank"&gt;reports&lt;/a&gt; of people managing to unlock the bootloader on the Kyocera 902KC. I&amp;rsquo;ve done some extensive research on unlocking and rooting this phone and I&amp;rsquo;d like to outline all my findings here.&lt;/p&gt;
&lt;p&gt;Being able to unlock the bootloader on the Kyocera 902KC would be a huge boon for usability in North America, as it would mean you could sideload the &lt;a href="https://microg.org/" rel="noopener noreferrer" target="_blank"&gt;microG&lt;/a&gt; services, allowing you to utilize maps properly, as well as any apps that rely on Google Play Services in order to function.&lt;/p&gt;</description></item><item><title>French Republican Calendar Tools</title><link>https://lagomor.ph/projects/repubcalendar/</link><pubDate>Mon, 20 Nov 2023 00:00:00 -0700</pubDate><guid>https://lagomor.ph/projects/repubcalendar/</guid><description>I believe that in all facets of life, anything taken for granted should be examined. For me, this includes how I think about and interface with time. Since beginning research into this topic a few years ago, the French Republican Calendar has continued to fascinate and delight me, so much so to the point that I use decimal time and the republican calendar as my default method of tracking time in my personal life.</description></item><item><title>Catitecture</title><link>https://lagomor.ph/indieweb/20231105/1245-like/</link><pubDate>Sun, 05 Nov 2023 12:46:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20231105/1245-like/</guid><description/></item><item><title>Writing in Typst</title><link>https://lagomor.ph/indieweb/20231019/2151-bookmark/</link><pubDate>Thu, 19 Oct 2023 21:52:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20231019/2151-bookmark/</guid><description/></item><item><title>Digital Minimalism: Kyocera 902KC</title><link>https://lagomor.ph/2023/10/digital-minimalism-kyocera-902kc/</link><pubDate>Tue, 17 Oct 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2023/10/digital-minimalism-kyocera-902kc/</guid><description>&lt;p&gt;In August of this year, I deleted Twitter off of my phone, after what I found to be the &lt;a href="https://www.bbc.com/news/technology-66679922" rel="noopener noreferrer" target="_blank"&gt;final straw&lt;/a&gt; after months of garbage policy changes enforced by the rich egg who now owns the site.&lt;/p&gt;
&lt;p&gt;While I have been using a &lt;a href="https://play.google.com/store/apps/details?id=com.beforesoft.launcher" rel="noopener noreferrer" target="_blank"&gt;minimal smartphone&lt;/a&gt; for years - that is to say, a smartphone with as few apps as I &amp;ldquo;felt possible&amp;rdquo; (more on that later) - what I found after deleting my main digital narcotic was that instead of spending less time on my phone as I expected, I was instead spending just blankly staring at my phone before either reading the news or finding some other way to waste time.&lt;/p&gt;</description></item><item><title>Laundry &amp; The Responsibility of Search Engines</title><link>https://lagomor.ph/2023/10/laundry-the-responsibility-of-search-engines/</link><pubDate>Thu, 12 Oct 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2023/10/laundry-the-responsibility-of-search-engines/</guid><description>&lt;p&gt;I&amp;rsquo;d like to take you on a journey through the world of scams, laundry, and search engines.&lt;/p&gt;
&lt;p&gt;In 2016, Foldimate, a California based startup, showed the world a laundry folding robot - it was the size of a washing machine, with a slot in the top for garments that would be mechanically folded and then passed down into a tidy stack at the bottom.&lt;/p&gt;
&lt;p&gt;I watched Foldimate with great interest, for you see, of all the daily chores of life that one must accomplish, folding laundry is the one I hate the most, put off the longest, and have tried to - mostly failing - hack my way out of for decades. I was (and honestly still am) the primary target market of this, frankly, very silly machine.&lt;/p&gt;</description></item><item><title>New Bump Mural</title><link>https://lagomor.ph/indieweb/20231006/1230-note/</link><pubDate>Fri, 06 Oct 2023 12:30:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20231006/1230-note/</guid><description>&lt;p&gt;Walked down a street in an opposite direction then I normally do and discovered a grand new mural on the opposite wall.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://images.lagomor.ph/archive/mural.JPG"
 alt="A Mural of man made of moss, mushrooms, and flowers"
 loading="lazy"
 decoding="async"&gt;&lt;/p&gt;</description></item><item><title>A Weapon to Surpass Metal Gear</title><link>https://lagomor.ph/indieweb/20231002/1149-bookmark/</link><pubDate>Mon, 02 Oct 2023 11:50:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20231002/1149-bookmark/</guid><description/></item><item><title>The Internet Manifesto</title><link>https://lagomor.ph/indieweb/20230906/2146-bookmark/</link><pubDate>Wed, 06 Sep 2023 21:46:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230906/2146-bookmark/</guid><description/></item><item><title>The Death of the Search Engine</title><link>https://lagomor.ph/2023/08/the-death-of-the-search-engine/</link><pubDate>Tue, 22 Aug 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/2023/08/the-death-of-the-search-engine/</guid><description>&lt;p&gt;In the early days of Google and Yahoo the best hack for getting your website to the top of rankings was &lt;a href="https://en.wikipedia.org/wiki/Keyword_stuffing" rel="noopener noreferrer" target="_blank"&gt;Keyword Stuffing&lt;/a&gt;. You&amp;rsquo;d make the font blend in with the background and jam in as many relevant (or in many cases completely irrelevant, depending on your intent) keywords as you possibly could. Your users couldn&amp;rsquo;t see them, but search engines could, and they&amp;rsquo;d push you up the rankings, since with so many keywords the website in question must be super relevant to what you&amp;rsquo;re looking for.&lt;/p&gt;</description></item><item><title>Quality of Letters to the Editor</title><link>https://lagomor.ph/indieweb/20230801/1020-note/</link><pubDate>Tue, 01 Aug 2023 10:20:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230801/1020-note/</guid><description>&lt;p&gt;I find reading letters to the editor enjoyable. I find a lot of good debate springs up in that column, and on the flip side, I find it hilarious how poor comment sections can get. I wonder if this is due to the greater degree of curation by print editors versus the cacophony of the vox populi. I wonder if this is a problem that could be solved on the internet. Is the barrier for entry too low on a website for quality to remain consistently high?&lt;/p&gt;</description></item><item><title>Webmentions for Deno</title><link>https://lagomor.ph/projects/wm-deno/</link><pubDate>Wed, 26 Jul 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/projects/wm-deno/</guid><description>This is a straightforward webmention sending and endpoint discovery implementation. It has a single external dependency, which is Deno DOM. It uses this library to find the webmention endpoint within a page.</description></item><item><title>Putnam's Phrase Book</title><link>https://lagomor.ph/indieweb/20230707/1808-like/</link><pubDate>Fri, 07 Jul 2023 18:10:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230707/1808-like/</guid><description>&lt;p&gt;&lt;a href="https://www.gutenberg.org/files/48441/48441-h/48441-h.htm" rel="noopener noreferrer" target="_blank"&gt;https://www.gutenberg.org/files/48441/48441-h/48441-h.htm&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Webmention Deno!</title><link>https://lagomor.ph/indieweb/20230706/1535-note/</link><pubDate>Thu, 06 Jul 2023 15:38:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230706/1535-note/</guid><description>&lt;p&gt;Wrote a webmention library for Deno, it was good practice getting it to pass the test suite at webmention.rocks.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://deno.land/x/webmention@v1.1" rel="noopener noreferrer" target="_blank"&gt;https://deno.land/x/webmention@v1.1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The next step is writing out a CLI tool that can completely replace (the now defunct) webmention.app.&lt;/p&gt;</description></item><item><title>Silly Little Jokes</title><link>https://lagomor.ph/indieweb/20230706/1128-like/</link><pubDate>Thu, 06 Jul 2023 11:28:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230706/1128-like/</guid><description/></item><item><title>&lt;noscript&gt;</title><link>https://lagomor.ph/indieweb/20230706/0750-reply/</link><pubDate>Thu, 06 Jul 2023 08:13:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230706/0750-reply/</guid><description>&lt;p&gt;All that Javascript to render this single static image. Embarrassing.&lt;/p&gt;
&lt;img class="u-photo" src="https://images.lagomor.ph/archive/screenshot.png" /&gt;</description></item><item><title>REK Solar Cooking</title><link>https://lagomor.ph/indieweb/20230705/0847-like/</link><pubDate>Wed, 05 Jul 2023 08:48:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230705/0847-like/</guid><description/></item><item><title>The 88x31 GIF Collection</title><link>https://lagomor.ph/indieweb/20230523/1532-bookmark/</link><pubDate>Tue, 23 May 2023 15:32:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230523/1532-bookmark/</guid><description/></item><item><title>An assorted collection of things</title><link>https://lagomor.ph/indieweb/20230516/1507-bookmark/</link><pubDate>Tue, 16 May 2023 15:07:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230516/1507-bookmark/</guid><description/></item><item><title>Quick Crossword #4 (Clickbait)</title><link>https://lagomor.ph/puzzle/05-14/</link><pubDate>Sun, 14 May 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/puzzle/05-14/</guid><description>&lt;p&gt;The trick of puzzle design is not so much coming up with decent clues as it is coming up with a cohesive theme.&lt;/p&gt;
&lt;p&gt;This one&amp;rsquo;s pretty good (in my less than honest opinion) but it took me quite a bit of thought to get it working.&lt;/p&gt;
&lt;p&gt;I keep trying to design full 15x15 American style puzzles but aren&amp;rsquo;t quite able yet.&lt;/p&gt;
&lt;p&gt;Hopefully the clues aren&amp;rsquo;t as necessarily obtuse as my previous ones. Have fun!&lt;/p&gt;</description></item><item><title>evy's ever-changing manifesto</title><link>https://lagomor.ph/indieweb/20230509/0325-bookmark/</link><pubDate>Tue, 09 May 2023 15:26:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230509/0325-bookmark/</guid><description/></item><item><title>Kentucky Fried Zero - Part One</title><link>https://lagomor.ph/indieweb/20230509/kentucky-fried-zero-act-1/</link><pubDate>Tue, 09 May 2023 14:36:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230509/kentucky-fried-zero-act-1/</guid><description>&lt;aside class="aside-note" style="border-left-color: #a0a0c9;"&gt;
 &lt;svg class="feather" aria-hidden="true" width="18" height="18" fill="none" stroke="#a0a0c9" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="position: relative; top: 3px; margin-right: 4px;"&gt;&lt;use href="./css/feather-sprite.svg#info"/&gt;&lt;/svg&gt;Published in English 21.04.13 under a &lt;a href="https://creativecommons.org/licenses/by-nc-nd/3.0/de/deed.en" rel="noopener noreferrer" target="_blank"&gt;CC BY-NC-ND 3.0 DE&lt;/a&gt; license on &lt;a href="https://www.superlevel.de/" rel="noopener noreferrer" target="_blank"&gt;superlevel.de&lt;/a&gt;, this article has been republished - without edits - here, for posterity.
&lt;/aside&gt;

&lt;p&gt;&lt;em&gt;This is the first part of an Analysis of Kentucky Route Zero&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Original by Magnus Hildebrandt, translation by Dennis Kogel&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kentuckyroutezero.com/" rel="noopener noreferrer" target="_blank"&gt;Kentucky Route Zero&lt;/a&gt;, the Kickstarter funded adventure about a delivery driver searching for an unknown address in a surrealist Kentucky, is an exceptional game. It is filled with weird characters, strange sights and haunting symbolism. The free appendix episode &lt;a href="http://kentuckyroutezero.com/limits-and-demonstrations/" rel="noopener noreferrer" target="_blank"&gt;“Limits and Demonstrations”&lt;/a&gt;, a fictional art exhibit with artworks corresponding directly to characters and events in the main storyline, shows that Kentucky Route Zero is even more layered and complex than it may seem at first glance. What is behind all this? Does it just mask missing substance with cryptic references?&lt;/p&gt;</description></item><item><title>the "Baseline" test from Bladerunner 2049</title><link>https://lagomor.ph/indieweb/20230509/05-09/</link><pubDate>Tue, 09 May 2023 10:59:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230509/05-09/</guid><description/></item><item><title>The Alternative Press in Retrospect</title><link>https://lagomor.ph/indieweb/20230502/05-02/</link><pubDate>Tue, 02 May 2023 10:40:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230502/05-02/</guid><description/></item><item><title>Quick Crossword #3 (At the Bar)</title><link>https://lagomor.ph/puzzle/05-01/</link><pubDate>Mon, 01 May 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/puzzle/05-01/</guid><description>&lt;p&gt;British or &amp;ldquo;quick&amp;rdquo; crosswords are significantly easier to construct than American or &amp;ldquo;full&amp;rdquo; ones - I tried orienting this in a 15x15 grid, but reduced it down to the puzzle you see here. This theme is cleverer than previous, but I&amp;rsquo;m concerned some of the clues are two obtuse for this format of crossword.&lt;/p&gt;
&lt;iframe style="height: 90vh; width: 100%; border: none;" src="https://crosshare.org/embed/WDPkdoxRF7N6hPKqv8VJ/17p0WKPdfFO1ZQWNIwtHAzHWdus1" allowfullscreen title="Crossword puzzle" loading="lazy"&gt;&lt;/iframe&gt;
&lt;p&gt;🖨️&lt;a href="https://crosshare.org/api/pdf/WDPkdoxRF7N6hPKqv8VJ" rel="noopener noreferrer" target="_blank"&gt;Download a printable Version&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🧩&lt;a href="./puzzle/05-01/2023-05-01.puz"&gt;Download the .puz file&lt;/a&gt;&lt;/p&gt;</description></item><item><title>The Dark Forest and the Cozy Web</title><link>https://lagomor.ph/indieweb/20230425/922-reply/</link><pubDate>Tue, 25 Apr 2023 09:22:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230425/922-reply/</guid><description>&lt;p&gt;This is very interesting.&lt;/p&gt;
&lt;p&gt;Recently I was discussing the slow decay of Advertising. What I see happening now is that to most people, ads don&amp;rsquo;t &lt;em&gt;work&lt;/em&gt;. They don&amp;rsquo;t contribute anything except noise and annoyance. When you google something like &amp;ldquo;Best Garden Shears&amp;rdquo;, as an example, the list of websites is functionally mulch. It&amp;rsquo;s not useful, it&amp;rsquo;s hyper-seo ad spam linking back to Amazon. People don&amp;rsquo;t trust these google listings, and the alternative is asking a community, or your real life friends, what they prefer in terms of garden shears.&lt;/p&gt;</description></item><item><title>Quick Crossword #2 (Lakeside)</title><link>https://lagomor.ph/puzzle/04-25/</link><pubDate>Tue, 25 Apr 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/puzzle/04-25/</guid><description>&lt;iframe style="height: 90vh; width: 100%; border: none;" src="https://crosshare.org/embed/3YZqXqtVShKGi2XBsehW/17p0WKPdfFO1ZQWNIwtHAzHWdus1" allowfullscreen title="Crossword puzzle" loading="lazy"&gt;&lt;/iframe&gt;
&lt;p&gt;🖨️&lt;a href="https://crosshare.org/api/pdf/3YZqXqtVShKGi2XBsehW" rel="noopener noreferrer" target="_blank"&gt;Download a printable Version&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🧩&lt;a href="./puzzle/04-25/2023-04-25.puz"&gt;Download the .puz file&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Quick Crossword #1 (Corvidae)</title><link>https://lagomor.ph/puzzle/04-16/</link><pubDate>Sun, 16 Apr 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/puzzle/04-16/</guid><description>&lt;p&gt;This is my first attempt at designing my own crossword. I was inspired by some of the puzzles published in the New Yorker recently and thought it would be fun to try and craft my own. I&amp;rsquo;ll be attempting to publish a new puzzle every week, so keep an eye out.&lt;/p&gt;
&lt;iframe style="height: 90vh; width: 100%; border: none;" src="https://crosshare.org/embed/rtNluQbq3IZxsYF1PFxs/17p0WKPdfFO1ZQWNIwtHAzHWdus1" allowfullscreen title="Crossword puzzle" loading="lazy"&gt;&lt;/iframe&gt;
&lt;p&gt;🖨️&lt;a href="./puzzle/04-16/2023-04-16.png"&gt;Download a printable Version&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🧩&lt;a href="./puzzle/04-16/2023-04-16.puz"&gt;Download the .puz file (Beware of Spoilers)&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Super Simple One Time Passwords for Deno</title><link>https://lagomor.ph/projects/sstotp-deno/</link><pubDate>Thu, 30 Mar 2023 00:00:00 -0600</pubDate><guid>https://lagomor.ph/projects/sstotp-deno/</guid><description>&lt;p&gt;SSTOTP is as simple as it gets for a TOTP implementation. The libary can do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate TOTP Secrets&lt;/li&gt;
&lt;li&gt;Generate TOTP Tokens&lt;/li&gt;
&lt;li&gt;Validate TOTP Tokens&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tokens are valid for 30 seconds, and a step tolerance of two is implemented to account for clock skew.&lt;/p&gt;
&lt;p&gt;It has a single standard library dependency, which is &lt;a href="https://deno.land/std@0.181.0/encoding/base32.ts" rel="noopener noreferrer" target="_blank"&gt;base32&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At this time, it is considered feature complete. Generating &lt;a href="https://github.com/google/google-authenticator/wiki/Key-Uri-Format" rel="noopener noreferrer" target="_blank"&gt;otpauth://&lt;/a&gt; QR codes is left as an exercise to the reader.&lt;/p&gt;</description></item><item><title>So you've installed `fzf`. Now what?</title><link>https://lagomor.ph/indieweb/20230321/1214-like/</link><pubDate>Tue, 21 Mar 2023 12:15:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230321/1214-like/</guid><description/></item><item><title>Itty Bitty Site</title><link>https://lagomor.ph/indieweb/20230321/0321-bookmark/</link><pubDate>Tue, 21 Mar 2023 12:07:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230321/0321-bookmark/</guid><description/></item><item><title>Run Your Own Social Network</title><link>https://lagomor.ph/indieweb/20230316/0316-bookmark/</link><pubDate>Thu, 16 Mar 2023 14:40:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230316/0316-bookmark/</guid><description/></item><item><title>Jeremy Maluf's Onebag Travel System</title><link>https://lagomor.ph/indieweb/20230314/0313-bookmark/</link><pubDate>Tue, 14 Mar 2023 09:38:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20230314/0313-bookmark/</guid><description/></item><item><title>Reverse Engineering A Mysterious UDP Stream in My Hotel</title><link>https://lagomor.ph/indieweb/20230223/1941-like/</link><pubDate>Thu, 23 Feb 2023 19:48:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230223/1941-like/</guid><description/></item><item><title>Build a reputation instead of a personal brand</title><link>https://lagomor.ph/indieweb/20230207/1501-like/</link><pubDate>Tue, 07 Feb 2023 15:02:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230207/1501-like/</guid><description/></item><item><title>A Collection of Windows 98 Icons</title><link>https://lagomor.ph/indieweb/20230202/1542-bookmark/</link><pubDate>Thu, 02 Feb 2023 15:44:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230202/1542-bookmark/</guid><description/></item><item><title>Tenuta di Carleone - Chianti Classico</title><link>https://lagomor.ph/indieweb/20230126/1508-note/</link><pubDate>Thu, 26 Jan 2023 15:12:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230126/1508-note/</guid><description>&lt;div class="wine-review"&gt;
 &lt;div class="left"&gt;
 &lt;img
 src="https://i.imgur.com/gcVfcnH.jpg"
 alt="Chianti Classico wine"
 loading="lazy"
 decoding="async"
 /&gt;
 &lt;/div&gt;
 &lt;div class="right"&gt;
 &lt;div class="winery"&gt;&lt;a href="https://duckduckgo.com/?q=Tenuta%20di%20Carleone+winery"&gt;Tenuta di Carleone&lt;/a&gt;&lt;/div&gt;
 &lt;h2 class="wine-header"&gt;
 &lt;a href=https://www.cellartracker.com/wine.asp?iWine&amp;#61;4126669&gt;Chianti Classico&lt;/a&gt; - 2019
 &lt;/h2&gt;
 &lt;div class="wine-region"&gt;
 &lt;span class="country"&gt;🇮🇹 Italy&lt;/span&gt; // &lt;a href="https://duckduckgo.com/?q=Chianti%20Classico+wine+region"&gt;Chianti Classico&lt;/a&gt;
 &lt;/div&gt;
 
 
 &lt;div class="p-rating" value="($num)"&gt;
 
 &lt;svg style="position:relative;top:2px" width="24" height="24" fill="var(--color-primary)"
 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;
 &lt;use href="./css/feather-sprite.svg#star" /&gt;&lt;/svg&gt;
 
 &lt;svg style="position:relative;top:2px" width="24" height="24" fill="var(--color-primary)"
 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;
 &lt;use href="./css/feather-sprite.svg#star" /&gt;&lt;/svg&gt;
 
 &lt;svg style="position:relative;top:2px" width="24" height="24" fill="var(--color-primary)"
 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;
 &lt;use href="./css/feather-sprite.svg#star" /&gt;&lt;/svg&gt;
 
 &lt;svg style="position:relative;top:2px" width="24" height="24" fill="var(--color-primary)"
 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;
 &lt;use href="./css/feather-sprite.svg#star" /&gt;&lt;/svg&gt;
 
 4/5
 &lt;/div&gt;
 
 &lt;div class="review-text"&gt;
 &lt;blockquote&gt;
 &lt;p&gt;
 "Very light nose of bubblegum and black fruit. Good acidity and body, fresh strawberries and old oak."
 &lt;/p&gt;
 &lt;/blockquote&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Felinae's Homepage</title><link>https://lagomor.ph/indieweb/20230125/1542-like/</link><pubDate>Wed, 25 Jan 2023 15:52:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230125/1542-like/</guid><description/></item><item><title>I Miss Twitter</title><link>https://lagomor.ph/indieweb/20230125/1104-like/</link><pubDate>Wed, 25 Jan 2023 11:04:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230125/1104-like/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Glad as I am that the personal website is having a renaissance – you know how much I love personal websites – for me that fulfils a different function from sites like Twitter. This site is my own space on the internet, but it&amp;rsquo;s me shouting into the void in a way that Twitter wasn&amp;rsquo;t.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;localghost&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</description></item><item><title>Where is Mastodon Headed?</title><link>https://lagomor.ph/indieweb/20230124/810-reply/</link><pubDate>Tue, 24 Jan 2023 08:48:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230124/810-reply/</guid><description>&lt;p&gt;The fundamental issue I see repeatedly is that Interoperability (what Mastodon and Fedi truly offers) is a no-brainer for tech-types but completely uninteresting and in some-cases a turn off for laypeople. Creates a huge adoption issue.&lt;/p&gt;
&lt;p&gt;I’ve had conversations with people that go “I don’t care that other people can follow me from other servers - I want all my friends to be on the same server as me. Why would I just want some person to be running my server anyways?”&lt;/p&gt;</description></item><item><title>Fun with Hyperlocal Data</title><link>https://lagomor.ph/2023/01/fun-with-hyperlocal-data/</link><pubDate>Tue, 24 Jan 2023 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2023/01/fun-with-hyperlocal-data/</guid><description>&lt;p&gt;I&amp;rsquo;ve been drawn to the idea of having many tiny sensors around my home intermittently collecting data points about all sorts of things - the Lumen measurement of our bedroom at night, the noise of the street below us, the AQI of our kitchen.&lt;/p&gt;
&lt;p&gt;This was mostly a pipedream until &lt;a href="https://shop.pimoroni.com/" rel="noopener noreferrer" target="_blank"&gt;Pimoroni&lt;/a&gt; came out with a series of wireless monitors with &lt;a href="https://shop.pimoroni.com/search?q=enviro" rel="noopener noreferrer" target="_blank"&gt;all sorts of sensors&lt;/a&gt; that use a Raspberry Pi PICO to send the data to an endpoint of your choosing.&lt;/p&gt;</description></item><item><title>Self Hosted Twitter Archive</title><link>https://lagomor.ph/indieweb/20230116/1123-bookmark/</link><pubDate>Mon, 16 Jan 2023 11:24:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230116/1123-bookmark/</guid><description/></item><item><title>Posy's Cursors</title><link>https://lagomor.ph/indieweb/20230113/1023-bookmark/</link><pubDate>Fri, 13 Jan 2023 10:24:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20230113/1023-bookmark/</guid><description/></item><item><title>Bimonthly? Update - December 15th, 2022</title><link>https://lagomor.ph/2022/12/bimonthly-update-december-15th-2022/</link><pubDate>Thu, 15 Dec 2022 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2022/12/bimonthly-update-december-15th-2022/</guid><description>&lt;p&gt;As with most anything I&amp;rsquo;ve tried to start as a habit, these update posts have become far less then routine. Not to say I haven&amp;rsquo;t done anything worth writing about - I&amp;rsquo;m just incredibly lazy.&lt;/p&gt;
&lt;p&gt;Anyways, here&amp;rsquo;s what&amp;rsquo;s up:&lt;/p&gt;
&lt;h1 id="what-im-working-on"&gt;What I&amp;rsquo;m Working On&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;ve installed a number of &lt;a href="https://shop.pimoroni.com/products/enviro-urban?variant=40056508252243" rel="noopener noreferrer" target="_blank"&gt;Pimoroni Enviro&lt;/a&gt; sensors around the home. It&amp;rsquo;s been great being able to retrieve hyperlocal weather and environment data to do with as I see fit.&lt;/p&gt;</description></item><item><title>Most Played 2022</title><link>https://lagomor.ph/indieweb/20221130/1220-note/</link><pubDate>Wed, 30 Nov 2022 12:20:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20221130/1220-note/</guid><description>&lt;p&gt;I still don&amp;rsquo;t use any streaming services, so here&amp;rsquo;s my yearly list of albums I listened to the most in the past year.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://images.lagomor.ph/archive/chart.png"
 alt="A collage of album covers"
 loading="lazy"
 decoding="async"&gt;&lt;/p&gt;</description></item><item><title>Batman Is Kind of Strange as a Concept</title><link>https://lagomor.ph/2022/11/batman-is-kind-of-strange-as-a-concept/</link><pubDate>Wed, 30 Nov 2022 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2022/11/batman-is-kind-of-strange-as-a-concept/</guid><description>Have you ever really sat down and thought about Batman? I had a surplus of spare time on my hands recently, so I went back and played through Batman: Arkham City. When it originally came out, people consistently told me it was good, but I never got around to playing it because I just never cared about superhero comics or any other type of cape media. It&amp;rsquo;s a middling game - lot&amp;rsquo;s of time wasting minigames - but I&amp;rsquo;m not here to elaborate on the game much further, just use it as a tool to examine how weird Batman is &lt;em&gt;as a character&lt;/em&gt;.</description></item><item><title>Glass Onion: A Knives Out Mystery</title><link>https://lagomor.ph/indieweb/20221127/2246-review/</link><pubDate>Sun, 27 Nov 2022 22:47:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20221127/2246-review/</guid><description>&lt;p&gt;This is a great little whodunit caper, and I thoroughly enjoyed it. If you&amp;rsquo;ve seen the original Knives Out and liked it, you&amp;rsquo;ll probably like this too. If you haven&amp;rsquo;t, think an Agatha Christie novel.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve seen people say it&amp;rsquo;s &amp;ldquo;tighter&amp;rdquo; then the original, but I&amp;rsquo;d have to disagree. I&amp;rsquo;d say they&amp;rsquo;re very comparable in pacing, if anything, the original film is a little more directed in it&amp;rsquo;s story. Both are excellent, though, and stand independently of each other.&lt;/p&gt;</description></item><item><title>Photography for Geeks</title><link>https://lagomor.ph/indieweb/20221127/2110-bookmark/</link><pubDate>Sun, 27 Nov 2022 21:10:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20221127/2110-bookmark/</guid><description>&lt;p&gt;This article is an excellent, in-depth guide for how to take photographs with your phone camera (and beyond!)&lt;/p&gt;</description></item><item><title>Named Web Colors Wheel</title><link>https://lagomor.ph/indieweb/20221121/1253-bookmark/</link><pubDate>Mon, 21 Nov 2022 12:54:00 -0700</pubDate><guid>https://lagomor.ph/indieweb/20221121/1253-bookmark/</guid><description/></item><item><title>Mastodon Is Too Heavy for Its Own Good</title><link>https://lagomor.ph/2022/11/mastodon-is-too-heavy-for-its-own-good/</link><pubDate>Tue, 15 Nov 2022 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2022/11/mastodon-is-too-heavy-for-its-own-good/</guid><description>&lt;p&gt;&lt;aside class="aside-note" style="border-left-color: #c94a4a;"&gt;
 &lt;svg class="feather" aria-hidden="true" width="18" height="18" fill="none" stroke="#c94a4a" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="position: relative; top: 3px; margin-right: 4px;"&gt;&lt;use href="./css/feather-sprite.svg#alert-octagon"/&gt;&lt;/svg&gt;Warning: This Article Is Poorly Written
&lt;/aside&gt;

With the ongoing collapse of Twitter, there has been a lot of talk about the Fediverse, and primarily Mastodon, which in spite of it probably not wanting to be, is the flagship in the ActivityPub fleet.&lt;/p&gt;
&lt;p&gt;I want to preface this by saying that I think Mastodon is really great software from the user side. It&amp;rsquo;s a very powerful tool and deserves all the credit it gets for it&amp;rsquo;s UI, it&amp;rsquo;s filtering features, and it&amp;rsquo;s very in-depth profile settings.&lt;/p&gt;</description></item><item><title>Weekly Update - November 13th, 2022</title><link>https://lagomor.ph/2022/11/weekly-update-november-13th-2022/</link><pubDate>Sun, 13 Nov 2022 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2022/11/weekly-update-november-13th-2022/</guid><description>&lt;p&gt;As some of you are probably aware, I have the habit of going on two cyclical &amp;ldquo;kicks&amp;rdquo;, every year. Right now I&amp;rsquo;m going through a health-kick, which means I&amp;rsquo;m going to try a bunch of self-improvement type things until I forget I was doing them.&lt;/p&gt;
&lt;p&gt;Anyways, I&amp;rsquo;ve been seeing &lt;a href="https://www.thecut.com/2016/12/the-problem-with-headspace-and-all-those-mindfulness-ads.html" rel="noopener noreferrer" target="_blank"&gt;Headspace&lt;/a&gt; ads everywhere lately, so as a form of core rejection of their business model, I&amp;rsquo;ve been meditating on my own.&lt;/p&gt;</description></item><item><title>Weekly Update - November 9th, 2022</title><link>https://lagomor.ph/2022/11/weekly-update-november-9th-2022/</link><pubDate>Wed, 09 Nov 2022 00:00:00 -0700</pubDate><guid>https://lagomor.ph/2022/11/weekly-update-november-9th-2022/</guid><description>&lt;p&gt;Trying something new here today. With the recent Twitter fiasco going on I started re-evaluating what I get out of using social media, and condensed it down into two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I like watching awful people argue with each other&lt;/li&gt;
&lt;li&gt;I like keeping up with what my friends are up to, and tell them what I&amp;rsquo;m up to.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Number two is the important one here - I only care about &lt;em&gt;particular&lt;/em&gt; things my friends are into. The important stuff - babies being born, new jobs, etc. - that stuff I can hear about in person.&lt;/p&gt;</description></item><item><title>Puffs Bathroom Tissues with Lotion</title><link>https://lagomor.ph/indieweb/20221102/1135-note/</link><pubDate>Wed, 02 Nov 2022 11:35:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20221102/1135-note/</guid><description>&lt;p&gt;I have a cold right now and just about wrote a pretty lengthy article about just how good Puffs Bathroom Tissues are compared to normal tissues but it came off pretty delirious and Proctor and Gamble really doesn&amp;rsquo;t need the press, so - here:&lt;/p&gt;
&lt;p&gt;Puffs Bathroom Tissues with Lotion are really good and you&amp;rsquo;re a sucker if you use any other brand of bathroom tissues when you&amp;rsquo;re sick.&lt;/p&gt;</description></item><item><title>xSwords New Blog!</title><link>https://lagomor.ph/indieweb/20221005/2052-like/</link><pubDate>Wed, 05 Oct 2022 20:53:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20221005/2052-like/</guid><description>&lt;p&gt;A good friend of mine started a new Blog! Be sure to check it out!&lt;/p&gt;</description></item><item><title>Club Penguin</title><link>https://lagomor.ph/indieweb/20220928/1045-note/</link><pubDate>Wed, 28 Sep 2022 10:45:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220928/1045-note/</guid><description>&lt;p&gt;Thinking about how learning Adobe Flash exploits to cheat in the Club Penguin surfing game for infinite coins pretty much directly caused me having the career I have today&lt;/p&gt;</description></item><item><title>Travelogue to the Regular Locations of My Dreams</title><link>https://lagomor.ph/2022/09/travelogue-to-the-regular-locations-of-my-dreams/</link><pubDate>Wed, 28 Sep 2022 11:19:00 +0000</pubDate><guid>https://lagomor.ph/2022/09/travelogue-to-the-regular-locations-of-my-dreams/</guid><description>&lt;p&gt;I have noticed a pattern in my dreams. There are places that I dream, that remain consistent, that have no equivalence in the waking world.&lt;/p&gt;
&lt;p&gt;When I dream them, I can navigate to them, and am confident in where they are located, despite the fact that their location changes from dream to dream. Frequently they are places in the cities and towns I&amp;rsquo;ve grown up in, but not always.&lt;/p&gt;
&lt;p&gt;Often times I&amp;rsquo;ll forget their familiarity until I dream of them again - so I&amp;rsquo;ve written this travelogue to document them; mainly for myself, since for the most part others are uninterested in what other people dream.&lt;/p&gt;</description></item><item><title>Nice Writeup!</title><link>https://lagomor.ph/indieweb/20220829/1406-reply/</link><pubDate>Mon, 29 Aug 2022 22:47:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220829/1406-reply/</guid><description>&lt;p&gt;Nice Writeup! I love seeing how different each site can handle parsing Indieweb content.&lt;/p&gt;
&lt;p&gt;My own site is also built with Hugo; if you&amp;rsquo;re looking for Indieweb inspiration it might be worth looking at my source code here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://git.sr.ht/~tonic/hugo" rel="noopener noreferrer" target="_blank"&gt;https://git.sr.ht/~tonic/hugo&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Kaarten - A Paper Journal Supplement</title><link>https://lagomor.ph/projects/kaarten/</link><pubDate>Thu, 18 Aug 2022 00:00:00 -0600</pubDate><guid>https://lagomor.ph/projects/kaarten/</guid><description>&lt;p&gt;Kaarten is a simple, portable digital system to keep track of your bibliography for your analog notes.&lt;/p&gt;
&lt;p&gt;Zettlekasten means &amp;ldquo;note box&amp;rdquo;, and is a method for organizing all your thoughts in an organized, retrievable way. If you find such solutions too heavy, try Kaarten - our &amp;ldquo;deck of cards&amp;rdquo;.&lt;/p&gt;
&lt;h1 id="methodology"&gt;Methodology&lt;/h1&gt;
&lt;p&gt;Consider a paper notebook as a write-once, read-often database.&lt;/p&gt;
&lt;p&gt;Paper space is limited, so it is pertinent to utilize much of the notebook for frequently referenced information - things like your appointments, thought summaries, or perhaps notes on topics or books you find interesting.&lt;/p&gt;</description></item><item><title>Neubrutalism: A Consideration, and Ruleset</title><link>https://lagomor.ph/2022/08/neubrutalism-a-consideration-and-ruleset/</link><pubDate>Thu, 11 Aug 2022 07:00:00 +0000</pubDate><guid>https://lagomor.ph/2022/08/neubrutalism-a-consideration-and-ruleset/</guid><description>&lt;p&gt;I was recently investigating &lt;a href="https://gumroad.com" rel="noopener noreferrer" target="_blank"&gt;gumroad&lt;/a&gt; and was quite pleased with their &lt;a href="https://gumroad.com/blog/behind-gumroads-new-design-system" rel="noopener noreferrer" target="_blank"&gt;new design system&lt;/a&gt;. I liked how all their features were summed up as simple taglines (&amp;ldquo;Go from zero to $1&amp;rdquo;, as an example), and how the vibrant color pallet drew me between each explanitory diagram.&lt;/p&gt;
&lt;p&gt;At the time, I googled &amp;ldquo;Gumroad design scheme&amp;rdquo; and came up empty with a name for it. However, weeks later, I noticed &lt;a href="https://www.figma.com/" rel="noopener noreferrer" target="_blank"&gt;Figma&lt;/a&gt; did a similar design for their own website. Two is a trend, so I sought out what this design system was called and found &lt;a href="https://hype4.academy/articles/design/neubrutalism-is-taking-over-web" rel="noopener noreferrer" target="_blank"&gt;this article&lt;/a&gt;, which called it Neubrutalism.&lt;/p&gt;</description></item><item><title>Chaosnet</title><link>https://lagomor.ph/indieweb/20220715/1847-bookmark/</link><pubDate>Fri, 15 Jul 2022 18:47:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220715/1847-bookmark/</guid><description/></item><item><title>Why you can't dig switzerland</title><link>https://lagomor.ph/indieweb/20220715/1835-like/</link><pubDate>Fri, 15 Jul 2022 18:40:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220715/1835-like/</guid><description/></item><item><title>Use Plaintext Email</title><link>https://lagomor.ph/indieweb/20220714/2245-bookmark/</link><pubDate>Thu, 14 Jul 2022 22:45:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220714/2245-bookmark/</guid><description/></item><item><title>License</title><link>https://lagomor.ph/license/</link><pubDate>Wed, 13 Jul 2022 00:00:00 -0600</pubDate><guid>https://lagomor.ph/license/</guid><description>&lt;p&gt;Lagomor.ph publishes essays, notes, and other original work created by Alex Spezowka of Lagomorph Labs LLC. This page explains how you may use that material, including older posts that remain available under a Creative Commons license, newer writing that requires permission, and supporting assets such as images or audio.&lt;/p&gt;
&lt;h2 id="works-covered"&gt;Works Covered&lt;/h2&gt;
&lt;p&gt;Unless another license notice appears directly on a page, these terms apply to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All textual content, including titles, metadata, captions, and translations hosted on this site or in the Lagomor.ph RSS feeds&lt;/li&gt;
&lt;li&gt;Original images, diagrams, and audio published here&lt;/li&gt;
&lt;li&gt;The downloadable archive files that mirror site contents&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Third-party material is always credited and remains subject to its own license. When in doubt, please reach out before reuse.&lt;/p&gt;</description></item><item><title>Build Your Own Search Engine with Wiby</title><link>https://lagomor.ph/indieweb/20220711/1447-bookmark/</link><pubDate>Mon, 11 Jul 2022 12:41:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220711/1447-bookmark/</guid><description/></item><item><title>Running an Open Source HAN</title><link>https://lagomor.ph/indieweb/20220711/1240-bookmark/</link><pubDate>Mon, 11 Jul 2022 12:41:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220711/1240-bookmark/</guid><description/></item><item><title>Liked: Badminton</title><link>https://lagomor.ph/indieweb/20220707/1427-like/</link><pubDate>Thu, 07 Jul 2022 14:27:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220707/1427-like/</guid><description/></item><item><title>Liked: Coffee Is Cooler Than Ever. So Is the Third Wave Dead?</title><link>https://lagomor.ph/indieweb/20220707/1256-like/</link><pubDate>Thu, 07 Jul 2022 12:57:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220707/1256-like/</guid><description/></item><item><title>Paranoia Sans</title><link>https://lagomor.ph/indieweb/20220703/1143-boomark/</link><pubDate>Sun, 03 Jul 2022 11:43:07 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220703/1143-boomark/</guid><description/></item><item><title>Generative Art AI</title><link>https://lagomor.ph/indieweb/20220630/1041-note/</link><pubDate>Thu, 30 Jun 2022 10:41:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220630/1041-note/</guid><description>&lt;p&gt;&lt;img src="https://x.lagomor.ph/e0f4aa4113bddf5b4f531b6f3cb3a60c46bc143fe1be31b166b696bcf8932aac.png"
 alt="A man sitting outside a cafe called &amp;lsquo;The Nightcap&amp;rsquo;"
 loading="lazy"
 decoding="async"&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m deeply skeptical of most things happening in the tech sphere at the moment - but I am very excited for these recent, rapid developments in art generating neural networks.&lt;/p&gt;
&lt;p&gt;Being able to iterate an idea to drawing instantly is going to allow people to create wonderful things.&lt;/p&gt;</description></item><item><title>Bookmark: Single Sheet Boatplans</title><link>https://lagomor.ph/indieweb/20220628/1123-bookmark/</link><pubDate>Tue, 28 Jun 2022 11:23:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220628/1123-bookmark/</guid><description/></item><item><title>History of Dance Music Lecture @ KaffeeKlatsch</title><link>https://lagomor.ph/indieweb/20220626/1335-checkin/</link><pubDate>Sun, 26 Jun 2022 13:36:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220626/1335-checkin/</guid><description>&lt;p&gt;I&amp;rsquo;ll be hanging out &lt;a href="https://twitter.com/@KaffeeYYC" rel="noopener noreferrer" target="_blank"&gt;@KaffeeYYC&lt;/a&gt; at five pm until late, to listen to the &lt;a href="https://www.sledisland.com/2022/dancefloor-history-101-how-did-we-get-here" rel="noopener noreferrer" target="_blank"&gt;History of Dance Music&lt;/a&gt; lecture being put on by Sled Island!&lt;/p&gt;</description></item><item><title>RAP Ferreira</title><link>https://lagomor.ph/indieweb/20220624/1335-note/</link><pubDate>Fri, 24 Jun 2022 13:35:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220624/1335-note/</guid><description>&lt;p&gt;&lt;img src="https://x.lagomor.ph/galleries/20220624/2022-06-24.jpg"
 alt="Rap Ferreira"
 loading="lazy"
 decoding="async"&gt;&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t planning on going to any sled shows this year, but got invited to the RAP Ferreira show last night by a friend, and I&amp;rsquo;m very glad I went! What an excellent show.&lt;/p&gt;
&lt;p&gt;If anyone is in Winnipeg tomorrow (25th), I&amp;rsquo;d definetly take the time to go see him perform at the Good Will Social Club.&lt;/p&gt;</description></item><item><title>Bugs</title><link>https://lagomor.ph/indieweb/20220623/0807-note/</link><pubDate>Thu, 23 Jun 2022 08:07:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220623/0807-note/</guid><description>&lt;p&gt;You know when you see a beetle in the house and know you need to take care of it, so you step on it and there&amp;rsquo;s a little resistance and a horrible crunch sound?&lt;/p&gt;
&lt;p&gt;I think that&amp;rsquo;s the worst sensation in the world.&lt;/p&gt;</description></item><item><title>Bookmarked 'hostnames.html'</title><link>https://lagomor.ph/indieweb/20220622/1759-bookmark/</link><pubDate>Wed, 22 Jun 2022 17:59:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220622/1759-bookmark/</guid><description/></item><item><title>Reply to Robbinespu</title><link>https://lagomor.ph/indieweb/20220622/1727-replyto/</link><pubDate>Wed, 22 Jun 2022 17:27:00 -0600</pubDate><guid>https://lagomor.ph/indieweb/20220622/1727-replyto/</guid><description>&lt;p&gt;Thanks for the great jumping off point for my own code! Reading through your page layouts helped a lot in understanding how to get indiepost content working on my own site.&lt;/p&gt;</description></item><item><title>Permashortlinks &amp; Cloudflare Webworkers</title><link>https://lagomor.ph/2022/06/permashortlinks-cloudflare-webworkers/</link><pubDate>Mon, 13 Jun 2022 07:00:00 +0000</pubDate><guid>https://lagomor.ph/2022/06/permashortlinks-cloudflare-webworkers/</guid><description>&lt;p&gt;I&amp;rsquo;ve been investigating more deeply about &lt;a href="https://indieweb.org/permashortlink" rel="noopener noreferrer" target="_blank"&gt;Indieweb&lt;/a&gt;, namely their idea of a permashortlink - put succinctly, it is inevitable that shortlinking providers will either&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fold, or&lt;/li&gt;
&lt;li&gt;Deprecate underused links.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This means that relying on them - and they are awfully convenient - is a net negative to the longevity of any web content you produce - and we&amp;rsquo;ve &lt;a href="https://www.poynter.org/reporting-editing/2009/tr-ims-shutdown-shows-risk-of-relying-on-free-services-to-drive-web-traffic/" rel="noopener noreferrer" target="_blank"&gt;already seen it happen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Indieweb solution to this deprecation problem is, of course - to roll your own. Reading the wiki about this raises the same problem I have with a lot of Indieweb content - it&amp;rsquo;s a wiki clearly written by developers. I don&amp;rsquo;t think it&amp;rsquo;s actionable for the average web content consumer - even if they were gunhoe about running their own blog - to roll any of the permashortlink solutions mentioned on the &lt;a href="http://tantek.pbworks.com/w/page/21743973/Whistle" rel="noopener noreferrer" target="_blank"&gt;wiki&lt;/a&gt; by themselves.&lt;/p&gt;</description></item><item><title>I Added Indieweb Support</title><link>https://lagomor.ph/2022/05/i-added-indieweb-support/</link><pubDate>Thu, 26 May 2022 07:00:00 +0000</pubDate><guid>https://lagomor.ph/2022/05/i-added-indieweb-support/</guid><description>&lt;p&gt;I stumbled across &lt;a href="https://indieweb.org/Getting_Started" rel="noopener noreferrer" target="_blank"&gt;Indie Web&lt;/a&gt; today, and I think it&amp;rsquo;s a neat idea.&lt;/p&gt;
&lt;p&gt;Essentially, it&amp;rsquo;s a set of philosophies and toolsets to allow indie websites to &lt;a href="https://indieweb.org/Webmention" rel="noopener noreferrer" target="_blank"&gt;communicate amongst each other&lt;/a&gt;, establish a standard for &lt;a href="https://indieweb.org/IndieAuth" rel="noopener noreferrer" target="_blank"&gt;using your domain as an identity&lt;/a&gt;, and a way for websites to &lt;a href="https://indieweb.org/h-feed" rel="noopener noreferrer" target="_blank"&gt;parse html as rss feeds&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Webmention is the most interesting out of all of their various projects, which is essentially a modern replacement for &lt;a href="https://indieweb.org/pingback" rel="noopener noreferrer" target="_blank"&gt;pingbacks&lt;/a&gt;, if you remember those - I certainly did not.&lt;/p&gt;</description></item><item><title>Blogging, Updates</title><link>https://lagomor.ph/2022/05/blogging-updates/</link><pubDate>Tue, 24 May 2022 07:00:00 +0000</pubDate><guid>https://lagomor.ph/2022/05/blogging-updates/</guid><description>&lt;p&gt;I stopped updating this blog after two posts for a couple reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I enjoyed setting up the website more then I did writing for it - I created the perfect blog in terms of &lt;em&gt;reading&lt;/em&gt; it (personally, you may debate this), but paid no attention to how I was going to write for it, and editing Markdown files is just enough of a PITA that I wanted to avoid doing it (subconciously or otherwise)&lt;/p&gt;</description></item><item><title>Blogroll</title><link>https://lagomor.ph/info/blogroll/</link><pubDate>Mon, 09 May 2022 00:00:00 -0600</pubDate><guid>https://lagomor.ph/info/blogroll/</guid><description>&lt;h1 id="essayists"&gt;Essayists&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://maggieappleton.com/" rel="noopener noreferrer" target="_blank"&gt;Maggie Appleton&lt;/a&gt; - Visual Essayist about programming, design, and anthropology&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tracydurnell.com/" rel="noopener noreferrer" target="_blank"&gt;Tracy Durnell&lt;/a&gt; - Sci-Fi writer, digital gardener&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mollywhite.net/" rel="noopener noreferrer" target="_blank"&gt;Molly White&lt;/a&gt; - Cryptocurrency Critic &amp;amp; Essayist&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="designers--technologists"&gt;Designers &amp;amp; Technologists&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pentadact.com/" rel="noopener noreferrer" target="_blank"&gt;Tom Francis&lt;/a&gt; - Game Designer (Gunpoint, Heat Signature)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://100r.co" rel="noopener noreferrer" target="_blank"&gt;100 Rabbits&lt;/a&gt; - Small Artist Collective&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kokorobot.ca" rel="noopener noreferrer" target="_blank"&gt;Rek Bell&lt;/a&gt; - Artist &amp;amp; Designer, member of 100 Rabbits&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xxiivv.com" rel="noopener noreferrer" target="_blank"&gt;Devine Lu Linvega&lt;/a&gt; - Designer &amp;amp; Artist, member of 100 Rabbits&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gkbrk.com/" rel="noopener noreferrer" target="_blank"&gt;Gokberk Yaltirakli&lt;/a&gt; - Technologist &amp;amp; Hacker&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="artists"&gt;Artists&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://minutehour.media/" rel="noopener noreferrer" target="_blank"&gt;The Minute Hour&lt;/a&gt; - Sound Artist, Comedian, Talk Show Host&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tumblr.com/splatthew" rel="noopener noreferrer" target="_blank"&gt;Splatthew&lt;/a&gt; - Graphic Artist, Designer of this sites logo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Be sure to explore &lt;a href="https://blogroll.org/" rel="noopener noreferrer" target="_blank"&gt;Blogroll&lt;/a&gt;; or the &lt;a href="https://ooh.directory" rel="noopener noreferrer" target="_blank"&gt;Ooh Directory&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>The Bedroom Speaker Conundrum</title><link>https://lagomor.ph/2021/03/the-bedroom-speaker-conundrum/</link><pubDate>Sun, 14 Mar 2021 07:00:00 +0000</pubDate><guid>https://lagomor.ph/2021/03/the-bedroom-speaker-conundrum/</guid><description>&lt;p&gt;I would like to have speakers in my bedroom. Currently, my receiver has two bookshelf speakers that are loud enough for the whole common area of our apartment, but it would be nice to listen to quieter music while I&amp;rsquo;m reading in bed.&lt;/p&gt;
&lt;p&gt;This post is to outline the two main solutions I&amp;rsquo;ve come up with.&lt;/p&gt;
&lt;h2 id="number-1---speaker-wire--passives"&gt;Number 1 - Speaker Wire &amp;amp; Passives&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://images.lagomor.ph/archive/passive.jpg"
 alt=""
 loading="lazy"
 decoding="async"&gt;&lt;/p&gt;
&lt;p&gt;It seems fairly simplistic to run speaker wire from the receiver into our bedroom, but since we&amp;rsquo;re renting the flat, it would actually be fairly complicated to run the wire in a non-intrusive, visually appealing way.&lt;/p&gt;</description></item><item><title>Contact</title><link>https://lagomor.ph/contact/</link><pubDate>Mon, 01 Mar 2021 00:00:00 -0700</pubDate><guid>https://lagomor.ph/contact/</guid><description>&lt;p&gt;Email: &lt;a href="mailto:alex@lagomor.ph"&gt;alex@lagomor.ph&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PGP: &lt;a href="https://pgp.mit.edu/pks/lookup?op=get&amp;amp;search=0x048FA29E53CBED4E" rel="noopener noreferrer" target="_blank"&gt;D9FA 1C2A B497 9505 4A2B 0EFA 048F A29E 53CB ED4E&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#000;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mDMEZeNz3RYJKwYBBAHaRw8BAQdAFAQMGDRVMG388G2Oog8WHv/5Z+QaXeCyvUiq
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;JW+T2CC0NEFsZXggU3Blem93a2EgKGh0dHBzOi8vbGFnb21vci5waCkgPGFsZXhA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bGFnb21vci5waD6ImQQTFgoAQRYhBNn6HCq0l5UFSisO+gSPop5Ty+1OBQJl43Pd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AhsDBQkDwmcABQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEASPop5Ty+1O
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sQgBAJq+3pJjzYtqLGbXZai5FRz32e7OuYJjH/UQtSnnDKWCAQDvFVtDd7wifl8x
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WMxEx+aXwvQtjCfWVcHboRBMkBeiB7g4BGXjc90SCisGAQQBl1UBBQEBB0BhcdSr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;46N3epTKGGa6vOHl+kbT7MqzWmicJxpo1KZ/WQMBCAeIfgQYFgoAJhYhBNn6HCq0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;l5UFSisO+gSPop5Ty+1OBQJl43PdAhsMBQkDwmcAAAoJEASPop5Ty+1OBtoBANVw
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yCGgJjVtAtUt36+gLpO9gPKq56WwKrXFeZYTw5SGAPsHdym9/zytUSobHD2jVjjl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A47su9gtoOffr5DVbjT1Bg==
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;=qno0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----END PGP PUBLIC KEY BLOCK-----
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;AGE: &lt;a href="https://age-online.com/?r=age1tc9j6gxrtx8mqzp8snlmrst9navpyjd050jna93a2s6kqe8m7v4qhw7cc4" rel="noopener noreferrer" target="_blank"&gt;age1tc9j6gxrtx8mqzp8snlmrst9navpyjd050jna93a2s6kqe8m7v4qhw7cc4&lt;/a&gt;&lt;/p&gt;</description></item><item><title>The Carrot</title><link>https://lagomor.ph/newsletter/</link><pubDate>Mon, 01 Mar 2021 00:00:00 -0700</pubDate><guid>https://lagomor.ph/newsletter/</guid><description>&lt;h2 id="early-access-to-works-in-progress"&gt;Early access to works-in-progress&lt;/h2&gt;
&lt;p&gt;The Carrot is where I share drafts before they&amp;rsquo;re ready, half-formed ideas worth discussing, and the occasional exclusive piece that won&amp;rsquo;t appear on the main site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What you&amp;rsquo;ll get:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First looks at essays and projects while they&amp;rsquo;re still malleable&lt;/li&gt;
&lt;li&gt;Behind-the-scenes notes on process, failures, and pivots&lt;/li&gt;
&lt;li&gt;Exclusive content that stays newsletter-only&lt;/li&gt;
&lt;li&gt;Puzzle previews before public release&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No fixed schedule. When something&amp;rsquo;s worth sharing, you&amp;rsquo;ll hear about it.&lt;/p&gt;</description></item><item><title>The ListenBrainz Widget</title><link>https://lagomor.ph/2021/02/the-listenbrainz-widget/</link><pubDate>Wed, 24 Feb 2021 17:12:46 -0700</pubDate><guid>https://lagomor.ph/2021/02/the-listenbrainz-widget/</guid><description>&lt;p&gt;&lt;img src="https://images.lagomor.ph/archive/lb-code-snap.png"
 alt="A pretty image of a JavaScript function to pull information from ListenBrainz, listed in text below"
 loading="lazy"
 decoding="async"&gt;&lt;/p&gt;
&lt;p&gt;A big feature I wanted on this blog was the ability for people to see what music I was listening to &lt;em&gt;right now&lt;/em&gt;; and you can see the finished results on the header of this page.&lt;/p&gt;
&lt;p&gt;This blog is written in Hugo, which means unlike traditional blog engines, it renders the pages server-side, flat file - no database. These posts are actual MD files.&lt;/p&gt;</description></item><item><title>Utilizing IRC &amp; DCC As a Filesharing Medium</title><link>https://lagomor.ph/2018/02/utilizing-irc-dcc-as-a-filesharing-medium/</link><pubDate>Fri, 09 Feb 2018 09:45:03 -0700</pubDate><guid>https://lagomor.ph/2018/02/utilizing-irc-dcc-as-a-filesharing-medium/</guid><description>&lt;p&gt;The concept of Filesharing (and digital piracy) has been around since before even the basic days of the internet - where floppy disks, and, even earlier, rolls of punch-paper, were shared at swap meets.&lt;/p&gt;
&lt;p&gt;The Internet, as it is always keen to do, revolutionized filesharing in a big way. Bulletin Board Systems was where shareware began to congregate, where the very idea of the &amp;ldquo;scene&amp;rdquo; really began. Eventually, the Scene spread to Usenet, then FTP &amp;amp; FXP. In the late 1990&amp;rsquo;s, IRC became the system of choice, as development in the DCC protocol made it significantly faster compared to other methods.&lt;/p&gt;</description></item><item><title>Search</title><link>https://lagomor.ph/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lagomor.ph/search/</guid><description/></item></channel></rss>