Selfie Time Kiosk Tablet: Flutter Refactor + New UI/UX + Backend Migration
Client
Selfie Time (PT Intinya Technology)
My Role
Fullstack Developer (Flutter + Electron/Express)
Duration
2 months
Tech Stack
Flutter (BLoC, Dio, AutoRoute, GetIt), Firebase Remote Config/Crashlytics/Analytics, Shorebird, kiosk-mode hardening, Electron + Express (backend)
Project Type
Internal / Private codebase

Project Overview & Business Context
This project is a full refactor of a legacy kiosk that previously ran on Meteor.js. The kiosk is revenue-critical and runs outside mobile app stores, so stability, recoverability, and controlled rollouts are as important as the user experience.
Over 2 months, I rebuilt the kiosk tablet application in Flutter with a new UI/UX and modernized the supporting backend server layer by migrating from Meteor to an Electron + Express architecture.
Primary User Flow
Home
-> Scan QR / Input PIN
-> Load transaction + validate
-> Editing flow (collage/editor or auto-crop depending on product)
-> Order/payment review (promo/voucher depending on config)
-> Export/render + queue/print handoff
-> Reset to Home (kiosk session hygiene)Editing & Review UI
The editor flow is built to be guided and predictable for kiosk usage: users move through orientation, filters, layouts, backgrounds, and review, with clear navigation and session safety.

My Role & Key Contributions
- Rebuilt the kiosk app in Flutter (not a 1:1 migration): redesigned UI/UX and interaction patterns based on RnD and UI/UX team requests.
- Implemented guided flows for transaction intake (QR/PIN), editor/canvas experiences, and stable navigation between screens.
- Added operational guardrails: kiosk-mode lockdown, landscape orientation enforcement, error reporting, and configurable feature flags.
- Migrated the backend server in parallel from Meteor to Electron + Express to reduce legacy coupling and make APIs easier to evolve.
Architecture & Tech Decisions
Flutter Kiosk App
- BLoC for predictable state machines across multi-step flows (scan -> edit -> pay -> export).
- AutoRoute for explicit, testable routing between kiosk screens.
- GetIt DI to keep features modular and reduce wiring in UI layers.
- Firebase Remote Config for feature flags and emergency control without redeploying.
- Crashlytics + Analytics for crash-free monitoring and rollout confidence.
Backend Server (Electron + Express)
- Migrated away from Meteor to reduce framework constraints and simplify debugging and deployment.
- Express provides clear REST boundaries that match kiosk transaction flows and are easier to version.
- Electron packaging supports desktop-like distribution where needed, while keeping the runtime familiar (Node.js).
Outcome
- Delivered a refreshed kiosk experience with a new UI/UX that better fits the product direction.
- Reduced legacy dependency by refactoring both the kiosk client and the backend server in parallel.
- Improved operational readiness with feature flags, observability, and safer update strategies.