Skip to content

jdelvo06-debug/opensentry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

94 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

OpenSentry

OpenSentry C-UAS Training Simulator

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."

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


What Is This?

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.


Scenarios

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

Equipment

All systems are fictional but specification-accurate β€” no real program of record designators.

Sensors

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

Effectors

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

Threats

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

ATC Coordination Mechanic

Some contacts spawn as UNKNOWN (yellow) β€” unidentified aircraft that may or may not be in the ATC system. Before engaging, operators can:

  1. Select the UNKNOWN track β†’ click CALL ATC in the Engagement Panel or radial WOD
  2. Wait 6–8 seconds for ATC response (floating comms window, bottom-right of map)
  3. ATC responds: "confirmed authorized aircraft" or "not in our system"
  4. If authorized β†’ tag as FRIENDLY and stand down
  5. 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.


Scoring

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)


Features

  • πŸ“ 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-3km for precision single-target kills and DE-HPM-3km for 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.

Architecture

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.


Local Development

cd frontend && npm run dev
# β†’ http://localhost:5173

No Python backend required. The game engine runs entirely client-side via useGameEngine.ts.


Roadmap

Completed (v1.5.0)

  • #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 βœ“

Completed (v1.6.0)

  • #43 β€” EO/IR silhouette visual overhaul (all threat types) βœ“
  • #47 β€” Jamming realism: ATTI mode βœ“
  • #48 β€” Hardened FPV FHSS mechanic βœ“

Completed (v1.7.0)

  • #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 βœ“

Code Review (v1.7.1)

  • 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

Completed (v1.8.0)

  • #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

Completed (v1.9.0)

  • 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

Completed (v1.10.0)

  • Directed energy split β€” legacy DE weapon split into DE-LASER-3km and DE-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

Completed (v1.10.1)

  • 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

Current main (post-v1.11.0)

  • 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_km derived from edited polygon
  • 20 curated base presets in preset library (8 high quality, 12 need re-verification)

WIP (on wip/preset-generation-script branch)

  • 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

Backlog

  • 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)

Feedback

Found a bug or have a training realism suggestion? Use the feedback button on the live site. Submissions go directly to the development queue.


License

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.

About

Open source, vendor agnostic C-UAS C2 simulator

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors