


Mobile client of a construction ERP used by site managers, supply and finance teams. I own large features end to end on the Flutter side, from API contract to release.
What I built
Messenger
Telegram-style chat: direct and group rooms, reactions, edit, pin and mute, in-chat search with jump-to-message, two-way cursor pagination and optimistic sending.
WebSocketEvent busBLoCHeroVoIP audio and video calls
LiveKit calls with ringing, server-synced timers, a floating call layer that survives navigation and push-driven incoming calls. Refactored to SOLID and unit-tested with hand-written fakes.
LiveKit (WebRTC)CallKitaudio_sessionUnit testsRealtime layer
One socket service fans events out through a broadcast bus, with exponential-backoff reconnect, reconnect on resume and catch-up sync.
WebSocketStreamsAI assistant with live voice
Streaming chat over hand-parsed SSE with markdown, charts and Excel export. Live voice streams 16 kHz PCM over a WebSocket relay; I profiled and removed UI freezes from synchronous native audio setup on iOS.
SSEPCM16 audioWebSocketProfilingNative iOS 26 liquid-glass tab bar
Native UITabBar on iOS, Flutter bar on Android; fixed the iOS 26 bug where every title collapses to an ellipsis.
Platform viewsMethodChannelUIKitPush notifications and deep links
Cold-start push routing, notification sounds in 6 languages, share and QR links that survive logout.
FCMAPNsApp LinksVoice messages
Ogg/Opus playback through an FFI audio engine with crash-free teardown.
flutter_soloudFFITablet layout and edge-to-edge
A navigation rail above the root navigator, and a reusable Android edge-to-edge inset toolkit.
go_routerAdaptive layoutPerformance and memory
Found a platform-view MethodChannel leak keeping screens alive via heap snapshots; skeleton loaders app-wide.
DevToolsVM serviceJank tracer CLI
A profile-mode tool that turns every slow frame into a path of the app's own widgets (A › B › C with file:line), the dominant phase and the raster suspects, by pairing UI and raster frames on the VM timeline. Pinpoints jank on low-end devices that DevTools made slow to trace.
VM serviceTimelineDart CLISession replay behind a kill switch
Microsoft Clarity session replay and heatmaps, fully gated by Remote Config: both the on/off flag and the project ID come from config, so when disabled the SDK widget never mounts. Screen names and user IDs flow from the router, after the SDK is ready.
Microsoft ClarityFirebase Remote Configgo_routerRelease automation
Scripts that ship to TestFlight, Play and a team channel; an AI-assisted task → spec → tests pipeline.
App Store Connect APIPlay APIBash
