Every setting in config.toml and every environment variable the Kribble server reads, with defaults
kribble-web and kribble-builder read one TOML file. Give both the same file. This page lists every setting, section by section.
Path. KRIBBLE_CONFIG_PATH, or config.toml in the working directory if it is not set. The units written by install.sh use /opt/kribble/config.toml. In the Docker image it is /app/config.toml.
No environment overrides. Settings come from the file only. The environment variables at the end of this page control logging and a few helpers, not settings.
Changes take effect on restart of both services: sudo systemctl restart kribble-web kribble-builder, or docker compose restart kribble-web kribble-builder.
Secrets. The file holds database, storage, SMTP and API credentials. Keep it owned by the service user with mode 600 (install.sh sets this).
Defaults. A missing key, an empty string and 0 all mean "use the default". You can't set a number to 0 this way.
Kribble refuses to start with exit status 2 if the file is missing or isn't valid TOML, if [auth].registration has an unknown value, or if a publish target is incomplete. Both binaries exit with status 1 if [database].dsn is empty. An unusable storage, Redis or LDAP setting stops startup with an error in the log.
[server]
frontend_url = "https://kribble.example.com"
[security]
jwt_secret = "<openssl rand -hex 32>"
refresh_secret = "<openssl rand -hex 32>"
[database]
dsn = "postgres://kribble:<db-password>@localhost:5432/kribble?sslmode=disable"
[meili]
host = "http://127.0.0.1:7700"
key = "<meili-master-key>"
[storage]
backend = "disk"
dir = "/opt/kribble/data"
[storage.s3]
public_bucket_url = "https://kribble.example.com/files-public"
config.toml.example in the release contains every section with comments.
Key | Default | What it does |
|---|---|---|
|
|
|
|
| Port |
|
| Directory of the built web app. Only used by binaries built without the embedded web app; release binaries ignore it. |
|
| The public address of the server, without a trailing slash. Used for links in emails (verification, password reset, invitations) and for the site addresses that the CLI and MCP report for the built-in target. Set it on every server. |
|
| Comma-separated IPs or CIDRs of the reverse proxies whose |
|
| Adds request bodies to the access log, capped in size. Sign-in, password and token endpoints are never logged. For debugging only. |
|
| The same for response bodies. Binary data, HTML, CSS, JS and PDFs are skipped. |
Key | Default | What it does |
|---|---|---|
| none | Signs the 15-minute access tokens, the private-site session cookie and the file-download cookie. |
| none | Signs the 7-day refresh tokens. |
Use two different random values of at least 32 characters (openssl rand -hex 32). Kribble doesn't check their length or that they were changed from CHANGE_ME, so check them yourself. Changing either one signs everyone out. Access tokens (kb_…) used by the CLI and CI are not affected, because they are random values stored as hashes in the database.
Key | Default | What it does |
|---|---|---|
| none, required | PostgreSQL connection string, for example |
|
| Creates and updates the tables when a binary starts. There is no separate migration command, so leave it on unless you apply schema changes some other way. |
Each process opens up to 25 connections.
Key | Default | What it does |
|---|---|---|
|
| Meilisearch URL, for example |
|
| The Meilisearch master key, as passed to |
Kribble starts even if Meilisearch can't be reached, and sets up the search index in the background once it can (search: index setup failed; search may be degraded in the log until then). While Meilisearch is unreachable, notes still save, but full-text search fails and the notes changed meanwhile are missing from search until they are saved again or the index is rebuilt. See Troubleshooting.
Key | Default | What it does |
|---|---|---|
|
|
|
|
| Sender address. Mail is sent as |
With no provider, emails are only written to the log, accounts are created without verification, and password reset and email invitations don't reach anyone. Authentication explains what changes.
Key | Default | What it does |
|---|---|---|
|
| A Resend API key. The |
Key | Default | What it does |
|---|---|---|
|
| SMTP server host name. Required for SMTP. |
|
| SMTP port, as a string. |
|
| Login for SMTP AUTH (PLAIN). Leave empty for a relay that needs no login. |
|
| Password for |
| from the port |
|
|
| Accepts any certificate from the SMTP server. For testing only. |
Key | Default | What it does |
|---|---|---|
|
| Path to the Chrome or Chromium binary used for PDF export. When empty, Kribble uses |
Only kribble-web exports PDFs.
Key | Default | What it does |
|---|---|---|
|
|
|
|
| Disk backend only, required for it: the root directory. Kribble creates |
With the disk backend, every file is served through kribble-web. It works on one host only, unless the directory is a shared mount.
Key | Default | What it does |
|---|---|---|
|
| S3 API endpoint, for example |
|
|
|
|
| Access key. Required for |
|
| Secret key. Required for |
|
| The private bucket: all uploads and private sites. Required for |
|
| The bucket for public sites' assets. It doesn't need public access, because |
|
| The URL prefix written into public sites for their assets. Set it to |
|
| How long the presigned download links for large files stay valid. |
|
| Files up to this size are streamed through |
|
| Per process: the most write, copy and delete requests sent to S3 per second for user actions. |
|
| Per process: the limit for background work such as site builds, so uploads keep headroom. |
The keys must be allowed to read, write, list and delete objects in both buckets.
Key | Default | What it does |
|---|---|---|
|
| How many sites |
|
| Port of the builder's health server ( |
Key | Default | What it does |
|---|---|---|
|
| Directory with the CLI, editor extensions and desktop apps the server hands out, and their |
Key | Default | What it does |
|---|---|---|
|
| Redis URL, for example |
Key | Default | What it does |
|---|---|---|
|
|
|
Key | Default | What it does |
|---|---|---|
|
| Accounts with these emails (case-insensitive) are made instance admins each time a binary starts. Promote-only: removing an email doesn't demote anyone. When the list is empty and there is no admin yet, the next account created becomes an admin. |
Authentication covers instance admins in detail.
Zero or more LDAP or Active Directory sources. Repeat the block for each. Enabled sources are tried in the order they appear. Authentication explains the login flow and has examples.
Key | Default | What it does |
|---|---|---|
|
| Label for the source. Shown in the admin panel and stored on accounts it creates. |
|
| Only enabled sources are used. An enabled source without |
|
|
|
|
| Service account that searches for users. Empty means an anonymous search. |
|
| The service account's password. Never shown in the admin panel. |
|
| Base DN searched for users (whole subtree). |
|
| Search filter. Every |
|
| Attribute holding the email. Required on the entry. |
|
| Attribute holding the username. Use |
|
| Attribute for the display name. Falls back to |
|
| Optional. With |
|
| Optional. See |
|
| Template using |
|
| Accepts any certificate on |
|
| Connect and search timeout. |
|
| Base DN for the group lookup. Empty turns group sync off for this source. |
|
| Group attribute listing members: |
|
| The user's value that appears in the member attribute. |
|
| Optional extra filter combined with the group search, for example |
Repeat under an [[ldap]] block. Entries missing any of the three keys are ignored.
Key | Default | What it does |
|---|---|---|
| none | DN of an LDAP group (compared case-insensitively). |
| none | Name of an existing organisation (its URL name, lowercase). |
| none | Names of existing teams in that organisation, matched exactly. |
Destinations for published sites besides the built-in one. Names must be unique across all three lists. Publish targets explains how they behave.
Key | Default | What it does |
|---|---|---|
| none, required | Name shown in the publish dialog and stored on each site. Don't rename it once sites use it. |
| none, required | Directory on the Kribble host. Each site goes into a subdirectory of it. |
|
| Organisation names that may use the target, or |
Key | Default | What it does |
|---|---|---|
| none, required | As above. |
| none, required | SSH server. |
|
| SSH port. |
| none, required | Remote user. |
| none, required | Private key file on the Kribble host. |
|
| The key's passphrase, if it has one. |
|
| known_hosts file with the server's host key. Startup doesn't check it, but every publish fails without it. |
|
| Remote directory. Each site goes into a subdirectory of it. |
|
| As above. |
Key | Default | What it does |
|---|---|---|
| none, required | As above. |
| none, required | Cloudflare account ID. |
| none, required | API token with Cloudflare Pages edit permission. |
|
| Branch name for the project and its deployments, so every deployment is a production deployment. |
|
| Start of each project name: |
|
| As above. |
|
| Cloudflare API address. Only change it for testing. |
Variable | Default | What it does |
|---|---|---|
|
| Path of the config file. |
|
|
|
|
| Format of the log on standard output. |
| none ( | Also write the log as JSON to |
|
| Rotate |
|
| Rotated files to keep. |
|
| Delete rotated files older than this. |
| none | Chromium path, used when |
| none | Set to |
Set them in a unit drop-in (sudo systemctl edit kribble-web):
[Service]
Environment=LOG_LEVEL=debug
Variable | Used by | What it does |
|---|---|---|
|
| Install location. Default |
|
| Paths of the binaries, if they aren't next to the script. |
|
| The web and builder ports written into a new |
|
| Port of |
|
| Create the database in the |
|
| Meilisearch master key. Must match |
|
| Host port for |
kribble-www reads KRIBBLE_WWW_ADDR and KRIBBLE_WWW_DOWNLOADS. See The CLI and desktop downloads.