curl -fsSL https://yuralume.com/install.sh | bash
One command brings up the whole stack with Docker. Your characters, memories, and chats stay local — bring your own LLM key, and nothing is metered or phones home.
curl -fsSL https://yuralume.com/install.sh | bash
irm https://yuralume.com/install.ps1 | iex
The whole install, captured end to end — from one command to a character you can talk to. No speed-ups, no edits.
Install Docker, then run the line above. It downloads the images and starts everything.
Open http://127.0.0.1:8012 → Admin → Provider Keys and add one LLM key.
Create a character and start chatting. Memory, schedules, and proactive messages run from there.
The one manual step: Yuralume is bring-your-own-key, so chat needs at least one LLM provider. Add it in Admin → Provider Keys (OpenAI, OpenRouter, a local model — anything compatible); keys are encrypted in your database and never leave your machine. The bundled fake provider keeps the app runnable for a smoke test but won't produce real conversation.
Docker Desktop on macOS/Windows, Docker Engine on Linux. The installer checks for it and links the download if it's missing.
Bring your own — OpenAI, OpenRouter, a local OpenAI-compatible endpoint, anything supported. Added after install; never stored in plain text.
For the images plus your data. Everything runs in containers and removes cleanly with one command.
All commands run from your install directory (~/yuralume). Re-running the installer is also safe — it upgrades images and keeps your secrets and data.
Tail logs
docker compose logs -f app
Update to the latest build
docker compose pull && docker compose up -d
Stop (data is kept)
docker compose down
Reset — deletes all local data
docker compose down -v
| Service | Port (localhost) | Purpose |
|---|---|---|
| app | 8012 | API + web UI |
| postgres | 5554 | database (named volume) |
| storage-local | 9012 | object storage (./uploads) |
| whatsapp-sidecar | 32190 | optional WhatsApp channel |
Every port binds to 127.0.0.1 only. To expose Yuralume on a LAN or VPS, put it behind a reverse proxy and set APP_BASE_URL in .env.container.
| Variable | Default | Meaning |
|---|---|---|
YURALUME_HOME | ~/yuralume | install directory |
YURALUME_IMAGE_TAG | latest | pin a published build (e.g. v0.1.0) |
YURALUME_INSTALL_BASE | https://yuralume.com | where to fetch the bundle |
Set these in your shell before running the one-liner.
mkdir -p ~/yuralume/prompts/tuned ~/yuralume/uploads && cd ~/yuralume
curl -fsSL https://yuralume.com/selfhost/docker-compose.yml -o docker-compose.yml
curl -fsSL https://yuralume.com/selfhost/env.example -o .env.container
# edit .env.container: replace every __...__ token with a long random string
COMPOSE_PROJECT_NAME=yuralume docker compose pull
COMPOSE_PROJECT_NAME=yuralume docker compose up -d
The image ships the baseline prompt pack, so this is optional. To override prompts, drop .txt files under prompts/tuned/ using the same relative paths as the baseline (e.g. chat/instructions_footer.txt), set YURALUME_PROMPT_PACK_DIR=/app/prompts/tuned in .env.container, and run docker compose up -d. Startup logs then show Prompt pack overlay loaded with the template count.
The installer stops with a message. Start Docker Desktop (wait for the whale to settle), or sudo systemctl start docker on Linux, then re-run.
On first boot it may still be migrating. Check docker compose ps and logs -f app; the one-shot migrate step runs before the app starts.
Something else holds 8012/5554/9012/32190. Stop it, or change the host port in docker-compose.yml and APP_BASE_URL.
Re-running the one-liner upgrades in place. For a clean slate, docker compose down -v removes all containers and local data.
Play the live demo without installing anything, or join Discord for self-host support.