Setup Guide
Pick a host, install Kora, fill in the essential settings, and get your instance online.
This guide takes you from a fresh copy of Kora to a running instance.
Hosting Options
There is no such thing as absolutely free hosting! Either your information is the payment, or the feature set is extremely limited. Be careful of scams, obscure hosting plans, and sneaky payment systems.
Self-Hosting (Local Machine)
Best for development, testing, or environments that do not require 24/7 uptime. Running Kora on your local machine (Windows, macOS, or Linux) is free and allows for quick configuration changes and debugging.
VPS / VDS / Dedicated Server
Best for production deployments requiring full system control, dedicated resources, and 24/7 uptime. Providers like DigitalOcean, Hetzner, Linode, and Contabo offer virtual private servers where you can run Kora using process managers like PM2 or systemd. This option requires basic familiarity with Linux command-line administration.
Pterodactyl Game & Bot Panels
The most convenient and automated hosting method. Pterodactyl panels provide a web interface with integrated console access, browser-based file management, automatic crash recovery, and simple startup controls without requiring server management experience.
Requirements & Dependencies
Kora requires Node.js v22 (LTS) or newer (or Bun). You can download Node.js from the official website.
Kora installs its own dependencies with npm install, and it automatically installs the right database
driver for you the first time it connects, so there are no extra build tools to set up.
- Create a new server using any Node.js v22+ egg.
- Upload your Kora files to the server.
- Make sure the startup command runs the app with
node index.js(ornpm start). - Start the server. Pterodactyl handles keeping it online for you.
If your panel's startup command launches Kora through ts-node, switch it to node index.js.
Kora runs on plain Node.js, and using ts-node only adds unnecessary warnings to your console.
Keeping Kora online after you close the terminal (self‑hosting): install PM2 once with
npm install -g pm2, then start Kora with pm2 start index.js --name Kora. Use pm2 stop Kora to turn
it off. On Pterodactyl you don't need this, since the panel keeps it running.
First Run
The first time you start Kora, it creates your configuration file at config/config.json and
then stops, asking you to accept the license:
Please read & agree to the LICENSE.md to continue using Kora.That's expected. Open config/config.json and fill in the settings below, then start Kora again.
Configuration
All of the settings below live in the config/config.json file at the root of your Kora folder.
1. Get your license
Every instance needs a license key from Zero Development. It's what lets Kora start up and unlocks
add‑ons like the dashboard. To get your key, open a ticket in the 「🎫」open-a-ticket channel of the
Zero Development Discord. Then, in config/config.json, under LICENSE:
- Set
AGREE_TO_LICENSE.MDtotrueto accept the license. - Paste your key into
LICENSE_KEY.
Need a license or some help? Open a ticket in the Zero Development Discord. Kora needs internet access on startup so it can verify your key.
2. Choose your runtime
Under KORA, set ENVIRONMENT to match how you're running Kora:
NODEJS: the standard choice.BUN: only if you're running Kora with Bun.
3. Set up your database
Kora stores everything in a SQL database. Create an empty database on your PostgreSQL, MySQL, or
MariaDB server, then fill in the DATABASE section:
TYPE:POSTGRES,MYSQL, orMARIADB.HOST/PORT: where your database server is.USER/PASSWORD: the login Kora should use.DATABASE: the name of the database you created.
The database itself must already exist. Kora creates the tables inside it, but not the database.
Leave MIGRATE set to true so Kora keeps its tables up to date automatically.
4. Set your API port and URL
Under KORA, PORT is the port Kora listens on (default 3000). Change it if that port is already
in use on your host. It must be free and different from the dashboard's port; Kora refuses to start if
the port is already taken.
URL is the public URL of your Kora server (e.g. https://api.yoursite.com). It is the address
your customers' integrations call, so they reach your server instead of localhost; see the
Core API Reference. Leave it empty during local setup.
5. Branding (optional)
Under DASHBOARD.CUSTOMIZE you can personalize how Kora appears in the dashboard:
BRAND_NAME: your product or company name.ICON: a URL to your logo.ACCENT_COLOR: a hex color (e.g.#4DABF7) for buttons, links, and highlights.THEME: the dashboard color scheme:dark,light, orauto.RADIUS: how rounded the dashboard's corners are (xsthroughxl).FONT: a font family for the dashboard (leave empty for the default).CUSTOM_CSS: extra CSS for fine‑grained styling (leave empty for none).
After everything is filled in, your config/config.json should look something like this:
{
"LICENSE": {
"AGREE_TO_LICENSE.MD": true,
"LICENSE_KEY": "XXXXX-XXXXX-XXXXX-XXXXX"
},
"KORA": {
"PORT": 3000,
"URL": "",
"ENVIRONMENT": "NODEJS",
"AUTO_UPDATE": true,
"TRUST_PROXY": "",
"CONSOLE": {
"SECONDS": false,
"12_HOURS": true,
"DEBUG": false,
"CLI": true
},
"API_KEY": [
{ "NAME": "Default", "VALUE": "keep-this-secret" }
],
"RATELIMIT": {
"COOLDOWN": "60s",
"TIMEFRAME": "5s",
"REQUESTS": "50"
}
},
"AUTHENTICATION": {
"DISCORD_ID": "",
"DISCORD_SECRET": "",
"GOOGLE_ID": "",
"GOOGLE_SECRET": "",
"GITHUB_ID": "",
"GITHUB_SECRET": "",
"EMAIL_PASSWORD": true,
"AUTH_SECRET": "auto-generated-for-you",
"ADMINS": []
},
"DASHBOARD": {
"ENABLE": false,
"DEV_MODE": false,
"PORT": 3001,
"URL": "http://localhost:3001",
"CUSTOMIZE": {
"BRAND_NAME": "Kora",
"ICON": "https://example.com/icon.png",
"ACCENT_COLOR": "#4DABF7",
"THEME": "dark",
"RADIUS": "md",
"FONT": "",
"CUSTOM_CSS": ""
}
},
"SMTP": {
"HOST": "",
"PORT": "587",
"SECURE": false,
"USER": "",
"PASSWORD": "",
"FROM": ""
},
"DATABASE": {
"TYPE": "POSTGRES",
"HOST": "localhost",
"PORT": "5432",
"USER": "admin",
"PASSWORD": "password",
"DATABASE": "Kora",
"MIGRATE": true
}
}Every setting is explained in full in the Configuration guide. Anything you leave out is safely filled back in with its default the next time Kora starts.
Start it up
With your config saved, start Kora again (npm start, or start the server in your panel). This time it
will validate your license, connect to your database, and come online. A successful start ends with a
banner like:
Kora v1.0.3.0 has finished booting! (took 1.42s)Finalizing
- Start Kora once so it creates your config file.
- Fill in your settings in
config/config.json(license, database, port, runtime). - Restart Kora.
- You're online! 🎉
Want the web dashboard too? Follow the Dashboard Setup Guide.

