A retro space-themed Capture The Flag platform built with modern tech stack that actually Just Works™️
Experience a CTF in a sleek, dark-themed environment with real-time scoring and team collaboration.
Static Demo Site · Report Bug · Request Feature
Before you begin, ensure you have the following installed:
Clone the repository
bash
git clone https://github.com/asynchronous-x/orbital-ctf.git
cd orbital-ctf
Install dependencies
bash
npm install
# or
yarn install
Create a .env file
bash
cp .env.example .env
Set up the database
bash
npx prisma migrate reset
Seed initial challenges
bash
npm run prisma:seed
# or
yarn prisma:seed
Start development server
bash
npm run dev
# or
yarn dev
Open http://localhost:3000 to launch the platform.
orbital-ctf/
├── src/
│ ├── app/ # Next.js app router pages
│ ├── components/ # React components
│ ├── lib/ # Server-side helpers
│ ├── utils/ # Client-side utilities
│ ├── types/ # Shared TypeScript types
│ ├── middleware.ts # Next.js middleware
│ └── instrumentation.ts # Startup tasks (challenge import)
├── prisma/
│ ├── schema.prisma # Database schema
│ └── migrations/ # Database migrations
└── public/ # Static assets
└── uploads/ # Challenge file uploads
The platform is built on these core models:
| Model | Description |
|---|---|
User |
User accounts with authentication and team membership |
Team |
Team information, scoring, and member management |
Challenge |
CTF challenges with points and locking rules |
UnlockCondition |
Challenge unlock requirements |
ChallengeFlag |
Supports multi-flag scoring |
Submission |
Challenge submission tracking and validation |
Announcement |
Platform-wide announcements |
ActivityLog |
Team activity tracking |
GameConfig |
CTF game timing and state configuration |
ChallengeFile |
Challenge attachment management |
Hint |
Challenge hints with point costs |
TeamHint |
Tracks which teams have purchased hints |
SiteConfig |
Platform configuration settings |
Score |
Detailed scoring history for teams and users |
TeamPointHistory |
Chronological log of team score changes |
The platform can be configured through environment variables:
DATABASE_URL="file:./dev.db"
NEXTAUTH_SECRET="your-secret-here"
NEXTAUTH_URL="http://localhost:3000"
INGEST_CHALLENGES_AT_STARTUP=true
CHALLENGES_DIR="./challenges"
Set INGEST_CHALLENGES_AT_STARTUP to true if you want challenges in CHALLENGES_DIR automatically imported when the server starts.
This project is licensed under the GPL-3.0 License. See the LICENSE file for details.
Made with 💯 by Asynchronous-X
$ claude mcp add orbital-ctf \
-- python -m otcore.mcp_server <graph>