Docs

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

  1. Buy the Client Dashboard add‑on ($3.99) on the BuiltByBit page.
  2. In the Zero Development Discord, go to the 「🤖」commands channel and run /claim to 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 (default 3002). It must differ from KORA.PORT and DASHBOARD.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 3002

Your 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_PAGE is 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_NAME and ICON: 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, or auto to follow the visitor's system setting.
  • RADIUS: how rounded the corners are, from xs to xl.
  • 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.URL to 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.ENABLE is true, and KORA.AUTO_UPDATE is true so the files download.
  • Kora refuses to start over a port conflict. CLIENT_DASHBOARD.PORT must differ from both KORA.PORT and DASHBOARD.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 that CLIENT_DASHBOARD.URL matches it exactly (including https:// 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_PAGE on), or assign the license to their linked identity.
  • The redeem page is missing or errors. Set CLIENT_DASHBOARD.REDEEM_PAGE to true, and make sure the BuiltByBit extension is enabled with unclaimed-key codes.
  • Magic links or reset emails never arrive. Fill in the SMTP section; those features need it.

On this page