> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kernelmedia.tv/llms.txt
> Use this file to discover all available pages before exploring further.

# Updating

> How to update Kernel depending on how you installed it

How you update depends on how you installed Kernel. Pick your install method below.

<Note>
  Every install gets the same build, so updating always gets you the latest release regardless of license. A Pro or Lifetime license unlocks additional features rather than earlier access to builds; see [Pro & Lifetime Features](/pro-features).
</Note>

<h2 id="manual-binary">
  In-app updater (manual binary installs)
</h2>

From **Settings > Updates** (admin only), Kernel can check for, download, and apply an update itself:

1. **Check**: queries `KERNEL_UPDATES_API` (default `https://api.kernelmedia.tv`) for the latest version.
2. **Download**: fetches and checksum-verifies the new binary.
3. **Apply**: renames the running binary to `.bak`, swaps in the new one, and re-execs. If anything fails, it automatically rolls back to the `.bak` binary. The bundled ffmpeg tree and transcoder binary are updated the same way.

<h2 id="docker">
  Docker
</h2>

**Don't use the in-app updater inside a container.** The server has no way to detect it's running in Docker, so an in-app update swaps the binary inside the container's writable layer, and that change is lost the next time the container is recreated (which is exactly what an orchestrator or `docker compose up` does). Instead, update the image itself:

```bash theme={null}
docker pull kernelmedia/server:latest
docker stop kernel-server && docker rm kernel-server
# re-run your original `docker run` command, or `docker compose up -d`
```

As long as `/app/data` and `/app/log` are mounted volumes, your database and settings carry over untouched.

<h2 id="linux-packages">
  Linux packages (deb/rpm)
</h2>

Packaged installs set `KERNEL_MANAGED`, which disables the in-app updater. The package manager is authoritative instead:

```bash theme={null}
sudo apt update && sudo apt upgrade kernelmediaserver
# or
sudo dnf upgrade kernelmediaserver
```

The systemd unit and `/etc/kernelmediaserver/kernelmediaserver.env` are marked as config files, so local edits survive the upgrade.

<h2 id="homebrew">
  Homebrew (macOS)
</h2>

Like the Linux packages, the Homebrew formulas set `KERNEL_MANAGED`, which disables the in-app updater automatically. `brew` is authoritative instead:

```bash theme={null}
brew update
brew upgrade server
# or: brew upgrade remotenode
```

## Database migrations

Regardless of install method, Kernel runs its database migrations automatically on startup. There's no separate migration step to run after updating.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.