A full‑stack system for ingesting ADS‑B flight data, detecting route anomalies with machine learning, and visualizing results on an interactive map.
- Backend (Django + DRF)
- Flight, AnomalyDetection, DataSource models
- CSV ingestion endpoint with validation and normalization
- ML pipeline (Isolation Forest) with training and detection endpoints
- OpenAPI/Swagger docs
- Frontend (React + Vite + TypeScript)
- Modern UI with shadcn/ui and Tailwind CSS v4
- Mapbox GL JS flight map
- CSV upload, Train Model, Run Detection quick actions
- React Query for data fetching/state
- Python 3.10+
- Node.js 18+ (Node 20 LTS recommended)
- Mapbox account/token (for map visualization)
# From project root
cd backend
python -m venv venv
# Windows PowerShell (if execution policy blocks activation, run PS as admin):
# Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
# & .\venv\Scripts\Activate.ps1
# Or cmd:
# .\venv\Scripts\activate.bat
python -m pip install -r requirements.txt
python manage.py migrate
python manage.py runserver 8000- API root:
http://127.0.0.1:8000/api/ - Swagger:
http://127.0.0.1:8000/swagger/
# In another terminal, from project root
cd frontend
npm i
# Environment (create a file frontend/.env.local)
# VITE_API_BASE=http://127.0.0.1:8000
# VITE_MAPBOX_TOKEN=pk.your_mapbox_access_token_here
npm run dev- App:
http://localhost:5173
- Flights
GET /api/flights/(list)POST /api/flights/upload_csv/(multipart form) – field name:file
- Anomalies
POST /api/anomalies/train_model/- body:
{ "contamination"?: number, "flight_limit"?: number, "save_model"?: boolean }
- body:
POST /api/anomalies/detect_anomalies/- body:
{ "flight_ids"?: string[], "retrain"?: boolean }
- body:
- Data Sources
GET /api/data-sources/
- Dashboard – quick actions (Upload Flight Data, Train Model, Run Detection)
- Flights – CSV upload & filters (WIP wiring to list)
- Anomalies – filters and model controls (WIP wiring to list)
- Map – Mapbox GL route visualization
- Chatbot – UI scaffold (RAG wiring planned)
From backend/:
# Train the model
python manage.py train_anomaly_model --contamination 0.15 --save-model
# Detect anomalies (trains if no model loaded)
python manage.py detect_anomalies --min-confidence 0.8- CORS (dev): allows
http://localhost:5173 - Auth: DRF JWT packages present; dev mode defaults to permissive
AllowAnyfor ease of local development - Logging: file
backend/logs/django.logand console
- Tailwind CSS v4
- PostCSS plugin:
@tailwindcss/postcss - Import order:
@import "tailwindcss";must be first insrc/index.css
- PostCSS plugin:
- shadcn/ui
- Component tokens map to Tailwind CSS v4 color variables declared in
src/index.css
- Component tokens map to Tailwind CSS v4 color variables declared in
- Vite
- Use Node 18+; if you see crypto/hash errors, align Vite/Node versions (project uses Vite 5)
- PowerShell virtualenv activation blocked
- Open PowerShell as admin and run:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
- Open PowerShell as admin and run:
- Vite CSS error
@import must precede all other statements- Ensure
@import "tailwindcss";is the first line infrontend/src/index.css
- Ensure
- Map not rendering
- Set
VITE_MAPBOX_TOKENinfrontend/.env.local
- Set
- CORS/Network errors
- Confirm backend is running at
http://127.0.0.1:8000andVITE_API_BASEmatches
- Confirm backend is running at
- Backend
python manage.py migratepython manage.py runserver 8000python manage.py train_anomaly_model ...python manage.py detect_anomalies ...
- Frontend
npm run devnpm run buildnpm run preview
- Wire flights/anomalies lists in UI
- Show anomalies as overlays on Mapbox (points/lines)
- Auth (JWT) enablement and protected routes
- Docker compose for full stack
- RAG chatbot backend and vector DB integration
MIT (see LICENSE if present).
- Contract compatibility:
- Flight list accepts temporary alias query params:
icao24 -> aircraft_iddeparture_airport -> originarrival_airport -> destination
- Flight list accepts temporary alias query params:
- Chat APIs:
POST /api/chat/sessions/GET /api/chat/sessions/{id}/messages/POST /api/chat/messages/
- Ingestion operations:
POST /api/data-sources/{id}/trigger_ingestion/GET /api/ingestion-runs/
- Celery worker/beat and Redis added for async ingestion + retries.
- New management command:
python manage.py run_scheduled_ingestions
- Chat and model grounding:
N8N_CHAT_WEBHOOK_URLOPENAI_API_KEYCOHERE_API_KEYCHAT_REQUEST_TIMEOUT_SECONDS(default20)CHAT_MAX_CONTEXT_ITEMS(default8)
- Ingestion queue:
CELERY_BROKER_URL(defaultredis://localhost:6379/0)CELERY_RESULT_BACKEND
- Review policy:
ANOMALY_REVIEW_THRESHOLD(default0.8)