Self-host your assistant

Uruchom asystenta u siebie

The whole agent is one Docker container. No account with us, no dashboard, no telemetry. You bring a dedicated mailbox for it and an OpenRouter key, and everything it learns stays on your machine.

Self-hosting means you are the operator: you own the updates and the backups. That is the deal. This page is the shortest honest path through it.

01 What you need

01

A dedicated mailbox

The agent gets its own address — never your personal inbox. Any mailbox with IMAP and SMTP will do: one from a mail provider, or one on a server you run.

02

OpenRouter API key

The only external service it calls. Create a key, set a monthly spend limit, keep it near-empty. Everything else is local.

03

Docker

A VPS, a home server, a NAS, a Raspberry Pi — anything that runs Docker. The agent opens no ports; it only connects out.

A dedicated address at a mail provider

Create a separate address for the agent at your mail provider — or a new one. No server to run, no DNS to edit. About 15 minutes, start to first reply.

  1. Get an OpenRouter key

    Create an account at openrouter.ai, add a small amount of credit, and create a key with a monthly limit. That limit is your blast radius if anything goes wrong.

  2. Create the agent's own mailbox

    Create a separate, dedicated address for the agent (e.g. [email protected]). Do not use your personal inbox. Turn on IMAP/SMTP access and create an app password — never your main login password.

    Common providers and their servers:

    ProviderIMAPSMTP
    Gmail / Workspaceimap.gmail.comsmtp.gmail.com
    Fastmailimap.fastmail.comsmtp.fastmail.com
    mailbox.orgimap.mailbox.orgsmtp.mailbox.org
    Migaduimap.migadu.comsmtp.migadu.com
    Zoho Mailimap.zoho.comsmtp.zoho.com
    iCloud+imap.mail.me.comsmtp.mail.me.com
    Gmail: app passwords only appear after you turn on 2-Step Verification. Use port 465 (SSL) or 587 (STARTTLS).
  3. Install Docker

    Follow the official instructions for your system at docs.docker.com. You need the docker compose plugin (v2).

  4. Download the compose file and fill it in

    terminal
    mkdir -p ~/uff-agent/brain && cd ~/uff-agent
    curl -O https://raw.githubusercontent.com/worotyns/uff-agent/main/docker-compose.yml
    nano docker-compose.yml

    Everything is set in the environment: block — there is no separate .env file. The values that matter:

    docker-compose.yml
    OPENROUTER_KEY: sk-or-v1-...
    EMAIL_USER: [email protected]   # dedicated mailbox
    EMAIL_PASSWORD: your-app-password
    EMAIL_IMAP_HOST: imap.yourdomain.com
    EMAIL_SMTP_HOST: smtp.yourdomain.com
    EMAIL_OWNER: [email protected]        # only this address may write
    USER_LANGUAGE: pl
    USER_TIMEZONE: Europe/Warsaw
    EMAIL_OWNER is the security boundary. Only this address can talk to the agent. Mail from anyone else is logged and dropped.
  5. Start it

    terminal
    docker compose up -d
    docker compose logs -f

    You should see the config load, the IMAP listener connect, and the scheduler start. It then sits quietly, polling the inbox.

  6. Test it — allowed and denied

    Send an email from EMAIL_OWNER to the agent's address, e.g. “Summarize this thread and list the next steps.” A reply should arrive in the same thread.

    Then send one from a different address. Nothing should happen to you — the agent ignores it and the log shows “ignored email … (not in whitelist)”. That is the whole access-control model, and it is worth seeing it work once.

    Where did the test mail go? By default EMAIL_DELETE_AFTER_READ=true, so the agent removes each message from its inbox once processed. Set it to false if you want them kept.
  7. Keep it alive

    terminal
    # update to the latest image
    docker compose pull && docker compose up -d
    
    # back up everything it knows
    tar czf uff-brain-$(date +%F).tar.gz brain/

    brain/ is the entire state: memory, threads, indexed documents, its config and its personality. It is the only thing worth backing up.

02 Gotchas

What actually breaks

  • [!]

    Your main password in the compose file. Use an app password, scoped to mail, revocable on its own. You will paste this file into terminals.

  • [!]

    No backups. brain/ is months of accumulated memory. Losing it is losing the assistant's whole history. Back it up like it matters.

Or let us run it

Same assistant, no VPS, no DNS, no 3 a.m. mail-deliverability debugging. We keep it updated and encrypted; you just write to it.

Get your address

Questions about self-hosting? Write to [email protected].