<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Felix&apos;s Blog</title><description>Programming notes by Felix - system design, side projects, and the occasional cry about JavaScript.</description><link>https://felix.codes</link><item><title>Architecture: Transactions and Isolation Levels</title><link>https://felix.codes/blog/architecture-transaction-isolation</link><guid isPermaLink="true">https://felix.codes/blog/architecture-transaction-isolation</guid><description>Dirty reads, lost updates and write skew, what the four isolation levels actually prevent, and why your database&apos;s default is weaker than you think. With two transactions you can step through yourself.</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate></item><item><title>OpossumTS.net - Where I Learned to Build Things</title><link>https://felix.codes/blog/opossumts--teamspeak-community</link><guid isPermaLink="true">https://felix.codes/blog/opossumts--teamspeak-community</guid><description>For a few years I ran a public TeamSpeak server that gave away free permanent channels, ended up with 11,812 tracked identities across 51 countries, and grew a sprawl of PHP around it: a channel garbage collector, League of Legends rank badges generated from Riot&apos;s API, post-match analysis delivered into voice chat, self-hosted video calls, and a currency you earned by voting. The database is gone. This is what I could piece back together.</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate></item><item><title>MCA Benches - GW2 Benchmark Tracker</title><link>https://felix.codes/blog/mca-benches--hobby-project</link><guid isPermaLink="true">https://felix.codes/blog/mca-benches--hobby-project</guid><description>A Discord-gated web app for tracking Guild Wars 2 build benchmarks. It ingests dps.report logs, auto-validates submissions against the official bench, and diffs a player&apos;s rotation against the reference cast by cast. It&apos;s since grown into raid night planning and cross-guild tournaments, on a stack that idles at $0.40 a month.</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Brightness Lock - Dimming a Pixel for China&apos;s Transit QR Gates</title><link>https://felix.codes/blog/brightness-lock--hobby-project</link><guid isPermaLink="true">https://felix.codes/blog/brightness-lock--hobby-project</guid><description>An Android app born from a very specific travel bug: Chinese transit fare gates would not scan the Alipay/WeChat QR on our Pixels because the apps force the screen to full brightness and blow out the OLED. Brightness Lock dims it back, but only while those apps are in the foreground.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Unyap - On-Device Voice Note Transcription</title><link>https://felix.codes/blog/unyap--hobby-project</link><guid isPermaLink="true">https://felix.codes/blog/unyap--hobby-project</guid><description>An Android app that transcribes voice notes to text entirely on your phone with whisper.cpp. No audio or text ever leaves the device, words stream in as they decode, and it picks the right CPU kernels at runtime so it never crashes on older hardware.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate></item><item><title>MCA Hackathon - A Bot Battle Arena</title><link>https://felix.codes/blog/mca-hackathon-2024</link><guid isPermaLink="true">https://felix.codes/blog/mca-hackathon-2024</guid><description>A two-day hackathon for my friend group, built around one game: everyone writes a bot that fights in a turn-based arena. A Rust WebSocket server runs the match, a language-agnostic JSON protocol lets you compete in any language, and a React app renders it live.</description><pubDate>Sat, 05 Oct 2024 00:00:00 GMT</pubDate></item><item><title>Architecture: Database Sharding</title><link>https://felix.codes/blog/architecture-database-sharding</link><guid isPermaLink="true">https://felix.codes/blog/architecture-database-sharding</guid><description>When database sharding actually makes sense, and the simpler scaling options worth exhausting first. Sharding keys, horizontal scaling, and the trade-offs.</description><pubDate>Sun, 07 Apr 2024 00:00:00 GMT</pubDate></item><item><title>StreamAcademy Profiles - Link-in-Bio for Twitch Streamers</title><link>https://felix.codes/blog/streamacademy-profile-pages</link><guid isPermaLink="true">https://felix.codes/blog/streamacademy-profile-pages</guid><description>A profile page builder for German Twitch streamers, where the URL namespace was the users table and signing in with Twitch was the whole onboarding flow. It also shipped view analytics with the throttle on the wrong column, so the more traffic a profile got, the flatter its chart looked.</description><pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate></item><item><title>Architecture: Relational Databases</title><link>https://felix.codes/blog/architecture-relational-databases</link><guid isPermaLink="true">https://felix.codes/blog/architecture-relational-databases</guid><description>A practical look at two foundations of relational databases: how indexes speed up reads at the cost of writes, and how transactions keep your data consistent.</description><pubDate>Tue, 03 Jan 2023 00:00:00 GMT</pubDate></item><item><title>A Combat Analysis Mod for Guild Wars 2</title><link>https://felix.codes/blog/combat-analysis-mod-for-guild-wars-2</link><guid isPermaLink="true">https://felix.codes/blog/combat-analysis-mod-for-guild-wars-2</guid><description>Reverse-engineering Guild Wars 2 to build a DPS meter and combat overlay: DLL proxying to get code into the client, hooking the network layer through leftover assert strings, and simulating condition damage to within ~0.12% of the real numbers.</description><pubDate>Fri, 01 Jul 2022 00:00:00 GMT</pubDate></item><item><title>What I learned for my next Web Summit (2019)</title><link>https://felix.codes/blog/what-i-learned-for-my-next-web-summit-2019</link><guid isPermaLink="true">https://felix.codes/blog/what-i-learned-for-my-next-web-summit-2019</guid><description>Practical tips from my first Web Summit in Lisbon: grab your badge at the airport, plan ruthlessly, time your lunch, and actually use the event app to find people.</description><pubDate>Sat, 15 Jan 2022 00:00:00 GMT</pubDate></item><item><title>Dinermind - University Project</title><link>https://felix.codes/blog/dinermind--university-project</link><guid isPermaLink="true">https://felix.codes/blog/dinermind--university-project</guid><description>A native Android app built by a team of three in six weeks: it sends you random recipes when you leave a geofence, so you stop eating the same meals every day.</description><pubDate>Thu, 13 Jan 2022 00:00:00 GMT</pubDate></item><item><title>IconGenerator.eu - FontAwesome Icon Maker</title><link>https://felix.codes/blog/icongeneratoreu--hobby-project</link><guid isPermaLink="true">https://felix.codes/blog/icongeneratoreu--hobby-project</guid><description>A quick web tool for generating coherent-looking icons: it composes FontAwesome glyphs on a canvas, styles them to your taste, and exports a PNG. PHP and jQuery.</description><pubDate>Thu, 13 Jan 2022 00:00:00 GMT</pubDate></item><item><title>Measuring LiPo Voltage using an Arduino</title><link>https://felix.codes/blog/measuring-lipo-voltage-using-an-arduino</link><guid isPermaLink="true">https://felix.codes/blog/measuring-lipo-voltage-using-an-arduino</guid><description>Building a permanent Arduino monitor for the cells of an FPV drone&apos;s LiPo battery, using a voltage divider to bring 16.8 V down into the Arduino&apos;s 3.3 V range.</description><pubDate>Thu, 13 Jan 2022 00:00:00 GMT</pubDate></item><item><title>TeamSpeak.gg - A Toolkit for Somebody Else&apos;s Server</title><link>https://felix.codes/blog/teamspeakgg--hobby-project</link><guid isPermaLink="true">https://felix.codes/blog/teamspeakgg--hobby-project</guid><description>Other people running TeamSpeak servers asked if they could have the tooling I&apos;d built for mine. They couldn&apos;t, because it was single-purpose PHP hardcoded to one server. This is the two attempts at making it portable: a PHP panel in 2019 that got real users, and a Cloudflare Workers rewrite in 2021 that was finished and never launched.</description><pubDate>Mon, 19 Apr 2021 00:00:00 GMT</pubDate></item><item><title>How this Blog works with Serverless Workers</title><link>https://felix.codes/blog/how-this-blog-works-with-serverless-workers</link><guid isPermaLink="true">https://felix.codes/blog/how-this-blog-works-with-serverless-workers</guid><description>How a free Cloudflare Worker can rewrite a shared Notion page into a blog on your own domain - the original setup behind this site, since rebuilt.</description><pubDate>Thu, 07 May 2020 00:00:00 GMT</pubDate></item><item><title>StudentVoice - Voting by Pointing a Camera at a QR Code</title><link>https://felix.codes/blog/studentvoice-qr-code-voting</link><guid isPermaLink="true">https://felix.codes/blog/studentvoice-qr-code-voting</guid><description>A live poll on the screen in the university hallway. Two QR codes, one per answer, and the answer rides through Azure AD in the OAuth state parameter, so a single scan logs you in and votes at the same time. Plus a QR code with a logo punched through the middle that still scans.</description><pubDate>Sun, 08 Dec 2019 00:00:00 GMT</pubDate></item></channel></rss>