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>
Extends the in-app sprite editor with four feature sets:
- Shape tools: line (L), rectangle (R), ellipse (O) with click-drag live
preview and a FILL toggle for outline vs filled rect/ellipse.
- Select & move: rectangular marquee (M) to select, drag-to-move via a
floating layer, arrow-key nudge, and clipboard ops (Ctrl+C/X/V, Delete,
Enter/Esc to commit). Undo/redo and save auto-bake any pending move.
- Reference overlay: load any image as an adjustable-opacity backdrop to
trace over (rendered under the artwork), with a show/hide toggle.
- Color tools: brush opacity slider, persistent custom palette
(localStorage; right-click to remove), and an auto-updating recent colors row.
Cache-bust admin assets to ?v=20260609c so the update loads without a manual
hard-refresh.
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>
Build a dependency-free Canvas2D pixel editor integrated into the admin
Sprites tab. Each sprite card gains an EDIT button that opens a full-screen
editor for the sprite at its native 500x333 resolution.
Tools: pencil (1-8px brush, Bresenham interpolation), eraser, color picker
(palette + native input + pick-from-canvas), fill bucket (flood fill), pan.
Features: cursor-centered zoom, space-drag pan, undo/redo (snapshot per
stroke), pixel grid overlay, transparency checkerboard, load existing sprite,
and keyboard shortcuts (B/E/I/F, Space, +/-/0, Ctrl+Z/Y, G, Esc).
Export reuses the existing POST /api/admin/sprites/{type} upload endpoint via
srcCanvas.toBlob, so no server changes are required.
Closes#5
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds Dockerfile, docker-compose.yml, and .dockerignore to enable
running ADS-Bit in a container with host networking for LAN receiver
auto-scanning. Bind mounts persist config, sprites, and backgrounds
across container recreation. Updates README with usage instructions.
Closes#4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allow users to download existing sprite and background assets from the
admin panel, useful for editing externally and re-uploading or backing
up customizations.
Co-Authored-By: Claude Opus 4.6 <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>
N-prefix callsigns (US general aviation) were incorrectly matching the
helicopter detection rules due to 'N' in the helicopter callsign list
and a broken .some() condition. Speed/altitude heuristics were also too
broad, and zero-value speed data (not yet received) triggered false
matches. Types are now re-evaluated as better data arrives instead of
being locked to the first guess.
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>
2026-06-08 08:35:07 -07:00
9 changed files with 92 additions and 18 deletions
Access at http://localhost:{web_port} (configured in config.json)
### Deployment / fielding notes
- **Config path** is overridable via the `ADSBIT_CONFIG` env var (defaults to `config.json` beside `server.py`). Docker uses `/app/data/config.json` on a mounted volume.
- **`/health`** (no auth) returns status/version/receiver/flight counts — used by the Docker `HEALTHCHECK` and any external monitoring.
- **`VERSION`** constant in `server.py` is the single source of truth; surfaced at startup, via `GET /api/config`, and in the admin header. Bump it for releases.
- **Auto-scan** (`scan_for_receivers`) skips subnets larger than `MIN_SCAN_PREFIX` (/20) so a docker `/16` doesn't stall startup; the manual scan endpoint enforces the same limit.
- **`docker-entrypoint.sh`** seeds `config.json` from `config.json.example` on first run, so a fresh `docker compose up` needs no manual steps. SIGTERM/SIGINT shut down cleanly (no traceback).
Host networking (`network_mode: host`) is used so the server can auto-scan your LAN for ADS-B receivers.
Host networking (`network_mode: host`) is used so the server can auto-scan your LAN for ADS-B receivers. Auto-scan skips oversized subnets (larger than /20, e.g. a Docker bridge `172.17.0.0/16`); if your receiver lives on such a network, set it explicitly via the admin Receivers tab.
## Requirements
@@ -104,8 +106,8 @@ ADS-Bit uses a first-run setup wizard to configure your installation. You can al
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.