Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
814a59f
feat(satellite): :sparkles: add SGP4-propagated OrbitalSatellite with…
thkruz Jul 2, 2026
adb484a
feat(antenna): :sparkles: add Ku-band LEO tracker config and opt-in a…
thkruz Jul 2, 2026
847b7cb
feat(mission-planning): :sparkles: add pass planner service and Pass …
thkruz Jul 2, 2026
072911c
feat(nats-eu): :sparkles: add NATS Europe campaign with Galway Ku sta…
thkruz Jul 2, 2026
5db8878
feat(theme): :sparkles: per-campaign body class with NATS Europe blue…
thkruz Jul 2, 2026
1de917c
docs: :memo: add campaign 2 orbital foundations plan and retrospective
thkruz Jul 2, 2026
f8c1c15
feat(antenna): :sparkles: add fixed-gain antenna model, VHF/UHF bands…
thkruz Jul 2, 2026
49eb055
feat(rf-front-end): :sparkles: add direct-sampling LNB mode and circu…
thkruz Jul 2, 2026
9865a7c
feat(receiver): :sparkles: add AFC and modem tuning/config handlers
thkruz Jul 2, 2026
5fba6cc
fix(spectrum-analyzer): :bug: render wideband signals at true occupie…
thkruz Jul 2, 2026
d9cc8f2
feat(mission-control): :sparkles: add SkyWatcher SDR Console and back…
thkruz Jul 2, 2026
52c6fa2
feat(ham-sdr): :sparkles: add Backyard Operator campaign with sandbox…
thkruz Jul 2, 2026
15c21d8
feat(theme): :sparkles: add campaign-ham-sdr freeware theme
thkruz Jul 2, 2026
edfccc8
docs: :memo: add campaign 3 plan, retrospective, and post-mortem
thkruz Jul 2, 2026
bb51948
feat(interference): :sparkles: add terrestrial emitter ground truth t…
thkruz Jul 3, 2026
486a925
feat(geoloc): :sparkles: add two-satellite TDOA/FDOA geolocation service
thkruz Jul 3, 2026
4a9c633
feat(geoloc): :sparkles: add geolocation console, interactive Earth m…
thkruz Jul 3, 2026
0a44b0d
feat(objectives): :sparkles: add geolocation measurement and fix-accu…
thkruz Jul 3, 2026
f7f6be4
feat(signal-hunter): :sparkles: add Campaign 5 station, SGP4 satellit…
thkruz Jul 3, 2026
8916451
feat(theme): :sparkles: add coyote-brown / black-ops Signal Hunter ca…
thkruz Jul 3, 2026
7409c1f
test(signal-hunter): :white_check_mark: add campaign registry test an…
thkruz Jul 3, 2026
2857628
docs(signal-hunter): :memo: add Campaign 5 plan and retrospective
thkruz Jul 3, 2026
e5ed1fd
feat(ccs): :sparkles: add Campaign 4 counter-comms electronic-attack …
thkruz Jul 4, 2026
3dfa3ab
feat(nats-eu): :sparkles: add Campaign 2 European Ops engine mechanic…
thkruz Jul 4, 2026
79effb6
feat(nats-eu): :sparkles: wire Campaign 2 operator console tabs (M1-M7)
thkruz Jul 4, 2026
8c798c1
docs(nats-eu): :memo: add Campaign 2/4 design plans and build retrosp…
thkruz Jul 4, 2026
68a8e92
chore(nice): :wrench: add NICE catalog snapshot and coverage gate
thkruz Jul 25, 2026
2c3aeb9
chore(scripts): :wrench: add LEO pass batch-authoring tool
thkruz Jul 25, 2026
248a899
fix(antenna): :bug: raise Ku LEO tracker azimuth rate to 20 deg/s
thkruz Jul 25, 2026
52e7ebe
feat(ops-log): :sparkles: add window.advanceSimClock dev/E2E hook
thkruz Jul 25, 2026
23e69e2
refactor(nats-eu): :recycle: extract campaign data to its own module
thkruz Jul 25, 2026
329bd01
feat(nats-eu): :sparkles: retrofit scenario 1 to campaign conventions
thkruz Jul 25, 2026
03f80de
test(nats-eu): :white_check_mark: add RF validation gate and S1 E2E spec
thkruz Jul 25, 2026
b3611b0
docs(nats-eu): :memo: add Build Phase A plan and retrospective
thkruz Jul 25, 2026
f62402f
feat(services): :sparkles: add ground-track and lighting math
thkruz Jul 25, 2026
d8dd4d5
feat(geo-map): :sparkles: add track, terminator and footprint layers
thkruz Jul 25, 2026
11646f5
feat(mission-control): :sparkles: add Ground Track 2D world map tab
thkruz Jul 25, 2026
18cac4e
feat(scenario): :sparkles: add settings.contactTimeline opt-in block
thkruz Jul 25, 2026
295e18f
fix(pass-planner): :bug: share one elevation mask across pass predictors
thkruz Jul 25, 2026
6841ce4
feat(mission-control): :sparkles: drive the contact timeline deck fro…
thkruz Jul 25, 2026
572fd2a
feat(nats-eu): :sparkles: enable the contact timeline for Campaign 2
thkruz Jul 25, 2026
3032406
docs: :memo: add Phase 5 plan and retrospective
thkruz Jul 25, 2026
a8f7e35
chore(fonts): :recycle: self-host Roboto instead of calling Google Fonts
thkruz Aug 4, 2026
ce4f489
feat(time-skip): :sparkles: let the operator fast-forward to the next…
thkruz Aug 4, 2026
59d1a66
feat(mission-control): :sparkles: give the shell swappable chrome per…
thkruz Aug 4, 2026
fe27656
feat(nats-eu): :sparkles: ship Campaign 2 scenarios 2-8 and the LEO c…
thkruz Aug 4, 2026
a970b7a
feat(ham-sdr): :sparkles: build the Campaign 3 arc and the engine sea…
thkruz Aug 4, 2026
e5388ea
feat(ccs): :sparkles: put COBALT-4 on real ephemeris for the EA sandbox
thkruz Aug 4, 2026
ef72dab
feat(user-account): :sparkles: turn scenario completion into the sign…
thkruz Aug 4, 2026
f86b985
feat(campaigns): :sparkles: label beta/alpha campaigns and gate Campa…
thkruz Aug 4, 2026
eb24465
docs: :memo: add Phase 6-12 plans and retrospectives
thkruz Aug 4, 2026
c7fb337
feat(analytics): :sparkles: implement GA4 analytics integration with …
thkruz Sep 10, 2026
1cbe0b1
fix(analytics): update placeholder ID to ensure it never matches a re…
thkruz Sep 10, 2026
244476d
fix(objectives): :bug: stop optional objectives from gating Mission C…
thkruz Sep 10, 2026
d4bf93c
docs(plans): :memo: add Campaign 2 qualified-tier plan for S9-S16
thkruz Sep 10, 2026
10772ee
docs(plans): :memo: record Ted's decisions on the S9-S16 plan's open …
thkruz Sep 10, 2026
4bf7b47
feat(nats-eu): :sparkles: author Campaign 2 qualified tier S9-S12
thkruz Sep 10, 2026
c7d4654
chore(private): :wrench: add signal-range-private submodule at src/pr…
thkruz Sep 10, 2026
5345d83
chore(private): :truck: move plans, retros and world-bible docs into …
thkruz Sep 10, 2026
d91eb5a
chore(private): :construction_worker: make CI and docs tolerate the p…
thkruz Sep 10, 2026
39f0b8f
chore(private): :wrench: update subproject commit reference
thkruz Sep 10, 2026
c98642c
chore(private): :wrench: update subproject commit reference
thkruz Sep 10, 2026
3f808eb
feat(private): :sparkles: add engine seams for the private edition (p…
thkruz Sep 10, 2026
e532b9a
chore(private): :wrench: update subproject commit reference
thkruz Sep 10, 2026
18c90cc
chore(private): :wrench: update subproject commit reference
thkruz Sep 10, 2026
ba6eb1d
chore(private): :wrench: update subproject commit reference
thkruz Sep 10, 2026
8af735a
chore(private): :wrench: update subproject commit reference
thkruz Sep 10, 2026
938f8fd
feat(ccs): :sparkles: add Campaign 4 scenario 2 "Failover"
thkruz Sep 12, 2026
f89ae6d
feat(signal-hunter): :sparkles: add Campaign 5 scenario 1 "First Fix"
thkruz Sep 12, 2026
be4e1b6
docs(toolchain): :memo: plan the migration to the keeptrack-space too…
thkruz Sep 12, 2026
772deb8
chore(private): :wrench: update subproject commit reference
thkruz Sep 12, 2026
8615799
chore(pnpm): :wrench: migrate package manager from npm to pnpm
thkruz Sep 12, 2026
6f71d91
chore(biome): :wrench: replace ESLint with Biome
thkruz Sep 12, 2026
45bc98e
style(biome): :art: format and auto-fix with Biome
thkruz Sep 12, 2026
b36db21
fix(biome): :bug: clear the remaining Biome lint errors
thkruz Sep 12, 2026
951b927
chore(biome): :wrench: drop dead eslint suppressions and name Biome i…
thkruz Sep 12, 2026
b245595
chore(typescript): :wrench: typecheck with tsgo (TypeScript 7 native)
thkruz Sep 12, 2026
a01cced
perf(build): :zap: bundle with rspack + SWC instead of webpack + ts-l…
thkruz Sep 12, 2026
27d364d
chore(husky): :wrench: add pre-commit, commit-msg and pre-push hooks
thkruz Sep 12, 2026
ec4ada6
chore(vitest): :wrench: align vitest config with keeptrack-space
thkruz Sep 12, 2026
f15dc43
ci: :wrench: bump checkout and setup-node to v6
thkruz Sep 12, 2026
ce81d2a
docs(toolchain): :memo: document the new toolchain and delete jest-er…
thkruz Sep 12, 2026
5897adc
docs(toolchain): :memo: record the migration outcome in the plan
thkruz Sep 12, 2026
47f9433
chore(private): :wrench: update subproject commit reference
thkruz Sep 14, 2026
db27010
feat(engine): :sparkles: per-station propagation, timed faults, Ku ra…
thkruz Sep 14, 2026
d2c5f3b
feat(nats-eu): :sparkles: rewrite S1-S12 and author S13-S16 to the ph…
thkruz Sep 14, 2026
e981344
test(nats-eu): :white_check_mark: full-completion Playwright specs fo…
thkruz Sep 14, 2026
e3f8af6
feat(objectives): :sparkles: cnHoldSeconds hold on receiver-snr-thres…
thkruz Sep 14, 2026
f9229ae
feat(antenna): :sparkles: AntennaRegistry resolves configs so plugin …
thkruz Sep 18, 2026
6cafb9e
feat(settings): :sparkles: SettingsManager and t7e locale bundles
thkruz Sep 18, 2026
4d0a5ec
feat(plugins): :electric_plug: plugin contract, manifest and PluginMa…
thkruz Sep 18, 2026
63c9f73
feat(sandbox): :sparkles: station loadout service and LOADOUT modal (…
thkruz Sep 18, 2026
f11a4ee
build(plugin): :hammer: plugin CLI (add/remove/update/list/restore/sy…
thkruz Sep 18, 2026
4106e1a
docs(plugins): :memo: plugin development guide plus README and CODE_P…
thkruz Sep 18, 2026
471202a
fix(nats-eu): :bug: sweep quizzes grade the pre-AOS RX AGC rail, not …
thkruz Sep 18, 2026
1b0b850
chore(private): :wrench: update subproject commit reference
thkruz Sep 18, 2026
2e16697
fix(tests): :bug: mock localStorage and sessionStorage for Node 25 co…
thkruz Sep 18, 2026
6d60445
feat(observation): add observation dwell seconds for conditions and i…
thkruz Sep 18, 2026
c7dd14b
chore(private): update subproject commit reference
thkruz Sep 18, 2026
e98a54c
fix(engine): :bug: continuous LEO geometry and time-skip pedestal cat…
thkruz Sep 18, 2026
a72e8de
fix(pass-schedule): :bug: wrap rise azimuth to 000-359
thkruz Sep 18, 2026
daafd50
test(signal-hunter): :white_check_mark: expect the slate accent from …
thkruz Sep 18, 2026
54e5438
feat(quizzes): :sparkles: level option shape across all campaigns
thkruz Sep 18, 2026
4466820
feat(objectives): :sparkles: add decision condition graded on live ev…
thkruz Sep 18, 2026
ec1d656
chore(private): :wrench: update subproject commit reference
thkruz Sep 18, 2026
f0385be
feat(nats-eu): :sparkles: S12 call-the-return, the first shipped deci…
thkruz Sep 18, 2026
664aea5
feat(nats-eu): :sparkles: S17 Unusual Activity, Gray Zone arc opener
thkruz Sep 18, 2026
0ad4ddd
feat(nats-eu): :sparkles: S18 Dirty Spectrum, persistent interference
thkruz Sep 18, 2026
ed83b55
feat(nats-eu): S19 "Frequency Agility" - TRANSEC ride-through of an u…
thkruz Sep 18, 2026
f93c6ca
chore: bump private pointer (settings schema uplinkFrequencyHz)
thkruz Sep 18, 2026
5f9d605
feat(nats-eu): S20 "False Time" - GNSS spoof on the station reference
thkruz Sep 18, 2026
4d9f4a4
chore: bump private pointer (S20 schema entries, Gray Zone asset brief)
thkruz Sep 18, 2026
8c91825
feat(scenarios): campaign document store and record panel
thkruz Sep 18, 2026
7738dd9
feat(nats-eu): S21-S24 - the Gray Zone arc closes; campaign complete
thkruz Sep 18, 2026
b45d52d
chore: bump private pointer (Phase D schema entries)
thkruz Sep 18, 2026
0d3253b
feat(telemetry): spacecraft state-of-health panel and ranging tone
thkruz Sep 18, 2026
07aa68b
feat(ccs): S3-S5 - the spacecraft half on TALON-2
thkruz Sep 18, 2026
a7bf717
chore: bump private pointer (Phase E telemetry/ranging schema)
thkruz Sep 18, 2026
ce00e85
feat(signal-hunter): S2-S4 - Two Carriers, Cold Trail, Prove It
thkruz Sep 18, 2026
466f965
chore: bump private pointer (Phase F schema + curriculum)
thkruz Sep 18, 2026
eebc795
feat(nats-eu): S25-S28 security drills
thkruz Sep 19, 2026
3380e58
chore: update subproject commit reference
thkruz Sep 19, 2026
5c86c21
fix(analytics): make GA4 opt-in with a shared consent cookie
thkruz Sep 24, 2026
49262a5
feat(simulation): one scenario clock and seeded randomness (phase 19.0)
thkruz Sep 25, 2026
449e582
fix(nats): anchor S17 sun transit to the onset objective
thkruz Sep 25, 2026
2db9610
chore: bump private pointer (weather anchor schema entry)
thkruz Sep 25, 2026
daeae5a
feat(vitest): add private-stub plugin for handling private imports in…
thkruz Sep 26, 2026
5dd216f
chore: bump private pointer (phase 19-25 plans)
thkruz Sep 26, 2026
277e5f9
fix(security): address CodeQL alerts on the release PR
thkruz Sep 26, 2026
1aa5fc9
chore: bump private pointer (phase 19.0a plan)
thkruz Sep 26, 2026
723104f
chore: bump private pointer (19.0a note fix)
thkruz Sep 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 9 additions & 2 deletions .deepsource.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
version = 1

test_patterns = ["*.test.js"]
test_patterns = ["test/**/*.test.ts", "test/**/*.spec.ts"]

exclude_patterns = [
"src/engine/**",
"src/private/**",
"dist/**",
"coverage/**"
]

[[analyzers]]
name = "javascript"
enabled = true

[analyzers.meta]
plugins = ["react"]
environment = ["browser", "nodejs"]
20 changes: 0 additions & 20 deletions .eslintrc

This file was deleted.

184 changes: 184 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
# Force the following filetypes to have unix eols, so Windows does not break them
*.* text eol=lf
## GITATTRIBUTES FOR WEB PROJECTS
#
# These settings are for any web project.
# Details per file setting:
# text These files should be normalized (i.e. convert CRLF to LF).
# binary These files are binary and should be left untouched.
# Note that binary is a macro for -text -diff.
######################################################################
# Auto detect
## Handle line endings automatically for files detected as
## text and leave all files detected as binary untouched.
## This will handle all files NOT defined below.
* text=auto
# Source code
*.bash text eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
*.coffee text
*.css text
*.htm text diff=html
*.html text diff=html
*.inc text
*.ini text
*.js text
*.json text
*.jsx text
*.less text
*.ls text
*.map text -diff
*.od text
*.onlydata text
*.php text diff=php
*.pl text
*.ps1 text eol=crlf
*.py text diff=python
*.rb text diff=ruby
*.sass text
*.scm text
*.scss text diff=css
*.sh text eol=lf
*.sql text
*.styl text
*.tag text
*.ts text
*.tsx text
*.xml text
*.xhtml text diff=html
# Docker
Dockerfile text
# Documentation
*.ipynb text
*.markdown text
*.md text
*.mdwn text
*.mdown text
*.mkd text
*.mkdn text
*.mdtxt text
*.mdtext text
*.txt text
AUTHORS text
CHANGELOG text
CHANGES text
CONTRIBUTING text
COPYING text
copyright text
*COPYRIGHT* text
INSTALL text
license text
LICENSE text
NEWS text
readme text
*README* text
TODO text
# Templates
*.dot text
*.ejs text
*.haml text
*.handlebars text
*.hbs text
*.hbt text
*.jade text
*.latte text
*.mustache text
*.njk text
*.phtml text
*.tmpl text
*.tpl text
*.twig text
*.vue text
# Configs
*.cnf text
*.conf text
*.config text
.editorconfig text
.env text
.gitattributes text
.gitconfig text
.htaccess text
*.lock text -diff
pnpm-lock.yaml text -diff
*.toml text
*.yaml text
*.yml text
browserslist text
Makefile text
makefile text
# Heroku
Procfile text
# Graphics
*.ai binary
*.bmp binary
*.eps binary
*.gif binary
*.gifv binary
*.ico binary
*.jng binary
*.jp2 binary
*.jpg binary
*.jpeg binary
*.jpx binary
*.jxr binary
*.pdf binary
*.png binary
*.psb binary
*.psd binary
# SVG treated as an asset (binary) by default.
*.svg text
# If you want to treat it as binary,
# use the following line instead.
# *.svg binary
*.svgz binary
*.tif binary
*.tiff binary
*.wbmp binary
*.webp binary
# Audio
*.kar binary
*.m4a binary
*.mid binary
*.midi binary
*.mp3 binary
*.ogg binary
*.ra binary
# Video
*.3gpp binary
*.3gp binary
*.as binary
*.asf binary
*.asx binary
*.fla binary
*.flv binary
*.m4v binary
*.mng binary
*.mov binary
*.mp4 binary
*.mpeg binary
*.mpg binary
*.ogv binary
*.swc binary
*.swf binary
*.webm binary
# Archives
*.7z binary
*.gz binary
*.jar binary
*.rar binary
*.tar binary
*.zip binary
# Fonts
*.ttf binary
*.eot binary
*.otf binary
*.woff binary
*.woff2 binary
# Executables
*.exe binary
*.pyc binary
# RC files (like .babelrc or .eslintrc)
*.*rc text
# Ignore files (like .npmignore or .gitignore)
*.*ignore text
19 changes: 14 additions & 5 deletions .github/actions/setup-node-project/action.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,30 @@
name: 'Setup Node Project'
description: 'Setup Node.js, cache dependencies, and install (call after checkout)'
description: 'Setup pnpm, Node.js, cache dependencies, and install (call after checkout)'

inputs:
node-version:
description: 'Node.js version to use'
required: false
default: '22'
default: '24'

runs:
using: 'composite'
steps:
# pnpm must be on PATH before setup-node, otherwise `cache: pnpm` cannot
# resolve the store directory. Version comes from `packageManager` in
# package.json, so it stays in lockstep with local development.
- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: ${{ inputs.node-version }}
cache: 'npm'
cache: 'pnpm'

# --ignore-scripts is belt-and-braces: pnpm already gates postinstall
# scripts behind the onlyBuiltDependencies allowlist in package.json.
# Nothing in CI needs the wrangler/sharp native binaries.
- name: Install Dependencies
shell: bash
run: npm ci --ignore-scripts
run: pnpm install --frozen-lockfile --ignore-scripts
Loading
Loading