Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Real-time aircraft disruption simulation and recovery engine.
Translation pending
BusinessTypeScript · PythonGitHub @mizuharaaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Olus simulates airline disruptions and compares recovery strategies using FastAPI, Next.js, OR-Tools CP-SAT, selected Part 117 crew checks, and deterministic replay.
AI translation
Olus simulates airline disruptions and compares recovery strategies. FastAPI, Next.js, OR-Tools CP-SAT, selected Part 117 crew checks, and deterministic replay.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Airline operational disruptions — weather, mechanical failures, crew duty limits, and ATC ground stops — cost the global aviation industry an estimated $34 billion per year. When a single hub airport closes for three hours, the ripple effect can ground hundreds of flights, strand thousands of passengers, and cascade crew duty-time violations across an entire network for days.Read the full README ↗
Airline operational disruptions — weather, mechanical failures, crew duty limits, and ATC ground stops — cost the global aviation industry an estimated $34 billion per year. When a single hub airport closes for three hours, the ripple effect can ground hundreds of flights, strand thousands of passengers, and cascade crew duty-time violations across an entire network for days.
Traditional airline operations control (AOC) systems rely on manual recovery decisions made under extreme time pressure with incomplete information. Dispatchers juggle spreadsheets, phone calls, and aging terminals to reassign aircraft, reroute crews, and reaccommodate passengers — often optimising one constraint while unknowingly violating another.
Olus gives operations engineers, researchers, and airline strategists a platform to:
It runs on a synthetic carrier — Nimbus Air — and optionally overlays live US flight positions and weather/ATC events pulled from public feeds.
Olus is intentionally stateless and in-memory. On startup the API loads the Nimbus Air network from YAML and holds the entire world in process — there is no database, no cache, no message queue, and no auth tier to provision. Every simulation run is deterministic and reproducible, which makes the engine easy to reason about, test, and deploy: a single API container plus the web frontend.
Live data (real ADS-B positions, weather alerts, ATC ground stops) is fetched over HTTPS on demand and cached in memory; the app degrades gracefully to the synthetic network when those feeds are unavailable.
+---------------------------------------------------------------+
| Browser / Client |
| Next.js 15 (App Router, TypeScript) |
| Leaflet | Recharts | Zustand | TanStack Query |
+---------------------------+-----------------------------------+
| REST + WebSocket (/ws/simulation)
+---------------------------v-----------------------------------+
| FastAPI (Python 3.11) |
| in-memory, stateless |
| |
| +------------------+ +----------------+ +--------------+ |
| | Disruption Engine| | FAR 117 Engine | | MILP Solver | |
| | (11 event types) | | (duty limits) | | (OR-Tools) | |
| +------------------+ +----------------+ +--------------+ |
| |
| +------------------+ +----------------+ +--------------+ |
| | Cascade Predictor| | Recovery | | Heuristic | |
| | (physics + | | Explainer + | | Fallback | |
| | optional XGB) | | Cost model | | | |
| +------------------+ +----------------+ +--------------+ |
+----------------+--------------------+-------------------------+
| |
+--------v------+ +--------v--------+
| YAML network | | Live feeds |
| airports / | | OpenSky (ADS-B)|
| aircraft / | | NWS alerts |
| flights /crew | | FAA NAS status |
+---------------+ +-----------------+
| Event Type | Description |
|---|---|
weather_closure | Airport made unavailable by severe weather |
ground_stop | ATC halts departures to/from an airport |
airspace_closure | A polygon of airspace is blocked, forcing reroutes |
security_event | Airport closed for a security incident |
mechanical_aog | A specific aircraft grounded (aircraft-on-ground) |
crew_sickout | N% of crews become unavailable |
runway_closure | Reduced airport capacity |
atc_staffing | Reduced ATC throughput |
volcanic_ash | Ash cloud forces wide-area rerouting |
cyber_incident | Slower aircraft turnarounds network-wide |
drone_incursion | Runway operations suspended — duration unknown at trigger time |
Eleven canned scenarios ship in data/scenarios/ (e.g. chicago_ground_stop,
dfw_runway_closure, volcanic_ash_pacific, atl_security,
tan_son_nhat_drone).
drone_incursion is the one event type whose duration is not known when it
fires. It carries a log-normal closure-length distribution (default: median
45 min, p95 3 h) instead of an end time, its length depends on detection
confidence (pilot report vs. radar), and repeated suspensions of the same
sighting fold into a single incident rather than stacking as independent
events.
optimizer/uncertain.py): when a disruption's duration
is a distribution, the same CP-SAT model is solved across sampled closure
lengths. Each plan then reports an expected cost, a cost band, and regret
— how much more it costs than the best recovery available with hindsightapi.weather.gov) — active weather alerts, geo-matched to Nimbus airportsnasstatus.faa.gov) — live ground stops, GDPs, and departure delaysPrerequisites: Docker ≥ 24 and Docker Compose ≥ 2.20.
git clone https://github.com/mizuharaa/olus.git olus
cd olus
docker compose up --build
Two services start: olus-api (FastAPI, port 8000) and olus-web
(Next.js, port 3000). No external database or cache is provisioned — the API
loads its network from YAML at startup. Simulation/scenario state (disruption
timeline, recovery plans) is persisted locally to apps/api/state/olus.db
(SQLite) so a restart mid-scenario doesn't lose it; see
apps/api/NONDETERMINISM.md for what replay does and doesn't pin.
| Service | URL |
|---|---|
| Web UI | http://localhost:3000 |
| API docs (Swagger) | http://localhost:8000/docs |
| API docs (ReDoc) | http://localhost:8000/redoc |
| Health check | http://localhost:8000/health |
Optional: for higher-resolution live ADS-B, create an OpenSky API client at https://opensky-network.org/my-opensky and set
OPENSKY_CLIENT_ID/OPENSKY_CLIENT_SECRET(or drop acredentials/credentials.json). Without credentials the app uses anonymous OpenSky access and the synthetic network.
Backend (requires Python 3.11 and Poetry):
cd apps/api
poetry install # API runtime only
# poetry install --with train # add XGBoost/sklearn for predictor training
poetry run uvicorn src.main:app --reload --port 8000
Frontend (requires Node 18+):
cd apps/web
npm install
npm run dev # http://localhost:3000
All endpoints are prefixed with /api/v1. Full interactive docs at /docs.
| Method | Endpoint | Description |
|---|---|---|
| GET | /network | Full Nimbus Air network snapshot |
| GET | /airports · /airports/{id} | Airports |
| GET | /aircraft · /aircraft/{tail} | Aircraft fleet |
| GET | /crews | Crew pairings |
| GET | /schedule | Scheduled flights |
| Method | Endpoint | Description |
|---|---|---|
| GET | /flights · /flights/{id} | Scheduled flights |
| GET | /flights/live | Live ADS-B positions (OpenSky) |
| GET | /flights/search | Search flights |
| GET | /flights/status/opensky | OpenSky feed status |
| Method | Endpoint | Description |
|---|---|---|
| GET | /events/types | The 11 disruption event types |
| GET | /events/scenarios | Canned scenarios |
| POST | /events/trigger | Inject a disruption |
| GET | /events/active | Active disruptions |
| DELETE | /events/{event_id} | Clear a disruption |
| Method | Endpoint | Description |
|---|---|---|
| POST | /recovery/solve | Solve recovery (returns the 4 objective plans) |
| GET | /recovery/plans | Retrieve computed plans |
| POST | /recovery/apply | Apply a plan to the live schedule |
| POST | /recovery/explain | Plain-language explanation of a plan |
| POST | /recovery/crew-overbooking | Crew-overbooking recovery analysis |
| Method | Endpoint | Description |
|---|---|---|
| POST | /predict/cascade | Predict cascade impact of a disruption |
| GET | /predict/history | Prediction history |
| GET | /simulator/state | Current simulator state |
| POST | /simulator/trigger · /simulator/reset | Drive the simulator |
| GET | /simulator/scenarios · POST /simulator/scenarios/{name}/load | Load a scenario |
| POST | /network/stress-test | Run a network stress test |
| POST | /playtest/cascade | Interactive cascade playtest |
| Method | Endpoint | Description |
|---|---|---|
| GET | /passengers/impact · /passengers/rebooking | Passenger impact & rebooking |
| GET | /passengers/hotels/{airport} · /passengers/compensation-policy | Reaccommodation |
| GET | /weather/metars · /weather/metar/{id} · POST /weather/refresh | METARs |
| GET | /live/faa-status · /live/weather-alerts · /live/national-snapshot | Live US ops feeds |
Connect to ws://localhost:8000/ws/simulation for real-time simulation updates
(simulation_update messages carry the active event, flight states, cascade
summary, and recovery plans; an initial connected message includes a full
state snapshot).
| Component | Technology |
|---|---|
| Language | Python 3.11 |
| Web framework | FastAPI 0.115 + Uvicorn (REST + WebSocket) |
| Validation / config | Pydantic v2 + pydantic-settings |
| Optimiser | Google OR-Tools 9.10 (CP-SAT) |
| Numerics | NumPy |
| Cascade predictor (optional training) | XGBoost + scikit-learn |
| HTTP clients | httpx (OpenSky / NWS / FAA) |
| Logging | structlog |
| Network data | YAML (pyaml) |
| Component | Technology |
|---|---|
| Framework | Next.js 15 (App Router) + React 19 |
| Language | TypeScript 5 |
| Map | Leaflet + react-leaflet (Carto Positron basemap) |
| Charts | Recharts |
| Client state | Zustand |
| Server state | TanStack Query |
| Styling | Tailwind CSS + shadcn/ui (Radix primitives) |
| Forms | React Hook Form + Zod |
| Motion / Icons | Framer Motion · lucide-react |
| Component | Technology |
|---|---|
| Containerisation | Docker + Docker Compose (api + web) |
| Deployment | Vercel website; API container on AWS EC2 behind CloudFront |
| Prod IaC | Terraform (infra/aws/); infra/terraform/ is the retired ECS reference |
olus/
├── apps/
│ ├── api/ # FastAPI backend (in-memory)
│ │ ├── Dockerfile
│ │ ├── pyproject.toml
│ │ ├── smoke_test.py # end-to-end engine smoke test
│ │ ├── src/
│ │ │ ├── main.py # app entry point + lifespan
│ │ │ ├── core/ # config + logging
│ │ │ ├── routes/ # API route handlers
│ │ │ ├── events/ # 11 disruption event handlers + registry
│ │ │ ├── optimizer/ # OR-Tools MILP, explainer, crew overbooking
│ │ │ ├── predictor/ # cascade predictor
│ │ │ ├── crew/ # FAR 117 duty-time engine
│ │ │ ├── simulator/ # simulation engine
│ │ │ ├── network/ # stress-test engine
│ │ │ ├── costs/ # cost / carbon models
│ │ │ ├── data/ # OpenSky client
│ │ │ ├── weather/ # METAR / NWS client
│ │ │ └── ws/ # WebSocket handler
│ │ └── tests/ # pytest suite
│ └── web/ # Next.js 15 frontend
│ ├── app/ # App Router pages
│ ├── components/ # UI + simulator components
│ ├── stores/ # Zustand stores
│ └── lib/ # API client + WS hook
├── data/
│ ├── network/ # airports / aircraft / flights / crews YAML
│ └── scenarios/ # 11 canned disruption scenarios
├── scripts/
│ ├── generate_network.py # regenerate the Nimbus Air network
│ └── train_predictor.py # train the optional XGBoost cascade model
├── infra/terraform/ # AWS reference infrastructure
├── packages/schemas/ # shared Pydantic + TypeScript schemas
└── docker-compose.yml
# Backend
cd apps/api
poetry run pytest -q
poetry run python smoke_test.py # end-to-end engine check
# Frontend
cd apps/web
npm run type-check
npm run build
# Python
cd apps/api
poetry run ruff check src/
poetry run black src/
# TypeScript
cd apps/web
npm run lint
cd apps/api # uses repo-root data/ paths
poetry run python ../../scripts/generate_network.py
MIT License — Copyright (c) 2026 Olus Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Named after Olus, keeper of the winds in Greek mythology — because in aviation, the wind always has the final say.