Skip to content

Clients ​

A client is one customer and the plan they bought: how much traffic, for how long, for how many users, on which interfaces. Each user of a plan gets a file of their own, with its own key and address on every interface the customer is on, and each file works on one device at a time.

The page refreshes itself every 3 seconds, and pauses while a form, a QR window or a confirmation is open.

For a reseller: Your account ​

A reseller sees a strip above everything else, with what they bought and what is left of it:

ItemWhat it shows
UsersUsers sold against the limit; each customer counts for the users their plan is for. Orange when the limit is reached.
Traffic leftWhat is left of the reseller's own allowance, which their customers spend between them. Orange from 80% used, red when spent.
Time leftDays until the reseller's term ends. Orange in the last week, red when it has ended.

When the reseller is switched off, their term has ended or their allowance is spent, a line under the strip says so and why. Their customers are paused until it is put right, and nothing can be added or changed meanwhile.

The summary card ​

Six figures, each with a coloured dot, two per row on a phone:

FigureCounts
ClientsEvery customer.
OnlineCustomers with traffic moving right now (see Online).
EndedCustomers out of data plus those past their date.
DepletingActive customers who have used 80% or more of their allowance: the moment to sell a renewal.
DisabledCustomers switched off by hand.
ActiveCustomers whose plan is running.

When no interface exists yet, a yellow notice says so, with a link to create one, and Add Clients stays greyed out until there is one. A reseller who has not been given any interface is told to ask the owner for one.

The toolbar ​

ControlWhat it does
Add ClientsOpens the client form. Once customers are ticked it is replaced by how many are selected, and its × clears the selection.
moreThe more menu. Its items depend on whether customers are selected.
DeleteShown only with customers selected: deletes them after a confirmation. Deleting five or more asks you to type how many.

The filter bar ​

ControlWhat it does
SearchMatches the name and the note, as you type.
FilterOpens the filter panel. A badge shows how many kinds of filter are on, and each shows as a chip under the bar; a chip's × removes just that filter.
SortOldest first (the default, so a customer keeps their place as others are added), Newest first, Recently updated, Recently online, Name A→Z, Name Z→A, Most traffic, Highest remaining, Expiring soonest.
Clear allShown while anything narrows the list: clears the search, every filter and the group filter at once.
shown of totalHow many customers the filters match, out of all of them.

Clicking a group chip in the table filters the list to that group.

Selecting across pages ​

Ticking the box in the table's header selects the customers on this page. When there are more, a line offers Select all N customers, or with a filter on, Select all N customers that match, which selects every one of them on every page. Changing the search or a filter afterwards clears such a selection, so an action never reaches customers you can no longer see.

The filter panel ​

Filter opens a side panel. Every part narrows the list together with the others; inside one part, several choices mean any of them.

PartNarrows to
StatusActive, Depleting, Out of data, Expired, Disabled, Online; tick any number.
ProtocolCustomers on WireGuard, OpenVPN, L2TP/IPsec, PPTP, IKEv2 or OpenConnect; tick any number.
InterfacesCustomers on any of the chosen interfaces.
GroupsCustomers in any of the chosen groups.
ExpiresAn end date from … to …; either end may be left open.
TrafficUsed traffic from … to … GB.
RenewsAll, renewing, or not renewing.
NoteAll, has a note, or has none.

Clear all in the panel clears it, and Done closes it.

The table ​

ColumnWhat it shows
☐Tick to select.
ActionsQR Code · Client Information · New keys and link · Reset Traffic · Edit · Delete, each described below.
EnabledA switch to turn the customer on or off. It cannot be switched while the plan has ended, out of data or expired, because the panel switched it off and more traffic or time is what brings it back; nor while the reseller who sold it is paused.
OnlineThe customer's state: Online (green, with a dot), Offline, Disabled, On hold (a plan waiting for its first connection), Depleting (80% used or more), Out of data, Expired, or Paused (their reseller is switched off or ran out; hover for why, and for what happens when the reseller is back). Hover any other state for when they were last online.
ClientThe name, a link to the customer's page; then connections in use now / users allowed, red when over; then the note.
GroupsShown when any group exists. The first group as a chip, and +N for the rest, named on hover. Click a chip to filter by it.
Attached interfacesThe first interface the customer is on, orange for OpenVPN, purple for L2TP/IPsec and gold for the rest, then +N for the others, named on hover.
TrafficUsed, a bar, and the allowance (∞ for none). Hover for upload ↑ and download ↓. The bar is green, orange from 80%, red when the allowance is used, grey while switched off, and a purple wash for an unlimited plan.
SpeedWhat the customer is moving right now, ↑ up / ↓ down per second, averaged over the last few seconds from the kernel's own counters. "—" while they move nothing. A customer on a node shows that node's last report, about every 20 seconds.
RemainingTraffic left: green, orange from 80% used, red when none is left, ∞ for an unlimited plan.
DurationTime left: green, orange in the last 3 days, red once passed, ∞ for no end date; hover for the exact date. A plan waiting for its first connection shows its length, such as 30d, in blue.

Below the table are the total, the pages and, past ten customers, the page size: 10, 25, 50, 100 or 200 per page, starting from Settings → Pagination Size.

On a phone ​

The table becomes a list of cards. Each card has the tick box, a coloured status dot, the name (a link to the customer's page), Ended or Depleting when it applies, ⓘ for Client Information, the switch, and ⋮ for QR Code, New keys and link, Reset Traffic, Edit and Delete. Below are the note, the traffic bar and, while they move something, the speed.

Online ​

A customer is online while one of their files has had traffic moving within the last 75 seconds, on any server. The panel looks every 2 seconds, so a device that connects shows within a few seconds. A WireGuard app with keepalive on sends something every 25 seconds, so an idle but connected phone stays online; one that has sent nothing for 75 seconds is offline.

Row actions ​

ActionWhat it does
QR CodeA window with the subscription link first, then one tab per interface. Inside an interface, pick the user, as buttons while there are few and as a list past four, to see their QR code; for a tunnel that signs in with a username, their sign-in too. Each code can be copied or saved as a picture.
Client InformationEverything about the customer in one window: status, switch, traffic, remaining, duration, groups, note, Telegram ID, subscription ID, users, attached interfaces, last online, when created and updated, the subscription link, and each user's file for every tunnel, to copy, download or show as a QR code. IP Log lists each file with its address inside the tunnel.
New keys and linkAfter a confirmation, issues the customer fresh credentials for every file, a new WireGuard key pair and preshared key and a new password for each sign-in, and a new subscription link. Whatever was copied, forwarded or sold on stops working within seconds, and the customer needs the new link. The addresses, file and user names, usernames, the plan and the usage are kept.
Reset TrafficSets the customer's used traffic back to zero. A customer cut off for running out is back at once.
EditOpens the client form for this customer.
DeleteDeletes the customer after a confirmation. Every file they hold stops working at once, their addresses go back to the pool, and their usage is gone. There is no undo.

The more menu ​

With nothing selected:

ItemWhat it does
Add BulkCreates many customers at once; see Add Bulk.
Export clientsDownloads every customer as a JSON file, wui-clients-DATE.json: names, notes, groups, allowances, usage, end dates, users, speed limits, renewal and state. It carries no keys; it records who was sold what.
Import clientsUse Choose a file for a file an export saved, or paste it, the whole file or just its list of customers, to create them again. Pick the interface they go on, and what to do with a name that already exists: skip it (the default, which leaves the customer here as they are), import it beside them with a number added, or replace that customer's plan while keeping their files. The result says how many were created, replaced, skipped and failed, and why for the ones that failed. Every customer it makes gets new keys, so files from the old server do not work here; give customers their new links. Usage is not carried over.
Reset all client trafficSets every customer's used traffic back to zero, after a confirmation.
Add or remove time / Add or remove trafficGreyed out, because they work on a selection. Tick customers first.
Delete depletedDeletes every customer who is out of data or past their date, after a confirmation that says how many.
Delete unattached clientsDeletes every customer who is on no interface at all.

With customers selected:

ItemWhat it does
Add servers to the usersAdds the interfaces you choose to every selected customer. Each gets a file per user on each new interface, and their link picks them up. Anyone it cannot be done for, because no addresses are left on that interface for example, is named with the reason.
Remove servers from the usersRemoves the interfaces you choose from every selected customer. A customer who would be left with no interface is refused and named.
Add to groupPuts every selected customer into a group: pick one or type a new name.
UngroupTakes every selected customer out of all groups.
Enable / DisableSwitches every selected customer on or off. A plan that has ended is cut off again within a tick: it needs more traffic or time, not the switch.
Add or remove timeSee Adding or removing time and traffic.
Add or remove trafficThe same, for traffic.
Set traffic limit and reset cycleSets one allowance, with its unit, and one renewal cycle on every selected customer. A field left blank is not changed.
Reset TrafficSets the used traffic of every selected customer back to zero, after a confirmation. Anyone out of data is back on.
New keys and linkNew keys and a new link for every selected customer, one after another. Five or more ask you to type how many. A customer that fails is named, and the rest are still done.
Sub linksEvery selected customer's subscription link, one per line, to copy. A customer whose link cannot be read is listed by name with a dash.

Adding or removing time and traffic ​

more → Add or remove time and more → Add or remove traffic change every selected customer at once. With nothing selected, nothing happens.

The window has Add / Take back and three fields: months, days, hours for time, where a month is 30 days and a day 24 hours, and TB, GB, MB for traffic, in 1024s as the panel shows sizes. As you type, the panel works out what will happen to exactly this selection and shows it before anything is applied: how many change, how many come back on, how many stop, and how many are left alone and why. Taking back from five or more asks you to type how many.

CustomerTimeTraffic
No end date / no traffic limitLeft as they areLeft as they are
RunningTheir own end date movesTheir allowance moves; what they used stays
Ended by dateTheir own end date moves: ended 5 days ago and given 2, still ended; ended a day ago and given 2, one more dayThe allowance moves; still ended by date
Out of trafficThe date moves; still out of trafficBack on when the new allowance is above what they used
Switched offGets it, stays offGets it, stays off
Starts on first connection, not connected yetLeft alone, unless Also customers who have not connected yet is ticked: then the plan gets longer, to the hour, and still starts on first connectionThe allowance moves
Taken backCan end a planStops at what the customer has used, never below it, and never at no limit

A reseller's selection reaches only their own customers.

The client form ​

Add Clients and ✎ open the same form, in three tabs. A value the server refuses is shown under its field, and the form switches to the tab that field is on. The ? beside a label explains it on hover.

Basics ​

For a new customer, Presets fill in the plan in one click: 30 GB · 30 days · 1 user, 50 GB · 30 days · 2 users, 100 GB · 30 days · 3 users, or 200 GB · 60 days · 3 users.

FieldWhat it isLimits
Name *The customer's name; ↻ draws a random one. Their files are named after it.Up to 64 characters in the form, no line breaks. Names need not be unique, but importing goes by name.
Data allowanceTraffic for the whole plan, across every interface, in MB, GB or TB.Empty or 0 is unlimited, on an edit too: clearing it removes the limit.
UsersHow many people the plan is for. Each gets a file of their own, and each file works on one device at a time. Raising it issues the missing files at once; lowering it removes the newest, so the oldest keeps working.0 to 50. Empty or 0 is one file with no device limit. A reseller with a user limit must give 1 or more.
Valid forHow long the plan runs from now, in hours, days or months.Empty or 0 never expires, on an edit too. Saving a value starts the countdown again from now.
On holdThe plan waits until the customer first connects, then runs for its length. The field above becomes Expire days: how long it runs once started.A plan that waits needs a length.
Speed limitA cap on the customer's download speed, in Mbit/s. Upload is not limited.0 is no limit.
RenewsNever, Daily, Weekly or Monthly. A plan that renews gets its traffic back each period; see Renewing plans.
Telegram IDThe customer's numeric Telegram user ID. With the bot on, they can ask it for their links and usage.0 is none.
Bale IDThe same for Bale: the customer's numeric Bale user ID, for the Bale bot.0 is none.
NoteAnything to remember about them; it is searchable.Up to 256 characters in the form.
GroupsLabels to sort customers by: a reseller, a region, a plan. Pick existing ones or type a new name.A customer can be in several.
Servers this customer can use *The interfaces the customer is on, with Select all and Clear all. Below it, how many addresses are left on the chosen interfaces.At least one. A reseller sees only the interfaces they were given.
EnabledOff creates the customer switched off, or keeps them off.

Credentials ​

FieldWhat it isLimits
Replace a user's keysEditing only. One line per user, with a button for each kind of file the customer holds: WireGuard, and OpenVPN, L2TP or PPTP when the customer is on such an interface. It issues that one user new credentials for that one kind of file, at once; their other files, the other users and the link are untouched. What the old file held stops working within seconds.
Sign-inShown when the customer is on a tunnel that signs in with a username and password: OpenVPN, L2TP/IPsec, IKEv2, OpenConnect or PPTP. its title names the kinds, such as OpenVPN login or OpenVPN / IKEv2 login. One row per user (User 1, User 2, …), each with a username and a password and ↻ to generate either. Empty fields are generated. On an edit the rows start with the current usernames, and a blank password keeps the current one. The same sign-in works on every such tunnel the customer is on, is carried inside that user's file where the protocol allows, and is shown on the subscription page, masked for L2TP, PPTP, IKEv2 and OpenConnect until a copy button fetches it.Username 3 to 48 characters of letters, digits and - _ . @, unique per interface, and two users cannot share one. Password 6 to 64 characters, no spaces; for L2TP, also no quotes, # or backslash.
Subscription IDThe secret part of the customer's subscription link. Type one to keep a link a customer already has, or ↻ for a new one. Changing it stops the old link.8 to 64 characters: letters, digits, - and _; unique.
DevicesEditing only: the files the customer holds. Extra files are added and removed on the customer's page.

With no tunnel that signs in by username, the tab says WireGuard devices sign in with the keys the panel makes for each device, and there is nothing to set.

For an existing customer: the subscription link, to copy or open. A new customer's link appears once the customer is created. When subscriptions are switched off in Settings, the tab says so.

The customer page ​

Click a customer's name to open their own page. It shows their state, traffic, allowance, users, renewal and end date, with Enable/Disable, Reset Traffic and Delete, and then their Devices: every file, with its address and when it was last seen.

  • Add issues an extra file with the name you give it, such as Phone or laptop, on every interface the customer is on. A customer can hold at most 64 files.
  • Each file can be downloaded, shown as a QR code for the app, or shown as text. The text carries the device's private key, so it stays hidden until you ask for it.
  • Removing a file stops it working at once. Its address goes back to the pool, and the customer keeps their other files.
  • Download all saves every file in one zip.

Add Bulk ​

more → Add Bulk creates up to 200 customers in one go, each with their own keys, files and subscription link, all on the same plan.

FieldWhat it is
Quantity1 to 200.
Name methodRandom: a random handle each. Prefix + number: your prefix with a running number from Start from (shop1 … shop50). Prefix + random + postfix: your prefix, a random handle and your postfix. An example of the first and last name is shown as you type. The prefix and postfix together are at most 48 characters.
The planData allowance, Users, Valid for or On hold, Speed limit, Renews, Groups, the interfaces and Enabled, as in the client form and the same for every customer created.

If one cannot be created, those made before it are kept, and the message says how many were.

Statuses ​

StatusMeaning
ActiveThe plan is running.
DisabledSwitched off by hand.
Out of dataThe allowance is used. The panel switches the customer off within a tick, and more traffic, a reset or a renewal brings them back at once.
ExpiredThe end date has passed. The panel switches the customer off within a tick, and more time brings them back at once.

Anything but Active has its files taken out of every server; nothing is deleted.

Renewing plans ​

A plan with Renews set to Daily, Weekly or Monthly gets its traffic back at the start of every period: what the customer used goes to zero, and a customer cut off for running out is back on at once. The allowance, the end date and the switch are not touched, so a plan that renews monthly and ends in three months renews twice and then ends. A switched-off customer's usage is renewed too, and they stay off.

Periods are counted from the last renewal or the last time the traffic was reset. Before the first, they count from when the plan started (its first connection, for a plan that waited) or was created. A renewal keeps the plan's own day: a plan sold on the 10th renews on the 10th, even if the panel was off that day, and the renewal is applied within a minute of it.

Start on first use ​

A plan can be sold as "30 days from the first connection" instead of a fixed date. Switch on On hold and give Expire days. Until the customer connects, the state reads On hold and the duration shows the days in blue. At the first connection the countdown begins and the end date appears.

Users and devices ​

A plan is for a number of users, one by default. Each user gets a file of their own, Roya.conf for a plan of one and Roya-user-1.conf, Roya-user-2.conf… for more, on every interface the customer is on, and each file works on one device at a time. A two-user plan is two one-user plans that share an allowance and an end date.

The limit is enforced live, across every server. Every 2 seconds the panel looks at which files have traffic moving and where it comes from. A file used from two places at once, its address flipping back and forth, is over its one device; more files live than the plan has users is over the plan. Either way, the newest is held off for two minutes: a WireGuard device is removed and comes back by itself when the hold ends, and a session on a tunnel that signs in is ended. A phone moving from Wi-Fi to mobile data changes address once and is not held. Behind a relay, where every device arrives from one address, the port the relay gives each connection tells them apart. The log says connection limit reached; device held off, with the customer, the file and until when.

Device files ​

A file is named after the customer: Hossein.conf or Hossein.ovpn for a customer with one, Hossein-laptop.conf when they hold several, in whatever script the name is written. A WireGuard app takes the tunnel's name from the file and allows 15 characters, so a .conf name is shortened to fit.

Sign-ins ​

OpenVPN, L2TP/IPsec, IKEv2, OpenConnect and PPTP sign in with a username and a password rather than a key, and each user of a plan signs in as themselves. The API takes the sign-ins as openvpnUsers: [{username, password}, …], in the plan's order of users; the older openvpnUsername / openvpnPassword pair still sets user 1.

New keys and link on a row replaces everything: every file and the subscription link. To replace one user's file on its own, use Replace a user's keys on the client form's Credentials tab. To change only where the files are fetched from, change the Subscription ID: that stops the old link, but a file that leaked keeps working until its keys are replaced.

From the API: POST /api/clients/{id}/rotate-keys, with accountIds to replace only the named files. A password that changes also ends the session that signed in with it, so the change takes effect now rather than at the next reconnect.

Released under the AGPL-3.0 License.