<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>igorvrabie.dev - Blog</title>
    <link rel="self" type="application/atom+xml" href="https://3847ad72.igorvrabie-dev.pages.dev/blog/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://3847ad72.igorvrabie-dev.pages.dev/blog/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-06-12T00:00:00+00:00</updated>
    <id>https://3847ad72.igorvrabie-dev.pages.dev/blog/atom.xml</id>
    <entry xml:lang="en">
        <title>The *arr stack runs itself. I wish.</title>
        <published>2026-06-12T00:00:00+00:00</published>
        <updated>2026-06-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://3847ad72.igorvrabie-dev.pages.dev/blog/arr-stack/"/>
        <id>https://3847ad72.igorvrabie-dev.pages.dev/blog/arr-stack/</id>
        
        <content type="html" xml:base="https://3847ad72.igorvrabie-dev.pages.dev/blog/arr-stack/">&lt;p&gt;That&#x27;s what they say on the forums. &quot;Set it and forget it.&quot; &quot;It just works.&quot; Reddit threads full of people casually mentioning their setup like it took an afternoon. It did not take an afternoon.&lt;&#x2F;p&gt;
&lt;p&gt;I run the full stack on a Raspberry Pi 5. Prowlarr finds things. Sonarr and Radarr grab them. qBittorrent downloads them. Bazarr adds subtitles. Everything talks to everything else through a Traefik reverse proxy with OAuth2 and CrowdSec because apparently I hate having free time. It&#x27;s beautiful, in theory.&lt;&#x2F;p&gt;
&lt;p&gt;In practice, I&#x27;ve spent more time fixing it than watching anything it downloaded. This is fine. I&#x27;ve learned more from breaking this stack than from any course I&#x27;ve ever paid for. Which is also fine, because the courses cost money and the Pi just cost sleep.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-sonarr-incident&quot;&gt;The Sonarr incident&lt;&#x2F;h2&gt;
&lt;p&gt;One morning — not a particularly special morning — Sonarr stopped working. Not &quot;slow&quot; stopped. Not &quot;needs a restart&quot; stopped. Database corruption stopped. Just a clean, confident refusal to start. SQLite, it turns out, does not enjoy being written to over a network mount at speed. The journal gets confused. Pages go missing. The database develops opinions.&lt;&#x2F;p&gt;
&lt;p&gt;Who knew. Everyone, apparently. There are entire wiki pages about this. I found them after the fact, which is the correct order of operations.&lt;&#x2F;p&gt;
&lt;p&gt;The fix involved stopping everything, copying the database locally, running &lt;code&gt;.recover&lt;&#x2F;code&gt; in the SQLite shell, moving it back, fixing permissions, restarting, and checking the logs with the energy of someone who has already accepted their fate. It worked. I didn&#x27;t tell anyone. I opened a beer and watched something on YouTube instead of on my perfectly functioning media server.&lt;&#x2F;p&gt;
&lt;p&gt;The lesson: keep your SQLite databases on local storage. The lesson I actually applied: added a cron job that backs up all the databases nightly. Progress.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-nas-mount-problem&quot;&gt;The NAS mount problem&lt;&#x2F;h2&gt;
&lt;p&gt;The media lives on a NAS, mounted over CIFS. Samba. Old reliable. On reboot, systemd would helpfully start all the *arr containers before the NAS was actually mounted — because it thought the mount was fine. The automount stub exists. &lt;code&gt;mountpoint -q &#x2F;mnt&#x2F;samba&lt;&#x2F;code&gt; returns true. The directory is there. Everything looks great. Nothing works.&lt;&#x2F;p&gt;
&lt;p&gt;This is a beautiful example of a system doing exactly what you told it to do, and not at all what you wanted.&lt;&#x2F;p&gt;
&lt;p&gt;The fix: a custom &lt;code&gt;wait-for-nas.service&lt;&#x2F;code&gt; that loops on &lt;code&gt;findmnt -t cifs &#x2F;mnt&#x2F;samba&lt;&#x2F;code&gt; until something real shows up. If the NAS isn&#x27;t there after an hour, we give up and log a failure. Practical. Slightly embarrassing. Runs at 4am when the power blinks and you wake up to find qBittorrent seeding nothing into the void.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-crowdsec-situation&quot;&gt;The CrowdSec situation&lt;&#x2F;h2&gt;
&lt;p&gt;CrowdSec is a security tool that reads your logs, detects attacks, and shares threat intelligence with the community. Great concept. I added it to the stack. It ran happily for weeks, detecting nothing, sharing nothing, quietly existing.&lt;&#x2F;p&gt;
&lt;p&gt;Turns out &lt;code&gt;acquis.yaml&lt;&#x2F;code&gt; — the config that tells CrowdSec which logs to read — was pointing to &lt;code&gt;&#x2F;does&#x2F;not&#x2F;exist&lt;&#x2F;code&gt;. An actual path I had copy-pasted from an example and never corrected. The security layer was blind. Watching nothing. Protecting nothing. Feeling good about itself.&lt;&#x2F;p&gt;
&lt;p&gt;Fixed now. Pointing at the actual Traefik log. CrowdSec has since detected several things and I feel considerably safer, or at least more informed about how many bots are trying to log into my Raspberry Pi.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-upside&quot;&gt;The upside&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s cheaper than Netflix. Nobody can cancel my subscription. The content library is exactly what I want, not what an algorithm thinks I want. I control the subtitles. I control the quality. I control the infrastructure — loosely, chaotically, but I control it.&lt;&#x2F;p&gt;
&lt;p&gt;Plex runs on a separate container on a Synology NAS. The Pi handles the downloading, the NAS handles the serving. I also have a Samsung 65&quot; OLED in the living room, which is arguably the most important piece of infrastructure in this whole setup.&lt;&#x2F;p&gt;
&lt;p&gt;I have personally watched maybe four things on it. Horror mostly, hard sci-fi when I&#x27;m feeling optimistic. Oppenheimer is still in the queue. Has been for a while. I built a home media server, debugged it at 4am, wrote a blog post about it at 5:30am on a Friday — but somehow there&#x27;s no time to watch a three-hour film about the guy who built the thing that could have ended the world.&lt;&#x2F;p&gt;
&lt;p&gt;The rest is just there, quietly existing at &lt;code&gt;&#x2F;mnt&#x2F;samba&lt;&#x2F;code&gt;, waiting for a version of me with more free time.&lt;&#x2F;p&gt;
&lt;p&gt;Worth it. Ask me again after the next reboot.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>I had spare time, spare Claude tokens, and a bottle of Jinro</title>
        <published>2026-06-12T00:00:00+00:00</published>
        <updated>2026-06-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://3847ad72.igorvrabie-dev.pages.dev/blog/jinro-and-a-website/"/>
        <id>https://3847ad72.igorvrabie-dev.pages.dev/blog/jinro-and-a-website/</id>
        
        <content type="html" xml:base="https://3847ad72.igorvrabie-dev.pages.dev/blog/jinro-and-a-website/">&lt;p&gt;Actually — five bottles. Korean rice wine. Light, they said. The Koreans clearly haven&#x27;t met Moldovans.&lt;&#x2F;p&gt;
&lt;p&gt;So there I was, past midnight in Chișinău, staring at a blank terminal and thinking: I should have a website. Not a portfolio. Not a personal brand. Just a corner of the internet that&#x27;s mine. No agenda.&lt;&#x2F;p&gt;
&lt;p&gt;I asked Claudiu — that&#x27;s what I call the AI — to help. Claudiu is fast, confident, and occasionally wrong in ways that make you question everything.&lt;&#x2F;p&gt;
&lt;p&gt;First order of business: a domain. &lt;code&gt;igorvrabie.dev&lt;&#x2F;code&gt; — registered directly on Cloudflare. Simple. Beautiful. Then things got interesting.&lt;&#x2F;p&gt;
&lt;p&gt;Claudiu suggested Zola — I was thinking WordPress, because of flashbacks. I used to do web development back in the day. I&#x27;m old. Zola is a static site generator written in Rust — fast, no database, no PHP, no trauma. I picked the colorized theme. Dark, minimal, exactly what I wanted. He set it up, wrote an about page about me, asked zero follow-up questions, and got most of it right. The BBQ part was my idea.&lt;&#x2F;p&gt;
&lt;p&gt;Then came Cloudflare Pages. Deploy the site, how hard can it be?&lt;&#x2F;p&gt;
&lt;p&gt;Very hard, apparently.&lt;&#x2F;p&gt;
&lt;p&gt;First, Claudiu confidently walked me into creating a Worker instead of a Pages project. Then the build failed because Zola wasn&#x27;t installed in the build environment. Then it failed because the project name was missing. Then because the API token had wrong permissions. Then a 522. Then I couldn&#x27;t copy the token because CF doesn&#x27;t show it twice and Claudiu suggested I screenshot it so he could read it from the image.&lt;&#x2F;p&gt;
&lt;p&gt;I called him a piece of shit at least four times. He took it well.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually I created a new token, Claudiu saved it to my &lt;code&gt;.zshrc&lt;&#x2F;code&gt;, hit the CF API directly, added the custom domain, triggered a redeploy — and it worked.&lt;&#x2F;p&gt;
&lt;p&gt;The whole thing took about three hours and exactly five bottles of Jinro.&lt;&#x2F;p&gt;
&lt;p&gt;Site&#x27;s live. Styles work. DNS propagated. Claudiu still has a job. For now.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to do the same — the theme is &lt;a href=&quot;https:&#x2F;&#x2F;colorized.life&quot;&gt;colorized&lt;&#x2F;a&gt; by &lt;a href=&quot;https:&#x2F;&#x2F;colorized.life&quot;&gt;Lany Atwood&lt;&#x2F;a&gt;, go give them some credit. Zola is free. Cloudflare Pages is free. The domain costs ~$10&#x2F;year. Jinro is optional but recommended. Claude tokens — you&#x27;ll figure it out.&lt;&#x2F;p&gt;
&lt;p&gt;If this is what having a website feels like, I understand why people just use LinkedIn.&lt;&#x2F;p&gt;
&lt;img src=&quot;jinro.png&quot; alt=&quot;Five bottles of Jinro soju — grapefruit, strawberry, green grape, peach, plum&quot; style=&quot;width:100%&quot;&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>I always wanted a private space on the internet</title>
        <published>2026-06-11T00:00:00+00:00</published>
        <updated>2026-06-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://3847ad72.igorvrabie-dev.pages.dev/blog/private-space/"/>
        <id>https://3847ad72.igorvrabie-dev.pages.dev/blog/private-space/</id>
        
        <content type="html" xml:base="https://3847ad72.igorvrabie-dev.pages.dev/blog/private-space/">&lt;p&gt;I always wanted a private space on the internet.&lt;&#x2F;p&gt;
&lt;p&gt;Not a portfolio. Not a personal brand. Not a place to impress anyone.&lt;&#x2F;p&gt;
&lt;p&gt;Just somewhere to write, think out loud, and share things I find interesting — on my own terms, at my own pace.&lt;&#x2F;p&gt;
&lt;p&gt;This is that place.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
