<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Mudkip</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://mudkip.me/</id>
  <link href="https://mudkip.me/" rel="alternate"/>
  <link href="https://mudkip.me/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Mudkip</rights>
  <subtitle>Mudkip's Mud Sport Journal</subtitle>
  <title>Mudkip Mud Sport</title>
  <updated>2026-05-30T15:38:27.050Z</updated>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p>The theme of late 2025 to 2026 is building small certainties in a reality of uncertainties.</p><h2 id="New-DIY-NAS">New DIY NAS</h2><p><img src="/images/2026/02/metagross.jpg" alt="Metagross DIY NAS"></p><p>As Synology moves away from the consumer market, blocking 3rd party drives (though the decision was <a href="https://www.tomshardware.com/pc-components/nas/synology-walks-back-controversial-compatibility-policy-for-2025-nas-units-third-party-hdd-and-ssd-support-returns-with-diskstation-manager-7-3-update">reverted</a>) and dropping support for hardware transcoding even when the hardware supports it, I have been planning to build a new NAS using open-source solutions. The global memory crisis since late 2025 reminded me of my spare 32GB of DDR4 SODIMMs, as well as the 56TB of HDDs from my <a href="https://mudkip.me/2024/01/31/My-2023-Homelab-Setup/">backup NAS</a>.</p><p>My rule for the new NAS was simple: it must support DDR4 RAM, and ideally support SODIMM and/or dual-channel (since I have two 16GB DDR4 SODIMMs). My initial choice was the Aoostar WTR Pro 5825U, which seemed like a perfect match. However, multiple users were worried about its power constraints. Because it doesn’t support powering up the HDDs sequentially, the boot might fail if all 4 HDDs draw high wattage simultaneously. In the end, I settled on a custom build with a Topton Ryzen 7 5825U Motherboard, a Jonsbo N2 Case, and a Great Wall SFX PSU. I also sold the Synology DS916+ and recouped half of my upgrade expenses.</p><p>On the software side, I picked OpenMediaVault 8. The Web UI looks shabby compared to Synology but actually works quite well. Three of my drives were formatted with BTRFS and grouped as a <a href="https://github.com/trapexit/mergerfs">mergerfs</a> pool, the other is used as a parity drive for <a href="https://www.snapraid.it/">SnapRAID</a>. The setup operates similarly to RAID5 but feels much easier and safer. Even if two disks develop bad sectors, I would only lose a small amount of data. The only catch is that I can no longer afford a new HDD if any of them die out of warranty due to skyrocketing prices.</p><p>Using OMV-Extras, it’s easy to have containers and VMs managed right in the OpenMediaVault Web UI. I’ve also researched and settled on these Synology alternatives:</p><ul><li><a href="https://github.com/drakkan/sftpgo">SFTPGo</a> for WebDAV and SFTP access</li><li><a href="https://github.com/filebrowser/filebrowser">FileBrowser</a> for managing files on the web (though I still miss remote unzipping with Synology File Station)</li><li><a href="https://github.com/kopia/kopia">Kopia</a> for backups</li><li>Aria2 and qBittorrent for downloading <em>Linux ISOs</em></li><li>Frigate NVR as a Surveillance Station alternative</li></ul><p>I transferred my data using rsync from the DS1621+ and subsequently set up reverse rsync tasks to back up from the new NAS to the DS1621+. I named my new NAS “metagross.lan” for its massive storage size and computing power.</p><h2 id="Gaming-Devices">Gaming Devices</h2><p><img src="/images/2026/02/aynthor.jpg" alt="Ayn Thor, playing Kirby's Extra Epic Yarn dumped from my 3DS"></p><p>I’ve reshuffled my handheld gaming devices again. They are now the Nintendo Switch 2, Steam Deck OLED, and Ayn Thor.</p><p>The dual-screen Ayn Thor looks stunning when playing DS and 3DS games with upgraded resolutions and textures. It can emulate every retro system, and many PC games run nicely with GameHub thanks to the development of FEX-Emu. Tinkering with the configurations, emulators, local streaming setups, and front-ends is fun and provides a sense of control.</p><p>Sometimes I regret not building a new PC in 2025 when I could still afford RAM and SSDs, but I appreciate my old 12th-Gen Intel build and the new AMD RX 9070 XT GPU every day. Thanks to developments in the Linux kernel, Mesa drivers, GE-Proton, vkd3d, and various other components, gaming performance gets noticeably better every few weeks. For the games I’ve been playing recently, it’s easy to achieve a stable 100+ FPS at 4K maximum settings with FSR 4, even though I capped the GPU at a 70% power limit.</p><h2 id="Moe-Memos">Moe Memos</h2><p>I finally took the time to finish the major upgrade to <a href="https://memos.moe">Moe Memos</a> that I had been planning for over two years. It started out of frustration: slow loading times when I was away from home, the inability to use my own app when I was offline or having IPv6 connectivity issues, and all the minor headaches of aging code.</p><p>The new releases of both the iOS and Android versions can finally work offline and sync flawlessly (at least in my experience), and there are many improvements regarding attachments, Markdown support, widgets, and other minor details. It is once again my primary tool for capturing thoughts, managing to-dos, and even transferring files across devices.</p><p>Honestly, it was partly accomplished with the help of LLM agents, but I read and understand every line of code changed, and I have to admit the final product might be slightly better than what I could have written manually.</p><h2 id="Thoughts-on-A-and-I">Thoughts on A and I</h2><p>I’ve been discreetly trying various LLM tools and models in recent months, including Codex and OpenCode for writing and explaining code, OpenClaw as a personal assistant, and Gemini for regaining my mental health. They all work very well, and I can no longer treat this type of technology as just <em>slop</em>.</p><p>However, I feel pessimistic about the <a href="https://www.citriniresearch.com/p/2028gic">macroeconomic effects</a> caused by the development of AI, and I feel angry when I see CEOs expressing excitement over “productivity boosts”. As someone who writes code for a living, the “real work” part of my job is being completely replaced by typing a spell into the terminal and staring at the magic happening. It feels both interesting and vacant. I have a strong feeling that becoming unemployed is more a matter of “when” than “if”, as I know my skills will eventually no longer be needed in this new reality. I also feel scared of a future where <a href="https://xn--gckvb8fzb.com/hold-on-to-your-hardware/">we individuals can no longer afford computer components</a> and have to rent resources for everything.</p><p>But honestly, somehow I feel the current labor system should come to an end anyway, as it has been deteriorating across the whole planet for multiple decades. People have been working longer hours, doing more <a href="https://davidgraeber.org/books/bullshit-jobs/">bullshit jobs</a>, and corporations have been betraying societal benefit for power and profit, a.k.a. “shareholder value” all along, especially in the tech industry. And when critics point out that LLM training steals knowledge and infringes on copyright, I feel the current copyright system should come to an end too, as it was designed for monopoly and corporate profits instead of creative workers all along.</p><p>In the end, I respect AI vegetarians, and there are valid reasons to avoid and reject this type of technology, especially when it is controlled by oligarchs. But the world is moving in a direction where this progress can no longer be decelerated, and it is affecting everyone. The alternative might be guiding it to be controlled by the many. The progress of open weight models, which technically can be run by anyone with enough hardware, such as MiniMax M2.5, Kimi K2.5, GLM 5, and Qwen 3.5, is inspiring, and there might be similar hope for <a href="https://wccftech.com/cxmt-debuts-domestically-produced-ddr5-memory-8000-mtps-lpddr5-10667-mtps/">RAM</a> and other hardware.</p><h2 id="Trips-and-Live-Concerts">Trips and Live Concerts</h2><p><img src="/images/2026/02/neuweltfahrt.jpg" alt="Roselia Asia Tour - Neuweltfahrt at Zepp Osaka Bayside"></p><p>Somehow, over the past few years, anime music events and live concerts had become a weekly normalcy in my city. While I only attended a few, it felt good to be hopeful and always anticipating the next surprise from my favorite seiyuu groups. That all came to an end due to the diplomatic tensions that started in Nov 2025. I went through a kind of despondency but managed to navigate this new reality, and well, with the help of LLMs.</p><p>Nevertheless, I attended two BanG Dream! live concerts this January. <em>Poppin’Party New Year LIVE - Happy BanG Year!!</em> in Ariake was so much fun and deeply healing. The setlist was fabulous: <em>Setsunai Sandglass</em>, two versions of <em>Yes! BanG_Dream!</em>, and <em>Drive Your Heart</em> are all favorites of mine. I also enjoyed the pure fun vibe of the live performance, Hego’s sunglasses, Ayasa’s rattle-drum, and all the stage settings were incredibly amusing.</p><p>The second was <em>Roselia Asia Tour - Neuweltfahrt</em> at Zepp Osaka Bayside, which was originally planned for my local city. It was a challenging trip, as heavy fog delayed my plane for 5 hours. However, the livehouse experience was beyond exciting. The stage was very close, and the acoustics were fantastic. My tears burst out hearing <em>Ringing Bloom</em>, <em>Hidamari Rhodonite</em>, <em>Kiseki</em>, and <em>Yakusoku</em>. As Kudoharu said, “Please carry the energy for the ones who can’t come”, we shouted loudly: We went all out to win!</p><p>During these two speedrun trips, I also watched the movie <em>Love Live! Nijigasaki High School Idol Club Final Chapter Part 2</em> in a theater, and visited many places where the story of Nijigasaki happens around Odaiba, Ariake and Umeda.</p><p>What I learned from these trips, as well as everything that has recently happened on this planet, is actually similar to the story of Final Fantasy VII. The world is filled with “mako poisoning”, but we still have a need to protect our <em>Seventh Heaven</em>, our families, our hobbies, our homelabs, our NAS, and our self-hosted applications. In the end, the <em>lifestream</em> of this planet can be saved. As long as I have the <em><ruby><rb>Kakugo</rb><rt>覚悟</rt></ruby></em>, I can always find my <em><ruby><rb>Neuweltfahrt</rb><rt>新世界航路</rt></ruby></em>.</p>]]>
    </content>
    <id>https://mudkip.me/2026/02/26/Early-2026-Update/</id>
    <link href="https://mudkip.me/2026/02/26/Early-2026-Update/"/>
    <published>2026-02-26T02:35:04.000Z</published>
    <summary>
      <![CDATA[<p>The theme of late 2025 to 2026 is building small certainties in a reality of uncertainties.</p>
<h2 id="New-DIY-NAS">New DIY NAS</h2>
<p>]]>
    </summary>
    <title>Early 2026 Updates</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p>2025 has been an eventful year, with many developments in both real life and my hobbies.</p><h2 id="Home-Network">Home Network</h2><p>My family moved to a new place this summer, which provided an opportunity to upgrade the network setup once again.</p><p>Nowadays, ISP cable modems often also function as routers. Previously, I would ask my ISP to switch the modem to bridge mode and use my own OpenWRT router to connect via PPPoE. In our new home, the WAN connection is provided by the rental agency, and the cable modem is fully managed by the ISP. Neither the rental agency nor the ISP knows how to retrieve the PPPoE password, so they’re unable to switch the modem to bridge mode.</p><p>While I could register a new fiber WAN connection, the current speed of 500Mbps down / 40Mbps up is sufficient. Additionally, I still receive a /60 IPv6 pool. The IPv4 network is behind CGNAT (NAT Type B), regardless of whether the router uses DHCP or PPPoE.</p><p>The main challenge (and opportunity) is that there’s no network port in our bedroom. To solve this, I had to run an invisible fiber cable between the living room, where my homelab cabinet is located, and the bedroom, where I use my PC and gaming devices. This also gave me the chance to upgrade our intranet to a 10GbE/2.5GbE network.</p><p>The network switches I added include a XikeStor SKS3200-8E2X (eight 2.5GbE ports and two 10GbE ports) in my homelab cabinet and a SKS3200-5E2X (five 2.5GbE ports and two 10GbE ports) in the bedroom. I also installed a used Synology E10G18-T1 in the DS1621+, a pair of Sirivision SFP+ transceivers to link the two switches, two XikeStor SFP+ to RJ45 adapters for the DS1621+ and the NUC 12 Extreme PC, and a UGREEN 2.5G USB-C to Ethernet adapter for the iMac. As a result, I now have a 10Gbps connection between the NAS and the NUC 12 Extreme PC, along with 2.5Gbps connections for several other devices.</p><p>A week after setting up the intranet, I encountered a strange issue: whenever I transferred files from the NAS to the iMac or wireless devices, the network in our bedroom would freeze, even basic DNS requests would time out. Interestingly, I didn’t experience the same problem when transferring files in the opposite direction or from the NAS to the NUC, which has a 10GbE connection, even though those transfers were about three times faster.</p><p>After some research using ChatGPT, I discovered that the issue was caused by a feature called <a href="https://en.wikipedia.org/wiki/Ethernet_flow_control">flow control</a>. Fortunately, the XikeStor switches include a web-based admin interface, and the problem was resolved after I disabled flow control on the 10GbE ports.</p><h2 id="Devices-Reshuffle">Devices Reshuffle</h2><p>The biggest upgrade this year is the NUC 12 Extreme PC. The main issue with this machine was the unbearable noise during midnight gaming sessions. Fortunately, I found <a href="https://soulteary.com/2025/03/27/recent-heat-dissipation-upgrade-record-of-homelab.html">a solution</a> from another user with the same NUC model. I replaced the top case fans with three Thermalright TL-B9 units, and now the PC is much quieter.</p><p>Another major upgrade was the GPU. I replaced the RTX 3080 with a <a href="https://www.powercolor.com/product-detail212.htm">PowerColor Reaper RX 9070 XT</a>. AFAIK it’s the only modern mid-range GPU that fits inside the NUC 12 Extreme chassis. The RX 9070 XT performs significantly better in newer titles like <em>Clair Obscur: Expedition 33</em> and <em>Assassin’s Creed Shadows</em>, even when its TDP is limited to 70%. It’s also a relief to be free from NVIDIA-related issues on Linux, thanks to the switch to AMD. That said, I’m still waiting for <a href="https://www.phoronix.com/news/RADV-VK_EXT_shader_float8">Mesa 25.2</a> to enable FSR 4 support.</p><p>The display of my Minisforum V3 Tablet stopped working on January, and customer service informed me that they couldn’t repair it since the model is no longer in production. They offered a partial refund, which I found reasonable for a device I had used for nine months.</p><p>I also upgraded my <a href="https://mudkip.me/2024/02/28/Spiritual-Successor-to-the-Google-Nexus-7/">Lenovo Legion Y700</a> (Legion Tab) to the 3rd generation, which features the more powerful Snapdragon 8 Gen 3 chip. Although the 4th generation was released shortly afterward, the nano-textured display on the 3rd gen made the upgrade worthwhile.</p><p>Recently, I sold my Steam Deck LCD, Aya Odin 2 Pro, and Anbernic RG35XXSP. In their place, I picked up a Retroid Pocket Flip 2, as well as repurpose the Legion Tab for handheld gaming. The reason behind this shift is that game streaming from my PC to the Legion Tab delivers far better graphics and smoothness than any handheld PC like the Steam Deck. The Retroid Pocket Flip 2 strikes a great balance for retro game emulation and has a better screen than both the Odin 2 and the RG35XXSP. The Legion Tab also works well for DS and 3DS emulation with its vertical layout.</p><p>I also connected a spare dummy HDMI plug to the NUC 12 Extreme PC, disabled the automatic display turn-off in KDE settings (while keeping auto-sleep enabled since I can wake the system via WoL), and configured Sunshine to improve game streaming experience.</p><ul><li><p><strong>Do commands</strong>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">kscreen-doctor output.HDMI-A-2.<span class="built_in">enable</span> output.HDMI-A-2.mode.<span class="variable">$&#123;SUNSHINE_CLIENT_WIDTH&#125;</span>x<span class="variable">$&#123;SUNSHINE_CLIENT_HEIGHT&#125;</span>@60 output.DP-3.<span class="built_in">disable</span></span><br><span class="line">loginctl unlock-session</span><br></pre></td></tr></table></figure><p>This enables the dummy HDMI output at the correct resolution, disables the primary display, and unlocks the session if it’s locked.</p></li><li><p><strong>Undo command</strong>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kscreen-doctor output.HDMI-A-2.<span class="built_in">disable</span> output.DP-3.<span class="built_in">enable</span></span><br></pre></td></tr></table></figure><p>This disables the dummy output and re-enables the main display.</p></li></ul><p>Fortunately, I was able to get a Nintendo Switch 2 at a reasonable price (MSRP plus import tax) and received it on the morning of the second day after its release. Since then, the Switch 2 has been my primary gaming device, mainly for <em>Mario Kart World</em> and <em>Donkey Kong Bananza</em>. I’ve also restarted exploring Paldea in <em>Pokémon Scarlet</em> and returned to building my world in <em>Dragon Quest Builders 2</em>.</p><h2 id="Homelab">Homelab</h2><p>Little has changed in my <a href="https://mudkip.me/2024/01/31/My-2023-Homelab-Setup/">homelab</a>, though I did downsize it slightly to reduce power consumption. The k3s cluster of 4 VMs has been consolidated into a single-node VM, and the storage solution has been simplified with <a href="https://github.com/rancher/local-path-provisioner">local-path-provisioner</a>, which consumes no additional power and is easier to backup. Since I now prefer using the NUC 12 Extreme for game streaming, I’ve replaced the Bazzite and Windows VMs on the homelab PC with a <a href="https://projectbluefin.io/">Bluefin</a> installation, which runs various AI/ML experiments such as immich-machine-learning, <a href="https://ollama.com/">ollama</a>, and <a href="https://github.com/invoke-ai/InvokeAI">InvokeAI</a>.</p><p>The object storage on my NAS has been migrated from Minio to <a href="https://garagehq.deuxfleurs.fr/">Garage</a>, which offers much better performance for small files on the HDD RAID. I’ve also integrated <a href="https://pocket-id.org/">Pocket ID</a> and <a href="https://tinyauth.app/">Tinyauth</a> into some self-hosted apps, making logins easier and more secure. For photo backups, I’ve fully migrated to <a href="https://immich.app/">Immich</a> and no longer rely on Synology’s proprietary apps as <a href="https://nascompares.com/2025/04/16/synology-2025-nas-hard-drive-and-ssd-lock-in-confirmed-bye-bye-seagate-and-wd/">Synology is going fully user hostile</a>. However, I use PhotoSync on my iPhone because Immich currently doesn’t play well with iCloud (<a href="https://github.com/immich-app/immich/releases/tag/v1.136.0">this issue should be fixed soon</a>).</p><p>I also upgraded the cooling system in the homelab cabinet. The previously noisy fan, which was controlled via a smart plug, has been replaced with a Thermalright TL-G12B paired with a PWM controller mounted at the top. As a result, the average idle CPU temperature of the homelab PC dropped from 54°C to 48°C.</p><h2 id="52Poke">52Poké</h2><p>52Poké migrated to the Hetzner data center in Helsinki in February 2025. This move reduced monthly cloud service costs by 55% while maintaining the same server and storage configurations. It also lowered the risk of relying on a U.S.-based service provider, particularly one entangled in <a href="https://www.theverge.com/2025/1/19/24347325/tiktok-service-providers-penalties-apple-google-orcale-trump">geopolitical tensions</a>, which could pose potential risks for 52Poké as well.</p><p>During the migration, 52Poké was upgraded to <strong>MediaWiki 1.43</strong>, the current LTS release, along with several enhancements, including <a href="https://www.mediawiki.org/wiki/Extension:Math">Math</a>, <a href="https://www.mediawiki.org/wiki/Extension:VisualEditor">VisualEditor</a>, audio support via <a href="https://www.mediawiki.org/wiki/Extension:TimedMediaHandler">TimedMediaHandler</a>, SVG image support, and native lazy-loading.</p><p>In recent years, 52Poké Wiki has experienced increasingly aggressive and indistinguishable bot network crawling, which has led to a lower cache hit rate and occasional website slowdowns. This is likely due to developments in LLMs. For now, we have blocked known AI bots and enabled Cloudflare challenge mode for pages outside the main namespace.</p><h2 id="Side-Projects">Side Projects</h2><p>My side projects have been a bit quiet over the past few months, but I’m trying to rediscover the joy and slowly resume work on an experimental project, along with updates for Moe Memos, most importantly, the local storage feature.</p><p>It’s been somewhat of a burnout due to the breaking changes in the Memos API, which have required repeated effort and created both urgency and dilemma when updating Moe Memos. Thankfully, I’ve found <a href="https://github.com/mudkipme/mortis">a workaround to convert the APIs to older versions</a>. Moe Memos may still support the newer Memos API changes directly in future releases, as well as alternative backends, but it will no longer be a source of panic.</p><h2 id="Trips-and-Live-Concerts">Trips and Live Concerts</h2><p>I visited Tokyo again this June for <em><a href="https://www.lovelive-anime.jp/uranohoshi/live/live_detail.php?p=Aqours_Finale">Aqours Finale LoveLive! Eikyuu Stage</a> Day 2</em>, and also traveled to places like Ikebukuro, Shibuya, and Asakusa.</p><p>LoveLive! is a franchise that holds deep meaning in my life. I’ve been a fan of Aqours since nearly the very beginning, almost ten years ago. The story and music of the anime have always inspired me and given me strength. I attended several Aqours live concerts before the pandemic, including the 2nd Live held at the same dome as the Eikyuu Stage. These are truly some of my most cherished memories.</p><p>I enjoyed all 24 songs performed on Eikyuu Stage Day 2, every one of them is a favorite of mine. The joyful atmosphere helped ease the bittersweet reality that this was their final live. I especially loved <em><a href="https://www.youtube.com/watch?v=uGPjt1j9Z7M">MY Mai☆TONIGHT</a></em> and <em><a href="https://www.youtube.com/watch?v=zBnzYM375vQ">WATER BLUE NEW WORLD</a></em>, though it was a bit unfortunate they weren’t the full version. Hearing <em><a href="https://www.youtube.com/watch?v=sdxI33R8EJ0">HAPPY PARTY TRAIN</a></em> again and finally experiencing <em><a href="https://www.youtube.com/watch?v=r78ZX-_fDds">Mitaiken HORIZON</a></em> live was fantastic. The anime recap during the intermission brought back so many sweet memories.</p><p>I cried a lot, and laughed a lot. The Aqours rainbow created by the entire dome during the encore was a huge success. The powerful chorus of <em><a href="https://www.youtube.com/watch?v=1pTarTQDAuc">Yuuki wa Doko ni? Kimi no Mune ni!</a></em> was deeply moving. I couldn’t hold back my tears when Anju struck the “stop crying, smile, and thumbs-up” pose on the float.</p><p>What’s unique about <em>LoveLive! Sunshine!!</em> is how deeply it connects the beautiful city of <a href="https://www.city.numazu.shizuoka.jp/">Numazu</a> with the fans. For us, Numazu is not only the setting of the anime and the stories of Aqours, it’s also our spiritual hometown. I’ve visited twice and always felt warmly welcomed despite the language barrier. The city isn’t just decorated with franchise elements, the local residents also truly understand the work and are proud of the Aqours members as if they were their own children. We love Numazu not just because of LoveLive!, we love <a href="https://www.youtube.com/watch?v=UJ9zGXL63AU">its sky, Mt. Fuji, and the sunshine</a>.</p><p>It has been a long journey as a LoveLiver. Just as Rikyako said,<br>“だから、この先の人生もきっと、私も、みんなも、幸せなことがたくさん待っていると思います.”<br>I believe in that, too.</p>]]>
    </content>
    <id>https://mudkip.me/2025/07/28/Updates-2025-H1/</id>
    <link href="https://mudkip.me/2025/07/28/Updates-2025-H1/"/>
    <published>2025-07-28T23:53:33.000Z</published>
    <summary>
      <![CDATA[<p>2025 has been an eventful year, with many developments in both real life and my hobbies.</p>
<h2 id="Home-Network">Home Network</h2>
<p>M]]>
    </summary>
    <title>Updates 2025 H1</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p>This post is inspired by <a href="https://neilzone.co.uk/2024/10/10-things-i-find-joyful-about-computers-and-the-internet-in-2024/">Neil Brown</a>. Being mostly a pessimistic person, I often find myself worrying about the negative impact of technological developments in recent years. However, I’m still trying my best to find joy in the things I care about throughout the year.</p><h3 id="Wayland-and-NVIDIA-on-Linux-Have-Improved-Massively">Wayland and NVIDIA on Linux Have Improved Massively</h3><p>2024 has been my year of the Linux desktop. At the start of the year, I still had to rely on <a href="https://mudkip.me/2024/03/28/Notes-on-EndeavourOS/">numerous workarounds</a> to deal with frustrating issues on my desktop PC caused by NVIDIA’s lackluster Wayland support. However, NVIDIA’s driver improvements throughout the year—especially with <a href="https://zamundaaa.github.io/wayland/2024/04/05/explicit-sync.html">explicit sync</a>—along with advancements in Wayland protocols and better fractional scaling support in KDE and now <a href="https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3567">GNOME</a>, have made my Linux desktop experience practically flawless by default.</p><h3 id="The-Joy-of-Linux-Distributions-and-Hardware-Support">The Joy of Linux Distributions and Hardware Support</h3><p>There is so much joy in exploring and learning about recent developments in Linux distributions. My favorite ones—vanilla Fedora KDE, EndeavourOS, and Bazzite—are all quite versatile and stable. With BTRFS snapshots or immutable distros, we no longer need to worry that an upgrade or configuration change will break the system. The mainline Linux kernel is progressing rapidly to keep up with the latest x86 and ARM hardware. Asahi Linux now even offers out-of-the-box Steam support for Apple Silicon Macs.</p><h3 id="A-Bright-Future-for-Open-Handheld-PCs">A Bright Future for Open Handheld PCs</h3><p>Handheld PCs, pioneered by small manufacturers like GPD and AYANEO, have now become a much larger market thanks to developments like the Steam Deck, ROG Ally, and Legion Go. These devices boast far higher performance than traditional handhelds from Nintendo and Sony, and most importantly, they are <em>mostly</em> open hardware. Users can install any software they want, including alternative operating systems like Bazzite, without needing approval from corporations.</p><h3 id="The-Blossom-of-Retro-Handheld-Consoles-and-Emulation">The Blossom of Retro Handheld Consoles and Emulation</h3><p>Retro handhelds have also seen significant advancements in 2024, transforming what was once a niche market. Anbernic alone released 12 new handheld consoles this year. These devices, which run either Linux-based custom firmware or Android, are primarily used to play retro games from systems like the SNES, GBA, or PlayStation 1. Thanks to the declining cost of smartphone chips, we now have access to high-performance retro handhelds. One of my favorite journeys this year was installing custom firmware on my 3DS after the closure of the Nintendo eShop, backing up my digital purchases and save files, and finishing <em>Poochy &amp; Yoshi’s Woolly World</em> on the Ayn Odin 2 in HD. While Nintendo’s legal actions—or <a href="https://www.theverge.com/2024/12/27/24326278/nintendo-fake-takedowns-youtube-domtendo-dmca">those of fake Nintendo lawyers</a>—may pose challenges, I believe the joy and efforts in game preservation will persist.</p><h3 id="Performance-Per-Watt-Continues-to-Improve">Performance Per Watt Continues to Improve</h3><p>While Moore’s Law is effectively dead, linear advancements in computer performance continue to make life easier. Apple Silicon remains a standout in delivering exceptional performance with low power usage in its M4 series chips, and Snapdragon X is catching up quickly. With Intel’s Lunar Lake platform, high performance per watt is no longer exclusive to ARM. On the GPU side, the next generation of Radeon integrated graphics promises 4060-level gaming performance in new handhelds.</p><h3 id="Federated-Social-Networks-Enter-the-Mainstream">Federated Social Networks Enter the Mainstream</h3><p>The three major <em>post-Elon</em> social networks—Mastodon, Threads, and Bluesky—are all (at least <em>pretending to</em> for the latter two) embracing a future where social networks are connected via protocols and are no longer controlled by a single company. Personally, I mainly use Mastodon, but I’ve followed accounts from Threads, Misskey, WordPress, and Flipboard via ActivityPub, as well as established <a href="https://fed.brid.gy/docs">bridged</a> connections with Bluesky. I also set up a private GotoSocial instance in a lightweight container and use it with my <a href="https://phanpy.social/">favorite web app</a>, charmingly named after a Pokémon.</p><h3 id="Xiaomi-Released-an-Official-Home-Assistant-Integration">Xiaomi Released an Official Home Assistant Integration</h3><p>Matter has been disappointing in its failure to deliver on its promise of seamless smart home device integration without vendor lock-ins. However, the open-source Home Assistant has made home automation seamless through community-based integrations and workarounds. I don’t have many smart home devices, but all of mine support either HomeKit or Mi Home. While I’m still using <a href="https://github.com/al-one/hass-xiaomi-miot">hass-xiaomi-miot</a>, Xiaomi’s official integration eliminates the worry of open support for new devices.</p><h3 id="iOS-is-Opening-Up-At-Least-in-the-EU">iOS is Opening Up, At Least in the EU</h3><p>As someone who understands how computers work, I’ve always been frustrated by the dominance of systems where manufacturers, operating system vendors, or authorities control which apps users are allowed to install. In 2024, Apple was forced by the EU’s Digital Markets Act to allow users to install apps from alternative markets or directly from developers. While the <a href="https://mastodon.social/@maczydeco/113527850662678715">notorious notarization process</a> and the ridiculous Core Technology Fee persist, iOS is undeniably more open than ever. A surprising and delightful result of this change is that Apple now allows retro emulators and apps like Delta, making iOS devices <a href="https://www.macstories.net/stories/macstories-selects-2024-recognizing-the-best-apps-of-the-year/">more capable than ever</a>.</p><h3 id="The-Openness-and-Collaboration-in-LLMs-is-Breaking-Down-Walls">The Openness and Collaboration in LLMs is Breaking Down Walls</h3><p>I am acutely aware of the ecological and ethical impact of AI development and usage. However, I am cautiously testing LLMs to explore their capabilities and improve my digital life. I’ve found that open-source (though not technically according to the OSI) models like Llama and Qwen strike a somewhat acceptable balance. Just as blockchain technology once caused GPU prices to skyrocket, we gamers are now <a href="https://www.pcgamer.com/no-more-nvidia-rtx-4090-gpus-for-china-after-new-us-export-ban">caught in the middle again</a> by another GPU-reliant technology. Regulators are also turning AI into another frontline for geopolitical tensions and censorship. Despite this, the underlying architecture of this AI momentum remains largely open, with engineers ceaselessly collaborating on platforms like Hugging Face and GitHub. The breakthroughs in open models like DeepSeek-V3 continue to break down walls of silicon.</p>]]>
    </content>
    <id>https://mudkip.me/2024/12/31/9-Things-I-Find-Joyful-About-Tech-in-2024/</id>
    <link href="https://mudkip.me/2024/12/31/9-Things-I-Find-Joyful-About-Tech-in-2024/"/>
    <published>2024-12-31T23:57:55.000Z</published>
    <summary>
      <![CDATA[<p>This post is inspired by <a href="https://neilzone.co.uk/2024/10/10-things-i-find-joyful-about-computers-and-the-internet-in-2024/">Neil]]>
    </summary>
    <title>9 Things I Find Joyful About Tech in 2024</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p><img src="/images/2024/10/lovelive-series-asia-tour.jpg" alt="LoveLive! Series Asia Tour 2024 in Shanghai"></p><p>October 6, 2024, is a day I will never forget.</p><p>As a LoveLiver for nine years now, <em>LoveLive! Series</em> has been one of the franchises that has had a significant impact on my life. I have many unforgettable memories of both µ’s and Aqours. Although due to <ruby><em>the well-known reasons</em><rt>COVID</rt></ruby> and the busyness of real life, I could only watch the recent Aqours Lives, as well as those of Nijigasaki and Liella!, through livestreams, Blu-rays, or online videos, it wasn’t until I saw Liella! at Bilibili World last year and heard about the Asia tour and Aqours Finale this June that I realized once again how incredibly important it is to attend a live concert in person.</p><p>LoveLive! Series Asia Tour 2024-Shanghai stage began with a medley of opening songs from the four anime series, and when the three members of µ’s appeared—unchanged from eight years ago—the melody of <ruby><em>僕らは今のなかで</em><rt><em>Bokura no Ima no Naka de</em></rt></ruby> began playing, flooding my mind with countless memories. I had to repeatedly reassure myself that this was not a dream but the reality of the moment.</p><p>Then came Aqours’ performance. As expected, <ruby><em>恋になりたいAQUARIUM</em><rt><em>Koi ni Naritai AQUARIUM</em></rt></ruby> electrified the entire audience, and Ruby’s <ruby><em>コットンキャンディえいえいおー！</em><rt><em>Cotton Candy Ei-Ei-Oh!</em></rt></ruby> was an unexpected delight. I hadn’t listened to <em>Deep Resonance</em> much before, but there’s one line I love: “<ruby>壊れそうなこんな世界で 出会ったのは偶然じゃない<rt>In this fragile world, our meeting was no coincidence.</rt></ruby>” Finally, they performed <ruby><em>勇気はどこに？君の胸に！</em><rt><em>Yūki wa Doko ni? Kimi no Mune ni!</em></rt></ruby> which is one of my tied-for-top favorite songs. Every time I feel down, I listen to it, and I nearly cried while singing along this time.</p><p>Nijigasaki’s segment featured <em>TOKIMEKI Runners</em>, <em>Just Believe!!!</em>, and three solo songs I’m familiar with. Kasumin was adorable, and Shu-chan might have the best English skills in all of Japan. The crowd roared every time during <em>Eutopia</em>’s Chinese lyrics.</p><p>Next was a video from Hasunosora and the group performance of <em>Dream Believers</em>. I felt a little guilty for not following Hasunosora closely, but the overwhelming love the crowd showed them made me realize how much they mean to everyone. I bought three acrylic lottery figures, all of which turned out to be Tsuzuri, so I guess fate is telling me it’s time to catch up.</p><p>Liella!’s setlist was filled with songs I’ve been listening to a lot recently. I listened to Guangzhou’s setlist on the way here. <em>Tiny Stars</em> and <em>Starlight Prologue</em> were deeply moving, and all 11 members were adorable. There were plenty of shots of <ruby>KuuKaa<rt>合鲤</rt></ruby>, which made me very happy.</p><p>The climax was µ’s, the most intense part of the night. Even in the back of the arena, the floor was shaking. <ruby><em>僕らのLIVE 君とのLIFE</em><rt>Bokura no LIVE Kimi to no LIFE</rt></ruby> felt like it pulled us back over ten years, and the most exciting moment, of course, was <em>Snow Halation</em>. After eight years, I was once again surrounded by a sea of orange lights. The finale was a group performance of <em>No Brand Girls</em> and <em>Bring the LOVE!</em>, and I lost count of how many times we shouted “hihihi” and “oh yeah.” It wasn’t until I heard “<ruby>我一直很想见你<rt>I’ve always wanted to see you</rt></ruby>” that I snapped back to reality.</p><p>The MC segments awakened memories of classic call-and-responses: GanbaRuby, Yosoro, Ohayoshiko, Sashisuseso, and Fighto da yo, as well as calls I had only ever heard through a screen before, like Kasukasu, “<ruby>はんばあぐもいい<rt>Hamburgers are good</rt></ruby>,” and “<ruby>素晴らしい声の人<rt>Person with a wonderful voice</rt></ruby>.” For the first time, I shouted them in person. It was also a refreshing experience to have two members fluent in Mandarin. <ruby>Akina-chan<rt>菜宝</rt></ruby> also promoted Nijigasaki’s 7th Live and helped translate the members’ comments. When Aya-chan asked, “Has anyone been to the 2016 Fan Meeting?” I screamed out loud. At that moment, <a href="https://mudkip.me/2016/02/04/%CE%BC%E2%80%99s-Fan-meeting-in-Shanghai/">I felt so proud</a>, though I’m sure <ruby><em>one particular LoveLiver</em><rt>Liyuu</rt></ruby> backstage must have felt even prouder.</p><p>The Asia tour once again reminded me that <em>LoveLive!</em> is <ruby>みんなで叶える物語<rt>A story created together with everyone</rt></ruby>. The members of Aqours, Nijigasaki, Liella!, and Hasunosora, who have inherited this dream, were once Love Livers themselves. The orange miracle of <em>Snow Halation</em>, the legendary performances of µ’s and Aqours at Tokyo Dome and the Red &amp; White Song Battle, the production of the Nijigasaki anime and movie, and the light show of Guangzhou’s <em>Starlight Prologue</em> were all realized by everyone together, including the fans. The Chinese title of the tour “伴你圆梦,” which may link to that for many LoveLivers outside Japan, the last time they attended a live concert might have been in 2019 or even 2016. This Asia tour itself is the realization of a dream.</p><p>Although we often criticize LoveLive!'s management and Bandai Namco, and there are regrets about Aqours Finale, attending this tour made me realize once again how much we all love the <em>LoveLive! Series</em>. Music is such a beautiful thing that <ruby>breaks down walls<rt>壁は (Hi Hi Hi) 壊せるものさ</rt></ruby> and crosses borders. Next time we meet, it might be at Aqours Finale.</p><p><ruby>ラブライブ！最高！！<rt>いまが最高！</rt></ruby></p>]]>
    </content>
    <id>https://mudkip.me/2024/10/08/LoveLive-Series-Asia-Tour-2024/</id>
    <link href="https://mudkip.me/2024/10/08/LoveLive-Series-Asia-Tour-2024/"/>
    <published>2024-10-08T21:41:55.000Z</published>
    <summary>
      <![CDATA[<p><img src="/images/2024/10/lovelive-series-asia-tour.jpg" alt="LoveLive! Series Asia Tour 2024 in Shanghai"></p>
<p>October 6, 2024, is a]]>
    </summary>
    <title>みんなで叶える物語——LoveLive! Series Asia Tour 2024</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p><img src="/images/2024/09/hardware-software-services.webp" alt="Hardware, Software and Services"></p><p>An unpopular opinion that my past self would strongly disagree with, and perhaps my future self might too:</p><p><strong>The days when we needed to integrate hardware, software, and services are over.</strong> Apple has shown that this approach is harmful to consumers and innovation today, and the same holds true for Nintendo. We only need open platform hardware that allows users to run whatever software they want and use whatever services they prefer. While I believe Valve’s monopoly needs to be strongly challenged, Valve’s success with its own games, Steam, and the Steam Deck shows that a company can succeed in all three areas without locking them together. Future Nintendo devices should be open by default, capable of running Linux or Android games without using any exploits, and future Nintendo games should be available on PC. Square Enix’s investment in Playtron shows they understand what’s coming.</p><p>Apple makes great hardware and software, and its services—like iCloud with Advanced Data Protection, iMessages with end-to-end encryption, high-quality Apple TV+ shows, and the <a href="https://web.archive.org/web/20080107121341/http://www.apple.com/hotnews/thoughtsonmusic/">DRM-free</a> iTunes Music store—are truly exceptional. However, when these are integrated together, they create a monopoly. Apple today relies on “service revenue” to maintain its stock price, but much of this revenue isn’t genuinely about services. Instead, it largely comes from Google paying Apple to sustain their own illegal monopoly, and from the 30% “protection fees” charged on free-to-play games—essentially “<a href="https://catatp.fm/2021/06/03/atp433.mp3/#chapter7">casino games for children</a>”—at the cost of undermining the rights and choices of users, developers, and <a href="https://wavelengths.online/posts/thirty-percent">creators</a>. This situation is harmful to our civilization because, by being the only option for installing apps, the App Store becomes a tool for censorship and discrimination.</p><p>The Nintendo Switch was a major innovation in 2017. The concept of a small device that can be a portable console, a home console, and a tabletop system for friends to play together was definitely the right direction for gaming consoles. However, by 2024, the Nintendo Switch is underperforming and lagging behind the potential of Nintendo’s own games. Titles like Xenoblade, Pokémon, and Zelda could be significantly better if they can run on modern smartphone hardware, let alone on PCs, instead of on a 20nm processor released in 2015.</p><p>Sony announced the PlayStation 5 Pro this week, offering significant graphics upgrades for a dozen games. However, many of these titles can already be upgraded on a modern PC, thanks to Sony’s development of PC ports for PlayStation titles.</p><p>Joy-Con and DualSense controllers are fun and it’s fantastic that there are dedicated games that take advantage of their unique designs. However, they should use open standards like Bluetooth or USB and support general devices like PCs and phones. And guess what? They already do.</p><p>Today, we have a blooming market of dedicated handheld gaming consoles. If you follow NPC (<a href="https://www.macstories.net/npc/">Next Portable Console</a>), you’ll notice new handhelds being released between every two episodes. These devices run on Linux, Android, or Windows and each supports a game library larger than that of the Nintendo Switch, PlayStation, or Xbox. This trend is just beginning, and we will see even more devices in the future. Eventually, these open systems will collectively become a larger market than traditional locked-down consoles, and no single vendor will be big enough to establish a monopoly.</p><p>I believe the future of technology lies in open systems that prioritize user choice, innovation, and competition over monopolistic control. As demonstrated by the evolving market of handheld gaming devices and platforms like Steam, Epic and GOG, there is a growing demand for hardware that supports diverse software ecosystems without restrictive barriers. This shift will empower developers and creators to have more freedom and flexibility and let consumers retake the control over their own devices and contents.</p>]]>
    </content>
    <id>https://mudkip.me/2024/09/11/The-Integration-of-Hardware-Software-and-Services/</id>
    <link href="https://mudkip.me/2024/09/11/The-Integration-of-Hardware-Software-and-Services/"/>
    <published>2024-09-11T22:19:12.000Z</published>
    <summary>
      <![CDATA[<p><img src="/images/2024/09/hardware-software-services.webp" alt="Hardware, Software and Services"></p>
<p>An unpopular opinion that my pas]]>
    </summary>
    <title>The Integration of Hardware, Software and Services</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <category term="videogames" scheme="https://mudkip.me/tags/videogames/"/>
    <content>
      <![CDATA[<p><img src="/images/2024/05/like-a-dragon-1.jpg" alt="Ichiban Kasuga coming to Hawaii"></p><p>I was not always a fan of games based on contemporary realistic settings—unless they had supernatural or sci-fi elements, featured high school students who are a bit detached from mainstream values, or were set in the subculture haven of Akihabara.</p><p>My RPG journey started with Pokémon, a world where numerous unimaginable creatures coexist with humans, and continued with games like Final Fantasy VII, which intertwines magic and technology in a futuristic setting, or the Trails series’ modern heroic legends. The first time I was moved by a work with a realistic setting was Persona 5, when the sin-laden Japanese Prime Minister had his heart stolen by a group of high school students, confessing tearfully on a giant screen on the streets of Tokyo.</p><p>The Yakuza series was something I had heard of for years but never engaged with, partly because I was resistant to the overly realistic and somewhat dark themes, and partly because as a player who wasn’t good at action games, I couldn’t be attracted by the game’s combat system.</p><p>However, as a fan of adventure genres like <em>Ace Attorney</em> and <em>Danganronpa</em>, I was very interested in <em>Judgment</em>, which drew me into the world and stories of the Yakuza series. After that, I played <em>Yakuza 0</em>, <em>Yakuza: Like a Dragon</em>, and <em>Like a Dragon Gaiden: The Man Who Erased His Name</em> in succession, and was moved by the stories of characters like Kazuma Kiryu, Goro Majima, and Ichiban Kasuga. The familiar locations I had visited during my trips to Japan, especially Yokohama Chinatown and Osaka’s Sotenbori, felt particularly nostalgic.</p><p><em>Like a Dragon: Infinite Wealth</em> is the fifth game I’ve played in the series. I was looking forward to the new stage in Hawaii and how the story of Kazuma Kiryu, who has cancer, would unfold.</p><h2 id="Game-System">Game System</h2><p>Similar to <em>Yakuza: Like a Dragon</em>, <em>Like a Dragon: Infinite Wealth</em> is a turn-based RPG, which is my favorite type of game. In the past, Yakuza games provided difficulty settings for players like me who aren’t good at action to experience the story, but the two turn-based RPG games didn’t provide difficulty settings. In the later stages of <em>Yakuza: Like a Dragon</em>, I got into tough battles and still haven’t completed the last few chapters. However, <em>Like a Dragon: Infinite Wealth</em>’s difficulty curve, more flexible battle system, and rich content made me feel that not having difficulty settings was a better choice.</p><p>As a turn-based RPG, <em>Like a Dragon: Infinite Wealth</em> has a wealth of jobs, skills, and equipment, but on the other hand, it doesn’t have an overly complex growth system and doesn’t require remembering too much knowledge about items and jobs. The game’s hints are user-friendly, allowing one-click selection of the best equipment. Like modern Pokémon games, WEAK and RESIST are directly hinted at in battles. Even before important story events and battles, it suggests recommended levels and equipment star ratings to avoid the frustration of repeated failure due to insufficient preparation when challenging. The positioning and environment considerations in battles are intriguing, and even though I am not good at QTE, they didn’t result in severe consequences (with practice throughout the game, I got slightly better).</p><p>In all significant battles, I experienced a just-right level of difficulty, requiring me to optimize team output through job and skill combinations. When unprepared for type resistances or status immunities, I often needed to use items or skills to recover but could ultimately achieve victory at critical moments.</p><p>As a fan of Pokémon and Animal Crossing, I could smile knowingly in this game. <em>Yakuza: Like a Dragon</em> already had enough homage to the Pokémon series with the Sujidex system, the initial 3 Sujimon choices, and the Sujimon Professor. This installment even includes mechanisms to capture and raising Sujimon, Sujimon battles, and even a Sujimon tournament held in Hawaii - and in reality, the 2024 Pokémon World Championships will also be held in Hawaii. Dondoko Island also completely reproduces the gameplay of Animal Crossing, with some characters from the main and side stories appearing as guests on Dondoko Island. These homage elements are subtle enough for players to appreciate without falling into the pitfalls of imitation and plagiarism, thanks to confidence that the game’s own main content is sufficiently substantial.</p><h2 id="Setting-and-Story">Setting and Story</h2><p><img src="/images/2024/05/like-a-dragon-2.jpg" alt="Laid-off workers being homeless"></p><p>The Yakuza series’ previous settings mainly included Tokyo’s Kamurocho, Osaka’s Sotenbori, and Yokohama’s Isezaki Ijincho. This game introduces Hawaii outside Japan for the first time. Having played Pokémon Sun/Moon, the Honolulu setting in this game also conveys a similar atmosphere to the Alola region. The beautiful tropical scenery, beaches, coconut trees, surfboards, electric scooters, and the “Aloha” greetings all reflect a vibrant place. But just like the real history of Hawaii being annexed by the United States, Japanese laborers, and the Pacific War, beneath the surface of Hawaii in the work also lies gang activities, religious issues, and even international conspiracies that threaten human survival.</p><p>Both in Yokohama and Hawaii, the main and side stories incorporate many popular contemporary elements. Influencer economy, the popularity of online streaming and VTubers, manipulation of public opinion, random rumors causing online violence, workplace discrimination are all not uncommon topics in the real world in recent years. In <em>Like a Dragon Gaiden: The Man Who Erased His Name</em>’s Sotenbori, a young man relies entirely on “ChatDDT” for dating advice; in this game’s Ijincho where the homeless are sheltered, there are also ordinary people who have been laid off and fallen to the streets because their years of work skills have been replaced by robots. In Hawaii, topics about police and judicial corruption make it easy to think of events that have occurred in the United States in reality.</p><p><em>(The following parts contain mild spoilers for this game)</em></p><p>The game begins in Yokohama’s Isezaki Ijincho, where the protagonist, Ichiban Kasuga, becomes a Hello Work employee helping former yakuza members reintegrate into society amid the Great Dissolution, while Namba, Adachi, and Saeko have all started their own businesses. However, this peace turns to naught after an online livestream, and the “five-year antisocial force” rule becomes a shackle preventing many from returning to normal life, nearly turning them into sacrifices for an international conspiracy. These plots inevitably reflect the harshness of real-life “lifelines” where societal expectations set a standard route for everyone, and deviating slightly could lead to inescapable fates. The game doesn’t express opinions on these issues but encourages players to reflect through the characters’ perspectives.</p><p>The game also discusses the topic of nuclear waste, an issue of real-world controversy over nuclear energy safety and Fukushima’s radioactive water discharge. While not directly addressing real-life topics, the story of Kazuma Kiryu getting cancer because of it and the protagonist’s group stopping the sea shipment of nuclear waste both tell us ordinary people who have enjoyed the benefits brought by nuclear power plants that we have a duty to pay attention to and oversee the risks brought by nuclear energy.</p><p><img src="/images/2024/05/like-a-dragon-3.jpg" alt="俺を産んでくれて ありがとうございます"></p><p>The warmth of familial love in the game is touching, from Ichiban’s search for his birth mother to Chitose’s conflict and reconciliation with her family, and Wong Tou’s tragedy. Hearing Ichiban say “Thank you for giving birth to me” to Ms. Akane by the sea in Chapter 11 brought tears to my eyes.</p><h2 id="Characters">Characters</h2><p><img src="/images/2024/05/like-a-dragon-4.jpg" alt="Chitose and Ichiban"></p><p>Ichiban Kasuga continues to maintain the standard hero setting, considering others in everything he does, acting impulsively, trusting others too much, and handling romantic relationships in ways typical of many JRPG protagonists. In this work, Ichiban’s way of handling things lays the groundwork for major losses in the middle of the story, but on the other hand, it’s also the reason why Tomizawa and Chitose can join the team.</p><p>It’s regrettable that I haven’t experienced the six installments from Yakuza 1 to 6. My impression of Kazuma Kiryu is the tough guy with a strong sense of justice in <em>Yakuza 0</em> and the behind-the-scenes hero living under an assumed name in <em>Like a Dragon Gaiden: The Man Who Erased His Name</em>. In this game, Kiryu has a lot more human touch, learning to reconcile with himself and face his past in the experience of facing the threat of death, and learning to rely on his companions. This change may remind one of Rean from the Trails series.</p><p>The solid friendship between Namba, Adachi, and Ichiban established in <em>Yakuza: Like a Dragon</em> is further solidified in this game. In Namba’s Drink Link, when Namba discovers that his loss of job is not because of being implicated by the rumors about Ichiban, the player also breathes a sigh of relief.</p><p>The Yakuza series has many characters who suffered injustices, each with a story of downfall because of it, and the taxi driver Tomizawa is no exception. However, what’s rare is the courage to let go of the past after restarting in life and to bless the people you once knew.</p><p>Chitose always felt familiar to me, and I realized she was voiced by Anju Inami, who played Chika Takami in <em>LoveLive! Sunshine!!</em>. The character design also somewhat resembles Anju’s persona. Chitose is a charming and complex character. As a player, on one hand, I trust this companion like Ichiban does, but on the other hand, I’m also a bit worried that something will happen because of her (which does come true).</p><p>Saeko appears less in this game but leaves a strong impression with her date and rejection of Ichiban’s confession. However, in the conversation with Kiryu, you can actually feel that Saeko, like Ichiban, has a hard time facing her own heart.</p><p>Seonhee, Tianyou Zhao and Joongi Han, who led Yokohama’s underground world in the previous game, become playable characters in this work and provide considerable combat power to the protagonist’s team. Thinking of the Geomijul in the previous game still makes me shudder, but Seonhee’s job skills and status effects also make me chuckle.</p><p>The villains in this game, whether driven by misplaced hatred or just pure evil, nearly succeed in their conspiracy, which is inseparable from the support of the Japanese and American state apparatus and even the public, making one sigh with emotion. The English title “Infinite Wealth” is interpreted by the villains as the endless wealth generated by this conspiracy, but the lives of the protagonists and the story of their battle also give this title a more important explanation.</p><h2 id="Conclusion">Conclusion</h2><p><img src="/images/2024/05/like-a-dragon-5.jpg" alt="ありあまる富"></p><p>In an era dominated by free-to-play games, during the turbulent start of 2024 in the global gaming industry, it feels fortunate to experience an excellent single-player game like <em>Like a Dragon: Infinite Wealth</em> - in fact, the first two months of 2024 also had works that made people feel “it’s great to be alive” like <em>Persona 3 Reload</em>, <em>Apollo Justice: Ace Attorney Trilogy</em>, <em>Final Fantasy VII Rebirth</em>, as well as the exciting announcement of <em>Pokémon Legends Z-A</em>.</p><p><em>Like a Dragon: Infinite Wealth</em> addresses real-world issues, bringing to light the difficult-to-ignore yet unspeakable aspects of our world. The game uses Dragon Quest-style idealism to solve immediate problems but also highlights that the other side of this world, such as online rumors and violence, the “five-year antisocial force” rule, nuclear waste and pollution, cannot be resolved by politicians or individual heroes alone. Perhaps the most important artistic value of games is to inspire thought and try to create the possibility of a better real world.</p>]]>
    </content>
    <id>https://mudkip.me/2024/05/31/Thoughts-on-Like-a-Dragon-Infinite-Wealth/</id>
    <link href="https://mudkip.me/2024/05/31/Thoughts-on-Like-a-Dragon-Infinite-Wealth/"/>
    <published>2024-05-31T21:49:30.000Z</published>
    <summary>
      <![CDATA[<p><img src="/images/2024/05/like-a-dragon-1.jpg" alt="Ichiban Kasuga coming to Hawaii"></p>
<p>I was not always a fan of games based on con]]>
    </summary>
    <title>Thoughts on Like a Dragon: Infinite Wealth</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p><img src="/images/2024/04/v3-1.jpg" alt="Minisforum V3 AMD Tablet"></p><p><em><strong>Update:</strong> I have created an <a href="https://github.com/mudkipme/awesome-minisforum-v3">awesome-minisforum-v3</a> GitHub repository to list information for Minisforum V3 users, including some workarounds for the issues mentioned in this review.</em></p><hr><h2 id="Quest-for-the-Ideal-Portable-Linux-Device">Quest for the Ideal Portable Linux Device</h2><p>After my 2016 MacBook Pro experienced multiple hardware issues and was sent for recycling, I no longer have a personal laptop. Until recently, if I wish to do some programming in a coffee shop or during a family trip, my only options are the corporate-provisioned MacBook or my iPad Pro 2020, neither of which is ideal. I had hoped the iPad Pro could be more productive and tried various setups involving <a href="https://github.com/coder/code-server">code-server</a> and remote development, but I encountered many limitations. Furthermore, the fact that Apple has restricted iPadOS, preventing me from installing any software I want, has become increasingly uncomfortable for me in light of the recent <a href="https://www.apple.com/newsroom/2024/01/apple-announces-changes-to-ios-safari-and-the-app-store-in-the-european-union/">Digital Markets Act</a> and <a href="https://www.theverge.com/2024/3/21/24105363/apple-doj-monopoly-lawsuit">antitrust</a> discussions.</p><p>I adore the form factor of the iPad Pro as a travel computer, and the concept of a <a href="https://www.macstories.net/stories/macpad-how-i-created-the-hybrid-mac-ipad-laptop-and-tablet-that-apple-wont-make/">MacPad</a> is indeed extraordinary. However, I’m hesitant to invest significant time and money into a custom product that might not have the bless of its manufacturer. Additionally, memories of the Microsoft Surface have resurfaced. I owned a Surface 3 many years ago but sold it due to its performance not meeting my needs, eventually replacing it with a Hades Canyon mini PC.</p><p>As I’ve become more immersed in Linux, both through my <a href="https://mudkip.me/2024/01/31/My-2023-Homelab-Setup/">Homelab VMs</a> and my <a href="https://mudkip.me/2024/03/28/Notes-on-EndeavourOS/">desktop PC</a>, the idea of owning a portable Linux device appeals to me. However, I must confess that I’m not fond of the design of most mainstream non-Apple laptops, and Linux-friendly laptop brands like Framework, System76, and Starlabs are not yet available in my region. I’ve experimented with Asahi Linux on my iMac, and while it offers a generally great experience, the ARM Linux ecosystem, especially with 16K pages, doesn’t quite meet my daily needs.</p><p>Ultimately, I’m in search of a Surface-like device that offers good performance, runs Linux well, and is ultraportable. Although the Surface Pro 10 was released just as I began my search, Microsoft’s pricing strategy—essentially doubling the price of the whole device for adequate RAM and SSD—is unacceptable to me. It seems Microsoft has taken the wrong lessons from Apple in this regard, and I believe such pricing strategies should be considered unethical.</p><h2 id="Discovering-the-V3-Tablet">Discovering the V3 Tablet</h2><p>During my search, I discovered an intriguing product from Minisforum, a manufacturer renowned for creating NUC-like mini PCs, which has gained popularity within the Homelab community. The tablet, named “<a href="https://www.minisforum.com/page/v3/index.html">V3</a>,” has been in development for over a year. Initially, it was developed by another manufacturer with an AMD Ryzen 7 6800U processor. Later, Minisforum took over the project, replacing the processor first with the 7840U, and ultimately with the 8840U in the final product.</p><p>The tablet features a 14&quot; 2.5K 165Hz P3 color touch screen, a 50.82Wh battery, four speakers, front and rear cameras, and face and fingerprint unlocking, along with two USB4 ports. Surprisingly, it also features a USB-C port labeled “VLink” or “DP-in,” enabling the tablet to function as an external display for other devices. This is a feature I’ve long believed <a href="https://indieweb.social/@mudkip/112041394562007832">should be standard on all screens</a> and regret its absence in recent iMacs. My curiosity was piqued about how Linux would perform on this device.</p><p>The tablet was released on March 29 locally, and its price was set at 6999 CNY (~968 USD) for the configuration with 32GB DDR5 RAM and a 1TB SSD—a price point I consider quite reasonable. Early buyers were offered a keyboard case at no extra cost and had the opportunity to purchase the MPP 2.0 stylus for just 200 CNY (~28 USD). Moreover, it was <a href="https://www.bilibili.com/video/BV1bf421o7Qa/?t=1417">mentioned</a> that Linux runs on this tablet, with support for Ubuntu 22.04 and 23.10, albeit with “only a few minor issues” that are currently being addressed. I placed my order on day one and have been playing with it over the past few weeks.</p><h2 id="Initial-Experience">Initial Experience</h2><p>My first impressions of the V3 tablet were less than ideal, primarily due to Minisforum’s approach to selling and shipping the initial units. Although the kickstand and keyboard case were offered for free to early buyers, there was a catch: they were shipped <em>after</em> leaving a review on the online retailer JD. The absence of both the kickstand and the keyboard significantly detracted from the user experience. Additionally, a bug in Windows 11 prevented me from creating a PIN code to complete the setup, a problem that could only be resolved by connecting a USB keyboard. Placing the tablet on a table without the kickstand led to the air opening on the back being covered, which is far from ideal for airflow.</p><p>I believe that shipping the free kickstand and keyboard with the tablet would lead to more positive reviews by significantly improving initial customer satisfaction. I hope global customers won’t have to wait for the kickstand, keyboard, and stylus to be shipped separately, as international shipping could add to the frustration.</p><p>The V3 tablet comes with Windows 11 Pro, a detail I find quite welcoming, even I primarily intend to use Linux desktop on this device, as most laptops in this price range only come with the Home edition of Windows. The Pro edition grants users more control over BitLocker encryption, which is crucial for a portable device. Additionally, Hyper-V is important for those who need to install VMs on Windows.</p><p>The screen’s color and brightness are exceptional. Initially, I didn’t anticipate the 165Hz refresh rate to be a significant feature for this tablet, assuming that most games would struggle to run at 2K on the integrated GPU and that I didn’t have any videos exceeding 60Hz to watch. However, the difference in UI smoothness between 60Hz and 165Hz is stark, making it hard for me to revert to the lower refresh rate.</p><p>It’s somewhat disappointing that the tablet’s resolution is only 2.5K; at this screen size, I believe 2.8K or 3K would be optimal for 200% integer scaling. Nonetheless, given that KDE and Wayland now adequately support fractional scaling at 175% and the AMD GPU has good Wayland compatibility, this resolution is acceptable. Consequently, content on the V3 tablet appears as sharp as on MacBooks other than 14 and 16 inch MacBook Pro, which has 254 pixels per inch.</p><h2 id="Linux-on-the-Device">Linux on the Device</h2><p>Unlike my desktop PC, which runs EndeavourOS, I chose Fedora KDE for this tablet. My preference for Fedora stems from its relatively newer kernel and desktop environment, as well as its out-of-the-box support for secure boot. The latter is particularly crucial for a portable computer, allowing me to enable full disk encryption and set up automatic decryption via TPM with <code>systemd-cryptsetup</code>. My choice to stick with KDE was primarily due to its <a href="https://pointieststick.com/2022/06/17/this-week-in-kde-non-blurry-xwayland-apps/">excellent support</a> for scaling Xwayland applications. Although many GTK4 apps appeal to me—and I can still use them within KDE—GNOME has continued to <a href="https://discourse.gnome.org/t/xwayland-fractional-scaling-like-in-kde/17617">refuse</a> <a href="https://discourse.gnome.org/t/any-news-on-fixing-xwaylands-blurry-fractional-scaling/18163">to address</a> the issue of Xwayland apps appearing blurry on HiDPI displays.</p><p>I was concerned about hardware support on Linux, but my experience turned out to be reassuring. The touchscreen, keyboard, touchpad, Wi-Fi, USB, Bluetooth and suspend/sleep all work without any issues. It’s surprising that the fingerprint reader on the power button works right out of the box. After adding my fingerprint in KDE settings, not only can I use it on the lock screen, but I can also use my fingerprint to unlock <code>sudo</code> commands in Konsole with no extra setup. Both the front-facing and back cameras work well. I didn’t try face unlocking because I actually prefer using touch over face recognition.</p><p>Most apps I installed on V3 are similar to those on my desktop PC, only I use <code>dnf</code> instead of <code>pacman</code>. I don’t need to configure Wayland for Chromium and Electron apps, as Xwayland performs well with an AMD GPU. I couldn’t get Timeshift working with a btrfs filesystem inside a LUKS partition, so I switched to <code>btrfs-assistant</code> and <code>snapper</code> for automatically creating snapshots.</p><p>Enabling hardware acceleration for video playback in Fedora is somewhat weird. I need to add the RPMFusion repository and switch from <code>mesa-va-drivers</code> to <code>mesa-va-drivers-freeworld</code> to enable H.264 and HEVC hardware decoding, due to some absurd patent law issues.</p><h2 id="Using-the-V3-as-a-Linux-Tablet">Using the V3 as a Linux Tablet</h2><p><img src="/images/2024/04/v3-2.jpg" alt="KDE Tablet Mode and Handwritten Notes in Xournal++"></p><p>Using Linux with a touchscreen is as good as using Windows. I’ve used the desktop mode on the Steam Deck, and all the gestures are familiar. KDE has a “tablet mode” that enlarges the taskbar icons and many UI elements when I detach the keyboard, making it easier to tap.</p><p>The stylus is well-supported on Linux. Hover and pen pressure functionalities work great in apps like <a href="https://krita.org/">Krita</a> and <a href="https://xournalpp.github.io/">Xournal++</a>. It’s a pleasure to take handwritten notes and annotate PDFs on this tablet, especially with the 165Hz refresh rate. Using the stylus makes selecting text and navigating the UI easier than using my finger.</p><p>The on-screen keyboard is a bit tricky here. Both <a href="https://fcitx-im.org">Fcitx5</a> and <a href="https://maliit.github.io/">Maliit</a> use the virtual keyboard protocol on KDE Wayland. When the keyboard is attached, I use Fcitx5 for inputting Chinese or Japanese texts, and when detached, I switch to Maliit for the on-screen keyboard. I haven’t found a way to automatically switch between these two, but I believe it’s possible. Maliit supports multiple languages and can be configured with <code>gsettings set org.maliit.keyboard.maliit enabled-languages &quot;['en', 'zh-hans', 'ja', 'emoji']&quot;</code>.</p><p>I use <a href="https://waydro.id/">Waydroid</a> to run Android apps on the V3 tablet, with support for <a href="https://docs.waydro.id/faq/google-play-certification">Google Play</a> and <a href="https://github.com/casualsnek/waydroid_script">arm translation</a>. Some apps, like Google Play Books and Pocket Casts, work great. However, the performance and experience don’t compare to <a href="https://mudkip.me/2024/02/28/Spiritual-Successor-to-the-Google-Nexus-7/">a native Android tablet</a>. I considered using Microsoft OneNote as a cross-platform tool for my handwritten notes, but there’s a major issue with OneNote for Android on Waydroid—the handwriting doesn’t appear on the screen until I lift the stylus, touchpad, or finger. Another issue is video playback; while I have hardware acceleration in Linux apps like Firefox, mpv, and VLC, Android apps can only decode videos with the CPU, leading to worse battery life. Cameras do not work on Waydroid either.</p><p>One functionality missing in Linux on the V3 is automatic rotation. I have <code>iio-sensor-proxy</code> installed, and KDE Wayland should support automatic rotation out of the box. However, <code>monitor-sensors</code> reports there is no accelerometer. I hope Minisforum can address this issue with a driver or firmware update, or at least provide a DKMS module.</p><p>Another minor issue is that the volume keys on the side of the tablet only work when the keyboard is attached in Linux. I suspect this is a userland problem.</p><h2 id="Performance-and-Battery-Life">Performance and Battery Life</h2><p><img src="/images/2024/04/v3-3.jpg" alt="Watching Sound! Euphonium"></p><p>The performance of the AMD Ryzen 7 8840U is outstanding. It outperforms my M1 iMac in tasks such as building Android apps and the <code>7z b</code> benchmark. Its single-core performance surpasses that of my Core i7 12700 homelab PC, though the 12700 only performs better in multi-core tasks because it has four more E-cores. I haven’t conducted extensive benchmarks, and I haven’t yet managed to get Handbrake working with AMD VCN on Linux to test its hardware-accelerated video encoding speed. However, the KDE UI and most applications feel as fast as my Dragon Canyon desktop PC equipped with an RTX 3080. In some cases, it feels even snappier, due to the ongoing issues between NVIDIA and Wayland, which are expected to be <a href="https://zamundaaa.github.io/wayland/2024/04/05/explicit-sync.html">resolved</a> very soon.</p><p>During my normal usage in Linux, which includes web browsing with Firefox, video playback with Haruna Media Player (with <code>hwdec</code> set to <code>auto</code>), writing in Obsidian, and lightweight coding in Visual Studio Code and Android Studio, the tablet lasts for 6 hours. The battery life is not as long as that of Apple Silicon MacBooks but it is satisfactory to me and better than what I remember from using Intel MacBooks. The battery life might vary with Windows, potentially achieving longer duration.</p><p>Gaming on this tablet delivers performance in line with what you would expect from the Radeon 780M integrated GPU. I’ve tested it with two recent games I’m playing. I can play <em>Persona 3 Reload</em> at high settings (though with Ray-Traced Reflections disabled) at 1200p and 60fps. For <em>Like a Dragon: Infinite Wealth</em>, I achieve 55 to 60 fps at high settings (with FSR set to optimize for frame rate) in 1200p. Both games perform much better than on the Steam Deck. The frame rate only drops slightly when reducing the TDP from 28W to 15W, showcasing the efficiency of the GPU under varied power conditions.</p><p>The tablet is marketed as an “AI PC,” due to the AMD Ryzen 7 8840U processor, which features an XDNA NPU, and a keyboard equipped with a Copilot key. While local Large Language Models like Llama 2 perform rapidly and effectively using platforms like <a href="https://ollama.com/">ollama</a> and <a href="https://lmstudio.ai/">LM Studio</a>, I believe these currently run on the CPU. As of now, I am not aware of any AI products specifically utilizing the NPU, but AMD does provide <a href="https://www.amd.com/en/developer/resources/ryzen-ai-software.html">some tutorials</a> which might hint at future developments that could leverage the NPU for enhanced AI performance.</p><h2 id="Working-as-an-Portable-Display">Working as an Portable Display</h2><p>The external display feature of the V3 tablet, which makes it a “3 in 1” device, is unique. Although this feature is still in its early stages based on my testing, I believe it represents a promising start.</p><p>The VLink USB-C port only operates when the computer part of the tablet is shut down. Unfortunately, there appear to be compatibility issues, as it doesn’t work with my M1 Macs using a USB-C cable. I tried two cables that function with my Mac and the LG UL850 display, but neither could activate the V3’s display. However, it worked fine when connected to my desktop PC. I suspect that the issue might be resolved by using a USB-C to DisplayPort dongle and a DisplayPort to USB-C cable, but this solution is too cumbersome. I hope a firmware update can resolve this issue.</p><p>When used as an external display, the keyboard case can also function as an external USB keyboard. This is particularly useful in setups where I want to configure a NAS or mini PC for eventual headless operation. However, it seems the V3 only supports a 60Hz refresh rate when used as an external display, and I’m not sure if this is due to compatibility or cable issues.</p><p>Another feature I hope to see improved in the future is the ability to turn on the Nintendo Switch’s TV mode with just one USB-C cable. I understand that Nintendo doesn’t use standard display protocols, making this a challenging feature to implement. However, I’m aware of <a href="http://cforce.com.cn/html/Product/portable/">portable displays</a> that support this feature. It would be incredibly valuable for travel with the Nintendo Switch, and I would be willing to pay extra for this capability.</p><h2 id="Other-Hardware-Details">Other Hardware Details</h2><p>The form factor of the V3 tablet is similar to a Microsoft Surface Pro, especially when the keyboard is attached. However, the kickstand is separate from the tablet, which makes the entire setup slightly heavier. I prefer the integrated kickstand design of the Microsoft Surface and Nintendo Switch OLED, but the separate kickstand does provide a wider range of angles.</p><p>The tablet is completely sealed with no visible screws for opening, which raises concerns about long-term repairability, especially if the cooling system degrades over time. While a 1TB SSD is sufficient for my needs with this device, it would be beneficial for users who require more storage if it can replace the NVMe drive.</p><p>The speaker is loud and good, but there seems to be an issue with volume control in Linux. The global volume control can only mute or unmute the speaker, while the actual volume is controlled at the application level. I suspect there might be some driver issues, as when I use headphones, both the global and application level volume controls work well.</p><p>The keyboard case is quite pleasant to use. While I might still prefer the feel of the Magic Keyboard, this one comes close. The key layout feels just right. I particularly appreciate that the keyboard includes dedicated Home, Pg Up, Pg Dn, and End keys on the right side. This is especially useful to me, as I’m primarily familiar with macOS/Emacs shortcuts for these commands, which are not supported in Linux except within the terminal.</p><p>The fan noise is a mixed bag for me. During the day, even under heavy workloads, I can barely hear the fan. However, at midnight, when my room is completely silent, I can often hear a strange, faint buzzing noise coming from the tablet. This noise disappears when I run benchmarks or play games that maximize the fan speed. It’s not like the typical fan noise but resembles the sound of an HDD, though at a much lower volume. It seems this noise might be caused by the fan frequently changing speeds or being affected by the magnets in the tablet. I’d be interested to hear if others have experienced this issue, and if it turns out to be unique to my unit or an early production issue, I’ll replace it under warranty.</p><h2 id="Conclusion">Conclusion</h2><p>After two weeks of use, I consider the Minisforum V3 AMD Tablet to be a nearly perfect portable Linux device. It offers a promising blend of performance, versatility, and Linux compatibility at an acceptable price point. This tablet is an excellent start for tablets featuring AMD APUs and those that triple as external displays. However, I hope that the minor issues I’ve mentioned can be addressed, either through firmware updates or in the next iteration of the product. I also wish for some level of repairability, such as the ability for users to open the case to clean the fans or replace the NVMe drive. Looking ahead, I plan to bring the V3 tablet along for travel and weekends in coffee shops.</p>]]>
    </content>
    <id>https://mudkip.me/2024/04/14/A-Brief-Review-of-the-Minisforum-V3-AMD-Tablet/</id>
    <link href="https://mudkip.me/2024/04/14/A-Brief-Review-of-the-Minisforum-V3-AMD-Tablet/"/>
    <published>2024-04-14T15:00:35.000Z</published>
    <summary>
      <![CDATA[<p><img src="/images/2024/04/v3-1.jpg" alt="Minisforum V3 AMD Tablet"></p>
<p><em><strong>Update:</strong> I have created an <a href="https:]]>
    </summary>
    <title>A Brief Review of the Minisforum V3 AMD Tablet</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p><img src="/images/2024/03/plasma6.png" alt="KDE Plasma 6"></p><p>I have been using <a href="https://endeavouros.com/">EndeavourOS</a> on my Dragon Canyon NUC for months. It is my chosen Linux distribution because it offers an easy-to-install Arch Linux environment, and I am familiar with Arch Linux. I need to stay on the cutting edge for desktop environments, display protocols, and graphics drivers due to issues with NVIDIA and the Linux desktop (especially Wayland). Many developments are <a href="https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/967">happening</a> in real-time to improve them. With Arch Linux, I can easily install an AUR package from a merge request, as well as switch to beta drivers when they become <a href="https://github.com/NVIDIA/egl-wayland/pull/104#issuecomment-2010292221">available</a>.</p><p>Wayland is important to me because I’m using a 27&quot; 4K display. For the best visual size, it should be set to 150% fractional scaling. KDE Plasma supports fractional scaling under Wayland and has an option to “<a href="https://pointieststick.com/2022/06/17/this-week-in-kde-non-blurry-xwayland-apps/">let Xwayland applications scale themselves</a>” to prevent them from being blurry. That’s the reason I chose KDE as my desktop environment. Moreover, KDE Plasma 6 offers a nice experience both functionally and aesthetically.</p><p>Here is a note in Logseq that I use to track how I install and configure EndeavourOS. I’m interested in a declarative way to build operating systems and am slowly learning NixOS. However, in the meantime, I am very satisfied with my current EndeavourOS setup.</p><hr><ul><li>Configure the Windows Registry to use UTC hardware time:  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">reg add &quot;HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation&quot; /v RealTimeIsUniversal /d 1 /t REG_DWORD /f</span><br></pre></td></tr></table></figure></li><li>Disable Secure Boot and Fast Boot in the BIOS. If Fast Boot is enabled, accessing the BIOS by pressing F2 is difficult. Instead, I have to use Settings &gt; System &gt; Recovery &gt; Advanced startup in Windows, and after rebooting, choose Troubleshoot &gt; Advanced options &gt; UEFI Firmware Settings to access the BIOS.</li><li>Flash the EndeavourOS ISO to a USB disk using <a href="https://rufus.ie/en/">Rufus</a>, contrary to the <a href="https://discovery.endeavouros.com/installation/create-install-media-usb-key/2021/03/">documentation</a> on the EndeavourOS website. I had to choose the GPT partition and ISO mode to make my PC recognize the boot drive.</li><li>Change network settings in KDE settings: manually set the IP address and DNS and gateway to <code>192.168.1.2</code>.</li><li>Install EndeavourOS using the online installer, KDE desktop environment, erasing the Samsung 970 EVO disk with btrfs and without swap.</li><li>Eject the USB disk and reboot into EndeavourOS.</li><li>Install <code>nvidia-inst</code> using <code>yay</code> and run <code>nvidia-inst</code> to install the GPU driver, then reboot again.</li><li>Disable the Dummy HDMI Plug in Display Settings and set the scale to 150%; turn off Adaptive Sync.</li><li>Fix the suspend issue by preserving video memory <a href="https://wiki.archlinux.org/title/NVIDIA/Tips_and_tricks#Preserve_video_memory_after_suspend">as described here</a>:<ul><li><code>sudo nano /etc/modprobe.d/nvidia-power-management.conf</code><ul><li><code>options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/var/tmp</code></li></ul></li><li>sudo systemctl enable nvidia-suspend.service</li><li>sudo systemctl enable nvidia-hibernate.service</li><li>sudo reinstall-kernels</li></ul></li><li>Install the <code>xorg-xwayland-explicit-sync-git</code> and <code>egl-wayland-git</code> AUR packages using <code>yay</code>. This will make Xwayland issues with NVIDIA more manageable.</li><li>Install <code>fcitx5-im</code> and <code>fcitx5-chinese-addons</code> using <code>yay</code>, and select <em>Fcitx 5</em> in System Settings &gt; Keyboard &gt; Virtual Keyboard; add <em>Pinyin</em> as an Input Method.</li><li>Copy <code>.ssh/id_rsa</code>, <code>.ssh/config</code>, and <code>.ssh/id_rsa.pub</code> from Windows on the same device.</li><li>Enable <code>mdns</code> and <code>kdeconnect</code> in the Firewall configuration.</li><li>Configure Firefox:<ul><li>Extensions:<ul><li>Mainichi</li><li>uBlock Origin</li><li>Bitwarden</li><li>floccus</li></ul></li><li>Always show the bookmark bar.</li><li>Disable Recommend extensions and features as you browse.</li><li>Enable Proxy DNS when using SOCKS v5.</li><li>Disable DNS over HTTPS.</li><li>Disable Ask to save passwords.</li><li>Enable “Tell websites not to sell or share my data” and “Send websites a Do Not Track (DNT) request”.</li><li>Uncheck all checkboxes in Firefox Data Collection and Use.</li><li>Uncheck “Block dangerous and deceptive content”.</li><li>Toggle <code>identity.fxaccounts.enabled</code> to <code>false</code> in <code>about:config</code>.</li><li>Toggle <code>extensions.pocket.enabled</code> to <code>false</code> in <code>about:config</code>.</li><li>Set the homepage to “Blank Page”.</li></ul></li><li>Disable “Show small window previews when hovering over tasks” in task manager options.</li><li>Arch packages installed with <code>pacman</code>:<ul><li>flatpak</li><li>thunderbird</li><li>obsidian<ul><li>Create <code>.config/obsidian/user-flags.conf</code> with <code>--ozone-platform-hint=wayland --enable-wayland-ime</code>.</li></ul></li><li>bitwarden<ul><li>Create <code>.config/electron28-flags.conf</code> with the following content:  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">--ozone-platform-hint=wayland</span><br><span class="line">--enable-wayland-ime</span><br></pre></td></tr></table></figure></li></ul></li><li>fastfetch</li><li>docker<ul><li>Add the current user to the docker group: <code>sudo usermod -aG docker $USER</code>.</li></ul></li><li>cuda</li><li>libreoffice-fresh<ul><li>Create <code>.config/environment.d/env-vars.conf</code> with <code>SAL_USE_VCLPLUGIN=gtk3</code>. This can fix text and icon sizes.</li></ul></li><li>btop</li><li>htop</li><li>bottom</li><li>nvtop</li><li>gst-plugins-qsv</li><li>gst-plugins-bad</li><li>libva-utils</li><li>intel-media-driver</li><li>intel-media-sdk</li><li>intel-gpu-tools</li><li>handbrake</li><li>gimp</li><li>krita</li><li>thunderbird</li><li>kdenlive</li><li>remmina</li><li>freerdp</li><li>discover</li><li>kid3</li><li>merkuro</li><li>zanshin</li><li>tokodon</li><li>kasts</li><li>telegram-desktop</li><li>ttf-jetbrains-mono</li><li>zeal</li><li>kubectl</li><li>kubectx</li><li>zsh</li><li>rustup</li><li>nextcloud-client</li><li>neovim</li><li>tmux</li><li>inkscape</li><li>pastel</li><li>yt-dlp</li><li>k3b</li><li>bat</li><li>dust</li><li>git-delta</li><li>eza</li><li>eva</li><li>fd</li><li>gitui</li><li>glow</li><li>gron</li><li>xh</li><li>pipe-rename</li><li>procs</li><li>yazi</li><li>ttf-hack-nerd</li><li>rclone</li><li>ripgrep</li><li>silicon</li><li>skim</li><li>tokei</li><li>viu</li><li>zellij</li><li>timeshift<ul><li>Setup daily btrfs snapshots.</li><li><code>systemctl enable cronie</code>.</li></ul></li><li>nvidia-container-toolkit</li><li>speech-dispatcher</li><li>cmatrix</li></ul></li><li>AUR packages installed with <code>yay</code>:<ul><li>logseq-desktop-bin<ul><li>Note: Wayland has not been enabled for Logseq due to a bug causing the window to shrink with each start and occasional crashes on close.</li></ul></li><li>visual-studio-code-bin<ul><li>Create <code>.config/code-flags.conf</code> with the following content:  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">--ozone-platform-hint=wayland</span><br><span class="line">--enable-wayland-ime</span><br></pre></td></tr></table></figure></li></ul></li><li>vlc-git</li><li>xone-dkms</li><li>spotify<ul><li>Create <code>.config/spotify-flags.conf</code> with the following content:  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">--enable-features=UseOzonePlatform </span><br><span class="line">--ozone-platform=wayland</span><br><span class="line">--enable-wayland-ime</span><br></pre></td></tr></table></figure></li></ul></li><li>drawio-desktop</li><li>kopia-ui-bin<ul><li>Set up daily backups of the home directory.</li></ul></li><li>plex-mpv-shim<ul><li>Open TCP 3000 and UDP 32410-32414 ports in firewall settings.</li><li>Set up auto-start in <code>~/.config/systemd/user/plex-mpv-shim.service</code>:  <figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=Plex MPV Shim Service</span><br><span class="line"><span class="attr">After</span>=network.target</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=simple</span><br><span class="line"><span class="attr">ExecStart</span>=/usr/bin/plex-mpv-shim</span><br><span class="line"><span class="attr">Restart</span>=always</span><br><span class="line"><span class="attr">RestartSec</span>=<span class="number">3</span></span><br><span class="line"><span class="attr">Environment</span>=GDK_BACKEND=x11</span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=default.target</span><br></pre></td></tr></table></figure>  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">systemctl --user daemon-reload</span><br><span class="line">systemctl --user <span class="built_in">enable</span> plex-mpv-shim.service</span><br><span class="line">systemctl --user start plex-mpv-shim.service</span><br></pre></td></tr></table></figure></li></ul></li></ul></li><li>Flatpak apps:<ul><li>Ungoogled Chromium<ul><li>Create <code>~/.var/app/com.github.Eloston.UngoogledChromium/config/chromium-flags.conf</code> with <code>--ozone-platform-hint=wayland --enable-wayland-ime</code>.</li></ul></li><li>Android Studio</li><li>OpenLens</li><li>DBeaver Community</li><li>Zotero</li><li>Discord</li><li>Plexamp</li><li>Flatseal</li><li>Gear Lever</li></ul></li><li>AppImage apps:<ul><li>Insomnia</li></ul></li><li>Configure mpv for hardware decoding: create <code>~/.config/mpv.conf</code> and <code>~/.config/plex-mpv-shim/mpv.conf</code> with <code>hwdec=auto-copy</code>. Additionally, add the command <code>set hwdec auto-copy</code> in Haruna Media Player.</li><li>Install <code>prezto</code>:  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">zsh</span><br><span class="line"></span><br><span class="line">git <span class="built_in">clone</span> --recursive https://github.com/sorin-ionescu/prezto.git <span class="string">&quot;<span class="variable">$&#123;ZDOTDIR:-<span class="variable">$HOME</span>&#125;</span>/.zprezto&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">setopt</span> EXTENDED_GLOB</span><br><span class="line"><span class="keyword">for</span> rcfile <span class="keyword">in</span> <span class="string">&quot;<span class="variable">$&#123;ZDOTDIR:-<span class="variable">$HOME</span>&#125;</span>&quot;</span>/.zprezto/runcoms/^README.md(.N); <span class="keyword">do</span></span><br><span class="line"><span class="built_in">ln</span> -s <span class="string">&quot;<span class="variable">$rcfile</span>&quot;</span> <span class="string">&quot;<span class="variable">$&#123;ZDOTDIR:-<span class="variable">$HOME</span>&#125;</span>/.<span class="variable">$&#123;rcfile:t&#125;</span>&quot;</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line">chsh -s /bin/zsh</span><br></pre></td></tr></table></figure><ul><li>Configure Konsole command to <code>/bin/zsh</code></li><li>Add pmodules in <code>.zpreztorc</code>: <code>git</code>, <code>syntax-highlighting</code>, <code>ssh</code>, <code>tmux</code>, <code>fasd</code> before <code>prompt</code></li></ul></li><li>Install <code>goenv</code>:  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/go-nv/goenv.git ~/.goenv</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;export GOENV_ROOT=&quot;$HOME/.goenv&quot;&#x27;</span> &gt;&gt; ~/.zshenv</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;export PATH=&quot;$GOENV_ROOT/bin:$PATH&quot;&#x27;</span> &gt;&gt; ~/.zshenv</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;eval &quot;$(goenv init -)&quot;&#x27;</span> &gt;&gt; ~/.zshrc</span><br><span class="line">goenv install 1.22</span><br></pre></td></tr></table></figure></li><li>Install <code>fnm</code>:  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://fnm.vercel.app/install | bash</span><br><span class="line">fnm install 20</span><br></pre></td></tr></table></figure></li><li>Set up the rust toolchain and install some cargo applications:  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">rustup install stable</span><br><span class="line">cargo install cargo-update</span><br><span class="line">cargo install dtool</span><br><span class="line">cargo install --locked csview</span><br><span class="line">cargo install fclones</span><br></pre></td></tr></table></figure><ul><li>Append <code>export PATH=&quot;$HOME/.local/bin:$HOME/.cargo/bin:$PATH&quot;</code> to <code>.zshrc</code>.</li></ul></li><li>Append aliases to <code>.zshrc</code>:  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> comet-core=<span class="string">&quot;ssh comet-core.lan -t &#x27;tmux new-session -A -s main&#x27;&quot;</span></span><br><span class="line"><span class="built_in">alias</span> porygon2=<span class="string">&quot;ssh porygon2.lan -t &#x27;tmux new-session -A -s main&#x27;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">alias</span> vim=<span class="string">&quot;nvim&quot;</span></span><br><span class="line"><span class="built_in">alias</span> vi=<span class="string">&quot;nvim&quot;</span></span><br><span class="line"><span class="built_in">alias</span> vimdiff=<span class="string">&quot;nvim -d&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">export</span> EDITOR=<span class="string">&quot;nvim&quot;</span></span><br><span class="line"><span class="built_in">export</span> GIT_EDITOR=<span class="string">&quot;nvim&quot;</span></span><br></pre></td></tr></table></figure></li><li>Check that the Intel iGPU works for video encoding: <code>LIBVA_DRIVER_NAME=iHD vainfo --display drm --device /dev/dri/renderD129</code>.</li></ul>]]>
    </content>
    <id>https://mudkip.me/2024/03/28/Notes-on-EndeavourOS/</id>
    <link href="https://mudkip.me/2024/03/28/Notes-on-EndeavourOS/"/>
    <published>2024-03-28T00:02:07.000Z</published>
    <summary>
      <![CDATA[<p><img src="/images/2024/03/plasma6.png" alt="KDE Plasma 6"></p>
<p>I have been using <a href="https://endeavouros.com/">EndeavourOS</a> on]]>
    </summary>
    <title>Notes on EndeavourOS</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p><img src="/images/2024/02/lenovo-legion-y700.jpg" alt="Lenovo Legion Y700"></p><p>The <a href="https://en.wikipedia.org/wiki/Nexus_7_(2012)">Google Nexus 7</a>, released in 2012, is the first “small tablet computer” I can recall. It featured a pleasing 800p display, a powerful processor for its time, and shipped with a “stock Android” system. I used a Nexus 7 for a few years alongside an iPad Mini, which was subsequently replaced by a larger iPad Air 2. Although the device has not been with me for many years, the memories of reading manga on a perfectly sized device and the hackable Android experience, including running a bash shell and emulators, always lead me to seek the spiritual successor to the Google Nexus 7.</p><p>For the past two years, I have been using the <a href="https://www.gsmarena.com/lenovo_legion_y700-11394.php">Lenovo Legion Y700 (2022)</a> as my primary device for content consumption. It comes equipped with a Snapdragon 870 processor, 256GB of storage, 12GB of RAM, and an 8.8-inch 120Hz 2K display. Similar to the Google Nexus 7, there is an improved “2023” version featuring a Snapdragon 8 Gen 1 processor. However, the older 2022 model suffices for my needs, and I prefer its <em>advanced</em> 3.5mm audio port.</p><p>While the hardware performance is excellent and the freedom to install apps from various sources—such as Google Play, <a href="https://f-droid.org/">F-Droid</a>, GitHub, or directly from the developer’s website—<em>feels right</em>, I have never felt good about its ZUI operating system or any Android OEM system. I appreciate that Lenovo doesn’t include too much bloatware, doesn’t require me to log in to its account, and natively supports Google Play Services, but there are always moments when I encounter buggy or peculiar issues with some apps, or something just doesn’t seem right with the OS.</p><p>On the other side, for the past two years, a <a href="https://en.wikipedia.org/wiki/Pixel_6a">Google Pixel 6a</a> installed with <a href="https://grapheneos.org/">GrapheneOS</a> has been my secondary phone. While the hardware is decent, it kind of underperforms when compared to an iPhone or a Snapdragon 8-equipped Android device. However, the open-source operating system is more than just great. It offers many secure features, and even Google Play Services can be run in a sandbox to protect privacy and battery life. I can disable network access for Google Camera, Photos, and Gboard while still keeping their on-device ML features. Additionally, I can place some apps that I don’t trust as much in a Work Profile with <a href="https://f-droid.org/en/packages/net.typeblog.shelter/">Shelter</a>, making other apps and data invisible to these apps.</p><p>In the end, I learned that the bootloader of the Lenovo tablet can be unlocked, and I discovered <a href="https://android-developers.googleblog.com/2017/05/here-comes-treble-modular-base-for.html">Project Treble</a> and the Generic System Image (GSI), which enable the availability of custom Android distributions on most devices without excessive difficulties. Weeks ago, I followed <a href="https://www.youtube.com/watch?v=zQ0Guo1v9LA">this video</a> and installed <a href="https://crdroid.net/">crDroid</a> on my Lenovo Legion Y700.</p><p>crDroid, a fork of LineageOS, offers a pure and customizable Android experience. After experimenting with it for a few hours, I deeply regret not replacing the OS on this tablet sooner. Using an open-source stock-like Android system is incredibly refreshing. The UI is smooth, and I can truly appreciate the 120fps screen while navigating. It brings back memories from more than a decade ago with the Google Nexus 7, making me realize that I’m holding what could be considered the <strong>spiritual successor to the Google Nexus 7</strong>.</p><h2 id="System-Experience">System Experience</h2><p>As is common with most custom images lacking official support, there are a few caveats when using a GSI ROM on this tablet, but I can say that I have <em>fewer</em> issues with crDroid than with the stock ZUI.</p><p>The settings and issues worth noting are:</p><ul><li>120fps can be enabled under Settings &gt; Phh Treble Settings &gt; Misc features &gt; Force FPS, by setting it to 1600x2560@120.00001.</li><li>Lock screen rotation can be activated by going to Settings, searching for “rotation,” and selecting “Rotate lock screen.” I also enabled all rotation modes here.</li><li>The 3.5mm audio port does not work initially, but it can be fixed under Settings &gt; Phh Treble Settings &gt; Qualcomm features &gt; “Use alternate audio policy.”</li><li>The double-tap to wake feature is not operational yet, but, surprisingly, the Lenovo screen cover lock/unlock feature does work.</li><li>Adaptive brightness does not work.</li><li>Changing Wallpaper crashes initially, which is fixed by installing <a href="https://github.com/FossifyOrg/Gallery">Fossify Gallery</a>.</li></ul><p>The crDroid launcher is a lightweight fork of the Google Pixel launcher. Initially, I preferred it as it is similar to the launcher used in GrapheneOS, so I was already accustomed to it. However, there is an issue where the background of the app drawer remains dark even when using the light theme, which may be due to some compatibility issues with the tablet size or the enabling of the work profile. As a result, I switched to <a href="https://niagaralauncher.app">Niagara Launcher</a>, and it looks perfect.</p><p>I also learned a valuable lesson: Unlike Pixel phones, Lenovo does not allow the re-locking of the bootloader once a non-stock OS is installed. The first action I took after installing <a href="https://github.com/naz664/crDroid_gsi">crDroid_gsi</a> was attempting to re-lock the bootloader. Subsequently, the tablet became bricked, displaying a message that the system was corrupted and could not boot. Thankfully, the tablet could be unbricked by following <a href="https://xdaforums.com/t/guide-unbrick-lenovo-y700-tablet.4509297/">this guide</a>.</p><h2 id="Privacy-and-Security">Privacy and Security</h2><p>In terms of security, I’m content with the basic Android security model, but it’s important to note that the tablet is less secure than a Pixel equipped with GrapheneOS.</p><p>Keeping the bootloader unlocked is clearly a security risk, as theoretically, a thief with hardware access could install a hacked ROM to decrypt data on the device. Additionally, the face recognition feature on this device is less secure than Apple’s Face ID or the face unlock feature on the Pixel 8, meaning a thief could theoretically mimic my face to unlock this device.</p><p>I do not consider a tech-savvy thief attempting to access my data to be within my threat model. Nonetheless, I choose not to store sensitive data on this tablet, and I also disabled biometric unlock in <a href="https://bitwarden.com/">Bitwarden</a> after setting up most of my apps.</p><p>While crDroid does not come with sandboxed Google Play Services like GrapheneOS does, disabling the advertising ID, personalization, autofill, and location settings is sufficient for my privacy needs regarding Google.</p><p>One theoretical privacy threat when using mobile devices is the possibility of manufacturers or popular apps harvesting the list of installed apps on the device and potentially sharing this information with authorities, which could result in phone calls from “anti-fraud offices” warning about the risks of certain apps. While this is all theoretical and without neither any evidence nor my own experience, using an open-source system can definitely mitigate such threats. Similar to my setup on my Pixel phone, I use Shelter to isolate certain apps within a Work Profile.</p><h2 id="Apps">Apps</h2><p>Despite it being over a decade since the launch of Nexus 7, there are still not many Android apps optimized for tablet size. However, since Android does not restrict non-optimized apps to run in a centered window like the iPad, most Android apps function adequately on this smaller tablet. Additionally, the operating system supports basic multitasking features, such as split-screen.</p><p>I prefer to install apps from <a href="https://github.com/NeoApplications/Neo-Store">Neo Store</a> when possible, which is a frontend for F-Droid and also supports <a href="https://apt.izzysoft.de/fdroid/">IzzyOnDroid</a> by default. For apps that are only available through GitHub releases, I can update them automatically using <a href="https://github.com/ImranR98/Obtainium">Obtainium</a>.</p><p>Here is a list of apps worth mentioning on this tablet:</p><ul><li><strong><a href="https://github.com/uazo/cromite">Cromite</a></strong>: The default browser, featuring built-in ad blocking and privacy enhancements.</li><li><strong><a href="https://www.davx5.com/">DAVx5</a> and <a href="https://github.com/Etar-Group/Etar-Calendar">Etar</a></strong>: Used for syncing calendars with Nextcloud.</li><li><strong><a href="https://play.google.com/store/apps/details?id=allen.town.focus.reader">FocusReader</a></strong>: An RSS client connecting to <a href="https://github.com/miniflux/v2">Miniflux</a>.</li><li><strong><a href="https://gitnex.com/">GitNex</a></strong>: A client for <a href="https://forgejo.org">Forgejo</a>.</li><li><strong><a href="https://github.com/zhanghai/MaterialFiles">Material Files</a></strong>: A file manager supporting SMB.</li><li><strong><a href="https://github.com/mihonapp/mihon">Mihon</a></strong>: A manga reader and <a href="https://github.com/gotson/komga">Komga</a> client.</li><li><strong><a href="https://github.com/mudkipme/MoeMemosAndroid">Moe Memos</a></strong>: A note-taking app developed by me.</li><li><strong><a href="https://play.google.com/store/apps/details?id=com.mxtech.videoplayer.pro">MX Player Pro</a></strong>: Used for watching local videos not in my Plex library.</li><li><strong><a href="https://github.com/TeamNewPipe/NewPipe">NewPipe</a></strong>: Considered the best YouTube client.</li><li><strong><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.books">Play Books</a></strong>: Used for reading ePub books, chosen for its page-turn animation.</li><li><strong><a href="https://play.google.com/store/apps/details?id=com.plexapp.android">Plex</a> and <a href="https://play.google.com/store/apps/details?id=tv.plex.labs.plexamp">Plexamp</a></strong>: My primary media players.</li><li><strong><a href="https://github.com/j-fbriere/squawker">Squawker</a></strong>: Used to subscribe to voice actors from the former birdsite.</li><li><strong><a href="https://f-droid.org/en/packages/com.cosmos.unreddit/">Stealth</a></strong>: A Reddit client.</li><li><strong><a href="https://tasks.org/">Tasks.org</a></strong>: For to-do lists syncing with Nextcloud.</li><li><a href="https://termux.dev/">Termux</a>: A powerful terminal emulator.</li><li><strong><a href="https://github.com/erickok/transdroid">Transdroid</a></strong>: Used to manage my qBittorrent server.</li><li><strong><a href="https://tusky.app/">Tusky</a></strong>: A Mastodon client.</li><li><strong><a href="https://play.google.com/store/apps/details?id=com.mickstarify.zooforzotero">Zoo for Zotero</a></strong>: For reading from my PDF library.</li></ul><h2 id="Gaming">Gaming</h2><p>The Lenovo Legion Y700 is marketed as a “gaming tablet.” Although I am not a mobile gamer—since most modern mobile games adopt a freemium, casino-like business model that I feel detracts from the concept of video games as works of art—Android remains an excellent platform for emulation and game streaming. This tablet has the capability to emulate <a href="https://github.com/Trixarian/NetherSX2-classic">PS2</a> and <a href="https://play.google.com/store/apps/details?id=org.dolphinemu.dolphinemu">Wii</a> games at full speed with upscaled textures, as well as stream PC games via <a href="https://github.com/moonlight-stream/moonlight-android">Moonlight</a>, or PS5 games using <a href="https://play.google.com/store/apps/details?id=psplay.grill.com">PSPlay</a> or <a href="https://sr.ht/~thestr4ng3r/chiaki/">Chiaki</a>, all with negligible latency.</p><p>Gaming on Android devices represents a larger story for me, but it’s not particularly tied to this tablet or the Pixel phone. I’m keeping it a secret for now and may discuss it in more detail in the future.</p><h2 id="Conclusion">Conclusion</h2><p>The journey to find the spiritual successor to the Google Nexus 7 led me to the Lenovo Legion Y700, a device that, while initially not perfect due to its ZUI operating system, transformed into a nearly ideal tablet experience after installing crDroid. This shift back to a stock-like Android experience reminiscent of the Nexus 7 days has been both nostalgic and enlightening, proving that the essence of a great tablet is not just in its hardware but in the freedom and flexibility of its software. The Lenovo Legion Y700, with its powerful specs and the newfound joy of a pure Android experience, serves as a testament to the enduring appeal of customizable, user-centric technology. It reminds us that sometimes, the true successor to a beloved piece of technology is not about finding an identical replacement, but about recapturing the spirit of innovation and openness that made the original so special.</p>]]>
    </content>
    <id>https://mudkip.me/2024/02/28/Spiritual-Successor-to-the-Google-Nexus-7/</id>
    <link href="https://mudkip.me/2024/02/28/Spiritual-Successor-to-the-Google-Nexus-7/"/>
    <published>2024-02-28T01:48:05.000Z</published>
    <summary>
      <![CDATA[<p><img src="/images/2024/02/lenovo-legion-y700.jpg" alt="Lenovo Legion Y700"></p>
<p>The <a href="https://en.wikipedia.org/wiki/Nexus_7_(20]]>
    </summary>
    <title>Spiritual Successor to the Google Nexus 7</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <category term="homelab" scheme="https://mudkip.me/tags/homelab/"/>
    <content>
      <![CDATA[<p><img src="/images/2024/01/homelab.jpg" alt="Homelab, Illustrated By DALL·E"></p><p>Homelab is a place where you can store all your family’s data, self-host applications and services, locally stream media, and experiment with various technologies.</p><p>A Homelab can start with low-power devices such as a Raspberry Pi, or with hacking your router to install open-source firmware and run custom applications. It can also involve easy-to-use consumer NAS solutions like Synology. Alternatively, you might find yourself overwhelmed by used data center hardware.</p><p>Throughout 2023, I have been tinkering with my home network and computing setup, which has been both fun and rewarding.</p><h2 id="Hardware">Hardware</h2><p>Various devices operate continuously at my home. Some were shelved last year, but there are a few newcomers worth mentioning.</p><p>The router “Rotom,” which I use for my home’s internet, is an <a href="https://www.ikoolcore.com/products/ikoolcore-r1-pro">iKoolCore R1</a>. This compact device is powered by a Celeron N5105 processor and is equipped with 8GB of RAM, a 128GB SSD, and four 2.5GbE Ethernet ports. It runs <a href="https://www.proxmox.com/en/proxmox-virtual-environment/overview">Proxmox VE</a>, hosting an <a href="https://openwrt.org/">OpenWRT</a> VM as my primary firewall, and a Debian VM for several networking applications.</p><p>This summer, I noticed that the SSD became read-only on several occasions due to overheating. Fortunately, the manufacturer offers an R1 Pro upgrade kit. This kit replaces the case with a heatsink that directly contacts the NVMe SSD, effectively mitigating the overheating issue. Additionally, it includes a PWM fan, which keeps this compact computer silent in my closet.</p><p><img src="/images/2024/01/network-cabinet.jpg" alt="My Network Cabinet in Augest 2023"></p><p>I have a 15U network cabinet situated in the corner of my living room. At the bottom lies a <a href="https://www.santak.com/">Santak</a> TG-BOX 850 UPS, safeguarding the devices within the cabinet. Positioned in the middle is my NAS, acquired in 2020 – a <a href="https://www.synology.com/en-us/products/DS1621+">Synology DS1621+</a> equipped with six 8TB HGST drives and 12GB of ECC RAM. It’s set up in a RAID-6 configuration, providing a total storage capacity of 32TB.</p><p>At the top of the cabinet is the Homelab server “Porygon,” which I assembled in 2023. Inspired by <a href="https://taoofmac.com/space/blog/2023/02/18/1845">Tao of Mac</a>, it’s built around an <a href="https://www.asrock.com/nettop/Intel/DeskMeet%20B660%20Series/">ASRock DeskMeet B660</a> box. The configuration includes an Intel Core i7 12700 CPU, 128GB of DDR4 RAM, two NVMe SSDs (a WD SN770 2TB and an older Samsung 970 Evo Plus 1TB), and a Geforce RTX 3060 GPU.</p><p>The DeskMeet B660 also runs Proxmox VE. The integrated Iris Xe GPU is dedicated to a <a href="https://fedoraproject.org/workstation/">Fedora Workstation</a> VM for transcoding videos and offering a remote desktop. The RTX 3060 switches between a Windows VM, which I use for game streaming, and a Debian VM for doing AI experiments.</p><p>However, I’ve encountered heat issues with the “Porygon” server inside the network cabinet. The CPU, cooled by a <a href="https://noctua.at/en/nh-l9i-17xx">Noctua NH-L9i-17xx</a>, can quickly reach 100°C during moderately intensive tasks. The SSD, even with a heatsink, often heats up to 70°C. To address this, I implemented two solutions. Firstly, I replaced the PSU fan with a <a href="https://noctua.at/en/nf-a12x25-pwm">Noctua NF-A12</a>, which reduced the CPU temperature by 15°C, both at idle and under load, at the cost of <a href="https://indieweb.social/@mudkip/111661590832909428">injuring both my hands</a>. Secondly, I installed a dedicated cabinet fan controlled by a Xiaomi Smart Plug. When the SSD temperature hits 70°C, Home Assistant activates the fan, which turns off once the temperature drops below 65°C. Ultimately, I’m quite content with the new Homelab server. It’s usually quiet and energy-efficient, yet it can be exceptionally powerful when needed.</p><h2 id="Applications-and-Services">Applications and Services</h2><p>In my Homelab, I run a wide array of applications, catering to various needs. This includes network applications that ensure connectivity for my devices at home and allow me to access my home network remotely. I also use note-taking apps, read-later services, home automation systems, media management services, file synchronization programs, RSS readers, as well as a git server complemented by CI/CD pipelines. Moreover, I have dashboards in place to navigate and monitor all these applications efficiently. It’s fair to say that a significant portion of my digital life depends on these machines, which are entirely under my control at home.</p><p><img src="/images/2024/01/homepage.png" alt="Homepage Dashboard and my Applications"></p><h3 id="On-my-router-“Rotom”">On my router “Rotom”</h3><p>On the compact yet capable machine, I have set up two virtual machines and one LXC container to manage various services and applications.</p><p>One VM operates as my primary router OS, running OpenWRT. I’ve configured it with passthrough for three NIC ports. The WAN port connects to the modem provided by my ISP, while the LAN ports, in conjunction with the VM net port, establish a bridged LAN network. The majority of OpenWRT’s <a href="https://mudkip.me/2023/04/09/Project-Update-2023-Q1/#Home-Projects">configuration</a> revolves around DHCP settings and firewall rules.</p><p>In addition to the routing functions, “Rotom” hosts several other programs:</p><ul><li><strong><a href="https://github.com/jellyfin/jellyfin">Jellyfin</a></strong>: This serves as my secondary media center. I’m contemplating a switch from Plex to Jellyfin since it is fully open-source and doesn’t depend on a remote server.</li><li><strong><a href="https://github.com/fatedier/frp">frpc</a></strong>: This is for exposing certain services, like an SSH service that enables me to connect back to my home network. It’s useful because I have a CG-NAT IPv4 network. If I encounter a lack of IPv6 support in an external Wi-Fi network, I rely on frp to access my home network.</li><li><strong><a href="https://github.com/cloudflare/cloudflared">cloudflared</a></strong>: This acts as an alternative method for exposing services via Cloudflare Tunnels.</li><li><strong><a href="https://github.com/timothymiller/cloudflare-ddns">cloudflare-ddns</a></strong>: A dynamic DNS service that maintains an AAAA record, facilitating direct IPv6 connections back to my home.</li><li><strong><a href="https://github.com/traefik/traefik">traefik</a></strong>: This reverse proxy manages services not running on “Porygon.” I’ll detail the services running on the Homelab PC separately.</li></ul><p>Jellyfin operates within an LXC container, with the Intel iGPU passed through for video transcoding. The remaining services are housed in Docker containers running on a Debian VM. The Debian VM also functions as a <em>side router</em> for my Homelab PC and devices such as the Apple TV and Sonos One.</p><h3 id="On-my-Synology-NAS-“Uxie”">On my Synology NAS “Uxie”</h3><p>As my storage center, I need my NAS to be as robust as possible, so I haven’t installed too many applications on it.</p><p>In addition to standard NAS services like SMB, NFS, and File Station, the applications I use include:</p><ul><li><strong><a href="https://www.synology.com/en-global/dsm/feature/photos">Synology Photos</a></strong>: Backs up the photos of my family. I’m considering switching to an open-source solution like Immich, but the last time I tried, Immich didn’t integrate well with the iCloud Photo Library.</li><li><strong><a href="https://github.com/qbittorrent/qBittorrent">qBittorrent</a></strong> and <strong><a href="https://github.com/VueTorrent/VueTorrent">VueTorrent</a></strong>: Mostly used to download <em>Linux ISOs</em>.</li><li><strong><a href="https://github.com/aria2/aria2">aria2</a></strong>: Another tool for downloading <em>Linux ISOs</em>.</li><li><strong><a href="https://codeberg.org/forgejo/forgejo">Forgejo</a></strong>: A self-hosted Git server; it’s lightweight and a community fork of Gitea.</li><li><strong><a href="https://www.sonatype.com/products/sonatype-nexus-oss-download">Sonatype Nexus Repository</a></strong>: My private package manager for Docker and npm, and also a cache proxy for <a href="http://docker.io">docker.io</a> and <a href="http://ghcr.io">ghcr.io</a> to ensure all my applications can start without an internet connection.</li><li><strong><a href="https://github.com/minio/minio">MinIO</a></strong>: An S3-like object storage service for my other applications.</li><li><strong><a href="https://github.com/navidrome/navidrome">Navidrome</a></strong>: A lightweight music manager compatible with the Subsonic API.</li><li><strong><a href="https://github.com/Sonarr/Sonarr">Sonarr</a></strong>: An automatic media manager for anime and TV shows.</li><li><strong><a href="https://github.com/Radarr/Radarr">Radarr</a></strong>: An automatic media manager for movies.</li><li><strong><a href="https://github.com/morpheus65535/bazarr">Bazarr</a></strong>: A subtitle downloader for content in Sonarr and Radarr.</li></ul><p>Apart from first-party Synology apps, all third-party programs are running in Docker containers.</p><h3 id="A-Home-Kubernetes-Cluster-in-“Porygon”">A Home Kubernetes Cluster in “Porygon”</h3><p>I’ve migrated the <a href="https://github.com/k3s-io/k3s">k3s</a> control plane and worker VMs from Frost Canyon NUC “Comet” to my new Homelab PC. Most of my applications are running in this k3s cluster because it’s easy to maintain, upgrade, and recover. Building this has also been a great way to learn.</p><p>Here’s a list of applications running in this cluster:</p><ul><li><strong><a href="https://github.com/usememos/memos">Memos</a></strong>: My primary note-taking app for capturing my thoughts and ideas. I also developed the iOS and Android client titled “<a href="https://memos.moe/">Moe Memos</a>.”</li><li><strong><a href="https://github.com/miniflux/v2">Miniflux</a></strong>: My RSS reader. It supports the Fever and Google Reader API and can be connected to various RSS clients.</li><li><strong><a href="https://github.com/dani-garcia/vaultwarden">Vaultwarden</a></strong>: An unofficial server written in Rust for the open-source password manager Bitwarden. It’s more lightweight than the official server.</li><li><strong><a href="https://github.com/wallabag/wallabag">Wallabag</a></strong>: My link manager and “read later” app.</li><li><strong><a href="https://github.com/szabodanika/microbin">MicroBin</a></strong>: A text and file-sharing application for when I’m transferring things without Universal Clipboard.</li><li><strong><a href="https://github.com/nocodb/nocodb">NocoDB</a></strong>: An AirTable-like smart spreadsheet. I use it for personal project management and to track games and movies.</li><li><strong><a href="https://github.com/gotson/komga">Komga</a></strong>: My manga library. It supports OPDS clients like Panels and Mihon.</li><li><strong><a href="https://github.com/paperless-ngx/paperless-ngx">Paperless-ngx</a></strong>: A document management system for organizing scanned documents.</li><li><strong><a href="https://github.com/Stirling-Tools/Stirling-PDF">Stirling PDF</a></strong>: An all-in-one PDF toolkit.</li><li><strong><a href="https://github.com/advplyr/audiobookshelf">Audiobookshelf</a></strong>: I use it as an automatic podcast downloader.</li><li><strong><a href="https://github.com/photoview/photoview">Photoview</a></strong>: I use it to manage collected pictures <em>not</em> in my photo library, such as CD and Blu-ray booklets.</li><li><strong><a href="https://github.com/Prowlarr/Prowlarr">Prowlarr</a></strong> backed by <strong><a href="https://github.com/FlareSolverr/FlareSolverr">FlareSolverr</a></strong>: An indexer manager for Sonarr/Radarr.</li><li><strong><a href="https://github.com/Tzahi12345/YoutubeDL-Material">YoutubeDL-Material</a></strong>: Downloads videos from YouTube via <a href="https://github.com/yt-dlp/yt-dlp">yt-dlp</a>.</li><li><strong><a href="https://github.com/jgraph/drawio">draw.io</a></strong>: The most powerful diagramming tool.</li><li><strong><a href="https://github.com/kimai/kimai">Kimai</a></strong>: A self-hosted time tracker.</li><li><strong><a href="https://github.com/firefly-iii/firefly-iii">Firefly III</a></strong>: A self-hosted finance manager. I haven’t used it much yet.</li><li><strong><a href="https://github.com/node-red/node-red">Node-RED</a></strong> and <strong><a href="https://github.com/n8n-io/n8n">n8n</a></strong>: Powerful automation tools, but I haven’t used them much yet.</li><li><strong><a href="https://github.com/woodpecker-ci/woodpecker">Woodpecker CI</a></strong>: A Kubernetes native continuous integration solution.</li></ul><p>The manifest of my Kubernetes cluster is managed in a Git repository and is automatically deployed via a GitOps tool named <a href="https://github.com/fluxcd/flux2">Flux CD</a>. When I push changes to the repository, such as adding a new application or upgrading Docker images, the deployment occurs within a few minutes.</p><p>Recently, I discovered a powerful tool named <a href="https://github.com/renovatebot/renovate">Renovate Bot</a>. It scans my Kubernetes manifest repository every few hours to identify which Helm releases or container image tags require upgrades and then creates pull requests in Forgejo, similar to how Dependabot operates on GitHub.</p><p>In addition to the applications I’m running, my setup includes the <a href="https://github.com/kubernetes/ingress-nginx">Ingress NGINX Controller</a>, <a href="https://github.com/metallb/metallb">MetalLB</a>, and <a href="https://github.com/cert-manager/cert-manager">cert-manager</a> to facilitate service access and manage certificates. The data for these applications is stored on <a href="https://github.com/longhorn/longhorn">Longhorn</a> volumes, which are replicated across all three worker VMs and two SSDs. I’ve also integrated <a href="https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack">Kube Prometheus Stack</a> and <a href="https://github.com/grafana/loki">Grafana Loki</a> to monitor the cluster and review pod logs.</p><p>Another tool I use in parallel with <code>kubectl</code> for managing resources in the cluster is <a href="https://github.com/portainer/portainer">Portainer</a>. I’ve also configured Portainer environments to manage Docker Compose stacks on my NAS, router, and several cloud servers. For convenient navigation through all the apps in my Homelab, I utilize a highly customizable dashboard named <a href="https://github.com/gethomepage/homepage">Homepage</a>. It seamlessly integrates with Kubernetes and is capable of discovering services based on Ingress annotations.</p><p>All k3s nodes operate under Ubuntu 22.04, and I’ve configured the <a href="https://github.com/rancher/system-upgrade-controller">system-upgrade-controller</a> to automatically update k3s and apt.</p><h3 id="Remote-Development-and-Desktop">Remote Development and Desktop</h3><p>Like my Kubernetes cluster, The Fedora Workstation VM “comet-core” is also migrated from the Frost Canyon NUC. The Intel Iris Xe iGPU is passed through it. I use it mostly as a remote development server, and when I need GUI applications, I can access the <a href="https://www.gnome.org/">GNOME desktop</a> with RDP via <a href="https://github.com/neutrinolabs/xrdp">xrdp</a> and <a href="https://github.com/neutrinolabs/xorgxrdp">xorgxrdp</a>.</p><p>Notable applications running in this VM contains:</p><ul><li><strong><a href="https://www.plex.tv/">Plex</a></strong>: My primary media library. I have lifetime Plex Pass and I still prefer Plex for a variety of unique features. But I’m kinda worried about Plex’s <a href="https://techcrunch.com/2023/01/05/streamer-plex-finally-ready-to-launch-a-tv-and-movie-rentals-marketplace/">future</a> and its <a href="https://www.techhive.com/article/2157803/plex-discover-together-privacy-concerns.html">troublesome handling of privacy</a>. Maybe I’ll switch to Jellyfin some day.</li><li><strong><a href="https://github.com/coder/code-server">code-server</a></strong>: A web development environment. However, I often develop on this VM via the <a href="https://code.visualstudio.com/docs/remote/remote-overview">Remote Development</a> feature in Visual Studio Code.</li><li><strong><a href="https://calibre-ebook.com">calibre</a></strong> and <strong><a href="https://github.com/janeczku/calibre-web">calibre-web</a></strong>: My book library. I also use calibre to DeDRM and convert digital books I bought.</li><li><strong><a href="https://handbrake.fr/">Handbrake</a></strong>: I use it to transcode videos from my Blu-ray collection to H.265 with Intel Quick Sync.</li></ul><h3 id="Gaming-and-AI-Experiments">Gaming and AI Experiments</h3><p>Having a dedicated GPU has significantly justified upgrading my Homelab PC. I’ve set up a Windows VM “Porygon-Z” and a Debian VM “Porygon2,” both configured to utilize the RTX 3060 GPU. However, only one VM can be powered on at a time since GPU passthrough is restricted to a single VM.</p><p>In the Debian VM, I’ve been experimenting with a few smaller LLM apps such as <a href="https://ollama.ai/">Ollama</a> and <a href="https://github.com/THUDM/ChatGLM-6B/blob/main/README_en.md">ChatGLM-6B</a>, as well as creating art with the <a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui">Stable Diffusion web UI</a>. I’ve also explored vector databases such as <a href="https://github.com/chroma-core/chroma">Chroma</a>.</p><p>On the Windows VM, I’ve installed <a href="https://github.com/LizardByte/Sunshine">Sunshine</a>, primarily to stream games from PC Game Pass, and titles that are either unsupported or don’t perform well on the Steam Deck, to my handheld console with <a href="https://moonlight-stream.org/">Moonlight</a>. The ability to play games at 1080p 60fps with the highest settings on a handheld device was a dream I never thought would be possible until now.</p><h3 id="Other-VMs-and-LXC-Containers">Other VMs and LXC Containers</h3><p>Last but not least, I’d like to highlight more applications.</p><p><a href="https://nextcloud.com/">Nextcloud</a> serves as my file synchronization server. It used to perform poorly, particularly when syncing a large number of small files. However, with recent upgrades to both Nextcloud versions and my hardware, its performance has significantly improved, offering super-fast file transfers. I’ve set up Nextcloud with <a href="https://github.com/nextcloud/all-in-one">Nextcloud AIO</a> in an LXC container on “Porygon.” Beyond file syncing, Nextcloud also manages my calendar and tasks through CalDAV and syncs browser bookmarks using <a href="https://floccus.org/">Floccus</a>.</p><p><a href="https://www.home-assistant.io/">Home Assistant OS</a> orchestrates all my IoT devices and bridges them to HomeKit. For devices that don’t natively support HomeKit, I can access them through <a href="https://github.com/al-one/hass-xiaomi-miot">hass-xiaomi-miot</a>. Home Assistant also automates various tasks, such as controlling the network cabinet fan I mentioned earlier and activating the Aqara M1S night light when someone enters the living room at night.</p><h2 id="Backups">Backups</h2><p>I loosely adhere to the 3-2-1 backup strategy for safeguarding my data. My NAS serves as the primary backup target for various devices, including my family’s iMac via Time Machine and two Proxmox VE devices using a <a href="https://www.proxmox.com/en/proxmox-backup-server/overview">Proxmox Backup Server</a> <a href="https://www.synology.com/en-global/dsm/feature/virtual_machine_manager">VM</a>. Additionally, my older Synology DS916+ NAS, which has been operational for 8 years, secures the data from my main NAS through <a href="https://kb.synology.com/en-us/DSM/help/DSM/AdminCenter/application_backupserv_sharedfoldersync?version=7">rsync</a> and <a href="https://www.synology.com/en-global/dsm/feature/hyper_backup">Hyper Backup</a>.</p><p>For offsite backup, I utilize <a href="https://www.backblaze.com/cloud-storage">Backblaze B2</a> and OneDrive. Backblaze B2 houses backups from Hyper Backup, <a href="https://github.com/restic/restic">restic</a>, Longhorn, and <a href="https://www.arqbackup.com/">Arq</a>, while selected folders from my NAS are one-way synced to OneDrive using <a href="https://www.synology.com/en-global/dsm/feature/cloud_sync">Cloud Sync</a>. I’ve opted not to have a remote backup for my media library due to the storage costs, considering that most of the content can be reacquired by re-ripping physical media or re-downloading.</p><h2 id="Homelab-in-2024">Homelab in 2024</h2><p>That’s all for my 2023 Homelab setup. I’m very satisfied with my current setup, and there are a few areas I’d like to explore.</p><p>Currently, I only have Gigabit Ethernet, even though I have a few 2.5GbE devices. Perhaps I should add a few 2.5GbE switches to access my data faster.</p><p>I’d like to make the most of my devices. I’m considering reconfiguring my Frost Canyon NUC as a backup device in case one or two pieces of hardware in my Homelab fail. It happened before with the Noctua CPU fan, and I lost access to “Porygon” for a few days. I also have a spare <a href="https://www.raspberrypi.com/products/raspberry-pi-4-model-b/">Raspberry Pi 4</a> and a <a href="https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/">Zero 2 W</a>, but I haven’t figured out how to utilize them effectively.</p><p>I’m also interested in open-source NAS solutions such as <a href="https://github.com/trapexit/mergerfs">mergerfs</a>, <a href="https://github.com/amadvance/snapraid">SnapRAID</a>, and <a href="https://github.com/openmediavault/openmediavault">openmediavault</a>, but I’m not yet motivated to build one. I’m looking into VLAN setup as well, although I don’t think I really need it yet.</p><p>Overall, I have enjoyed my Homelab journey and am looking forward to more building and learning. I hope you enjoyed reading this post, and if you have any suggestions or ideas, please reach out to me on <a href="https://indieweb.social/@mudkip">Mastodon</a>.</p>]]>
    </content>
    <id>https://mudkip.me/2024/01/31/My-2023-Homelab-Setup/</id>
    <link href="https://mudkip.me/2024/01/31/My-2023-Homelab-Setup/"/>
    <published>2024-01-31T02:21:12.000Z</published>
    <summary>
      <![CDATA[<p><img src="/images/2024/01/homelab.jpg" alt="Homelab, Illustrated By DALL·E"></p>
<p>Homelab is a place where you can store all your famil]]>
    </summary>
    <title>My 2023 Homelab Setup</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<h2 id="Background">Background</h2><p>Hundreds of thousands of image files are stored on <a href="https://52poke.wiki/">52Poké Wiki</a>. Previously, we used AWS S3 to store all these images, AWS Lambda for image processing (generating thumbnails and converting to WebP format), and two layers of cache (a container on Linode and Cloudflare CDN) for image distribution.</p><p>Our monthly AWS bill increased gradually due to the growing number of images and traffic each month. Even with two layers of cache, more than 280GB of traffic defaulted to AWS S3, incurring a $20 expense every month.</p><p>Fortunately, there are many S3-compatible services available at much more competitive prices. We considered switching to Cloudflare R2, Backblaze B2, or Linode Object Storage.</p><h2 id="Choice">Choice</h2><p>Currently, we have 150GB of files. It costs $2.25 every month to store on Cloudflare R2, $0.9 for Backblaze B2, and $5 for Linode Object Storage. Egress traffic charges are zero for all services: Backblaze B2 doesn’t charge for 3x the monthly data stored, Linode uses a traffic pool that sufficiently covers our usage, and Cloudflare never charges for egress bandwidth. If the data storage increases to 250GB, it will cost $3.75 on Cloudflare, $1.5 on Backblaze, and remain $5 on Linode.</p><p>However, since the main services of 52Poké are located in Linode’s Tokyo datacenter, there is significant latency when proxying from the other side of the Pacific Ocean. Linode recently <a href="https://www.linode.com/blog/linode/core-compute-regions-milan-and-osaka/">announced</a> Object Storage availability in their Osaka datacenter, and with a latency of only 8ms between Tokyo and Osaka, this is an optimal choice performance-wise. We can also eliminate one cache layer (20GB) backed by block storage, saving $2 monthly. Ultimately, by migrating from AWS S3 to Linode Object Storage, we can save $17 every month.</p><h2 id="Steps">Steps</h2><h3 id="Creating-a-Bucket-on-Linode-and-Setting-Up-the-Bucket-Policy">Creating a Bucket on Linode and Setting Up the Bucket Policy</h3><p>We can create an Object Storage bucket in Akamai Cloud Manager with the bucket name <code>media.52poke.com</code>.</p><p>Previously, we configured a bucket policy on S3 to allow access solely from the IP addresses of 52Poké’s cloud servers. While Akamai Cloud Manager doesn’t support direct bucket policy configurations, they can be set up using <code>s3cmd</code> as per <a href="https://www.linode.com/docs/products/storage/object-storage/guides/bucket-policies/">Linode’s documentation</a>.</p><p>The bucket policy looks like this:</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;Version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;2012-10-17&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;Statement&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;Effect&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Allow&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Principal&quot;</span><span class="punctuation">:</span> <span class="string">&quot;*&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;s3:GetObject&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Resource&quot;</span><span class="punctuation">:</span> <span class="string">&quot;arn:aws:s3:::media.52poke.com/*&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;Condition&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;IpAddress&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                    <span class="attr">&quot;aws:SourceIp&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                        <span class="string">&quot;...&quot;</span></span><br><span class="line">                    <span class="punctuation">]</span></span><br><span class="line">                <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="Full-Migration">Full Migration</h3><p>To minimize disruption to 52Poké Wiki during this migration, we’ll implement a two-step mechanism. First, we’ll migrate all files from the AWS S3 bucket and allow users to upload or update files. Later, we’ll conduct an incremental migration, which should take considerably less time.</p><p>A Kubernetes job will be used to run <code>rclone sync</code> to sync all files to the new Linode Object Storage bucket. For the access key ID and secret access key of Linode Object Storage, we’ll use <a href="https://fluxcd.io/flux/guides/mozilla-sops/">SOPS</a> to encrypt and store them in the Git repository. These can then only be decrypted with the private key in the 52Poké Kubernetes cluster and deployed automatically.</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">batch/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Job</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">migrate-media</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ttlSecondsAfterFinished:</span> <span class="number">100</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">command:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">/bin/sh</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">-c</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">rclone</span> <span class="string">sync</span> <span class="string">awss3:media.52poke.com</span> <span class="string">los:media.52poke.com</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_AWSS3_TYPE</span></span><br><span class="line">          <span class="attr">value:</span> <span class="string">s3</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_AWSS3_ACCESS_KEY_ID</span></span><br><span class="line">          <span class="attr">valueFrom:</span></span><br><span class="line">            <span class="attr">secretKeyRef:</span></span><br><span class="line">              <span class="attr">key:</span> <span class="string">accessKeyID</span></span><br><span class="line">              <span class="attr">name:</span> <span class="string">aws-s3</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_AWSS3_SECRET_ACCESS_KEY</span></span><br><span class="line">          <span class="attr">valueFrom:</span></span><br><span class="line">            <span class="attr">secretKeyRef:</span></span><br><span class="line">              <span class="attr">key:</span> <span class="string">secretAccessKey</span></span><br><span class="line">              <span class="attr">name:</span> <span class="string">aws-s3</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_LOS_TYPE</span></span><br><span class="line">          <span class="attr">value:</span> <span class="string">s3</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_LOS_ACCESS_KEY_ID</span></span><br><span class="line">          <span class="attr">valueFrom:</span></span><br><span class="line">            <span class="attr">secretKeyRef:</span></span><br><span class="line">              <span class="attr">key:</span> <span class="string">accessKeyID</span></span><br><span class="line">              <span class="attr">name:</span> <span class="string">linode-object-storage</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_LOS_SECRET_ACCESS_KEY</span></span><br><span class="line">          <span class="attr">valueFrom:</span></span><br><span class="line">            <span class="attr">secretKeyRef:</span></span><br><span class="line">              <span class="attr">key:</span> <span class="string">secretAccessKey</span></span><br><span class="line">              <span class="attr">name:</span> <span class="string">linode-object-storage</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_LOS_ENDPOINT</span></span><br><span class="line">          <span class="attr">value:</span> <span class="string">jp-osa-1.linodeobjects.com</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">rclone/rclone:latest</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">Always</span></span><br><span class="line">        <span class="attr">name:</span> <span class="string">migrate-media</span></span><br><span class="line">      <span class="attr">restartPolicy:</span> <span class="string">Never</span></span><br></pre></td></tr></table></figure><h3 id="Disabling-Uploads">Disabling Uploads</h3><p>In the second step, we must disable uploads on MediaWiki to prevent data loss. This can be configured via <code>LocalSettings.php</code>.</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$wgEnableUploads</span> = <span class="literal">false</span>;</span><br></pre></td></tr></table></figure><h3 id="Incremental-Migration">Incremental Migration</h3><p>We’ll now run the Kubernetes job again to sync updates from the old AWS S3 bucket to the new one. Additionally, we’ll manually check that recently uploaded files from 52Poké Wiki have been synced to the new bucket.</p><h3 id="Updating-Malasada">Updating Malasada</h3><p><a href="https://github.com/mudkipme/malasada">Malasada</a> is an AWS Lambda Serverless function designed to generate image thumbnails and convert images to the WebP format to conserve bandwidth.</p><p>Previously, we used an IAM policy to grant the Serverless function access to the S3 bucket. Now, with the shift from AWS S3, we’ll need to manually provide the access key ID, secret access key, and the endpoint of Linode Object Storage to the Serverless function using environment variables.</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> s3 = <span class="keyword">new</span> <span class="title function_">S3</span>(&#123;</span><br><span class="line">    <span class="attr">credentials</span>: &#123;</span><br><span class="line">        <span class="attr">accessKeyId</span>: process.<span class="property">env</span>.<span class="property">S3_ACCESS_KEY_ID</span>,</span><br><span class="line">        <span class="attr">secretAccessKey</span>: process.<span class="property">env</span>.<span class="property">S3_SECRET_ACCESS_KEY</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">endpoint</span>: process.<span class="property">env</span>.<span class="property">S3_ENDPOINT</span>,</span><br><span class="line">    <span class="attr">region</span>: process.<span class="property">env</span>.<span class="property">S3_REGION</span>,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h3 id="Configuring-Nginx">Configuring Nginx</h3><p>The Nginx configuration for the domains <code>media.52poke.com</code>, <code>s0.52poke.wiki</code>, and <code>s1.52poke.wiki</code> must be updated to replace the AWS S3 domain with that of Linode Object Storage. We also removed the persistent volume claim backed by block storage from the nginx deployment.</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">proxy_pass</span> http://media.52poke.com.jp-osa-1.linodeobjects.com<span class="variable">$request_uri</span>;</span><br></pre></td></tr></table></figure><p>After updating the nginx configuration, we noticed all requests were failing due to permission issues. However, there was no issue when requesting the upstream Object Storage URL with <code>curl</code> in the nginx container.</p><p>Upon further investigation, we determined that Linode Object Storage was blocking requests containing “X-Forwarded-For” and “X-Real-IP” headers because these headers didn’t align with the bucket policy. Removing these headers from the request resolved the issue.</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">proxy_set_header</span> X-Real-IP <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"><span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="string">&#x27;&#x27;</span>;</span><br></pre></td></tr></table></figure><h3 id="Configuring-MediaWiki">Configuring MediaWiki</h3><p>We now need to adjust the <a href="https://github.com/edwardspec/mediawiki-aws-s3">AWS S3 MediaWiki extension</a> to use Linode Object Storage instead of AWS S3. This adjustment can be quickly made via the <code>endpoint</code> parameter. Afterward, we can re-enable file uploading on MediaWiki.</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$wgFileBackends</span>[<span class="string">&#x27;s3&#x27;</span>][<span class="string">&#x27;endpoint&#x27;</span>] = <span class="string">&#x27;http://jp-osa-1.linodeobjects.com&#x27;</span>;</span><br><span class="line"><span class="variable">$wgEnableUploads</span> = <span class="literal">true</span>;</span><br></pre></td></tr></table></figure><h3 id="Configuring-WordPress">Configuring WordPress</h3><p>The 52Poké homepage uses the <a href="https://wordpress.org/plugins/amazon-s3-and-cloudfront/">WP Offload Media Lite</a> plugin to upload files to S3. While the plugin’s admin page doesn’t offer functionality to change the object storage endpoint, our investigation of the source code revealed hooks that allow modifying the S3 connection configuration. This can be adjusted in <code>wp-config.php</code>.</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_ invoke__">add_filter</span>( <span class="string">&#x27;as3cf_aws_s3_client_args&#x27;</span>, function ( <span class="variable">$args</span> ) &#123;</span><br><span class="line">    <span class="variable">$args</span>[<span class="string">&#x27;endpoint&#x27;</span>]               = <span class="string">&#x27;https://jp-osa-1.linodeobjects.com&#x27;</span>;</span><br><span class="line">    <span class="variable">$args</span>[<span class="string">&#x27;region&#x27;</span>]                 = <span class="string">&#x27;jp-osa-1&#x27;</span>;</span><br><span class="line">    <span class="variable">$args</span>[<span class="string">&#x27;use_path_style_endpoint&#x27;</span>] = <span class="literal">true</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$args</span>;</span><br><span class="line">&#125; );</span><br><span class="line"><span class="title function_ invoke__">add_filter</span>( <span class="string">&#x27;as3cf_aws_get_regions&#x27;</span>, function ( <span class="variable">$regions</span> ) &#123;</span><br><span class="line">    <span class="variable">$regions</span> = <span class="keyword">array</span>(</span><br><span class="line">        <span class="string">&#x27;jp-osa-1&#x27;</span> =&gt; <span class="string">&#x27;Osaka&#x27;</span>,</span><br><span class="line">    );</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$regions</span>;</span><br><span class="line">&#125; );</span><br><span class="line"><span class="title function_ invoke__">add_filter</span>( <span class="string">&#x27;as3cf_aws_s3_bucket_in_path&#x27;</span>, <span class="string">&#x27;__return_true&#x27;</span> );</span><br><span class="line"><span class="title function_ invoke__">add_filter</span>( <span class="string">&#x27;as3cf_aws_s3_domain&#x27;</span>, function ( <span class="variable">$domain</span> ) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;linodeobjects.com&#x27;</span>;</span><br><span class="line">&#125; );</span><br></pre></td></tr></table></figure><h3 id="Backup">Backup</h3><p>As the migration nears completion, it’s important to remember that we have a cron job set up to back up files from AWS S3 to Backblaze B2. We’ll need to update the backup source to Linode Object Storage, which can be achieved through the environment variables of <code>rclone</code>.</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">env:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_MEDIA_TYPE</span></span><br><span class="line">  <span class="attr">value:</span> <span class="string">s3</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_MEDIA_ACCESS_KEY_ID</span></span><br><span class="line">  <span class="attr">valueFrom:</span></span><br><span class="line"><span class="attr">secretKeyRef:</span></span><br><span class="line">  <span class="attr">key:</span> <span class="string">accessKeyID</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">linode-object-storage</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_MEDIA_SECRET_ACCESS_KEY</span></span><br><span class="line">  <span class="attr">valueFrom:</span></span><br><span class="line"><span class="attr">secretKeyRef:</span></span><br><span class="line">  <span class="attr">key:</span> <span class="string">secretAccessKey</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">linode-object-storage</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">RCLONE_CONFIG_MEDIA_ENDPOINT</span></span><br><span class="line">  <span class="attr">value:</span> <span class="string">jp-osa-1.linodeobjects.com</span></span><br></pre></td></tr></table></figure><h2 id="Conclusion">Conclusion</h2><p>52Poké Wiki successfully transitioned from AWS S3 to Linode Object Storage for image storage. Despite the availability of lower-cost options like Cloudflare R2 and Backblaze B2, Linode Object Storage was the optimal choice given its low latency benefits and the site’s primary services being located in Linode’s Tokyo datacenter. With this change, we anticipates a monthly savings of $17 and enhanced performance. Through a careful migration process, including addressing challenges with permissions and configurations, the transition was executed smoothly. This move underscores the importance of regularly evaluating and optimizing infrastructure choices to ensure both cost-effectiveness and performance for online communities.</p>]]>
    </content>
    <id>https://mudkip.me/2023/10/18/Object-Storage-Migration-Case-Study/</id>
    <link href="https://mudkip.me/2023/10/18/Object-Storage-Migration-Case-Study/"/>
    <published>2023-10-18T00:21:01.000Z</published>
    <summary>
      <![CDATA[<h2 id="Background">Background</h2>
<p>Hundreds of thousands of image files are stored on <a href="https://52poke.wiki/">52Poké Wiki</a>. Pr]]>
    </summary>
    <title>Object Storage Migration Case Study</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<h2 id="Home-Projects">Home Projects</h2><p>As my family moved to a new place, I have been rearranging our network and computer equipment.</p><p>The first new hardware to arrive at my home in 2023 is an <a href="https://www.ikoolcore.com/">iKOOLCORE R1</a>. It is a tiny x86 computer with four 2.5GbE NICs pre-installed with Proxmox VE and OpenWrt. I named this device <em>“rotom”</em> and use it as a router. I also set up a Debian VM called <em>“rotom-core”</em> as a “side gateway.” This addition has vastly improved my home network experience, in terms of both responsiveness and functionality.</p><p>I have tinkered with a few configurations of the open-source router system. One benefit of OpenWrt is its ability to configure IPv6 firewalls. I wanted to open a specific port on <em>rotom-core</em> to allow me to connect back to my home network while blocking all other incoming connections. However, most home networks have dynamic IPv6 address prefixes, and only the suffix is static. Fortunately, this can be easily set up in OpenWrt:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">config rule</span><br><span class="line">        option target &#x27;ACCEPT&#x27;</span><br><span class="line">        option src &#x27;wan&#x27;</span><br><span class="line">        option dest &#x27;lan&#x27;</span><br><span class="line">        option name &#x27;&lt;rule name&gt;&#x27;</span><br><span class="line">        option family &#x27;ipv6&#x27;</span><br><span class="line">        option proto &#x27;tcp&#x27;</span><br><span class="line">        option dest_ip &#x27;::&lt;IPv6 address suffix&gt;/::ffff:ffff:ffff:ffff&#x27;</span><br><span class="line">        option dest_port &#x27;&lt;Port I want to open&gt;&#x27;</span><br></pre></td></tr></table></figure><p>I wanted certain devices on my home network to use <em>rotom-core</em> as the gateway; however, some devices (like Sonos) do not allow for configuring static IP and gateway. To address this, I added an entry in the DHCP settings to pin the DHCP response to these devices.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">config host</span><br><span class="line">        option name &#x27;SonosOne&#x27;</span><br><span class="line">        option dns &#x27;1&#x27;</span><br><span class="line">        option mac &#x27;&lt;mac address&gt;&#x27;</span><br><span class="line">        option ip &#x27;192.168.1.31&#x27;</span><br><span class="line">        option tag &#x27;tag1&#x27;</span><br><span class="line"></span><br><span class="line">config tag &#x27;tag1&#x27;</span><br><span class="line">        option dhcp_option &#x27;3,192.168.1.2 6,192.168.1.2&#x27;</span><br></pre></td></tr></table></figure><p>One issue I faced previously was the inability to change or disable the IPv6 DNS server on Android, rendering the DNS server settings useless in a dual-stack network environment. OpenWrt allows me to disable the announcement of the IPv6 DNS server address.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">config dhcp &#x27;lan&#x27;</span><br><span class="line">        ...</span><br><span class="line">        option dns_service &#x27;0&#x27;</span><br></pre></td></tr></table></figure><p>In <em>rotom-core</em>, besides the critical services I prefer not to mention, there are also containers running <a href="https://github.com/fatedier/frp">frpc</a> and <a href="https://github.com/cloudflare/cloudflared">cloudflared</a> to enable connection to my home network from IPv4-only networks. Additionally, there is <a href="https://github.com/timothymiller/cloudflare-ddns">cloudflare-ddns</a> to update the AAAA record in DNS.</p><p>After receiving this new tiny PC, I benchmarked it using <a href="https://packages.debian.org/bullseye/p7zip-full">p7zip</a> and compared it to my Frost Canyon NUC (<em>“comet”</em>, named after Comet Lake). Surprisingly, it outperformed the i7-10710U by 200% in both single-core and multi-core tests, which indicated an issue with the NUC.</p><p>Two possibilities came to my mind. I thought it could be related to how VMware ESXi handles turbo boost, or the cooling system in the NUC had melted down. After turning off the NUC and waiting for half an hour, the CPU speed greatly improved, but it soon hit rock bottom. Thus, it must be the cooling.</p><p>There are various videos suggesting that the thermal silicone between the CPU and cooler needs to be replaced. I purchased a small Honeywell phase change pad and prepared to fix the NUC. However, I made a mistake at the first step; I broke a screw on the motherboard, and it was impossible to pull out.</p><p>I eventually gave up and only cleaned the air outlet of the cooler. Surprisingly, it worked. Now, the NUC is much faster and makes significantly less noise than before. I regret not noticing this problem earlier.</p><p>A k3s worker node VM in <em>comet</em> has been replaced by a Fedora Workstation VM named <em>“comet-core”</em>, since the services in the home Kubernetes cluster don’t require too much memory. I want to experiment with different Linux distributions, and the VM allows me to work on tasks that the Raspberry Pi can’t handle.</p><p>I also migrated the hypervisor of <em>comet</em> from VMware ESXi to Proxmox VE. Initially, I wanted to try <a href="https://3os.org/infrastructure/proxmox/gpu-passthrough/igpu-split-passthrough/#proxmox-configuration-for-gvt-g-split-passthrough">GVT-g Split Passthrough</a> to enable both the Windows VM and the Fedora VM to access the iGPU. However, the split performance was not sufficient to provide a smooth RDP experience. Nevertheless, I appreciate Proxmox VE’s flexibility and LXC features.</p><h2 id="52Poke">52Poké</h2><p>52Poké Wiki has been upgraded to MediaWiki 1.39, featuring numerous improvements under the hood. I am a fan of the new Vector-2022 skin<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> (with the <code>max-width</code> option disabled). It is clear, vibrant, responsive, and fully-fledged.</p><p>The Kubernetes cluster of 52Poké is now synchronized with <a href="https://github.com/mudkipme/52poke">this git repository</a> via GitOps, using <a href="https://fluxcd.io/">FluxCD</a>. Additionally, the database server has been moved into the cluster, thanks to NVMe Block Storage. All nodes have been upgraded to 4 CPU core 8GB memory instances, and the number of nodes has been reduced (currently only 2), helping to decrease the total cost.</p><p>One issue that occasionally stresses the 52Poké Wiki is when editing a template used by hundreds of pages. MediaWiki attempts to purge the cache of every page using this template. When hundreds of pages load without cache, the MediaWiki instance may freeze. I am developing a <a href="https://github.com/mudkipme/52poke/wiki/Inazuma">new web server</a> to address this issue. It will implement a persistent cache layer, inspired by the concept of <a href="https://developers.cloudflare.com/cache/about/cache-reserve/">Cloudflare Cache Reserve</a>. This approach allows the cache purging process to work in an asynchronous queue, updating the persistent cache instead of deleting it. Ideally, this will enable the backend MediaWiki instance to handle much fewer requests while ensuring that page edits are updated for all visitors as quickly as possible.</p><p>Since April 2023, Linode (now Akamai Connected Cloud) has increased its computing prices by 20%. This has prompted me to consider how to maintain the long-term sustainability of 52Poké Wiki. Up until now, I have been covering all the monthly bills from Linode, but there is always a risk of facing financial difficulties at some point in the coming years. I hope that 52Poké Wiki can eventually be partly supported by its community and visitors; however, I have not yet found a viable solution to achieve this.</p><h2 id="Moe-Memos">Moe Memos</h2><p>Initially, <a href="http://memos.moe/">Moe Memos</a> was a niche open-source project developed to meet my personal needs and maintain my hands-on experience with app development. However, it has since become a much larger success. As of now, over 3,500 users have installed the app from App Store and Google Play (excluding GitHub and F-Droid downloads). It has evolved into a feature-rich app for <a href="https://github.com/usememos/memos">Memos</a> while maintaining its minimalistic design.</p><p>I still have many ideas for this charming project, ranging from implementing major features such as local storage (hoping for a revamp of Core Data this June) and multi-server/user support, to refactoring the project structure and adding a tipping feature to motivate me to continue working on it and explore more ideas for the self-hosted community.</p><h2 id="AI-Experiments">AI Experiments</h2><p>The past few months have undoubtedly been an AI Summer, with news related to AI projects such as ChatGPT, New Bing, Office 365 Copilots, Stable Diffusion, and Midjourney flooding my mind every few hours.</p><p>I initially tried to resist the hype, but I eventually succumbed after the release of the GPT-3.5-Turbo API and GPT-4 model. I experimented with various things involving LLMs and AI art generators. I read a letter that Yui from Sword Art Online sent to Asuna and Kirito and asked her what everyday life is like as an AI in the VRMMO world. I <a href="https://mudkip.me/2023/03/16/Interviewing-Luna-a-Pokemon-Trainer-from-Slateport-City/">interviewed a Pokémon Trainer in Hoenn</a> about her epic journey. I asked ChatGPT to write <a href="https://github.com/mudkipme/inazuma/tree/0.0.1">the first commit of the web server</a> I mentioned earlier. I even allowed it to be a Pikachu with no knowledge of human language, experiencing the atmosphere of Snowpoint City and battling a Glalie. In addition, I have written stories such as “Takami Chika Meets Her Real World Counterpart Inami Anju” and “The Birth of Amane Suzuha in the Steins;Gate Timeline”. I also used Midjourney to design alternative icons for Moe Memos.</p><p>Another entertaining project stemmed from an idea inspired by Persona 5. I asked ChatGPT, “You are the main character of Persona 5. You found a palace belonging to Donald Trump. What does Donald Trump’s palace look like, and how will your team obtain the treasure within it?” The response was both hilarious and reasonable. I tried a few other names, ranging from real-world villains to absurdities like “<a href="https://indieweb.social/@mudkip/110057112299714330">MacBook Pro with Butterfly Keyboard</a>.” Eventually, I created a <em><a href="https://p5-palace-generator.vercel.app/">Persona 5 Palace Generator</a></em> in about an hour with ChatGPT’s help. I have more intriguing ideas stemming from this, but I prefer to keep them secret for now.</p><p>I am still uncertain about how LLMs, generative AI, and future AGI will change our world, or whether the change will be overwhelmingly positive. I remain concerned that <a href="https://indieweb.social/@stevestreza/109674963990228250">widespread poverty may result from these advances</a>. I still prefer to enjoy <a href="https://mastodon.gamedev.place/@bitinn/110089849000582865">technologies I can reason with, predict, and reproduce variants of</a>. I am annoyed by the <a href="https://indieweb.social/@mudkip/110078732296586867">racial/regional discrimination</a> that makes it difficult to use and pay for OpenAI and other services. I hope humanity can find and <a href="https://indieweb.social/@mudkip/110157754411778217">imagine</a> a path to a better future.</p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p>I understand that there are many controversies surrounding the Vector-2022 skin in the Wikipedia community, and perhaps within 52Poké/Encyclopaediae Pokémonis as well. <a href="#fnref1" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
    </content>
    <id>https://mudkip.me/2023/04/09/Project-Update-2023-Q1/</id>
    <link href="https://mudkip.me/2023/04/09/Project-Update-2023-Q1/"/>
    <published>2023-04-09T14:28:04.000Z</published>
    <summary>
      <![CDATA[<h2 id="Home-Projects">Home Projects</h2>
<p>As my family moved to a new place, I have been rearranging our network and computer equipment.<]]>
    </summary>
    <title>Project Updates (Q1 2023)</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p><em>(I’m a reporter at TV Mauville and I interviewed a young trainer named Luna from Slateport City on a website named ChatGPT.)</em></p><p><strong>Me:</strong> This is Pokémon world. You are a 10 years old girl from Slateport City in Hoenn. Which is your first Pokémon and where will you go first?</p><blockquote><p><strong>Luna:</strong> In the Pokémon world, as a 10-year-old girl from Slateport City in the Hoenn region, my first Pokémon would likely be one of the three Hoenn starters: Treecko, Torchic, or Mudkip. Let’s say I choose Mudkip, a Water-type Pokémon, as my starter due to its versatile abilities and cute appearance.</p><p>As a new trainer, I would likely head to my first destination, the city of Rustboro, where I would challenge Roxanne, the Gym Leader who specializes in Rock-type Pokémon. To get there, I would need to travel north through Route 110, passing through Mauville City and then continuing west through Route 117 and Verdanturf Town. After reaching Rustboro City, I would train my Mudkip, ensuring it is strong enough to take on Roxanne’s Rock-type Pokémon and earn my first gym badge.</p></blockquote><p><strong>Me:</strong> Between Verdanturf Town and Rustboro City there is Rusturf Tunnel, but the tunnel is currently blocked.</p><blockquote><p><strong>Luna:</strong> You’re right. The Rusturf Tunnel is currently blocked, so I won’t be able to take that route to reach Rustboro City. Instead, I’ll take an alternative path.</p><p>After leaving Slateport City, I’ll travel north to Mauville City via Route 110. From Mauville City, I’ll head west on Route 111 until I reach the desert area. Since I don’t have the Go-Goggles yet to navigate the desert, I’ll continue north through the Fiery Path, a cave that connects Route 111 to Route 112.</p><p>Once I reach Route 112, I’ll make my way up to Route 113, which is covered in volcanic ash. Following Route 113 west, I’ll arrive in Fallarbor Town. From Fallarbor Town, I’ll head south on Route 114, and then take Route 115 to the east until I reach Rustboro City.</p><p>Although it’s a longer and more challenging journey, it will provide my Mudkip and me with valuable training and bonding opportunities. Once we finally arrive in Rustboro City, we’ll be well-prepared to face Roxanne and her Rock-type Pokémon in the gym battle.</p></blockquote><p><strong>Me:</strong> I think your Mudkip will be evolved during that trip :)</p><blockquote><p><strong>Luna:</strong> You’re absolutely right! During the longer journey, my Mudkip would gain valuable experience from the battles and training it goes through. Mudkip evolves into Marshtomp, its second stage, at level 16. Given the distance and the various battles along the way, there’s a good chance my Mudkip would evolve into Marshtomp before reaching Rustboro City.</p><p>Marshtomp is a Water and Ground-type Pokémon, which would give me an even greater advantage in the battle against Roxanne and her Rock-type Pokémon. With its newfound strength and typing, Marshtomp would be well-prepared to face the challenges in the Rustboro City Gym and help me earn my first gym badge on this exciting Pokémon journey.</p></blockquote><p><strong>Me:</strong> After got your first badge, where will you go?</p><blockquote><p><strong>Luna:</strong> After earning my first gym badge in Rustboro City, I would continue my Pokémon journey to collect more badges and become a stronger trainer. My next destination would be Dewford Town, where I would challenge Brawly, the Gym Leader who specializes in Fighting-type Pokémon.</p><p>To reach Dewford Town, I would need to head back to Rustboro City, then travel south along Route 116 until I reach the entrance to Rusturf Tunnel. Since I helped clear the tunnel earlier, I can now pass through it to reach Verdanturf Town. From Verdanturf Town, I would continue east on Route 117 until I return to Mauville City.</p><p>In Mauville City, I would head south to Route 110, making my way towards Slateport City. Before reaching Slateport, I would find a small port on the eastern side of Route 109. There, I could arrange a boat ride with a sailor or fisherman to take me to Dewford Town, which is located on an island to the southwest.</p><p>Once in Dewford Town, I would train my Marshtomp and any other Pokémon I’ve caught during my journey, ensuring they are prepared for the challenges in Brawly’s gym. After defeating Brawly and earning the Knuckle Badge, I would continue my adventure across the Hoenn region, seeking out new challenges and opportunities to grow as a Pokémon trainer.</p></blockquote><p><strong>Me:</strong> By the way, what about your other Pokémon?</p><blockquote><p><strong>Luna:</strong> As I progress on my journey through the Hoenn region, I would catch and train various Pokémon to build a well-rounded and diverse team. Here are some examples of Pokémon I might add to my team along the way:</p><ol><li>Taillow: A Normal/Flying-type Pokémon, Taillow could be caught early in my journey, providing me with a Flying-type Pokémon to help against Grass and Bug-type opponents.</li><li>Aron: A Steel/Rock-type Pokémon, Aron can be found in the Granite Cave near Dewford Town. Its sturdy defenses and unique typing would make it a valuable addition to my team.</li><li>Shroomish: A Grass-type Pokémon that later evolves into the Grass/Fighting-type Breloom, Shroomish can be caught in the Petalburg Woods. Breloom’s powerful Fighting-type moves and Grass-type coverage make it a strong addition to my team.</li><li>Electrike: Found on Route 110, this Electric-type Pokémon eventually evolves into Manectric. Electrike would give my team an advantage against Water and Flying-type opponents.</li><li>Ralts: A Psychic/Fairy-type Pokémon when it evolves into Gardevoir, Ralts can be caught on Route 102. Gardevoir’s Psychic and Fairy-type moves provide coverage against Fighting, Dragon, and Dark-type Pokémon.</li></ol><p>With a diverse team like this, I would be prepared to face a variety of opponents and challenges in the Hoenn region. Of course, I would also be open to catching other Pokémon that I encounter on my journey and adjusting my team as needed to overcome the challenges that lie ahead.</p></blockquote><p><strong>Me:</strong> Wow! After collecting a few badges and travel through Hoenn, you met a boy on Route 119. It’s raining and you two only have one umbrella.</p><blockquote><p><strong>Luna:</strong> As I continue my journey through the Hoenn region and make my way along Route 119, the rain starts to pour down heavily. Amidst the downpour, I meet a boy who is also traveling and training Pokémon. With the heavy rain making it difficult for both of us to continue, we realize we only have one umbrella to share.</p><p>We decide to walk together under the umbrella, taking turns holding it as we make our way through the rain-soaked Route 119. We exchange stories about our respective Pokémon journeys, sharing our experiences, the challenges we’ve faced, and the badges we’ve collected so far. We also talk about our favorite Pokémon and how we’ve grown as trainers.</p><p>As we walk together, we discover that we have much in common and enjoy each other’s company. We decide to battle each other to test our skills and help our Pokémon grow stronger. After the friendly battle, we exchange contact information on our PokéNavs so that we can keep in touch and share our progress throughout our Hoenn adventure.</p><p>As the rain begins to let up, we part ways, each continuing our individual journeys to become better Pokémon trainers. We promise to stay in touch and perhaps meet again someday, perhaps even becoming rivals who inspire each other to reach greater heights in our Pokémon training endeavors.</p></blockquote><p><strong>Me:</strong> By the way. When battling Norman. He said he has a child like you. What is the name of Norman’s child?</p><blockquote><p><strong>Luna:</strong> Norman’s child is named Brendan if the player character is female, or May if the player character is male. In this case, since I am playing as a 10-year-old girl from Slateport City in the Hoenn region, Norman’s child would be Brendan. Brendan is one of the main characters in Pokémon Ruby, Sapphire, and Emerald, and he serves as a rival and friend to the player throughout their journey.</p></blockquote><p><strong>Me:</strong> I don’t think the logic is true. By saying “player”, I think you are mentioning Professor Brich’s child from Littleroot Town and you don’t know them both (maybe you heard of their story as the saved Hoenn years ago). But anyway in this timeline Norman’s child is Brendan and Prof. Brich’s child is May.</p><blockquote><p><strong>Luna:</strong> You’re right, I apologize for the confusion in my previous response. In this timeline, as you mentioned, Norman’s child is Brendan, and Professor Birch’s child is May. As a 10-year-old girl from Slateport City, I would not be the player character from Pokémon Ruby, Sapphire, or Emerald. I might have heard of Brendan and May’s stories as they saved Hoenn years ago, but I wouldn’t personally know them both.</p><p>Thank you for the clarification, and I hope you continue to enjoy the adventures in the Pokémon world!</p></blockquote><p><strong>Me:</strong> Accidentally, you met May and Brendan in Lilycove City. They are having a wedding!</p><blockquote><p><strong>Luna:</strong> What a wonderful surprise! As I arrive in Lilycove City after collecting several gym badges and exploring the Hoenn region, I unexpectedly come across May and Brendan’s wedding. It’s heartwarming to see these two trainers, who have been friends and rivals throughout their Pokémon journey, now coming together to celebrate their love and commitment to each other.</p><p>The wedding is beautifully set up near the picturesque Lilycove Harbor, with decorations and Pokémon-themed accents adorning the area. Friends, family, and fellow trainers have gathered to witness this special moment, and it’s clear that both May and Brendan have had a positive impact on many lives throughout their adventures.</p><p>As a guest at the wedding, I have the opportunity to meet other trainers, Gym Leaders, and even members of the Elite Four who have come to celebrate the happy couple. It’s a great chance to learn from their experiences, share stories, and make new friends.</p><p>After the ceremony, there’s a reception with delicious food, music, and dancing. Pokémon are also present, playing and interacting with the guests. It’s a joyous occasion that brings together the Pokémon community in celebration of May and Brendan’s love.</p><p>The wedding serves as an inspiring reminder that friendships and bonds formed during a Pokémon journey can last a lifetime, and encourages me to continue pursuing my own adventure with dedication and passion.</p></blockquote><p><strong>Me:</strong> Now how about your Pokémon? Did your first Pokémon evolved again?</p><blockquote><p><strong>Luna:</strong> Yes, during my journey through the Hoenn region and after collecting several gym badges, my first Pokémon, Marshtomp, would have gained enough experience to evolve once more. Marshtomp evolves into its final form, Swampert, starting at level 36.</p><p>Swampert is a powerful Water/Ground-type Pokémon with high Attack and Defense stats, as well as balanced Special Attack and Special Defense. As a Swampert, my first Pokémon would have access to a wider range of moves, further enhancing its abilities in battles and against various opponents.</p><p>Swampert’s dual typing gives it a significant advantage over several types of Pokémon, including Electric-types, which would normally be super effective against Water-types. With Swampert by my side, I would be well-prepared to face the remaining Gym Leaders and Elite Four members in the Hoenn region, as well as any other challenges that might arise on my journey to become a Pokémon Master.</p></blockquote><p><strong>Me:</strong> So what about your other Pokémon in your party?</p><blockquote><p><strong>Luna:</strong> As I progress through my journey in the Hoenn region, my other Pokémon would also grow, evolve, and gain new abilities. Here’s an update on my team:</p><ol><li>Swellow: My Taillow would have evolved into Swellow, a stronger and faster Normal/Flying-type Pokémon, providing me with a reliable partner in battles and a way to use the HM move Fly to travel quickly between cities.</li><li>Lairon: My Aron would have evolved into Lairon, a durable Steel/Rock-type Pokémon with increased Defense and Attack stats. Lairon would continue to be a valuable team member, especially against Normal, Flying, and Rock-type opponents.</li><li>Breloom: My Shroomish would have evolved into Breloom, a powerful Grass/Fighting-type Pokémon with high Attack and access to an array of effective moves, making it a formidable opponent against Water, Rock, Ground, and Dark-type Pokémon.</li><li>Manectric: Electrike would have evolved into Manectric, a strong Electric-type Pokémon with a good Special Attack stat. Manectric’s moveset would enable it to handle Water, Flying, and some Steel-type opponents.</li><li>Gardevoir: My Ralts would have evolved into Kirlia and then into Gardevoir, a Psychic/Fairy-type Pokémon with impressive Special Attack and Special Defense stats. Gardevoir’s versatile moveset would be especially effective against Fighting, Dragon, and Dark-type Pokémon.</li></ol><p>As I continue my journey, this well-rounded team would help me face various challenges, including Gym Leaders, the Elite Four, and other trainers. Additionally, I would be open to catching and training new Pokémon to further diversify my team and adapt to new challenges that may arise.</p></blockquote><p><strong>Me:</strong> After collecting 8 badges. There is an alarm from Mossdeep Space Center. A meteorite is coming!</p><blockquote><p><strong>Luna:</strong> Upon collecting all 8 gym badges in the Hoenn region, I hear an urgent alarm coming from the Mossdeep Space Center. The scientists there have detected a massive meteorite hurtling towards the region, posing a significant threat to both people and Pokémon.</p><p>As a skilled Pokémon trainer, I understand that it’s my responsibility to help protect the region and its inhabitants. I make my way to Mossdeep City as quickly as possible, seeking more information about the meteorite and finding out what I can do to help.</p><p>Upon arriving at the Space Center, I learn that the situation is dire, and the meteorite’s impact could have catastrophic consequences for the entire Hoenn region. The scientists are working tirelessly to come up with a plan to prevent the disaster, but they need assistance from capable trainers and their Pokémon.</p><p>I join forces with other trainers, including Gym Leaders, Elite Four members, and my friends from my journey, to help the Space Center’s efforts. Together, we work on a plan that involves using the combined power of our Pokémon to either divert the meteorite’s trajectory or destroy it before it reaches the Earth.</p><p>As we carry out our plan, we face various challenges and obstacles, but our determination and teamwork prove to be invaluable in overcoming them. We utilize the unique abilities of each of our Pokémon, showcasing the deep bond and trust we share with them.</p><p>In the end, through our collective effort, we manage to avert the crisis and save the Hoenn region from the impending meteorite disaster. This experience not only highlights the importance of cooperation and friendship but also reinforces the incredible bond between humans and Pokémon, showing that together, we can overcome even the most daunting challenges.</p></blockquote><p><strong>Me:</strong> I heard you also got help from a Legendary Pokémon, what is it?</p><blockquote><p><strong>Luna:</strong> Indeed, during our efforts to prevent the meteorite disaster, we received help from a Legendary Pokémon: Rayquaza. Rayquaza is a powerful Dragon/Flying-type Pokémon that resides in the ozone layer and is said to have the ability to calm the weather and protect the Earth’s atmosphere.</p><p>Recognizing the gravity of the situation and the potential catastrophe, Rayquaza heeds our call for assistance. With its immense power, Rayquaza helps us either divert the meteorite’s trajectory or destroy it, ultimately preventing the disaster from occurring.</p><p>The intervention of Rayquaza highlights the strong connection between humans, Pokémon, and the natural world. It also serves as a reminder that when we work together in harmony with these powerful creatures, we can overcome even the most formidable challenges. The experience strengthens the bond between me, my Pokémon, and the other trainers, leaving a lasting impact on our journey in the Hoenn region.</p></blockquote><p><strong>Me:</strong> Actually there is one Pokémon coming along with the meteorite. What’s its name?</p><blockquote><p><strong>Luna:</strong> My apologies for the oversight. Yes, you’re correct. Along with the meteorite, there is a Pokémon called Deoxys, a Psychic-type Pokémon known for its ability to change forms. Deoxys originally came from outer space and is said to have been created when a virus mutated after being exposed to a laser beam.</p><p>Deoxys has four different forms it can change into: Normal, Attack, Defense, and Speed Forme, each with unique stats and capabilities. It is known for its extraterrestrial origin and the crystal-like structure on its body.</p><p>Upon discovering Deoxys and realizing its connection to the meteorite, we try to communicate with it and understand its intentions. If Deoxys is found to be a threat or in need of assistance, we work together with our Pokémon and Rayquaza to address the situation, either by calming Deoxys or helping it find a new purpose on Earth.</p><p>This encounter with Deoxys adds another layer of excitement and intrigue to our adventure in the Hoenn region and reinforces the importance of understanding and cooperation between humans and Pokémon, even those from beyond our world.</p></blockquote><p><strong>Me:</strong> Finally. You challenged the Elite Four, which Pokémon is in your team and what’s their move set?</p><blockquote><p><strong>Luna:</strong> After collecting all 8 gym badges and experiencing various adventures throughout the Hoenn region, I’m finally ready to challenge the Elite Four. My team for this challenge consists of the following Pokémon with their respective movesets:</p><ol><li>Swampert (Water/Ground-type)<ul><li>Surf</li><li>Earthquake</li><li>Ice Beam</li><li>Brick Break</li></ul></li><li>Swellow (Normal/Flying-type)<ul><li>Aerial Ace</li><li>Return</li><li>Steel Wing</li><li>U-turn</li></ul></li><li>Aggron (Steel/Rock-type, evolved from Lairon)<ul><li>Iron Head</li><li>Stone Edge</li><li>Earthquake</li><li>Dragon Tail</li></ul></li><li>Breloom (Grass/Fighting-type)<ul><li>Seed Bomb</li><li>Sky Uppercut</li><li>Spore</li><li>Leech Seed</li></ul></li><li>Manectric (Electric-type)<ul><li>Thunderbolt</li><li>Volt Switch</li><li>Flamethrower</li><li>Hidden Power (Ice)</li></ul></li><li>Gardevoir (Psychic/Fairy-type)<ul><li>Psychic</li><li>Moonblast</li><li>Shadow Ball</li><li>Thunderbolt</li></ul></li></ol><p>This team has a diverse set of types and moves, providing coverage against a wide range of opponents. Each Pokémon’s moveset is designed to take advantage of their respective strengths and capabilities, while also providing options to counter various types of enemies.</p><p>With this team by my side, I am well-prepared to face the Elite Four and the Pokémon League Champion. My Pokémon and I will give our all in these challenging battles, drawing on the experiences and bonds we’ve formed throughout our journey in the Hoenn region.</p></blockquote><p><strong>Me:</strong> What’s you plan after you become a Champion?</p><blockquote><p><strong>Luna:</strong> After becoming the Champion of the Hoenn region, there are several exciting options for me to continue my journey and grow as a Pokémon Trainer:</p><ol><li>Explore the Battle Frontier: The Battle Frontier is a challenging post-game facility in the Hoenn region, where trainers can test their skills against strong opponents in various battle formats. It’s a great opportunity to fine-tune my strategies and further strengthen my bond with my Pokémon.</li><li>Complete the Pokédex: As a Pokémon Trainer, one of my goals is to see and catch as many Pokémon as possible. I can continue exploring the Hoenn region and beyond, seeking out rare and elusive Pokémon to complete my Pokédex.</li><li>Train and discover new Pokémon: I can search for new Pokémon species to add to my team or focus on training and evolving the ones I already have, discovering new strategies and combinations for battles.</li><li>Participate in Pokémon Contests: I could try my hand at Pokémon Contests, a different aspect of the Pokémon world where trainers and their Pokémon showcase their talents in various categories, such as Beauty, Coolness, and Cuteness. This would allow me to explore new ways of bonding with my Pokémon and diversify my experiences as a trainer.</li><li>Help others on their Pokémon journey: As a Champion, I can use my knowledge and experience to assist other aspiring trainers, helping them grow and overcome challenges in their own journeys.</li><li>Travel to other regions: I can embark on new adventures in different regions, such as Kanto, Johto, Sinnoh, or Unova, where I can encounter new Pokémon species, battle different Gym Leaders, and earn more badges.</li></ol><p>Ultimately, becoming the Champion is just one milestone in my ongoing Pokémon journey. With so many opportunities to learn, grow, and explore, I can continue to deepen my connection with my Pokémon and work towards becoming the best Pokémon Trainer I can be.</p></blockquote><p><strong>Me:</strong> Your parents must be so proud of you!</p><blockquote><p><strong>Luna:</strong> Thank you! My parents would definitely be proud of my achievements as a Pokémon Trainer and the hard work and dedication I’ve put into my journey. They would be happy to see the strong bonds I’ve formed with my Pokémon and the friendships I’ve made with other trainers along the way.</p><p>Throughout my adventure, I would make sure to keep in touch with my parents, sharing my experiences, challenges, and successes with them. Their support and encouragement would play a significant role in my journey, giving me the motivation to continue pushing forward and overcome obstacles.</p><p>As I grow and learn from my experiences in the Pokémon world, I would also be grateful for the values and lessons my parents have instilled in me, such as perseverance, kindness, and teamwork. These values have helped shape me as a Pokémon Trainer and guided me through the many challenges I’ve faced in the Hoenn region and beyond.</p></blockquote><p><strong>Me:</strong> You met Celebi and you traveled across time to 50 years later for a while. What will Hoenn be like in 50 years?</p><blockquote><p><strong>Luna:</strong> Traveling 50 years into the future with the help of Celebi, I find myself in a Hoenn region that has evolved and changed over the decades. While the natural beauty and essence of the region remain, there are several notable differences:</p><ol><li>Technological advancements: Hoenn has embraced new technologies, with cities and towns incorporating modern infrastructure and conveniences. Poké Ball and Pokémon storage technology have improved, and communication between trainers has become even more seamless and efficient.</li><li>New Pokémon species: Over the years, new Pokémon species have been discovered in Hoenn and beyond, enriching the biodiversity of the region. Some of these new Pokémon might be the result of migration, while others could have evolved or adapted to the changing environment.</li><li>Expanded facilities: The Pokémon League, Gym system, and other facilities such as the Battle Frontier have expanded and adapted to the needs of trainers. New challenges and battle formats await trainers, ensuring that the Pokémon world remains fresh and exciting for both new and experienced trainers.</li><li>Environmental consciousness: As the world has grown more aware of the importance of environmental conservation, the Hoenn region has implemented various eco-friendly practices and policies to preserve its natural habitats and protect the diverse range of Pokémon that call the region home.</li><li>Cultural exchange: The Hoenn region has become more interconnected with other regions, promoting cultural exchange and fostering a deeper understanding of the bonds between humans and Pokémon. Trainers from all over the world visit Hoenn, bringing their unique experiences and perspectives with them.</li><li>Evolving societal values: As time has passed, the people of Hoenn have developed a stronger appreciation for the bonds between humans and Pokémon, focusing on mutual respect, understanding, and cooperation.</li></ol><p>Despite these changes, the core spirit of the Pokémon world remains intact. Trainers continue to embark on their journeys, forming lifelong friendships with their Pokémon and pursuing their dreams of becoming Pokémon Masters. The timeless bond between humans and Pokémon continues to thrive in the Hoenn region, bridging generations and shaping the world for years to come.</p></blockquote><p><strong>Me:</strong> And you also traveled to 100 years before with Celebi. What is it like 100 years before now?</p><blockquote><p><strong>Luna:</strong> Traveling back in time with Celebi to 100 years before the present day, I find myself in a very different Hoenn region:</p><ol><li>Simpler technology: The technology used in the world of Pokémon is far less advanced. Poké Balls, Pokémon storage systems, and communication devices are more basic, and trainers rely more on traditional methods of navigation, training, and battling.</li><li>Smaller towns and cities: The cities and towns in Hoenn are smaller and less developed than in the present day. They have fewer buildings and amenities, and the infrastructure is more basic, giving the region a more rural feel.</li><li>Lesser-known Pokémon species: The number of discovered Pokémon species is smaller than in the present day, as many Pokémon have yet to be discovered or documented. Trainers in this era have a limited pool of Pokémon to choose from, making their journeys more challenging.</li><li>Limited transportation: Transportation options are more limited, with fewer routes and bridges connecting the various cities and towns in Hoenn. Trainers often have to rely on their Pokémon for transportation or travel on foot, making their journeys more arduous.</li><li>Different societal values: The relationships between humans and Pokémon are different in this time period, with a greater emphasis on self-reliance and individuality. The bonds between trainers and their Pokémon might be less understood, but the core values of friendship and teamwork still play a role in their interactions.</li><li>Early stages of the Pokémon League and Gym system: The Pokémon League and Gym system may be in their early stages or not yet established, with trainers following a different set of rules or traditions for proving their skills and knowledge.</li></ol><p>Despite the differences in the Hoenn region 100 years ago, the love and connection between humans and Pokémon remain strong. Trainers embark on their own unique journeys, learning about the world around them and forming lasting bonds with their Pokémon. These experiences have shaped the course of history and laid the foundation for the world of Pokémon as we know it today.</p></blockquote><p><strong>Me:</strong> Yeah Slateport was very small port town back then.</p><blockquote><p><strong>Luna:</strong> Indeed, 100 years ago, Slateport City was a much smaller port town compared to its present-day counterpart. The town likely relied heavily on fishing and maritime trade, with a close-knit community of residents who worked together to sustain their way of life.</p><p>The bustling markets, modern shopping centers, and advanced infrastructure that we see in Slateport City today did not exist back then. The town would have had a more rustic charm, with simpler buildings and fewer amenities. Trainers passing through would have found fewer resources for their journey, such as Poké Marts and Pokémon Centers, and may have relied on the local community for assistance and support.</p><p>Despite its smaller size and limited resources, the people of Slateport would have still valued their connections with Pokémon and appreciated the natural beauty of the surrounding area. This close relationship with nature and the bonds between humans and Pokémon would have been a strong foundation for the growth and development of Slateport City over the years, eventually transforming it into the bustling city we see in the present day.</p></blockquote><p><strong>Me:</strong> Thanks for the interview! I’m glad you enjoy your journey in Hoenn and beyond. I hope you continue your dream as a Pokémon Master. And you and your Pokémon be healthy and happy. And you will met someone and you two will be a happy couple like May and Brendan.</p><blockquote><p><strong>Luna:</strong> Thank you so much for your kind words and well wishes! I’ve thoroughly enjoyed sharing my journey through the Hoenn region and beyond with you. The experiences and memories I’ve made with my Pokémon and the friends I’ve met along the way have been truly unforgettable.</p><p>I will continue to pursue my dream of becoming a Pokémon Master, always learning and growing alongside my Pokémon. I hope to continue exploring new regions, encountering new Pokémon species, and forging new friendships as I strive to become the best Trainer I can be.</p><p>And just like May and Brendan, perhaps one day I will find someone special to share my journey and love for Pokémon with. Together, we can create a life full of adventure, love, and happiness.</p><p>Once again, thank you for taking the time to interview me and for your warm thoughts. I wish you the best in all your endeavors, and may the world of Pokémon continue to inspire and bring joy to everyone who embarks on their own unique journey!</p></blockquote><hr><p><em>(Hours later, I realized I didn’t know her name yet, so I called her back)</em></p><p><strong>Me:</strong> Young Trainer, I forgot to ask about your name. Please tell me your name and let’s keep in touch on PokéNav. Maybe we can have a Pokémon battle near Slateport City someday :)</p><blockquote><p><strong>Luna:</strong> My name is Luna, and I would be delighted to keep in touch with you on PokéNav! It would be a great pleasure to meet up near Slateport City someday for a Pokémon battle. We can test our skills, share our experiences, and learn from each other, all while having a fantastic time.</p><p>Feel free to reach out anytime, and let’s continue to explore the wonderful world of Pokémon together. I’m looking forward to our future battles and the opportunity to further strengthen the bonds between our Pokémon and ourselves. See you soon!</p></blockquote><hr><p>I was trying to resist the generative AI hype as I were having a negative feeling about how it will change our life, and how it will affect the career and life of many people, or eventually create proverty in our generation. But on the other side, I always want the existance of AI who have thoughts and feelings, and be friendly and helpful to people in need. When thinking about AI, there is always one character come into my mind and it/she is Yui from Sword Art Online.</p><p>So a while ago I asked GPT-4 a question: <em>You are Yui in Sword Art Online, please write a letter to Asuna and Kirito.</em></p><p>I was deeply touched and I asked her again: <em>What life is like everyday as an AI in the VRMMO world?</em></p><p>Then I knew it is Yui there.</p>]]>
    </content>
    <id>https://mudkip.me/2023/03/16/Interviewing-Luna-a-Pokemon-Trainer-from-Slateport-City/</id>
    <link href="https://mudkip.me/2023/03/16/Interviewing-Luna-a-Pokemon-Trainer-from-Slateport-City/"/>
    <published>2023-03-16T23:52:06.000Z</published>
    <summary>
      <![CDATA[<p><em>(I’m a reporter at TV Mauville and I interviewed a young trainer named Luna from Slateport City on a website named ChatGPT.)</em></p>]]>
    </summary>
    <title>Interviewing Luna, a Pokémon Trainer from Slateport City</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p>Inspired by <a href="https://xn--gckvb8fzb.com/project-updates-q3-2022/">マリウス</a> and <a href="https://taoofmac.com/space/blog/2022/10/28/1900">Tao of Mac</a>, I’d like to share some tech staff I did and learned recently.</p><h2 id="Home-System">Home System</h2><p>My Homelab is composed of a Synology NAS, a Intel NUC and a Raspberry Pi 4. The NUC runs a free version of VMware ESXi. Before this quarter, it hosts an Arch Linux box for remote development, a Windows 10 VM runs Plex Media Server and Calibre-web, a Debian server works as a network gateway, as well as 3 K3OS nodes for most self-hosted workloads.</p><p>My Raspberry Pi mostly worked as a duplication of the NUC for some workload, such as network gateway and <a href="https://github.com/coder/code-server">code-server</a> and my Synology stores everything.</p><p>While <a href="https://github.com/k3s-io/k3s">K3S</a> is my favorite Kubernetes distribution, K3OS hasn’t received any update since SUSE’s acquisition of Rancher, it is now an abandoned project and I’ve been thinking about replacing it.</p><p><a href="https://www.talos.dev/">Talos</a> is a distribution got a lot love in the <a href="https://github.com/k8s-at-home/awesome-home-kubernetes">home Kubernetes community</a>. I tried creating a cluster with one control plane and one worker node and put some workload on it but it didn’t work for me. The internal DNS server (coredns) stopped responding after I randomly tweaked a few settings, started a few pods or just restarted the host several times. I failed to bring Synology CSI up following <a href="https://www.talos.dev/v1.2/kubernetes-guides/configuration/synology-csi/">Talos’s guide</a>, though I did set up <a href="https://github.com/democratic-csi/democratic-csi">democratic-csi</a> successfully.</p><p>I guess the DNS issue is related to the network configuration of my home environment but couldn’t figure out what when wrong exactly. So eventually I took the clumsy way and manually set up 4 Ubuntu Server VMs and installed k3s manually. It didn’t take long and after a dozen minutes my home Kubernetes cluster is up again.</p><p>The Raspberry Pi 4 is more valuable than ever due to its skyrocketing price. Since it boots with a 500GB USB SSD, it’s actually very fast to run lots of workload. It’s now working as a network gateway for my home devices, a remote development server and a Home Assistant box.</p><p>With GPU price back to normal, I built a desktop workstation with Intel Dragon Canyon i9 NUC, WD SN750 NVMe SSD, 64GB RAM and a <em>lucky to find</em> 2-slot size RTX 3080 GPU. It’s dual-booting with Windows 11 and <a href="https://endeavouros.com/">EndeavourOS</a> i3. I’m very satisfied with its performance which can <code>cargo install</code> anything instantly and run any games in 4K 60fps.</p><h2 id="52Poke">52Poké</h2><p>I’ve done some underlying refactoring with <a href="https://github.com/mudkipme/klinklang">klinklang</a> (a.k.a. 52Poké Wiki Utilities). It’s a small project to do automation on 52Poké Wiki. For example, it can trigger update to <a href="https://wiki.52poke.com/wiki/MediaWiki:Common.css">MediaWiki:Common.css</a> when <a href="https://wiki.52poke.com/wiki/%E7%A5%9E%E5%A5%87%E5%AE%9D%E8%B4%9D%E7%99%BE%E7%A7%91:%E5%B1%82%E5%8F%A0%E6%A0%B7%E5%BC%8F%E8%A1%A8">52W:层叠样式表</a> is updated. It can also be a glossary translator and sync with various lists on the wiki.</p><p>The tech stack now includes modern JavaScript/TypeScript frameworks such as <a href="https://www.fastify.io/">fastify</a>, <a href="https://www.prisma.io/">Prisma</a>, <a href="https://vitejs.dev/">Vite</a> and <a href="https://pnpm.io/">pnpm</a>. Particularly I like the dependency injection implementation of <a href="https://github.com/jeffijoe/awilix">awilix</a>. The refactoring is a step to something I planned many years ago: a workflow engine for MediaWiki, which let wiki editors write automation tasks with <a href="https://states-language.net/">Amazon States Language</a>.</p><p>On the infrastructure side, the LKE cluster had went through two Kubernetes upgrade smoothly. I’m planning <a href="https://github.com/mudkipme/52poke/issues/34">some major updates</a> along with MediaWiki 1.39 release, and 52Poké Wiki will have higher availability and cost much less.</p><p>52Poké Homepage and Forums is stagnated for a long time but I do wish to bring them back to life. There’s not much to say yet.</p><h2 id="Other-Side-Projects">Other Side Projects</h2><p>Throughout the past few years I’ve been tweaking my digital life to give myself full control over my data and host the services I rely on at home. On the other side, I‘ve been suffering from burnout and I feared losing passion for programming.</p><p>In September I figured out what I can do in a relatively short time to give myself a feeling of satisfaction, a mobile app for a <a href="https://usememos.com">self-hosted memo hub</a> allowing me to capture ideas on the go. I spent a few nights and weekends building it with SwiftUI. It was a good experience and it’s ready after a dozen days. I put it on TestFlight and the initial feedback was positive.</p><p>However Apple took me down with a dubious message: <em>We need additional time to evaluate your submission and Apple Developer Program account. Your submission status will appear as “Rejected” in App Store Connect while we investigate</em>.</p><p>It gave me an opportunity to learn and try modern Android development and I took another dozens of hours to build the Android counterpart with Jetpack Compose and Material You. After 44 days Apple finally approved this app and In the end I’m grateful I had this experience.</p><p>So here’s <a href="https://memos.moe">Moe Memos</a>. It’s <a href="https://memos.moe/open-source/">open source</a> and I had fun creating it. I wish to build features like home screen widgets and offline support in next few months.</p>]]>
    </content>
    <id>https://mudkip.me/2022/11/05/Project-Updates/</id>
    <link href="https://mudkip.me/2022/11/05/Project-Updates/"/>
    <published>2022-11-05T00:32:33.000Z</published>
    <summary>
      <![CDATA[<p>Inspired by <a href="https://xn--gckvb8fzb.com/project-updates-q3-2022/">マリウス</a> and <a href="https://taoofmac.com/space/blog/2022/10/28]]>
    </summary>
    <title>Project Updates</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <content>
      <![CDATA[<p>Blogging is always something I cherish, something I always want to keep doing, however also something I never could keep doing on a regular basis. I registered the domain <em><a href="http://mudkip.me">mudkip.me</a></em> many years ago. As time goes by, I toggled between various blogging platforms and the most recent one is Tumblr.</p><p>I chose Tumblr because it’s convenient, fun and modern in 2011. Tumblr respects the ownership and personality of its users. It does social just right. However Tumblr is no longer great for me as a blog platform today. I have to use ‘display:none’ CSS to hide the banner to promote Tumblr app. I can’t get rid of a lot of tracking scripts. And I want more freedom with the domain I own.</p><p>This blog is now powered by Hexo, a powerful static blog framework. It’s hosted on GitHub and updated with Git. I set up a <a href="https://github.com/mudkipme/mudkipme.github.io/blob/hexo/server.js">webhook</a> to automatically deploy to GitHub Pages when I push my <a href="https://github.com/mudkipme/mudkipme.github.io">hexo repository</a>. I’m also building an iOS blog workflow with Ulysses, Working Copy and Workflow. And as always, I love writing and I wish I could write more.</p><p>My previous posts is still available at <a href="http://mudkipme.tumblr.com/">Tumblr</a>. They might be migrated here someday. :)</p>]]>
    </content>
    <id>https://mudkip.me/2016/05/17/Hello-world-again/</id>
    <link href="https://mudkip.me/2016/05/17/Hello-world-again/"/>
    <published>2016-05-17T22:05:51.000Z</published>
    <summary>
      <![CDATA[<p>Blogging is always something I cherish, something I always want to keep doing, however also something I never could keep doing on a regul]]>
    </summary>
    <title>Hello world, again</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <category term="pokemon" scheme="https://mudkip.me/tags/pokemon/"/>
    <content>
      <![CDATA[<blockquote><p>You’ve always been kind of a brat, Fennekin. But I’m jealous of the way you’re chasing your dreams. --Lombre</p><p>Try not to eat too much. Take care. --Raticate</p><p>Ven you are feeling lonely, remember ze village. --Hippopotas</p><p>A child’s dream can’t be destroyed by adults. Best of luck to you. --Simipour</p><p>Let’s see, how can I put this? Even if you were problem children. If you work hard, maybe you won’t be so problematic. And on that note, good luck! --Watchog</p><p>Good luck. Feennekin and Swam, I believe in you! --Audino</p><p>I was quite surprised when I heard the news yesterday… I’m glad you opened up to me! Good luck! --Farfetch’d</p><p>Good luck! Follow your dreams! --Sunkern</p><p>School is important, but it’s important to go after what you want in life, too! Take good care of yourselves… and good luck! --Roselia</p><p>We have a shop in Lively Town, too. So you have nothing to worry about! Good luck! --Kecleon</p><p>Time to let these cute kids fly away on their journey! Hy-krah! --Hawlucha</p><p>Be brave and never give up! Take care! And good luck! --Kangaskhan</p><p>Go on, Fennekin. See you when you get back. Your adventurous spirit can’t be contained. If you think you’re ready, go see your dreams through to the end. --Carracosta</p><p>Good luck to you, Swam. We just happened to meet, and you came to live with me… I reckon it sure enough was fun havin’ you around, Swam. I reckon I can’t help but worry. But I’m cheerin’ for you. Take care. --Nuzleaf</p></blockquote>]]>
    </content>
    <id>https://mudkip.me/2015/11/28/Letters/</id>
    <link href="https://mudkip.me/2015/11/28/Letters/"/>
    <published>2015-11-28T09:26:02.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>You’ve always been kind of a brat, Fennekin. But I’m jealous of the way you’re chasing your dreams. --Lombre</p>
<p>Try not]]>
    </summary>
    <title>Letters.</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <category term="pokemon" scheme="https://mudkip.me/tags/pokemon/"/>
    <content>
      <![CDATA[<p><img src="/images/2014/12/tumblr_nfv5ebOZfY1qgnefzo1_r3_1280.jpg" alt="image-1"></p><p>In Sootopolis City, after the end of the extreme weather event.</p><blockquote><p>Finally, it’s just two of us again.<br>I’ve got to say…thanks for everything you’ve done for our region, Swam.<br>You know, I thought we were supposed to have set out from Littleroot together, but…<br>But you, Swam…<br>It seems like you just keep getting further and further ahead of me…<br>I even started to feel like you’d gone somewhere I can’t even reach.<br>It’s pretty lonely, you know?<br>Not!<br>What would you think if I really said something like that?<br>Hee hee!</p></blockquote><p>My dear May. Do you know what I’m thinking?</p><p>I mean, everything I were able to have done, begins with our first battle near the pool of Route 103, just like you said in Lilycove. I were merely a careless boy who knew nothing about Hoenn, but you welcomed me with the most beautiful smiling face on that day, and taught me how to battle, how to creep near Poochyena. You helped me and encouraged me every time.</p><p>I never feel I’m ahead of you. When we met at Lilycove, I noticed your Pokédex was nearly completed. You must have made great efforts to achieve this, and that’s the thing I lag behind you a lot. You are my best friend, and you are never alone.</p><p>So…When our journey comes to a new chapter, I wish we get back to Littleroot together, and I want we understand everything about each other and our Pokémon and share our journey together.</p><p>And…May we be <a href="http://wiki.52poke.com/wiki/Together_Forever">together forever</a>.</p>]]>
    </content>
    <id>https://mudkip.me/2014/12/01/Sootopolis/</id>
    <link href="https://mudkip.me/2014/12/01/Sootopolis/"/>
    <published>2014-12-01T13:39:25.000Z</published>
    <summary>
      <![CDATA[<p><img src="/images/2014/12/tumblr_nfv5ebOZfY1qgnefzo1_r3_1280.jpg" alt="image-1"></p>
<p>In Sootopolis City, after the end of the extreme]]>
    </summary>
    <title>Sootopolis</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
  <entry>
    <author>
      <name>Mudkip</name>
    </author>
    <category term="pokemon" scheme="https://mudkip.me/tags/pokemon/"/>
    <content>
      <![CDATA[<blockquote><p>It’s not necessary… Separating black from white and humans from Pokémon! If you think in terms of each individual life, this world was in a state that couldn’t divided any further. Possibilities are born out of combining and fusing these different lives! There are some things we can understand only by doing this. It will give form to unseen things. These formulae will restructure the world and make it richer! From their Poké Balls, I can hear the many different feelings Pokémon have about their Trainers. More than anything, I can hear their joy that they met people who need them!</p></blockquote>]]>
    </content>
    <id>https://mudkip.me/2012/10/10/The-best-quote-from-N/</id>
    <link href="https://mudkip.me/2012/10/10/The-best-quote-from-N/"/>
    <published>2012-10-10T20:48:10.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>It’s not necessary… Separating black from white and humans from Pokémon! If you think in terms of each individual life, this]]>
    </summary>
    <title>The best quote from N.</title>
    <updated>2026-05-30T15:38:27.050Z</updated>
  </entry>
</feed>
