A modern, full-stack Cyber Threat Intelligence (CTI) platform for tracking, analyzing, and enriching Indicators of Compromise (IOCs).
- π IOC Management - Track URLs, IPs, domains, and file hashes
- π Auto-Ingestion - Automatic URLHaus threat feed ingestion
- π― Enrichment - VirusTotal & AbuseIPDB integration
- π·οΈ Tagging System - Organize IOCs with custom tags
- π Dashboard - Real-time metrics and visualizations
- π₯ User Management - Role-based access control (Admin, Analyst, Viewer)
- π€ Export - Export IOCs in CSV/JSON formats
- Frontend: React 18, TypeScript, Tailwind CSS, Vite
- Backend: Node.js, Express.js, MongoDB
- Authentication: JWT tokens
- External APIs: VirusTotal, AbuseIPDB, URLHaus
- MongoDB Atlas account (free tier works)
- Vercel account
- GitHub account
- (Optional) VirusTotal API key (free tier)
- (Optional) AbuseIPDB API key (free tier)
cd /Users/aniketpandey/Desktop/cti/cti-me
# Initialize git if not already
git init
# Add the remote repository
git remote add origin https://github.com/pentoshi007/vortex.git
# Stage all files
git add .
# Commit
git commit -m "Initial commit: Vortex CTI Dashboard"
# Push to main branch
git branch -M main
git push -u origin main- Go to vercel.com and sign in
- Click "Add New Project"
- Import from GitHub:
pentoshi007/vortex - Configure the project:
- Root Directory:
backend - Framework Preset: Other
- Build Command: (leave empty)
- Output Directory: (leave empty)
- Root Directory:
In Vercel project settings β Environment Variables, add:
| Variable | Value | Description |
|---|---|---|
MONGO_URI |
mongodb+srv://... |
Your MongoDB Atlas connection string |
JWT_SECRET |
your-secure-random-string-min-32-chars |
Secret for JWT tokens (generate with openssl rand -hex 32) |
CRON_SECRET |
your-cron-secret |
Secret for cron job authentication |
NODE_ENV |
production |
Environment mode |
CORS_ORIGINS |
https://vortex-frontend.vercel.app |
Frontend URL (update after deploying frontend) |
VT_API_KEY |
your-virustotal-api-key |
(Optional) VirusTotal API key |
ABUSEIPDB_API_KEY |
your-abuseipdb-api-key |
(Optional) AbuseIPDB API key |
DEFAULT_ADMIN_PASSWORD |
your-secure-admin-password |
Initial admin password |
DEFAULT_ADMIN_EMAIL |
admin@yourdomain.com |
Initial admin email |
Click "Deploy" and wait for completion. Note the deployment URL (e.g., https://vortex-backend.vercel.app).
- In Vercel, click "Add New Project" again
- Import the same repo:
pentoshi007/vortex - Configure the project:
- Root Directory:
frontend - Framework Preset: Vite
- Build Command:
npm run build - Output Directory:
dist
- Root Directory:
| Variable | Value | Description |
|---|---|---|
VITE_API_URL |
https://vortex-backend.vercel.app |
Your backend URL from Step 2 |
Click "Deploy" and wait for completion.
After deploying the frontend, go back to your backend Vercel project:
- Go to Settings β Environment Variables
- Update
CORS_ORIGINSto your frontend URL:https://vortex-frontend.vercel.app - Redeploy the backend (Deployments β ... β Redeploy)
The first time you access the app, if DEFAULT_ADMIN_PASSWORD is set, an admin user will be created automatically.
Default Credentials:
- Username:
admin(or value ofDEFAULT_ADMIN_USERNAME) - Password: Value of
DEFAULT_ADMIN_PASSWORDenv var - Email: Value of
DEFAULT_ADMIN_EMAILenv var
If you have Vercel Pro, cron jobs are configured automatically:
- Ingestion: Every 2 hours (
0 */2 * * *) - Enrichment: Every 2 hours, offset by 30 min (
30 */2 * * *)
For free tier, use external cron services like cron-job.org:
# Ingestion (every 2 hours)
GET https://your-backend.vercel.app/api/cron/ingest?secret=YOUR_CRON_SECRET
# Enrichment (every 2 hours)
GET https://your-backend.vercel.app/api/cron/enrich?secret=YOUR_CRON_SECRET&limit=10
# Required
MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/vortex
JWT_SECRET=your-super-secure-jwt-secret-at-least-32-characters
# Optional - Initial Admin
DEFAULT_ADMIN_PASSWORD=your-secure-admin-password
DEFAULT_ADMIN_USERNAME=admin
DEFAULT_ADMIN_EMAIL=admin@example.com
# Optional - CORS
CORS_ORIGINS=https://your-frontend.vercel.app
# Optional - Cron
CRON_SECRET=your-cron-secret
# Optional - External APIs (Free Tier)
VT_API_KEY=your-virustotal-api-key
ABUSEIPDB_API_KEY=your-abuseipdb-api-key
# Optional - Rate Limits (defaults to free tier)
VT_RATE_LIMIT_PER_MIN=4
VT_RATE_LIMIT_PER_DAY=500
ABUSEIPDB_RATE_LIMIT_PER_DAY=1000VITE_API_URL=https://your-backend.vercel.appcd backend
npm install
cp .env.example .env # Edit with your values
npm run devcd frontend
npm install
npm run devPOST /api/auth/register- Register new userPOST /api/auth/login- LoginPOST /api/auth/refresh- Refresh token
GET /api/iocs- List IOCsPOST /api/iocs- Create IOCGET /api/iocs/:id- Get IOC detailsPUT /api/iocs/:id- Update IOCDELETE /api/iocs/:id- Delete IOC
POST /api/lookup- Perform IOC lookup with enrichmentGET /api/lookup/history- Get lookup history
GET /api/admin/system/stats- System statisticsPOST /api/admin/ingest/run- Trigger ingestionPOST /api/admin/enrichment/run- Trigger enrichmentGET /api/admin/users- List users
GET /api/cron/ingest- Cron ingestion endpointGET /api/cron/enrich- Cron enrichment endpointGET /api/cron/health- Cron health check
MIT