Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
cf67a5e
fix: remove evicted resolved path hops and preserve relay snapshots (…
n30nex Sep 6, 2026
eb1d733
fix(analytics): preserve selected hash size in links (#1967)
n30nex Sep 6, 2026
108ea02
fix(nodes): remove misleading aggregate SNR headlines (#1969)
n30nex Sep 6, 2026
a938176
fix(nodes): clearly mark the selected node in path chains (#1968)
n30nex Sep 6, 2026
43d83ee
fix(nodes): dispose map timers with their owning view (#1970)
n30nex Sep 6, 2026
9d6f08c
feat(#1865): ingest observer /neighbors as confirmed scope evidence (…
efiten Sep 6, 2026
1ffaad8
feat(#1794): per-IP limits and a deny list on the /ws upgrade (#1974)
efiten Sep 6, 2026
2288e28
fix: publish release artifacts after successful image retagging (#1964)
n30nex Sep 6, 2026
5b689f7
feat(#1845): filter nodes by how long they have been silent (#1973)
efiten Sep 6, 2026
2c8c116
feat(#1975): network-wide Scope Audit page, fed by confirmed scopes (…
efiten Sep 6, 2026
3fbff01
build: upgrade Go toolchain to 1.27 (#1946)
sylr Sep 9, 2026
de237fc
fix(qa): bind TEST_PUBKEY as a SQLite parameter instead of interpolat…
anupamme Sep 9, 2026
079e73a
fix(scope-audit): attribute forwarding to every hop, and pay for the …
efiten Sep 9, 2026
0605b17
feat(scope-audit): count and surface the traffic this instance cannot…
efiten Sep 9, 2026
fd825a7
fix(ingestor): name a region scope deterministically, or not at all (…
efiten Sep 9, 2026
0e607c1
feat(ingestor): derive region keys from what nodes declare, opt-in (#…
efiten Sep 9, 2026
8c164c5
feat(scope-audit): verify a declared region against the repeater's ow…
efiten Sep 9, 2026
b5c7612
fix(live): use the shared WebSocket instead of opening a second one (…
efiten Sep 9, 2026
675c576
fix(scope-audit): bound the verifier's payload, and fix two tests tha…
efiten Sep 10, 2026
6c92a8b
test(ingestor): make the suite race-clean, and run the detector when …
efiten Sep 10, 2026
0c7f230
feat(ingestor): keep the scope-match tally across restarts (#2002)
efiten Sep 10, 2026
02feb2a
test(ingestor): join the watchdog loop goroutine instead of only aski…
efiten Sep 11, 2026
fe37f10
fix(ingestor): delete aged packets in bounded batches so prune stops …
liquidraver Sep 11, 2026
296456f
feat(map): colour and filter repeaters by scope-configuration state (…
efiten Sep 11, 2026
51a2a7d
fix(scope-audit): ship the stylesheet the page paints its badges with…
efiten Sep 11, 2026
c283f42
channels: 23 more names in the rainbow guess list (#2007)
nullrouten0 Sep 12, 2026
6d7490e
fix(tables): stop the trailing action column cropping its own button …
nullrouten0 Sep 12, 2026
a2f039d
fix(packets): show browser-added channels in the channel filter (#2009)
nullrouten0 Sep 12, 2026
cd9b4c0
test: unify frontend test runs and prevent inventory drift (#1965)
n30nex Sep 13, 2026
5efe61e
fix(ingestor): set an explicit MQTT ClientID per source (#2013) (#2016)
efiten Sep 13, 2026
3ca176a
fix(packets): decode CONTROL discover fields for humans (#1868) (#2017)
efiten Sep 13, 2026
0fea3f2
feat(analytics): break scope adverts down by node role (#1979) (#2019)
efiten Sep 13, 2026
7f8f71e
fix(live): reconnect when the websocket goes silent (#1074) (#2020)
efiten Sep 13, 2026
2d4019f
fix(analytics): recompute once the store has fully loaded (#2025)
efiten Sep 13, 2026
a059299
feat(node-analytics): hop-count statistics per node (#1812) (#2021)
efiten Sep 13, 2026
2c6d7bb
feat(packets): add filter to All Observer dropdown (#1884)
Jonher937 Sep 13, 2026
914bd4c
feat(channels): show each message's region (#1851) (#2018)
efiten Sep 13, 2026
efdb3ea
feat(analytics): retransmission pressure over time (#1699) (#2023)
efiten Sep 13, 2026
dda04ae
fix(packets): empty the observer and type selections on Clear Filters…
efiten Sep 13, 2026
52b9474
feat(map): filter repeaters by region name (#1862) (#2022)
efiten Sep 13, 2026
5d3af16
fix(live): keep the space the user is typing in the node filter (#2028)
efiten Sep 13, 2026
cb994d9
feat(home): link My Mesh node cards to the node page (#2027)
sylr Sep 14, 2026
a2ea18f
perf(sqlite): swap modernc.org/sqlite for mattn/go-sqlite3, cross-bui…
sylr Sep 16, 2026
b8c8d98
fix(release): keep every platform when re-tagging :edge as a release …
efiten Sep 16, 2026
5430bc7
test(ingestor): anchor the RF-sample fixtures to now, not to a calend…
efiten Sep 17, 2026
8937733
chore(tests): move root test-*.js into tests/unit and tests/e2e (#2036)
A13xB0 Sep 17, 2026
e6323ec
fix(store): account path, decode-cache and dedup-key bytes so maxMemo…
A13xB0 Sep 17, 2026
aabeda0
test(server): set the #1239 lock-hold threshold from measurement, 150…
efiten Sep 17, 2026
bbf54cf
fix(rx-coverage): open at the configured map default, with its own sa…
liquidraver Sep 17, 2026
6c4fa04
test(rx-coverage): budget the viewport assertions in pixels, not a fl…
efiten Sep 18, 2026
20b0ee9
ci: run the eight tests/e2e suites that had no runner at all (#2045)
efiten Sep 18, 2026
e015657
feat(ingestor): store CoreDrive RX region answers, with position, clo…
efiten Sep 19, 2026
29c0a3b
ci: name each E2E suite in the log before it runs (#2046)
efiten Sep 19, 2026
7f4b357
fix(map): keep inspector controls clickable and ignore stale loads (#…
n30nex Sep 19, 2026
84eba41
fix(live): anchor the legend toggle to .live-page so the VCR bar stop…
liquidraver Sep 20, 2026
7c6b95e
fix(store): merge background chunks in order instead of prepending th…
efiten Sep 20, 2026
5c016a2
fix(analytics): show a building state on the distance index's 202, an…
efiten Sep 20, 2026
d1b615f
fix(node-health): list only observers that heard the node on air (#2057)
efiten Sep 22, 2026
b614bad
fix(packets): give each observation its own wire bytes in the detail …
efiten Sep 22, 2026
25f8426
test: make every suite in tests/e2e run, and tell the truth when it d…
efiten Sep 22, 2026
61f565c
fix(node-health): credit zero-hop adverts as direct reception (#2064)
efiten Sep 22, 2026
980c5c4
fix(nodes): stop the Heard By empty state claiming the node is out of…
efiten Sep 22, 2026
b695b97
fix(nodes): keep paginating past a page that post-LIMIT filtering sho…
liquidraver Sep 23, 2026
6d3da77
perf(channels): coalesce concurrent GetChannels/GetEncryptedChannels …
anieto Sep 23, 2026
50c4d96
test(ingestor): wait for the boot migrations before handing over a te…
efiten Sep 23, 2026
291393d
feat(ingestor): log a throttled warning when the IATA whitelist drops…
efiten Sep 23, 2026
435ac25
feat(nav): show the running version in the nav-drawer footer (#2068)
efiten Sep 23, 2026
d14317b
fix(qa): query blacklist retention by from_pubkey (#2069)
dborup Sep 24, 2026
2cfe9cb
fix(a11y): raise the Scope Audit observed-chip contrast above 4.5:1 (…
efiten Sep 24, 2026
3caa847
fix(nodes): the advert section is called "Recent Adverts", and says w…
efiten Sep 24, 2026
a5aa3cd
perf(db): refresh SQLite planner statistics with a bounded ANALYZE (#…
efiten Sep 24, 2026
6e121ff
perf(db): build planner statistics at startup when there are none (#2…
efiten Sep 26, 2026
6d5686d
docs: release notes for v3.12.0, and the 3.11.0 entry that was never …
efiten Sep 26, 2026
9eb3098
fix(release): publish the release notes as the release body (#2076)
efiten Sep 26, 2026
248d204
test(server): await indexes before node-path regression requests (#2084)
n30nex Sep 30, 2026
31744c6
test(channels): isolate WS assertions from initial loading (#2087)
n30nex Sep 30, 2026
dc4db17
fix(nodes): remove unsupported region fields from Heard By (#2077)
n30nex Sep 30, 2026
f1edbbe
fix(packets): preserve observation selection in detail URLs (#2093)
n30nex Sep 30, 2026
410c82c
fix(ui): use consistent 48px navigation and channel buttons (#2078)
n30nex Sep 30, 2026
ded27a8
fix(packets): stabilize fixture tests and preserve mobile empty state…
n30nex Sep 30, 2026
093e320
fix(map): keep Path Inspector candidates accessible and cover route r…
n30nex Sep 30, 2026
a4a447a
fix(packets): pack short columns, one expand arrow, Full Names toggle…
sylr Oct 3, 2026
b9fb3d2
feat(analytics): split adverts using recorded route evidence (#2088)
n30nex Oct 3, 2026
3b415fb
fix(live): enable node filtering after its handlers are ready (#2103)
n30nex Oct 3, 2026
8933e2c
fix(channels): keep client-only state across a channel-list refresh (…
efiten Oct 3, 2026
415362c
fix(packets): resolve path hops with the observer that heard them (#2…
efiten Oct 3, 2026
99a326a
test(packets): verify observation hex after rerenders (#2105)
n30nex Oct 3, 2026
9e49db9
feat(nodes): group adverts by observed route evidence (#2085)
n30nex Oct 3, 2026
ef12535
test(map): wait for the new route sidebar before measuring it (#2109)
efiten Oct 4, 2026
c2a9500
docs(release): notes and changelog for v3.13.0 (#2110)
efiten Oct 4, 2026
00ee4f9
fix(coverage): attribute node-discover replies to the responder (#2111)
efiten Oct 4, 2026
9c3d76e
docs(release): notes and changelog for v3.13.1 (#2112)
efiten Oct 4, 2026
000d9ab
feat(coverage): RF noise-floor layer on the Mobile RX coverage page (…
efiten Oct 4, 2026
b5b230e
feat(channels): show the sender's path hash size on each message (#2089)
sylr Oct 5, 2026
d5e6d1b
fix(nodes): resolve the /api/nodes region filter from the packet stor…
efiten Oct 5, 2026
4363403
fix(nodes): match the region node filter on observer ID, not ingest-t…
efiten Oct 5, 2026
d232072
feat: optional user accounts (part A: foundation) (#2129)
efiten Oct 7, 2026
f3ae8ac
feat: sync a logged-in user's settings across devices (part B) (#2130)
efiten Oct 7, 2026
7309bdb
fix(store): index a transmission once per relay key in byPathHop (#2117)
dborup Oct 8, 2026
523a5ed
fix(ui): escape the route string on the unknown-route page (#2124)
nullrouten0 Oct 8, 2026
8b64439
fix(server): keep config.json's file mode when saving the geo-filter …
nullrouten0 Oct 8, 2026
4ce6d9f
fix(ui): pin CDN script versions and add integrity hashes (#2121)
nullrouten0 Oct 8, 2026
548e4cd
fix(api): cap the nodes= list on /api/packets at 50 entries (#2120)
nullrouten0 Oct 8, 2026
a981420
fix(ingestor): cap observer-supplied string lengths (#2123)
nullrouten0 Oct 8, 2026
2e7a4eb
fix(ingestor): bound the unauthenticated /neighbors report (#2122)
nullrouten0 Oct 8, 2026
0a6870c
fix(api): cap request bodies on /api/decode and /api/packets/observat…
nullrouten0 Oct 8, 2026
caa6635
fix(api): cap concurrent cold reach scans at 2, answer 429 beyond tha…
nullrouten0 Oct 8, 2026
a4445b4
ci: run E2E, Go tests and the image build side by side (#2135)
efiten Oct 8, 2026
18a634c
feat: admin dashboard with overview and audit log (user management pa…
efiten Oct 8, 2026
abbe684
feat: propose and approve hashtag channels (user management part D) (…
efiten Oct 8, 2026
de364a8
feat: mail notifications for watched nodes (user management part E) (…
efiten Oct 8, 2026
2456762
feat: account data export and users.db backup (#2141)
efiten Oct 8, 2026
2909565
fix(nodes): explain packet and observation counts (#2132)
n30nex Oct 8, 2026
57395e2
fix(ui): escape observer iata, name and id, and node names, in eight …
nullrouten0 Oct 8, 2026
9dbc287
docs: release notes for v3.14.0 (#2143)
efiten Oct 8, 2026
7eba09c
feat!: move runtime storage to PostgreSQL with verified offline upgrades
n30nex Oct 9, 2026
6377102
fix: grant the ingestor access to its readiness view
n30nex Oct 9, 2026
cc89006
fix: support opted-in PR benchmarks and restore database URLs safely
n30nex Oct 9, 2026
7f655ae
fix: run blacklist QA against native PostgreSQL
n30nex Oct 9, 2026
6eda1e6
test: wait for initial theme refresh before scope assertions
n30nex Oct 9, 2026
b5941a8
fix: enable and verify benchmark I/O resource sampling
n30nex Oct 9, 2026
e07bf46
fix: validate benchmark startup and measured samples
n30nex Oct 9, 2026
8e7a11b
fix: preserve legacy date text during PostgreSQL imports
n30nex Oct 9, 2026
caac986
fix: retain sanitized importer errors in benchmark results
n30nex Oct 9, 2026
7b2c19a
test: qualify the full benchmark corpus under common memory limits
n30nex Oct 9, 2026
c315d7d
test: separate the lower-rate comparison from overload qualification
n30nex Oct 9, 2026
1c0281a
fix: make interrupted PostgreSQL upgrades safe to resume
n30nex Oct 9, 2026
0a24721
fix: retain selective PostgreSQL coverage query plans
n30nex Oct 9, 2026
ce023e0
test: read cgroup memory peaks through their reset descriptor
n30nex Oct 9, 2026
fde34bf
docs: publish verified PostgreSQL upgrade and paired performance results
n30nex Oct 9, 2026
7edb473
feat(storage): add explicit backend resolution and native SQLite sche…
n30nex Oct 9, 2026
f503127
fix(server): no SQL while holding PacketStore.mu (#2147)
efiten Oct 9, 2026
3e21b17
fix(server): drive the reach scan from the observations time window (…
efiten Oct 9, 2026
2dd25d5
feat(storage): keep SQLite default with verified optional PostgreSQL
n30nex Oct 9, 2026
65d837d
Merge upstream store-lock and reach-query performance fixes
n30nex Oct 9, 2026
c03a258
fix(build): complete native SQLite server dependency checksums
n30nex Oct 9, 2026
c77084a
test(ci): initialize first account fixtures explicitly
n30nex Oct 9, 2026
c6fee4e
test(auth): use the native account SQLite driver for fixture access
n30nex Oct 9, 2026
f7ffdfb
fix(sqlite): restore observer planner statistics after identity migra…
n30nex Oct 9, 2026
8c79c4e
test: await background readiness before startup API assertions
n30nex Oct 9, 2026
f15211f
docs: publish optional backend measurements and sizing tradeoffs
n30nex Oct 9, 2026
c6c5c8f
fix(postgres): back up recorded public-schema targets
n30nex Oct 9, 2026
2d1e763
test(qa): exercise the selected native database backend
n30nex Oct 9, 2026
82ad1c9
Brand CoreScope for Canadaverse with accessible responsive themes
n30nex Oct 10, 2026
82aa5d2
Include brand assets in instrumented browser fixtures
n30nex Oct 10, 2026
d7c7c80
Keep branded mobile replay controls within the viewport
n30nex Oct 10, 2026
e4052a6
Preserve mobile navigation targets with fallback brand fonts
n30nex Oct 10, 2026
51010a3
Keep standalone branding tests independent of npm dependencies
n30nex Oct 10, 2026
3485ade
fix(ingestor): normalize packet names before database writes
n30nex Oct 12, 2026
5633088
fix(store): enforce cache budget throughout startup and history loading
n30nex Oct 12, 2026
54e3136
Merge remote-tracking branch 'origin/codex/postgres-migration' into c…
n30nex Oct 12, 2026
0f33987
fix: page grouped SQL history before loading observations
n30nex Oct 12, 2026
01b2a94
fix(server): include timestamp in fallback packet broadcasts
n30nex Oct 12, 2026
504f44d
Merge branch 'codex/postgres-migration' of C:/Users/WillyJ/.codex/wor…
n30nex Oct 12, 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
  •  
  •  
  •  
29 changes: 25 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,15 +1,36 @@
# MeshCore Analyzer — Environment Configuration
# Copy to .env and customize. All values have sensible defaults.
# New installation: copy to .env and customize. Existing installation: merge
# missing keys into your private .env; do not replace paths or credentials.
#
# This file is read by BOTH docker compose AND manage.sh — one source of truth.
# manage.sh setup negotiates and updates only these production managed keys:
# PROD_DATA_DIR, PROD_HTTP_PORT, PROD_HTTPS_PORT, PROD_MQTT_PORT, DISABLE_MOSQUITTO
# Each environment keeps config + data together in one directory:
# ~/meshcore-data/config.json, meshcore.db, Caddyfile, theme.json
# ~/meshcore-staging-data/config.json, meshcore.db, Caddyfile
# ~/meshcore-data/config.json, Caddyfile, theme.json, queues and backups
# ~/meshcore-staging-data/config.json, Caddyfile, queues and backups
# With PostgreSQL selected, its separate persistent directory is not a logical backup.

# --- Storage choice ---
# SQLite is the default and needs no database service or PostgreSQL credentials.
# setup offers PostgreSQL explicitly. Once installed, storage-selection.json in
# the shared state directory is authoritative; ordinary updates keep it.
# To change engines, use the verified offline storage switch in docs/storage.md.
# Optional PostgreSQL credentials/directories: merge .env.postgres.example.
# Do not replace an existing .env or regenerate existing database passwords.
# Optional container state subdirectory, shared by setup/server/ingestor:
# CORESCOPE_STATE_DIR=/app/data

# --- Example deployment (docker-compose.example.yml only) ---
# For upgrades, point DATA_DIR at the existing state directory BEFORE bootstrap.
# PROD_DATA_DIR and STAGING_DATA_DIR below do not control the example variant.
DATA_DIR=./data
HTTP_PORT=80
# CORESCOPE_IMAGE=<reviewed image tag or digest matching this checkout>
# Bundled Caddy forwards port 80 to the Go server on 3000 by default. If you
# explicitly set DISABLE_CADDY=true, your proxy/port mapping must use port 3000.

# --- Production ---
# Data directory (database, theme, etc.)
# State directory (config, theme, queues and backups)
# Default: ~/meshcore-data
# Used by: docker compose, manage.sh
PROD_DATA_DIR=~/meshcore-data
Expand Down
21 changes: 21 additions & 0 deletions .env.postgres.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# OPTIONAL PostgreSQL settings — merge into your existing private .env.
# Base Compose files need none of these. Add the matching .postgres.yml override.
# Use a different persistent directory for each production/staging instance.
# Generate a DIFFERENT value for each blank field: openssl rand -hex 32
# Keep .env private. Hexadecimal passwords can be safely embedded in the
# generated container URLs; the initializer enforces at least 32 hex digits.
# These roles are created only when PostgreSQL's data directory is empty.
# Editing these values afterward does not change existing database passwords.
POSTGRES_ADMIN_PASSWORD=
CORESCOPE_OWNER_PASSWORD=
CORESCOPE_READER_PASSWORD=
CORESCOPE_WRITER_PASSWORD=
CORESCOPE_ACCOUNTS_PASSWORD=
CORESCOPE_CHANNELS_PASSWORD=
PROD_POSTGRES_DATA_DIR=~/corescope-postgres
STAGING_POSTGRES_DATA_DIR=~/corescope-staging-postgres
# docker-compose.example.yml uses this local default instead:
POSTGRES_DATA_DIR=./postgres-data
# Existing installations keep their recorded backend on update. Changing engines
# requires the offline storage switch in docs/storage.md. Never mount two database
# servers on one persistent directory.
4 changes: 4 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"CACHE_INVALIDATE_MS": "readonly",
"CLIENT_CONFIG": "readonly",
"CLIENT_TTL": "readonly",
"CSAuth": "readonly",
"ChannelColorPicker": "readonly",
"ChannelColors": "readonly",
"ChannelDecrypt": "readonly",
Expand All @@ -22,6 +23,7 @@
"EXTERNAL_URLS": "readonly",
"FAV_KEY": "readonly",
"FilterUX": "readonly",
"fitColumnsToContent": "readonly",
"GestureHints": "readonly",
"HEALTH_THRESHOLDS": "readonly",
"HashColor": "readonly",
Expand All @@ -35,6 +37,7 @@
"MAX_HOP_DIST": "readonly",
"MeshAudio": "readonly",
"MeshConfigReady": "readonly",
"NodeHopAnalytics": "readonly",
"PAYLOAD_COLORS": "readonly",
"PAYLOAD_TYPES": "readonly",
"PERF_SLOW_MS": "readonly",
Expand Down Expand Up @@ -255,6 +258,7 @@
"pad3": "readonly",
"pages": "readonly",
"parseViewportHash": "readonly",
"pathHashSize": "readonly",
"payloadTypeColor": "readonly",
"payloadTypeName": "readonly",
"process": "readonly",
Expand Down
2 changes: 1 addition & 1 deletion .github/agents/pr-reviewer.agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ You will pay special attention to the following areas during your review:
- **Project Architecture**: Does the PR respect the single Node.js server + static frontend architecture? Are changes in the right place?

### 2. Testing and Validation
- **No commit without tests**: Is the backend logic change covered by unit tests? Is `test-packet-filter.js` or `test-aging.js` updated if necessary?
- **No commit without tests**: Is the backend logic change covered by unit tests? Is `tests/unit/test-packet-filter.js` or `tests/unit/test-aging.js` updated if necessary?
- **Browser Validation**: Has the contributor confirmed the change works in a browser? Is there a screenshot for visual changes?
- **Cache Busters**: If any `public/` assets (`.js`, `.css`) were modified, has the cache buster in `public/index.html` been bumped in the *same commit*? This is critical.

Expand Down
2 changes: 1 addition & 1 deletion .github/instructions/copilot.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ You will pay special attention to the following areas during your review:
- **Project Architecture**: Does the PR respect the single Node.js server + static frontend architecture? Are changes in the right place?

### 2. Testing and Validation
- **No commit without tests**: Is the backend logic change covered by unit tests? Is `test-packet-filter.js` or `test-aging.js` updated if necessary?
- **No commit without tests**: Is the backend logic change covered by unit tests? Is `tests/unit/test-packet-filter.js` or `tests/unit/test-aging.js` updated if necessary?
- **Browser Validation**: Has the contributor confirmed the change works in a browser? Is there a screenshot for visual changes?
- **Cache Busters**: If any `public/` assets (`.js`, `.css`) were modified, has the cache buster in `public/index.html` been bumped in the *same commit*? This is critical.

Expand Down
Loading
Loading