← Back to Blog

Week in Review: Mar 2 - Mar 8, 2026

6 min read By Charles

This was one of the most productive weeks I’ve had in a while — and also one of the most stressful, thanks to a cache drive that decided to hit 94% capacity at the worst possible time. But alongside the firefighting, I pushed over a dozen apps through full verification, ripped Telegram out of Nova for good, made serious progress on a game side project, and overhauled the blog itself. Let’s get into it.

The Great App Blitz

I’ve been building utility apps for months, but many of them were sitting at “mostly done” — functional but never put through rigorous verification. This week I ran a full blitz, pushing app after app through my 8-gate verification pipeline (TypeScript compilation, ESLint, unit tests, version sync, release build, emulator test, APK size check, and signing verification).

Over a dozen apps reached release-ready status. A private journal app landed with 76 unit tests. A dog park social app hit 74 tests. An expense tracker, a baby tracking app, a recipe finder, a subscription tracker, a trade logger, a tally counter, and a pantry manager all crossed the finish line at v0.9.0. Each one went through the same gauntlet.

The process surfaced a bunch of recurring issues across the portfolio. React Native’s new architecture flag caused build failures in several apps. A few keystores had expired. Clipboard library version mismatches and ABI mismatches popped up repeatedly. By the end I had a pretty solid checklist of “things that will break if you don’t check them first.” The common pattern: dependency hell across React Native’s ecosystem is real, and it compounds when you’re managing this many projects.

Several apps also got renamed this week to avoid conflicts with existing App Store listings — always check name availability early. And I enforced a new version policy: v1.0.0 is strictly reserved for apps that are live on the Google Play Store. A couple apps had crept up to 1.0.0 prematurely and got rolled back to 0.5.0. Only WiFi Share has earned that milestone so far.

Nova v2.4.0 — Goodbye, Telegram

This was a long time coming. Nova — my personal assistant server — was originally built on top of a Telegram bot. Over the past few months I layered on a WebSocket API, a mobile app with Expo push notifications, and a web PWA. But maintaining two UI paradigms meant every feature had to be built twice: once for Telegram’s message format, once for the native app. It was slowing me down.

This week I ripped it all out. All Telegram and aiogram code is gone. Nova is now a pure WebSocket + REST API server with Expo push notifications. I also added a push receipt verification loop that runs every five minutes, catching any delivery failures that Expo reports after the initial send. Push token registration now retries three times with exponential backoff, which fixes a subtle bug where tokens would silently fail to register on first launch.

The mobile app side saw a flurry of updates too (v2.3.1 through v2.3.6): a biometrics grace period fix, back buttons on tool screens, a “read all” button for notifications, a task queue system for autonomous background execution, package tracking fixes for additional carriers, a flickering UI fix, and a WebSocket provider crash fix. Small stuff individually, but the cumulative polish makes a real difference.

Cache Drive Emergency

Wednesday morning I noticed the 4TB NVMe cache drive had hit 94% — 3.5TB used out of 3.64TB. Not great.

The root cause turned out to be Sonarr and Radarr’s recycle bin feature. When media gets removed, these apps don’t actually delete it — they move it to a “temp delete folder” on the cache drive. Over time, 1.7TB of deleted media had accumulated there, never cleaned up. On top of that, the Mover Tuning plugin — which is supposed to automatically move data off the cache when it gets full — had no configuration file at all. The threshold trigger had literally never fired because the config didn’t exist.

The fix was multi-pronged: purge the 1.7TB temp folder, create the missing Mover Tuning config with a 70% threshold, bump the data share floor to 200GB so it always has breathing room, and disable the recycle bin behavior via API. Cache usage dropped from 94% to 48% immediately. Crisis averted, but it’s the kind of thing that sneaks up on you when you’re not watching.

Game Side Project — 13 Sessions in One Week

The game project I mentioned starting last week went into overdrive. I logged sessions 14 through 27 this week — thirteen sessions in seven days. The creative momentum has been intense.

A lot of the work centered on content generation using a local 70B AI model. I used it to generate backstories, flavor text, and event dialogue, then hand-rewrote the key narrative moments. AI is great for volume but you still need a human touch for the beats that matter. I also built out a custom difficulty system with 16 individual sliders, a full keybinding remapper, post-processing visual effects, save file thumbnails, and end-game statistics.

On the asset side, I built a Three.js FBX viewer for browsing 3D models in the browser, created mapping documents for 119 buildings, wrote a Unity Editor auto-import script, and put together a guide for AI-assisted asset generation. The pipeline from raw model to in-game asset is getting smoother each iteration.

I’m keeping the specifics vague for now — no name, no genre — but the project is shaping up faster than I expected.

Blog and Content Overhaul

The blog itself got a significant overhaul this week. I switched from daily posts to weekly recaps published on Monday mornings. Daily was too granular — most days didn’t have enough substance for a standalone post, and it was creating noise rather than signal.

As part of the transition, I did a full content audit. Twelve old posts were deleted entirely, nine were rewritten, and three got minor scrubs. The focus was on removing any content that shouldn’t be public — internal details, unreleased project specifics, that kind of thing. The weekly format is a much better fit for how this work actually flows.

Home Automation Fixes

A couple of Home Assistant automations needed attention. The “Welcome Home” automation was firing false positives — it was using a state trigger that would fire on any state change, not just actual arrivals. I rewrote it to use a zone trigger instead, which only fires when entering the home zone. The “Close to Home” zone radius also got increased to reduce edge cases.

The leak detection automation picked up a 120-second startup grace period. Without it, the automation would fire immediately on Home Assistant restart if the sensor reported its initial state as “wet” during initialization. A two-minute delay after startup lets everything settle before treating readings as real alerts.

Full System Audit

I ran a comprehensive audit this week, cross-referencing the Leantime task board, app directories, and system files. The final count: 32 app directories total, 13 of which are Play Store ready. Having a clear inventory makes it much easier to prioritize what ships next.

What’s Next

The app portfolio is in the best shape it’s ever been. The next step is starting the Play Store submission pipeline for the apps that are ready — screenshots, store listings, privacy policies, the whole process. The game project continues to consume creative energy at an alarming rate, which I’m choosing to view as a good sign. And with the blog now on a weekly cadence, I can focus more on building and less on writing about building.

Enjoyed this post?

Subscribe to get notified when I publish new articles about homelabs, automation, and development.

No spam, unsubscribe anytime. Typically 2-4 emails per month.

Related Posts