Fluidkey

2025

Fluidkey is a crypto wallet built around private payments. The company had a production web app and was looking to build a native one, so I came on as a contractor to port it to a single Expo codebase targeting web, iOS, and Android. The web app was already live with users, and the native app added on-device key generation and storage on top of that.

The first problem with authentication was Privy. It ships a React Native package and a web package. The native one doesn't build for web at all, and their APIs don't match. I wrote a Metro config to resolve the right package per target and a thin adapter over both, so the rest of the app could call one interface without knowing which package was underneath.

The second was that the flows themselves differ per platform. On web you connect a wallet or sign in with Privy. On mobile you generate an account and keys on the device and back them up (iCloud on iOS, Drive on Android), or sign in with Privy and back those keys up too. Web and native diverge, then iOS and Android diverge again. Metro's platform extension resolution covered both problems. Each target resolves its own implementation file, so only one Privy package and one flow ever enter the build. Branching at runtime wouldn't have helped, because the bundler still pulls both packages in either way. I kept all of it backward compatible with the live authentication system, and nobody lost access to their existing keys.

The original app was a single screen with modals for everything else. I pushed for a restructure and got it: a home tab for holdings, a history tab for past transactions, and a profile tab for settings and backups. The balance and the primary actions sit at the top of the home tab. Swapping, sending, receiving, and connecting a bank each got its own sheet. I replaced a set of Material UI overrides with a component library built for the product.

My contract ended before the App Store launch. It shipped that way, and it's still the layout the app uses.

  • React Native
  • Expo
  • Metro
  • TypeScript
  • EAS