A real-time web app for drafting and trading Pokemon with friends. Create a league, draft your team live, negotiate trades, and compete in challenge runs — all scored by a configurable rules engine.
Built as a proof-of-concept for a larger "draft & trade anything" platform.
-
Start everything:
deno task dev
This single command handles the full setup:
- Creates
.envfrom.env.example(if not present) - Installs dependencies (
deno install) - Starts PostgreSQL via Docker Compose
- Launches the server (Deno + tRPC) and client (React + Vite) in parallel
- Creates
-
Stop the database when you're done:
deno task db:stop
| Task | Description |
|---|---|
deno task dev |
Start both server and client in dev mode |
deno task test |
Run all tests (server + client) |
deno task setup |
Copy .env.example to .env and install deps |
deno task build |
Build the client for production |
deno task start |
Start the server in production mode |
deno task db:start |
Start PostgreSQL via Docker Compose |
deno task db:stop |
Stop PostgreSQL |
deno task db:generate |
Generate Drizzle ORM migrations |
deno task db:migrate |
Run database migrations |
deno task sync:pokemon |
Sync Pokemon data from PokeAPI |
deno task test:e2e |
Run Playwright end-to-end tests |
End-to-end tests use Playwright and run the full app in production mode against a separate database.
Make sure PostgreSQL is running (deno task db:start), then:
deno task test:e2eThat's it. On first run, Playwright's global setup automatically creates the
make_the_pick_e2e database and runs migrations. Subsequent runs reuse the
database and only apply new migrations.
You'll need Playwright browsers installed once:
cd e2e && npx playwright install chromium- The app boots in production mode — Vite builds the client, Hono serves it as static files alongside the API on port 3000.
- Auth is handled by seeding user and session rows directly into the E2E database and injecting the session cookie into the browser context. No server-side auth bypass — this is the same mechanism Google OAuth produces at the end of a real login.
- The E2E database is truncated between test suites to keep tests isolated.
The e2e job in .github/workflows/ci.yml runs after unit and integration
tests pass. It spins up its own Postgres service, installs Chromium, runs
migrations, and executes the tests. On failure, the Playwright HTML report is
uploaded as a build artifact.
Configuration lives in .env (created automatically from .env.example on
first run). Key variables:
| Variable | Description |
|---|---|
DATABASE_URL |
PostgreSQL connection string |
BETTER_AUTH_SECRET |
Secret for Better Auth sessions |
BETTER_AUTH_URL |
App URL for auth callbacks |
GOOGLE_CLIENT_ID |
Google OAuth client ID |
GOOGLE_CLIENT_SECRET |
Google OAuth client secret |
BETTER_AUTH_TRUSTED_ORIGINS |
Comma-separated list of trusted origins |
Early development — see the technical proposal for the full vision and architecture.