Integrations
Settings reference
/_authed/settings has five tabs: General, Network, SSH Banner, Subscription, System. Everything is staged into local state from api.settings.get() and applied together via Apply all settings (api.settings.save(f)), though several cards also have their own inline Save. SSH Banner has its own dedicated page.| Field | Meaning | Default | Effect |
|---|---|---|---|
| domain / port | Default host used for every protocol unless overridden; primary HTTPS port. | — | Panel cert is always a single-domain HTTP-01 challenge against this domain. |
| panelDataLimitGiB | Panel-wide traffic soft limit. | 0 (unmetered) | Raises a panel alert only; not an enforcement cap. |
| timezone | IANA timezone name. | UTC | Controls display of dates/expiry/logs/charts in the admin panel; storage stays UTC. Live preview via Intl.DateTimeFormat. |
| contactTelegram / contactWhatsapp | Contact links. | — | Shown to users on the public account status page and the panel's Build info header. |
| Official repository link | Source repo reference. | locked | Non-editable, shows a Locked badge — updates only via autoscript update against the official repo. |
| trialsEnabled | Enables free trial accounts. | off | One free account per Telegram user, auto-deleted at expiry. |
| trialDurationHours | Trial length. | 1 | How long a trial account remains active. |
| trialQuotaGb | Trial data cap. | 10 (0 = unlimited) | Data quota applied to trial accounts. |
Free trials card placement
The Free trials card is technically nested back under the General tab content in the source (appearing after SSH Banner content due to a duplicate
TabsContent value="general"), but it renders as part of General in the UI.| Field | Meaning | Default | Effect |
|---|---|---|---|
| directDomain / directPort | The single domain serving the panel, API, auth, and server functions with caching disabled. | directPort: 443 | This is the DNS-only (non-proxied) domain used for panel/API traffic. |
| Cloudflare API token | Zone → DNS → Edit scope token. | — | Used for automated DNS record management / cert issuance. Masked password input. |
| tlsPorts | Cloudflare-friendly TLS port set. | 443, 2053, 2083, 2087, 2096, 8443 | Multi-select list of ports usable for protocol endpoints proxied through Cloudflare (CDN). |
| plainPorts | Cloudflare-friendly plain-HTTP port set. | 80, 8080, 8880, 2052, 2082, 2086, 2095 | Multi-select list of ports for nTLS/plain endpoints. |
| autoSuspend | Automatic enforcement toggle. | — | Checked every 60 seconds; locks accounts past expiry or over quota. |
| ipLimitAction | IP limit enforcement policy. | — | warn = kill extra connections + Telegram warning only; suspend = instant lock on first violation; warning_suspend = N warnings then suspend. |
| ipLimitMaxWarnings | Warning count before suspend. | 2 (range 1–10) | Only used when ipLimitAction = warning_suspend. |
| ipLimitGraceTimeMins | Cooldown between counted strikes. | 60 (range 0–1440) | Prevents rapid repeated violations from over-counting. |
| ZIVPN obfuscation key | Rotate/view via ZivpnObfsCard. | — | Managed through getZivpnObfs / setZivpnObfs / rotateZivpnObfs in src/lib/zivpn-obfs-store. |
The IP Limit Enforcement Policy has its own Apply IP Policy button, which still calls the same underlying save mutation as the rest of Settings.
Controls the "one URL adapts to any client" subscription link feature — works with v2rayNG, Clash Meta, sing-box, Hiddify and similar clients via User-Agent sniffing.
| Field | Meaning | Default | Effect |
|---|---|---|---|
| subscriptionEnabled | Master switch for public subscription pages. | true | When off, every /sub/{token} link shows a friendly "disabled" notice instead of configs. |
| subscriptionTitle | Profile title shown to clients. | GRVPN | Cosmetic label in the subscription profile. |
| subscriptionUpdateHours | Update interval. | 12 (range 1–720) | How often clients are told to refetch the subscription. |
| subscriptionSupportUrl | Support link. | — | Optional support link shown on the subscription page. |
| subscriptionLandingUrl | Custom landing page. | — | Used instead of the built-in landing page when a user opens the sub link in a browser. |
| supportBotUsername / supportBotToken | Duplicated support-bot fields. | masked | The /sub page's Support button deep-links here; typing the literal word "clear" removes a saved token; empty reuses the main bot. |
| subscriptionPublicDomain / Port / Path | Dedicated subscription host. | port 443, path /sub | Serves /sub/{token} on a separate domain from the panel. |
| Generate certificate | api.settings.issueSubscriptionCert() | — | Requests a TLS cert for the public subscription domain; on failure the panel keeps serving the old domain (non-destructive). subscriptionCertStatus shows the last result/error. |
| subscriptionIncludeUsage | Header toggle. | true | Includes usage figures in the subscription header. |
| subscriptionIncludeExpiry | Header toggle. | true | Includes expiry date in the subscription header. |
| subscriptionShowRaw | Browser landing page toggle. | false | When off, browsers only see account info while VPN apps still import configs normally via the same link. |
Read-only system info
- Hostname / IPv4
- From api.system.status() (s?.hostname, s?.ipv4).
- DB path
- f.dbPath — location of the panel database.
- Agent address
- Hardcoded display 127.0.0.1:8088 — where the local Python agent process listens.
Change admin password
Current password + New password fields, submitted via api.settings.changePassword(current, next) — this is the credential used on the panel Login page. There is no other way to change this password in this codebase.
Other system controls
- Service restarts via
api.system.restartService(svc). - Xray version management via
api.xray.versions()/installNodeXrayVersion, including a bulk "Apply Xray version to all nodes" flow with per-node results and an admin notification on completion.
