Make a fresh deploy (especially Docker) work with no manual steps and behave
well on real-world hosts:
- Auto-scan skips subnets larger than /20 (e.g. a docker bridge 172.17.0.0/16
= 65k hosts) so AUTO discovery no longer stalls startup or hammers the
network on any host with Docker. Manual scan shares the same MIN_SCAN_PREFIX.
- Docker: config.json is auto-seeded from config.json.example by a new
docker-entrypoint.sh and persisted on a ./data directory mount — no more
single-file bind-mount footgun, no manual cp before first run.
- Config path is overridable via ADSBIT_CONFIG (defaults to ./config.json for
bare metal; /app/data/config.json in the container).
- New /health endpoint (status/version/receivers/flights) + Docker HEALTHCHECK.
- Clean SIGTERM/SIGINT shutdown (docker stop / systemctl stop) — no traceback.
- .gitignore/.dockerignore exclude the data/ config volume.
- README/CLAUDE.md updated; VERSION bumped to 1.1.1.
Verified: image builds, fresh `docker run` seeds config and reports healthy,
oversized subnets skipped in-container, /health responds, graceful shutdown.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add VERSION = "1.1.0" to server.py; print at startup, expose via public
GET /api/config, and show it in the admin header (so deployed == released
is verifiable at a glance).
- Ignore config.json in .gitignore — it holds the admin password hash and
session secret; fresh installs use config.json.example.
- README/CLAUDE.md: document the in-app pixel editor (now with shape tools,
select/move, reference overlay, custom/recent palettes), the receiver health
dashboard, 9 sprite types, and the asset cache-busting convention.
- Bump admin asset cache-bust to ?v=20260609d.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Receiver management improvements for the admin Receivers tab:
- Per-receiver health: server now tracks each connection's state
(connecting/connected/down), message count, and last-message time, exposed
via new GET /api/admin/receiver-status and POST /api/admin/test-receivers.
- Receivers tab redesign: live "Active Receivers" panel with colored
indicators (green=receiving, yellow=connected/no data, red=unreachable),
a clear select -> SAVE & APPLY -> auto-test flow, and selectable scan
results with a "USE SELECTED RECEIVERS" action.
- Network scan interface selector: scan a chosen interface/subnet instead of
every local subnet. Oversized subnets (>/20, e.g. a docker /16) are disabled
in the UI and rejected server-side, eliminating slow/hanging scans.
Critical fix — server crash on receiver restart:
- Receiver connection tasks were awaited inside main()'s top-level
asyncio.gather. Restarting receivers cancels those tasks, and the resulting
CancelledError propagated into the gather and killed the whole server
process (every action after a restart then failed). Receiver tasks now run
as independent background tasks; restart cancels and awaits them with
return_exceptions=True so cancellation can never tear down the server.
Also cache-bust admin.css/admin.js/pixel-editor.js (?v=) so updated assets
load without a manual hard-refresh, and surface a clear message instead of a
silent "Loading…" when the status endpoint is unavailable.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Shows the server's network interfaces (IP, subnet) in the admin Receivers
tab so users know which networks are being scanned. Adds an optional subnet
input field to scan arbitrary networks (e.g. VLANs the server can route to
but isn't directly attached to), with validation and a /20 size cap.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a THEMES tab to the admin panel with per-theme cards showing
4 directional previews, editable display names, per-direction PNG
upload, and new theme creation. Display names are stored in
config.json theme_names map rather than renaming filesystem folders.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New dedicated pixel art sprites for ADS-B emitter categories B2
(lighter-than-air → balloon), B1 (glider/sailplane → glider), and
B6 (UAV → uav), replacing the previous fallback to smallProp. Adds
an admin Sprites tab for previewing and uploading replacement PNGs
for all 9 aircraft sprite types.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Poll dump1090's aircraft.json endpoint to get real transponder-reported
aircraft categories (A1=Light, A3=Large, A5=Heavy, A7=Rotorcraft, etc.)
instead of relying solely on heuristics. The SBS protocol on port 30003
doesn't include this field, but the JSON API on port 80 does. Categories
are polled every 5 seconds and merged into flight data. Client uses
emitter category when available, falling back to heuristic classification.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rename pixel-view.js to ads-bit.js, rename PixelADSB class to ADSBit,
and update all documentation and code comments to use ADS-Bit branding
consistently throughout the project.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements credentialed admin panel and multi-step setup wizard so new
users can configure location, receivers, and preferences without editing
JSON files. Adds bcrypt password auth with session cookies, setup lockout
after first run, and expanded config schema with backward compatibility.
New files: admin/{html,css,js}, setup/{html,css,js}
Modified: server.py (auth, setup, admin APIs), index.html (dynamic title),
pixel-view.js (site/display config), requirements.txt (bcrypt),
config.json.example (full schema)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>