<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Side-Project on Marian Zeis Blog</title>
    <link>https://blog.zeis.de/tags/side-project/</link>
    <description>Recent content in Side-Project on Marian Zeis Blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 02 Feb 2026 09:30:00 +0100</lastBuildDate>
    <atom:link href="https://blog.zeis.de/tags/side-project/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Animalist in German: I Had to Build This</title>
      <link>https://blog.zeis.de/posts/2026-02-02-animalist/</link>
      <pubDate>Mon, 02 Feb 2026 09:30:00 +0100</pubDate>
      <guid>https://blog.zeis.de/posts/2026-02-02-animalist/</guid>
      <description>&lt;p&gt;I found Vivian Rose’s little web game &lt;strong&gt;“List Animals Until Failure”&lt;/strong&gt; through a Hacker News thread (&lt;a href=&#34;https://news.ycombinator.com/item?id=46842603&#34;&gt;HN discussion&lt;/a&gt;) and immediately got hooked.&lt;/p&gt;&#xA;&lt;p&gt;Then I typed my first few animals… and realized my English animal vocabulary is not exactly perfect. So I did the only sensible thing and made a German version.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Screenshot of the German Animalist game interface&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-02-02-animalist/animalist.jpg&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The UI text is mostly translated with AI help (as all the other code). The part that actually took time was getting the animal names.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;what-the-game-is&#34;&gt;What the game is&lt;/h2&gt;&#xA;&lt;p&gt;It’s simple: you type animal names until you fail. If you repeat something, or you try to sneak in a too-broad term after a more specific one (and vice versa), the game calls you out.&lt;/p&gt;&#xA;&lt;p&gt;The magic is that it feels &lt;strong&gt;instant&lt;/strong&gt; because when you load the app you also load the complete animal list.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;where-the-animal-list-comes-from&#34;&gt;Where the animal list comes from&lt;/h2&gt;&#xA;&lt;p&gt;Vivian explains the original approach in her write-up (&lt;a href=&#34;https://rose.systems/blog/list-animals-until-failure&#34;&gt;blog post&lt;/a&gt;): the game is powered by &lt;strong&gt;Wikidata + Wikipedia&lt;/strong&gt;, and it ships a big offline lookup table so gameplay needs &lt;strong&gt;no network calls&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;At a high level, the original project:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;mines Wikidata entities representing taxons and builds a parent/child tree&lt;/li&gt;&#xA;&lt;li&gt;uses Wikipedia article titles + redirects (and some extra heuristics like disambiguation pages) to decide what inputs should count as “the same animal term”&lt;/li&gt;&#xA;&lt;li&gt;has a bunch of hand-tuning for edge cases&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For the German version, I took a pragmatic route:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;keep the &lt;strong&gt;same Q-IDs and taxonomy structure&lt;/strong&gt; from the original dataset&lt;/li&gt;&#xA;&lt;li&gt;fetch &lt;strong&gt;German names&lt;/strong&gt; for those Q-IDs from Wikidata in batches&lt;/li&gt;&#xA;&lt;li&gt;write out the German lookup tables that the game uses at runtime&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I ended up with a few small Python helpers: one to fetch the German names from Wikidata, one to re-try missing entries, and one to add common singular forms (so “hai” works even if the canonical title is “haie”).&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;credits&#34;&gt;Credits&lt;/h2&gt;&#xA;&lt;p&gt;This exists because Vivian Rose built something genuinely fun and also wrote about it:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Original game: &lt;a href=&#34;https://rose.systems/animalist/&#34;&gt;List Animals Until Failure&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Original repo: &lt;a href=&#34;https://github.com/Roachbones/animalist&#34;&gt;Roachbones/animalist&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Original write-up: &lt;a href=&#34;https://rose.systems/blog/list-animals-until-failure&#34;&gt;blog post&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And here’s my German adaptation again:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;German version: &lt;a href=&#34;https://animalist-de.marianzeis.de/&#34;&gt;animalist-de.marianzeis.de&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Repo: &lt;a href=&#34;https://github.com/marianfoo/animalist_de&#34;&gt;marianfoo/animalist_de&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
  </channel>
</rss>
