istrain-public: from-scratch build of a passive RF train detector

Public community release. The complete working system — DSP + decoders (scripts/),
web dashboard + API (dashboard/), container stack (docker/), config templates (config/) —
plus APOCALYPSE-EDITION.md, the full build guide for a human or a coding agent. GPLv3
(PyEOT dependency). Scrubbed of all secrets, internal IPs, hostnames, and location detail.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
istrain
2026-07-24 23:19:16 -04:00
commit 559caead36
41 changed files with 6740 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
# iSTRAIN — build stages
**Primary goal:** detect a train blocking *your* crossing, from passive RF alone.
**Secondary:** capture and learn — radios, trains, hardware, software. Not a toy.
This file renders in the dashboard's checklist panel; edit it to track your own build.
Full instructions: **APOCALYPSE-EDITION.md**.
## The plan · two radios, two bands
- **Radio A (a Blog V4 is ideal) → rail VHF voice 160162 MHz** — RTLSDR-Airband demodulates your
pinned road/detector channels at once (your subdivision's AAR channel is the mission).
- **Radio B (any RTL-SDR) → EOT-system UHF hop** — 452.9375 (head/BOT) ⇄ 457.9375 (EOT/tail),
retune-in-place; ±12.5 kHz DPU neighbors watched inside each dwell.
## Stage 0 · Host & dongles
- [ ] Linux host with Docker; base tools installed (rtl-sdr, ffmpeg, python3-numpy)
- [ ] DVB driver blacklisted on the host (`config/blacklist-rtl-sdr.conf`); `lsmod | grep dvb` empty
- [ ] Dongles serialized (`rtl_eeprom -s …`) so services pick them by name
- [ ] NOAA weather RX proves the antenna→dongle→software chain end to end
## Stage 1 · Your crossing
- [ ] Railroad + subdivision identified; road channel + neighbors found (cross-checked on 2 sources)
- [ ] Nearby defect-detector mileposts noted (your early-warning tripwires)
- [ ] `config/istrain.conf` edited with YOUR voice channels
## Stage 2 · Bring-up
- [ ] DSP selftests pass (`iq_hop.py --selftest`, `iq_channelize.py --selftest`)
- [ ] Stack builds and runs (`docker compose --profile radio --profile radio1001 up -d`)
- [ ] `level.json` refreshing; clips landing; dashboard live at `:3456`
- [ ] First EOT decode on a real train (unit ID + brake psi + motion) 🎉
## Stage 3 · Ears & polish
- [ ] Whisper transcription wired (comms band-pass first, VAD on — see APOCALYPSE §7)
- [ ] Squelch tuned to your noise floor (not a textbook number — APOCALYPSE §8)
- [ ] Standing carriers (fixed wayside boosters) identified and carded, not chased
## Stage 4 · If you expose it publicly
- [ ] Read APOCALYPSE §10 (security): presentation-node read-only mode, no PUSH_KEY, proxy auth
- [ ] Antenna moved high and away from your computers — the #1 range lever
## The habit that makes it work
- [ ] Keep one append-only, numbered observations log. Record findings AND retractions.