Client Dashboard Setup
Enable the optional customer portal: let your customers sign in to view their licenses, download builds, and redeem keys.
The client dashboard is an optional paid add‑on: a portal for your customers, separate from the admin dashboard. They sign in with their own account and see only their own licenses, download the builds they're entitled to, and redeem keys. This guide gets it running.
The client dashboard is a paid add‑on ($3.99). Your Kora license must include the Client Dashboard add‑on, or Kora skips it on startup. Step 1 below covers buying and claiming it. It's a standalone add‑on and does not require the admin Dashboard add‑on.
This guide reuses the sign‑in setup from the Dashboard Setup Guide. If you've already set up the admin dashboard, most of the auth work is done, and step 4 only adds one redirect URL per provider.
1. Claim the add-on
- Buy the Client Dashboard add‑on ($3.99) on the BuiltByBit page.
- In the Zero Development Discord, go to the
「🤖」commandschannel and run/claimto apply the add‑on to your license key.
Your license now includes the Client Dashboard add‑on, so Kora can download and run it.
2. Download the client dashboard
The files are delivered automatically. In config/config.json, make sure KORA.AUTO_UPDATE is set
to true, then restart Kora. On startup Kora downloads the client dashboard for you (only if your
license includes the add‑on). You'll see it fetch the files in the console.
3. Turn it on
The client dashboard is configured under its own top‑level CLIENT_DASHBOARD section in
config/config.json (it sits alongside KORA, DASHBOARD, and AUTHENTICATION, not inside them):
ENABLE:true.PORT: the port it runs on (default3002). It must differ fromKORA.PORTandDASHBOARD.PORT; Kora refuses to start if two of them collide.URL: the public address customers use to reach it (must match the redirect URLs in step 4).
4. Set up sign-in
The client dashboard shares the top‑level AUTHENTICATION section with the admin dashboard, so it
uses the same OAuth apps, email/password toggle, and SMTP. You don't configure a second set of
credentials.
ADMINS does not apply here. That list only gates the admin dashboard. Any customer can create an
account and sign in to the client dashboard, and each one sees only the licenses tied to their own
account. That's the point of the portal, so leave it to self‑serve.
Because it reuses the same OAuth apps but runs on a different URL, add the client dashboard's redirect
URL alongside the admin dashboard's in each provider you use (swap in your client dashboard's
public URL):
In the Discord Developer Portal, open your existing app's
OAuth2 → Redirects and add <YOUR CLIENT DASHBOARD URL>/api/auth/callback/discord.
No OAuth apps set up yet? Follow the provider steps in the
Dashboard Setup Guide to create them, and add both the
admin and client dashboard redirect URLs (Discord and Google allow several; GitHub is limited to one, as
above). Email and password and magic links work the same way:
AUTHENTICATION.EMAIL_PASSWORD turns password sign‑in on, and filling in SMTP enables magic
sign‑in links and password resets.
5. Let customers redeem keys (optional)
Set CLIENT_DASHBOARD.REDEEM_PAGE to true to add a page where a customer can paste a redeem code
and attach the license to their own account. This uses the BuiltByBit unclaimed-key claim flow, so it
needs the BuiltByBit extension with keys issued in
unclaimed-key mode. Leave it false if you don't hand out redeem codes.
6. Restart Kora
Restart Kora to apply the changes. The first time the client dashboard starts, Kora installs its dependencies and builds it, which can take a few minutes. You'll see a message when it's ready:
Client dashboard started on port 3002Your config should end up looking like this (AUTHENTICATION is shared with the admin dashboard):
"AUTHENTICATION": {
"DISCORD_ID": "your-application-client-id",
"DISCORD_SECRET": "your-application-client-secret",
"GOOGLE_ID": "",
"GOOGLE_SECRET": "",
"GITHUB_ID": "",
"GITHUB_SECRET": "",
"EMAIL_PASSWORD": true,
"AUTH_SECRET": "leave-this-alone",
"ADMINS": [
{ "PROVIDER": "discord", "VALUE": "your-discord-user-id" }
]
},
"CLIENT_DASHBOARD": {
"ENABLE": true,
"DEV_MODE": false,
"PORT": 3002,
"URL": "https://account.example.com",
"REDEEM_PAGE": true,
"CUSTOMIZE": {
"BRAND_NAME": "Your Product",
"ICON": "https://example.com/icon.png",
"ACCENT_COLOR": "#4DABF7",
"THEME": "dark",
"RADIUS": "md",
"FONT": "",
"CUSTOM_CSS": ""
}
}7. What your customers get
Customers open your client dashboard URL, create an account (or sign in), and land in their own
portal, scoped entirely to their account:
- Licenses: every license tied to their account, with status and expiry.
- Downloads: secure, one‑time build links for the products they own. Needs the Downloads extension with files configured; a customer can only ever download builds for a license on their own account.
- My Data: view and edit their own user variables per license, when the Variables extension has them enabled. Isolated to their account, so it's a safe place for their own values and counters.
- Redeem: attach a license with a redeem code, when
REDEEM_PAGEis on (step 5). - Profile: manage their account and turn on two‑factor authentication from an authenticator app.
A license shows up for a customer once it's tied to their account, either because they redeemed its key or because it was assigned to their linked identity (their Discord ID or email). Accounts link to Kora users automatically on first sign‑in.
Appearance & branding
The client dashboard reads its look from CLIENT_DASHBOARD.CUSTOMIZE in config/config.json, the
same options as the admin dashboard, so you can brand it as your own customer portal:
BRAND_NAMEandICON: the name and logo shown in the sidebar and browser tab.ACCENT_COLOR: a hex color used for buttons, links, highlights, and the brand and sign-in gradients.THEME:dark,light, orautoto follow the visitor's system setting.RADIUS: how rounded the corners are, fromxstoxl.FONT: a font family for the interface, or empty for the default.CUSTOM_CSS: raw CSS injected into every page when you need finer control.
Changes apply the next time the client dashboard starts. See the Configuration reference for the full list of options.
Running behind a proxy
If the client dashboard is served over a public domain (through Nginx, Cloudflare, a load balancer, or a panel proxy), a few things matter:
- Set
CLIENT_DASHBOARD.URLto the full public https address, since this is what OAuth sign‑in redirects back to, and add that same address (plus/api/auth/callback/<provider>) to each provider you use in step 4. - Set
KORA.TRUST_PROXY(usually"1") so Kora reads the correct visitor address behind the proxy.
Local development: set CLIENT_DASHBOARD.DEV_MODE to true to run the client dashboard in
development mode with live reload instead of a production build.
Troubleshooting
- The client dashboard never starts / is skipped. Confirm you've claimed the Client Dashboard
add‑on with
/claim(step 1),CLIENT_DASHBOARD.ENABLEistrue, andKORA.AUTO_UPDATEistrueso the files download. - Kora refuses to start over a port conflict.
CLIENT_DASHBOARD.PORTmust differ from bothKORA.PORTandDASHBOARD.PORT. - Sign‑in fails or redirects to an error. Make sure you added the client dashboard's redirect URL
(
<CLIENT_DASHBOARD.URL>/api/auth/callback/<provider>) to the provider, not just the admin dashboard's, and thatCLIENT_DASHBOARD.URLmatches it exactly (includinghttps://and no trailing slash). - A customer's licenses don't appear. The license has to be tied to their account. Have them redeem
the key (with
REDEEM_PAGEon), or assign the license to their linked identity. - The redeem page is missing or errors. Set
CLIENT_DASHBOARD.REDEEM_PAGEtotrue, and make sure the BuiltByBit extension is enabled withunclaimed-keycodes. - Magic links or reset emails never arrive. Fill in the
SMTPsection; those features need it.

