Kaneo
Open-source project management and Kanban board platform built for speed and simplicity.
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.
Built-in PostgreSQL Your 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.
kaneo:latest · your own database — data in /containers /kaneo/config
A PostgreSQL you already run. Create the database and a user with full privileges on it first.
1. Save as .env and fill in Host, Port, Database name, User, Password:
# 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 # Database name
POSTGRES_USER=kaneo # User
POSTGRES_PASSWORD= # Password
AUTH_SECRET=
TZ=UTC
# Database: Your own PostgreSQL
POSTGRES_HOST= # Host
POSTGRES_PORT=5432 # Port
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
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
Then run podman-compose up -d.
Database Where Kaneo keeps its projects and tasks. The default runs its own PostgreSQL.
Built-in PostgreSQL Your 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}'
# 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.
kaneo:latest · your own database — data in /containers /kaneo/config
A PostgreSQL you already run. Create the database and a user with full privileges on it first.
# .env
DIRECTOR_PROJECT=kaneo
PUID=1000
PGID=1000
TZ=UTC
KANEO_CLIENT_URL=http://localhost:5173
POSTGRES_HOST=
POSTGRES_PORT=5432
POSTGRES_DB=kaneo
POSTGRES_USER=kaneo
POSTGRES_PASSWORD=
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
volumes :
KANEO_CONFIG_PATH :
device : '/containers /kaneo '
# 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.