SkillAgentSearch skills...

ZPTTLink

ZPTTLink is an open-source, cross-platform utility that connects Zello (running inside BlueStacks or Waydroid) to radio gateway hardware like the AIOC (All-In-One Cable). It enables seamless Push-to-Talk (PTT) control and audio routing between your computer and radio, creating a functional bridge between digital voice and RF communication.

Install / Use

/learn @maxhayim/ZPTTLink

README

<p align="center"> <img src="assets/logo.png" alt="ZPTTLink Logo" width="200"/> </p> <p align="center"> <strong>A full Zello ↔ radio gateway with deterministic PTT control</strong> </p> <p align="center"> <a href="https://www.python.org/"> <img src="https://img.shields.io/badge/Python-3.8%2B-blue" alt="Python Version"> </a> <a href="https://opensource.org/licenses/MIT"> <img src="https://img.shields.io/badge/License-MIT-green" alt="License"> </a> <img src="https://img.shields.io/badge/Platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey" alt="Platform"> </p> <h1>ZPTTLink</h1> <p>ZPTTLink is an open-source, cross-platform application that bridges Zello (running inside <a href="https://www.bluestacks.com/">BlueStacks</a> or <a href="https://waydro.id/">Waydroid</a>) with radio gateway hardware like the <a href="https://github.com/skuep/AIOC">AIOC (All-In-One Cable)</a>. It enables seamless Push-to-Talk (PTT) control and audio routing, allowing users to link RF radios to Zello using only a computer.</p> <p>This tool is ideal for GMRS and ham radio operators, emergency communications volunteers, and hobbyists who want to build a software-based radio gateway.</p> <h2>Signal Flow Overview</h2> <pre> ┌──────────────┐ │ Zello │ │ (BlueStacks /│ │ Waydroid) │ └──────┬───────┘ │ TX Audio │ RX Audio │ ┌──────▼───────┐ │ ZPTTLink │ │ (PC / Host) │ │ │ │ • Audio I/O │ │ • PTT Ctrl │ └──────┬───────┘ │ USB Audio │ USB PTT │ ┌──────▼───────┐ │ AIOC │ │ (or equiv.) │ └──────┬───────┘ │ RF TX / RX │ ┌──────▼───────┐ │ Radio │ └──────────────┘ </pre> <h2>Features</h2> <ul> <li>Compatible with AIOC, CM108-based, and other USB serial/audio radio cables</li> <li>Detects PTT signals via USB serial</li> <li>Simulates keypresses or mouse events to trigger Zello’s Push-to-Talk</li> <li>Cross-platform support for Windows, macOS, and Linux</li> <li><strong>Two operating modes:</strong> <ul> <li>Terminal (CLI) mode for lightweight deployments and automation</li> <li>Graphical user interface (GUI) for easy configuration and monitoring</li> </ul> </li> <li>Built-in GUI features include: <ul> <li>Serial device auto-refresh</li> <li>Audio device selector</li> <li>PTT indicator light</li> <li>Radio-style push-to-talk button</li> <li>Runtime start/stop controls</li> <li>Config editor with save button</li> </ul> </li> <li>Audio routing via <a href="https://vb-audio.com/Cable/">VB-Cable (Windows)</a>, <a href="https://existential.audio/blackhole/">BlackHole (macOS)</a>, or <a href="https://www.alsa-project.org/wiki/Loopback_Device">ALSA Loopback (Linux)</a></li> </ul> <h2>Requirements</h2> <ul> <li>AIOC or compatible USB PTT/audio interface</li> <li>Python 3.8 or newer</li> <li>Zello installed inside <a href="https://www.bluestacks.com/">BlueStacks</a> or <a href="https://waydro.id/">Waydroid</a></li> </ul> <h3>Python Dependencies</h3> <p>Install all dependencies with:</p> <pre><code>pip install -r requirements.txt </code></pre> <ul> <li><strong>Core:</strong> pyserial, pynput, sounddevice, numpy, loguru, platformdirs</li> <li><strong>Windows:</strong> pycaw</li> <li><strong>macOS:</strong> pyobjc</li> <li><strong>Linux:</strong> pulsectl, pyalsa</li> </ul> <h3>Linux Notes</h3> <ul> <li>ZPTTLink works with both <a href="https://www.alsa-project.org/wiki/Main_Page">ALSA</a> and <a href="https://www.freedesktop.org/wiki/Software/PulseAudio/">PulseAudio</a>.</li> <li>If your system uses <a href="https://pipewire.org/">PipeWire</a>, make sure the <strong>PulseAudio compatibility layer</strong> is enabled so <code>pulsectl</code> can function correctly.</li> <li>ALSA Loopback must be enabled for audio routing. See: <a href="https://www.alsa-project.org/wiki/Loopback_Device">ALSA Loopback Device</a>.</li> </ul> <h2>Installation and Setup</h2> <ol> <li>Install Python: <ul> <li><a href="https://www.python.org/downloads/windows">Windows</a></li> <li>macOS: Use Homebrew: <pre><code>brew install python</code></pre> </li> <li>Linux: Use your package manager (example for Debian/Ubuntu): <pre><code>sudo apt install python3 python3-venv</code></pre> </li> </ul> </li> <li>Install virtual audio driver (choose your OS above).</li> <li>Clone the repository: <pre><code>git clone https://github.com/maxhayim/ZPTTLink.git cd ZPTTLink</code></pre> </li> <li>Create and activate a virtual environment: <ul> <li>Windows: <pre><code>python -m venv venv venv\Scripts\activate</code></pre> </li> <li>macOS/Linux: <pre><code>python3 -m venv venv source venv/bin/activate</code></pre> </li> </ul> </li> <li>Install dependencies: <pre><code>pip install -r requirements.txt</code></pre> </li> </ol> <h2>Usage</h2> <h3>Terminal (CLI) Mode</h3> <ol> <li>Activate your virtual environment: <pre><code>source venv/bin/activate</code></pre> </li> <li>Run ZPTTLink in terminal mode: <pre><code>python -m zpttlink</code></pre> </li> <li>Available commands: <ul> <li><code>help</code> — Displays available commands and usage info</li> <li><code>q</code> or <code>quit</code> — Safely exits the program</li> </ul> </li> </ol> <h3>Graphical Interface (GUI)</h3> <p>ZPTTLink also includes a cross-platform graphical interface.</p> <pre><code>python -m zpttlink --gui</code></pre> <p>The GUI provides:</p> <ul> <li>Automatic detection of serial devices</li> <li>Audio input/output device selection</li> <li>PTT status indicator (Idle / RX / TX)</li> <li>Large radio-style PTT button</li> <li>Start/Stop runtime control</li> <li>Configuration editor with save functionality</li> </ul> <p>The GUI works on:</p> <ul> <li>Windows</li> <li>macOS</li> <li>Linux</li> <li>Raspberry Pi</li> </ul> <h2>How It Works</h2> <p>ZPTTLink listens to the USB serial signal from your radio cable. When activated, it simulates a keypress or mouse event to trigger Zello in BlueStacks or Waydroid. Audio from your radio is routed using the virtual audio driver, creating a seamless RF-to-Zello link.</p> <h2>License</h2>

This project is licensed under the MIT License.

See the LICENSE file for details.
Full license text: https://opensource.org/licenses/MIT

<h2>Contributing</h2> <p>Pull requests are welcome. Open an issue first to discuss ideas or report bugs.</p> <h2>Related Projects</h2> <ul> <li><a href="https://github.com/skuep/AIOC">AIOC – All-In-One Cable</a></li> <li><a href="https://github.com/ExistentialAudio/BlackHole">BlackHole (macOS)</a></li> <li><a href="https://github.com/alsa-project/alsa-utils">ALSA Utils / Loopback (Linux)</a></li> <li><a href="https://github.com/bluestacks">BlueStacks</a></li> <li><a href="https://github.com/waydroid">Waydroid</a></li> <li><a href="https://github.com/vb-audio-software">VB-Audio (VB-Cable)</a></li> </ul> <h2>Acknowledgments</h2> <p>Portions of this project are based on or inspired by the <a href="https://github.com/skuep/AIOC">AIOC (All-in-one-Cable)</a>.<br> Zello® for Android is a trademark of Zello Inc., Android™ is a trademark of Google LLC, and both are used here solely for interoperability purposes. All other trademarks are the property of their respective owners.</p>
View on GitHub
GitHub Stars10
CategoryDevelopment
Updated13d ago
Forks0

Languages

Python

Security Score

80/100

Audited on Mar 15, 2026

No findings