Fantasy sports analytics dashboard. Built with Vite + React + TypeScript, Express, Clerk auth, Redux Toolkit, TanStack Query, and Tailwind v4.
# Root (concurrently)
npm install
# Install client and server dependencies together
npm run install:allOr install them separately:
# Client
npm install --prefix client
# Server
npm install --prefix serverCreate a single .env file in the project root (not inside client/ or server/):
cp .env.example .envRequired variables:
VITE_CLERK_PUBLISHABLE_KEY=pk_... # used by the client
CLERK_PUBLISHABLE_KEY=pk_... # same value, used by the server
CLERK_SECRET_KEY=sk_... # server only
DATABASE_URL=postgres://... # Neon Postgres connection string (server only)
The server uses Neon Postgres via Drizzle ORM. After setting DATABASE_URL in .env, push the schema:
npm run db:push --prefix serverTo open the Drizzle Studio UI:
npm run db:studio --prefix server# Start both client and server together
npm run devThis runs the server (port 4000) and the Vite dev client (port 3000) in parallel with labeled, color-coded output.
To run them separately:
# Server only
npm run dev --prefix server
# Client only
npm run dev --prefix clientnpm run build --prefix serverTypeScript compiles to server/bin/ (git-ignored).