Available for new projects

Back to Work
2025

PlumBuddy

Mobile app with native SDK bridges for smart home water management.

React NativeSwiftKotlinBLENative ModulesBluetoothWiFiTuya
01

Overview

PlumBuddy is a mobile application that connects to smart home devices for water management. The app needed to communicate with proprietary hardware through Bluetooth and WiFi, handle real-time data streams, and provide reliable offline functionality. The core challenge was bridging between React Native's JavaScript environment and native device SDKs.

02

My Role

I built the React Native application and developed native modules for both iOS and Android to interface with the hardware vendor's SDKs. This included writing Swift and Kotlin bridge code, designing the data flow between native and JavaScript layers, and implementing the offline-first synchronization logic.

03

Architecture

The app follows a layered architecture: React Native UI components at the top, a state management layer using Zustand, a device abstraction layer that normalizes the different platform behaviors, and native modules at the bottom. Device communication happens through native code, with events bubbled up through the bridge. Local storage uses SQLite for device data and sensor readings, with a sync queue for eventual consistency with the cloud backend.

04

Hard Problems

  • The vendor SDKs had different APIs and behaviors on iOS vs Android — required building an abstraction layer that normalized these differences.
  • Bluetooth communication is inherently unreliable. Implemented retry logic, connection state machines, and user feedback that didn't create false confidence.
  • Managing high-frequency sensor data without overwhelming the JavaScript bridge or draining the battery.
  • Handling the offline/online transition gracefully, especially when device state had changed while offline.
05

What I'd Improve

The native module code works but isn't as well-tested as the JavaScript layer. I'd invest in better native unit tests and integration tests that can run on CI. The Bluetooth connection handling could also be more sophisticated — the current retry logic is simple exponential backoff, but a smarter approach based on failure patterns would improve user experience.