Mobile App Overview
The ProxRad mobile app is a single React Native binary that ships on both iOS and Android stores. It speaks to your ProxPanel server using the same REST endpoints as the web portal — no separate API surface, no separate authentication, no mobile-only data path.
There are two user modes baked into the same install:
- Customer mode — end subscribers log in with the credentials their ISP gave them and see their plan, usage, invoices, WiFi controls, and support tickets.
- Admin / reseller mode — operators log in with their panel username and password and get a near-complete management surface: subscribers, NAS, CDN, bandwidth rules, prepaid cards, audit, settings, and more.
The app auto-detects which mode to enter from the user_type returned by /api/auth/login. There is no mode picker; what the user can do is determined entirely by their account type and permission group on the server.
How to get here
Section titled “How to get here”- Open the App Store (iOS) or Google Play (Android) and search for ProxRad.
- Tap Install. Bundle identifiers:
com.proxrad.proxpanelon both platforms. - Launch the app. On first run you’ll be asked for the server URL (e.g.
https://panel.example.com) — this is the same URL you use in a browser. - Enter your username and password. Customer accounts use the subscriber username (often
name@domain); admins and resellers use their panel login.
Architecture
Section titled “Architecture”┌──────────────────────┐ HTTPS / JSON ┌──────────────────────┐│ ProxRad mobile app │ ───────────────────────────▶│ ProxPanel backend ││ (React Native) │ │ (Go / Fiber) ││ │ ◀───────────────────────────│ ││ Auth store (Zustand)│ JWT (Authorization: ...) │ Same /api/* routes │└──────────────────────┘ │ as web portal │ └──────────────────────┘- Auth: identical JWT used by the web portal. Tokens are stored in
expo-secure-store. Logout blacklists the token server-side (see Authentication). - HTTP client: Axios with an interceptor that injects
Authorization: Bearer <token>on every request. - State: Zustand stores for
auth,branding(colors and logo fetched from the server), and feature-specific stores. - Offline: graceful — every screen handles
NetworkError. There is no offline write queue; this is a thin client, not a CRDT. - Push: not currently wired. Notifications are delivered server-side via WhatsApp / SMS / email (see Communication). A future release will add Expo push tokens.
Feature parity table
Section titled “Feature parity table”The mobile app does not replicate the entire web portal one-for-one. It covers the actions operators and customers actually take on a phone. Heavy bulk operations, system settings that require a CSV import, and the build / release tooling stay on the web.
Customer parity
| Feature | Web portal | Mobile app | Notes |
|---|---|---|---|
| Dashboard / live traffic | Yes | Yes | Polls /api/customer/live-traffic every 3 s on dashboard focus. |
| Daily / monthly usage | Yes | Yes | Includes expandable per-day session list. |
| Top-up data | Yes | Yes | Triggers same checkout flow. |
| Change service plan | Yes | Yes | Requires customer.can_change_service on the parent reseller. |
| WiFi (TR-069) | Yes | Yes | Read SSID, change SSID/password, reboot CPE. |
| Tickets | Yes | Yes | Create, reply, attach. |
| Account / password | Yes | Yes | Self-service password change. |
| Public IP (rent / release) | Yes | Yes | Calls the public IP billing service. |
| Parental controls | Yes | Yes | Sync with parental device sync. |
| Invoices (view + QR) | Yes | Yes | QR opens the public invoice URL. |
Admin / reseller parity
| Feature | Web portal | Mobile app | Added in |
|---|---|---|---|
| Subscribers (list, edit, bulk actions) | Yes | Yes | v1.0.0 |
| Live sessions | Yes | Yes | v1.0.0 |
| Tickets | Yes | Yes | v1.0.0 |
| Resellers + wallet | Yes | Yes | v1.0.0 |
| Reports | Yes | Yes | v1.0.3 |
| NAS / Routers | Yes | Yes | v1.0.3 |
| Bandwidth Rules | Yes | Yes | v1.0.3 |
| Sharing Detection | Yes | Yes | v1.0.3 |
| CDN | Yes | Yes | v1.0.3 |
| WAN Check | Yes | Yes | v1.0.3 |
| API Keys | Yes | Yes | v1.0.3 |
| Public IPs (inventory) | Yes | Yes | v1.0.3 |
| Audit logs | Yes | Yes | v1.0.4 |
| Permissions | Yes | Yes | v1.0.4 |
| Prepaid Cards | Yes | Yes | v1.0.4 |
| Backups | Yes | Yes | v1.0.4 |
| Communication Rules | Yes | Yes | v1.0.5 |
| Users / Resellers (CRUD) | Yes | Yes | v1.0.5 |
| Settings (read + edit) | Yes | Yes | v1.0.5 |
| CPE Devices (TR-069) | Yes | Yes | v1.0.5 |
| Build / Release (license server only) | Yes | No | — |
| Bulk CSV import | Yes | No | Web only. |
| Cluster HA setup | Yes | No | Web only. |
| Network configuration (netplan) | Yes | No | Web only — interactive. |
Version history (mobile)
Section titled “Version history (mobile)”App releases are tracked separately from the panel binary. The mobile binary is whatever Expo / EAS build is live on the store.
| Mobile version | Highlights |
|---|---|
| v1.0.5 | Live-traffic fallback fix when MikroTik torch is unavailable; customer WiFi and TopUp screens. |
| v1.0.4 | Live traffic widget on customer dashboard; GPS location for ticket geotag; audit, permissions, prepaid, and backups screens for admins. |
| v1.0.3 | First wave of admin screens: Bandwidth Rules, CDN, Sharing Detection, WAN Check, NAS, Reports, Public IPs. |
| v1.0.0 – v1.0.2 | Initial customer + basic admin (subscribers, sessions, tickets, resellers). |
How the app differs from the web portal
Section titled “How the app differs from the web portal”A few things behave differently because of platform constraints:
- Tables become cards. Wide data tables (subscribers, sessions) are rendered as stacked cards on mobile. The same fields are present, just laid out vertically.
- Bulk actions are limited to single-page selection. The web “select all 25,000 rows” affordance is intentionally absent — bulk-disconnect 25,000 subscribers from a phone is too dangerous.
- Server-side rendered PDFs open in the system viewer. Invoices, reports, and backup downloads are handed off to the OS instead of rendered inline.
- No background tasks. The app is purely foreground. If you put it in the background, you stop seeing live traffic updates until you bring it back.
Common workflows
Section titled “Common workflows””I just got the app — what should I do first?”
Section titled “”I just got the app — what should I do first?””- Install from the App Store / Google Play.
- Enter your panel URL (
https://panel.example.com) and your existing username + password. - If you’re an admin, glance at the Dashboard to confirm subscriber counts match the web portal — if they don’t, you’re pointed at the wrong server.
- Customers: tap the Usage tab and confirm today’s GB matches the customer portal.
”Can I let resellers use the app?”
Section titled “”Can I let resellers use the app?””Yes — resellers see the admin mode automatically. Their permission group still applies; a reseller without subscribers.delete won’t see a delete button in either the web portal or the mobile app. The permission system is enforced on the server, not in either client.
Permissions
Section titled “Permissions”The mobile app surfaces what the server allows. There are no mobile-only permissions; every action the app can take is a request the server already authorizes.
| User type | Default mobile capabilities |
|---|---|
| Customer | Their own dashboard, usage, WiFi, top-up, tickets, account, public IP. |
| Reseller | Subscribers list (scoped), services, sessions, tickets, transactions, wallet — same scope as their web view. |
| Admin | Full surface listed in the admin parity table. |
A reseller granted subscribers.view_all sees system-wide subscribers on mobile too. A read-only support reseller can see everything but their action buttons are hidden because they lack the corresponding *.edit / *.delete permissions.
Related pages
Section titled “Related pages”- Customer Features (Mobile) — full list of customer-mode screens with the API endpoint each one hits.
- Admin Features (Mobile) — full list of admin / reseller screens.
- Authentication — how the JWT used by the mobile app is issued and revoked.
- Branding — the logo and colors the app pulls from
/api/branding.