Senior Flutter Engineer β€’ Software Architect β€’ Google Developer Expert (Flutter) Building https://xitter.cf/t.co/fMtSNLQPT6, https://xitter.cf/t.co/MdfaRS0C8M

MontrΓ©al, QuΓ©bec πŸ‡¨πŸ‡¦
Joined November 2012
Hi! Thrilled to share that I'm officially a #GDE for #Flutter πŸŽ‰ πŸ₯³ πŸ’™. I'm Proud to be the first #GDE in Togo πŸ‡ΉπŸ‡¬ (certainly not the last). Glad to join the Experts community and looking forward to contribute and take Flutter to the moon πŸš€. @GoogleDevExpert @timsneath @nlycskn
72
54
13
439
42,370
A Nuxt BFF route that only forwards requests is a proxy with extra steps. Mine earns its place: same Zod schema as the form (shared/), apiKey from runtimeConfig, rate-limit before $fetch, errors mapped to field-level 422s. NestJS validates again: it has other callers. #Nuxt
2
1
5
304
Flutter's team (blog, Oct 20): with coding agents, verification is the bottleneck, not generation. Agreed, with one addition: a fast loop only counts if the agent closes it. Failing test first, then flutter test + a Maestro flow it can run itself via MCP. #Flutter
3
3
17
1,346
I’m excited to share that I’ll be speaking at DevFest MontrΓ©al 2026! 🎀 πŸ“… Friday, November 6, 2026 πŸ“ Ax.C Hub, MontrΓ©al My session: Agentic Mobile Testing: Automating Flutter E2E Flows with Maestro MCP We’ll look at how AI agents can take over the repetitive parts of end-to-end testing on Flutter apps, and what that means for how we ship mobile products. A big thank you to the DevFest MontrΓ©al organizing team for the opportunity, and to the Google Developer community for making events like this possible. If you’re in MontrΓ©al and care about mobile, Flutter, or AI-assisted dev workflows, come say hi! πŸ‘‹ 🎟️ Get your ticket: lnkd.in/gFbc7Pwt #DevFestMontreal #DevFest2026 #Flutter #MobileDevelopment #GDG #GoogleDeveloperExpert #AI #Testing @GoogleDevExpert
1
1
5
247
The best code I wrote this month? Markdown. Skills, guides, written conventions for coding agents. An agent on your codebase is a senior dev with amnesia: brilliant, but it guesses your patterns. Write them down once. The agent and the next hire read the same file.
1
210
Introducing Wordhabit 🦜 Wordhabit: 1 word a day, re-scheduled until mastered. Buildt solo in Flutter + Rive + Nestjs. Free on iPhone & Android. wordhabit.app/?utm_source=x&… cc @FlutterDev @rive_app @nestframework
3
1
9
487
I asked Claude Code for a launch video "worthy of Apple, Google or Netflix" for my mobile app WordHabit 2.0. An hour later: three renders. The one thing it couldn't do was listen to its own soundtrack. WordHabit 2.0 brings Ara, a parrot animated in Rive who greets you, reacts to your progress and celebrates your streak. Every win has its own sound, every tap a light vibration. No screen in the film is a mockup: Ara rendered from the .riv the app ships, the real app on the iOS simulator, a score in the key of the app's sound kit. It can't hear, so it measured the mix and found the app's sounds 6 to 15 dB too quiet. When a second Claude session started the same video on the same simulator, it stopped and asked me first. My part: the brief, the taste calls, the review. The know-how now lives in reusable skills. wordhabit.app/?utm_source=x&… Built with @rive_app @FlutterDev @GoogleDevExpert
6
12
978
I asked Claude Code for a launch video "worthy of Apple, Google or Netflix" for my mobile app WordHabit 2.0. An hour later: three renders. The one thing it couldn't do was listen to its own soundtrack. WordHabit 2.0 brings Ara, a parrot animated in Rive who greets you, reacts to your progress and celebrates your streak. Every win has its own sound, every tap a light vibration. No screen in the film is a mockup: Ara rendered from the .riv the app ships, the real app on the iOS simulator, a score in the key of the app's sound kit. It can't hear, so it measured the mix and found the app's sounds 6 to 15 dB too quiet. When a second Claude session started the same video on the same simulator, it stopped and asked me first. My part: the brief, the taste calls, the review. The know-how now lives in reusable skills. wordhabit.app/?utm_source=x&… Built with @rive_app @FlutterDev
4
13
790
English is not my first language, and I use it all day at work, in code reviews, emails and meetings. I usually know what I mean. Finding the exact word in the moment is the hard part. Learning ten new words a day feels productive, but by Friday most of them are gone. So I built WordHabit around one word a day, learned deeply. It is slower than ten words a day, on purpose. You see the meaning, an example sentence and synonyms, so you understand how the word is really used. Then spaced repetition brings it back. The gap grows from 1 day to 3, 7, 14 and 30 days while you keep getting it right, and a miss brings it back the next day without taking your progress away. That last part matters because you grade the flashcards yourself. If a miss cost you progress, you would learn to tap "Got it" anyway, and the schedule would rest on wrong answers. The video shows the real app, recorded in the simulator on my own account. Ten words land, nine fall apart and one stays. Then it follows a real day in the app: the word card, the flashcards and the daily quiz, then my level, a badge and the library. The daily word, the flashcards and the daily quiz are free, and they will stay free. I build WordHabit alone, and a little over 2,000 people have installed it so far, on iPhone and Android, to learn English, French or Spanish. wordhabit.app/?utm_source=li…
3
238
Your AI agent writes Flutter fast. Not clean. Widgets importing repositories. try/catch in every layer. Firebase called from build(). I open-sourced the 6 rules that stop it: β†’ presentation never imports data β†’ failures are values, not exceptions β†’ every SDK behind a contract you own github.com/Ethiel97/flutter-… @FlutterDev @craig_labenz @GoogleDevExpert
4
8
33
2,066
WordHabit passed 1,500 downloads on the Play Store. About 70% of the ones I can trace came from a single creator's video. Everything else I built and published, combined, produced less than half of that. And a download isn't a user. Of everyone who finished a daily session this month, about one in five came back on a different day. So here's the number I actually watch. Daily active learners sat around 25 before that video. They're around 75 now, held for two weeks. 1,500 is a round number. 75 people showing up every day is the product working. Distribution can be one conversation with the right person. Retention is everything after it. wordhabit.app
125
I just rebuilt WordHabit's (wordhabit.app) onboarding after a week staring at PostHog funnels. The data was blunt: people don't drop off because the product is bad. They drop off because we make them work before they've seen any value. The old flow asked questions first. The new one flips it: β†’ Your first word is on screen one, blurred, two taps from unlocked. Curiosity does the job that forms used to do. β†’ Your language is detected, not asked. β†’ Every tap saves as you go. Close the app mid-flow, lose nothing. 3 screens. Under a minute to your first word. The lesson: onboarding isn't a form you fill in before the product starts. It IS the product sampled. Built with @FlutterDev #flutterDev #dart #shipaton #buildinginpublic
2
203
Made one for Nuxt, and it’s faaaaast too πŸš€ nuxtbooks.vercel.app/
I rebuilt an older Vercel book search demo with Next.js 16.3 Instant Navigations: next-books.dev Instant Navigations lets server-rendered routes respond immediately when you click, even on a throttled connection: πšŒπš˜πš—πšœπš πš—πšŽπš‘πšπ™²πš˜πš—πšπš’πš = { πšŒπšŠπšŒπš‘πšŽπ™²πš˜πš–πš™πš˜πš—πšŽπš—πšπšœ: πšπš›πšžπšŽ, πš™πšŠπš›πšπš’πšŠπš•π™Ώπš›πšŽπšπšŽπšπšŒπš‘πš’πš—πš: πšπš›πšžπšŽ }; Cache Components prerenders static, cached, and fallback UI. Partial Prefetching brings that reusable route UI to the browser before navigation. Add πš™πš›πšŽπšπšŽπšπšŒπš‘={πšπš›πšžπšŽ} when a link should also resolve its URL-dependent content before the click. Anything still missing loads on the server and streams into its Suspense boundary. The filters use πšžπšœπšŽπšƒπš›πšŠπš—πšœπš’πšπš’πš˜πš— to fade the catalog while the server updates and πšžπšœπšŽπ™Ύπš™πšπš’πš–πš’πšœπšπš’πšŒ to apply the next filter values immediately. Rebuilding the demo also improved initial loading. First Contentful Paint was 44% faster and Largest Contentful Paint was 33% faster than the original. See the source and learn more below ↓
10
11
172
26,270
Be honest, when did you last read an app's description in the store? I never do either. I swipe the screenshots and decide in about four seconds. Which makes it embarrassing that mine were six dark rectangles with tiny feature lists on them. Built in an hour, never opened again, while I spent months on everything that points to them. So I rebuilt the whole listing this week: β†’ One sentence per image instead of a feature list β†’ A face on every screen,our parrot finally got a 3D body β†’ Localised images, not just a translated description β†’ Every frame checked at 25% zoom, the size it actually gets seen at The part that surprised me: I wanted to A/B test it properly, the way you're supposed to. Play ran the numbers and told me the experiment needs 47,071 clicks to reach a conclusion. At my scale you don't get to test. You look hard, decide, ship, and measure what happens after. No results yet. It went live today, and I'll post the numbers when there are numbers, flat ones included. Before and after below. It's live at wordhabit.app: one word a day, learned properly. Android and iOS, in English, French and Spanish. So what actually makes you install, the screenshots, the reviews, or someone telling you about it? #buildinpublic #ASO #Shipaton
4
9
553
Be honest, when did you last read an app's description in the store? I never do either. I swipe the screenshots and decide in about four seconds. Which makes it embarrassing that mine were six dark rectangles with tiny feature lists on them. Built in an hour, never opened again, while I spent months on everything that points to them. So I rebuilt the whole listing this week: β†’ One sentence per image instead of a feature list β†’ A face on every screen,our parrot finally got a 3D body β†’ Localised images, not just a translated description β†’ Every frame checked at 25% zoom, the size it actually gets seen at The part that surprised me: I wanted to A/B test it properly, the way you're supposed to. Play ran the numbers and told me the experiment needs 47,071 clicks to reach a conclusion. At my scale you don't get to test. You look hard, decide, ship, and measure what happens after. No results yet. It went live today, and I'll post the numbers when there are numbers, flat ones included. Before and after below. It's live at wordhabit.app: one word a day, learned properly. Android and iOS, in English, French and Spanish. So what actually makes you install, the screenshots, the reviews, or someone telling you about it? #buildinpublic #ASO #Shipaton
2
2
410
At some point I realized I couldn't answer a simple question about my own code: what does this repository method throw? I genuinely didn't know. Dio stuff, parsing stuff, sometimes a Firebase exception nobody remembered wrapping. Meanwhile the UI had a catch (e) on every screen showing the same generic snackbar. So I tried something stricter. Exceptions now stop at the data source: it's the only place allowed to catch. It turns a DioException into a NetworkFailure, and from there up, errors are just values being returned. The repository signature became AsyncResult<TodayWord>. You read it, you know what can happen. All of it. And because AppFailure is a sealed class, the compiler does the tedious part for me. I add a new failure type, and every switch in the app that doesn't handle it turns red. Nothing to remember. I messed up twice getting there. I put user-facing messages inside the failures (no: l10n owns the words, failures just carry data). And I assumed void operations didn't need any of this, until account deletion failed silently. It returns Result<Unit> now. I'm still not sure I'd win the debate against "just use exceptions". But I know which codebase I'd rather debug. How do you handle this? #Flutter #Dart #SoftwareArchitecture #CleanArchitecture #MobileEngineering
9
496
Most vocabulary apps are built to be abandoned. Twenty words a day feels productive. You remember four by Friday, and you quit by month two. I built the opposite. One word a day. Discover it, practise it, prove it in a quiz. Five minutes. Then silence. A few days later, right before you'd have forgotten it, it comes back. Seven returns and the word is yours. Roughly two months per word. Slower. That's the entire point. WordHabit is live on iOS and Android as of today. Flutter, NestJS, RevenueCat. Built solo. Grab it here: wordhabit.app/?utm_source=x&… What word do you keep reaching for and never finding? #buildinpublic #Shipaton #FlutterDev
1
1
10
458
Ethiel A. retweeted
πŸ”₯ Flutter is making wonders. If you want to improve your English or French vocabulary, Wordhabit might be the best choice for you. One word a day, learnt deeply. wordhabit.app @FlutterDev
Replying to @enthusiastDev
The overall flow felt super smooth. Only noticed one small UI issue on the Progress screen: when scrolling down, the Current Streak widget stays pinned at the top instead of scrolling along with the rest of the content (attached a screenshot)
5
23
1,341
Flutter desktop is underrated. Once you build one real app with it, it clicks. We need to promote it more :)
25
16
4
269
21,595