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.
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 computer | a Mac with Apple Silicon, or Linux on x86_64 or ARM64, that stays on while you use it |
| A normal user account | the 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 plan | a Claude or ChatGPT/Codex subscription, or an API key for a compatible endpoint |
| Not needed | Docker, a database server, a cloud account |
node --version # v18 or later? good. Otherwise: your distro's package, NodeSource or nvmnode --version # v18 or later? good. Otherwise:
brew install nodeStep 1 · Run the installer terminal
# as your normal user, not root $ curl -fsSL https://github.com/DayMug/DayMug/releases/latest/download/install.sh | bash
# 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:
- Downloads the latest release for your machine and checks its checksum.
- Offers to install the Claude Agent SDK with npm if it's missing — answer Y.
- Lays out
~/.daymug/: the binary, a defaultconfig.yaml, the database and logs. - 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.logIs that enough? Check two lines, then leave the terminal:
| If the summary says | Do this |
|---|---|
Service: started and no Deps line asking you to install something | Nothing — 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 registered | Run the command printed on that line. |
systemctl --user restart daymug.service # restart the servicelaunchctl 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.
- Point DNS Point an A / AAAA record at this machine.
-
Issue a cert with Let's Encrypt
Certbot installs a renewal timer automatically.
sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d chat.example.com -
Add an nginx server block
In
/etc/nginx/conf.d/daymug.conf. WebSockets need theUpgradeheaders and a longproxy_read_timeout, and raiseclient_max_body_size— nginx's default of 1 MB rejects most file uploads with413 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; } } -
Reload
sudo nginx -t && sudo systemctl reload nginx— done.
-
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. -
Keep WebSocket upgrades (
Upgrade/Connectionheaders), a read timeout of at least 3600 s, and a request-body limit of at least 200 MB (nginx:client_max_body_size 200m). - 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.
-
Open it on this machine
http://127.0.0.1:8090 -
Share with the LAN
Change
server.addrin~/.daymug/config.yamlfrom127.0.0.1:8090to0.0.0.0:8090, then restart:systemctl --user restart daymug.servicelaunchctl 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+.
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.