Building MOD Smart: React Native and Tuya for Real-Time Lighting Control

MOD Smart is the companion app for MOD Lighting. It lets installers and power users control Tuya-compatible RGB, CW and RGBCW lighting controllers across several properties from one phone.

The hard part wasn't the on/off switch. Pairing, live device state, permissions, firmware, scenes and schedules all had to feel like one coherent product on both iOS and Android.

One App for Every Room and Every Property

  • Multi-home: switch between properties and client sites without logging out.
  • Live state: the interface follows what the lights are actually doing, not what the app last asked for.
  • Adaptive controls: each controller only shows the controls its Tuya data points support.
  • Scenes and schedules: grouping, strip configuration and automations sit alongside the device controls.
MOD Smart app home screen on a phone, shown in a softly lit bedroom with a MOD table lamp.

iOS + Android

Shipped from a single React Native codebase.

3

Ways to pair a controller: Wi-Fi EZ, access point and Bluetooth.

Live

Device state over MQTT, so the app matches the room.

Three Ways to Pair a Device

Pairing is where smart-home apps usually lose people, so we gave MOD Smart three routes in. Wi-Fi EZ mode is the fastest. Access-point mode is the fallback when EZ won't connect. Bluetooth discovery finds controllers nearby.

Whichever path is used, the device lands in the active home with controls that match what it supports.

Three pairing paths, Wi-Fi EZ, access point and Bluetooth, all leading to the device being added to the home.

Navigation That Keeps Users Oriented

  • RootNavigator separates the signed-in and signed-out app.
  • MainTabs keeps the main destinations predictable: homes, scenes and settings.
  • ControllerStack holds the deeper device screens, so users can always get back without piling up navigation history.
Navigation structure: RootNavigator splits signed-out and signed-in states; MainTabs leads to ControllerStack for device controls.

Real-Time State Without Excessive Re-Renders

Zustand slices keep authentication, devices, theme and sheets separate. When an MQTT event reports a change, only the affected control updates instead of the whole app re-rendering.

The same state model also handles scenes, schedules, grouping, strip configuration and remembering the active home.

An MQTT event updates only the devices slice of the Zustand store, so a single control re-renders.

Security and Permissions

Sign-in uses email and a one-time password. Session tokens are stored in the device keychain via react-native-keychain, never in plain storage. Role-based helpers make the difference between installer and homeowner actions explicit before any API request is sent.

Shipping Reliably on iOS and Android

The first Google Play review passed. Apple asked for an in-app account deletion flow, and because authentication was centralized, adding it was a contained change we could test before resubmitting.

Fastlane handles versioning, reproducible builds, internal Android releases and TestFlight delivery, so every release follows the same path instead of a list of manual, store-specific steps.

MOD Smart is available on the App Store and Google Play.

Release pipeline: one React Native codebase built with Fastlane and delivered to TestFlight for iOS and internal testing on Google Play.
Technical Deep DiveSpell&Sell
Spell&Sell
  • Three Pairing Modes
  • Real-Time Device State
2 min read