Development productivity dashboard that tracks pull request cycle times from GitHub. Calculates coding time, pickup time, review time, and deploy time to help teams understand their development workflow.
- Framework: React Router v7 (SSR) + Express
- Database: SQLite (multi-tenant, database-per-org) via Atlas + Kysely
- Auth: better-auth with GitHub OAuth
- UI: shadcn/ui + Tailwind CSS v4
- Testing: Vitest + Playwright
- Hosting: Fly.io
- Node.js 22+
- pnpm
pnpm installcp .env.example .envEdit .env with your values:
| Variable | Description |
|---|---|
DATABASE_URL |
SQLite database path (e.g. file:../data/data.db) |
BETTER_AUTH_SECRET |
Secret for better-auth (min 32 chars) |
BETTER_AUTH_URL |
App URL (e.g. http://localhost:5173) |
GITHUB_CLIENT_ID |
GitHub App client ID |
GITHUB_CLIENT_SECRET |
GitHub App client secret |
INTEGRATION_PRIVATE_TOKEN |
GitHub PAT for PR data fetching |
GEMINI_API_KEY |
Gemini API key for AI features |
Create a GitHub App at https://github.com/settings/apps/new:
- Callback URL:
http://localhost:5173/api/auth/callback/github(dev) /https://your-domain/api/auth/callback/github(prod) - Expire user authorization tokens: ON
- Request user authorization (OAuth) during installation: ON
- Webhook: Active OFF
- Permissions > Account permissions > Email addresses: Read-only
Use the Client ID and generate a Client secret for your .env.
pnpm db:setuppnpm devpnpm dev # Start dev server with HMR
pnpm build # Build for production
pnpm start # Run production server
pnpm test # Run unit tests
pnpm test:e2e # Run E2E tests
pnpm typecheck # Type checking
pnpm lint # Lint (Biome)
pnpm format # Format check (Prettier)
pnpm validate # Full validation pipeline
pnpm db:setup # Reset database with seed data
pnpm db:migrate # Generate migration from schema changes
pnpm db:apply # Apply migrations
pnpm db:generate # Generate Kysely types- GitHub OAuth only: Login requires the user's GitHub login to be in
companyGithubUserswithisActive=1 - Batch auto-registration: PR authors and reviewers are automatically added to
companyGithubUsersas inactive (isActive=0). An admin enables them via the Active toggle in Settings > GitHub Users - First-user bootstrap: On a fresh database with no users, the first GitHub login is allowed unconditionally and promoted to super admin
- On login, users are automatically added as members to orgs where their GitHub login is registered and active
Private