The radio system never really sleeps. Fire departments get toned out, deputies run plates, trains stop traffic, ambulances get redirected mid-run, public works calls in a downed line. Most of it is routine. By the next day, it's forgotten.
NWI Scanner keeps the record. It's a publicly accessible archive of unencrypted public safety radio communications received via software-defined radio (SDR) in Northwest Indiana. The site captures transmissions from Porter, La Porte, Starke, Jasper, and Newton counties on the Indiana STARCOM21 P25 Phase II trunked radio system, transcribes them with local AI speech recognition, and makes all of it searchable.
Nothing here comes from an internet feed. Every recording starts with an antenna and two radios sitting quietly, listening. This is an independent, community-operated project with no affiliation with any government agency, public safety department, or commercial service.
Two RTL-SDR dongles and a whip antenna. That's the entire receive side — refreshingly simple. The dongles started life as cheap European TV tuners; someone figured out you could put them into a mode where they just hand you raw IQ samples and get out of the way. Everything past that point is software. The antenna sits elevated with line of sight toward the STARCOM21 tower infrastructure across Porter County. The machine running SDRTrunk spends most of its life doing absolutely nothing interesting until somebody keys a microphone — then everything happens in a fraction of a second before it quietly goes back to waiting. None of it is exotic: two sticks of hardware and a growing pile of scripts holding the rest together.
| Receivers | 2× RTL-SDR v3 dongles (Rafael Micro R820T2 tuner, 8-bit ADC, ~2.4 MHz usable bandwidth each) |
| Antenna | Vertical whip, elevated mount — line of sight to the STARCOM21 tower infrastructure across Porter County |
| Host | Ubuntu 22.04 LTS, running continuously. SDRTrunk handles decode; everything else is bash and Python. |
| Transcription | A modest always-on ARM server — whisper.cpp with the large-v3-turbo-q8 model. Runs on CPU only, no GPU required. Scanner traffic isn't in a hurry. |
| Web server | Same server as transcription. Nginx + Gunicorn + Flask. SQLite for the transcript index. No managed services, no cloud database. |
Air to archive:
Scanner culture predates the internet. People built crystal sets and homebrew receivers to hear what was happening around them because the transmissions were there in the air and pulling them down felt like the obvious thing to do. That instinct hasn't changed. The gear just got cheaper.
There's a certain satisfaction in receiving something — not streaming it from someone else's server, but actually receiving it. Your antenna, your hardware, your software making sense of the signal. You own that.
Live scanner audio disappears the moment it's spoken. That always seemed like a waste. Searching for something that happened three months ago used to mean remembering roughly when it occurred, finding an archive, and listening through hours of recordings. Computers are good at remembering things. They should probably do that job instead.
Recording the audio turned into transcribing it. Transcribing it turned into indexing it. Indexing it turned into search. None of that was planned from the beginning — each piece simply made the next one seem like the obvious thing to build.
Whisper isn't perfect on scanner audio — it hears "Reportage" instead of "Portage," stumbles on phonetic-alphabet strings, and occasionally invents a word that's never existed. A correction dictionary helps close the gap. The audio is always there when the transcript fails; the transcript is simply another way to get back to it.
Most software tries to make decisions. This mostly tries to avoid them: record everything, timestamp everything, keep it together, make it searchable, get out of the way. The less opinion the software has about what's important today, the more useful it becomes six months from now.
This isn't a product. It's a machine someone built because they wanted it to exist.
The machine doesn't know what's important. A working structure fire gets logged exactly the same as someone asking if another unit is clear. One transmission is a jaw dislocation; the next is a stuck traffic gate; an hour later it's an ambulance headed to Camelot Manor. Most days aren't extraordinary. They're just Tuesday. After enough Tuesdays, a picture starts to emerge.
Indiana STARCOM21 is a statewide P25 trunked system. State police, county sheriff, fire, EMS, municipalities — all sharing the same tower infrastructure, separated by talkgroup. The control channel coordinates everything in real time: who's transmitting, which tower, which channel slot. SDRTrunk follows it like a map.
Some of it you can hear. Some of it you can't. Fire and EMS in Porter County mostly run unencrypted. Police is mixed — some agencies went AES a while back, others haven't. When a talkgroup encrypts, the control channel still shows activity but the audio is gone. A locked door. Those transmissions don't show up here.
What does show up: a jaw dislocation at Camelot Manor, 9-year-old home alone. CSX gates stuck down after a train cleared. Rescue 4 getting bounced between two scenes. A plate run on a maroon '98 Chevy, expired, operator surrendered CDL. An air medical request — "we need angels" — at 8:57 in the morning. Ordinary day. All of it public, all of it broadcast, none of it going anywhere until now.
Fifteen minutes. Two talkgroups. Real run.
Actual output from a recent run. Timestamps link to audio in the full archive. "We need angels" — air medical request.
Reception covers the Indiana STARCOM21 system serving Porter, La Porte, Starke, Jasper, and Newton counties, along with regional talkgroups for Indiana State Police, Indiana Toll Road, Indiana Dunes National Park, DNR, and air medical services.
There isn't much mystery here. A couple of radios. An antenna. Some Linux machines. A growing pile of scripts. Eventually those pieces became something that didn't seem to exist anywhere else. So it kept growing.
All transmissions monitored and published on this site are unencrypted public safety communications broadcast on licensed radio frequencies. Reception of these signals is lawful under federal law. Publication of unencrypted radio communications is permitted under 47 U.S.C. § 605 and the Electronic Communications Privacy Act, which explicitly excludes unencrypted radio communications from its prohibitions.
This site is operated solely for educational, research, and public interest purposes. No private communications are intercepted or published. No encrypted transmissions are decoded or published.
Transcripts are generated by machine learning software and may contain errors, including misrecognized words, incorrect agency names, and inaccurate location information. Always verify transcript content against the original audio before relying on it for any purpose.
Do not use scanner audio or transcripts as a substitute for calling 911. If you witness an emergency, contact your local emergency services directly.