PrideDMR

Amateur DMR network server with web administration

PrideDMR Server

A full-featured DMR network server with web API, user management, and talkgroup administration.

Features

  • 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

Quick Start

1. Start the Server

./pridedmr-server

This starts:

  • DMR server on port 62031
  • API server on port 8080
  • Creates pridedmr.db database

2. Default Admin Account

  • Username: admin
  • Password: admin
  • DMR ID: 999999

API Endpoints

Authentication

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 token

User Management (Admin Only)

List All Users

GET /api/users
Authorization: Bearer <token>

Approve User

PATCH /api/users/{id}/approve
Authorization: Bearer <token>

Hotspot Management

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>

Talkgroup Management

List Talkgroups (Public)

GET /api/talkgroups

Request 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>

User Workflow

  1. Register - User creates account with DMR ID
  2. Wait for Approval - Account status: pending
  3. Admin Approves - Admin logs in and approves user
  4. Register Hotspot - User can now register hotspots with passwords
  5. Connect - Hotspot connects using DMR ID + password
  6. Request Talkgroups - User can request new talkgroups
  7. Admin Creates - Admin approves and creates talkgroups

Special Talkgroups

  • TG 9990 - Parrot (echoes back your transmission)

Database Schema

users

  • DMR ID, username, password, email
  • approved (boolean) - Must be true to connect
  • is_admin (boolean) - Admin privileges

hotspots

  • Links to user, has callsign + password
  • Tracks last seen IP and timestamp

talkgroups

  • TG number, name, description
  • Created by user ID

talkgroup_requests

  • Users request, admins approve/deny

Authentication Flow

  1. Hotspot sends RPTL (login) with DMR ID
  2. Server looks up DMR ID in database
  3. Server checks if user is approved
  4. Server sends RPTACK with challenge nonce
  5. Hotspot sends RPTK with SHA256(password + nonce)
  6. Server verifies against stored hotspot password
  7. If valid and user approved → authentication succeeds

Security

  • 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

Development

Built with:

  • Go 1.23.4
  • SQLite3
  • JWT (golang-jwt/jwt)
  • Gorilla Mux (routing)
  • bcrypt (password hashing)

Next Steps

  • Build pridedmr-web admin interface
  • Add network statistics API
  • Add live call monitoring
  • Build public website

License

MIT License