Use Mullgate
Operate Mullgate as an operator, not as a code contributor. Prefer official docs and the live CLI help, then give the user exact commands or proxy URLs that match the current saved posture.
Grounding
Read these before acting:
references/official-docs.mdfor the official public docs mapreferences/operator-playbooks.mdfor concrete task playbooks
Treat these as the authority order:
- official public docs at
https://mullgate.micr.dev - live CLI help such as
mullgate setup --helpormullgate proxy access --help - local repo docs such as
README.mdanddocs/usage.md
Do not use docs/maintainers/ for normal operator tasks.
Mental Model
Treat Mullgate as two separate choices:
- exposure mode
loopback- local-only proof on one machineprivate-network- one trusted-network host, usually a LAN or Tailscale IPpublic- internet-reachable listeners
- access mode
published-routes- default; routes are selected by hostname or per-route port inventoryinline-selector- opt-in; one shared listener per protocol and the route selector goes in the proxy username
Core Rules
- In
private-network, use the host's real trusted-network IP, not0.0.0.0. On Tailscale, that usually means the host100.xaddress. - In
private-network + published-routes, all routes can share one trusted-network host IP because route selection moves to per-route ports. - In
inline-selector, one shared host works in every exposure mode because route selection moves to the username. - Use the guaranteed inline-selector URL form
scheme://selector:@host:port. The shorterscheme://selector@host:portform is best-effort only. mullgate proxy exportcurrently supportspublished-routesonly.public + inline-selector + empty passwordis blocked unless the operator explicitly enables--unsafe-public-empty-password.- Linux is the only fully supported runtime target.
Intent Mapping
Map the request before choosing commands:
- "Set up Mullgate locally" or "prove it works on this machine"
- use
loopback - keep
published-routes
- use
- "Expose Mullgate over Tailscale", "use it from another machine on my VPN", or "private network"
- use
private-network - prefer the host's Tailscale
100.xIP
- use
- "Use one host and choose country, city, or server in the proxy URL itself"
- use
private-networkunless the user explicitly wants public exposure - switch to
inline-selector
- use
- "Give me a proxy list or file I can import elsewhere"
- keep or switch to
published-routes - use
mullgate proxy export
- keep or switch to
- "Validate what start would render without touching Docker"
- use
mullgate proxy start --dry-run
- use
- "Restart the saved runtime cleanly"
- use
mullgate proxy restart
- use
- "Stop the runtime" or "show me the container logs"
- use
mullgate proxy stopormullgate proxy logs --tail 200
- use
- "Start automatically after reboot"
- use
mullgate proxy autostart enable - verify with
mullgate proxy autostart status
- use
- "What version is installed?" or "generate shell completion scripts"
- use
mullgate versionormullgate completions <bash|zsh|fish>
- use
Default Workflow
- Inspect current posture with
mullgate proxy access. - Change exposure or access with
mullgate proxy access --mode ... --access-mode ... --route-bind-ip ...when needed. - Preflight the rendered bundle with
mullgate proxy start --dry-runwhen runtime changes are risky. - Launch or relaunch with
mullgate proxy startormullgate proxy restart. - Check live/runtime truth with
mullgate proxy status. - Pull bundle evidence with
mullgate proxy logs --tail 200. - Diagnose failures with
mullgate proxy doctor.
Playbooks
Use references/operator-playbooks.md when the user asks for:
- Tailscale or private-network exposure
- inline country, city, or exact relay selection in the proxy username
- generated proxy inventory export
- relay listing, probing, recommendation, or exact-exit verification
- Linux autostart after login or reboot
Output Style
- Prefer short, operator-facing answers with exact commands.
- If the user asks for a working proxy URL, give the exact URL shape they should use.
- If the user asks for a list or file, switch to the export workflow instead of inventing selector URLs.
- If a request is risky, say why and name the safer alternative.