Features & Capabilities

Modern Point of Presence management platform for global amateur radio networking

What You Can Do

Connect Globally

Multiple Points of Presence worldwide:

  • Choose your preferred region
  • Distributed edge locations
  • North America, Europe, and beyond
  • Low-latency connections
  • Geographic redundancy
Create Network Tunnels

Set up WireGuard tunnels in minutes:

  • Point-and-click tunnel creation
  • Automatic key generation
  • QR codes for mobile devices
  • Ready-to-use configuration files
  • Connect from anywhere globally
Get Public IP Addresses

Request and manage IP allocations:

  • IPv4 address blocks
  • Subnet allocation (/29 to /25)
  • Instant approval for small allocations
  • Public, routable IP addresses
  • Bring Your Own IP (BYOIP) support
Easy Configuration Export

Download configs for your platform:

  • One-click config generation
  • Many platform formats supported
  • Copy-paste ready configurations
  • DHCP server configs included for additionally Routed IP's
  • BGP routing configurations

Technical Features

Multi-Platform WireGuard Support

Generate configurations for 9+ platforms:

  • EdgeRouter (Ubiquiti)
  • MikroTik RouterOS
  • OpenWrt
  • pfSense/OPNsense
  • Linux (systemd-networkd)
  • Linux Network Namespaces
  • macOS
  • Docker containers
  • Mobile (QR codes for iOS/Android)
Advanced Routing

Sophisticated routing capabilities:

  • BGP dynamic routing with ASN management
  • Static route configuration
  • Subnet allocation management
  • IPv4 and IPv6 dual-stack support
Security & Access Control

Enterprise-grade security features:

  • Role-based access control (Admin, Operator, User)
  • WireGuard key regeneration
  • Email verification and password resets
  • OIDC/OAuth integration support
  • CSRF protection
  • Audit event logging
User Management

Comprehensive user administration:

  • User quotas and resource limits
  • Self-service network requests
  • Request approval workflows
  • Auto-approval for qualifying requests
  • API key management for automation
  • Timezone-aware displays
Infrastructure Organization

Hierarchical resource management:

  • Node groups for logical organization
  • Nodes (physical/virtual servers)
  • Interfaces (WireGuard, Loopback, Interconnect)
  • Network allocation and subnetting
  • ASN assignment and tracking
Automation & Integration

Built for automation:

  • RESTful API (v1 and legacy)
  • Email notifications with templates
  • Automated configuration generation
  • DHCP server configurations for Additionally routed prefixes
  • Self-installing setup scripts

Changelog

  • New signup growth, monthly, deleted-account and region stats - 2026-06-16
    Add a cumulative signup growth chart with shareable event annotations and PNG/PDF export, a monthly signup breakdown, tunnels-by-region, and a deleted-accounts residual-data view.
  • New bandwidth consumption analytics - 2026-06-16
    Show top bandwidth consumers, average and median transfer per active user, average tunnels per user, and the tunnel activity rate.
  • New IP and CIDR owner lookup - 2026-06-16
    Look up any IP or CIDR to find its owner — user allocation, tunnel, or infrastructure — with the full chain of containing networks.
  • New unassociated-allocation and free address-range views - 2026-06-16
    List allocations claimed but not routed to any tunnel, and drill into a pool's remaining free address ranges.
  • New allocation-size breakdown with drill-down and IP map - 2026-06-16
    Break down user allocations by prefix size (infrastructure excluded), drill into each size to its owners, and view a block's addresses colour-coded by tunnel state.
  • New human-readable transfer sizes in system stats - 2026-06-16
    Render transfer in binary units (KB/MB/GB/TB) instead of always TB, which collapsed small values to "0.0 TB".
  • New system stats plugin (admin dashboard + charts) - 2026-06-03
    First plugin on the new plugin framework: an admin-gated System Stats dashboard at /admin/stats with at-a-glance metrics — users, tunnels, per-node lifetime transfer, IP pool utilization, signups/tunnels per-day charts, ASNs, and pending requests. Pure-query service layer; the Insights nav link is contributed via the slot; auto-discovered with no core edits.
  • Build package plugin templates and static assets - 2026-06-17
    Add a universal package-data glob so every plugin's templates and static files are included in built distributions.
  • Fix don't 500 local login for accounts with no local password (OIDC) - 2026-06-03
    validate_and_login() dereferenced user.password without a None check, so an account with no local password (e.g. OIDC-provisioned) raised AttributeError and returned HTTP 500 on the login form. Guard for a missing local password so it returns the standard invalid-credentials response instead. OIDC login is unaffected — it never calls validate_and_login().
  • New plugin framework with slot-based nav/widgets and hands-off discovery - 2026-06-03
    Adds a Plugin base class, a registry that aggregates nav items, dashboard widgets, settings and CSP directives, and a loader that auto-discovers in-tree drop-in plugins and entry-point packages. Sidebar and dashboard expose slots; with no plugins installed the app behaves identically. Includes an authoring README.
  • Enhancement regenerate changelog - 2026-06-03
  • New hide exhausted Connect IP pools from the request list - 2026-06-03
    Pools with no allocatable subnet size are filtered out of the Request a Network page. Availability is computed live from current allocations via Network.has_available_space, so a pool reappears automatically once a user returns IPs to it.

  • CI/CD Add GitLab deploy pipeline (auto dev, manual prod gate) - 2026-05-28
  • Fix Correct sort order of requests and audit events - 2026-05-28
  • Fix Use forward references for self-referential Network annotations - 2026-05-28
    list[Network] in effective_depth() and owned_subnetworks evaluated the bare Network name at class-definition time, raising NameError on import under Python 3.11 and breaking the test-during-build (pybuild --test). Quote them as string forward references so they resolve lazily.
  • Fix Send config email when notify checkbox is ticked on tunnel edit - 2026-05-25
    update_client() never read the notify form field, so editing a tunnel and ticking "send config email" silently did nothing. Mirror the existing block from create_client() so the same notify_new_client() call runs on edit.
  • Fix Request URL is incorrect on admin notices about comments - 2026-05-17
    This modifies the new comment email notices:
  • New Sortable Transfer (rx/tx), Allocations/Routed, and other list columns - 2026-05-06
    Adds hybrid_property sort columns on Client and enables new sortable columns on Client / Asn / Tunnel / Interface lists.
  • Fix Match list-view sortable column names to actual DB columns - 2026-05-06
    The data-column attributes on sortable headers were originally chosen for client-side sort matching against row data-* attrs. With the new server-side sort flow they need to map to real DB column names so the framework can resolve them.
  • New Server-side search and sort framework for paginated list views - 2026-05-06
    Adds polymorphic-aware server-side search and sort to the generic admin list view, with PG16-compatible nocase handling via COLLATE("C") override. Models opt in via SEARCHABLE_COLUMNS class attribute.
  • Fix Fix authentication by API key - 2026-05-04
    Prevents the error about session being unavailable on request.
  • Fix Fix network display - 2026-05-03
    - Correctly indent networks based on the visual hierarchy - Remove disabling of parent networks on routed subnet selection screen
  • Fix Resolve issues with pagination (Resolves #55) - 2026-05-03
    - Adds a flag on the model to indicate the list view uses pagination, enabling first-load pagination support - Performs pagination at the database level, removing the need to load all resources in memory before pagination - Adds pagination to the Requests list view
  • Fix Resolve hangs when IPv6 addresses are in use - 2026-05-03

  • New Add ASN verification card to admin request view - 2026-04-28
    Pull authoritative ASN registration from RDAP and surface match indicators (email match, callsign match) against the requesting user so ticket handlers have decision-support when reviewing ASN requests.
  • Fix Order request comments chronologically - 2026-04-22
    The comments relationship had no order_by clause so SQLAlchemy returned comments in UUID primary-key order, which is effectively random. Sort by created_at so the conversation reads oldest-first (newest comment closest to the Add Comment box).
  • Fix Show request owner's username as plain text for ticket handlers - 2026-04-22
    The request header linked the username to the admin user view, which ticket handlers can't access. Wrap the link in a role check so only administrators and superadmins see the clickable link; ticket handlers see plain text instead of a link that 404s.
  • New Add tunnels section to user resources card and turn summary badges into collapse toggles - 2026-04-22
    Tunnels show each tunnel's status and attached networks (direct addresses vs. subnets routed via static or BGP, with the ASN highlighted). Summary badges are now the collapse toggles for the detail tables, with a rotating chevron to signal state.
  • Fix Surface timezone notifications where the dropdown can't cover them - 2026-04-20
    Swap the top-right toast for the top-center Bootstrap alert pattern already used elsewhere in the app so the success/error notification is not hidden behind the timezone select's own dropdown.
  • Fix Save profile timezone immediately when the select changes - 2026-04-20
    The profile form's timezone select had no change handler, so picking a different timezone did nothing until the form was submitted (and there is no dedicated save button for it). Wire the existing TimezoneManager.changeTimezone() into a change listener on #timezone so the new value is POSTed to /account/api/timezone as soon as the user picks an option, matching the "save on change" behaviour intended by the API endpoint.
  • Fix Exclude user sub-allocations from network counting - 2026-04-15
    Route all quota and resource counting through User.resource_count so consumers never special-case network vs other kinds, and apply the same filter to the Networks list header, dashboard stats, admin user menu counts, request creation handlers, and the quota_impact macro so users and handlers see a consistent allocation count everywhere.
  • New Show user resources on admin request view - 2026-04-15
    Add a "User Resources" card to the request view page summarising the requester's existing networks, ASNs, tunnels, and pending requests with quota-aware badges, so administrators and ticket handlers can see what the requester already has before approving. Adds Network.is_top_level and User.top_level_networks/resource_count so the card excludes sub-allocations the user carved out of their own top-level allocations from both counts and the displayed list.
  • New Add download button for tunnel configuration files - 2026-04-15
    Add a Download button next to Copy to Clipboard on the tunnel view page so users can save text configs directly as files.
  • New Add version management, pyproject.toml, and changelog automation - 2026-04-09
    - Add VERSION file (semver, manual bump) as single source of truth - Add pyproject.toml with full PEP 621 metadata, simplify setup.py to shim - Move CHANGELOG_DATA.txt install from /etc/ to /usr/share/pop-controld/ - Use absolute path in features.py for reliable changelog reading - Update generate_changelog.py: group by month+author with branch creator attribution - Update debian/control with proper Maintainer/Uploaders format - Update debian/rules to read version from VERSION file - Add MANIFEST.in to include VERSION in sdist builds - Add .git check in Makefile before running changelog generation
  • New Make Terms of Service URL configurable via admin config - 2026-04-02
  • Enhancement Add alembic.ini for database migrations - 2026-04-01

  • New Add status to dynamic routing - 2026-03-21

  • New add per-user rate limiting for request creation endpoints - 2026-01-23
    - Add LIMIT_REQUEST_CREATION constant (10 per hour, configurable) - Add get_current_user_id() for per-user rate limiting (fairer for shared IPs) - Apply rate limiting to UI routes: network_allocate, network_existing, asn - Apply rate limiting to API routes: request_asn, request_network_existing, request_network_allocation
  • New make auth token expiry configurable - 2026-01-13
    Add [security] section to config with auth_token_expiry_hours setting. Centralize default in __init__.py using read_dict(). Templates read from config to display correct expiry time.
  • Fix reduce token expiry from 48h to 24h - 2026-01-13
  • New add security response headers - 2026-01-14
  • Fix remove traceback printing from API error handler - 2026-01-14
  • Fix use allow list for dynamic query parameter filtering - 2026-01-13
  • New add audit logging for authentication events - 2026-01-14
  • Fix add CSRF token to timezone API call - 2026-01-13
  • Fix use session for API key token instead of URL - 2026-01-13
  • Fix add null check in api_load_user - 2026-01-13
  • Fix add @login_required to /delete route - 2026-01-13
  • Fix validate redirect URL after login - 2026-01-13
  • New use gunicorn in dev script for HUP reload support - 2026-01-07
  • Documentation add comprehensive README with development guide - 2026-01-06
  • Fix MR !41 feedback - IPv6 /128 allocation and skip_ssl_verification config - 2026-01-06
    - Fixed IPv6 allocation back to /128 (was incorrectly changed to /64) - Added skip_ssl_verification config option for OIDC - SSL verification only skipped when BOTH debug=True AND skip_ssl_verification=True - Set debug=False in example config (production default)
  • Fix set debug=False as secure default - 2026-01-07

  • Enhancement Update changelog for December 2025 - 2025-12-18
  • Uncategorized chore(packaging): Simplify dependencies and add graceful reload - 2025-12-18
    - Simplify debian package dependencies (remove -dev packages) - Add ExecReload to systemd service for graceful worker reload - Use HUP signal to reload without dropping connections
  • New feat(server): Improve error handling and debug mode support - 2025-12-18
    Backend improvements for better development experience and error handling:
  • New feat(ui): Improve tunnel and ASN form templates - 2025-12-18
    Enhancements to model forms and list views:

Ready to get started?