AI-powered platform that turns your content into rich, interactive quizzes with analytics, anti-cheat, and a chat-driven study companion.
- Syllabus → Quiz in seconds: Generate Multiple Choice, True/False.
- AI chat assistant: Context-aware Q&A on your materials.
- Configurable quizzes: Topics, difficulty, counts, and time limits.
- Anti-cheat: Fullscreen enforcement, tab-switch warnings, screenshot prevention.
- Analytics: Instant scoring, answer breakdowns, and AI explanations.
.
├─ client/ # Primary web app (React + Vite + TanStack Router)
├─ room/ # Shareable/room quiz taker (React + Vite)
└─ server/ # API (Hono on Cloudflare Workers + Drizzle ORM)
- Frontend: React 19, Vite, TanStack Router, TailwindCSS, Radix UI
- Backend: Hono on Cloudflare Workers, TypeScript
- AI: LangChain, OpenAI/Google GenAI integrations
- DB: PostgreSQL + Drizzle ORM (Neon or Postgres)
- Auth: better-auth
- Node.js ≥ 18
- pnpm (repo uses
packageManager: pnpm) - Optional: Docker (for local Postgres via
docker-compose.yml)
-
Install dependencies at the repo root:
pnpm install
-
Configure environment for
server/(Cloudflare Worker): Createserver/.env(values shown are examples; adjust for your setup):DATABASE_URL="postgres://test:test_123@localhost:5432/quizforge-db" # or Neon OPENAI_API_KEY="your_openai_api_key" BETTER_AUTH_SECRET="dev_secret_change_me" BETTER_AUTH_URL="http://localhost:8787" GOOGLE_CLIENT_ID="your_google_client_id" GOOGLE_CLIENT_SECRET="your_google_client_secret" FRONTEND_URL="http://localhost:3000"
-
(Optional) Start local Postgres with Docker:
docker compose up -d
-
Start apps (use separate terminals):
-
Client (web app):
pnpm --filter client dev
Runs on http://localhost:3000
-
Room (shareable taker):
pnpm --filter room dev
Runs on http://localhost:5173
-
Server (Cloudflare Worker):
pnpm --filter server dev
Worker on http://localhost:8787
-
From package roots:
-
client/dev: Vite dev server on port 3000build:vite build && tscserve: preview built apptest: unit tests via Vitestlint,format,check: formatting and linting helpers
-
room/dev: Vite dev server (default port 5173)build:vite build && tscserve: preview built apptest: unit tests via Vitest
-
server/dev:wrangler devdeploy:wrangler deploy --minifycf-typegen: generate CF Worker typesdb:generate | db:migrate | db:push: Drizzle migrations
At the repo root:
pnpm --filter client devpnpm --filter room devpnpm --filter server dev
Note: The existing root script dev uses multiple --filter flags; prefer running each service in its own terminal for clarity.
Use Neon for serverless Postgres in production, or local Postgres for development.
- Local via Docker (provided
docker-compose.yml):- DB:
quizforge-db - User:
test - Password:
test_123 - Port:
5432
- DB:
Update DATABASE_URL accordingly, e.g.:
postgres://test:test_123@localhost:5432/quizforge-db
client:pnpm --filter client testroom:pnpm --filter room testserver:pnpm --filter server test
Linting/formatting in client:
pnpm --filter client lint
pnpm --filter client check
- client and room: deploy to Vercel (see
client/vercel.jsonandroom/vercel.json) - server: Cloudflare Workers via Wrangler
pnpm --filter server deploy
- Fork and create a feature branch
- Commit with clear messages
- Open a Pull Request describing the change and test coverage
Never commit secrets. Use environment variables or a secrets manager. Rotate keys used in development.
ISC License. See the license field in package.json.