An amateur radio logbook that automatically records every contact.
OpenHeard captures radio contacts from multiple sources—BrandMeister DMR network and analog repeaters—and assembles them into a structured log. Contacts populate automatically; operators only fill in what the machine cannot know.
Backend + daemon:
cd api && npm install && OPENHEARD_CONFIG=../openheard.config.json npm start
cd daemon && npm install && npm start -- --config ../openheard.config.jsonWeb UI + public page:
cd web && npm install && npm run dev
cd public && npm install && npm run devCopy api/openheard.config.example.json to openheard.config.json and configure it first.
| Source | What OpenHeard Captures | What Needs Human Input |
|---|---|---|
| Analog FM (repeater) | Time, duration, channel, whether you transmitted | Far station's callsign |
| DMR (BrandMeister) | Your transmission details (all fields), timestamp | Far station's callsign (from talkgroup query) |
| HF (future) | FT8 via WSJT-X UDP feed | SSB contacts (no automation) |
Contacts are clustered into conversations using measured silence thresholds (120 seconds for analog).
api/— Hono backend over SQLite, REST endpoints for web and daemondaemon/— Polling service for BrandMeister; SDR listener for analog 438.700; transcribes recordings (local whisper.cpp or a cloud API) to flag empty key-ups and suggest callsignsweb/— React 19 + Ant Design 6 admin interface- Listening: confirm, ignore or delete captured conversations, with transcripts and AI suggestions
- Log: search, ADIF import/export, QSL management
- Entry: quick manual logging
- Operations & Settings
public/— Lightweight public station page (no external dependencies)core/— Shared framework-free business logic and data models
The log stores every field required for LoTW (Logbook of The World):
- Frequency, mode, band, RST (both directions), grid square
- Plus: QTH, equipment, antenna, power, elevation
Fixed before code started (highest cost to change):
- Full LoTW compliance from day one
- React 19 + Ant Design 6 for the UI
- No native client—browser-based only
- Reuse existing tools (TQSL via CLI, DXCC libraries)
Run locally:
npm test # in api/, daemon/, web/
npm run verify # root: typecheck, tests, lint, builds, smoke testDeploy to production:
infra/install.sh # macOS LaunchAgent setupSee docs/deployment.md for details.
specs/openheard.md— Technical specificationdocs/admin-api-v1.md— Admin interface APIdocs/public-api-v1.md— Public page APIdocs/ingest-api-v1.md— Data capture APIdocs/configuration.md— Configuration referencedocs/deployment.md— Setup and deployment
AGPL-3.0 — See LICENSE
Modified copies run as a network service must offer source to users.
自动记录业余无线电通联的日志系统。支持 BrandMeister DMR 网络和模拟中继两个数据源。
api/— Hono 后端,使用 SQLitedaemon/— 轮询 BrandMeister,同时监听本地模拟信道 438.700,并识别录音(本机 whisper.cpp 或云端接口),标出空按,提示对方呼号web/— React 19 + Ant Design 6 管理界面public/— 轻量级公开展示页core/— 共享的业务逻辑
快速启动见上面的 Quick Start。完整文档在 docs/ 目录。
协议:AGPL-3.0