<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sara Loera</title>
    <description>The latest articles on DEV Community by Sara Loera (@saraeloop).</description>
    <link>https://dev.to/saraeloop</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3866832%2Fd3dbc089-4916-45ed-9b28-e320ce9a1365.png</url>
      <title>DEV Community: Sara Loera</title>
      <link>https://dev.to/saraeloop</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saraeloop"/>
    <language>en</language>
    <item>
      <title>I built Earth's Year Wrapped with real climate data. 2025 was rough.</title>
      <dc:creator>Sara Loera</dc:creator>
      <pubDate>Sun, 19 Apr 2026 21:53:49 +0000</pubDate>
      <link>https://dev.to/saraeloop/i-gave-earth-a-wrapped-thisyearearth-4ll0</link>
      <guid>https://dev.to/saraeloop/i-gave-earth-a-wrapped-thisyearearth-4ll0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-04-16"&gt;Weekend Challenge: Earth Day Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Earth Wrapped · MMXXVI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Earth is the narrator.&lt;br&gt;
The year is the subject.&lt;br&gt;
The reader is asked to answer back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thisyear.earth" rel="noopener noreferrer"&gt;&lt;strong&gt;thisyear.earth&lt;/strong&gt;&lt;/a&gt; is an immersive climate year-in-review told across eleven full screen chapters. It borrows the emotional shape of a wrapped recap, then turns the perspective inside out: the account belongs to Earth, the receipts are climate data, and the final action is not to share a playlist, it is to leave a pledge.&lt;/p&gt;

&lt;p&gt;The experience moves through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Preface · The Record&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordinates&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fever&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Atmosphere&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Melt&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Canopy&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Ledger&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Roll Call&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Residue&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Turn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Epilogue · Sincerely&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At the end, Earth asks for one small thing.&lt;/p&gt;

&lt;p&gt;You write a pledge for the year ahead.&lt;br&gt;
You can sign it.&lt;br&gt;
You can leave it anonymous.&lt;br&gt;
And if you want it to remain, you can mint it to the ledger.&lt;/p&gt;

&lt;p&gt;That pledge becomes part of &lt;a href="https://thisyear.earth/ledger" rel="noopener noreferrer"&gt;&lt;strong&gt;thisyear.earth/ledger&lt;/strong&gt;&lt;/a&gt; — a public record with on-chain proof behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I made it
&lt;/h2&gt;

&lt;p&gt;Climate data is everywhere, and somehow still easy to ignore.&lt;/p&gt;

&lt;p&gt;The numbers exist. They are published. They are updated. They are cited. But a spreadsheet does not stop you in the middle of your day. A PDF does not follow you into Monday morning. A chart rarely makes you feel the weight of what it represents.&lt;/p&gt;

&lt;p&gt;I wanted to build something that made the data land. Something that could turn &lt;strong&gt;429 ppm&lt;/strong&gt; into a condition, &lt;strong&gt;1.17 trillion tonnes of ice lost&lt;/strong&gt; into memory, and &lt;strong&gt;renewables up 32%&lt;/strong&gt; into relief that had to be earned.&lt;/p&gt;

&lt;p&gt;So I gave Earth a Wrapped.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🌍 &lt;a href="https://thisyear.earth" rel="noopener noreferrer"&gt;thisyear.earth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗒️ &lt;a href="https://thisyear.earth/ledger" rel="noopener noreferrer"&gt;thisyear.earth/ledger&lt;/a&gt; — the permanent pledge record&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuu7p6rw1h4co9vdcn4ka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuu7p6rw1h4co9vdcn4ka.png" alt="renewables card" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwuo9mj4nq90pem1kydf2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwuo9mj4nq90pem1kydf2.png" alt="Globe" width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F398un4njyho5wdodhlwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F398un4njyho5wdodhlwy.png" alt="The ledger" width="800" height="760"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Solana mattered
&lt;/h2&gt;

&lt;p&gt;The ledger is the part I care about most.&lt;/p&gt;

&lt;p&gt;Not because it is “web3.”  &lt;/p&gt;

&lt;p&gt;Because it turns a passing interaction into a record.&lt;/p&gt;

&lt;p&gt;When someone mints a pledge, the app creates a real memo transaction on &lt;strong&gt;Solana Devnet&lt;/strong&gt; for the challenge build. The transaction hash and mint metadata are stored in the app’s database, and the public ledger page renders those sealed pledges in a readable, shareable, and verifiable format.&lt;/p&gt;

&lt;p&gt;The ledger is not a crypto dashboard.  &lt;/p&gt;

&lt;p&gt;It is a book of names and promises.&lt;/p&gt;

&lt;p&gt;A reader can follow the Explorer link and verify that the pledge exists on-chain. For the challenge build, that proof currently lives on &lt;strong&gt;Devnet&lt;/strong&gt; rather than Mainnet.&lt;/p&gt;

&lt;p&gt;What mattered to me was the split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neon&lt;/strong&gt; serves the ledger and app data quickly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana&lt;/strong&gt; acts as the proof layer underneath&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;The site uses separate shells for mobile and desktop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile:&lt;/strong&gt; swipeable full-screen sequence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop:&lt;/strong&gt; scroll-driven atmospheric narrative&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; — App Router, Turbopack, React 19&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; — strict mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS + Framer Motion&lt;/strong&gt; — layout, motion, transitions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neon&lt;/strong&gt; — pledge and location persistence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana&lt;/strong&gt; — memo-based Devnet pledge minting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;globe.gl&lt;/strong&gt; — final globe visualization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lenis&lt;/strong&gt; — desktop scroll behavior&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The data
&lt;/h2&gt;

&lt;p&gt;The climate data is real.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;CO₂&lt;/strong&gt; card fetches daily live readings from the &lt;strong&gt;NOAA GML CSV at the Mauna Loa Observatory&lt;/strong&gt;. The other cards use annual or authoritative reported figures, cited in the experience itself.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Card&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CO₂ · 429 ppm&lt;/td&gt;
&lt;td&gt;NOAA GML — Mauna Loa Observatory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temperature · +1.55°C&lt;/td&gt;
&lt;td&gt;NASA GISS + NOAA Climate.gov&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ice · 1.17T tonnes&lt;/td&gt;
&lt;td&gt;NSIDC + NASA GRACE-FO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forest · 14.9M hectares&lt;/td&gt;
&lt;td&gt;Global Forest Watch + WRI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Species · 41,046&lt;/td&gt;
&lt;td&gt;IUCN Red List&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plastic · 413 Mt&lt;/td&gt;
&lt;td&gt;OECD + UNEP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wildfires&lt;/td&gt;
&lt;td&gt;NASA FIRMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renewables · +32%&lt;/td&gt;
&lt;td&gt;IEA + IRENA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The design
&lt;/h2&gt;

&lt;p&gt;This project could have gone in a loud, celebratory direction. I tried that path at first. It felt wrong. The subject matter did not want confetti. It wanted gravity.&lt;/p&gt;

&lt;p&gt;So the final direction became typographic, atmospheric, and editorial, not because it was trendy, but because it was the only version that felt honest.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prize category
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Best Use of Solana
&lt;/h3&gt;

&lt;p&gt;Every minted pledge creates a real Solana Devnet memo transaction.&lt;/p&gt;

&lt;p&gt;The app keeps the ledger readable and fast by serving it from Neon, while each sealed pledge links to its on-chain proof on Solana. That gave me the best of both worlds: a public record people can actually read, and a proof layer underneath it that is real and verifiable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Special thanks
&lt;/h2&gt;

&lt;p&gt;Special thanks to the scientists and researchers who maintain these datasets year after year — &lt;strong&gt;NOAA GML at Mauna Loa Observatory, NASA GISS, NSIDC, Global Forest Watch, the IUCN Red List, and the IEA&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover image uses Earth imagery courtesy of NASA.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;🌍 &lt;a href="https://thisyear.earth" rel="noopener noreferrer"&gt;thisyear.earth&lt;/a&gt;&lt;br&gt;
Code: &lt;a href="https://github.com/saraeloop/thisyearearth" rel="noopener noreferrer"&gt;github.com/saraeloop/thisyearearth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read the year.&lt;br&gt;
Leave a pledge.&lt;br&gt;
Add your line to the record.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>earthday</category>
      <category>solana</category>
    </item>
    <item>
      <title>Managing Multiple Git Identities Was a Mess, So I Built gitrole</title>
      <dc:creator>Sara Loera</dc:creator>
      <pubDate>Tue, 14 Apr 2026 22:13:56 +0000</pubDate>
      <link>https://dev.to/saraeloop/managing-multiple-git-identities-was-a-mess-so-i-built-gitrole-184o</link>
      <guid>https://dev.to/saraeloop/managing-multiple-git-identities-was-a-mess-so-i-built-gitrole-184o</guid>
      <description>&lt;p&gt;&lt;em&gt;Multiple accounts were annoying. Multiple machines made it worse. Then came the agents.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was supposed to be on vacation.&lt;/p&gt;

&lt;p&gt;Not fully offline. Just the kind of trip where you bring an old laptop, keep a loose eye on things, and tell yourself that if something urgent comes up, you can handle it.&lt;/p&gt;

&lt;p&gt;I had my dotfiles. I had the usual setup scripts for bootstrapping a machine and juggling Git accounts. I even had a shell wrapper and GIT_SSH_COMMAND to force the right key per repo. I thought that would be enough. It wasn’t.&lt;/p&gt;

&lt;p&gt;Halfway through the trip, a client messaged me. The project they had been sitting on for weeks suddenly became urgent.&lt;/p&gt;

&lt;p&gt;So there I was, on an old laptop, trying to jump back into work mode.&lt;/p&gt;

&lt;p&gt;I needed to pull private files from one GitHub account, set up a client repo on another, and keep my personal GitHub config intact on the same laptop. Three identities. One machine. As if that weren’t enough chaos, I also wanted an agent running overnight, and none of them were playing nicely together.&lt;/p&gt;

&lt;p&gt;I tried to make &lt;code&gt;gh&lt;/code&gt; behave across multiple accounts.&lt;/p&gt;

&lt;p&gt;Wrong account authenticating. Wrong identity on commits. Private repos inaccessible because the wrong SSH key was being used. Everything was tangled together.&lt;/p&gt;

&lt;p&gt;I got it working eventually. But it took way longer than it should have. And the worst part was knowing this was not a one time problem. It was going to happen again on the next machine, the next repo, the next account, the next agent.&lt;/p&gt;

&lt;p&gt;That was the moment I stopped patching the workflow and decided to build the missing tool.&lt;/p&gt;

&lt;p&gt;That tool is gitrole.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why separate identities at all?
&lt;/h2&gt;

&lt;p&gt;For me, this is not just cleanup. It is discipline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Work&lt;/strong&gt; is employer-owned code. Wrong identity on a commit is not just awkward; it's a problem. It is an accountability and IP problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freelance&lt;/strong&gt; is client-owned code. I also keep private client templates and tools there that I do not want mixed into anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personal&lt;/strong&gt; is my own work. I do not want employer email on side projects or personal experiments bleeding into client repos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents&lt;/strong&gt; make this even more important. If an agent commits as me and pushes something broken, was that me or the agent? There needs to be a clean boundary.&lt;/p&gt;

&lt;p&gt;Each identity has a different owner, audience, and level of accountability. Mixing them is not just messy. It creates real problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  The actual problem
&lt;/h2&gt;

&lt;p&gt;Git identity is split across two systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit identity&lt;/strong&gt; is your &lt;code&gt;user.name&lt;/code&gt; and &lt;code&gt;user.email&lt;/code&gt; — what your commit says it is from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Push identity&lt;/strong&gt; is your SSH setup — which key gets used, which GitHub account that key maps to, which host alias the repo remote points at.&lt;/p&gt;

&lt;p&gt;Those two things are related, but they are not the same. You can easily end up with commits that look right, but pushes that go through the wrong account. Git does not warn you when those two drift apart. Most people only notice after the damage is already in history.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; helps with GitHub authentication. It does not manage your Git commit identity. You can &lt;code&gt;gh auth switch&lt;/code&gt; all day and still commit as the wrong person.&lt;/p&gt;

&lt;p&gt;That is the hole gitrole fills.&lt;/p&gt;




&lt;h2&gt;
  
  
  What gitrole gives you
&lt;/h2&gt;

&lt;p&gt;gitrole gives you one place to check the two things Git keeps separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who the next commit will say it is from&lt;/li&gt;
&lt;li&gt;which GitHub account will actually push it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of editing config by hand and hoping you remembered everything, you save your identities once, switch to the one you want, and check the repo before you commit or push.&lt;/p&gt;




&lt;h2&gt;
  
  
  The three-command loop
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitrole use work &lt;span class="nt"&gt;--local&lt;/span&gt;
gitrole status
gitrole doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;use&lt;/code&gt; switches the identity for this repo only&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt; tells you whether commit and push identity are aligned&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;doctor&lt;/code&gt; explains what is wrong if they are not&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You save a role once per identity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitrole add work &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Your Name"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--email&lt;/span&gt; &lt;span class="s2"&gt;"you@company.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ssh&lt;/span&gt; ~/.ssh/id_work &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--github-user&lt;/span&gt; your-work-github-username &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--github-host&lt;/span&gt; github.com-work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use it and check it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitrole use work &lt;span class="nt"&gt;--local&lt;/span&gt;
gitrole status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;work  aligned
  commit Your Name &amp;lt;you@company.com&amp;gt;
  push  your-work-github-username via github.com-work
  scope local override
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;status&lt;/code&gt; shows &lt;code&gt;aligned&lt;/code&gt;, you are done. If something looks off, &lt;code&gt;gitrole doctor&lt;/code&gt; tells you exactly what and why:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitrole doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;checks
  ok role   commit identity matches saved role work
  ok scope  selected role work is applied via local config
  ok commit effective commit identity matches selected role work
  ok auth   SSH auth matches role githubUser your-work-github-username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if the push path is still wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitrole remote &lt;span class="nb"&gt;set &lt;/span&gt;work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That rewrites &lt;code&gt;origin&lt;/code&gt; to use the SSH host alias configured for that role.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctwl5hc2klo0yk3v12jv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctwl5hc2klo0yk3v12jv.png" alt="gitrole catching a misaligned remote and fixing it in three commands" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Remote was still pointing at the personal account after switching to work. Doctor caught it. One command fixed it.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The fresh-machine moment
&lt;/h2&gt;

&lt;p&gt;On a clean machine, the problem becomes obvious fast. You install gitrole, run status, and see this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;no matching role  warning
  commit Ada &amp;lt;ada@example.com&amp;gt;
  push  Ada via github.com
  scope global
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Git is configured. gitrole just does not know that identity yet. So you capture it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitrole import current &lt;span class="nt"&gt;--name&lt;/span&gt; personal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;imported current identity as personal
  commit Ada &amp;lt;ada@example.com&amp;gt;
  scope global
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now gitrole knows that identity by name. No retyping.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agents made this more important, not less
&lt;/h2&gt;

&lt;p&gt;Humans are bad at remembering which identity belongs where.&lt;/p&gt;

&lt;p&gt;Agents are worse. They do not carry ambient context unless you make it explicit.&lt;/p&gt;

&lt;p&gt;That is why gitrole has &lt;code&gt;gitrole status --short&lt;/code&gt;, &lt;code&gt;gitrole doctor --json&lt;/code&gt;, and repo-local &lt;code&gt;.gitrole&lt;/code&gt; policy files. Not because I wanted to build an AI tool, but because explicit identity state matters a lot more once software is committing on your behalf.&lt;/p&gt;




&lt;h2&gt;
  
  
  The point
&lt;/h2&gt;

&lt;p&gt;I built gitrole because I was tired of that moment before every push:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;wait — am I the right person right now?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Save your identities once. Switch with one command. Check before you push.&lt;/p&gt;

&lt;p&gt;It already works; I use it myself, and I'm still refining it as I pressure test it across machines and repos. If you try it, I'd love to hear what works and what still feels rough.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npm install -g gitrole&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://docs.gitrole.dev" rel="noopener noreferrer"&gt;docs.gitrole.dev&lt;/a&gt; — repo pinning, agent identity setup, and machine-readable output for automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/synsoftworks/gitrole" rel="noopener noreferrer"&gt;github.com/synsoftworks/gitrole&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>agents</category>
    </item>
    <item>
      <title>I "accidentally" built an awesome-useless ecosystem. There is an owl. The Tamagotchi is dying. 1997 portfolio devcities.lol</title>
      <dc:creator>Sara Loera</dc:creator>
      <pubDate>Thu, 09 Apr 2026 03:29:45 +0000</pubDate>
      <link>https://dev.to/saraeloop/i-accidentally-built-an-awesome-useless-ecosystem-there-is-an-owl-the-tamagotchi-is-dying-3a1o</link>
      <guid>https://dev.to/saraeloop/i-accidentally-built-an-awesome-useless-ecosystem-there-is-an-owl-the-tamagotchi-is-dying-3a1o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Hello, my name is Sara, and I'm a software engineer. I build observable AI infrastructure. I make complex systems legible, auditable, and safe.&lt;/p&gt;

&lt;p&gt;Today, in full yolo mode, I used those skills to build &lt;strong&gt;&lt;a href="https://github.com/saraeloop/awesome-useless" rel="noopener noreferrer"&gt;awesome-useless&lt;/a&gt;&lt;/strong&gt; — a real &lt;code&gt;awesome-*&lt;/code&gt; list for useless software. Like &lt;code&gt;awesome-python&lt;/code&gt; but for things that should not exist.&lt;/p&gt;

&lt;p&gt;It is a russian doll. Open it and find something weirder inside.&lt;/p&gt;

&lt;p&gt;🪆 &lt;strong&gt;awesome-useless&lt;/strong&gt; — the repo. A curated list. Real badges. Real CI. Contributions welcome. Useful PRs will be rejected.&lt;/p&gt;

&lt;p&gt;🪆 &lt;strong&gt;oh-my-silly-me&lt;/strong&gt; — a shell framework that makes your terminal measurably worse. Has a Tamagotchi that always dies.&lt;/p&gt;

&lt;p&gt;🪆 &lt;strong&gt;.spells&lt;/strong&gt; — a hidden grimoire. &lt;code&gt;ls -la&lt;/code&gt; and you'll see things. We cannot be held responsible.&lt;/p&gt;

&lt;p&gt;🪆 &lt;strong&gt;devCities.lol&lt;/strong&gt; — the innermost doll. You describe yourself. A tired government owl named Agent Hoot builds you a personal 1997 Devcities homepage. You get a shareable URL. Your portfolio is now safe from modern web design. Forever. In 1997.&lt;/p&gt;

&lt;p&gt;I have no regrets. My git log tells a different story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://devcities.lol" rel="noopener noreferrer"&gt;→ Try devCities.lol&lt;/a&gt;— yeah, I went there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Land on devcities.lol — a Windows 98 portal&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Describe yourself in the prompt box:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I'm ___, frontend dev with strong feelings about border-radius. My stack is TypeScript and regret. My cat, Mr. Whiskers, reviews all my PRs. He has never approved one."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hit &lt;strong&gt;🦉 ENTER O.W.L.S PROTECTION&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Behind the scenes, the Gemini API wakes up Agent Hoot. &lt;br&gt;
He reads your description. He built your 1997 homepage. &lt;br&gt;
He does not ask questions. This also concerns us.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Watch the terminal go...&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your personal 1997 devCities homepage appears. It is not pretty. It was never going to be pretty. Your name is in rainbow Comic Sans. Your stack has been renamed to chaos. Your hot take is marked CLASSIFIED. The guestbook has one entry — Agent Hoot. Also classified. You made this. You cannot unmake this. This is yours now.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fopktp3vnr2263msdfujw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fopktp3vnr2263msdfujw.png" alt="devcities website" width="800" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;--&amp;gt; Hit "🔗 SHARE YOUR PAGE" — the entire Devcities nightmare &lt;br&gt;
   gets compressed into a URL. No backend. No database. Just pure 1997 chaos encoded into a link. Send it to your friends. Send it to your enemies. Send it to your tech lead, who keeps saying "we should rewrite this in Rust."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;oh-my-silly-me in action:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;oh-my-silly-me/silly.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;ksshhhhh...bing bing bing...CONNECTED AT 28.8 KBPS
MEMORANDUM: Please report any unauthorized use of the 'Tab' key to Agent Hoot.
🐣 [TAMAGOTCHI] is currently 0 minutes old. It is 1799 seconds from its inevitable doom.
&lt;/span&gt;&lt;span class="gp"&gt;🦉 [CLASSIFIED] ~/your-directory $&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also cast spells:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cast ghostbuster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Gemini identified 3 ghosts, 7 personality enhancements, and 13 anomalies in total. It was recommended to leave offerings in the node_modules folder at midnight. Agent Hoot will collect them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/saraeloop" rel="noopener noreferrer"&gt;
        saraeloop
      &lt;/a&gt; / &lt;a href="https://github.com/saraeloop/awesome-useless" rel="noopener noreferrer"&gt;
        awesome-useless
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An awesome list for software that solves nothing. Contributions welcome.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/saraeloop/awesome-useless/assets/awesome-useless-glasses.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsaraeloop%2Fawesome-useless%2FHEAD%2Fassets%2Fawesome-useless-glasses.png" width="250"&gt;&lt;/a&gt;

&lt;p&gt;&lt;a href="https://awesome.re" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9d49598b873146ec650fb3f275e8a532c765dabb1f61d5afa25be41e79891aa7/68747470733a2f2f617765736f6d652e72652f62616467652e737667" alt="awesome"&gt;&lt;/a&gt;
&lt;a href=""&gt;&lt;img src="https://camo.githubusercontent.com/306ff9324f38c1e385af4cbca56429d3e0882a88eb95a020de0f8168f0e2a6a1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7573656c6573732d3130302532352d627269676874677265656e" alt="useless"&gt;&lt;/a&gt;
&lt;a href=""&gt;&lt;img src="https://camo.githubusercontent.com/7860ac554a0fcb00c06566dcc45cc967c9861ee5bb82143cd1e8dca396078286/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d61696e7461696e65642d70726f6261626c792d79656c6c6f77" alt="maintained"&gt;&lt;/a&gt;
&lt;a href=""&gt;&lt;img src="https://camo.githubusercontent.com/866813dc5cfc27680798feb5902b5b91d8f2a043e21f8472ee56e6ef4601a461/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d7573656c6573732532306f6e6c792d726564" alt="PRs"&gt;&lt;/a&gt;
&lt;a href=""&gt;&lt;img src="https://camo.githubusercontent.com/0c10b75ce2e770ce3119e8ca7ab52c5a1996f3c94fd9d34c395777762fbf1fb4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6365727469666965642d4167656e74253230486f6f742532302546302539462541362538392d626c7565" alt="Agent Hoot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;awesome-useless ✨&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A curated list of awesome useless code, tools, and resources.&lt;br&gt;
Contributions welcome. Useful PRs will be rejected.&lt;/p&gt;
&lt;p&gt;🏆 An entry in the &lt;a href="https://dev.to/challenges" rel="nofollow"&gt;DEV.to April Fools Challenge&lt;/a&gt; · &lt;code&gt;#418challenge&lt;/code&gt; · &lt;code&gt;#devchallenge&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/saraeloop/awesome-useless#tools" rel="noopener noreferrer"&gt;Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/saraeloop/awesome-useless#projects" rel="noopener noreferrer"&gt;Projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/saraeloop/awesome-useless#prompts" rel="noopener noreferrer"&gt;Prompts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/saraeloop/awesome-useless#spells" rel="noopener noreferrer"&gt;Spells&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠️ Tools&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/saraeloop/awesome-useless/tools/oh-my-silly-me/" rel="noopener noreferrer"&gt;oh-my-silly-me&lt;/a&gt; — A shell framework for the unproductive. Like oh-my-zsh but worse in every measurable way. On purpose.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏛️ Projects&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/saraeloop/awesome-useless/projects/devcities/" rel="noopener noreferrer"&gt;devCities&lt;/a&gt; — Your dev portfolio. In 1997. A government owl builds your Devcities homepage from a prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🧠 Prompts&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/saraeloop/awesome-useless/prompts/unhinged-prompts/" rel="noopener noreferrer"&gt;unhinged-prompts&lt;/a&gt; — AI prompts that should not exist. Curated by someone who regrets all of them.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🧙 Spells&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/saraeloop/awesome-useless/.spells/" rel="noopener noreferrer"&gt;.spells&lt;/a&gt; — A hidden grimoire. &lt;code&gt;ls -la&lt;/code&gt; and you'll see things. Cast them on any AI: Gemini, Claude, Codex, or other. We cannot be held responsible.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚰️ Graveyard&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/saraeloop/awesome-useless/graveyard/" rel="noopener noreferrer"&gt;graveyard&lt;/a&gt; — Where projects go to die. Even AI projects. Especially AI projects. Submit yours. Be proud.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🖥️ Useless Downloads&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/saraeloop/awesome-useless/assets/418-i-am-a-teapot-wallpaper.jpg" rel="noopener noreferrer"&gt;418 I Am A Teapot Wallpaper&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/saraeloop/awesome-useless" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repo is a russian doll. Each layer contains something weirder.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ls -la&lt;/code&gt; when you get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript + Vite (the app that hides websites in 1997 has strict mode enabled)&lt;/li&gt;
&lt;li&gt;98.css (Windows 98 government portal aesthetic)&lt;/li&gt;
&lt;li&gt;Gemini API / gemini-3.1-pro-preview (Agent Hoot, the Identity Reassignment Officer)&lt;/li&gt;
&lt;li&gt;lz-string (compress entire Geocities pages into shareable URLs)&lt;/li&gt;
&lt;li&gt;Vanilla chaos (CSS, HTML, the spirit of 1997)&lt;/li&gt;
&lt;li&gt;Bash/zsh (oh-my-silly-me shell framework)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Gemini API does the actual work:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you describe yourself, the prompt tells Gemini:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You are Agent Hoot, O.W.L.S. Identity Reassignment Officer. This page was made by a developer in 1997 who was EXTREMELY proud of it. It should look intentional. Chaotic but lovingly crafted. It looks like someone spent their whole weekend on this. Useless ≠ ugly. Charming chaos ≠ visual disaster."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiax0ds5bt11v3jt9bd4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiax0ds5bt11v3jt9bd4c.png" alt="Gemini Cooking" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That last instruction went through 5 iterations. The first 4 produced visual disasters. The 5th produced Sara's CyberDomain. Sara's CyberDomain is beautiful. In 1997.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini CLI built oh-my-silly-me:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I prompted Gemini CLI to build a shell framework that makes your terminal worse. It built Tamagotchis, Enya error handlers, dial-up simulators, and a &lt;code&gt;cast&lt;/code&gt; command for AI spells. It did not object once. This concerns me deeply.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6etr4w2x9r5xkxceonr7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6etr4w2x9r5xkxceonr7.png" alt="Oh-my-silly-me" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Imagen created Agent Hoot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;He did not consent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total cost of all Gemini API calls:&lt;/strong&gt; approximately $0.83 &lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ The Incident Report
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Every mission has casualties.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;O.W.L.S. INCIDENT LOG
======================
Classification: EYES ONLY

INCIDENT #001: THE MODEL THAT DID NOT EXIST
gemini-3.0-flash is not found for API version v1beta.
We asked for the future. The future was not available.
We settled for 2.5. for a bit, then 3.0 flasharoooo!

INCIDENT #002: THE TYPING THAT WOULD NOT STOP
&amp;gt; Agent Hoot is still typing.
&amp;gt; Agent Hoot is still typing..
&amp;gt; Agent Hoot is still typing...
[× 87]
Agent Hoot typed for 4 minutes.
Agent Hoot was very thorough.
We could not stop him.

INCIDENT #003: THE LINTER THAT HAD OPINIONS
The CI markdown linter told us:
"This repo is a joke —
let's not fight the linter on every creative choice."
We disabled the rules.
The linter was right.
We were also right.

INCIDENT #004: THE TAMAGOTCHI
It died.
We could not save it.
Nobody can save it.
This is by design.
This is fine.

TOTAL CASUALTIES: 4 incidents, 1 Tamagotchi
STATUS: Operational. Mostly. It is 1997.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repo is real. The contributions are welcome.&lt;br&gt;
The useless PRs will be merged with great pride.&lt;br&gt;
The useful PRs will be rejected with great sorrow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Star the repo. Submit your useless thing. &lt;br&gt;
The grimoire is open. &lt;code&gt;ls -la&lt;/code&gt; and you'll see.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Google AI Usage&lt;/strong&gt; — Gemini CLI built the shell framework. Gemini API powers the identity reassignment. Google Imagen created Agent Hoot. Total Google AI involvement: everything except the existential crisis, which was my own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Ode to Larry Masinter&lt;/strong&gt; — Our servers are teapots. HTTP 418. This is not an error. This is a lifestyle. The HTCPCP/1.0 certification appears in the footer of every page. Agent Hoot has been a teapot since 1997. Agent Hoot did not choose this. Free pocket computer skins ship with every generated page. Larry Masinter has not been informed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Favorite&lt;/strong&gt; — devCities gives every developer their own shareable 1997 homepage. The repo accepts PRs for new useless projects. The tamagotchi dies for everyone equally. This is community.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The visitor counter is at 000312.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;It will reach 000313 eventually.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Agent Hoot is still watching.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;It is 1997.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;It is always 1997.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🦉&lt;/p&gt;

</description>
      <category>418challenge</category>
      <category>jokes</category>
      <category>watercooler</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
