GlotCap is a TanStack Start + Convex app for live speaking practice, transcript review, learning insights, and media translation/transcription tools.
- TanStack Start with React 19
- Convex for backend functions, auth, and realtime state
- Tailwind CSS v4
- A bundled local
ts-commonworkspace package containing the previously private shared modules this app depends on
- Install dependencies:
bun install- Copy env scaffolding:
cp .env.example .env- Start Convex and the web app:
bun run dev- Client-side values live in
.env. - Convex server secrets should be set with
bunx convex env set. - Check
.env.examplefor the main public/runtime variables.
src/: frontend routes, components, and browser-side logicconvex/: backend queries, mutations, actions, HTTP actions, and schemashared/: app-specific domain contracts shared across frontend/backendpackages/ts-common/: vendored subset of shared utilities required to open-source this app cleanly
bun run dev: start Convex and Vitebun run build: production buildbun run test: run Vitestbun run check: lint and typecheckbun run quality:hooks: format check, lint, and typecheckbun run quality:ci: format check, lint, typecheck, and testsbun run secrets:check -- <files...>: scan files for committed secrets
GitHub Actions runs bun run quality:ci, the production web build, and a Docker build/health smoke test on pull requests and pushes to main. CI uses Bun 1.2.7, Node 22, the committed lockfile, and the bundled workspaces. Dependency installation skips lifecycle scripts so CI does not install developer Git hooks.
Only the public VITE_CONVEX_URL is supplied. CI does not deploy the web app or Convex backend, and does not need provider credentials or deployment secrets. The smoke test checks the web container's HTTP health, not authenticated backend/provider integration.
- Hooks are managed with
lefthook. pre-commitruns staged diff checks, large-file blocking, staged secret scanning, staged Prettier/ESLint checks, and a full typecheck.pre-pushruns the test suite.bun installwill install hooks automatically when this project lives inside a real Git repo.
Apache-2.0