A full-featured DMR network server with web API, user management, and talkgroup administration.
- DMR Homebrew Protocol Support - Connect hotspots and repeaters
- User Registration & Approval - Admin approval required for new users
- Hotspot Authentication - Secure hotspot connections with database validation
- Talkgroup Management - Users can request talkgroups, admins approve
- RESTful API - Full API for web/mobile integration
- Parrot Functionality - TG 9990 echoes back transmissions
- SQLite Database - Lightweight, zero-config database
./pridedmr-serverThis starts:
- DMR server on port
62031 - API server on port
8080 - Creates
pridedmr.dbdatabase
- Username:
admin - Password:
admin - DMR ID:
999999
Register New User
POST /api/auth/register
{
"dmr_id": 3144613,
"username": "yourcall",
"password": "yourpassword",
"email": "your@email.com"
}Login
POST /api/auth/login
{
"username": "admin",
"password": "admin"
}
# Returns JWT tokenList All Users
GET /api/users
Authorization: Bearer <token>Approve User
PATCH /api/users/{id}/approve
Authorization: Bearer <token>Register Hotspot (Requires approved account)
POST /api/hotspots
Authorization: Bearer <token>
{
"callsign": "W1ABC",
"password": "hotspot_password"
}List My Hotspots
GET /api/hotspots
Authorization: Bearer <token>List Talkgroups (Public)
GET /api/talkgroupsRequest Talkgroup
POST /api/talkgroups/request
Authorization: Bearer <token>
{
"tg_number": 31000,
"name": "My Local TG",
"description": "Description here"
}Create Talkgroup (Admin Only)
POST /api/talkgroups
Authorization: Bearer <token>
{
"tg_number": 31000,
"name": "My TG",
"description": "Description"
}List Pending Requests (Admin Only)
GET /api/talkgroups/requests
Authorization: Bearer <token>Approve/Deny Request (Admin Only)
POST /api/talkgroups/requests/{id}/approve
POST /api/talkgroups/requests/{id}/deny
Authorization: Bearer <token>- Register - User creates account with DMR ID
- Wait for Approval - Account status: pending
- Admin Approves - Admin logs in and approves user
- Register Hotspot - User can now register hotspots with passwords
- Connect - Hotspot connects using DMR ID + password
- Request Talkgroups - User can request new talkgroups
- Admin Creates - Admin approves and creates talkgroups
- TG 9990 - Parrot (echoes back your transmission)
- DMR ID, username, password, email
- approved (boolean) - Must be true to connect
- is_admin (boolean) - Admin privileges
- Links to user, has callsign + password
- Tracks last seen IP and timestamp
- TG number, name, description
- Created by user ID
- Users request, admins approve/deny
- Hotspot sends RPTL (login) with DMR ID
- Server looks up DMR ID in database
- Server checks if user is approved
- Server sends RPTACK with challenge nonce
- Hotspot sends RPTK with SHA256(password + nonce)
- Server verifies against stored hotspot password
- If valid and user approved → authentication succeeds
- Passwords hashed with bcrypt
- JWT tokens for API authentication (24hr expiry)
- Hotspot authentication uses challenge-response
- Only approved users can transmit
- Admin-only endpoints protected
Built with:
- Go 1.23.4
- SQLite3
- JWT (golang-jwt/jwt)
- Gorilla Mux (routing)
- bcrypt (password hashing)
- Build
pridedmr-webadmin interface - Add network statistics API
- Add live call monitoring
- Build public website
MIT License