rfmux is the Python API for t0.technology's Control and Readout System (CRS), a hardware platform designed for operating large arrays of Kinetic Inductance Detectors (KIDs) used in radio astronomy and quantum sensing applications.
The CRS + MKIDs firmware is described in this conference proceedings.
New in 2025: rfmux is now available on PyPI. We recommend using uv for installation:
# Install uv (if not already installed)
$ curl -LsSf https://astral.sh/uv/install.sh | sh # Linux/macOS or WSL
# Or: powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # Windows
# Create virtual environment
uv venv ### or uv venv my-env-name
source .venv/bin/activate # On Windows: .venv/Scripts/activate
# or source my-env-name/bin/activate
# Install rfmux
$ uv pip install rfmuxNote: rfmux now uses a C++ extension for packet processing. PyPI hosts pre-built binaries (wheels) for common platforms (Linux x86_64, macOS, Windows). If wheels aren't available for your platform, you'll need a C++ compiler. See Installation Guide for details.
To launch the Periscope GUI, run:
$ uv run periscope # or periscopePeriscope_movie.mp4
If you do not have a CRS board (or cryogenic detectors) handy, you can use "mock" mode for a software emulation:
# Emulate CRS hardware for offline development
s = rfmux.load_session("""
!HardwareMap
- !flavour "rfmux.mock"
- !CRS { serial: "MOCK0001" }
""")To control a single network-attached CRS from your PC's Python prompt, use:
import rfmux
# Connect to a CRS board
s = rfmux.load_session('!HardwareMap [ !CRS { serial: "0033" } ]')
crs = s.query(rfmux.CRS).one()
await crs.resolve()
# Acquire samples
samples = await crs.get_samples(1000, channel=1, module=1)- Installation Guide - Detailed installation for all platforms, building from source
- Getting Started - Usage patterns, hardware hierarchy, common operations
- Networking Guide - UDP tuning, multicast configuration, troubleshooting
- Firmware Guide - Fetching, managing, and flashing firmware
rfmux/
├── docs/ # Documentation
├── firmware/ # Firmware binaries (Git LFS)
├── home/ # Jupyter Hub content (demos, docs)
├── rfmux/ # Main Python package
│ ├── algorithms/ # Network analysis, fitting, biasing
│ ├── core/ # Hardware schema, sessions, mock infrastructure
│ ├── packets/ # C++ packet receiver library
│ ├── tools/ # Periscope GUI and other tools
│ └── tuber/ # RPC/remote-object communication
└── test/ # Test suite (unit, integration, QC)
rfmux is permissively licensed; see LICENSE for details.
We actively encourage contributions and feedback. Understanding operator needs is how we determine what to add to rfmux.
- Pull Requests: Your contributions are welcome
- Issues: Please submit tickets for bugs or enhancement suggestions
- Collaborator Slack: Join #crs-collaboration - email Joshua@t0.technology with your name, affiliation, and project
When citing rfmux or CRS, please reference:
CRS + MKIDs Conference Proceedings: https://arxiv.org/abs/2406.16266