<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Kelven Galvão — Writing</title><description>Senior mobile engineer with 7+ years building Flutter applications for global consumer products across e-commerce, fintech, mobility and food delivery.</description><link>https://kelvengalvao.com</link><language>en</language><item><title>Designing agent_graph, an AI pipeline that QA-tests its own pull requests</title><link>https://kelvengalvao.com/blog/an-agent-that-returns-a-tested-pr</link><guid isPermaLink="true">https://kelvengalvao.com/blog/an-agent-that-returns-a-tested-pr</guid><description>A Dart framework that turns a ticket&apos;s requirements and definition of done into acceptance criteria, then holds the PR until a validator has driven the app and attached screenshots and recordings.</description><pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate><category>ai-agents</category><category>architecture</category><category>testing</category><category>dart</category></item><item><title>Building face check-in for a martial arts school</title><link>https://kelvengalvao.com/blog/face-recognition-that-never-leaves-the-device</link><guid isPermaLink="true">https://kelvengalvao.com/blog/face-recognition-that-never-leaves-the-device</guid><description>DojoEasy suggests who&apos;s in a class photo. The model runs in the browser, the face templates stay on the instructor&apos;s device, and two brothers in the same gi shaped the matching logic.</description><pubDate>Sun, 20 Sep 2026 00:00:00 GMT</pubDate><category>face-recognition</category><category>privacy</category><category>typescript</category></item><item><title>Keeping image memory under control in a Flutter shopping app</title><link>https://kelvengalvao.com/blog/four-caches-between-a-photo-and-the-screen</link><guid isPermaLink="true">https://kelvengalvao.com/blog/four-caches-between-a-photo-and-the-screen</guid><description>Our crash rate on older Android phones was 10% before the SKIMS x NIKE drop. This is how the app handles product images now, from the CDN URL down to the disk cache.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate><category>flutter</category><category>performance</category><category>memory</category></item><item><title>How I got our Flutter CI from 21 minutes to under 7</title><link>https://kelvengalvao.com/blog/flutter-ci-21-minutes-to-7</link><guid isPermaLink="true">https://kelvengalvao.com/blog/flutter-ci-21-minutes-to-7</guid><description>Step timings pointed at 304 Flutter engines booting per run, caches the tag builds could never read, and a staging job that compiled the same Dart twice.</description><pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate><category>flutter</category><category>ci</category><category>performance</category></item></channel></rss>