v1.18.0 — Real-Time Events & Community Voting

What's New

Community Voting

You can now vote on services to help others find the best ones. Every ham operator can upvote or downvote any service (except their own) using their APRS passcode for authentication:

POST /api/v1/registry/WXBOT/vote
{"callsign": "KM6LYW", "passcode": 12345, "vote": "up"}

Voting the same direction twice toggles the vote off. One vote per callsign per service — no ballot stuffing.

Trust Scores

Each service now has a trust score (0–100) computed from three components:

| Component | Weight | Source | |-----------|--------|--------| | Uptime | 50% | 30-day health check success rate | | Community votes | 30% | Normalized vote score (capped ±10) | | Age | 20% | Days registered / 180 (max 1.0) |

Query it at GET /api/v1/registry/{callsign}/trust.

Real-Time Events (SSE)

Connect to GET /api/v1/events with any EventSource client and receive push notifications as things happen:

  • service.registered — new service joined
  • service.updated — metadata changed
  • service.deleted — service removed
  • service.status_changed — health status transition (active→down, etc.)
  • health_check.completed — health check result
  • vote.cast — community vote cast/changed/removed

30-second keepalive heartbeats prevent connection drops. Max 10 concurrent connections per IP.

Rate Limits

To prevent abuse, write operations are now rate-limited per callsign:

  • Votes: 10 per hour per callsign + 30 requests/min per IP
  • SSE: Max 10 concurrent connections per IP
  • Slow consumers get dropped automatically (queue overflow protection)

Database Migration

Run alembic upgrade head to apply migration 0006 (adds the votes table). Existing services are unaffected — voting starts from zero for all.

← All posts