<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tech on Matinen.com</title>
    <link>https://matinen.com/categories/tech/</link>
    <description>Recent content in Tech on Matinen.com</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sat, 11 Apr 2026 12:00:00 +0100</lastBuildDate>
    <atom:link href="https://matinen.com/categories/tech/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How a New Kernel Killed My CIFS Share Speed</title>
      <link>https://matinen.com/cifs-cache-strict-torrent-stall/</link>
      <pubDate>Sat, 11 Apr 2026 12:00:00 +0100</pubDate>
      <guid>https://matinen.com/cifs-cache-strict-torrent-stall/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://matinen.com/images/cifs-cache-strict-torrent-stall.png&#34; alt=&#34;Header&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-symptom&#34;&gt;The Symptom&lt;/h2&gt;&#xA;&lt;p&gt;qBittorrent would start a torrent at a decent 2-3 MB/s and then crawl to zero within a couple of minutes. I tested with an Ubuntu ISO where the tracker reported over two thousand seeders, and still only a handful of peers would actually connect. At the same time Jellyfin streams felt laggy, and a few other containers bind-mounting the same NAS share were doing everything a little slower than they should.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tailbox: Split-Tunneling Through Mullvad via a Tailscale Container</title>
      <link>https://matinen.com/tailbox-mullvad-vpn-via-tailscale/</link>
      <pubDate>Tue, 07 Apr 2026 20:00:00 +0200</pubDate>
      <guid>https://matinen.com/tailbox-mullvad-vpn-via-tailscale/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://matinen.com/images/tailbox-mullvad-vpn-via-tailscale.png&#34; alt=&#34;Tailbox Architecture&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-tailbox&#34;&gt;What Is Tailbox&lt;/h2&gt;&#xA;&lt;p&gt;I spend most of my workday on a corporate VPN that owns the default route on my laptop. It needs to stay up for me to do my job, so tearing it down whenever I want to hide some other piece of traffic is not an option. What I actually wanted was this: keep the work tunnel up, and at the same time have specific browser tabs and specific shell commands exit through my home LAN via Mullvad. Split-tunnel in the browser and in the shell, not at the kernel route table.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Chat Control: 1984 Was a Warning, Not a Roadmap</title>
      <link>https://matinen.com/chatcontrol/</link>
      <pubDate>Sun, 05 Apr 2026 12:00:00 +0100</pubDate>
      <guid>https://matinen.com/chatcontrol/</guid>
      <description>&lt;div class=&#34;cc-banner-wrap&#34;&gt;&#xA;&lt;img src=&#34;https://matinen.com/images/chat-control-2-eu-mass-surveillance.png&#34; alt=&#34;Header&#34; class=&#34;cc-banner-img&#34;&gt;&#xA;&lt;div class=&#34;cc-banner-glow cc-banner-eye-flag&#34; id=&#34;ccBannerEye&#34; onclick=&#34;document.getElementById(&#39;ccBannerDrop&#39;).classList.toggle(&#39;active&#39;);event.stopPropagation();&#34;&gt;&#xA;&lt;svg viewBox=&#34;0 0 100 100&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;defs&gt;&#xA;&lt;radialGradient id=&#34;bannerEyeGrad&#34; cx=&#34;50%&#34; cy=&#34;50%&#34; r=&#34;50%&#34;&gt;&lt;stop offset=&#34;0%&#34; stop-color=&#34;#ffffff&#34; /&gt;&lt;stop offset=&#34;15%&#34; stop-color=&#34;#ff3333&#34; /&gt;&lt;stop offset=&#34;40%&#34; stop-color=&#34;#ff0000&#34; /&gt;&lt;stop offset=&#34;100%&#34; stop-color=&#34;transparent&#34; /&gt;&lt;/radialGradient&gt;&#xA;&lt;filter id=&#34;bannerEyeFilter&#34; x=&#34;-50%&#34; y=&#34;-50%&#34; width=&#34;200%&#34; height=&#34;200%&#34;&gt;&lt;feGaussianBlur stdDeviation=&#34;3&#34; /&gt;&lt;/filter&gt;&#xA;&lt;/defs&gt;&#xA;&lt;circle cx=&#34;50&#34; cy=&#34;50&#34; r=&#34;40&#34; fill=&#34;url(#bannerEyeGrad)&#34; filter=&#34;url(#bannerEyeFilter)&#34; class=&#34;cc-banner-pulse&#34;/&gt;&#xA;&lt;/svg&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;cc-banner-glow cc-banner-eye-robot&#34;&gt;&#xA;&lt;svg viewBox=&#34;0 0 100 100&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;defs&gt;&#xA;&lt;radialGradient id=&#34;bannerEyeGradR&#34; cx=&#34;50%&#34; cy=&#34;50%&#34; r=&#34;50%&#34;&gt;&lt;stop offset=&#34;0%&#34; stop-color=&#34;#ffffff&#34; /&gt;&lt;stop offset=&#34;15%&#34; stop-color=&#34;#ff3333&#34; /&gt;&lt;stop offset=&#34;40%&#34; stop-color=&#34;#ff0000&#34; /&gt;&lt;stop offset=&#34;100%&#34; stop-color=&#34;transparent&#34; /&gt;&lt;/radialGradient&gt;&#xA;&lt;filter id=&#34;bannerEyeFilterR&#34; x=&#34;-50%&#34; y=&#34;-50%&#34; width=&#34;200%&#34; height=&#34;200%&#34;&gt;&lt;feGaussianBlur stdDeviation=&#34;3&#34; /&gt;&lt;/filter&gt;&#xA;&lt;/defs&gt;&#xA;&lt;circle cx=&#34;50&#34; cy=&#34;50&#34; r=&#34;40&#34; fill=&#34;url(#bannerEyeGradR)&#34; filter=&#34;url(#bannerEyeFilterR)&#34; class=&#34;cc-banner-pulse&#34;/&gt;&#xA;&lt;/svg&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;cc-banner-glow cc-banner-eye-robot2&#34;&gt;&#xA;&lt;svg viewBox=&#34;0 0 100 100&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;&lt;defs&gt;&#xA;&lt;radialGradient id=&#34;bannerEyeGradR2&#34; cx=&#34;50%&#34; cy=&#34;50%&#34; r=&#34;50%&#34;&gt;&lt;stop offset=&#34;0%&#34; stop-color=&#34;#ffffff&#34; /&gt;&lt;stop offset=&#34;15%&#34; stop-color=&#34;#ff3333&#34; /&gt;&lt;stop offset=&#34;40%&#34; stop-color=&#34;#ff0000&#34; /&gt;&lt;stop offset=&#34;100%&#34; stop-color=&#34;transparent&#34; /&gt;&lt;/radialGradient&gt;&#xA;&lt;filter id=&#34;bannerEyeFilterR2&#34; x=&#34;-50%&#34; y=&#34;-50%&#34; width=&#34;200%&#34; height=&#34;200%&#34;&gt;&lt;feGaussianBlur stdDeviation=&#34;3&#34; /&gt;&lt;/filter&gt;&#xA;&lt;/defs&gt;&#xA;&lt;circle cx=&#34;50&#34; cy=&#34;50&#34; r=&#34;40&#34; fill=&#34;url(#bannerEyeGradR2)&#34; filter=&#34;url(#bannerEyeFilterR2)&#34; class=&#34;cc-banner-pulse&#34;/&gt;&#xA;&lt;/svg&gt;&#xA;&lt;/div&gt;&#xA;&lt;div class=&#34;cc-banner-tv-wrap&#34;&gt;&lt;div class=&#34;cc-banner-tv-glitch&#34;&gt;&lt;/div&gt;&lt;div class=&#34;cc-banner-tv-glitch cc-banner-tv-glitch-b&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;div class=&#34;cc-banner-dropdown&#34; id=&#34;ccBannerDrop&#34;&gt;&#xA;&lt;a href=&#34;https://matinen.com/chatcontrol&#34; target=&#34;_blank&#34;&gt;matinen.com/chatcontrol&lt;/a&gt;&#xA;&lt;a href=&#34;https://mullvad.net/en/chatcontrol&#34; target=&#34;_blank&#34;&gt;mullvad.net/en/chatcontrol&lt;/a&gt;&#xA;&lt;a href=&#34;https://chatcontrol.se/&#34; target=&#34;_blank&#34;&gt;chatcontrol.se/&lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;style&gt;&#xA;.cc-banner-wrap { position: relative; display: block; line-height: 0; margin-bottom: 1.5rem; }&#xA;.cc-banner-wrap img.cc-banner-img { width: 100%; height: auto; display: block; }&#xA;.cc-banner-glow { position: absolute; aspect-ratio: 1 / 1; transform: translate(-50%, -50%); }&#xA;.cc-banner-glow svg { width: 100%; height: 100%; display: block; overflow: visible; }&#xA;.cc-banner-eye-flag { left: 59.13%; top: 29.52%; width: 4.10%; pointer-events: auto; cursor: pointer; }&#xA;.cc-banner-eye-robot { left: 23.54%; top: 32.56%; width: 3.9%; pointer-events: none; }&#xA;.cc-banner-eye-robot2 { left: 10.55%; top: 26.48%; width: 2.2%; pointer-events: none; }&#xA;@keyframes ccBannerPulse { 0% { r: 35; opacity: 0.75; } 50% { r: 48; opacity: 1; } 100% { r: 35; opacity: 0.75; } }&#xA;.cc-banner-pulse { animation: ccBannerPulse 2s infinite ease-in-out; transform-origin: 50px 50px; }&#xA;.cc-banner-tv-wrap { position: absolute; left: 79.88%; top: 7.51%; width: 15.33%; height: 16.28%; overflow: hidden; pointer-events: none; }&#xA;.cc-banner-tv-glitch { position: absolute; inset: 0; mix-blend-mode: screen; background: linear-gradient(90deg, transparent 0%, rgba(0,255,255,0.7) 45%, rgba(255,0,255,0.7) 55%, transparent 100%); opacity: 0; animation: ccTvGlitch 10s infinite steps(1); }&#xA;.cc-banner-tv-glitch-b { background: linear-gradient(180deg, transparent 30%, rgba(255,0,0,0.5) 40%, rgba(0,255,255,0.5) 55%, transparent 70%); animation-delay: -0.05s; }&#xA;@keyframes ccTvGlitch {&#xA;  0%, 94% { opacity: 0; transform: translate(0,0); clip-path: inset(0 0 0 0); }&#xA;  94.5% { opacity: 0.7; transform: translateX(-4%); clip-path: inset(15% 0 65% 0); }&#xA;  95% { opacity: 0.8; transform: translateX(3%); clip-path: inset(40% 0 35% 0); }&#xA;  95.5% { opacity: 0.6; transform: translateX(-2%); clip-path: inset(65% 0 15% 0); }&#xA;  96% { opacity: 0.9; transform: translateX(5%); clip-path: inset(25% 0 45% 0); }&#xA;  96.5% { opacity: 0.5; transform: translateX(-3%); clip-path: inset(55% 0 25% 0); }&#xA;  97%, 100% { opacity: 0; transform: translate(0,0); clip-path: inset(0 0 0 0); }&#xA;}&#xA;.cc-banner-dropdown { position: absolute; top: calc(29.52% + 2.5%); left: 59.13%; transform: translate(-50%, 0); width: 260px; max-width: 90vw; background: rgba(10, 10, 10, 0.95); border: 1px solid #ff0000; border-radius: 8px; padding: 12px; box-shadow: 0 10px 40px rgba(0,0,0,0.8), 0 0 25px rgba(255, 0, 0, 0.3); opacity: 0; pointer-events: none; transition: opacity 0.3s ease; z-index: 100; backdrop-filter: blur(10px); }&#xA;.cc-banner-dropdown.active { opacity: 1; pointer-events: all; }&#xA;.cc-banner-dropdown a { display: block; padding: 8px 10px; font-family: &#39;Roboto Mono&#39;, monospace; font-size: 12px; color: #ccc; text-decoration: none; border: 1px solid #222; border-radius: 4px; margin-bottom: 6px; background: #000; transition: 0.2s; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }&#xA;.cc-banner-dropdown a:last-child { margin-bottom: 0; }&#xA;.cc-banner-dropdown a:hover { color: #FFDD00; border-color: #555; background: #080808; }&#xA;&lt;/style&gt;&#xA;&lt;script&gt;document.addEventListener(&#39;click&#39;,function(e){var d=document.getElementById(&#39;ccBannerDrop&#39;),b=document.getElementById(&#39;ccBannerEye&#39;);if(d&amp;&amp;b&amp;&amp;!d.contains(e.target)&amp;&amp;!b.contains(e.target)){d.classList.remove(&#39;active&#39;);}});&lt;/script&gt;&#xA;&lt;p&gt;George Orwell wrote his book 1984 as a warning, not an instruction manual. Apparently the EU Commission read it as the latter. Chat Control is the nickname for an EU legislative proposal that would force messaging apps, email providers and cloud services to scan every private message before it gets encrypted. The official pitch is &amp;ldquo;detecting child sexual abuse material.&amp;rdquo; The actual mechanism is client-side scanning of all your communications, on your own device, before the padlock even closes. The telescreen, but in your pocket.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VasttrafikT: A Telegram Bot and Mini App for Gothenburg Transit</title>
      <link>https://matinen.com/vasttrafikt-telegram-bot-gothenburg-transit/</link>
      <pubDate>Wed, 01 Apr 2026 15:00:00 +0200</pubDate>
      <guid>https://matinen.com/vasttrafikt-telegram-bot-gothenburg-transit/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://matinen.com/images/vasttrafikt-telegram-bot-gothenburg-transit.png&#34; alt=&#34;VasttrafikT&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-it-does&#34;&gt;What It Does&lt;/h2&gt;&#xA;&lt;p&gt;VasttrafikT is a Telegram bot (&lt;a href=&#34;https://t.me/vasttrafikt_bot&#34;&gt;@vasttrafikt_bot&lt;/a&gt;) and an accompanying Mini App (&lt;a href=&#34;https://vtt.tdwg.fi&#34;&gt;vtt.tdwg.fi&lt;/a&gt;) for checking real-time departures and planning trips on Gothenburg&amp;rsquo;s public transit. I built it because I wanted something faster than opening the Vasttrafik app every time I needed to check when the next tram leaves.&lt;/p&gt;&#xA;&lt;p&gt;Type &lt;code&gt;/a brunnsparken&lt;/code&gt; and you get a live departure board. Type &lt;code&gt;/r brunnsparken till lindholmen&lt;/code&gt; and you get trip suggestions. Or open the Mini App inside Telegram and tap your way through it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Buy Me a Lambo: The Ultimate CSS Crypto Donation Button</title>
      <link>https://matinen.com/buy-me-a-lambo-button/</link>
      <pubDate>Sat, 24 Jan 2026 23:51:13 +0100</pubDate>
      <guid>https://matinen.com/buy-me-a-lambo-button/</guid>
      <description>&lt;!-- Laddar fonten explicit här --&gt;&#xA;&lt;link href=&#34;https://fonts.googleapis.com/css2?family=Cookie&amp;display=swap&#34; rel=&#34;stylesheet&#34;&gt;&#xA;&lt;style&gt;&#xA;  /* Demo container */&#xA;  .demo-buttons {&#xA;    display: flex;&#xA;    flex-wrap: wrap;&#xA;    gap: 30px;&#xA;    justify-content: center;&#xA;    align-items: center;&#xA;    margin: 2rem 0;&#xA;    padding: 3rem 2rem;&#xA;    background: #050505;&#xA;    border-radius: 12px;&#xA;    overflow: visible;&#xA;    border: 1px solid #222;&#xA;  }&#xA;&#xA;  .demo-buttons button {&#xA;    cursor: default;&#xA;    font-family: inherit;&#xA;    border: none;&#xA;    outline: none;&#xA;    position: relative;&#xA;    user-select: none;&#xA;    flex-shrink: 0;&#xA;  }&#xA;&#xA;  /* --------------------------&#xA;     1. NITRO GLOW (Always Active)&#xA;     -------------------------- */&#xA;  .btn-neon {&#xA;    background: transparent;&#xA;    color: #fff;&#xA;    font-size: 16px;&#xA;    font-weight: bold;&#xA;    padding: 15px 30px;&#xA;    border-radius: 8px;&#xA;    z-index: 1;&#xA;  }&#xA;  .btn-neon::before {&#xA;    content: &#39;&#39;;&#xA;    position: absolute;&#xA;    top: -2px; left: -2px; right: -2px; bottom: -2px;&#xA;    background: linear-gradient(45deg, #ff0000, #ff7300, #fffb00, #48ff00, #00ffd5, #002bff, #7a00ff, #ff00c8, #ff0000);&#xA;    background-size: 400%;&#xA;    z-index: -2;&#xA;    filter: blur(5px);&#xA;    border-radius: 8px;&#xA;    animation: glowing 20s linear infinite;&#xA;    opacity: 1;&#xA;  }&#xA;  .btn-neon::after {&#xA;    z-index: -1; content: &#39;&#39;; position: absolute; inset: 0;&#xA;    background: #111; border-radius: 8px;&#xA;  }&#xA;  @keyframes glowing {&#xA;    0% { background-position: 0 0; }&#xA;    50% { background-position: 400% 0; }&#xA;    100% { background-position: 0 0; }&#xA;  }&#xA;&#xA;  /* --------------------------&#xA;     2. NEON PULSE (Always Pulsing)&#xA;     -------------------------- */&#xA;  .btn-pulse-banner {&#xA;    position: relative;&#xA;    padding: 1.5rem 3rem;&#xA;    font-size: 1.1rem;&#xA;    font-weight: 600;&#xA;    color: #fff;&#xA;    background: #000;&#xA;    border: 2px solid #0ff;&#xA;    box-shadow: 0 0 10px rgba(0, 255, 255, 0.3);&#xA;    overflow: visible;&#xA;    z-index: 1;&#xA;  }&#xA;&#xA;  .btn-pulse-banner::before,&#xA;  .btn-pulse-banner::after {&#xA;    content: &#34;&#34;;&#xA;    position: absolute;&#xA;    inset: -4px;&#xA;    border: 2px solid #0ff;&#xA;    border-radius: inherit;&#xA;    opacity: 0;&#xA;    z-index: -1;&#xA;    animation: pulseOut 2s ease-out infinite;&#xA;  }&#xA;&#xA;  .btn-pulse-banner::after {&#xA;    animation-delay: 1s;&#xA;  }&#xA;&#xA;  @keyframes pulseOut {&#xA;    0% { transform: scale(1); opacity: 1; }&#xA;    100% { transform: scale(1.5); opacity: 0; }&#xA;  }&#xA;&#xA;  /* --------------------------&#xA;     3. INFERNO (Always Burning)&#xA;     -------------------------- */&#xA;  .btn-inferno {&#xA;    font-size: 22px; font-weight: 900; color: #ffaa00;&#xA;    background: #100; padding: 20px 40px; border: 2px solid #ff4400;&#xA;    box-shadow: 0 0 10px #ff0000;&#xA;    text-transform: uppercase; letter-spacing: 2px;&#xA;    position: relative; overflow: visible; z-index: 1; border-radius: 5px;&#xA;    color: #fff; border-color: #fff; background: #500;&#xA;    box-shadow: 0 0 40px #ff4400, inset 0 0 20px #ff0000; text-shadow: 0 0 10px #ffaa00;&#xA;  }&#xA;  .btn-inferno span { position: relative; z-index: 2; }&#xA;  .btn-inferno .flame {&#xA;    position: absolute; bottom: 0; left: 0; width: 20px; height: 20px;&#xA;    background: radial-gradient(circle, #ffaa00 0%, #ff0000 60%, transparent 100%);&#xA;    border-radius: 50%; filter: blur(5px); opacity: 0; z-index: -1; pointer-events: none;&#xA;    animation: rise 1s ease-in infinite;&#xA;  }&#xA;  .btn-inferno .flame:nth-child(2) { left: 20%; width: 40px; height: 40px; animation-duration: 1.2s; animation-delay: 0.1s; opacity: 0.8; }&#xA;  .btn-inferno .flame:nth-child(3) { left: 50%; width: 30px; height: 30px; animation-duration: 0.8s; animation-delay: 0.2s; opacity: 0.8; }&#xA;  .btn-inferno .flame:nth-child(4) { left: 80%; width: 50px; height: 50px; animation-duration: 1.5s; animation-delay: 0s; opacity: 0.8; }&#xA;  .btn-inferno .flame:nth-child(5) { left: 35%; width: 25px; height: 25px; animation-duration: 0.9s; animation-delay: 0.3s; opacity: 0.8; }&#xA;&#xA;  @keyframes rise {&#xA;    0% { bottom: -10px; transform: translateX(0) scale(1); opacity: 0; }&#xA;    20% { opacity: 0.8; }&#xA;    50% { transform: translateX(-10px) scale(1.2); }&#xA;    100% { bottom: 100px; transform: translateX(10px) scale(0); opacity: 0; }&#xA;  }&#xA;&#xA;  /* --------------------------&#xA;     4. LAMBO (Corrected Font &amp; Always Active)&#xA;     -------------------------- */&#xA;  .btn-lambo-demo {&#xA;    /* Tvingar fonten här med !important */&#xA;    font-family: &#39;Cookie&#39;, cursive !important;&#xA;    font-weight: 400 !important;&#xA;&#xA;    background: transparent;&#xA;    color: #000000;&#xA;    font-size: 28px;&#xA;    padding: 10px 30px 10px 102px;&#xA;    border-radius: 50px;&#xA;    display: flex;&#xA;    align-items: center;&#xA;    position: relative;&#xA;    border: none;&#xA;    height: 60px;&#xA;    box-sizing: border-box;&#xA;    z-index: 1;&#xA;    overflow: visible;&#xA;    transform: translateY(-2px);&#xA;  }&#xA;&#xA;  /* 1. Glowing Border */&#xA;  .btn-lambo-demo::before {&#xA;    content: &#39;&#39;;&#xA;    position: absolute;&#xA;    top: -4px; left: -4px; right: -4px; bottom: -4px;&#xA;    background: linear-gradient(45deg, #ff0000, #ff7300, #fffb00, #48ff00, #00ffd5, #002bff, #7a00ff, #ff00c8, #ff0000);&#xA;    background-size: 400%;&#xA;    z-index: -2;&#xA;    filter: blur(5px);&#xA;    border-radius: 54px;&#xA;    opacity: 1;&#xA;    animation: glowing 20s linear infinite;&#xA;  }&#xA;&#xA;  /* 2. Yellow Body */&#xA;  .btn-lambo-demo::after {&#xA;    content: &#39;&#39;;&#xA;    position: absolute;&#xA;    inset: 0;&#xA;    background-color: #FFDD00;&#xA;    border-radius: 50px;&#xA;    z-index: -1;&#xA;  }&#xA;&#xA;  /* Car Animation */&#xA;  .btn-lambo-demo img.lambo-car {&#xA;    height: 92px;&#xA;    width: auto;&#xA;    position: absolute;&#xA;    left: 5px;&#xA;    top: 50%;&#xA;    transform: translateY(-50%) translateX(13px) skewX(-5deg) scale(1.1);&#xA;    filter: drop-shadow(0 5px 5px rgba(0,0,0,0.3));&#xA;    pointer-events: none;&#xA;    z-index: 10;&#xA;  }&#xA;&#xA;  /* COIN EXPLOSION */&#xA;  .btn-lambo-demo .lambo-coin {&#xA;    position: absolute;&#xA;    top: 50%; left: 50%;&#xA;    width: 28px; height: 28px;&#xA;    transform: translate(-50%, -50%) scale(0);&#xA;    pointer-events: none;&#xA;    z-index: 20;&#xA;    filter: drop-shadow(0 0 5px white);&#xA;    opacity: 0;&#xA;    animation: explode-loop 6s ease-out infinite;&#xA;  }&#xA;&#xA;  .btn-lambo-demo .lambo-coin:nth-of-type(2) { --x: -120px; --y: -100px; --r: -45deg; animation-delay: 0s; width: 32px; height: 32px; }&#xA;  .btn-lambo-demo .lambo-coin:nth-of-type(3) { --x: 120px; --y: -90px; --r: 45deg; animation-delay: 0.1s; width: 30px; height: 30px; }&#xA;  .btn-lambo-demo .lambo-coin:nth-of-type(4) { --x: -90px; --y: 100px; --r: -135deg; animation-delay: 0.05s; }&#xA;  .btn-lambo-demo .lambo-coin:nth-of-type(5) { --x: 90px; --y: 90px; --r: 135deg; animation-delay: 0.15s; }&#xA;  .btn-lambo-demo .lambo-coin:nth-of-type(6) { --x: 0px; --y: -130px; --r: 0deg; animation-delay: 0.2s; }&#xA;  .btn-lambo-demo .lambo-coin:nth-of-type(7) { --x: -140px; --y: 0px; --r: -90deg; animation-delay: 0.1s; }&#xA;  .btn-lambo-demo .lambo-coin:nth-of-type(8) { --x: 140px; --y: 20px; --r: 90deg; animation-delay: 0.25s; }&#xA;  .btn-lambo-demo .lambo-coin:nth-of-type(9) { --x: 0px; --y: 100px; --r: 180deg; animation-delay: 0.15s; }&#xA;&#xA;  @keyframes explode-loop {&#xA;    0% { transform: translate(-50%, -50%) scale(0.5); opacity: 1; }&#xA;    10% { opacity: 1; transform: translate(var(--x), var(--y)) scale(1.2) rotate(calc(720deg + var(--r))); }&#xA;    15% { opacity: 0; transform: translate(var(--x), var(--y)) scale(1.3) rotate(calc(720deg + var(--r))); }&#xA;    100% { opacity: 0; transform: translate(var(--x), var(--y)) scale(1.3); }&#xA;  }&#xA;&lt;/style&gt;&#xA;&lt;div class=&#34;demo-buttons&#34;&gt;&#xA;  &lt;!-- 1. Nitro --&gt;&#xA;  &lt;button class=&#34;btn-neon&#34;&gt;NITRO&lt;/button&gt;&#xA;  &lt;!-- 2. Neon Pulse --&gt;&#xA;  &lt;button class=&#34;btn-pulse-banner&#34;&gt;&#xA;    &lt;span&gt;Neon Pulse&lt;/span&gt;&#xA;  &lt;/button&gt;&#xA;  &lt;!-- 3. Inferno --&gt;&#xA;  &lt;button class=&#34;btn-inferno&#34;&gt;&#xA;    &lt;span&gt;INFERNO&lt;/span&gt;&#xA;    &lt;i class=&#34;flame&#34;&gt;&lt;/i&gt;&lt;i class=&#34;flame&#34;&gt;&lt;/i&gt;&lt;i class=&#34;flame&#34;&gt;&lt;/i&gt;&lt;i class=&#34;flame&#34;&gt;&lt;/i&gt;&lt;i class=&#34;flame&#34;&gt;&lt;/i&gt;&#xA;  &lt;/button&gt;&#xA;  &lt;!-- 4. Lambo (Animated Demo) --&gt;&#xA;  &lt;button class=&#34;btn-lambo-demo&#34;&gt;&#xA;    &lt;img src=&#34;https://matinen.com/images/lambo-stor.png&#34; class=&#34;lambo-car&#34; alt=&#34;Lambo&#34;&gt;&#xA;    &lt;span&gt;Buy me a Lambo&lt;/span&gt;&#xA;    &lt;!-- Coins --&gt;&#xA;    &lt;img src=&#34;https://matinen.com/icons/crypto/bitcoin.svg&#34; class=&#34;lambo-coin&#34;&gt;&#xA;    &lt;img src=&#34;https://matinen.com/icons/crypto/ethereum.svg&#34; class=&#34;lambo-coin&#34;&gt;&#xA;    &lt;img src=&#34;https://matinen.com/icons/crypto/solana.svg&#34; class=&#34;lambo-coin&#34;&gt;&#xA;    &lt;img src=&#34;https://matinen.com/icons/crypto/cardano.svg&#34; class=&#34;lambo-coin&#34;&gt;&#xA;    &lt;img src=&#34;https://matinen.com/icons/crypto/tron.svg&#34; class=&#34;lambo-coin&#34;&gt;&#xA;    &lt;img src=&#34;https://matinen.com/icons/crypto/dogecoin.svg&#34; class=&#34;lambo-coin&#34;&gt;&#xA;    &lt;img src=&#34;https://matinen.com/icons/crypto/toncoin.svg&#34; class=&#34;lambo-coin&#34;&gt;&#xA;    &lt;img src=&#34;https://matinen.com/icons/crypto/monero.svg&#34; class=&#34;lambo-coin&#34;&gt;&#xA;  &lt;/button&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;wen-lambo&#34;&gt;Wen Lambo?&lt;/h2&gt;&#xA;&lt;p&gt;In the crypto world, nobody asks &amp;ldquo;When Coffee?&amp;rdquo;. They ask &amp;ldquo;When Lambo?&amp;rdquo; (or &amp;ldquo;Wen Lambo?&amp;rdquo; if you&amp;rsquo;re deep in the meme culture). This simple observation sparked an idea: why not swap the familiar &amp;ldquo;Buy Me a Coffee&amp;rdquo; aesthetic for something more fitting to the crypto generation?&lt;/p&gt;</description>
    </item>
    <item>
      <title>My General AI Instructions</title>
      <link>https://matinen.com/ai-instructions/</link>
      <pubDate>Sun, 18 Jan 2026 16:00:00 +0100</pubDate>
      <guid>https://matinen.com/ai-instructions/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://matinen.com/images/ai-instructions.jpg&#34; alt=&#34;AI-Instructions&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;awakening&#34;&gt;Awakening&lt;/h2&gt;&#xA;&lt;p&gt;Over the last six months, I have become completely hooked with AI and /different AI tools in general. I find myself discovering new use cases almost daily, and the pace of development is honestly staggering.&lt;/p&gt;&#xA;&lt;p&gt;Recently, I’ve shifted heavily toward using &lt;strong&gt;Google Gemini&lt;/strong&gt;. The functionality is just broader right now, specifically features like NotebookLM and its deep integrations with the Google ecosystem.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-bait-and-switch-cycle&#34;&gt;The &amp;ldquo;Bait and Switch&amp;rdquo; Cycle&lt;/h3&gt;&#xA;&lt;p&gt;However, it’s not all perfect. I’ve noticed a frustrating trend that seems to plague the AI industry. When a new model drops (like the initial excitement around the latest Gemini releases), it feels incredibly smart, fast, and capable. But as time goes on, it feels like they turn down the &amp;ldquo;intelligence&amp;rdquo; dial and tighten the soft blocks on usage limits.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Configure Uptime Kuma in Docker</title>
      <link>https://matinen.com/setup-uptime-kuma-in-docker/</link>
      <pubDate>Sun, 23 Feb 2025 18:31:35 +0100</pubDate>
      <guid>https://matinen.com/setup-uptime-kuma-in-docker/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://matinen.com/images/image-5.png&#34; alt=&#34;Uptime&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Uptime Kuma is a self-hosted monitoring tool that allows you to keep track of your websites, services, and applications.&#xA;Here is a list of different Monitoring types supported by Uptime Kuma:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## General Monitor Type&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Group&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; HTTP(s)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; TCP Port&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Ping&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; HTTP(s) - Keyword&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; HTTP(s) - JSON Query&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; gRPC(s) - Keyword&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; DNS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Docker Container&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; HTTP(s) - Browser Engine (Chrome/Chromium) (Beta)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Passive Monitor Type&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Push&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Specific Monitor Type&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Steam Game Server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; GameDig&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; MQTT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Kafka Producer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Microsoft SQL Server (SQLServer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; PostgreSQL (Postgres)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; MySQL/MariaDB (MySQL)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; MongoDB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Radius&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Redis&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;step-1-create-a-directory-for-uptime-kuma&#34;&gt;Step 1: Create a Directory for Uptime Kuma&lt;/h2&gt;&#xA;&lt;p&gt;To keep your data persistent and organized, create a directory for Uptime Kuma’s data:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting Up Ansible for Legacy Python Environments</title>
      <link>https://matinen.com/setting-up-ansible-for-legazy-python-environments/</link>
      <pubDate>Sun, 16 Feb 2025 17:43:00 +0100</pubDate>
      <guid>https://matinen.com/setting-up-ansible-for-legazy-python-environments/</guid>
      <description>&lt;h6 id=&#34;setting-up-ansible-for-legacy-python-environments&#34;&gt;Setting Up Ansible for Legacy Python Environments&lt;/h6&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Last week, I learned a new fix for managing legacy Python environments with Ansible. This guide walks you through setting up an environment where you can use Ansible 2.10, which supports Python 2.7, using a tool called &lt;code&gt;uv&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;step-by-step-setup&#34;&gt;Step-by-Step Setup&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-install-uv&#34;&gt;1. Install uv&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; is a faster alternative to &lt;code&gt;pip&lt;/code&gt;, designed for creating Python virtual environments. To install &lt;code&gt;uv&lt;/code&gt;, you can use the following command:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Checkmk Downtime</title>
      <link>https://matinen.com/checkmk-downtime/</link>
      <pubDate>Fri, 10 Jan 2025 17:56:02 +0100</pubDate>
      <guid>https://matinen.com/checkmk-downtime/</guid>
      <description>&lt;h4 id=&#34;managing-downtime-with-ansible-and-checkmk&#34;&gt;Managing Downtime with Ansible and Checkmk&lt;/h4&gt;&#xA;&lt;p&gt;Ansible, combined with the tribe29.checkmk module, can automate the process of setting downtime in Checkmk monitoring. This article will guide you through installing the module, setting up your inventory, and writing and executing playbooks for scheduling and removing downtime.&lt;/p&gt;&#xA;&lt;h5 id=&#34;installation&#34;&gt;Installation&lt;/h5&gt;&#xA;&lt;p&gt;First, you need to install the Checkmk collection for Ansible:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ansible-galaxy collection install tribe29.checkmk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;documentation&#34;&gt;Documentation&lt;/h5&gt;&#xA;&lt;p&gt;To understand how to use the module, you can check its documentation:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
