Repository navigation
v2.29.0: Stable boot executable paths and Ctrl+C shutdown on Windows
Boot registrations can now point at a stable executable path that survives package-manager upgrades. On Windows, daemons with stop_signal = "SIGINT" now get Ctrl+C, so they can shut down cleanly. This release also adds config add --label for proxy hostnames, gives a clear error when the state directory path is too long for the socket, and removes a broken MessagePack IPC mode.
Added
-
boot.executablesetting for stable boot registrations (#940) by @jdx. If you install pitchfork through a versioned package manager, the boot registration can end up pointing at a binary that a later upgrade removes. You can now set an absolute, stable path, such as a miselatestsymlink. Pitchfork writes that path into the registration exactly as given and uses it when it repairs a stale entry.[settings.boot] executable = "/home/alice/.local/share/mise/installs/pitchfork/latest/pitchfork"
Put this in user or system config, or set
PITCHFORK_BOOT_EXECUTABLE, then runpitchfork boot enable(orsudo pitchfork boot enablefor a system service). Project config can't set it. The path must be absolute, must exist and must be executable. An invalid path makes registration fail, and automatic repair leaves the existing entry unchanged. If you leave it empty, pitchfork uses the running binary's resolved path, as before. Related change:pitchfork settings setnow requires--globalfor global-only settings and rejects settings that can only be set through environment variables. For example:pitchfork settings set boot.executable /path/to/pitchfork --global. -
pitchfork config add --labelto choose the project hostname label (#956) by @jdx. Tools that register a project under a generated namespace, such as mise'sshop-528f92b13a6784f0, used to get proxy hostnames likeweb.shop-528f92b13a6784f0.localhost. Requests to the hostname the tool printed, such asweb.shop.localhost, failed with 404 "Unknown project". A registration can now name its label:pitchfork config add gen/pitchfork.toml --dir ~/src/shop \ --namespace shop-528f92b13a6784f0 --label shopThis routes
web.shop.localhostand linked worktrees such asweb.feat-x.shop.localhost. The project label now comes from the registered label first, then the explicit namespace, then the directory name. The label must already be a valid hostname label. Re-adding the config without--labelkeeps the existing label.pitchfork config list --jsonnow includeslabel. -
Pitchfork agent skill (#942) by @jdx. Releases now publish a
pitchforkagent skill through Packslip. The skill covers configuring daemons, readiness checks, dependencies, ports, restarts and diagnosing problems from logs. You need a mise version with Packslip skill support:mise use packslip:github.com/jdx/pitchfork mise skills sync --dir .agents/skills
Fixed
-
stop_signal = "SIGINT"now sends Ctrl+C on Windows (#931) by @JamBalaya56562. Previously, Windows ignoredstop_signaland force-killed every daemon withtaskkill /F /T. Daemons like PostgreSQL were left needing crash recovery. Now these daemons get Ctrl+C and have until their stop timeout to exit before pitchfork terminates them. Any other signal, including the defaultSIGTERM, still terminates the daemon right away. Limitations:- Delivery is best effort. A child process that ignores Ctrl+C and outlives the daemon keeps running.
- Under
pitchfork supervisor runon a real console, daemons that share the supervisor's console are terminated without Ctrl+C.
Unix behavior is unchanged.
-
Clear error when the state directory is too long for the supervisor socket (#955) by @jdx. On Unix, the socket path
<state dir>/sock/main.sockmust fit in 108 bytes on Linux or 104 on macOS. IfPITCHFORK_STATE_DIRorXDG_STATE_HOMEmade it longer, commands used to fail after five connection retries with a generic error. They now fail right away withpitchfork::ipc::socket_path_too_long. The message shows the path, its length and the limit, and suggests a shorter state directory. -
Removed the broken MessagePack IPC mode (#930) by @JamBalaya56562. Setting the undocumented
IPC_JSON=falseswitched IPC to MessagePack, which caused errors such asmessage contains null bytewhen starting daemons. IPC now always uses JSON, andIPC_JSONno longer has any effect. The default setup already used JSON, so nothing changes for it.
Full Changelog: v2.28.0...v2.29.0
💚 Sponsor pitchfork
pitchfork is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If pitchfork has a place in your development workflow, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep pitchfork fast, free, and independent.