Skip to content

Kaneo Kaneo

Description / nameInput element
Container Registry
Container Configuration Root Path
Timezone
User ID
Group ID
Kaneo /config Path

Build Status Last Commit OCI Pulls

Open-source project management and Kanban board platform built for speed and simplicity.

Registry ghcr.io/daemonless/kaneo
Daemonless daemonless/kaneo
Source usekaneo/kaneo
Website kaneo.app

Version Tags

Tag Description Best For
latest Upstream Binary. Built from official release. Most users — recommended.

Parts

Service Image Role
kaneo ghcr.io/daemonless/kaneo:${KANEO_TAG:-latest} docs
postgres ghcr.io/daemonless/postgres:18 docs

Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions, including the security model for host vs. container privileges.

Deployment

Database Where Kaneo keeps its projects and tasks. The default runs its own PostgreSQL.

kaneo:latest · postgres:18 — data in /containers/kaneo/config, /containers/kaneo/postgres

A PostgreSQL of its own, on the private network.

1. Save as .env and fill in what is empty:

# Kaneo for FreeBSD (Daemonless)
# Copy to .env and edit.

# Host paths for persistent storage
KANEO_CONFIG_PATH=/containers/kaneo/config
DB_DATA_LOCATION=/containers/kaneo/postgres

# Public URL Kaneo is reached on (must match what the browser uses)
KANEO_CLIENT_URL=http://localhost:5173

# Database password (change before first start) and session secret (generated into /config/secrets.env if left empty)
POSTGRES_DB=kaneo
POSTGRES_USER=kaneo
POSTGRES_PASSWORD=kaneo
AUTH_SECRET=
TZ=UTC

2. Save as compose.yaml:

name: kaneo

services:
  kaneo:
    image: ghcr.io/daemonless/kaneo:${KANEO_TAG:-latest}
    container_name: kaneo
    restart: unless-stopped
    network_mode: host
    depends_on:
      - postgres

    environment:
      - PUID=1000
      - PGID=1000
      - TZ=${TZ:-UTC}
      - KANEO_CLIENT_URL=${KANEO_CLIENT_URL}
      - POSTGRES_HOST=${POSTGRES_HOST:-127.0.0.1}
      - POSTGRES_PORT=${POSTGRES_PORT:-5432}
      - POSTGRES_DB=${POSTGRES_DB:-kaneo}
      - POSTGRES_USER=${POSTGRES_USER:-kaneo}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - AUTH_SECRET=${AUTH_SECRET:-}

    volumes:
      - ${KANEO_CONFIG_PATH}:/config

  postgres:
    image: ghcr.io/daemonless/postgres:18
    container_name: kaneo-postgres
    restart: unless-stopped
    network_mode: host

    annotations:
      org.freebsd.jail.allow.sysvipc: "true"

    environment:
      - POSTGRES_DB=${POSTGRES_DB:-kaneo}
      - POSTGRES_USER=${POSTGRES_USER:-kaneo}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data

Then run podman-compose up -d.

Database Where Kaneo keeps its projects and tasks. The default runs its own PostgreSQL.

kaneo:latest · postgres:18 — data in /containers/kaneo/config, /containers/kaneo/postgres

A PostgreSQL of its own, on the private network.

# .env

DIRECTOR_PROJECT=kaneo
PUID=1000
PGID=1000
TZ=UTC
KANEO_CLIENT_URL=http://localhost:5173
POSTGRES_HOST=127.0.0.1
POSTGRES_PORT=5432
POSTGRES_DB=kaneo
POSTGRES_USER=kaneo
POSTGRES_PASSWORD=kaneo
AUTH_SECRET=<AUTH_SECRET>
KANEO_CONFIG_PATH=/containers/kaneo/config
DB_DATA_LOCATION=/containers/kaneo/postgres
# appjail-director.yml

options:
  - alias:
  - ip4_inherit:
services:
  kaneo:
    name: kaneo
    options:
      - container: 'args:--pull'
    oci:
      user: root
      environment:
        - PUID: !ENV '${PUID}'
        - PGID: !ENV '${PGID}'
        - TZ: !ENV '${TZ}'
        - KANEO_CLIENT_URL: !ENV '${KANEO_CLIENT_URL}'
        - POSTGRES_HOST: !ENV '${POSTGRES_HOST}'
        - POSTGRES_PORT: !ENV '${POSTGRES_PORT}'
        - POSTGRES_DB: !ENV '${POSTGRES_DB}'
        - POSTGRES_USER: !ENV '${POSTGRES_USER}'
        - POSTGRES_PASSWORD: !ENV '${POSTGRES_PASSWORD}'
        - AUTH_SECRET: !ENV '${AUTH_SECRET}'
        - KANEO_CONFIG_PATH: !ENV '${KANEO_CONFIG_PATH}'
        - DB_DATA_LOCATION: !ENV '${DB_DATA_LOCATION}'
    volumes:
      - KANEO_CONFIG_PATH: /config
  postgres:
    name: postgres
    options:
      - from: ghcr.io/daemonless/postgres:18
      - template: !ENV '${PWD}/postgres-template.conf'
    oci:
      environment:
        - POSTGRES_DB: !ENV '${POSTGRES_DB}'
        - POSTGRES_USER: !ENV '${POSTGRES_USER}'
        - POSTGRES_PASSWORD: !ENV '${POSTGRES_PASSWORD}'
    volumes:
      - db_data: /var/lib/postgresql/data
volumes:
  KANEO_CONFIG_PATH:
    device: '/containers/kaneo'
  db_data:
    device: !ENV '${DB_DATA_LOCATION}'
1
2
3
4
5
6
7
# Makejail

ARG tag=latest

OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/kaneo:${tag}

Save the files above, then run appjail-director up.

Interactive Configuration

Parameters

Environment Variables

Variable Default Description
PUID 1000 User ID for the application process
PGID 1000 Group ID for the application process
TZ UTC Timezone for the container
KANEO_CLIENT_URL http://localhost:5173 URL you will open Kaneo at, e.g. http://myhost:5173 (must match what the browser uses)
POSTGRES_HOST 127.0.0.1 Where Kaneo finds PostgreSQL (set automatically for the built-in database; 127.0.0.1 on host networking)
POSTGRES_PORT 5432 PostgreSQL port
POSTGRES_DB kaneo PostgreSQL database name
POSTGRES_USER kaneo PostgreSQL database user
POSTGRES_PASSWORD kaneo PostgreSQL password
AUTH_SECRET <AUTH_SECRET> Secret used to sign authentication sessions (generated into /config/secrets.env if unset)
KANEO_CONFIG_PATH /containers/kaneo/config Path to store Kaneo configuration and secrets
DB_DATA_LOCATION /containers/kaneo/postgres Path to store PostgreSQL data files

Volumes

Path Description
/config Configuration and persistent secrets

Implementation Details

  • Architectures: amd64
  • User: bsd (UID/GID set via PUID/PGID). Defaults to 1000:1000.
  • Base: Built on ghcr.io/daemonless/base (FreeBSD 15.1).

Need help? Join our Discord community.