✦The company
WOW WONEN is a proptech startup in Brugge building digital tools for social housing residents and the coaches who support them. Small team: Ellen (CEO and Founder), Febe (customer success), Shannon (developer), Pavel (backend in Go), and Milan, my mentor and the Flutter developer who had been there from the start.
Fourteen weeks. The brief was open: ship something real.
✦The main project: Mijn Budget
The WOW WONEN app already existed. What it was missing was a budget tool. Residents needed a place to track income and spending. Coaches needed aggregate data to use in guidance sessions. I built both ends of that.
I settled into a three-phase process that I did not plan in advance but ended up sticking to because it worked.
Design first. I started from an existing Figma file and rebuilt it properly. Real components, auto-layout, reusable tokens. Only when the designs held up under scrutiny did I open Flutter.
Static UI second. Every screen, every state, with hardcoded data. No Supabase, no logic. This phase made design feedback fast and cheap. I could show the whole flow to Ellen and Febe in a simulator without any backend wired up. Changes happened in Figma, not in state management code.
Dynamic last. Replace the hardcoded data with real queries. Supabase Realtime subscriptions meant transactions sync across devices the moment they are submitted. A new expense appears on screen without a refresh. Pavel had built a Go proxy that handles the AI categorization pipeline, so I connected to that for automatic transaction classification.
The onboarding tutorial came at the end. New residents see a step-by-step walkthrough on first launch before they touch their own data.
✦The other things I shipped
The budget tool was the main thread, but the internship had a lot running alongside it.
Logging on the admin dashboard. The Next.js admin panel had no visibility into what was happening across the platform. I added an event logging layer so the team could see activity, spot patterns, and debug faster. Straightforward work that ended up being used more than I expected.
Community feed. A static feed view inside the app. A foundation for something the team plans to build out.
404 animation. The app needed a proper empty-state animation. I built it in After Effects, exported it through Cavalry to a Lottie JSON file, and dropped it into Flutter. First time using Cavalry. Took longer than the feature probably deserved. The result was clean.
Rebrand from WOW WONEN to WOWIE. Partway through the internship the company rebranded. New name, new colors, new identity across every screen. I updated every asset.
App Store and Play Store materials. Screenshots, descriptions, metadata. More time-consuming to do properly than it looks.
Screenshot detection via Platform Channels. Flutter exposes enough of the native layer through Dart, but some things require going further. I wrote Swift for iOS and Kotlin for Android to detect when a resident takes a screenshot, which triggers a specific response inside the app. First time writing production Swift and Kotlin.




✦The screen protector problem
This one deserves its own section because it taught me something I did not expect to learn during an internship.
Screenshot detection worked perfectly in development and on test devices. On physical devices with third-party screen protectors, the native API returned inconsistent results. The protector interfered with how the OS reported the screenshot event. I spent weeks on it. I created a separate debug repository to isolate the problem, filed issues, and tested every workaround I could find.
Milan eventually said: remove the package.
That was the right call. The feature was not load-bearing for the product, and the time I had already spent had grown well past what the feature was worth. Stopping was the correct engineering decision. I did not have that instinct at the start. I left with a version of it.
✦What I took away
The three-phase approach (design, static, dynamic) sounds slower than jumping straight to real data. It is not. It eliminates whole categories of confusion before they compound. I will use it on anything non-trivial going forward.
Supabase Realtime changed how I think about synchronization in mobile apps. The subscription model is clean enough that polling stops feeling like a default.
Flutter Platform Channels made the gap between the cross-platform layer and native code feel much smaller than I had assumed. Writing a small amount of Swift or Kotlin to unlock a native API is straightforward once you understand how the bridge works.
And fourteen weeks in Brugge, with that team, in that office, ended with billiards and dinner and a feeling that the semester had been well spent.
