<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>t.laboratory (English)</title><link>https://tlaboratory.net/en/</link><description>Practical write-ups on software development — Flutter, app operations, servers, scraping and AI — from running 15+ apps in production.</description><language>en</language><item><title>A 411-Line Python Site Generator for a 3-Language Blog</title><link>https://tlaboratory.net/en/python-static-site-generator-multilingual/</link><guid>https://tlaboratory.net/en/python-static-site-generator-multilingual/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Why we wrote our own static site generator instead of using Hugo, and how it handles hreflang, noindex legacy posts, ad slots, JSON-LD and safe incremental FTP deploys.</description></item><item><title>Prepared Statements Can Change Your JSON Types in PHP</title><link>https://tlaboratory.net/en/php-prepared-statements-change-json-number-types/</link><guid>https://tlaboratory.net/en/php-prepared-statements-change-json-number-types/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Switching mysqli query() to prepared statements turns &quot;7&quot; into 7 in json_encode. Measured on PHP 8.5 + MariaDB 11.8, and why an old Flutter app crashes on it.</description></item><item><title>LiteSpeed .htaccess and Non-ASCII URLs, Measured</title><link>https://tlaboratory.net/en/litespeed-htaccess-rewrite-non-ascii-urls/</link><guid>https://tlaboratory.net/en/litespeed-htaccess-rewrite-non-ascii-urls/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Encoded or decoded patterns, how to write a space, whether a 301 keeps the query string: 23 requests against a real LiteSpeed server, and how to test safely.</description></item><item><title>What Silently Broke After a Hosting Account Migration</title><link>https://tlaboratory.net/en/hosting-account-migration-what-broke/</link><guid>https://tlaboratory.net/en/hosting-account-migration-what-broke/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Every page returned 200 after a hosting account move, yet the FTP root, cron paths, venv, permissions and a cron field had all quietly broken.</description></item><item><title>16 Apps to Modern Flutter in 8 Weeks: What Broke</title><link>https://tlaboratory.net/en/flutter-migration-16-apps-what-broke/</link><guid>https://tlaboratory.net/en/flutter-migration-16-apps-what-broke/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>6 web-view wrappers went native and 10 older Flutter apps were modernised in 8 weeks. The build errors, store rejections and rollbacks we hit.</description></item><item><title>Scheduled FCM Pushes From a PHP Cron on Shared Hosting</title><link>https://tlaboratory.net/en/fcm-scheduled-push-php-cron/</link><guid>https://tlaboratory.net/en/fcm-scheduled-push-php-cron/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Result notifications for 8 Flutter apps from a 5-minute PHP cron and FCM HTTP v1. Send when the data changed, once a day, and never trust a 200.</description></item><item><title>Dart http Does Not Follow 301 on POST: Measured</title><link>https://tlaboratory.net/en/dart-http-post-redirect-not-followed/</link><guid>https://tlaboratory.net/en/dart-http-post-redirect-not-followed/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>A Flutter app search failed silently on a POST 301. What Dart 3.11 and http 1.6 do for every redirect code, compared with curl, and a tested fix.</description></item><item><title>Your Host&#x27;s CDN May Be Caching API Responses and 301s</title><link>https://tlaboratory.net/en/cdn-caches-api-responses-and-redirects/</link><guid>https://tlaboratory.net/en/cdn-caches-api-responses-and-redirects/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>After a routing change, four API URLs kept serving old 301s from the CDN. What Hostinger&#x27;s CDN caches, measured header by header.</description></item><item><title>Writing App Privacy Policies From Manifests, Not Memory</title><link>https://tlaboratory.net/en/app-privacy-policy-from-manifests/</link><guid>https://tlaboratory.net/en/app-privacy-policy-from-manifests/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>24 store listings pointed at a placeholder template. We rebuilt policies for 17 apps from pubspec, Info.plist and the merged Android manifest.</description></item><item><title>Binary Search in C: Re-running Our 2021 Code</title><link>https://tlaboratory.net/en/algorithm-binary-search/</link><guid>https://tlaboratory.net/en/algorithm-binary-search/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Binary search halves a sorted array on every step. Our 2021 example no longer compiled, its comparison counts were off by one, and it had the classic overflow bug. Fixed and measured.</description></item><item><title>Tuning AdMob in 17 Flutter Apps From Our Own Server</title><link>https://tlaboratory.net/en/admob-remote-ad-config-server/</link><guid>https://tlaboratory.net/en/admob-remote-ad-config-server/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Why we replaced Firebase Remote Config with a 141-line PHP endpoint, the app-side fallback, and what changing ad intervals without a rebuild did to CTR.</description></item><item><title>WordPress to Static Without Breaking App Store URLs</title><link>https://tlaboratory.net/en/wordpress-to-static-without-breaking-store-urls/</link><guid>https://tlaboratory.net/en/wordpress-to-static-without-breaking-store-urls/</guid><pubDate>Sun, 08 Nov 2026 00:00:00 +0000</pubDate><description>24 store listings pointed at WordPress pages. How we moved to a static site on LiteSpeed, kept every registered URL at 200 and cut over in 5 minutes.</description></item><item><title>Reorganize a Legacy PHP API Without Breaking Old Apps</title><link>https://tlaboratory.net/en/move-legacy-php-api-without-breaking-old-app-versions/</link><guid>https://tlaboratory.net/en/move-legacy-php-api-without-breaking-old-app-versions/</guid><pubDate>Sun, 08 Nov 2026 00:00:00 +0000</pubDate><description>8 API folders, 102 PHP files and apps you cannot force-update. Moving them under /api/v1 with internal rewrites, response snapshots and a proof header.</description></item><item><title>AI Coding Agent on a Live Server: Guardrails That Held</title><link>https://tlaboratory.net/en/ai-coding-agent-live-server-guardrails/</link><guid>https://tlaboratory.net/en/ai-coding-agent-live-server-guardrails/</guid><pubDate>Sun, 08 Nov 2026 00:00:00 +0000</pubDate><description>An AI agent migrated our live site and 8 app APIs in one evening. The mistakes it made, the checks that caught them, and what stayed with humans.</description></item></channel></rss>
