A secure monitoring dashboard for tracking Renovate Bot adoption across repositories within a GitHub organization, displaying outdated dependencies detected by the bot.
- π Secure Authentication: GitHub OAuth SSO with team-based access control
- π Repository Monitoring: Track which repositories have adopted Renovate Bot
- π Outdated Dependencies: View outdated dependencies detected by Renovate across all repos
- β‘ Real-time Updates: WebSocket-powered live notifications
- π§ Multi-channel Notifications: Alerts via Microsoft Teams, Email, or in-app
- β° Scheduled Scanning: Automatic periodic scans of your organization
- π¨ Beautiful UI: Modern dark/light mode dashboard with dynamic animations
- π Two Storage Modes: Quick start with memory storage or persistent PostgreSQL database
- π‘οΈ Production-Ready Security: Rate limiting, CSP headers, non-root Docker containers
- Frontend: React 18, TypeScript, Vite, Tailwind CSS, TanStack Query, Recharts
- Backend: Node.js, Express, TypeScript, Passport.js
- Database: PostgreSQL (optional - can use in-memory storage)
- Real-time: Socket.io with authentication
- Security: Helmet, express-rate-limit, GitHub OAuth
- ORM: Prisma (when using database mode)
No Database (Memory Mode):
# 1. Clone and install
git clone <repo-url> && cd renovate-bot-dashboard && pnpm install
# 2. Configure (edit backend/.env with your GitHub credentials)
cp backend/.env.example backend/.env
# 3. Set STORAGE_MODE=memory in backend/.env
# 4. Start
pnpm run devWith PostgreSQL Database:
# 1. Clone and install
git clone <repo-url> && cd renovate-bot-dashboard && pnpm install
# 2. Start PostgreSQL (Docker)
docker run --name renovate-postgres \
-e POSTGRES_DB=renovate_dashboard \
-e POSTGRES_USER=renovate \
-e POSTGRES_PASSWORD=yourpassword \
-p 5432:5432 -d postgres:16-alpine
# 3. Configure (edit backend/.env with your credentials and DATABASE_URL)
cp backend/.env.example backend/.env
# 4. Initialize database
cd backend
pnpm run db:generate && pnpm run db:migrate && pnpm run db:seed
cd ..
# 5. Start
pnpm run devAccess at: http://localhost:5173
- Node.js 18+ or 20+
- pnpm (recommended) or npm
- GitHub Personal Access Token with
repoandread:orgscopes - GitHub OAuth App for authentication
- PostgreSQL 14+ (optional - only for database mode)
Perfect for testing and development! Start in minutes without setting up a database.
- Clone and install dependencies
git clone https://github.com/your-org/renovate-bot-dashboard.git
cd renovate-bot-dashboard
pnpm install- Configure environment
# Copy example environment file
cp backend/.env.example backend/.envEdit backend/.env with your credentials:
# GitHub Configuration
GITHUB_TOKEN=ghp_your_personal_access_token_here
GITHUB_ORG=your-organization-name
# GitHub OAuth (create at: https://github.com/settings/developers)
GITHUB_AUTH_CLIENT_ID=your_oauth_client_id
GITHUB_AUTH_CLIENT_SECRET=your_oauth_client_secret
# Session Security (generate with: openssl rand -base64 32)
SESSION_SECRET=your_random_32_character_secret_string
# Storage Mode - Use memory for quick start
STORAGE_MODE=memory
# URLs
PORT=3001
FRONTEND_URL=http://localhost:5173- Start the application
# From project root
pnpm run devThe application will start:
- Frontend: http://localhost:5173
- Backend API: http://localhost:3001
For persistent data storage in production environments, follow these steps to set up from scratch:
git clone https://github.com/your-org/renovate-bot-dashboard.git
cd renovate-bot-dashboard
pnpm installOption A: Using Docker (Recommended)
# Start PostgreSQL container
docker run --name renovate-postgres \
-e POSTGRES_DB=renovate_dashboard \
-e POSTGRES_USER=renovate \
-e POSTGRES_PASSWORD=yourpassword \
-p 5432:5432 \
-d postgres:16-alpineOption B: Using Local PostgreSQL
# Create database (macOS with Homebrew)
brew install postgresql@16
brew services start postgresql@16
# Create database and user
psql postgres
CREATE DATABASE renovate_dashboard;
CREATE USER renovate WITH PASSWORD 'yourpassword';
GRANT ALL PRIVILEGES ON DATABASE renovate_dashboard TO renovate;
\q# Copy example environment file
cp backend/.env.example backend/.envEdit backend/.env:
# GitHub Configuration
GITHUB_TOKEN=ghp_your_personal_access_token_here
GITHUB_ORG=your-organization-name
# GitHub OAuth
GITHUB_AUTH_CLIENT_ID=your_oauth_client_id
GITHUB_AUTH_CLIENT_SECRET=your_oauth_client_secret
# Session Security
SESSION_SECRET=your_random_32_character_secret_string
# Database Configuration
STORAGE_MODE=database
DATABASE_URL=postgresql://renovate:yourpassword@localhost:5432/renovate_dashboard
# URLs
PORT=3001
FRONTEND_URL=http://localhost:5173# Navigate to backend directory
cd backend
# Generate Prisma Client (creates TypeScript types and query engine)
pnpm run db:generate
# Run database migrations (creates tables and schema)
pnpm run db:migrate
# Optional: Seed database with sample data
pnpm run db:seed
# Return to project root
cd ..What each command does:
db:generate- Generates Prisma Client from your schema (required before first run)db:migrate- Creates database tables based on Prisma schemadb:seed- Populates database with initial/sample data (optional)
# From project root
pnpm run devAccess the dashboard at http://localhost:5173
Check the backend logs for successful connection:
β Database connection established
β Server running on http://localhost:3001
You can also explore your database:
cd backend
pnpm run db:studioThis opens Prisma Studio at http://localhost:5555 for visual database management.
Perfect for production deployments with all services containerized. See our Docker Setup Guide for comprehensive documentation.
-
Configure environment
cp .env.example .env # Edit .env with your production settings -
Start all services (Frontend, Backend, PostgreSQL, Redis)
cd docker docker-compose up -dThe dashboard will be available at http://localhost
-
View logs
docker-compose logs -f
-
Stop services
docker-compose down
What's Included:
- PostgreSQL 16 (persistent database)
- Redis 7 (session storage & Socket.io)
- Backend API (Node.js/Express)
- Frontend (Nginx serving React SPA)
- Automatic database migrations
Security Features:
- Non-root execution (backend: UID 1001, frontend: UID 101)
- Isolated Docker network
- Health checks for all services
- Secure session management with Redis
All database commands should be run from the backend/ directory:
cd backend| Command | Description | When to Use |
|---|---|---|
pnpm run db:generate |
Generate Prisma Client | After pnpm install, after schema changes |
pnpm run db:migrate |
Run database migrations | First setup, after schema changes |
pnpm run db:seed |
Seed database with sample data | Testing, development |
pnpm run db:studio |
Open Prisma Studio GUI | Viewing/editing database visually |
pnpm run db:migrate:prod |
Deploy migrations (no prompts) | Production deployments |
Initial Setup (First Time)
cd backend
pnpm run db:generate # Generate Prisma Client
pnpm run db:migrate # Create database tables
pnpm run db:seed # Add sample data (optional)After Changing Schema (backend/prisma/schema.prisma)
cd backend
pnpm run db:migrate # Create and apply migration
pnpm run db:generate # Regenerate Prisma ClientReset Database (Start Fresh)
cd backend
# Drop and recreate database
psql -U postgres -c "DROP DATABASE renovate_dashboard;"
psql -U postgres -c "CREATE DATABASE renovate_dashboard;"
# Run migrations
pnpm run db:migrate
pnpm run db:seedProduction Deployment
cd backend
pnpm run db:generate # Generate client
pnpm run db:migrate:prod # Deploy migrations (no prompts)| Variable | Description | How to get |
|---|---|---|
GITHUB_TOKEN |
GitHub PAT with repo, read:org scopes |
Create token |
GITHUB_ORG |
GitHub organization to monitor | Your org name |
GITHUB_AUTH_CLIENT_ID |
OAuth App Client ID | Create OAuth App |
GITHUB_AUTH_CLIENT_SECRET |
OAuth App Client Secret | Same OAuth App |
SESSION_SECRET |
Random string for session encryption | Generate: openssl rand -base64 32 |
| Variable | Required | Default | Description |
|---|---|---|---|
STORAGE_MODE |
No | memory |
memory or database |
DATABASE_URL |
Only if database mode |
- | PostgreSQL connection string |
| Variable | Default | Description |
|---|---|---|
PORT |
3001 | Backend server port |
FRONTEND_URL |
http://localhost:5173 | Frontend URL for CORS and OAuth |
SCAN_INTERVAL_MINUTES |
60 | Auto-scan interval |
MAX_SCAN_LIMIT |
0 | Max repos per scan (0=unlimited) |
SCAN_REPOS |
- | Comma-separated list of specific repos |
TEAMS_WEBHOOK_URL |
- | MS Teams incoming webhook |
SMTP_HOST |
- | SMTP server for emails |
SMTP_PORT |
587 | SMTP port |
SMTP_USER |
- | SMTP username |
SMTP_PASS |
- | SMTP password |
NOTIFICATION_FROM_EMAIL |
- | Email sender address |
- Go to GitHub Developer Settings
- Click "New OAuth App"
- Fill in:
- Application name: RenovateBot Dashboard
- Homepage URL:
http://localhost:5173(dev) or your production URL - Authorization callback URL:
http://localhost:3001/api/auth/callback
- Copy Client ID and Client Secret to
.env
By default, only users in the team_cloud_and_platforms team under the prom-candp organization can access the dashboard. To change this, modify:
backend/src/routes/auth.routes.ts(lines 10-11)
Configure notifications for different events:
- Critical Updates: Major version updates detected
- New Adoption: Repository adopts Renovate
- Stale PRs: Renovate PRs open too long
- Scan Complete: Organization scan finished
π This application implements production-grade security:
- β GitHub OAuth SSO - Mandatory authentication with team-based authorization
- β Rate Limiting - Three-tier system (100 req/15min general, 5 req/15min auth, 10 req/hour scans)
- β Security Headers - CSP, HSTS, X-Frame-Options via Helmet
- β Session Security - httpOnly, secure, sameSite cookies
- β WebSocket Authentication - Cookie-based session verification
- β Non-Root Docker - Containers run as UID 1001
- β CSRF Protection - OAuth state parameter validation
- β Input Validation - Zod schema validation on all endpoints
See SECURITY.md for comprehensive security documentation.
All endpoints require authentication except /api/auth/* and /health.
GET /api/auth/login- Initiate GitHub OAuthGET /api/auth/callback- OAuth callbackGET /api/auth/status- Check auth statusPOST /api/auth/logout- Logout user
GET /api/dashboard/summary- Dashboard overviewGET /api/dashboard/trends- Historical trends (30 days)GET /api/dashboard/activity- Recent activityGET /api/dashboard/github-status- GitHub API rate limit
GET /api/repositories- List repositories (paginated)GET /api/repositories/:id- Repository details with dependenciesGET /api/repositories/stats- Aggregate statisticsPOST /api/repositories/scan- Trigger organization scanPOST /api/repositories/:id/scan- Scan single repository
GET /api/dependencies- List all dependencies (paginated)GET /api/dependencies/outdated- List outdated dependenciesGET /api/dependencies/stats- Dependency statisticsGET /api/dependencies/package-managers- List detected package managers
GET /api/notifications/config- Get notification configsPOST /api/notifications/config- Create notification configPUT /api/notifications/config/:id- Update configDELETE /api/notifications/config/:id- Delete configPOST /api/notifications/test- Send test notificationGET /api/notifications/history- Notification historyGET /api/notifications/triggers- Available triggers
GET /api/settings- Get application settingsPUT /api/settings- Update settings
βββ frontend/ # React frontend
β βββ src/
β β βββ components/ # UI components
β β βββ pages/ # Page components
β β βββ services/ # API client
β β βββ context/ # React contexts
β β βββ types/ # TypeScript types
β βββ ...
βββ backend/ # Express backend
β βββ src/
β β βββ routes/ # API routes
β β βββ services/ # Business logic
β β βββ middleware/ # Express middleware
β β βββ config/ # Configuration
β βββ prisma/ # Database schema
βββ docker/ # Docker configs
βββ docs/ # Documentation
- π Local Setup Guide - Step-by-step guide to run without database
- π Security Documentation - Comprehensive security guide
- π Security Audit Report - Latest security audit results
- ποΈ Implementation Steps - Development roadmap
- π€ CLAUDE.md - AI assistant reference documentation
Error: Cannot find module '.prisma/client/default'
- This means Prisma Client hasn't been generated yet
- Solution: Run
cd backend && pnpm run db:generate - This must be done after
pnpm installand before starting the server - The Prisma Client is generated from your schema and contains TypeScript types
Database connection errors
- Verify PostgreSQL is running:
psql -U renovate -d renovate_dashboard - Check
DATABASE_URLin.envmatches your database credentials - Ensure database exists:
psql -U postgres -c "CREATE DATABASE renovate_dashboard;" - Check firewall rules if using remote PostgreSQL
Migration errors: "Schema does not match database"
- Your database schema is out of sync
- Solution:
cd backend && pnpm run db:migrate - For a fresh start: Drop database and run migrations again
- Check
backend/prisma/migrationsfolder for migration history
Port already in use (EADDRINUSE)
- Backend (3001) or Frontend (5173) port is already taken
- Find process:
lsof -i :3001orlsof -i :5173 - Kill process:
kill -9 <PID> - Or change port in
.env(PORT) orvite.config.ts
Authentication fails with "Invalid state parameter"
- Clear browser cookies and try again
- Check that
FRONTEND_URLmatches your actual frontend URL - Verify OAuth callback URL in GitHub matches
http://localhost:3001/api/auth/callback
"Too many requests" error
- Rate limiting is active. Wait 15 minutes or restart backend in development mode
- In production, this prevents abuse
- Rate limits: 100 req/15min general, 5 req/15min auth, 10 req/hour scans
Dependencies not showing
- Run a scan: Click "Start Scan" button in the dashboard
- Check GitHub token has correct permissions (
repo,read:org) - Verify organization has Renovate Bot PRs
- Check backend logs for GitHub API errors
WebSocket connection fails
- Check that backend is running on port 3001
- Verify CORS settings match your frontend URL
- Open browser DevTools β Network tab β WS to see connection errors
Prisma Studio won't start
- Ensure
DATABASE_URLis set correctly in backend/.env - Run
cd backend && pnpm run db:generatefirst - Check if port 5555 is available
pnpm install fails
- Try clearing cache:
pnpm store prune - Delete node_modules and lockfile:
rm -rf node_modules pnpm-lock.yaml - Run
pnpm installagain - Ensure Node.js version is 18+ or 20+
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run linter:
pnpm run lint - Test security:
pnpm auditandtrivy fs . - Commit using conventional commits (
feat:,fix:,chore:) - Push and create a Pull Request
- β‘ GitHub API responses cached for 5 minutes
- π React Query caching on frontend
- π WebSocket for real-time updates (no polling)
- ποΈ Memory storage mode: sub-second response times
- π Pagination on all list endpoints
