These steps take you from nothing to a running instance with its first agent. You can run the
published image, which Docker downloads from GHCR, or build the image from source on your own
machine. The published image is the tested release, built for amd64 and arm64, and it is the right
choice unless you want to run your own changes or main between releases. Where the steps differ,
both ways are shown.
What you need
- Docker Engine 24 or later with Docker Compose v2 (Docker Desktop includes both), on amd64 or arm64.
- At least 4 GB of RAM.
gitandopenssl.- Access to a model: an API key from Anthropic, OpenAI or OpenRouter, or a subscription you sign in to from the Terminal page in step 8.
Step 1. Download KyoubeAI
Published image: clone the release you will run.
git clone --branch v1.0.0 https://github.com/jknigel/KyoubeAI.git
cd KyoubeAI
Git reports a "detached HEAD" here. That is expected, because the checkout is pinned to the release tag.
From source: clone main.
git clone https://github.com/jknigel/KyoubeAI.git
cd KyoubeAI
Step 2. Create your settings file
.env holds your settings and secrets. Create it from the template and fill the three required
secrets with random values:
cp .env.example .env
for key in BETTER_AUTH_SECRET POSTGRES_PASSWORD KYOUBE_DB_PASSWORD; do
sed -i.bak "s/^$key=\$/$key=$(openssl rand -hex 32)/" .env
done
rm .env.bak
The loop only fills empty values, so running it twice is safe. To do it by hand instead, run
openssl rand -hex 32 three times and paste one result after each of the three keys. The two
database passwords must contain only letters and digits, which is what that command produces.
Keep a copy of .env somewhere safe. Restoring a backup onto a new machine needs the same
BETTER_AUTH_SECRET and database passwords.
Two optional settings are worth adding while the file is open:
- A model provider key (
ANTHROPIC_API_KEY,OPENAI_API_KEYorOPENROUTER_API_KEY), so agents can work as soon as KyoubeAI starts. KYOUBE_PUBLIC_URL, if people will open KyoubeAI from other machines (Reaching KyoubeAI from other machines).
Step 3. Point .env at the published image
Skip this step if you build from source.
Near the bottom of .env, under "Optional: prebuilt image", uncomment the two lines so they read:
KYOUBE_IMAGE=ghcr.io/jknigel/kyoubeai
KYOUBE_VERSION=1.0.0
This command does the same:
sed -i.bak -e 's/^# KYOUBE_IMAGE=/KYOUBE_IMAGE=/' -e 's/^# KYOUBE_VERSION=/KYOUBE_VERSION=/' .env && rm .env.bak
The version must match the tag you cloned.
Step 4. Start KyoubeAI
Published image: download the image, then start.
docker compose pull
docker compose up -d
Run the pull on its own and read how it ends. If it reports denied, stop there: the image is not
public, or this machine has to log in to GHCR first
(the published image on GHCR). A
docker compose up -d after a failed pull quietly builds the image from source instead.
From source: build and start in one go.
docker compose up -d --build
Then watch the services come up:
docker compose ps
Wait until app reads healthy. The first start runs the database migrations, and the health check
allows up to three minutes for them.
Step 5. Sign up and claim the instance
Open http://localhost:3100 (or the KYOUBE_PUBLIC_URL you set), sign up, and claim the instance.
Whoever claims it becomes the instance admin.
The first-run wizard then sets up your company and its first agent. On its Connect a model step, an API key works straight away. A Claude or OpenAI subscription cannot be signed in from the wizard on a KyoubeAI server, so if you have no key, choose Skip for now and connect the harness later from the Terminal page. The agent is created anyway, and it starts working once its harness is connected in step 8.
The browser claim only works while KYOUBE_DEPLOYMENT_EXPOSURE=private, which is the default. For an
instance on the internet, claim it first and switch to public afterwards.
Step 6. Install the Kyoube plugins
Run this once:
docker compose exec app kyoube setup
It prints a link and asks you to approve the command-line login as an instance admin. Open the link in the browser where you are signed in and approve it before it expires. From then on the plugins install and upgrade themselves every time KyoubeAI starts.
Step 7. Check the installation
docker compose exec app kyoube doctor
Every check should pass, and each kyoube.* plugin should read =ready. The harness credential lines
at the end only report what is signed in, so they say "not found" until the next step.
Step 8. Connect the agent harnesses
Agents work through Claude Code, pi or Hermes Agent, and each harness needs access to a model. Use either way, or both:
- API keys: put
ANTHROPIC_API_KEY,OPENAI_API_KEYorOPENROUTER_API_KEYin.env, then rundocker compose up -dto apply them. - Signing in from the browser: open the Workspace page at the bottom of the sidebar, then
Terminal, and run
claude loginfor Claude Code,pifor pi, orhermes setupfor Hermes Agent. The credentials are stored on thekyoubeai-homevolume, so they survive restarts and updates.
Run kyoube doctor again to see the harnesses you connected.
To let an agent work with company data, enable the Kyoube Data and Kyoube Apps skills on its Skills tab and give it an access level under Company Settings → Data access. Data explains the levels.
Reaching KyoubeAI from other machines
KyoubeAI listens on every network interface, so other machines can already reach it on port 3100. Tell it the address people will use:
- Set
KYOUBE_PUBLIC_URLin.envto the exact address people type, such ashttp://192.168.1.10:3100orhttps://kyoube.example.com. Sign-in and thekyoube setuplink are built from it, so a wrong value sends people to the wrong host. - Behind a reverse proxy or tunnel on the same Docker network (Caddy, Traefik, nginx or cloudflared),
also set
TRUST_PROXY=uniquelocal. - For an instance on the internet, put TLS in front and set
KYOUBE_DEPLOYMENT_EXPOSURE=public.kyoube doctorfails a public instance whose address does not start withhttps://. - Apply the changes with
docker compose up -d.
To use a port other than 3100, set KYOUBE_PORT and put the same port in KYOUBE_PUBLIC_URL. On a
localhost or 127.0.0.1 address, also set BETTER_AUTH_TRUSTED_ORIGINS to that origin (for
example http://localhost:3199). The core maps a loopback address back to its internal port and
would otherwise reject sign-ins from the new one.
Troubleshooting
| What you see | What to do |
|---|---|
docker compose pull reports denied | The image is not public yet, or this machine must log in to GHCR (how). Do not run docker compose up -d until the pull works. |
| Sign-in fails with a 403 or an origin error | KYOUBE_PUBLIC_URL must match the address in the browser exactly. On another localhost port, set BETTER_AUTH_TRUSTED_ORIGINS; behind a proxy, set TRUST_PROXY. |
| "Browser first-admin claim is not available" | KYOUBE_DEPLOYMENT_EXPOSURE is public. Set it to private, run docker compose up -d, claim the instance, then switch back. |
| The build stops at the core-patches step and names two core versions | KYOUBE_CORE_VERSION in .env is left over from an older release. Copy the value from .env.example and build again. |
kyoube doctor shows a plugin that is not =ready | Read the plugin's log under Settings → Plugins → plugin → Logs, and docker compose logs -f app. |