Free, browser-based C-UAS training simulator. Practice the full DTID kill chain (Detect β Track β Identify β Defeat) in a realistic tactical operations center β no install, no account, no clearance required.
Target user: "The E-5 who gets handed the C-UAS binder and told to figure it out."
π Launch Simulator β
No install. No account. Just open the link and train.
πΊοΈ Train at your actual base. Drop a pin anywhere on Earth β real satellite imagery loads automatically. Set your perimeter, place your sensors, and run scenarios on terrain your operators actually defend. Not a demo airfield. Your location.
Version: v1.10.1 | Status: Active development
OpenSentry puts you in the seat of a C-UAS operator managing a real-time airspace picture. Contacts appear on your tactical map, you track them, identify them through the EO/IR camera, and decide how to respond β all under time pressure and within realistic Rules of Engagement.
Scoring is based on operational doctrine: detection speed, identification accuracy, countermeasure selection, ROE compliance, and proportionality. Not a game β a training tool.
| Scenario | Duration | Description | Difficulty |
|---|---|---|---|
| Tutorial | 5 min | Guided walkthrough β single contact, no waves | Beginner |
| Lone Wolf | 8 min | Single drone threat; build the kill chain start to finish | Easy |
| Recon Probe | 12 min | Multi-contact with trigger discipline β not everything gets engaged | Medium |
| Swarm Attack | 15 min | High-volume multi-wave with Shahed-style autonomous threat | Hard |
| THERMOPYLAE | 20 min+ | Unscripted free-play β 3 escalating phases, endless mode, all threat types | Variable |
| Free Play | Unlimited | Open sandbox β mixed threats, one of each system, no timer | Casual |
All systems are fictional but specification-accurate β no real program of record designators.
| System | Type | Range | Notes |
|---|---|---|---|
| L-Band Multi-Mission Radar | Surveillance | 10 km | 360Β°, all-weather, primary detection |
| Ku-Band Fire Control Radar | Fire control | 16 km | Guides JACKAL interceptors |
| EO/IR Camera | Pan/tilt/zoom | 8 km | Thermal + daylight, slew-to-cue, visual ID |
| System | Type | Range | Notes |
|---|---|---|---|
| RF/PNT Jammer | Electronic warfare | 5 km | Disrupts RF command links + GPS/PNT nav; rechargeable |
| DE-LASER-3km | Directed energy | 3 km | Precision single-target effector; LOS required; can pre-slew onto tracks before they enter range |
| DE-HPM-3km | Directed energy | 3 km | Wide-area microwave pulse; no LOS required; best against clustered swarms |
| JACKAL Pallet | Kinetic interceptor | 10 km | 4 interceptors; 10β15s spinup; requires Ku-Band FCS |
| Shenobi | RF detect + Protocol Manipulation | 8km/6km | Downlink acquisition β uplink defeat (HOLD / LAND NOW / DEAFEN); library scoped to commercial quad + micro control links |
| Threat | RF Jam Resistance | Notes |
|---|---|---|
| Commercial Quad | 0% | Fully jammable; Shenobi-vulnerable |
| Micro UAS | 10% | Small RCS; hard to visually ID; Shenobi-vulnerable |
| Fixed-Wing UAS | 40% | Faster; RF effects require an active command link; non-emitting tracks show PNT degradation only |
| Improvised UAS | 50% | Unknown electronics; jammer/PM effectiveness depends on emissions and library match |
| Shahed-style | 100% (RF-immune) | INS-primary; RF/PNT jamming has no effect; kinetic defeat required |
| Bird / Balloon | β | Ambient traffic; cannot be engaged (ROE) |
| Passenger / Military Jet | β | ATC-clearable; may appear as UNKNOWN contacts |
Some contacts spawn as UNKNOWN (yellow) β unidentified aircraft that may or may not be in the ATC system. Before engaging, operators can:
- Select the UNKNOWN track β click CALL ATC in the Engagement Panel or radial WOD
- Wait 6β8 seconds for ATC response (floating comms window, bottom-right of map)
- ATC responds: "confirmed authorized aircraft" or "not in our system"
- If authorized β tag as FRIENDLY and stand down
- If not in system β proceed with identification and engagement
Engaging an UNKNOWN track before ATC clearance triggers a Blue-on-Blue penalty.
UAS and drone contacts are never ATC-authorized β only manned aircraft can receive clearance.
| Category | Weight | Criteria |
|---|---|---|
| Detection Awareness | 20% | Time from contact spawn to first operator click |
| Confirmation Quality | β | Rewards deliberate 3β15s confirmation; flags impulsive <2s |
| Tracking | 15% | Time and accuracy of contact tracking |
| Identification | 20% | Correct classification and affiliation |
| Defeat Method | 25% | Optimal vs. acceptable vs. poor countermeasure selection |
| ROE Compliance | 20% | Did you follow the rules of engagement? |
| Completion Multiplier | β | Penalty for ending mission early (<90% duration) |
Grades: S β A β B β C β F (base compromised)
- π Custom base location β Before any scenario, drop a pin anywhere on Earth. Real satellite imagery loads for that location. Place your sensors, set your perimeter, and train on the terrain you actually defend. Your base. Your airspace.
- EW realism pass β RF jamming now respects command-link presence, Shenobi is limited to supported commercial/micro control links, and Shahed-class threats are documented and scored as kinetic-only.
- Directed energy split β
DE-LASER-3kmfor precision single-target kills andDE-HPM-3kmfor area effects against swarms. Each system has distinct visuals, recharge timing, and ROE tradeoffs. - Weapon pre-slew / aim time β Directed energy systems can orient onto a target before it enters range, then fire after a short slew/aim delay once commanded in-range.
- π 20 curated base presets β Search by name or ICAO code for real installations. Curated boundaries load automatically β Osan, Aviano, Shaw, Ramstein, RAF Mildenhall, RAF Lakenheath, Al Udeid, Creech, Fort Liberty, Nellis, Kadena, Barksdale, Lackland, Scott, Tyndall, Kunsan, Prince Sultan, Spangdahlem, McEntire, and more coming.
- Real-world satellite maps via Leaflet.js β OpenStreetMap + CartoDB imagery, global coverage
- Pre-mission ROE briefing β review Rules of Engagement before each scenario
- ATC coordination mechanic β UNKNOWN contacts require IFF clearance before engagement
- Neutral track labels β contacts spawn as TRN-### until you identify them
- Track type display β classification and affiliation shown post-identification
- Camera orientation β aircraft rotate in the camera view based on viewing angle
- Spawn randomization β threat positions, headings, and speeds vary each run
- Radial action wheel β WOD-style engagement controls (right-click any track)
- Event log β full engagement history, color-coded by severity
- Post-scenario debrief β performance metrics, ROE violation summary, letter grade
- Training library β 5-module slide-style study curriculum, accessible from main menu
- THERMOPYLAE free-play scenario β Escalating chaos mode with endless toggle and manual end
- Free Play sandbox β casual mixed-threat mode with one of each system and no timer; end when done
- Interactive tutorial β two-phase guided experience: UI tour overlay with spotlights, then hands-on DTID practice with gated progression, step tracker, and feedback
- Base Defense Architect v2 β 4-step unified flow (Base β Equip β Place β Export) with terrain-aware viewshed, per-system coverage toggle, draggable boundary, altitude controls down to 2m AGL, Dark/Satellite/Topo map layers, and geo search. Design your defense, see coverage gaps, then launch directly into a mission.
OpenSentry runs entirely in the browser β no server required.
src/game/ β TypeScript game engine (10Hz, runs in browser)
state.ts β All types + GameState factory
loop.ts β Game tick, wave spawning, debrief builder
drone.ts β 4 movement behaviors
detection.ts β Multi-sensor detection (FOV, LOS, noise)
jamming.ts β RF + PNT jamming logic
shenobi.ts β Shenobi protocol manipulation state machine
jackal.ts β JACKAL interceptor lifecycle
waves.ts β Wave + ambient traffic spawning
scoring.ts β Full DTID scoring engine
actions.ts β 16 player action handlers
frontend/src/
App.tsx β State machine, phase transitions, doctrine loadouts
hooks/
useGameEngine.ts β 10Hz game loop (browser-native, no WebSocket needed)
components/ β All UI components
frontend/public/data/
scenarios/ β JSON scenario definitions
bases/ β JSON base templates
equipment/ β Equipment catalog
backend/ β Python/FastAPI reference implementation (kept, not required)
Deploy: git push origin main β GitHub Actions builds and deploys to GitHub Pages automatically.
cd frontend && npm run dev
# β http://localhost:5173No Python backend required. The game engine runs entirely client-side via useGameEngine.ts.
- #10 β ATC coordination mechanic for UNKNOWN tracks
- #23 β Track type and affiliation display post-identification
- #24 β Remove ghost tracks from map after defeat
- #25 β Tutorial single-contact mode (waves disabled)
- #29 β Camera orientation by viewing angle + civilian aircraft color
- #33 β Post-scenario debrief scorecard β
- #31 β C-UAS training library β
- #35 β THERMOPYLAE free-play scenario β
- #43 β EO/IR silhouette visual overhaul (all threat types) β
- #47 β Jamming realism: ATTI mode β
- #48 β Hardened FPV FHSS mechanic β
- #51/52 β MIL-STD-2525 affiliation mechanic (HOSTILE/NEUTRAL/FRIEND/UNKNOWN declaration required before defeat) β
- Polygon breach detection β precise perimeter breach via
pointInPolygonβ - Shahed-class RF jam immunity β INS-guided threats require kinetic defeat β
- UI compression β TrackDetailPanel 2-column grid, EngagementPanel full-height β
- Bug fixes: stale closures, negative detection probability, type safety gaps, parallel data loading
- Test suite: 28 vitest unit tests covering game engine core (detection, movement, jamming, scoring)
- Slop cleanup: CSS hover classes, standardized trail management, proper type guards
- Type tightening: union types for CM state, jam behavior, intercept phase
- Documentation: naming consistency, version alignment, architecture updates
- #54/55 β Base Defense Architect: altitude-aware sensor placement, viewshed, terrain LOS
- #56/57 β Free Play scenario: casual mixed-threat sandbox mode
- #58/59 β Interactive tutorial overhaul: UI tour + guided DTID practice, step tracker, feedback
- PR #3 β BDA v2 stepper refactor: 2830-line monolith β 120-line shell + 13 focused components
- Unified 4-step flow: Base Selection β Equipment Selection β Placement & Viewshed β Export
- Per-system coverage toggle, enriched equipment cards, draggable boundary, map tile layers
- LOS corrections: Shenobi and RF Jammer now require line-of-sight
- Geo search on placement map, export preserves custom location coordinates
- Directed energy split β legacy DE weapon split into
DE-LASER-3kmandDE-HPM-3km - Distinct DE gameplay β laser requires LOS and favors single drones; HPM ignores LOS and favors swarms
- DE visuals β persistent FOV wedges plus distinct laser beam and HPM pulse effects
- Directed energy slew model β DE systems can pre-slew onto out-of-range targets, then engage after an aim delay
- EO/IR proximity slewing β camera selection now picks the nearest active EO/IR sensor for the chosen track
- Tactical map camera-cone fix β slew cone now follows the selected EO/IR camera instead of always drawing from the first camera in the loadout
- Duplicate camera labeling β EO/IR instances are labeled
#1,#2, etc. in the camera panel and on the tactical map for easier operator verification
- PR #7 β SystemsPanel sidebar consolidation: SensorPanel + EffectorPanel β single collapsible panel with SENSORS/EFFECTORS/COMBINED groups
- Shenobi combined display β one row with capability subtext (no duplicate entries)
- DE LOS scoped to BDA/custom placement only β standard scenarios skip LOS checks
- 49/49 unit tests passing β DE dwell/resolution, camera proximity slewing, tactical-map cone routing
- PR #9 β EW realism pass: Shahed / OW-UAS is now kinetic-only in doctrine and effectiveness tables
- RF jammer gating β RF effects require
rf_emitting; non-emitting fixed-wing tracks surface as PNT DEGRADED instead of looking untouched - Shenobi scope tightened β protocol manipulation now applies only to commercial quad and micro control-link targets
- 62 frontend tests + 147 backend tests covering realism rules, doctrine copies, and PNT-only status visibility
- PR #13 β Fix BDA boundary handoff to mission
- PR #14 β Add curated Osan AB preset
- PR #15 β Add curated Aviano AB preset
- PR #16 β Pack 2 (Spangdahlem, McEntire, Shaw) + custom mission preset handoff fix
- PR #17 β Fix custom mission preset alias schema mismatch
- PR #18 β Fix preset boundary overwritten by default boundary
- PR #19 β Fix custom mission preset boundary not loading
- PR #20 β Refactor: shared location search + tighter preset alias matching
- PR #21 β Pack 3 (Prince Sultan AB, Ramstein AB, RAF Mildenhall)
- PR #22 β Pack 4 (11 bases: Barksdale, Lackland, Scott, Tyndall, Kunsan, Nellis, Kadena, Al Udeid, Creech, Fort Liberty, RAF Lakenheath)
- 4-sided default perimeter with midpoint add / right-click remove
- Custom mission handoff uses live edited boundary (not stale template)
-
placement_bounds_kmderived from edited polygon - 20 curated base presets in preset library (8 high quality, 12 need re-verification)
scripts/generate-preset.pyβ deterministic OSM-based preset generator- Script-regenerated polygons for Barksdale, Nellis, Kadena, Tyndall (unverified)
- Langley AFB preset (polygon still mangled from OSM relation stitching issues)
- Updated
docs/adding-base-presets.md
- Fix JACKAL trajectory + action wheel size (Issue #1)
- Improve preset polygon quality (OSM relation stitching, oversized boundary handling)
- Add remaining bases (Langley, Andersen, Incirlik, etc.)
- After-action replay (timeline scrub)
- Multi-operator / shared mission
- React.lazy() code splitting for bundle size reduction
- Accessibility pass (ARIA labels, keyboard navigation)
Found a bug or have a training realism suggestion? Use the feedback button on the live site. Submissions go directly to the development queue.
MIT β free to use, modify, and distribute for training purposes.
OpenSentry was previously named SKYSHIELD. The project has been migrated to a new repository under its current name.
