{"id":42317212,"url":"https://github.com/lfmanifesto/reticulumhf","last_synced_at":"2026-01-31T08:00:32.104Z","repository":{"id":320383604,"uuid":"1081886877","full_name":"LFManifesto/ReticulumHF","owner":"LFManifesto","description":"Encrypted communication over HF radio using the Reticulum Network Stack and FreeDV digital modes","archived":false,"fork":false,"pushed_at":"2026-01-27T22:24:23.000Z","size":120,"stargazers_count":41,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-01-27T22:43:31.326Z","etag":null,"topics":["amateur-radio","censorship-resistant","encryption","freedv","ham-radio","hf-radio","mesh-networking","off-grid","raspberry-pi","reticulum"],"latest_commit_sha":null,"homepage":"https://lightfightermanifesto.org","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LFManifesto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-23T12:38:02.000Z","updated_at":"2026-01-27T22:24:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"c5a3b212-da62-4e66-8cb4-e2242a24115c","html_url":"https://github.com/LFManifesto/ReticulumHF","commit_stats":null,"previous_names":["lfmanifesto/lfm-hf-reticulum","lfmanifesto/reticulumhf"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/LFManifesto/ReticulumHF","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LFManifesto%2FReticulumHF","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LFManifesto%2FReticulumHF/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LFManifesto%2FReticulumHF/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LFManifesto%2FReticulumHF/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LFManifesto","download_url":"https://codeload.github.com/LFManifesto/ReticulumHF/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LFManifesto%2FReticulumHF/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28934611,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T07:49:44.436Z","status":"ssl_error","status_checked_at":"2026-01-31T07:49:34.274Z","response_time":128,"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":["amateur-radio","censorship-resistant","encryption","freedv","ham-radio","hf-radio","mesh-networking","off-grid","raspberry-pi","reticulum"],"created_at":"2026-01-27T12:25:14.187Z","updated_at":"2026-01-31T08:00:32.099Z","avatar_url":"https://github.com/LFManifesto.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ReticulumHF\n\nReticulum over HF radio using FreeDV.\n\n## Overview\n\nRuns Reticulum over HF radio using FreeDV data modes. Provides encrypted peer-to-peer communication without internet infrastructure.\n\n**Supported FreeDV Modes:**\n| Mode | Bitrate | Use Case |\n|------|---------|----------|\n| DATAC1 | 290 bps | Default - robust for most HF conditions |\n| DATAC3 | 312 bps | Good conditions, slightly faster |\n| DATAC4 | 87 bps | Weak signals, emergency comms |\n\nTwo installation methods:\n- **Pre-built Image** - Flash and go. Web-based setup wizard with mode selection.\n- **Manual Installation** - Build everything yourself on existing Pi.\n\n## Pre-built Image\n\nDownload the SD card image, flash it, boot, configure via web portal.\n\n### Download\n\n[reticulumhf-20260126.img.xz](https://github.com/LFManifesto/ReticulumHF/releases/download/v2.0/reticulumhf-20260126.img.xz)\n\n### Setup\n\n1. Flash to SD card using [Raspberry Pi Imager](https://www.raspberrypi.com/software/) - select \"Use custom\"\n2. Insert SD card, connect radio via Digirig, power on\n3. Connect phone to WiFi: **ReticulumHF-Setup** (password: `reticulumhf`)\n4. Open **http://192.168.4.1** in browser\n5. Complete setup wizard - select radio model, verify audio levels\n6. In Sideband, add TCP interface: `192.168.4.1:4242`\n\n### What's Included\n\n- Raspberry Pi OS Bookworm Lite (64-bit)\n- RNS 1.1.3 with TCP server on port 4242\n- freedvtnc2 (FreeDV modem - supports DATAC1/DATAC3/DATAC4)\n- codec2 (built from source)\n- Hamlib rigctld with PTT support\n- Web portal with mode selection and service controls\n\n### Network\n\n| | |\n|---|---|\n| WiFi SSID | ReticulumHF-Setup |\n| WiFi Password | reticulumhf |\n| Gateway IP | 192.168.4.1 |\n| Sideband/NomadNet Port | 4242 |\n| MeshChat Port | 8001 |\n| SSH | pi / reticulumhf |\n\n### Client Connections\n\n**Sideband / NomadNet** (port 4242, no KISS framing):\n\n| Setting | Value |\n|---------|-------|\n| Host | 192.168.4.1 |\n| Port | 4242 |\n| Interface Type | TCP Client |\n\n**MeshChat** (port 8001, KISS framing required):\n\n| Setting | Value |\n|---------|-------|\n| Target Host | 192.168.4.1 |\n| Target Port | 8001 |\n| KISS Framing | YES |\n| Interface Mode | Full |\n\nBitrate by FreeDV mode (set in MeshChat):\n| Mode | Inferred Bitrate |\n|------|------------------|\n| DATAC1 | 290 |\n| DATAC3 | 312 |\n| DATAC4 | 87 |\n\n### Audio Tuning\n\n```bash\nssh pi@192.168.4.1\nalsamixer\n```\n\n- Press F6 to select USB audio device\n- Press F4 for capture view\n- Set capture 70-80%, playback 40-60%\n- Save: `sudo alsactl store`\n\n---\n\n## Manual Installation\n\nBuild everything from scratch on a fresh Raspberry Pi OS installation.\n\n### Test Results\n\nTested January 2026 with G90, FT-818, and truSDX.\n\n### Test Environment\n\n| Component | Specification |\n|-----------|---------------|\n| Computer | Raspberry Pi 4 (4GB) |\n| OS | Raspberry Pi OS Lite Bookworm 64-bit |\n| Radio | Xiegu G90, Yaesu FT-818, (tr)uSDX |\n| Interface | Digirig Mobile (CAT + Audio), Digirig Lite (Audio/VOX) |\n| Reticulum | 1.1.3 |\n| freedvtnc2 | 0.0.1 |\n| codec2 | Built from source |\n\n### FreeDV Mode Specifications\n\nFrom codec2 documentation (https://github.com/drowe67/codec2/blob/main/README_data.md):\n\n| Mode | Bitrate | RF BW | Payload | Frame Duration | Min SNR |\n|------|---------|-------|---------|----------------|---------|\n| DATAC1 | 290 bps | 1.7 kHz | 510 bytes | 4.18 sec | 5 dB |\n| DATAC3 | 312 bps | 1.7 kHz | 258 bytes | 2.06 sec | 8 dB |\n| DATAC4 | 87 bps | 500 Hz | 128 bytes | 5.17 sec | -2 dB |\n\n**DATAC1** is recommended for most conditions. Use **DATAC4** for emergency/weak signal work.\n\nRange depends on HF propagation (ionosphere, solar activity, time of day).\n\n### Architecture\n\n```\n+-------------+      +----------+      +-----------+\n|  NomadNet   |-----\u003e|Reticulum |-----\u003e|freedvtnc2 |\n|   (LXMF)    |      |  Stack   |      |   (TNC)   |\n+-------------+      +----------+      +-----------+\n                                             |\n                                             v\n                                       +---------+\n                                       | rigctld |\n                                       |  (PTT)  |\n                                       +---------+\n                                             |\n                                             v\n                                       +---------+\n                                       |Digirig  |\n                                       | Audio+  |\n                                       |  CAT    |\n                                       +---------+\n                                             |\n                                             v\n                                       +---------+\n                                       | G90 HF  |\n                                       |  Radio  |\n                                       +---------+\n```\n\nWork Flow:\n1. User writes message in client app (Sideband, NomadNet, MeshChat)\n2. Reticulum encrypts packet with recipient's public key\n3. freedvtnc2 modulates to FreeDV audio (DATAC1/DATAC3/DATAC4)\n4. rigctld keys radio via RTS (or VOX for audio-only interfaces)\n5. Audio transmits over HF, remote station decodes and delivers\n\n### Step 1: System Preparation\n\nFlash Raspberry Pi OS Lite (Bookworm, 64-bit). Enable SSH.\n\n```bash\nssh user@\u003cpi-ip-address\u003e\nsudo apt update \u0026\u0026 sudo apt upgrade -y\n```\n\n### Step 2: Install Dependencies\n\n```bash\nsudo apt install -y git build-essential cmake python3 python3-pip python3-venv \\\n    portaudio19-dev alsa-utils libhamlib-utils libhamlib-dev pipx\npipx ensurepath\nsource ~/.bashrc\n```\n\n### Step 3: Build Codec2\n\n```bash\ncd ~\ngit clone https://github.com/drowe67/codec2.git\ncd codec2\nmkdir build_linux \u0026\u0026 cd build_linux\ncmake ..\nmake\nsudo make install\nsudo ldconfig\n```\n\nVerify:\n```bash\nldconfig -p | grep codec2\n```\n\n### Step 4: Install Reticulum Stack\n\n```bash\npipx install rns\npipx install nomadnet\npipx install freedvtnc2\npipx runpip rns install numpy pyaudio scipy\npipx runpip nomadnet install numpy pyaudio scipy\n```\n\nInitialize Reticulum config:\n```bash\nrnsd --config ~/.reticulum \u0026\nsleep 3\npkill rnsd\n```\n\n### Step 5: Connect Hardware\n\n1. Connect Digirig to Pi via USB\n2. Connect Digirig audio cable to G90 ACC port\n3. Connect Digirig CAT cable to G90 CAT port\n4. Power on G90\n\n### Step 6: Verify Hardware\n\n```bash\n# Check USB devices\nlsusb\n# Expected: Silicon Labs CP210x (CAT) and C-Media CM108 (audio)\n\n# Check audio\narecord -l\n# Expected: USB PnP Sound Device\n\n# Check serial\nls -la /dev/ttyUSB*\n# Expected: /dev/ttyUSB0\n\n# Add user to dialout group\nsudo usermod -a -G dialout $USER\n# Log out and back in\n```\n\n### Step 7: Test Radio CAT\n\n```bash\nrigctl -m 3088 -r /dev/ttyUSB0 -s 19200 f\n```\n\nExpected: Returns current frequency (e.g., `7100000`).\n\n### Step 8: Configure G90 Audio Input\n\nOn the G90:\n1. Press FUNC\n2. Press POW until you see \"INPUT\"\n3. Use knob to select LINE (not MIC)\n\nSet ALSA levels (adjust card number as needed):\n```bash\namixer -c 3 sset 'Speaker' 64%\namixer -c 3 sset 'Mic',0 cap 75%\namixer -c 3 sset 'Mic' unmute\nsudo alsactl store\n```\n\n### Step 9: Configure Reticulum\n\nEdit `~/.reticulum/config`:\n\n```ini\n[reticulum]\n  enable_transport = no\n\n[interfaces]\n  [[Default Interface]]\n    type = AutoInterface\n    enabled = yes\n\n  [[FreeDV HF]]\n    type = TCPClientInterface\n    enabled = yes\n    target_host = 127.0.0.1\n    target_port = 8001\n    kiss_framing = yes\n```\n\n### Step 10: Start the Stack\n\nTerminal 1 - Start rigctld and freedvtnc2:\n```bash\nrigctld -m 3088 -r /dev/ttyUSB0 -s 19200 -t 4532 -P RTS \u0026\n\nfreedvtnc2 --input-device 1 --output-device 1 --mode DATAC1 \\\n    --rigctld-port 4532 --kiss-tcp-port 8001 --kiss-tcp-address 0.0.0.0 \\\n    --ptt-on-delay-ms 300 --ptt-off-delay-ms 200 --output-volume -3\n```\n\nTerminal 2 - Start NomadNet:\n```bash\nnomadnet\n```\n\n### Step 11: Test Transmission\n\nIn NomadNet:\n1. Select Network tab\n2. Send an announcement\n\nRadio should key up for 3-5 seconds and transmit.\n\n---\n\n## Troubleshooting\n\n### Hardware Verification\n\n```bash\nlsusb                      # List USB devices\narecord -l                 # List audio devices\nls -la /dev/ttyUSB*        # List serial ports\n```\n\n### CAT/PTT Test\n\n```bash\nrigctl -m 3088 -r /dev/ttyUSB0 -s 19200 T 1  # Key transmitter\nrigctl -m 3088 -r /dev/ttyUSB0 -s 19200 T 0  # Unkey transmitter\n```\n\n### Reticulum Status\n\n```bash\nrnstatus                        # Interface status\ntail -f ~/.reticulum/logfile    # Live log\n```\n\n### Common Issues\n\n**No /dev/ttyUSB0:**\n- Check USB cable connection\n- Verify Digirig is powered (LED lit)\n- Run `dmesg | tail` after plugging in\n\n**CAT command fails:**\n- Verify baud rate matches radio (G90 uses 19200)\n- Check user is in dialout group\n- Try `rigctl -m 3088 -r /dev/ttyUSB0 -s 19200 f`\n\n**No audio device:**\n- Run `arecord -l` to find device number\n- Adjust --input-device and --output-device in freedvtnc2 command\n\n**Radio not keying:**\n- Test PTT manually: `rigctl -m 3088 -r /dev/ttyUSB0 -s 19200 T 1`\n- Check G90 is in correct mode (USB-D for data)\n- Verify rigctld is running on port 4532\n\n**WiFi AP not visible (pre-built image):**\n- Wait 60 seconds after power on\n- Check Pi LEDs (solid green = booted)\n- Power cycle Pi\n\n**Sideband won't connect (pre-built image):**\n- Verify connected to ReticulumHF-Setup WiFi\n- Check rnsd running: `ssh pi@192.168.4.1 \"systemctl status reticulumhf-rnsd\"`\n- Verify port 4242: `ssh pi@192.168.4.1 \"ss -tlnp | grep 4242\"`\n\n## Verified Hardware\n\n| Component | Model | Notes |\n|-----------|-------|-------|\n| Computer | Raspberry Pi 4 (4GB) | |\n| Radio | Xiegu G90 | Hamlib 3088, PTT via RTS |\n| Radio | Yaesu FT-818 | Hamlib 1020 (use FT-817), PTT via RTS |\n| Radio | (tr)uSDX | VOX mode (no CAT PTT) |\n| Interface | Digirig Mobile | CAT + Audio |\n| Interface | Digirig Lite | Audio only (use VOX) |\n| Phone App | Sideband (Android) | Port 4242 |\n| Desktop App | MeshChat | Port 8001, KISS framing |\n\n## References\n\nSoftware:\n- Reticulum Manual: https://markqvist.github.io/Reticulum/manual/\n- codec2 Data Modes: https://github.com/drowe67/codec2/blob/main/README_data.md\n- freedvtnc2: https://github.com/xssfox/freedvtnc2\n- Sideband: https://github.com/markqvist/Sideband\n- MeshChat: https://github.com/liamcottle/meshtastic-meshchat\n- NomadNet: https://github.com/markqvist/NomadNet\n- Hamlib Supported Radios: https://github.com/Hamlib/Hamlib/wiki/Supported-Radios\n\nPropagation:\n- prop.kc2g.com: https://prop.kc2g.com/ - Real-time MUF/foF2 maps\n- VOACAP Online: https://www.voacap.com/hf/ - HF propagation prediction\n- HamQSL Solar Data: https://www.hamqsl.com/solar.html - Current solar indices\n\n## License\n\nMIT License - See LICENSE file\n\n## Author\n\nLight Fighter Manifesto L.L.C.\nhttps://lightfightermanifesto.org\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flfmanifesto%2Freticulumhf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flfmanifesto%2Freticulumhf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flfmanifesto%2Freticulumhf/lists"}