- Track TryHackMe Progress
- Earn XP
- Unlock Achievements
- Measure Internship Readiness (Knowledge Percentage)
- Follow Guided Learning Paths
Built with React, Express, and PostgreSQL (Supabase)
- โก XP & Leveling System: Earn XP for completed rooms (Easy +10 XP, Medium +25 XP, Hard +50 XP) and level up dynamically.
- ๐ฅ Streak Tracking: Monitors daily activity and maintains active combos to motivate consistent practice.
- ๐ 50+ Achievements: Unlock unique, cybersecurity-themed milestone badges as you learn.
- ๐ง Knowledge Percentage (Internship Readiness): Analyzes your skill distribution across domains (Linux, Windows, Web, Forensics, CTFs, etc.) to give a weighted readiness score.
- ๐ฏ Smart Recommendations: Suggests the next best room to attempt based on difficulty and path sequencing.
- ๐บ๏ธ Interactive Roadmap: Search, filter, and track rooms grouped by path and categories.
- ๐ Cheat Sheet Library: High-quality references for Linux, Nmap, Burp Suite, and SQL Injection with copy-to-clipboard buttons.
- ๐ฎ Glassmorphism UI: Premium visual aesthetics, featuring micro-animations and an interactive 3D Spline background.
Follow these steps to run your own copy of CyberXP locally:
- Node.js 18+
- A PostgreSQL Database (e.g. a free instance on Supabase)
git clone https://github.com/SoraPewnaldo/cyberxp.git
cd cyberxpInstall dependencies for both the frontend client and the backend server:
# Install server dependencies
cd server
npm install
# Install client dependencies
cd ../client
npm installCreate a .env file inside the server directory and set the environment variables:
PORT=5000
DATABASE_URL=postgresql://<username>:<password>@<host>:<port>/<database>Note: Make sure to use an IPv4-compatible connection string (like the Supabase Connection Pooler URI on port 5432 or 6543) if you run into IPv6 resolution issues on your network.
Start the backend server and frontend client concurrently:
cd server
npm run devNote: On first startup, the database tables will be auto-created and seeded with all 483 rooms and 50 achievements.
cd client
npm run dev- Local Web App Access: http://localhost:3000
You can host your own production copy of CyberXP online for free by deploying the frontend to GitHub Pages and the backend to Render.
Because CyberXP uses PostgreSQL, you do not need a persistent disk on Render! The app is stateless and stores all its progress in the cloud database.
- Create a free account on Supabase and spin up a new project.
- Get your IPv4 Connection Pooler String:
- Navigate to your Supabase project dashboard -> click the green Connect button at the top center.
- Select the Direct connection string tab.
- Choose Session Pooler as the Connection Method and set Type to URI.
- Copy the URI string (it resolves to IPv4 which is required by Render).
- Create a free account on Render.com.
- Click New + > Web Service and connect your cloned GitHub repository.
- Set the following configuration settings:
- Root Directory:
server - Runtime/Language:
Node - Build Command:
npm install - Start Command:
npm run start(ornode server.js) - Instance Type:
Free
- Root Directory:
- Go to the Environment tab on Render and add the environment variable:
- Key:
DATABASE_URL - Value: Your copied Session Pooler URI (replace
[YOUR-PASSWORD]with your database password).
- Key:
- Deploy the service. Render will start the server and run database seeding automatically. Copy the live Web Service URL (e.g.,
https://your-backend.onrender.com).
- Open
client/src/api/axios.jsand update the production URL fallback to point to your live Render backend URL:const API = axios.create({ baseURL: import.meta.env.DEV ? '/api' : 'https://your-backend.onrender.com/api' });
- Open
client/package.jsonand change the homepage property to match your GitHub username and repository name:"homepage": "https://<your-github-username>.github.io/<your-repo-name>"
- Open
client/vite.config.jsand update the build base path to match your repository name:export default defineConfig({ base: '/<your-repo-name>/', // ... });
- Deploy your static app to GitHub Pages by running this command inside the
clientfolder:(This compiles your production assets and uploads them to thecd client npm run deploygh-pagesbranch automatically). - Go to your GitHub repository Settings > Pages and ensure the deployment source branch is set to
gh-pages.
โโโ server/ # Express API & SQLite Database
โ โโโ config/ # SQLite DB configuration and seed checker
โ โโโ controllers/ # Room, Achievement, Analytics, and Settings controllers
โ โโโ data/ # Generated SQLite database file (cyberxp.db)
โ โโโ routes/ # API endpoints
โ โโโ scripts/ # Seeder scripts
โ โโโ utils/ # XP, leveling, and achievement engine
โโโ client/ # Vite + React Frontend
โ โโโ src/
โ โโโ api/ # Axios instance configurations
โ โโโ components/ # Glassmorphic UI components (Stats, Gauge, Cards)
โ โโโ context/ # Global Settings & Profile context
โ โโโ pages/ # Dashboard, Roadmap, Achievements, Analytics, Settings
โ โโโ utils/ # Level calculation helpers
- Add customizable user profiles and custom avatars.
- Integrate local storage caching to minimize Render free tier spin-down lag.
- Add interactive custom quizzes to verify room completion knowledge.
- Integrate automated syncing with TryHackMe public API profiles.
The list of TryHackMe rooms, paths, and URLs used in this application is seeded from:
- Repository: Hunterdii/tryhackme-free-rooms by @Hunterdii
This project is licensed under the MIT License.


