Install KIVO on your own server
KIVO self-hosted is the same KIVO as the website, in a Docker image that runs on your network. Every tool does its work in the user's browser: the server only delivers the app, never receives a file and never contacts anyone. It takes ten minutes.
What you need
- A Linux x86-64 server (a VM is fine) with Docker 20.10 or later, or Docker Desktop on Windows or macOS.
- 1 CPU and 512 MB of RAM are enough: the server delivers files, the browsers do the work.
- 2 GB of disk space for the image.
- The image file
kivo-selfhost-….tar.gzand the licencelicense.key, both from your purchase email.
1Download the image and the licence
After you buy, you get an email with the licence attached (license.key) and a link to download the image. The same link stays available on your order page at Lemon Squeezy.
Make a folder on the server and put both files in it:
mkdir -p ~/kivo && cd ~/kivo
ls
# kivo-selfhost-1.0.0.tar.gz license.keySave the licence from the attachment rather than retyping it. Pasting it from the email body works too: KIVO ignores the line breaks and spaces mail clients add.
2Load the image into Docker
docker load -i kivo-selfhost-*.tar.gzDocker answers with Loaded image: kivo-selfhost:latest and the exact version, for example kivo-selfhost:1.0.0. Both tags name the same image.
3Start KIVO
Docker Compose is the recommended way, because the configuration stays written down in a file. Create docker-compose.yml in the same folder:
services:
kivo:
image: kivo-selfhost:latest
container_name: kivo
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./license.key:/app/license.key:rodocker compose up -dIf you would rather use a single command, with no file:
docker run -d --name kivo --restart unless-stopped \
-p 3000:3000 \
-v "$PWD/license.key:/app/license.key:ro" \
kivo-selfhost:latestStart the container after license.key is in the folder. If the file does not exist, Docker creates an empty folder with the same name in its place, and KIVO cannot find the licence. KIVO tells you so in a notice, and “Common problems” has the fix.
4Check that it works
Open http://your-server:3000 in a browser. If no yellow notice appears at the top of the page, the licence is active.
From the server you can also check in a terminal:
curl http://localhost:3000/api/health
curl http://localhost:3000/api/licenseThe first answer says KIVO is up and which version you are running:
{"ok":true,"edition":"selfhost","version":"…","released":"…"}The second shows the licence: "state":"valid", who it is issued to, the plan and when included updates end.
5Put it behind HTTPS
On localhost KIVO already works in full. From other computers on the network it needs HTTPS: browsers only enable offline use, the QR reader's camera, the recorder's microphone and copying to the clipboard on secure connections.
The simplest route is Caddy, which gets and renews the certificate on its own. One Caddyfile is all it takes:
kivo.example.com {
reverse_proxy localhost:3000
}If you already run nginx with a company certificate:
server {
listen 443 ssl;
server_name kivo.example.com;
ssl_certificate /etc/ssl/kivo.crt;
ssl_certificate_key /etc/ssl/kivo.key;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}With a proxy in front you can expose the port locally only: write "127.0.0.1:3000:3000" instead of "3000:3000" in the compose file.
Reference
Updates
Each new version arrives as a new kivo-selfhost-….tar.gz file, at the same link. To update:
docker load -i kivo-selfhost-*.tar.gz
docker compose up -dYour licence stays as it is: there is nothing to reinstall. If a new version gives you trouble, go back by naming the version instead of latest in the compose file (for example image: kivo-selfhost:1.0.0) and running docker compose up -d again. The previous version stays in Docker until you delete it.
How the licence works
- It is perpetual. You can use the version you have for good.
- Updates have an end date, usually 12 months from purchase (unlimited on the lifetime plan). Every version released before that date is covered.
- If you install a version released after that date, KIVO still works but shows a notice until you renew updates.
- It is checked on your own server, with a digital signature. KIVO never contacts our servers, not even to check it.
- When you renew you get a new
license.key. Replace the file: the notice goes away on the next page load, no restart needed.
To renew, paste your licence at kivotool.com/en/self-host/renew. The full terms are at /self-host/license, on your own installation too.
Isolated networks, no Internet
The image already contains everything: the PDF, video and audio engines, text recognition with its languages, the background-removal model. It downloads nothing at start-up and opens no outbound connections: no analytics, no CDN, no remote licence check.
For a network without Internet, bring the two files to the server (on a USB stick, say) and follow the steps above. To verify it, block the container's outbound traffic at the firewall: KIVO keeps working exactly the same.
Configuration
| Variable | What it does |
|---|---|
PORT | The port KIVO listens on inside the container. Default 3000. |
KIVO_LICENSE_FILE | Where to look for the licence. Default /app/license.key. |
KIVO_LICENSE | The licence text itself, instead of a file. Handy with Kubernetes or Portainer secrets. |
For example, with the licence passed as a variable:
docker run -d -p 3000:3000 -e KIVO_LICENSE="$(cat license.key)" kivo-selfhost:latestThere is nothing to back up beyond license.key and the compose file. People's Recipes and preferences live in their own browsers, not on the server.
Common problems
| What you see | What to do |
|---|---|
| “This KIVO installation has no licence” | The file is not where KIVO looks for it. Check that license.key is in the same folder as docker-compose.yml, or that KIVO_LICENSE_FILE points at the right path. |
| “license.key is a folder, not a file” | The container started before the file existed. docker compose down, delete the folder with rm -r license.key, put the file back and docker compose up -d. |
| “This KIVO installation's licence could not be verified” | The file was edited or is incomplete. Save it again from the email attachment, without opening it in an editor. |
| “Your licence covers updates released until…” | This version came out after your update period ended. Renew from the link in the notice, or go back to the last covered version. |
| “license.key is there but KIVO cannot read it” | KIVO does not run as root inside the container, so the file must be readable by everyone: chmod 644 license.key. The exact reason is also in docker logs kivo. |
port is already allocated | Something else is using port 3000. Change the first half of the mapping, for example "8080:3000", and open http://server:8080. |
| Camera, microphone or offline mode do not work | You are opening KIVO over plain HTTP from another computer. Put it behind HTTPS (step 5). |
exec format error at start-up | The server is not x86-64 (ARM, for example). Write to us: we will build the image for your architecture. |
Uninstalling
docker compose down
docker image rm kivo-selfhost:latestNothing else is left on the server. If you need help at any point, reply to your licence email with its code (KV-…) and the output of /api/health.