Install

Pour it once. Drink for years.

DayMug runs on one Mac or Linux computer; every other device — yours, or the people you share it with — just opens it in a browser. Setting it up is one command in the terminal, then a few clicks in the browser. About five minutes.

The whole path

Terminal, once: check Node.js → run the installer. Browser, from then on: create the admin → add an AI account → create an agent and chat. Editing config.yaml and reaching it from other devices are optional.

Before you start

A computera Mac with Apple Silicon, or Linux on x86_64 or ARM64, that stays on while you use it
A normal user accountthe installer refuses to run as root
Node.js 18+Claude runs on it. The installer can't install Node.js itself — get it first from your package manager, nodejs.org or nvm
An AI plana Claude or ChatGPT/Codex subscription, or an API key for a compatible endpoint
Not neededDocker, a database server, a cloud account
node --version   # v18 or later? good. Otherwise: your distro's package, NodeSource or nvm
node --version   # v18 or later? good. Otherwise:
brew install node

Step 1 · Run the installer terminal

one line  — linux
# as your normal user, not root
$ curl -fsSL https://github.com/DayMug/DayMug/releases/latest/download/install.sh | bash
one line  — macOS · apple silicon
# in Terminal, as your normal user
$ curl -fsSL https://github.com/DayMug/DayMug/releases/latest/download/install.sh | bash

It does all of the server-side work, in this order:

  1. Downloads the latest release for your machine and checks its checksum.
  2. Offers to install the Claude Agent SDK with npm if it's missing — answer Y.
  3. Lays out ~/.daymug/: the binary, a default config.yaml, the database and logs.
  4. Registers a systemd user service and starts it. Registers a LaunchAgent (it starts on login) and starts it.

It ends with a short summary. On a machine that already had Node.js it looks like this:

==> DayMug v1.x.y installed: ~/.daymug/daymug
    Service:  started
    Open:     http://127.0.0.1:8090 and create the first admin account
    Next:     add an AI provider under Settings → Administration → Providers & models
    Deps:     installed @anthropic-ai/claude-agent-sdk
    Deps:     Codex (optional): npm install -g @openai/codex
    Trouble:  ~/.daymug/daymug doctor
    Log:      ~/.daymug/logs/daymug.log

Is that enough? Check two lines, then leave the terminal:

If the summary saysDo this
Service: started and no Deps line asking you to install somethingNothing — go to Step 2.
Deps: Node.js 18+ not found or Claude needs: npm install -g …Install what it names (Node.js first, then npm install -g @anthropic-ai/claude-agent-sdk), then restart the service — command below.
Deps: Codex (optional)Only if you'll add a Codex account: npm install -g @openai/codex.
Service: installed, not started or not registeredRun the command printed on that line.
systemctl --user restart daymug.service   # restart the service
launchctl kickstart -k "gui/$(id -u)/com.daymug.daymug"   # restart the service

Re-running the installer is safe: it replaces the binary and keeps your config.yaml and data. Flags (a specific version, no prompts, no service) are under Installer options.

Step 2 · Create the admin browser

Open the address from the Open: line — http://127.0.0.1:8090 by default — on the computer you installed on. An empty instance asks you to create the first administrator; that's your login from now on.

Step 3 · Add an AI account browser

Settings → Administration → Providers & models → add a Claude or Codex account → Log in and approve in the browser (or paste an API key for a compatible endpoint) → add the model you want. Details: Providers & models.

Step 4 · Create an agent and chat browser

Settings → Agents → New Agent: give it a name, say what it's for, pick the folder it works in. Open it in the chat and ask it something — you're set up. Next: Chat.

Optional: edit config.yaml

Everything has working defaults, so most installs never touch ~/.daymug/config.yaml. Two common first edits — restart the service afterwards:

  • admin.bootstrap_usernames — usernames made admin again on every start, so you can't lock yourself out.
  • server.public_url — the address you open DayMug at from other devices, so notification taps land on the right page.

Every field: config.yaml.

Optional: reach it from other devices

DayMug listens on plain HTTP at 127.0.0.1. To let anyone outside this machine connect, put your own public-facing layer in front — a reverse proxy, a tunnel you run, or a VPN. Only using it on this computer? Skip this. You can always come back later.

Path A · your domain + nginx + TLS cert

Terminate TLS yourself with nginx in front of DayMug; works with any cert authority. Use this when you already own a domain, you have a public IP (or your own reverse proxy), or your organisation requires a specific cert chain.

  1. Point DNS Point an A / AAAA record at this machine.
  2. Issue a cert with Let's Encrypt
    sudo apt install -y certbot python3-certbot-nginx
    sudo certbot --nginx -d chat.example.com
    Certbot installs a renewal timer automatically.
  3. Add an nginx server block In /etc/nginx/conf.d/daymug.conf. WebSockets need the Upgrade headers and a long proxy_read_timeout, and raise client_max_body_size — nginx's default of 1 MB rejects most file uploads with 413 Request Entity Too Large:
    server {
      listen 443 ssl http2;
      server_name chat.example.com;
      ssl_certificate     /etc/letsencrypt/live/…/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/…/privkey.pem;
      # nginx defaults to 1m; DayMug takes 25 MB per chat
      # attachment and 200 MB per file-browser upload
      client_max_body_size 200m;
      location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header Connection        "upgrade";
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600s;
      }
    }
  4. Reload sudo nginx -t && sudo systemctl reload nginx — done.
  1. These steps are written for a Linux server. On a Mac, put the reverse proxy or tunnel you already run in front of 127.0.0.1:8090.
  2. Keep WebSocket upgrades (Upgrade / Connection headers), a read timeout of at least 3600 s, and a request-body limit of at least 200 MB (nginx: client_max_body_size 200m).
  3. Nothing to set up? Take Path B.

Prefer Caddy, Traefik, or a tunnel you run yourself? Same rules apply: keep WebSocket upgrades, a long read timeout, and a body-size limit of at least 200 MB.

Path B · localhost / LAN only (quickest)

Skip the public-facing layer. DayMug is reachable on this machine and (optionally) on the same network. Use this when you're evaluating it, you're the only user, or you're inside an office that already has its own VPN.

  1. Open it on this machine http://127.0.0.1:8090
  2. Share with the LAN Change server.addr in ~/.daymug/config.yaml from 127.0.0.1:8090 to 0.0.0.0:8090, then restart:
    systemctl --user restart daymug.service
    launchctl kickstart -k "gui/$(id -u)/com.daymug.daymug"

No certs, no tunnels, no proxy. Anything outside your LAN still can't see it — that's the whole point.

Build from source

The whole project lives in one repository: github.com/DayMug/DayMug. You need Go 1.25+, Node.js 20+ and pnpm 10+.

build a single binary
git clone https://github.com/DayMug/DayMug.git && cd DayMug
cd frontend && pnpm install && pnpm build && cd ..
rm -rf backend/cmd/server/dist && cp -r frontend/dist backend/cmd/server/dist
cd backend && go build -tags embed_frontend -o daymug ./cmd/server

./daymug bootstrap   # lay out ~/.daymug/ and register the service
# or, for a self-contained directory instead of ~/.daymug/:
./daymug init        # writes config.yaml + data/ + users/ here

For hot-reload development (air + pnpm dev), see docs/development/local-development.md in the repository.