Keeyo KEEYOEquipment register

Form K-00 · Installation

Install

One container, one volume, one port. All data lives in a single SQLite file.

Docker (recommended)

docker run -d --name keeyo \
  -p 5390:5390 \
  -v keeyo-data:/data \
  --restart unless-stopped \
  ghcr.io/ans-ib/keeyo:latest

Docker Compose

services:
  keeyo:
    image: ghcr.io/ans-ib/keeyo:latest
    container_name: keeyo
    restart: unless-stopped
    ports:
      - "5390:5390"
    volumes:
      - keeyo-data:/data

volumes:
  keeyo-data:

Then open http://localhost:5390. Your first visit creates the admin account — there is no default password and no open registration.

Build from source

git clone https://github.com/ans-ib/keeyo.git && cd keeyo
docker compose up -d

Without Docker

Needs Node.js 22.13+ — Keeyo uses Node's built-in SQLite, so there are no native modules to compile.

git clone https://github.com/ans-ib/keeyo.git && cd keeyo
npm install
npm start          # http://localhost:5390, data in ./data

Configuration

VariableDefaultWhat it does
PORT5390Web server port.
DATA_DIR/dataWhere the SQLite database lives.
SESSION_TTL_DAYS30How long sign-ins last.
REGISTRY_REFRESH_DAYS7How often the FIDO device registry is re-fetched.
KEEYO_OFFLINEunsetSet 1 to block all outbound requests (registry updates off).
TRUST_PROXYunsetSet 1 only behind a reverse proxy so X-Forwarded-* headers are honored.
KEEYO_DISABLE_MFAunsetSet 1 to skip every sign-in second factor — security keys and authenticator codes (lockout recovery).

Reverse proxy & HTTPS

Keeyo speaks plain HTTP; put your reverse proxy in front for TLS and set TRUST_PROXY=1. Caddy example:

keys.example.com {
    reverse_proxy keeyo:5390
}
HTTPS matters more than usual here. The WebAuthn features — key scanning, identification, tap-to-reveal, security-key login — only work from localhost or an HTTPS origin. On a plain-HTTP LAN IP they politely disable themselves. Browsers also refuse WebAuthn on raw IP addresses, so use a hostname.

Backups

Locked out?

On the server (or in the container):

docker exec -it keeyo node scripts/reset-password.js <username> <new-password>

This resets the password, signs out all sessions and removes every second factor on the account — sign-in security keys, the authenticator app, and recovery codes. Alternatively, start Keeyo once with KEEYO_DISABLE_MFA=1 to skip the second factor.