# Jun

Self-hosted dashboard that runs and supervises [Codex](https://developers.openai.com/codex) as a 24/7 agent on your own machine or VPS.

- **Chat runs** — full Codex conversations with live streaming, reasoning, tool cards, approvals, steering, models/effort/sandbox per conversation
- **Workspaces** — multiple isolated project workspaces with a file tree, editor, and previews
- **Remote browser** — watch the agent browse in a live viewport, take manual control, WAF-resistant stealth engine, proxy support
- **Skills** — create, edit, and test agent skills; install from the [skills.sh](https://skills.sh) registry
- **MCP** — manage MCP servers from the UI; Jun ships its own MCP server so the agent can manage itself
- **Schedules** — cron or one-off automated runs, unattended approval mode
- **Memories** — Codex's native memory feature, surfaced and editable

## Requirements

- [Bun](https://bun.sh) ≥ 1.2
- [Codex CLI](https://developers.openai.com/codex) on your PATH (`npm i -g @openai/codex`) with a signed-in account

## Install

```bash
bun install -g junhost
jun start
```

Open http://127.0.0.1:8787. Sign in to Codex from the Settings page (device-code flow works on headless servers).

```bash
jun doctor   # check prerequisites
jun help
```

## Where things live

All state is in `~/.jun` (override with `JUN_HOME`): projects/workspaces, run history (JSONL), schedules, config. The daemon binds `127.0.0.1` by default (override `JUN_HOST`/`JUN_PORT`) — for quick remote access, tunnel: `ssh -L 8787:127.0.0.1:8787 user@host`.

## Run on a VPS (Debian/Ubuntu)

```bash
# Bun + Codex CLI
curl -fsSL https://bun.sh/install | bash && export PATH="$HOME/.bun/bin:$PATH"
npm install -g @openai/codex

# Chromium system libs — required, or the stealth browser engine can't launch
# and sites behind edge WAFs will block the agent. (libasound2 on Ubuntu <24.04.)
apt-get update && apt-get install -y \
  libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libgbm1 libdrm2 \
  libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
  libpango-1.0-0 libcairo2 libxshmfence1 libasound2t64

bun install -g junhost && jun doctor
```

Run it as a systemd service — `/etc/systemd/system/jun.service`:

```ini
[Unit]
Description=Jun
After=network-online.target
Wants=network-online.target

[Service]
Environment=JUN_HOME=/var/lib/jun
Environment=PATH=/root/.bun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/root/.bun/bin/bun /root/.bun/bin/jun start
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
```

```bash
systemctl daemon-reload && systemctl enable --now jun
```

To reach the dashboard, either SSH-tunnel, or put Caddy in front for HTTPS (`reverse_proxy 127.0.0.1:8787` — WebSockets work automatically; add `basic_auth`, since Jun has no built-in login yet). Sign in to Codex from Settings — the device-code flow works headless. If the box has a datacenter IP, set a residential browser proxy in Settings → Browser proxy (or `JUN_BROWSER_PROXY=http://user:pass@host:port`; in a systemd drop-in use raw `%`-free credentials — `%` is a systemd escape). Upgrade anytime: `jun upgrade && systemctl restart jun`.

## License

Proprietary — all rights reserved. Free to install and use; the source is not open.
