Skip to content
kivo

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.gz and the licence license.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:

shell
mkdir -p ~/kivo && cd ~/kivo
ls
# kivo-selfhost-1.0.0.tar.gz  license.key

Save 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

shell
docker load -i kivo-selfhost-*.tar.gz

Docker 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:

docker-compose.yml
services:
  kivo:
    image: kivo-selfhost:latest
    container_name: kivo
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - ./license.key:/app/license.key:ro
shell
docker compose up -d

If you would rather use a single command, with no file:

shell
docker run -d --name kivo --restart unless-stopped \
  -p 3000:3000 \
  -v "$PWD/license.key:/app/license.key:ro" \
  kivo-selfhost:latest

Start 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:

shell
curl http://localhost:3000/api/health
curl http://localhost:3000/api/license

The first answer says KIVO is up and which version you are running:

shell
{"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:

Caddyfile
kivo.example.com {
  reverse_proxy localhost:3000
}

If you already run nginx with a company certificate:

nginx
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:

shell
docker load -i kivo-selfhost-*.tar.gz
docker compose up -d

Your 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

VariableWhat it does
PORTThe port KIVO listens on inside the container. Default 3000.
KIVO_LICENSE_FILEWhere to look for the licence. Default /app/license.key.
KIVO_LICENSEThe licence text itself, instead of a file. Handy with Kubernetes or Portainer secrets.

For example, with the licence passed as a variable:

shell
docker run -d -p 3000:3000 -e KIVO_LICENSE="$(cat license.key)" kivo-selfhost:latest

There 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 seeWhat 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 allocatedSomething 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 workYou are opening KIVO over plain HTTP from another computer. Put it behind HTTPS (step 5).
exec format error at start-upThe server is not x86-64 (ARM, for example). Write to us: we will build the image for your architecture.

Uninstalling

shell
docker compose down
docker image rm kivo-selfhost:latest

Nothing 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.