Mobile App: Flutter Frontend, Node.js Backend
My first production Android app — a workforce tool for tracking employee work hours. Flutter and Dart on the front, Node and TypeScript on the back. Under employer terms I can't name it, but I can talk about the stack and how I built it.
I don't want to sound biased against a framework, but I hit more friction here than I expected — not because I dislike Dart, but because as a JavaScript and TypeScript developer, being made to build in Dart turned the whole thing into a bit of a chore.
Hot take: Dart feels like a brainchild of Java and JavaScript. I'd much prefer React Native over Flutter, but I had to play the cards I was dealt.
The backend (the fun part)
Stack
- Node.js with TypeScript instead of JSDoc
- Drizzle ORM for MySQL
- AWS S3 for image storage
I had an Ubuntu VPS for the Node process and used Nginx Proxy Manager for the reverse proxy. I'd struggled to set up TypeScript with Node before, but it turned out to be the best way to build a Node app — write it in TypeScript, build out to JavaScript.
I'd been eyeing Go for a while for the things it does that TypeScript can't, and maybe I could have pulled it off with more runway. But the deadline was tight, so I settled on Node and Express.
The frontend (the easier part)
Flutter + Dart on Clean Architecture
"The Dependency Rule: source code dependencies can only point inwards. Nothing in an inner circle can know anything at all about something in an outer circle." — Uncle Bob
This turned out easier than I expected once I committed to Clean Architecture and Mockito for testing. I started with the use cases and entities. I wouldn't normally put this much thought into a React Native app, but this was my first time with Dart and Flutter, and the structure helped me find my footing.
Flutter DevTools was noticeably better than React Native's Flipper for debugging — there may be better RN tooling than the built-in defaults, but DevTools won that round for me. In the end, Clean Architecture is what got this shipped before the deadline. It's more verbose, but there's a real satisfaction in slotting each business and application logic layer into place like a puzzle.
What I took away
Flutter's UI story is genuinely good — the availability of premade components beats React Native's component libraries. But the app still felt Android-first: snappy on Android, with a serious performance drop on iOS. Flutter has likely fixed that since, but from this experience I'd still reach for React Native — I'd rather write the frontend in the same language as my backend, and I felt freer in RN, not boxed into a design architecture to ship something good.