πŸŽ“ Farewell, Berkeley! 🌟

As of December 15, 2023, my Berkeley journey has come to an end. It's been an incredible two-year ride, and I'm truly honored to have had the opportunity to run this account. But, as they say, all good things must come to an end. πŸŒ†

With my UC Berkeley graduation now behind me, I'm bidding farewell to the Bay Area and heading back to the sunny streets of Los Angeles. 🌞 Thanks for all the memories, Berkeley – you'll always have a special place in my heart! ❀️

If you wish to stay up to date, you can follow my LA account on Twitter or connect with me on LinkedIn.


πŸ“š Explore My Berkeley Collection πŸ“ΈπŸ“œπŸ“½οΈ

Discover below a treasure trove of record requests, photos, transcripts, videos, and more that I've gathered during my time in Berkeley.

Crime/Dispatch Codes/Common Terms + UCPD/BPD Officer Lists

Photographs/Videos

Public Record Requests


πŸ“° Raw OIS Footage πŸ“°

Berkeley PD Fatal Officer Involved Shooting - September 21st, 2023

Details are in the description of this YouTube video.


Berkeley PD Fatal Officer Involved Shooting - November 6th, 2023

Details are in the description of this YouTube video.


Oakland PD Officer Involved Shooting of Armed Carjacking Suspect - February 17, 2023

Details are in the description of this YouTube video.


Hayward PD Fatal Officer Involved Shooting - September 6th, 2023

Details are in the description of this YouTube video.



πŸ”§ System Technical Insights πŸ”

The @ScanBerkeley radio and transcription system relied on four open-source software tools and a combination of hardware to deliver its functionality.

  1. Trunk-Recorder: This tool was used to record each individual transmission sent over the Berkeley talk groups. It essentially captured all radio communications.

  2. Rdio-Scanner: To play each transmission as it came in and allow listeners to customize their experience, I used Rdio-Scanner. This gave users the ability to toggle and set the scanner according to their preferences.

  3. Trunk-Transcribe: After recording the transmissions, Trunk-Transcribe came into play. It processed these recorded files by running them through OpenAI's Whisper API, converting the audio content into text.

  4. Modified Version of crimeisdown-v3: Finally, a highly customized version of crimeisdown-v3 was utilized to showcase the transcriptions on a webpage and facilitate historical review.

  5. Unlike traditional scanners that save audio as a single file, in this system, each transmission was saved as its own file. This approach offered the flexibility for users to select what they wanted to listen to by simply clicking a button.


    Hardware Components


    1. SDRs (Software-Defined Radios): These are essential for receiving radio signals. We used 3x Nooelec RTL-SDR v5 Bundle, which you can find here.

    2. Raspberry Pi 4: The Raspberry Pi served as the central processing unit for Trunk-Recorder and Rdio-Scanner. It handled the recording and playback of radio transmissions. We used the Raspberry Pi 4, available here.

    It's worth noting that the Raspberry Pi 4 is a relatively modest machine for this task, and it's generally recommended to use a more robust system, such as an old desktop computer, if you plan to handle a larger volume of voice recorders (transmissions) simultaneously. While I did experience a system crash on one occasion due to excessive voice activity, in normal circumstances, it managed to handle all Berkeley channels without any issues.


    To ensure seamless operation, the entire setup was configured to run behind an NGINX proxy. This proxy served as the hosting platform for both the API and website systems, making them accessible within my local network.


    Hosted Frequencies


    DEC HEX Mode Alpha Tag Description Tag Group Priority
    2105 839 D Berkeley FD1 Fire Dispatch 1 Fire Dispatch Berkeley 1
    2106 83a D Berkeley FD2 Fire Dispatch 2 Fire Dispatch Berkeley 1
    2112 840 D Berkeley FD Emer Fire Emergency Emergency Ops Berkeley 1
    2671 a6f D ACFD Command 11 Command 11 - Berkeley Fire-Tac Alameda County Fire 1
    2672 a70 D ACFD Command 12 Command 12 - Berkeley Fire-Tac Alameda County Fire 1
    2691 a83 D ACFD Tac 31 Tac 31 - Berkeley Fire-Tac Alameda County Fire 1
    2692 a84 D ACFD Tac 32 Tac 32 - Berkeley Fire-Tac Alameda County Fire 1
    2711 a97 D ACFD Tac 51 Tac 51 - Berkeley Fire-Tac Alameda County Fire 1
    2712 a98 D ACFD Tac 52 Tac 52 - Berkeley Fire-Tac Alameda County Fire 1
    3105 c21 T Berkeley PD1 Police Dispatch Law Dispatch Berkeley 1
    3106 c22 T Berkeley PD2 Police Ch 2 Law Tac Berkeley 1
    3108 c24 T Berkeley PD4 Police Ch 4 Law Tac Berkeley 1
    3110 c26 T Berkeley PD6 Police Investigations 1 Law Tac Berkeley 1
    3605 e15 T UCB PD1 DSP Police Dispatch Law Dispatch UC Berkeley 1
    3606 e16 D UCB PD2 Police Ch 2 Law Tac UC Berkeley 1
    3608 e18 D UCB PD4 ENF Police Enforcement Law Tac UC Berkeley 1
    3609 e19 D UCB PD5 POLICE TAC Law Tac UC Berkeley 1

    However, please note that channels BPD3 (also known as RB1), BPD5, BPD7, and UCPD6 were not available as they were encrypted.


    Transcribe System Overview


    The transcription and historical site were hosted on a DigitalOcean droplet, utilizing Docker for containerization. The monthly cost for this setup was approximately $35.


    Audio storage was managed through Amazon Web Services (AWS) S3, where approximately 200,000 transmissions were stored over a few months. The cost for S3 storage varied but typically amounted to around $2 per month.


    Additionally, the transcription system employed OpenAI Whisper, incurring a cost of approximately $50 or more per month. It's worth noting that Whisper can also be run locally for free if you have access to an extra graphics card and other hardware.


    One valuable feature of the Transcribe system was its ability to send notifications to my phone and Slack in real-time. These notifications were triggered the moment a phrase matched my configuration file. This functionality allowed me to tune in instantly when a priority incident was detected.


    Embedded Photo

    I have made all the configuration files public, with API information redacted, on a GitHub repository. The repository also includes my extensively modified version of the transcription site. Although it's not a straightforward drag-and-drop setup and still requires other systems to be running first, it may significantly expedite the process if you ever decide to set up something similar. 😊

    Software Configuration Files