{"id":34183406,"url":"https://github.com/norasector/turbine","last_synced_at":"2026-03-11T11:35:02.547Z","repository":{"id":45821627,"uuid":"445761833","full_name":"norasector/turbine","owner":"norasector","description":"SDR software for capturing trunked radio systems","archived":false,"fork":false,"pushed_at":"2026-02-19T04:40:23.000Z","size":407,"stargazers_count":149,"open_issues_count":1,"forks_count":12,"subscribers_count":15,"default_branch":"master","last_synced_at":"2026-02-19T10:49:34.212Z","etag":null,"topics":["hackrf","op25","sdr"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/norasector.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-08T08:11:09.000Z","updated_at":"2026-02-18T07:45:47.000Z","dependencies_parsed_at":"2022-08-12T12:21:06.207Z","dependency_job_id":null,"html_url":"https://github.com/norasector/turbine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/norasector/turbine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norasector%2Fturbine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norasector%2Fturbine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norasector%2Fturbine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norasector%2Fturbine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/norasector","download_url":"https://codeload.github.com/norasector/turbine/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norasector%2Fturbine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30379908,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T06:09:32.197Z","status":"ssl_error","status_checked_at":"2026-03-11T06:09:17.086Z","response_time":84,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hackrf","op25","sdr"],"created_at":"2025-12-15T14:31:29.356Z","updated_at":"2026-03-11T11:35:02.542Z","avatar_url":"https://github.com/norasector.png","language":"Go","readme":"# turbine\n\nTurbine is the SDR software for [NoraSector](https://www.norasector.com/).  It's designed to capture and stream all frequencies in a trunked radio system.  It is capable of decoding multiple systems concurrently, even different system types, provided they all fall within the same sample bandwidth generated by the radio and there's enough CPU available.\n\nIt's built with the expectation that it uses a single SDR that is able to capture the bandwidth containing all frequencies in the system.\n\nFor instance, in the KCERS radio system, all frequencies fall within the 851-857MHz band.  Therefore, it uses a 8MSPS rate centered at 854MHz to capture 850-858MHz and thus all frequencies within that range can be processed.  SERS in Snohomish county also falls entirely within this range, and the antenna can pick it up, so it can also be processed in the same instance of the program.\n\nAll audio is encoded using the Opus codec for compatibility with WebRTC and output over UDP.\n\nTurbine borrows heavily from great projects such as [op25](https://osmocom.org/projects/op25/wiki) and [GNURadio](https://www.gnuradio.org/).  As these projects are licensed under the GPL, so too is Turbine, as it would be considered a derivative work.\n\nTurbine is designed to be run on ample hardware and radios.  NoraSector's production radio runs turbine on a dedicated Intel i7-11700k and it consumes approximately 60% of all cores.  It currently uses a HackRF one, but there should be no issue with any other SDR provided it outputs IQ samples at an adequate sample rate.\n\n## Dependencies\n\n* `libopus-dev`\n* `libopusfile-dev`\n* `libhackrf-dev`\n* `librtlsdr-dev` -- note that there is a RTLSDR driver, but it's mostly valuable for testing and debugging single frequencies.  Turbine doesn't support bonding multiple radios.\n\n## Building\n\n### Local\n\n```\ngo build -o bin/turbine ./cmd/turbine\n./bin/turbine turbine.yaml\n```\n\n### Docker\n\n```\ndocker build -t turbine .\n\n# Note that you must grant access to the device to Docker\n# The following command will run the container and grant access to the SDR\n\nDEVICE=$(lsusb | grep HackRF | awk '{printf \"/dev/bus/usb/%s/%s\",$2,substr($4, 1, length($4)-1)}');\ndocker run --network=host -v `pwd`/turbine.yaml:/app/turbine.yaml --rm --name turbine --device $DEVICE turbine\n```\n\n## Visualization server\n\nTurbine comes with a built-in visualization server, hosted at `:3333` by default.\n\nOnce running, navigate to `http://localhost:3333` to access it.  You can then view graphs of the DSP processing stages of each frequency being processed.\n\n![Screenshot of Turbine viz server](/images/viz-server.png)\n\nTo fit more graphs on the screen, just use Cmd/Ctrl+- to shrink down the size.\n\n\n## Output format\n\nThe output format is defined [here](https://github.com/norasector/turbine-common).  Audio is encoded as Opus audio frames and wrapped in a small envelope with metadata such as system_id and tgid and then marshaled as protobuf before sending over the wire.\n\n## Supported systems\n\n* Motorola SmartZone\n\n## TODO:\n\n* Finish porting P25 stuff\n* Factor out recording functionality into another binary\n* Figure out what to do with segdsp fork -- currently it's being overridden in the go.mod file","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnorasector%2Fturbine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnorasector%2Fturbine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnorasector%2Fturbine/lists"}