Tuktu.ca — A Marketplace for In-Home Services
Helped build a marketplace connecting Canadian families to qualified in-home service providers. Shipped a React Web port of the React Native client, a Node.js GraphQL API with Redis caching, and MongoDB-backed data.
Context
Tuktu.ca is a Canadian marketplace that helps families book trusted service providers — think care, cleaning, and home services — vetted through a structured onboarding process. The product existed as a React Native app and needed a web presence to widen the funnel.
Problem
- Mobile-only reach — potential customers dropping off when asked to install an app.
- Duplicate domain logic between a one-off web prototype and the RN app.
- Slow GraphQL hot paths for provider search and category browsing.
- Manual deploys to Play Store and hosting.
Approach
1. React Native → React Web
Ported screens from React Native to React Web — reusing domain logic where it was platform-neutral. The web experience matched the app for core flows: search, browse, book, and manage appointments.
2. OAuth2 + GraphQL + Redis
Shipped OAuth2 for secure login across web and mobile. Built a Node.js GraphQL backend that fronted MongoDB, and cached frequently-hit queries (provider listings, service categories, and availability windows) in Redis to keep browse flows snappy.
3. MongoDB for scale
Modeled the core entities — providers, services, bookings, reviews — in MongoDB with an eye on future growth. Kept the schema flexible for the rapid iteration the product demanded.
4. CI/CD + Play Store
Wired CI/CD pipelines for automated builds and deployments, shipped the React Native build to the Google Play Store, and removed the manual coordination that had been slowing releases.
Impact
- Web + Android from one shared team and one pipeline.
- Faster browsing thanks to Redis-cached GraphQL.
- Secure OAuth2 auth across both clients.
- Smoother release cadence after moving deploys behind CI/CD.
Takeaways
- React Native → Web is worth the port when mobile-install friction is the top funnel killer.
- GraphQL gives you a natural caching boundary — lean into it.
- Owning auth, data, and deploys made iterating on the product the fastest part of the job.