Files
forefront-wireless-portal/README.md
T

5.1 KiB
Raw Blame History

Forefront Wireless Customer Portal

Status: Scoped & Documented — awaiting build Started: July 25, 2026 Domain: my.forefrontwireless.com Companion project: IntelSight (shared auth — same Super Search/deepseek infra)

Self-service customer portal for Forefront Wireless, a WISP operating in Texas. Replaces or augments the existing Splynx customer portal with a modern, branded experience that directly consumes the Splynx API.


Architecture

┌─────────────────┐     ┌──────────────────┐     ┌────────────────────────┐
│  my.forefront    │────▶│  FastAPI backend  │────▶│  Splynx API v2.0       │
│  wireless.com    │     │  (api subdomain)  │     │  portal.forefront...   │
│  (React SPA)     │     │  Flask or FastAPI │     │  /api/2.0/             │
└─────────────────┘     └──────────────────┘     └────────────────────────┘
                                                        │
                                              ┌─────────▼──────────┐
                                              │  Splynx self-hosted │
                                              │  v4.2               │
                                              │  Forefront Wireless │
                                              └────────────────────┘

Stack: React SPA → FastAPI → Splynx API v2.0
Auth: Signature-based HMAC-SHA256 (nonce + key, secret-driven)
API Key: 5a8dc490716424f435306f2c18b4fdcb (full permissions)
Hosting: CloudPanel on app3 (same as other ITPP portals)


Splynx API — Proven Endpoints

Authentication

POST /api/2.0/admin/auth/tokens
Body: {"auth_type":"api_key","key":"...","nonce":<timestamp>,"signature":"..."}
→ Returns access_token (30-min expiry) + refresh_token

OR: Direct signature header (preferred for server-to-server)
Authorization: Splynx-EA (key=K&nonce=N&signature=S)
Nonce: round(microtime * 100) — hundredths of a second
Signature: strtoupper(hash_hmac('sha256', nonce . key, secret))

Working Endpoints

Method Path Description Status
GET /admin/customers/customer List all customers (43 total, 33 active)
GET /admin/customers/customer/{id} Single customer detail
GET /admin/customers/customer-internet-services/{customer_id} Services for customer
POST /admin/customers/customer-internet-services List with filters (needs customer_id in body) ⚠ 405 on GET
GET /admin/networking/routers All routers (5 CCR2004s)
GET /admin/tariffs/internet Internet plans (9 plans, $59.95$299.95)
GET /admin/finance/invoices Invoice list
GET /admin/finance/payments Payment records ⚠ untested
GET /admin/finance/transactions Transaction history ⚠ untested
GET /admin/support/tickets Support tickets ⚠ untested

Inventory Snapshot (July 2026)

Resource Count
Total customers 43
Active subscribers 33
Disabled accounts 9
Routers 5 × MikroTik CCR2004
Internet tariffs 9 plans

Portal Feature Ladder

V1 — Core Self-Service

  • Customer login (email + password, or magic link)
  • Dashboard: active services, current bill, data usage
  • View & pay invoices (Stripe integration)
  • Update contact info, phone, email
  • Change WiFi password (via MikroTik API → router)

V2 — Enhanced

  • Service upgrade/downgrade with proration
  • Support ticket submission & tracking
  • Outage notifications (SMS opt-in)
  • Referral program

V3 — Operational

  • Usage graphs (daily/weekly/monthly bandwidth)
  • Auto-pay setup
  • Seasonal hold / vacation pause
  • Equipment return workflow
  • Speed test integration

Splynx Quirks (Lessons Learned)

  1. Signature auth is required — Basic auth returns 401 unless "Unsecure access" is enabled on the key. Signature uses HMAC-SHA256 with a microtime nonce.
  2. Services need customer_id in URLGET /admin/customers/customer-internet-services/{id} works, but GET /admin/customers/customer-internet-services?customer_id=2 returns 405.
  3. Tariff names may need separate resolution — The list endpoint may return tariff IDs only; names require a follow-up call to /admin/tariffs/internet/{id}.
  4. Data shown is filtered — Only what the API key has permission for. Current key has full permissions.