Two files, one command.
Kendoshi Team ships as a Docker image for a Linux server or NAS.
This page takes you from an empty machine to the first login.
Without a license exactly one user can work, with no time limit.
The license line from your purchase email unlocks the team.
Image: ghcr.io/nicowski2000/kendoshi-team · Version 2.14.0 · amd64 and arm64 · The admin handbook is an HTML file that also drops straight into Zimezumi
What you need.
A small server is enough: a Raspberry Pi 4, a NAS with Docker or the smallest plan at any hosting provider.
Docker
Linux server or NAS with Docker and Docker Compose v2. Check with docker compose version.
Domain
A subdomain with an A record pointing at the server, e.g. kendoshi.your-domain.com. The server fetches its own HTTPS certificate.
Ports
80 and 443 open, including your provider's firewall.
Architecture
amd64 or arm64: Intel and AMD servers, ARM NAS, Raspberry Pi 4 or newer.
Four steps to the first login.
Paste each block into a terminal on the server. The two files live here on posthopeproduction.com.
1 · Create a folder and fetch the two files
The compose file describes the services, the .env holds your values.
mkdir -p ~/kendoshi && cd ~/kendoshi
curl -fsSL https://posthopeproduction.com/kendoshi/docker-compose.release.yml -o docker-compose.yml
curl -fsSL https://posthopeproduction.com/kendoshi/env.example -o .env2 · Fill in .env
Two values are required: DOMAIN and AUTH_SECRET. Leave the rest empty.
openssl rand -hex 32 # use the output as AUTH_SECRET
nano .env # set DOMAIN and AUTH_SECRET3 · Start
On first start Caddy obtains the HTTPS certificate for your domain and the app creates its database.
docker compose up -d4 · Setup token and admin account
Open https://your-domain in the browser. The first visit asks for a setup token so that a random visitor cannot become admin. It is in the log. Enter it, choose name, email and password. That is the admin account.
docker compose logs app | grep Setup-TokenTo pick the token yourself, set BOARDIST_SETUP_TOKEN in .env before the first start
One user free, the team with a license.
One user works without a license, with no time limit. As soon as a second user is to be invited, the server asks for the license. It is one line of text from your purchase email and starts with PHP1.
Way one: in the app under Settings, section License, paste the line and click Lizenz einspielen. The page then shows who it is issued to. Way two: put it into .env as KENDOSHI_LICENSE and run docker compose up -d. The environment variable then wins and the field in the app is read-only.
Verification runs offline against a built-in key. No network, no activation, no device binding. Existing users and data are never affected by the license.
One price per server, no subscription · The license arrives by email after purchase, usually the same day
Backup, update, restore.
All data lives in a single SQLite file inside the Docker volume boardist-data. Backup means copying that one file.
Manual backup
The server also writes a dated backup to /data/backups/ on every start and keeps the last seven. Store the copy somewhere else.
docker compose exec app cp /data/boardist.db /data/backups/boardist-manual.db
docker cp "$(docker compose ps -q app)":/data/backups/boardist-manual.db ./kendoshi-backup-$(date +%Y-%m-%d).dbDaily backup via cron
One line in crontab -e, here for three in the morning.
0 3 * * * cd ~/kendoshi && docker compose exec -T app cp /data/boardist.db /data/backups/boardist-cron.db && docker cp "$(docker compose ps -q app)":/data/backups/boardist-cron.db ~/kendoshi-backup-$(date +\%Y\%m\%d).dbUpdate
Before any schema change the container writes a copy boardist.pre-push.db and applies the change itself. Set the version in the compose file to the new one, or use latest.
cd ~/kendoshi
docker compose pull
docker compose up -dRestore
Stop the container, copy the file, start. The file name is your backup.
cd ~/kendoshi
docker compose stop app
docker cp ./kendoshi-backup-2026-09-18.db "$(docker compose ps -q -a app)":/data/boardist.db
docker compose start appWhen something sticks.
First visit says: Setup-Token fehlt.
Intended. docker compose logs app | grep Setup-Token shows it.
HTTPS does not work.
Check DNS: ping your-domain must show the server IP. Ports 80 and 443 must be reachable from outside. Log: docker compose logs caddy.
Container does not start, log says: AUTH_SECRET fehlt.
The value is missing in .env. Run openssl rand -hex 32, add it, then docker compose up -d.
Attempt to write a readonly database.
The volume is not owned by user node (UID 1000), for example after a move. Once: docker compose stop app && docker run --rm -v kendoshi_boardist-data:/data alpine chown -R 1000:1000 /data && docker compose start app. docker volume ls shows the volume name.
Invite says: Ohne Lizenz arbeitet genau ein Benutzer.
Install the license, see section 03. The invite link stays valid.
Diese Lizenz gehört nicht zu Kendoshi Team.
That is a license for another Post Hope product, Zimezumi or Switchy. Paste the Kendoshi Team line from your purchase email.
Der Schlüssel scheint unvollständig kopiert zu sein.
Copy the whole line, from PHP1. to the last character. Line breaks from the mail client are fine.
Everyone got logged out.
AUTH_SECRET changed. Normal after changing the value, everyone signs in again.
How do I connect the app on Mac, iPhone and iPad?
In the app choose Connect to team, enter https://your-domain and your personal API token from Settings, section API-Token.
Where is the AI assistant?
Not part of the server package. No API key needed.
Running the server is your responsibility: availability, updates, backups, data protection towards your team · Questions to help@posthopeproduction.com
The server is yours.
No hosted service, no account with the developer. Whoever runs the server holds the data. The admin handbook explains the same steps in more depth, with ready-made prompts for an AI that does the setup for you.