Global settings
Machine-wide settings live in ~/.hack/hack.config.json. Use the CLI instead of
editing the file by hand:
hack config get --global sessions.mux
hack config set --global sessions.mux tmuxAutomatic settings updates, including hack env backend use, create a missing
global config but refuse to replace an existing unreadable file, malformed JSON or
a non-object JSON value. An empty file is invalid JSON. Repair the reported file
before retrying; a failed update preserves its contents.
Common settings:
sessions.mux(defaultauto;auto|tmux|zellij|none) — multiplexer forhack session.controlPlane.tui.logs.maxEntries(default2000) — log buffer cap inhack tui.controlPlane.tui.logs.maxLines(default400) — rendered log lines cap.controlPlane.tui.logs.historyTailStep(default200) — history page size.controlPlane.usage.watchIntervalMs(default2000) — sample interval forhack usage --watch.controlPlane.usage.historySize(default24) — sample history forhack usage --watch.proxy.bind_address(default unset: every interface) — host address the global Caddy proxy publishes ports 80 and 443 on. Accepts one IPv4 or IPv6 address, such as127.0.0.1or::1. Set it when another program already listens on :443 on some address (a VPN client, for example) and the proxy fails to start. An address other than every interface stops LAN and tunnel clients from reaching the proxy through this host, and on macOS a host DNS fallback to127.0.0.1needs the proxy on loopback. Apply a change withhack global installin a terminal and answer yes to rewrite the proxy compose file; Compose then recreates the proxy with the new ports. Install andhack doctor --fixrender that file from this setting, so they never revert it.
When hack global up cannot start the proxy, it lists the listeners holding
ports 80 and 443 (address, process and pid when the OS reports them) and names
this setting.
Project-level settings live in .hack/hack.config.json and override global ones
where both apply. Settings for the unsupported gateway, cluster and cloud-provider
extensions also live here under controlPlane.*; see
unsupported retained surfaces.