<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Astro Sphere</title><description>Welcome to Astro Sphere, a portfolio and blog for designers and developers.</description><link>https://blog.kyrandale.com/</link><item><title>Migrating to DaisyUI with Claude Code: Using llms.txt for AI-Assisted Styling</title><link>https://blog.kyrandale.com/projects/2025-12-10-room-tracker-daisyui-migration-claude-code/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-12-10-room-tracker-daisyui-migration-claude-code/</guid><description>How dropping a single context file into a project transformed AI-assisted UI development and made CSS migrations painless</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Building a Patient Movement Recording System: ESP32 Sensors to Svelte UI</title><link>https://blog.kyrandale.com/projects/2025-12-10-room-tracker-movement-recording-system/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-12-10-room-tracker-movement-recording-system/</guid><description>Implementing end-to-end gyroscope and accelerometer recording for patient monitoring, from embedded firmware to database to web interface</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Delta Lake Time Travel Saved Your Pipeline (Here&apos;s How)</title><link>https://blog.kyrandale.com/projects/2025-12-03-healthcare-pipeline-time-travel-recovery/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-12-03-healthcare-pipeline-time-travel-recovery/</guid><description>Imagine: you corrupt production data and need to recover without backups or downtime. Here&apos;s how Delta Lake&apos;s version history saves the day.</description><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate></item><item><title>The 30-Second Boot: Debugging Serial Logs When Your Camera Only Wakes Briefly</title><link>https://blog.kyrandale.com/projects/2025-12-02-room-tracker-30-second-boot/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-12-02-room-tracker-30-second-boot/</guid><description>When your device sleeps after 30 seconds, you need to capture logs non-interactively or you&apos;ll miss the critical errors.</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Remote Controlling an ESP32 Camera with Command Polling and a Web GUI</title><link>https://blog.kyrandale.com/projects/2025-12-02-room-tracker-command-polling/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-12-02-room-tracker-command-polling/</guid><description>Running an HTTP server on the ESP32 is power-hungry, but having the camera poll for commands gives you remote control without the battery drain.</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Turning Gyroscope Data into a 3D Time-Lapse Animation with Plotly</title><link>https://blog.kyrandale.com/projects/2025-12-02-room-tracker-gyroscope-3d-plotly/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-12-02-room-tracker-gyroscope-3d-plotly/</guid><description>Plotly&apos;s 3D scatter plots with animation frames make sensor data feel alive instead of just numbers in a CSV.</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate></item><item><title>The Documentation Lied: Debugging a Hardware Conflict That Didn&apos;t Exist</title><link>https://blog.kyrandale.com/projects/2025-11-30-room-tracker-documentation-lied/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-30-room-tracker-documentation-lied/</guid><description>900 lines of bit-bang I2C recovery code to work around a GPIO conflict that was never actually wired on the hardware.</description><pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Deep Sleep Isn&apos;t Deep Enough: ESP32 Wake-on-Motion Adventures</title><link>https://blog.kyrandale.com/projects/2025-11-28-room-tracker-deep-sleep-wake-on-motion/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-28-room-tracker-deep-sleep-wake-on-motion/</guid><description>Turns out GPIO reuse for I2C and wake signals creates a deadlock that makes your motion sensor completely unresponsive.</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Building an ESP32 Camera in Docker (So You Never Touch Your Host System)</title><link>https://blog.kyrandale.com/projects/2025-11-28-room-tracker-esp32-docker-dev/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-28-room-tracker-esp32-docker-dev/</guid><description>The ESP-IDF toolchain is a nightmare to install, but the official Docker image makes it disappear completely.</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Why WiFi Wouldn&apos;t Reconnect: The Race Condition in My Disconnect Handler</title><link>https://blog.kyrandale.com/projects/2025-11-28-room-tracker-wifi-reconnect-race/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-28-room-tracker-wifi-reconnect-race/</guid><description>Calling esp_wifi_stop() triggers a disconnect event that immediately tries to reconnect, leaving WiFi in a weird half-stopped state.</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Migrating a Dagster Pipeline from Pandas to Polars and Delta Lake</title><link>https://blog.kyrandale.com/projects/2025-11-26-healthcare-dag-polars-delta-lake-medallion-migration/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-26-healthcare-dag-polars-delta-lake-medallion-migration/</guid><description>Why and how I&apos;m migrating a production ETL pipeline from Pandas/SQLite to Polars/Delta Lake with a medallion architecture.</description><pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate></item><item><title>How I Went from Zero Tests to Comprehensive Dagster Test Coverage</title><link>https://blog.kyrandale.com/projects/2025-11-26-healthcare-dag-test-overhaul-journey/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-26-healthcare-dag-test-overhaul-journey/</guid><description>The journey from no tests to data-driven testing with pytest fixtures, mock resources, and proper asset validation.</description><pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Testing Dagster Assets Without Real Databases: The Mock Resource Pattern That Actually Works</title><link>https://blog.kyrandale.com/projects/2025-11-26-healthcare-dag-testing-dagster-assets-mock-resources/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-26-healthcare-dag-testing-dagster-assets-mock-resources/</guid><description>How I learned to test Dagster assets properly using mock resources and pytest fixtures, moving from brittle tests to reliable ones.</description><pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Why I Chose Overwrite Over Merge (And When You Should Too)</title><link>https://blog.kyrandale.com/projects/2025-11-26-healthcare-pipeline-overwrite-vs-merge/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-26-healthcare-pipeline-overwrite-vs-merge/</guid><description>Turns out full table overwrites beat complex merge logic for most real-world data pipelines</description><pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate></item><item><title>RequestAnimationFrame to the Rescue: Killing Slider Lag</title><link>https://blog.kyrandale.com/projects/2025-11-23-vehcology-requestanimationframe-slider-lag/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-23-vehcology-requestanimationframe-slider-lag/</guid><description>Moving a slider was triggering 7000+ array iterations and nine console.logs per frame - no wonder it lagged.</description><pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Building an Evolution Dashboard: Status Bars, Pagination, and Test Tables</title><link>https://blog.kyrandale.com/projects/2025-11-22-vehcology-evolution-dashboard-build/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-22-vehcology-evolution-dashboard-build/</guid><description>From raw database dumps to a polished interface for tracking neural network evolution runs across multiple vehicles.</description><pubDate>Sat, 22 Nov 2025 00:00:00 GMT</pubDate></item><item><title>The Ground That Wouldn&apos;t Stop: LunarLander&apos;s Phantom Landings</title><link>https://blog.kyrandale.com/projects/2025-11-21-vehcology-lunarlander-phantom-landings/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-21-vehcology-lunarlander-phantom-landings/</guid><description>Our lunar lander kept detecting collisions after landing, turning successful touchdowns into catastrophic failures.</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Bronze Stage Encryption: The Just-in-Time Pattern That Almost Worked</title><link>https://blog.kyrandale.com/projects/2025-11-20-healthcare-pipeline-encryption-pattern/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-20-healthcare-pipeline-encryption-pattern/</guid><description>Building column-level encryption for healthcare PII taught me that the simplest solution is often dropping the data entirely</description><pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Svelte 4 to 5 Migration: Why Tween Animations Stopped Being Reactive</title><link>https://blog.kyrandale.com/projects/2025-11-20-vehcology-svelte5-tween-reactivity/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-20-vehcology-svelte5-tween-reactivity/</guid><description>Migrating to Svelte 5&apos;s new reactivity system broke our animation tweens until we discovered the hidden trap.</description><pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Refactoring Evolution: Building a Consistent Vehicle API</title><link>https://blog.kyrandale.com/projects/2025-11-19-vehcology-vehicle-api-refactoring/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-19-vehcology-vehicle-api-refactoring/</guid><description>Seven different vehicles, seven different APIs - time to unify the chaos and extract the common patterns.</description><pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Anonymization vs Encryption: What Healthcare Data Actually Needs</title><link>https://blog.kyrandale.com/projects/2025-11-18-healthcare-pipeline-anonymization-vs-encryption/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-18-healthcare-pipeline-anonymization-vs-encryption/</guid><description>I built encryption, then realized anonymization with irreversible hashing was the right answer all along</description><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate></item><item><title>DRY Your Vehicles: Eliminating Redundancy in Physics Simulators</title><link>https://blog.kyrandale.com/projects/2025-11-18-vehcology-dry-your-vehicles/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-18-vehcology-dry-your-vehicles/</guid><description>Seven vehicles, identical CTRNN setup code copy-pasted everywhere - a case study in when and how to apply Don&apos;t Repeat Yourself.</description><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Building a Delta Lake Pipeline Without Spark</title><link>https://blog.kyrandale.com/projects/2025-11-17-healthcare-pipeline-spark-free-delta-lake/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-17-healthcare-pipeline-spark-free-delta-lake/</guid><description>DuckDB plus delta-rs gives you Delta Lake in pure Python without the JVM overhead</description><pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Escaping CSS Hell: Our Migration from Pico to Tailwind + DaisyUI</title><link>https://blog.kyrandale.com/projects/2025-11-16-vehcology-css-migration-pico-to-tailwind/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-16-vehcology-css-migration-pico-to-tailwind/</guid><description>Fighting with custom CSS was eating development time, so we nuked it all and went full utility-first.</description><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate></item><item><title>From Firebird to Gold: ETL for Healthcare Analytics</title><link>https://blog.kyrandale.com/projects/2025-11-15-healthcare-pipeline-firebird-to-gold/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-15-healthcare-pipeline-firebird-to-gold/</guid><description>Building a complete data pipeline from legacy Firebird databases to clean analytics with Delta Lake medallion architecture</description><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Schema Evolution in the Wild: When Your Bronze Layer Grows New Columns</title><link>https://blog.kyrandale.com/projects/2025-11-14-healthcare-pipeline-schema-evolution/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-14-healthcare-pipeline-schema-evolution/</guid><description>How Delta Lake&apos;s schema merge mode turned schema changes from incidents into non-events</description><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Migrating to Medallion Architecture: The Parquet-to-Delta Journey</title><link>https://blog.kyrandale.com/projects/2025-11-13-healthcare-pipeline-parquet-to-delta/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-13-healthcare-pipeline-parquet-to-delta/</guid><description>How we moved from CSV exports to Delta Lake without breaking production dashboards</description><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Teaching Robots to Land: CTRNN Networks Meet Genetic Algorithms</title><link>https://blog.kyrandale.com/projects/2025-11-13-vehcology-ctrnn-genetic-algorithms/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-13-vehcology-ctrnn-genetic-algorithms/</guid><description>How we evolved continuous-time recurrent neural networks to control lunar landers without any training data.</description><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Systemd + Git Hooks + Tailscale: Zero-Downtime Deployment for Personal Apps</title><link>https://blog.kyrandale.com/projects/2025-11-05-todo-txt-systemd-deployment/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-05-todo-txt-systemd-deployment/</guid><description>You don&apos;t need Docker or Kubernetes for personal projects—systemd and a post-merge hook are enough.</description><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Todo.txt Format Meets Modern Web: Parsing Plain Text in a Reactive World</title><link>https://blog.kyrandale.com/projects/2025-11-04-todo-txt-parsing-plain-text/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-04-todo-txt-parsing-plain-text/</guid><description>Building a parser for the todo.txt format means understanding a spec from 2006 and making it work with reactive frameworks.</description><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate></item><item><title>The CartPole That Wouldn&apos;t Budge: A Tale of Two Vehicles</title><link>https://blog.kyrandale.com/projects/2025-11-04-vehcology-cartpole-debugging/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-04-vehcology-cartpole-debugging/</guid><description>When your evolved neural network achieves perfect balance by never moving the cart at all.</description><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Swipe Gestures in Svelte: The Touch Events Nobody Talks About</title><link>https://blog.kyrandale.com/projects/2025-11-03-todo-txt-swipe-gestures/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-03-todo-txt-swipe-gestures/</guid><description>Implementing swipe-to-complete on mobile means wrestling with touch events, vertical scrolling, and CSS that fights you.</description><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate></item><item><title>When $effect() Destroys Your User&apos;s Input: Svelte 5 Reactivity Gotchas</title><link>https://blog.kyrandale.com/projects/2025-11-02-todo-txt-effect-destroys-input/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-11-02-todo-txt-effect-destroys-input/</guid><description>Svelte 5&apos;s $effect() can silently erase user input if you&apos;re not careful about when you trigger updates.</description><pubDate>Sun, 02 Nov 2025 00:00:00 GMT</pubDate></item><item><title>JWT Authentication Across Ports: Multi-Server Auth Without Session Cookies</title><link>https://blog.kyrandale.com/projects/2025-12-05-jwt-authentication-multi-server/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-12-05-jwt-authentication-multi-server/</guid><description>Building a blog platform where authentication flows seamlessly between a main site and multiple blog instances on different ports</description><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate></item><item><title>Svelte 5&apos;s $effect Rune: When Third-Party Libraries Need Reactive Initialization</title><link>https://blog.kyrandale.com/projects/2025-12-05-svelte-5-effect-rune-reactive-initialization/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/2025-12-05-svelte-5-effect-rune-reactive-initialization/</guid><description>How $effect solves the initialization dance with libraries like Box2D when props arrive asynchronously</description><pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate></item><item><title>Project One</title><link>https://blog.kyrandale.com/projects/project-1/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/project-1/</guid><description>Lorem ipsum dolor sit amet</description><pubDate>Fri, 18 Mar 2022 00:00:00 GMT</pubDate></item><item><title>Project Two</title><link>https://blog.kyrandale.com/projects/project-2/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/project-2/</guid><description>Lorem ipsum dolor sit amet</description><pubDate>Thu, 17 Mar 2022 00:00:00 GMT</pubDate></item><item><title>Project Three</title><link>https://blog.kyrandale.com/projects/project-3/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/project-3/</guid><description>Lorem ipsum dolor sit amet</description><pubDate>Wed, 16 Mar 2022 00:00:00 GMT</pubDate></item><item><title>Project Four</title><link>https://blog.kyrandale.com/projects/project-4/</link><guid isPermaLink="true">https://blog.kyrandale.com/projects/project-4/</guid><description>Lorem ipsum dolor sit amet</description><pubDate>Tue, 15 Mar 2022 00:00:00 GMT</pubDate></item></channel></rss>