Skip to content
Asia/Kolkata
ProjectsSeptember 2, 2026

Adya — From SwiftUI Prototype to Cross-Platform Rewrite

Adya is a minimal daily task manager: unlimited tasks organized into custom lists, a focused "Today" view, a built-in focus timer, streaks, and a calendar heatmap of completions. It started as a native SwiftUI prototype to validate the product idea quickly on iOS, then was deliberately rewritten from scratch in Expo/React Native once the concept held up — trading a bit of native polish for one codebase across iOS and Android. The SwiftUI version (9 incremental commits: scaffold → multi-list support → design system → calendar → search/reminders → today view → UX pass → accessibility pass) proved the product was worth building further. Rather than maintaining a second, hand-translated Swift/Kotlin codebase for Android, the decision was to rewrite on React Native's New Architecture — accepting short-term rebuild cost for long-term velocity on a single codebase.
  • State: Zustand store with selectors kept separate from UI components, persisted via AsyncStorage
  • Navigation: Expo Router (file-based), mirroring the SwiftUI version's four core tabs — Today, Lists, Calendar, Completed — plus list detail, task edit, focus timer, and settings screens
  • Natural-language dates: chrono-node replaces the native version's custom NL date parser for entering tasks like "tomorrow at 5pm"
  • Native feel on RN: expo-notifications, expo-haptics, react-native-reanimated/worklets, and react-native-gesture-handler, with native module access wrapped behind a src/lib/ abstraction rather than called directly from screens
Original prototype: Swift, SwiftUI, Xcode (xcodegen), UserNotifications, a custom natural-language date parser Rewrite: Expo SDK 54, React Native 0.81 (New Architecture), React 19, TypeScript, Expo Router, Zustand, AsyncStorage, chrono-node, react-native-svg Rebuilding, not translating: A line-by-line Swift-to-RN port would have carried over UI patterns that don't map cleanly to React Native's layout model. Rebuilding the screens from the store outward, rather than translating file-by-file, kept the RN version idiomatic instead of "SwiftUI wearing a React Native costume." State/UI separation paid off early: Keeping Zustand selectors out of the components made it straightforward to re-implement each screen against the same store contract as the native version's feature set was ported over. This project doesn't have automated test coverage yet — it's a fast, solo rebuild focused on getting the cross-platform port feature-complete first. The architecture (store isolated from UI, native calls wrapped in src/lib/) is set up to make adding Detox E2E coverage for the core flows — create task, complete task, start focus timer — a contained next step rather than a retrofit.
More work

Related projects

FlakeIQ — Flake Tracking and LLM-Powered Failure Classification

FlakeIQ — Flake Tracking and LLM-Powered Failure Classification

Built a flake analysis pipeline for mobile E2E tests that captures test context at runtime, classifies failures via Ollama (llama3.2), and visualizes trends in a real-time Chart.js dashboard.
Cross-Platform Mobile E2E Testing with mobilewright

Cross-Platform Mobile E2E Testing with mobilewright

Configured and maintained a 19-test mobile E2E suite using mobilewright covering alerts, animation, calendar, forms, gestures, lists, media, signature, profile, and login flows — all passing on both iOS and Android. Contributed two upstream bug fixes to the mobilewright framework.

QuantForge — Multi-Agent Market Intelligence & Algorithmic Trading Platform

A multi-agent market intelligence platform for Indian markets (NSE/BSE) built on Zerodha Kite Connect — 13 independent AI agents surface probabilistic signals, with a Risk Agent holding veto power and every strategy required to clear a Backtest → Out-of-Sample → Paper Trading → Risk Review gate before it can touch capital.