Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
3799242
docs: update for v1.6.0
446564 Jul 24, 2026
d8371f0
feat: split top adverts into flood/direct
446564 Jul 24, 2026
336b734
feat: add stats api for new clock drift tracking
446564 Jul 24, 2026
ae0669c
enrich packet observations
446564 Jul 27, 2026
2cbd211
add IATA validation checks on ingest
446564 Jul 30, 2026
b44cae8
add neighbor message parsing
446564 Jul 30, 2026
c6d23a2
fix: cascade channel_messages on packet delete
MrAlders0n Aug 5, 2026
7d759d0
perf: known_routes retention, digest identity, and a working batched …
MrAlders0n Aug 12, 2026
ddc6dc1
fix: keep IATA packet paging alive past short pages
MrAlders0n Aug 7, 2026
137e3d2
Revert "fix: keep IATA packet paging alive past short pages"
446564 Aug 20, 2026
b5ab592
fix: re-land IATA paging fix on Go 1.26.6 (#108)
MrAlders0n Sep 4, 2026
dfaa31d
perf(db): enrich nodes after selecting the directory page (#111)
n30nex Sep 6, 2026
30327cd
fix(api): bound list limits consistently (#112)
n30nex Sep 6, 2026
69e7e19
fix(db): tolerate packets before their first observation (#115)
n30nex Sep 6, 2026
a78ea36
fix(background): preserve refresh failures in task outcomes (#113)
n30nex Sep 6, 2026
f66d431
fix(ingest): isolate MQTT client IDs across workers (#117)
n30nex Sep 9, 2026
e234965
fix(db): paginate complete trace tag groups (#124)
n30nex Sep 9, 2026
04d059d
perf(db): enrich clock-drift nodes after selecting the page (#122)
n30nex Sep 9, 2026
2125df5
perf(db): include observation IATAs in trace packet reads (#120)
n30nex Sep 9, 2026
88bc0dc
feat(retention): age out unreferenced observers when enabled (#126)
n30nex Sep 9, 2026
04fc026
fix(packets): preserve captured endpoint names in history (#128)
n30nex Sep 9, 2026
5c5de43
perf(db): bound route pages to the requested IATA (#118)
n30nex Sep 9, 2026
f390086
fix(channels): preserve timestamp ties in page cursors (#132)
n30nex Sep 10, 2026
22410cf
fix(api): trust client IP headers only from configured proxies (#133)
n30nex Sep 10, 2026
6521fdd
recover from interrupted CREATE INDEX CONCURRENTLY in migrations (#134)
MrAlders0n Sep 10, 2026
b66573b
feat(observers): per-observer activity endpoint (#135)
MrAlders0n Sep 10, 2026
d202205
fix(observers): rename telemetry airtime fields to seconds (#136)
MrAlders0n Sep 10, 2026
e15f873
fix(api): return JSON 500 when bucketed telemetry query fails (#137)
MrAlders0n Sep 10, 2026
b44769b
fix(observers): preserve advert pages with missing origin keys (#138)
n30nex Sep 18, 2026
ce8c6cd
fix(ingest): honor explicit zero locations in adverts (#139)
n30nex Sep 18, 2026
9164659
feat(backup): export private database and saved-config bundles (#151)
n30nex Sep 18, 2026
b21279c
feat(db): add operator account lifecycle storage (#148)
n30nex Sep 18, 2026
bcdea76
feat(stats): filter scope counts by IATA and region (#142)
n30nex Sep 18, 2026
85b1c39
feat(packets): populate advert summaries in history and live events (…
n30nex Sep 18, 2026
93f85ca
feat(auth): protect the admin subtree with a bearer key (#146)
n30nex Sep 18, 2026
0067e51
feat(cache): add payload-free debug cache diagnostics (#145)
n30nex Sep 18, 2026
595ef44
feat(api): rate limit REST requests by trusted client IP (#140)
n30nex Sep 19, 2026
dab228e
feat(logging): configure levels and structured runtime output (#144)
n30nex Sep 19, 2026
6540b92
feat(admin): expose selected startup configuration (#147)
n30nex Sep 19, 2026
cf5ff7a
feat(stats): compare flood packets reported by two observers (#152)
n30nex Sep 19, 2026
c7ace0c
feat(ws): limit connection attempts and signal capacity shedding (#141)
n30nex Sep 19, 2026
775aedf
feat(admin): update runtime CORS origins consistently (#150)
n30nex Sep 19, 2026
6aba17c
feat(nodes): indicate repeaters outside configured local borders (#153)
n30nex Sep 19, 2026
951b79b
refactor(api): stabilize router settings and admin route wiring (#155)
n30nex Sep 20, 2026
4d2642a
feat(admin): add protected account lifecycle endpoints (#149)
n30nex Sep 24, 2026
a25e267
feat(backup): add protected database and config download (#154)
n30nex Sep 24, 2026
6107578
feat(stats): add bounded reception signal analytics (#157)
n30nex Sep 24, 2026
8a3fa7e
feat(stats): add bounded path and hash-width analytics (#159)
n30nex Sep 24, 2026
20691dc
feat(backup): verify native archives offline without extraction (#160)
n30nex Sep 24, 2026
c02317a
feat(packets): summarize ACK and trace references (#161)
n30nex Sep 24, 2026
3dee209
perf(db): batch retention deletes and tune autovacuum (#162)
MrAlders0n Sep 25, 2026
91b4b45
perf(db): resolve packet endpoints at read time (#163)
MrAlders0n Sep 25, 2026
dec643a
feat(ws): opt-in allowed origins and observer key (#170)
MrAlders0n Sep 27, 2026
90f9b50
feat(ws): allow subdomain wildcards in allowed origins (#177)
MrAlders0n Sep 28, 2026
876d997
feat(ws): opt-in includeRepeats streams later hearings over new paths…
MrAlders0n Sep 28, 2026
1887fcc
perf(ingest): reduce database work and buffer MQTT bursts (#179)
MrAlders0n Sep 28, 2026
db30c9b
fix(db): batch route reconfirmation to avoid ingest stalls (#180)
MrAlders0n Sep 28, 2026
fd7c6b3
feat(db): retain 30-day analytics independently of packet expiry (#167)
n30nex Sep 30, 2026
5fbba24
fix(observers): separate packet metrics from presence updates
n30nex Sep 27, 2026
47342ab
fix(observers): keep non-finite signal samples out of JSON
n30nex Sep 27, 2026
5977e42
test(observers): exercise non-finite raw and archived samples
n30nex Sep 27, 2026
d3c330e
fix: address maintainer review for #169
n30nex Sep 29, 2026
dea5395
fix: address release review follow-ups for #169
n30nex Sep 30, 2026
551f061
docs(api): refresh generated contract after stack update
n30nex Sep 30, 2026
de42595
style: trim regenerated sqlc configuration
n30nex Sep 30, 2026
b8a8188
test: mirror coalesced observer payload types
n30nex Sep 30, 2026
c448a04
feat(routes): add bounded retained observation evidence
n30nex Sep 27, 2026
cd20bc5
test(routes): cover server-anchored evidence windows
n30nex Sep 27, 2026
85c9123
fix: address maintainer review for #172
n30nex Sep 29, 2026
831148f
fix: address release review follow-ups for #172
n30nex Sep 30, 2026
c18e059
feat(scopes): import cached regional MeshMapper catalogues
n30nex Sep 27, 2026
f6e628c
test(scopes): run race checks on the Linux CI runner
n30nex Sep 27, 2026
986a6c0
test(scopes): synchronize the timeout fixture state
n30nex Sep 27, 2026
574bba4
fix: address maintainer review for #174
n30nex Sep 29, 2026
83cbaff
fix: address release review follow-ups for #174
n30nex Sep 30, 2026
7e01abf
docs(api): refresh generated contract after stack update
n30nex Sep 30, 2026
2abed6c
feat(channels): expose recorded packet scope in message delivery
n30nex Sep 27, 2026
abb6a3b
test(channels): give stored packet fixtures explicit receive times
n30nex Sep 27, 2026
7d3a3e2
test(channels): verify scope metadata through all HTTP message routes
n30nex Sep 27, 2026
07335e6
test(channels): use the documented catch-up cursor parameter
n30nex Sep 27, 2026
8f60328
test(channels): preserve the existing catch-up response shape
n30nex Sep 27, 2026
6bf58ac
fix: address maintainer review for #176
n30nex Sep 29, 2026
3b806c1
fix(ingest): resolve advert endpoints after node updates
n30nex Sep 26, 2026
97cc22a
fix: address maintainer review for #166
n30nex Sep 29, 2026
89a376c
fix(ingest): accept RFC3339 timestamp offsets and precision
n30nex Sep 29, 2026
c9b7010
chore: regenerate sqlc and document saved-route evidence
MrAlders0n Sep 30, 2026
fd57c8b
fix(ingest): accept space-separated and colonless-offset timestamps
MrAlders0n Sep 30, 2026
32644ae
chore: set MrAlders0n as default code owner
MrAlders0n Sep 30, 2026
5cf0601
feat: add bounded CPU profiling (#182)
MrAlders0n Sep 30, 2026
d733975
fix(backup): abort exports on shutdown and sweep stale staging dirs
MrAlders0n Sep 30, 2026
6852074
fix(ingest): record hearing paths right after the insert
MrAlders0n Sep 30, 2026
c952afd
fix(ingest): let paho auto-ack MQTT deliveries
MrAlders0n Sep 30, 2026
44b9a0f
ci: run packet summary and reconfirm tests, read analytics on 039 views
MrAlders0n Sep 30, 2026
e7061f5
fix(api): log the cause of account 500s
MrAlders0n Sep 30, 2026
e1b78b6
fix(profiling): offset periodic captures and harden the recorder
MrAlders0n Sep 30, 2026
ab27334
fix(backup): report trailing archive data as corruption
MrAlders0n Sep 30, 2026
1c2841a
perf(db): compute route ambiguity once per reconfirm run
MrAlders0n Sep 30, 2026
3b54890
fix(api): tolerate client clock skew and drop the dead route evidence…
MrAlders0n Sep 30, 2026
9ce4e8d
fix(cache): invalidate derived scope keys on catalogue import
MrAlders0n Sep 30, 2026
8a488fd
fix(meshmapper): retry failed catalogue fetches sooner
MrAlders0n Sep 30, 2026
50d35d8
fix(api): emit observer statusMetadata as JSON
MrAlders0n Sep 30, 2026
f6fe177
docs: regenerate swagger
MrAlders0n Sep 30, 2026
689bc23
fix(ingest): clear a node's location on an explicit 0/0 advert
MrAlders0n Sep 30, 2026
0e24257
feat(meshmapper): import region boundaries from the Zones API
MrAlders0n Sep 30, 2026
14354b0
fix(telemetry): stop partial and bogus stats inflating bucketed counters
MrAlders0n Sep 30, 2026
5b177d6
fix(ingest): strip NUL bytes from observer status
MrAlders0n Sep 30, 2026
18f5925
ci: reserve latest images for stable releases
n30nex Sep 30, 2026
765408e
test: drain readiness probes before packet assertions
n30nex Sep 30, 2026
da6de40
ci: tie latest image tag to main
MrAlders0n Sep 30, 2026
3ac4035
refactor(db): flatten migrations into a 2.0.0 baseline
MrAlders0n Oct 1, 2026
2f49ffb
feat(api): filter scope lists by region and catalogue membership
MrAlders0n Oct 1, 2026
11e0ed7
docs(config): surface MeshMapper integrations first
MrAlders0n Oct 1, 2026
e2b64f2
chore: version bump v2.0.0
MrAlders0n Oct 1, 2026
9a4e17b
feat(meshmapper): import zones for every known IATA
MrAlders0n Oct 1, 2026
7267b8b
feat(meshmapper): accept scope sources outside configured regions
MrAlders0n Oct 1, 2026
bfda0d5
feat(meshmapper): discover scope sources from the zone list
MrAlders0n Oct 1, 2026
a970484
feat(meshmapper): import zone groups as regions
MrAlders0n Oct 1, 2026
38b1a20
fix(meshmapper): respect MeshMapper's per-endpoint rate limits
MrAlders0n Oct 1, 2026
f8ee1ac
feat(meshmapper): import regional channels and scope channel lists by…
MrAlders0n Oct 1, 2026
7392fdd
fix(meshmapper): create group member IATAs and import zone names and …
MrAlders0n Oct 1, 2026
27ca84f
fix(meshmapper): allow MeshMapper's 60s request timeout
MrAlders0n Oct 1, 2026
119be44
feat(channels): filter channel list by keyKnown
MrAlders0n Oct 1, 2026
6cd03e7
fix(db): refresh saved-route hash prefix on re-hearing
MrAlders0n Oct 1, 2026
98006a9
feat(stats): serve historical stats from hourly rollups
MrAlders0n Oct 2, 2026
3e0b6c0
feat(stats): report the longest path per hour in /stats/paths
MrAlders0n Oct 2, 2026
53d9f86
feat(stats): split /stats/scopes packet counts by hour
MrAlders0n Oct 2, 2026
2042c16
feat(stats): roll hourly scope observers and advertising nodes
MrAlders0n Oct 2, 2026
5ccb1a2
fix(api): warn on untrusted proxies and tighten config validation
MrAlders0n Oct 2, 2026
52fc3e1
fix(ingest): validate topic keys and harden against malformed input
MrAlders0n Oct 2, 2026
ec00378
fix(meshmapper): count cut-short requests and qualify groups by heard…
MrAlders0n Oct 2, 2026
2f4f92e
fix(db): tie-safe trace paging, atomic migrations and honest stats wi…
MrAlders0n Oct 2, 2026
b30668b
fix(ws): keep the newest event on overflow and apply route/observer f…
MrAlders0n Oct 2, 2026
ec0ecd3
refactor(db): move the heard-IATA lookup into sqlc
MrAlders0n Oct 2, 2026
951e0b0
docs: regenerate swagger
MrAlders0n Oct 2, 2026
5b49356
docs: update for 2.0.0
MrAlders0n Oct 2, 2026
a1aff81
fix(api): answer 404 only for missing rows
MrAlders0n Oct 2, 2026
4ad869d
fix(db): page known routes by (last_seen, id)
MrAlders0n Oct 2, 2026
ff8758b
fix(db): read observer activity raw rows back to the rollup watermark
MrAlders0n Oct 2, 2026
af20beb
docs: document route cursorId and activity coverage fields
MrAlders0n Oct 2, 2026
be35b36
docs: condense backup, README and contributor docs (#205)
MrAlders0n Oct 3, 2026
1f83df8
docs: move operator docs to beacon-docs (#206)
MrAlders0n Oct 3, 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
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .build/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ COPY . .
RUN go build -o beacon ./cmd/beacon

FROM alpine:3.19
RUN apk add --no-cache ca-certificates tzdata
ARG POSTGRES_CLIENT_MAJOR=16
RUN apk add --no-cache ca-certificates tzdata postgresql${POSTGRES_CLIENT_MAJOR}-client
WORKDIR /app
COPY --from=builder /app/beacon .
CMD ["./beacon"]
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Default owners for everything
* @446564
* @MrAlders0n


# EXAMPLE Specific ownership by directory
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,5 @@ paste logs here

## Additional context

Any other context — config snippets (redact credentials), MQTT broker details,
Any other context: config snippets (redact credentials), MQTT broker details,
mesh topology, etc.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ related to an existing issue or limitation, link it here.

## Proposed solution

How you'd like it to work. API shape, config options, WS event format — as much
How you'd like it to work. API shape, config options, WS event format, as much
detail as you have.

## Alternatives considered
Expand Down
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ issues: `Closes #123` or `Related to #456`.
- [ ] API changes include swagger annotations and `swag init` has been run
- [ ] `docs/` is committed if swagger was regenerated
- [ ] New dependencies are added to `SHOULDERS.md`
- [ ] I have read [CONTRIBUTING.md](CONTRIBUTING.md)
- [ ] I have read [CONTRIBUTING.md](../CONTRIBUTING.md)

## Testing notes

Expand Down
44 changes: 43 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@ on:
jobs:
build:
runs-on: ubuntu-latest
services:
backup-postgres:
image: postgres:16-alpine
env:
POSTGRES_PASSWORD: backup-ci-only
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 5s
--health-timeout 5s
--health-retries 10
steps:
- uses: actions/checkout@v4

Expand All @@ -35,6 +47,37 @@ jobs:
- name: Test
run: go test ./...

- name: Verify scope refresh concurrency
run: go test -race ./internal/meshmapper ./internal/scopestore

- name: Verify backup startup against PostgreSQL 16
env:
BEACON_TEST_POSTGRES_DSN: postgres://postgres:backup-ci-only@127.0.0.1:5432/postgres?sslmode=disable
run: go test ./cmd/beacon -run '^TestBackupConfigurationPostgres$' -count=1 -v

- name: Verify stats and endpoint queries against PostgreSQL 16
env:
BEACON_TEST_POSTGRES_DSN: postgres://postgres:backup-ci-only@127.0.0.1:5432/postgres?sslmode=disable
run: go test ./db -run '^Test(Signal|Paths|PacketSummaries|PacketEndpointsResolveLive|ObserverMetrics|RouteEvidence|RouteEvidenceIndex|AnalyticsRetention|AnalyticsRetentionConcurrent|DeleteOldPacketsBatches|MeshMapperCatalogue|ChannelMessageScopes|NodeLocationReset|RunMigrations[A-Za-z]*|Reconfirm[A-Za-z]*)Postgres$' -count=1 -v

- name: Verify backup command against PostgreSQL 16
run: |
CGO_ENABLED=0 go build -o "$RUNNER_TEMP/beacon-backup" ./cmd/beacon-backup
CGO_ENABLED=0 go test -c -o "$RUNNER_TEMP/backup.test" ./internal/backup
CGO_ENABLED=0 go test -c -o "$RUNNER_TEMP/backup-http.test" ./internal/api/router
docker run --rm --network host \
-e PGHOST=127.0.0.1 -e PGUSER=postgres -e PGDATABASE=postgres \
-e PGPASSWORD=backup-ci-only -e PGSSLMODE=disable \
-e BEACON_BACKUP_TEST_POSTGRES=1 -e BEACON_BACKUP_TEST_BINARY=/beacon-backup \
-v "$RUNNER_TEMP/beacon-backup:/beacon-backup:ro" \
-v "$RUNNER_TEMP/backup.test:/backup.test:ro" \
postgres:16-alpine /backup.test -test.run '^TestExportPostgres$' -test.v
docker run --rm --network host \
-e PGHOST=127.0.0.1 -e PGUSER=postgres -e PGDATABASE=postgres \
-e PGPASSWORD=backup-ci-only -e PGSSLMODE=disable -e BEACON_BACKUP_TEST_POSTGRES=1 \
-v "$RUNNER_TEMP/backup-http.test:/backup-http.test:ro" \
postgres:16-alpine /backup-http.test -test.run '^TestBackupDownloadPostgres$' -test.v

- name: Install govulncheck
run: go install golang.org/x/vuln/cmd/govulncheck@latest

Expand All @@ -54,4 +97,3 @@ jobs:
exit 1
fi
rm docs/swagger.json.bak

6 changes: 4 additions & 2 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ jobs:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
labels: |
org.opencontainers.image.title=beacon-server
org.opencontainers.image.description=Beacon — MeshCore LoRa mesh observation server
org.opencontainers.image.description=Beacon: MeshCore LoRa mesh observation server
org.opencontainers.image.licenses=AGPL-3.0-or-later
flavor: |
latest=false
tags: |
type=raw,value=latest,enable={{is_default_branch}}
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=dev,enable=${{ github.ref == 'refs/heads/dev' }}
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
Expand Down
10 changes: 5 additions & 5 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Examples of behaviour that contributes to a positive environment:

Examples of unacceptable behaviour:

- Hate speech or discriminatory language or jokes of any kind — including but
- Hate speech or discriminatory language or jokes of any kind, including but
not limited to those targeting race, ethnicity, nationality, gender identity
or expression, sexual orientation, disability, religion, age, or socioeconomic
background
Expand All @@ -34,7 +34,7 @@ Examples of unacceptable behaviour:
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment of any kind
- Deliberate misgendering or use of rejected names
- Publishing others' private information — such as a physical or email address —
- Publishing others' private information, such as a physical or email address,
without their explicit permission
- Threats of violence or incitement of violence toward any individual or group
- Dismissing or minimising reports of harassment or discrimination
Expand All @@ -55,15 +55,15 @@ when appropriate.

## Scope

This Code of Conduct applies within all project spaces — GitHub issues, pull
requests, discussions, and the MeshCore Canada Discord server — and also when an
This Code of Conduct applies within all project spaces (GitHub issues, pull
requests, discussions, and the MeshCore Canada Discord server) and also when an
individual is representing the project in public spaces.

## Reporting

Instances of abusive, harassing, or otherwise unacceptable behaviour may be
reported by contacting the maintainers directly on the MeshCore Canada Discord
server at https://discord.gg/Gz3KvJx2hf — reach out to **dedskelly** privately.
server at https://discord.gg/Gz3KvJx2hf; reach out to **dedskelly** privately.

All reports will be handled with discretion and confidentiality. Maintainers are
obligated to respect the privacy and safety of the reporter.
Expand Down
Loading
Loading