Skip to content
Vijay Gojiya

Build. Ship. Maintain.

Your React Native app fell behind. I bring it back.

Upgrades, New Architecture migration, native modules and ongoing maintenance, for iOS and Android.

10,000+ downloads across six live apps, three more in development

Available for new work

Building for mobile
4yrs+
Live on Google Play
6apps
Combined downloads
10k+
TypeScript codebases
100%

Selected work

Apps I have built for clients.

Case study: an app brought back

LexVid

2024 to 2025 · Modernisation of an existing app

An ageing legal-education video app, migrated onto a current Expo, data and offline architecture.

Before

  • Pinned to an ageing Expo version, so every change was slow and expensive to make
  • Data fetching and state handled ad hoc, with no single source of server state
  • A spinner on every cold start instead of a library painted from cache

What I did

  • Moved the app onto a current Expo release line without a rewrite, while it kept shipping
  • Made React Query the one server-state layer and persisted its cache as the offline store
  • Built resumable video downloads with real progress and a concurrency-capped queue
  • Drove the interface from connection state, so offline is a known state, not a failed request

Full stack

Products where I own every surface.

Mobile, web and API, each its own codebase, behind one auth configuration and one database.

VM Academy

Personal product, 2026

How it is built

A place to learn several skills in one sitting rather than one skill across five abandoned tabs. Five domains, twenty-one categories, tracks that run across them, and an invited faculty rather than a marketplace with two hundred thousand listings and no editor. I designed the product and built every part of it.

  • mobile

    React Native and Expo

    Students browse, learn and track progress; instructors author and submit. React Navigation with stack, tab and nested navigators, and universal links wired through to both platforms.

    • React Native
    • Expo
    • React Navigation
    • TanStack Query
    • Zustand
    • Better Auth
  • web

    TanStack Start on Nitro

    Marketing site, student experience and /admin in one application. Mux for video playback and direct uploads, and the SEO surface for the whole product.

    • TanStack Start
    • TanStack Router
    • TanStack Query
    • Nitro
    • Mux
    • Tailwind
  • server

    Hono on Node

    REST over Hono, Drizzle against Postgres, Razorpay for payments, Resend for mail, Firebase Admin for push. Each client carries a generated contract file, so no client imports server code.

    • Hono
    • Drizzle ORM
    • Postgres
    • Better Auth
    • Razorpay
    • Resend

Kasoti

Personal product, 2026

How it is built

A mock-test app for a state competitive examination, built from scratch for my sister while she prepares for it. The questions are not the product. Surviving the paper is, and so is the analysis afterwards, which is why scoring lives in its own package with no imports and its own unit tests.

  • mobile

    React Native and Expo

    Where she sits the papers. The paper being sat and the attempt in flight live in on-device SQLite, so the player never waits on the network between questions.

    • React Native
    • Expo
    • Expo SQLite
    • Drizzle ORM
    • React Navigation
    • TanStack Query
  • server

    Hono

    Serves the content manifest and receives finished attempts. Better Auth mounted from a shared package.

    • Hono
    • Better Auth
    • Drizzle ORM
    • Postgres
    • Zod
  • admin

    TanStack Start on Nitro

    Question bank, papers and accounts. Where an uploaded previous-year PDF becomes a publishable paper.

    • TanStack Start
    • Nitro
    • Tailwind
    • Postgres
    • Drizzle ORM

Also in development

The screens

Real apps, real screens.

Toolkit

Everything here has shipped in something.

Read out of the package files in the repositories, not a wishlist.

Languages
TypeScriptJavaScriptKotlinSwiftPythonSQL
Mobile
React NativeExpo, managed and bareNew ArchitectureTurbo ModulesExpo RouterReact NavigationReanimatedGesture HandlerEAS BuildEAS UpdateExpo Updates
Web
ReactTanStack StartTanStack RouterTanStack QueryNitroViteTailwindshadcnBase UI
Server and data
HonoNestJSDrizzle ORMPostgresNeonFirestoreGraphQLRESTZodBetter AuthResend
State and storage
React QueryRedux ToolkitZustandContextMMKVAsyncStorageredux-persist
Platform services
Firebase AuthCloud MessagingCrashlyticsAnalyticsRemote ConfigStoragePerformanceGoogle MapsMapboxGeolocationDeep linkingNotifeeMux
Payments
StripeRazorpayJuspay
Quality and delivery
JestReact Native Testing LibrarySentryPostHogGitHub ActionsFastlaneTurborepobunpnpmDockerCloudflare WorkersBiomeESLint

How it runs

Four steps, and you can see the work at every one.

  1. 01

    Discovery

    A paid, short, bounded piece of work: I read what exists, ask the questions that change the estimate, and write down what the first version actually is. It ends in a document and a fixed price, and you own both whether or not we continue.

  2. 02

    Plan

    Scope split into milestones you can recognise from the outside, with the risky items first rather than last. If something is going to be a problem, I would rather find it in week two than week nine.

  3. 03

    Build

    A build in your hands every week or two, not a reveal at the end. Work happens in your repository, in reviewable commits, with types and CI from the first one rather than added once it hurts.

  4. 04

    Launch and after

    Store submission, phased rollout and the review replies. Then either handover with documentation and a pipeline you can run, or a monthly retainer. The handover is designed for either outcome.

Open source

Google Places, without the wrapper.

Every Places autocomplete library for React Native does the same thing: call the HTTP API from JavaScript and draw the results list yourself. It works, and it is always slightly wrong. The debounce is yours to tune, the session tokens are yours to get right, and the list never quite feels native because it is not.

This one renders the autocomplete interface that Google ships in its own Android and iOS SDKs, driven from JavaScript across a Turbo Module. Kotlin on one side, Swift on the other, no bridge in between. Built for the New Architecture and bridgeless from the first version rather than ported to it.

$ npm install react-native-google-places-turbo
Architecture
Turbo Module, bridgeless
Android
Kotlin, Places SDK
iOS
Swift, Places SDK
License
MIT
Version
0.1.1

Firebase Cloud Messaging module

Permission requests, token registration, and foreground and background message handling, built as a native module rather than wired up in JavaScript.

Contact

Have something that needs building?

Contract work, a codebase that has fallen behind, or a native module nobody wants to write. Tell me what it is and I will tell you honestly whether I am the right person.

Book a free 20-minute audit

or send a message below

WhatsApp (clients in India)
+91 70694 14762
Based in
Ahmedabad, Gujarat, India
LinkedIn
vijay-gojiya