<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>glow.li: 2026</title>
        <description>A blog by glow.</description>
        <link>https://glow.li/tags/2026.xml</link>
        <atom:link href="https://glow.li/tags/2026.xml" rel="self" type="application/rss+xml"/>
        <generator>Glow.li Builder</generator>
            <item>
        <title>Critter: A virtual pet for your terminal</title>
        <description>&lt;div class="critter-container"&gt;
&lt;/div&gt;
&lt;p&gt;I recently bought one of these retro &lt;a href="https://en.wikipedia.org/wiki/Tamagotchi"&gt;Tamagotchi&lt;/a&gt; devices. For fun, I made a CLI/browser toy that's very similar. Go ahead and use the buttons to feed the hungry &lt;a href="https://github.com/Neo-Oli/critter"&gt;Critter&lt;/a&gt;. But it works best when installed as a CLI tool.&lt;/p&gt;
&lt;!--more--&gt;
&lt;div id="toc"&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#Context"&gt;Context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#Usage"&gt;Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#Integrations"&gt;Integrations&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#Short+output"&gt;Short output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#JSON+output"&gt;JSON output&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#Automated+tests"&gt;Automated tests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;h3 id="Context" name="Context"&gt;&lt;a class="hash-link" href="#Context"&gt;Context&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://glow.li/media/images/big/tamagotchi.webp?chash=Iebu82165f"&gt;&lt;img src="https://glow.li/media/images/tamagotchi.webp?chash=Iebu8836e5" alt="A Tamagotchi device bathed in pink light" title="A Tamagotchi device bathed in pink light" loading="lazy" sizes="(max-width:800px) 100vw, (max-width:800px) 100vw, (max-width:1000px) 80vw, (max-width:1200px) 67vw, (max-width:1400px) 58vw, (max-width:1600px) 50vw, (max-width:1800px) 45vw, (max-width:2000px) 40vw, (max-width:2200px) 37vw, (max-width:2400px) 34vw, (max-width:2600px) 31vw, (max-width:2800px) 29vw, 1500px" srcset="https://glow.li/media/images/tamagotchi.webp?chash=Iebu8836e5 1500w, https://glow.li/media/images/1200/tamagotchi.webp?chash=Iebu897734 1200w, https://glow.li/media/images/1000/tamagotchi.webp?chash=Iebu8484c4 1000w, https://glow.li/media/images/800/tamagotchi.webp?chash=Iebu818930 800w, https://glow.li/media/images/700/tamagotchi.webp?chash=Iebu802c9f 700w, https://glow.li/media/images/600/tamagotchi.webp?chash=Iebu8f6374 600w, https://glow.li/media/images/500/tamagotchi.webp?chash=Iebu8bf7f9 500w, https://glow.li/media/images/400/tamagotchi.webp?chash=Iebu8c1983 400w, https://glow.li/media/images/300/tamagotchi.webp?chash=Iebu8f7e09 300w, https://glow.li/media/images/200/tamagotchi.webp?chash=Iebu8e20bc 200w, https://glow.li/media/images/100/tamagotchi.webp?chash=Iebu8763cd 100w" &gt;&lt;/a&gt;
Here's the Tamagotchi I recently bought. It's a reproduction, not an original.&lt;/p&gt;
&lt;h3 id="Usage" name="Usage"&gt;&lt;a class="hash-link" href="#Usage"&gt;Usage&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can find installation instructions in the &lt;a href="https://github.com/Neo-Oli/critter"&gt;repository&lt;/a&gt;. After installation, create your critter with &lt;code&gt;critter new&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;$ critter new

⠀⠀⠀⠀⠀▄▀▀▀▄
⠀⠀⠀⠀▄▀▄⠀⠀▀▄
⠀⠀⠀▄▀⠀⠀⠀▀⠀▀▄
⠀⠀⠀▀▄⠀▀⠀▄⠀▄▀
⠀⠀⠀⠀▀▄▄▄▄▄▀

A 0 seconds&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After a couple of minutes, it will hatch. Check the status with just &lt;code&gt;critter&lt;/code&gt;. It'll probably be hungry. Feed it with &lt;code&gt;critter feed&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;critter --help&lt;/code&gt; will show you all the commands. This project works best with a &lt;a href="https://www.nerdfonts.com/"&gt;Nerd Font&lt;/a&gt;. If you don't have one installed, pass the &lt;code&gt;-n&lt;/code&gt; flag to use the fallback text string instead of icons.&lt;/p&gt;
&lt;h3 id="Integrations" name="Integrations"&gt;&lt;a class="hash-link" href="#Integrations"&gt;Integrations&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="Short+output" name="Short+output"&gt;&lt;a class="hash-link" href="#Short+output"&gt;Short output&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Looking to integrate it into your status bar or similar? Try &lt;code&gt;critter -s&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;$ critter -s
ʕ•ᴥ•ʔ H▇ S▂ E▇ +█ T▂&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="JSON+output" name="JSON+output"&gt;&lt;a class="hash-link" href="#JSON+output"&gt;JSON output&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;For more advanced integrations, call &lt;code&gt;critter -j&lt;/code&gt;. It gives you all sorts of information for more advanced use cases.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ critter -j
{
  "action": "idle",
  "actionTime": 0,
  "alert": false,
  "Bars": "󰱱▇ 󰉛▂ 󱊣▇ █ 󰦫▂",
  "Bars-nonerd": "H▇ S▂ E▇ +█ T▂",
  "emoticon": "ʕ•ᴥ•ʔ",
  "emoticon-nonerd": "ʕ•ᴥ•ʔ",
  "Energy": 744064,
  "Happy": 690411,
  "Health": 1000000,
  "Hunger": 298092,
  "plain": "█▀█▄▄▄█▀█\n█       █\n█ █   █ █▄▄▄▄▄▄\n█   ▄   █     ██\n█▄▄▄▄▄▄▄█     █\n █            █\n █  █▀█  █▀▀█ █\n █▄▄█ █▄▄█  █▄█\n\nIDLE\n󰱱 󰋑󰋑󰋑󰛞󰋕  󰉛 󰋑󰛞󰋕󰋕󰋕\n󱊣 󰋑󰋑󰋑󰛞󰋕   󰋑󰋑󰋑󰋑󰋑\n󰦫 󰋑󰋕󰋕󰋕󰋕  󰥔 2 days",
  "plain-nonerd": "█▀█▄▄▄█▀█\n█       █\n█ █   █ █▄▄▄▄▄▄\n█   ▄   █     ██\n█▄▄▄▄▄▄▄█     █\n █            █\n █  █▀█  █▀▀█ █\n █▄▄█ █▄▄█  █▄█\n\nIDLE\nH │███▌ │  S │█▌   │\nE │███▌ │  + │█████│\nT │█    │  A 2 days",
  "plainSprites": "█▀█▄▄▄█▀█\n█       █\n█ █   █ █▄▄▄▄▄▄\n█   ▄   █     ██\n█▄▄▄▄▄▄▄█     █\n █            █\n █  █▀█  █▀▀█ █\n █▄▄█ █▄▄█  █▄█",
  "plainStats": "IDLE\n󰱱 󰋑󰋑󰋑󰛞󰋕  󰉛 󰋑󰛞󰋕󰋕󰋕\n󱊣 󰋑󰋑󰋑󰛞󰋕   󰋑󰋑󰋑󰋑󰋑\n󰦫 󰋑󰋕󰋕󰋕󰋕  󰥔 2 days",
  "plainStats-nonerd": "IDLE\nH │███▌ │  S │█▌   │\nE │███▌ │  + │█████│\nT │█    │  A 2 days",
  "poo": false,
  "short": "ʕ•ᴥ•ʔ 󰱱▇ 󰉛▂ 󱊣▇ █ 󰦫▂",
  "short-nonerd": "ʕ•ᴥ•ʔ H▇ S▂ E▇ +█ T▂",
  "Toilet": 183458
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Want to know when your critter is hungry, sad, soiled, etc.? Periodically check the &lt;code&gt;alert&lt;/code&gt; property.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ critter -j | jq .alert
true&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After reading an alert, call &lt;code&gt;critter dismiss&lt;/code&gt; to clear it.&lt;/p&gt;
&lt;p&gt;For example, a cron job or integration should call &lt;code&gt;critter dismiss&lt;/code&gt; after sending the notification.&lt;/p&gt;
&lt;h3 id="Automated+tests" name="Automated+tests"&gt;&lt;a class="hash-link" href="#Automated+tests"&gt;Automated tests&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of the cool things about the project are the automated tests. With them dozens of critters are simulated to see how long they survive in certain conditions. Though I still grapple with the moral implication of spawning dozens of critters only to let them automatically die. It's probably fine.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;gt; dies within the configured low-happiness health schedule
Critter died after 5 days, 18 hours, 53 minutes, 20 seconds (500000 seconds total).

 &amp;gt; dies within the configured zero-happiness health schedule
Critter died after 2 days, 21 hours, 26 minutes, 40 seconds (250000 seconds total).

 &amp;gt; dies within a week with only six-hour meals shifted by -60 minutes
Critter died after 2 days, 9 hours, 5 minutes, 0 seconds (205500 seconds total).

 &amp;gt; dies within a week with only six-hour meals shifted by -30 minutes
Critter died after 2 days, 5 hours, 46 minutes, 0 seconds (193560 seconds total).

 &amp;gt; dies within a week with only six-hour meals shifted by 30 minutes
Critter died after 2 days, 6 hours, 35 minutes, 0 seconds (196500 seconds total).

 &amp;gt; dies within a week with only six-hour meals shifted by 60 minutes
Critter died after 2 days, 7 hours, 0 minutes, 0 seconds (198000 seconds total).

 &amp;gt; dies within five days without commanded sleep despite feeding and cleaning
Critter died after 2 days, 11 hours, 41 minutes, 0 seconds (214860 seconds total).

 &amp;gt; loses more health when poo cleaning is delayed
Critter died after 2 days, 3 hours, 49 minutes, 0 seconds (186540 seconds total).
Critter died after 1 days, 11 hours, 8 minutes, 0 seconds (126480 seconds total).
Critter died after 1 days, 6 hours, 18 minutes, 0 seconds (109080 seconds total).

 &amp;gt; is dead by thirty days when only fed daily and poo is cleaned
Critter died after 1 days, 11 hours, 32 minutes, 0 seconds (127920 seconds total).

 &amp;gt; is dead by thirty days when fed every five hours and poo is left
Critter died after 1 days, 6 hours, 18 minutes, 0 seconds (109080 seconds total).

 &amp;gt; survives one day but dies within two when neglected from full health
Critter died after 1 days, 8 hours, 56 minutes, 0 seconds (118560 seconds total).

 &amp;gt; hatches before dying within two days when neglected from birth&lt;/code&gt;&lt;/pre&gt;</description>
    <pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate>
    <link>https://glow.li/posts/critter/</link>
    <guid isPermaLink="false">1791849600</guid>
</item>

    </channel>
</rss>

