Skip to content

Repository files navigation

Glimpse

Privacy-first "missed connections" mobile app. Users post a Glimpse about someone they noticed at a real-world venue; the post becomes visible to others who were in the same coarse area, with a delay, and only proceeds to chat after mutual confirmation.

This repository is a pnpm TypeScript monorepo containing the mobile app, the API server, shared libraries, and the OpenAPI contract that ties them together.


Tech stack

LayerTech
Mobile clientExpo SDK 54 / React Native 0.81 / Expo Router 6
AuthClerk (@clerk/expo on client, @clerk/express on server)
APIExpress 5, esbuild bundle, pino logging
DatabasePostgreSQL via Drizzle ORM
API contractOpenAPI 3.1 (lib/api-spec), Orval-generated React Query + Zod
Object storageReplit App Storage (GCS-compatible) for profile photos
Location dataGoogle Places API (server-proxied) + OSM/Nominatim fallback
Package managerpnpm workspaces

Folder structure

artifacts/
api-server/ Express 5 API. Build: esbuild → dist/index.mjs
glimpse/ Expo / React Native client. Built via EAS for stores.
mockup-sandbox/ Internal-only Vite preview tool (NOT shipped, NOT deployed)
lib/
api-spec/ OpenAPI 3.1 spec + orval codegen entry point
api-client-react/ Generated React Query hooks (consumed broadly by glimpse client)
api-zod/ Generated Zod schemas (currently consumed only by health.ts; routes mostly use handwritten Zod — adopting these is a planned cleanup)
db/ Drizzle schema + drizzle-kit push entry point
location-validation/ Shared presence-gate constants & helpers
scripts/ Maintenance scripts (post-merge install, etc.)
.local/ Replit-only tooling and skills (gitignored)

Architecture: the mobile client never talks to the database directly. All access goes through the API, which validates Clerk identity, runs Zod-validated handlers, and uses Drizzle for persistence. The OpenAPI spec is the source of truth for the client hooks; server validators are generated alongside them in @workspace/api-zod but the routes today mostly use handwritten Zod (planned cleanup).


First-time setup

Prerequisites: Node 20+, pnpm 9+, PostgreSQL 14+, an Expo account for mobile builds.

# 1. install
pnpm install
# 2. copy env files (see .env.example in root + per-artifact)
cp .env.example .env
cp artifacts/api-server/.env.example artifacts/api-server/.env
cp artifacts/glimpse/.env.example artifacts/glimpse/.env
# fill in real values — see ENV section below# 3. push schema to your local Postgres
pnpm --filter @workspace/db run push
# 4. start services (in separate terminals)
PORT=8080 pnpm --filter @workspace/api-server run dev # PORT is required — src/index.ts throws if unset
pnpm --filter @workspace/glimpse run dev

In the Replit workspace, services start via the artifacts/api-server: API Server and artifacts/glimpse: expo workflows — you do not run pnpm dev at the root.


Common commands

CommandPurpose
pnpm installInstall all workspace deps
pnpm run typecheckFull repo typecheck (libs + leaf packages)
pnpm run typecheck:libsBuild composite libs only
pnpm run buildtypecheck + build every package
pnpm --filter @workspace/api-spec run codegenRegenerate React Query hooks + Zod schemas
pnpm --filter @workspace/db run pushPush Drizzle schema to DATABASE_URL
PORT=8080 pnpm --filter @workspace/api-server run devBuild + start API on $PORT (NOT a watch loop — re-run after changes)
pnpm --filter @workspace/api-server run buildesbuild → dist/index.mjs
pnpm --filter @workspace/glimpse run devStart Expo dev server
pnpm --filter @workspace/scripts run seedInsert dev/staging seed data (NEVER prod)

There is no test runner wired in yet — the QA loop today is typecheck + manual device testing. See AUDIT_CHECKLIST.md for the manual flows.


Environment variables

A consolidated .env.example at the repo root lists every variable across both services with comments. Per-artifact .env.example files exist under artifacts/api-server/ and artifacts/glimpse/.

Never put real secrets in any committed file. In the Replit workspace, secrets live in the project secrets store. In production deployments they live in Replit deployment secrets (server) and EAS secrets (mobile). See RUNBOOK.md § "Secrets" for the full mapping.


Deployment

  • API server: Replit deployment. Production build runs drizzle-kit push against the deployment's DATABASE_URL before bundling, then node dist/index.mjs. Health check at /api/healthz. Configured in artifacts/api-server/.replit-artifact/artifact.toml.
  • Mobile client: Expo / EAS Build → TestFlight (iOS) and Play Internal Testing (Android). Not deployed by Replit. See RUNBOOK.md § "Mobile release" for the full EAS flow.

Where to read next

  • HANDOFF.md — what's built, what's open, where the bodies are buried
  • ARCHITECTURE.md — system diagram, auth model, data model, location/matching design
  • AUDIT_CHECKLIST.md — section-by-section review checklist
  • RUNBOOK.md — deploy, rotate secrets, debug production
  • replit.md — historical design decisions and TestFlight readiness notes
  • threat_model.md — assets, trust boundaries, threat categories

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages