Skip to content
Vijay Gojiya
All work

Personal, 2026

Everything

Kasoti

A mock-test app for one exam candidate, built as a real monorepo anyway.

A Gujarati-first mock test app for the GSSSB CCE prelims, built for a single aspirant. The questions are not the product. The analysis after the paper is, which is why the scoring lives in its own package with no imports and its own unit tests.

A Turborepo with three apps and seven packages: the Expo app she sits papers in, a Hono API, and a TanStack Start admin panel for the question bank. A CI check enforces that the on-device schema stays a subset of Postgres, so the phone can never drift ahead of the server.

The supporting scripts matter as much as the apps: a CSV importer that rejects rather than warns, a command line tool that assembles and publishes a paper, and a Python extractor that pulls questions out of the commission own PDFs.

Surfaces

  • nativeExpo 57, React Native 0.86

    Where she sits the papers. Offline-first, because the exam hall has no signal either.

    • Expo 57
    • React Native 0.86
    • Reanimated 4
    • MMKV
    • TanStack Query
  • serverHono

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

    • Hono
    • Better Auth
    • Zod
    • Drizzle ORM
  • webTanStack Start on Nitro

    The admin panel: question bank, papers, accounts. Talks to Neon through server functions.

    • TanStack Start
    • Nitro
    • Base UI
    • shadcn
    • Neon Postgres

Engineering notes

  • scoring: a pure package with no imports and its own unit tests
  • validation: one Zod layer shared by the CSV importer and the API boundary
  • check-schema-parity: CI fails if the device schema drifts from Postgres
  • Pooled and direct Postgres URLs kept apart, because PgBouncer cannot serve transactions