Install Kept
Pick how you run Kept, then follow its steps. Each path has a full guide in this section; the link is at the end of its steps.
Docker Compose
What you need
Docker with the Compose plugin, and a terminal. Tested on 1 GB of RAM and one CPU core; Kept and its database use about 200–400 MB of it (what was tested).
-
Download
compose.yamlinto a folder of its own: Kept and its database in one file, with no copy of the repository and no passwords to make.Terminal window mkdir kept && cd keptcurl -fsSLO https://raw.githubusercontent.com/keptinventory/kept/v1.14.7/compose.yaml -
Write
.env.initasks for the address you’ll open Kept at, such ashttp://kept.home.arpa:8080. Use a name rather than an IP address: printed labels carry it.Terminal window docker compose run --rm initYou should see
Wrote .env.KEPT SETUP CODE: XXX-XXXNext: docker compose up -d, then open http://kept.home.arpa:8080 and enter the setup code. -
Start it. The database starts, two one-shot services make its logins and apply the migrations, then Kept starts on port 8080.
Terminal window docker compose up -dYou should see
At the address, Kept’s Enter the setup code page.
-
Set up. Enter the code
initshowed and create the first account: it becomes the instance admin. -
Keep the keys. Print the recovery kit and keep it somewhere other than this server, such as a password manager. A backup brings back secret values only with these keys.
Terminal window docker compose exec kept kept admin recovery-kitYou should see
Text that starts with
KEPT RECOVERY KIT.
Every step in full, with Caddy for HTTPS and Ollama for local AI: Install with Docker Compose.
Kubernetes
What you need
A Kubernetes cluster such as k3s, kubectl and helm, and a terminal. The chart asks for 384 MiB
of memory for Kept (at most 1 GiB) and 256 MiB for its bundled Postgres (at most 512 MiB).
-
Create the secrets. The chart never writes a secret: the database logins and the bundled Postgres’s superuser get their passwords from secrets you make first.
Terminal window kubectl create namespace keptpw() { openssl rand -hex 32; }# The four database logins (always).kubectl -n kept create secret generic kept-db \--from-literal=KEPT_DB_OWNER_PASSWORD="$(pw)" --from-literal=KEPT_DB_APP_PASSWORD="$(pw)" \--from-literal=KEPT_DB_AUTH_PASSWORD="$(pw)" --from-literal=KEPT_DB_SYSTEM_PASSWORD="$(pw)"# The bundled Postgres's superuser (or, for external Postgres with roles.create, the server admin's password).kubectl -n kept create secret generic kept-postgres --from-literal=POSTGRES_PASSWORD="$(pw)" -
Install the chart, with
publicUrlset to the address people will open. Don’t add--waitto this first install: the migrations run after it.Terminal window helm install kept oci://ghcr.io/keptinventory/charts/kept --version 1.14.7 -n kept \--set publicUrl=https://kept.example.org \--set roles.existingSecret=kept-db --set postgres.superuserSecret=kept-postgresYou should see
The first line of the notes Helm prints:
Kept 1.14.7 is installed as "kept" in namespace "kept". -
Find the setup code. Kept prints it once, on its first start.
Terminal window kubectl -n kept logs deploy/kept | grep 'KEPT SETUP CODE'You should see
KEPT SETUP CODE: XXX-XXXOpen the address, enter the code and create the first account: it becomes the instance admin.
-
Keep the keys. Save the recovery kit and keep it off the cluster.
Terminal window kubectl -n kept exec deploy/kept -- kept admin recovery-kit > kept-recovery-kit.txtYou should see
kept-recovery-kit.txt, starting withKEPT RECOVERY KIT. -
Check it.
helm testasks the running Kept for/readyzand/version.Terminal window helm test kept -n kept
On Windows, run these in WSL. The values, the optional secrets and what the chart runs: Install on Kubernetes with Helm.
From source
What you need
Git, Docker with the Compose plugin, and a terminal. Kept runs as with Docker Compose, on your own image.
-
Get the code.
Terminal window git clone https://github.com/keptinventory/kept.git && cd kept -
Build the image, tagged
kept:local.Terminal window docker build -t kept:local . -
Write
.env. Pointcompose.yamlat your image, then runinit. It finds the.env, asks whether to update it (answerY), then asks for the address you’ll open Kept at.Terminal window echo KEPT_IMAGE=kept:local >> .envdocker compose run --rm initYou should see
Updated .env.KEPT SETUP CODE: XXX-XXX -
Start it, and open the address.
Terminal window docker compose up -dYou should see
Kept’s Enter the setup code page. Enter the code
initshowed and create the first account: it becomes the instance admin. -
Keep the keys. Print the recovery kit and keep it somewhere other than this server.
Terminal window docker compose exec kept kept admin recovery-kitYou should see
Text that starts with
KEPT RECOVERY KIT.
On Windows, run these in WSL. The same compose.yaml as a release, explained in full:
Install with Docker Compose.
Home Assistant
What you need
Home Assistant OS with Supervisor 2026.10.4 or later: apps need the Supervisor, so not Home
Assistant Container or Core. An aarch64 or amd64 machine, such as a Raspberry Pi 4 or 5 on
64-bit or a mini PC. 4 GB of memory; 2 GB works with few other apps. No terminal.
-
Add Kept’s repository. The button opens your Home Assistant with it filled in. Or go to Settings → Apps → Install app → ⋮ → Repositories and add
Add Kept to Home Assistanthttps://github.com/keptinventory/kept. -
Install, then Start. Find Kept in the app store, then Install, then Start.
You should see
On the app’s Log tab, Kept’s own address and the setup code:
Kept is at http://homeassistant.local:8080 (change it in Configuration: "Kept's address")KEPT SETUP CODE: XXX-XXX -
Open Web UI. Kept opens inside Home Assistant, and in the sidebar too.
You should see
For a Home Assistant administrator, Create the first account, with no code. Anyone else sees Enter the setup code and types the code from the Log tab.
Kept’s address, https and the backups: Install as a Home Assistant app.
Something not working?
Section titled “Something not working?”- The container keeps restarting. Read its log:
docker compose logs kept. Kept checks its settings before it starts and stops with one line naming the first problem, such askept: invalid environment: KEPT_PUBLIC_URL(rundocker compose run --rm init). Ifdocker compose up -dstops atbootstrap,docker compose logs bootstrapsays why. On less than 1 GB of memory, a backup can run out of it and Docker restarts Kept (what it needs). More - The port is in use. Kept takes port 8080 on the host. Run
docker compose run --rm initagain with anhttp://address on a free port: it writes the address and the port (KEPT_HTTP_PORT) to.env. Thendocker compose up -d. In the Home Assistant app, change the port under Configuration → Network and set Kept’s address to match. More - Permission denied. Kept runs as user 10001 with a read-only filesystem, so a folder you
mount into it, such as a backup directory, must be owned by uid 10001.
initwrites.envinto the folder you run it from: run it in a folder you own. More - Other devices can’t open it.
localhostopens on this machine only. Use a name the other devices can find, set in your router’s DNS or each device’s hosts file, and runinitagain with it. If Kept says “This Kept is set up for address. Open it there.”, open it at exactly that address, or list the other one inKEPT_EXTRA_ADDRESSES(more than one address). More - A 502 from the reverse proxy. Kept speaks plain HTTP on port 8080: point the proxy at
http://, nothttps://, on that port (behind a reverse proxy). Kept starts only oncemigratehas finished; if it failed,docker compose logs migratesays why. More
Everything else: Troubleshooting.
Go further
Section titled “Go further”- HTTPS: the camera, installing the app, push and location need it. Put Kept on HTTPS, or Kept on a home network for what works without it.
- The assistant: ask in plain words, with your own AI provider; Kept works without one. AI providers, and Connect an AI client (MCP).
- Backups: nightly and encrypted, to a directory, S3 or SFTP. Backups.
- Mail: password resets, invitations and reminders by mail, with
KEPT_SMTP_URLandKEPT_SMTP_FROM. Mail, push and the calendar feed. - Home Assistant: the integration brings what’s due into dashboards and automations. Home Assistant.
Updates
Section titled “Updates”-
Docker Compose: set
KEPT_IMAGEin.envto the new release, then:Terminal window docker compose pulldocker compose up -dA release that changes
compose.yamlsays so in its notes: download its file over yours. -
From source:
Terminal window git pulldocker build -t kept:local .docker compose up -d -
Kubernetes: each release publishes a chart of the same version, and its migrations run in a Job before the new version serves.
-
Home Assistant: Home Assistant offers the update. Turn on Keep backup of the last version in its update dialog.
With a backup target set, Kept takes a snapshot before it migrates. Upgrades and rollback.