An open-source Roblox group ranking dashboard built with modern web technologies.
Manage promotions, demotions, rank requests, audits, and members using the Roblox Open Cloud API.
- Dashboard - Real-time stats, charts, activity feed, and system status
- Groups - Add and manage multiple Roblox groups with encrypted API keys
- Members - Search, filter, and manage group members with pagination
- Promotions - Single and bulk promotions with confirmation and audit trails
- Demotions - Same powerful features for demotions
- Rank Requests - Approval queue with comments and audit logging
- Audit Logs - Complete searchable history of all actions
- Settings - Theme customization, accent colors, notifications, security
- Frontend: Next.js 16, React 19, TypeScript, TailwindCSS v4, shadcn/ui
- Backend: Next.js Route Handlers, Prisma ORM, Zod
- Auth: Better Auth (Email/Password, GitHub OAuth, Discord OAuth)
- State: Zustand, TanStack Query
- Animations: Framer Motion
- Charts: Recharts
- Database: PostgreSQL (SQLite for development)
- Node.js 18+
- npm or yarn
- A Roblox Open Cloud API Key
git clone https://github.com/vortexsinclair/infinity-ranking.git
cd infinity-ranking
npm installCopy .env.example to .env.local:
cp .env.example .env.localFill in the required variables:
DATABASE_URL="file:./dev.db"
AUTH_SECRET="your-secret-here"
GITHUB_CLIENT_ID=""
GITHUB_CLIENT_SECRET=""
DISCORD_CLIENT_ID=""
DISCORD_CLIENT_SECRET=""
ENCRYPTION_KEY="your-64-char-hex-key"
NEXT_PUBLIC_APP_NAME="Infinity Ranking"
NEXT_PUBLIC_APP_URL="http://localhost:3000"node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"npx prisma db push
npx prisma generatenpm run devVisit http://localhost:3000
npm run build
npm startdocker-compose up -ddocker build -t infinity-ranking .
docker run -p 3000:3000 infinity-ranking- Go to the Roblox Open Cloud dashboard
- Create a new API Key
- Under "Cloud API Access", enable the
groupsscope - Set the group ID for the key
- Copy the API key and add it when creating a group in the dashboard
Security Note: API keys are encrypted with AES-256-GCM before being stored in the database. They are never exposed to the frontend.
| Role | Promote | Demote | Manage Users | Configure Groups | View Logs | Manage API Keys |
|---|---|---|---|---|---|---|
| Owner | Yes | Yes | Yes | Yes | Yes | Yes |
| Admin | Yes | Yes | Yes | Yes | Yes | Yes |
| Moderator | Yes | Yes | Yes | No | Yes | No |
| Staff | No | No | No | No | Yes | No |
The first registered user automatically becomes the Owner.
src/
├── app/ # Next.js pages and route handlers
│ ├── (auth)/ # Login and register pages
│ ├── (dashboard)/ # Dashboard pages
│ └── api/ # API route handlers
├── components/ # React components
│ ├── ui/ # shadcn/ui primitives
│ ├── layout/ # Layout components
│ ├── dashboard/ # Dashboard-specific components
│ ├── groups/ # Group management
│ ├── members/ # Member management
│ ├── promotions/ # Promotion/demotion forms
│ ├── rank-requests/ # Rank request queue
│ ├── audit/ # Audit log table
│ ├── settings/ # Settings page
│ └── shared/ # Shared/reusable components
├── hooks/ # Custom React hooks
├── lib/ # Utilities, validation, encryption
├── server/ # Server-side auth
├── services/ # Business logic and API services
├── store/ # Zustand stores
└── types/ # TypeScript type definitions
- All API keys encrypted with AES-256-GCM
- CSRF protection via Better Auth
- Security headers (X-Frame-Options, CSP, etc.)
- Input validation with Zod on all API routes
- Rate limiting on API endpoints
- No secrets exposed to the frontend
- All Roblox API calls go through the backend
See CONTRIBUTING.md for guidelines.
MIT License. See LICENSE for details.