1xBTS is an experimental CDMA2000 1x base station and core-network stack implemented primarily in Rust. It includes BTS, BSC, MSC, HLR, SMSC, packet data, voice, SDR radio backends, and a web dashboard for development and operation.
This project is intended for research, interoperability testing, and lab use. Operate RF hardware only where you are authorized to transmit. You have been warned.
While CDMA2000 was a major technology in the US and some other places around the world, it was never as ubiquitious as other standards like GSM. Up until now there has never been a way to revive old CDMA2000 devices. I started this project to change that.
1xBTS is under active development. The current stack can run as a network-in-a-box process for local integration, or split BTS/BSC operation over the included Abis transport. Support varies by handset, radio backend, channel configuration, and service option.
Currently many things are working (SMS, Voice, Packet Data) and while they work there is still much work to be done for production hardening. It still is a lot of fun though.
The Rust workspace keeps first-party crates flat under crates/ and external
integration wrappers under external/:
crates/ - CDMA protocol, RAN, core-network, packet, voice, and tooling crates.external/ - SDR, SIP/native, and other outside-library wrapper crates.1xbts-web - Next.js dashboard backed by the management gRPC APIs.proto - protobuf service definitions.Full documentation lives at 1xbts.org/docs.
The stack implements the full 3GPP2 1x reference architecture, with each node running as its own process and communicating over standard reference points:
cdma-bts) - air-interface PHY/MAC, SDR-driven radio.cdma-bsc) - radio resource management; speaks Abis to the BTS.cdma-msc) - circuit-switched core; speaks A1 to the BSC.cdma-hlr) - subscriber database (PostgreSQL-backed).cdma-smsc) - short message service center.cdma-pcf) - packet control function; A8/A9 to BSC, A10/A11 to PDSN.cdma-pdsn) - packet data serving node, FoU/TUN packet path.cdma-voice-gw) - SIP gateway for voice calls.cdma-nib) - network-in-a-box launcher that runs the full stack in one process.At minimum:
docker compose up -d postgres starts a local 1xbts database on port 45432).protoc for protobuf code generation.pkg-config and a C compiler for native bindings.Optional radio and voice dependencies depend on enabled features and hardware: UHD/USRP, LimeSuite, SoapySDR, bladeRF, and Baresip libre/re.
Other SoapySDR-compatible devices may work but are not regularly exercised.
Clone, bring up the support services, and run the network-in-a-box:
git clone https://github.com/chrismoos/1xbts.git
cd 1xbts
docker compose up -d
# postgres :45432 · dashboard :3000 · fou-nat :17012
cargo run --release -p cdma-nib --no-default-features --features bladerf-backend -- \
--config-dir config \
--radio-config config/radio_bladerf_micro2.json
For headless development without RF hardware, swap the cargo invocation for
cargo run -p cdma-nib -- --config-dir config --null-radio to run the full stack
against a stubbed radio.
Default service ports are listed in docs/PORTS.md. If port 3000 is already in
use, set ONEXBTS_WEB_PORT, for example ONEXBTS_WEB_PORT=3001 docker compose up 1xbts-web.
Enable exactly one SDR backend at build time:
| System library | Hardware | Cargo feature |
|---|---|---|
libbladeRF |
bladeRF devices | --features bladerf-backend |
libuhd-dev |
USRP B200/B210 | --features uhd-backend |
liblimesuite-dev |
LimeSDR devices | --features lime-backend |
libsoapysdr-dev |
Generic SDR | generic SoapySDR path |
Run focused tests while developing:
cargo test -p cdma-bts
cargo test -p cdma-bsc
The dashboard ships in 1xbts-web (Next.js) and is started by docker compose up
above. To run it directly:
cd 1xbts-web
npm install
npm run dev
The main 1xBTS workspace is licensed under Apache-2.0. The SDR wrapper crates
under external/ (bladerf, bladerf-sys, limesuite, limesuite-sys, uhd,
uhd-sys) are dual-licensed MIT OR Apache-2.0; see the individual Cargo.toml
files for package-level license metadata.
The optional native Baresip libre/re dependency used by the SIP voice gateway is provided by the system and is distributed upstream under BSD-3-Clause terms.
$ claude mcp add 1xbts \
-- python -m otcore.mcp_server <graph>