Internal dashboard for tracking AI Platform engineering team productivity across Jira and GitHub.
Run the app with sample data — no credentials needed:
npm install
echo "DEMO_MODE=true" > .env
echo "VITE_DEMO_MODE=true" >> .env
npm run dev:fullOpen http://localhost:5173.
For real Jira and GitHub data:
- Node.js 18+
- Red Hat VPN (required for LDAP roster sync)
- @redhat.com Google account
npm installcp .env.example .envEdit .env with your credentials:
# Required
JIRA_EMAIL=you@redhat.com
JIRA_TOKEN=your-jira-api-token # From https://id.atlassian.com/manage-profile/security/api-tokens
ADMIN_EMAILS=you@redhat.com
# Optional — GitHub contribution stats
GITHUB_TOKEN=your-github-classic-pat # Classic PAT with read:user scope
# Optional — automated roster sync from Google Sheets
GOOGLE_SERVICE_ACCOUNT_KEY_FILE=./secrets/google-sa-key.jsonJira API Token: Go to https://id.atlassian.com/manage-profile/security/api-tokens, click "Create API token", and paste the value as JIRA_TOKEN.
GitHub Token: Create a classic Personal Access Token (not fine-grained — GraphQL API doesn't support those yet) at https://github.com/settings/tokens with the read:user scope.
Google Service Account (for roster sync): See Google Service Account Setup below.
npm run dev:fullThis starts both the Vite frontend (port 5173) and the Express backend (port 3001). Vite proxies /api requests to the backend.
- Frontend: http://localhost:5173
- API: http://localhost:3001/api
On first launch, a yellow banner will appear directing you to Settings. There you can configure:
- Org roots — LDAP UIDs of org leaders whose teams you want to track (e.g.,
shgriffi) - Google Sheet ID — The spreadsheet ID from the Google Sheets URL (the long alphanumeric string). Sheet names are auto-discovered.
Click "Sync Now" to populate the roster. The app will also sync automatically once every 24 hours.
To use the Google Sheets roster sync:
- Go to the Google Cloud Console
- Create or select a project
- Enable the Google Sheets API (APIs & Services > Library)
- Create a Service Account (APIs & Services > Credentials > Create Credentials)
- Create a JSON key for the service account and download it
- Place the key file at
secrets/google-sa-key.json(this path is gitignored) - Set
GOOGLE_SERVICE_ACCOUNT_KEY_FILE=./secrets/google-sa-key.jsonin.env - Share your Google Sheet with the service account email (the
client_emailin the JSON key)
npm run dev:full # Start frontend + backend
npm run dev # Frontend only (Vite)
npm run dev:server # Backend only (Express, needs .env)
npm test # Run all tests
npm run test:watch # Tests in watch mode
npm run lint # ESLint
npm run build # Production build- Frontend: Vue 3, Vite 6, Tailwind CSS 3, Chart.js 4
- Backend: Express (single server for local dev and production)
- Auth: OpenShift OAuth proxy (production), no auth (local dev)
- Storage: Local filesystem (
./data/), PVC in OpenShift - Hosting: OpenShift with ArgoCD
- Testing: Vitest
The app is deployed to OpenShift via ArgoCD. See deploy/OPENSHIFT.md for the full deployment guide, including building images on ARM Macs, creating secrets, and troubleshooting.
For local testing with Kind (Kubernetes in Docker), see deploy/KIND.md.
See CONTRIBUTING.md for development workflow, project structure, and code style guidelines.
Architecture and deployment details are in .claude/CLAUDE.md — Claude Code reads this automatically.