v0.5.0 - 2026-07-09
Added
- Added a Unix domain socket event bus (
events.sock) so external tools can subscribe to real-time process lifecycle, log, and health events without polling the HTTP API. - Added
BusEvent— a tagged NDJSON enum coveringprocess:started,process:online,process:stopped,process:restarting,process:errored,process:crashed,process:exited,log:out,log:err,health:healthy,health:unhealthy, anddaemon:shutdown. - Added
--jsonflag tooxmgr list(aliasoxmgr ls) that serializes the managed-process list to a JSON array viaserde, instead of the human-readable table. Empty lists emit[]. Each entry reflects the fullManagedProcessschema (id, name, command, args, status, pid, cpu_percent, memory_bytes, restart_count, cluster_mode, health_status, etc.). Useful for scripting and piping to tools likejq. Thanks to @kvndrsslr for their first contribution in #66. - Added
oxmgr eventsCLI command to stream events from the daemon socket, with--filter/-fglob patterns,--process/-pname filter, and--jsonraw output flag. - Added
EventFiltersubscription protocol: client sends one JSON filter object within 500 ms of connecting, then receives a stream of matching NDJSON events. - Unified stdout/stderr log forwarding into a single generic
forward_log_pipefunction; log lines are now always piped and emitted aslog:out/log:errevents regardless oflog_date_format. - Added
prepare_log_fileshelper that handles log rotation and cleanup without keeping file handles open. - Enriched exit/crash events with
signal(POSIX signal name, e.g."SIGSEGV"),uptime_secs(how long the process ran), andstderr_tail(last ≤30 stderr lines — captures stack traces, panics, and tracebacks for any language). - Extended
processobject in all bus events withcommand(full command line) andcwd(working directory). - Added per-app
[apps.logs]table inoxfile.toml(mirrored on[defaults.logs]) withstdout,stderr, andcombinedfields to customize log file destinations. Relative paths resolve against the oxfile directory and support~/$VARexpansion; when unset the daemon keeps its previous default of<log_dir>/<name>.out.log/<name>.err.log(or<name>.logwithunified_logs = true). - PM2 ecosystem importer now recognises
out_file,error_file, andlog_fileand maps them to the same stdout/stderr override pipeline.
Fixed
- Relative
cwdvalues inoxfile.tomland PM2 ecosystem files are now resolved against the directory containing the config file, instead of the daemon's working directory. Absolutecwdvalues are unaffected. ~,~/...,$VAR, and${VAR}are now expanded inenvvalues andcwdpaths when loadingoxfile.tomlor PM2 ecosystem files.$$produces a literal$. Missing variables fail loudly with an error naming the variable rather than silently expanding to an empty string.oxmgr stop/restart/delete/start/reloadwith a bare process name no longer fail withconfig target is not a filewhen a file or directory of the same name exists in the current directory. Lifecycle targets are now treated as config files only when they carry a config extension (toml/js/cjs/mjs/json) or a path separator; bare tokens are always resolved as process names/ids (#58).- npm installer now extracts release archives with
tar(bsdtar ships in Windows 10/11 and on macOS/Linux) instead of shelling out to PowerShell'sExpand-Archive, fixingnpm install -g oxmgrfailures on PowerShell 7 caused byMicrosoft.PowerShell.Archivemodule autoload errors. A PowerShell fallback (with an explicitImport-Module) is kept for older Windows withouttar(#50). - npm installer now selects the static musl binary on Linux systems whose glibc is older than the version required by the prebuilt gnu build (e.g. Debian 12, Ubuntu 22.04), instead of installing a gnu binary that fails to load with
GLIBC_x.yy not found. - Fixed Windows build failures under
cargo clippy -- -D warningsby gating the Unix-only event-bus imports and subscription-filter code so they no longer tripunused_imports/dead_codeon non-Unix targets.
Changed
AppConfiggains anevent_socket_pathfield (default:{base_dir}/events.sock).- Daemon startup now spawns the event socket listener alongside the existing HTTP API and IPC listeners.
- Both daemon shutdown paths (SIGTERM/SIGINT and IPC stop) emit a
daemon:shutdownevent before closing the socket.
Security
- Updated
SECURITY.mdsupported-version table: added0.5.xas a supported release line and dropped0.3.xfrom active support.
Dependencies
- Bumped
tokiofrom1.52.1to1.52.3(via1.52.2) by @dependabot[bot] in #46 and #52. - Bumped
sysinfofrom0.38.4to0.39.5(via0.39.0,0.39.2,0.39.3) by @dependabot[bot] in #45, #55, #61, and #67. - Bumped
nixfrom0.31.2to0.31.3by @dependabot[bot] in #54. - Bumped
anyhowfrom1.0.102to1.0.103by @dependabot[bot] in #68. - Bumped
chronofrom0.4.44to0.4.45by @dependabot[bot] in #60. - Bumped
serde_jsonfrom1.0.149to1.0.150by @dependabot[bot] in #57. - Bumped
regexfrom1.12.3to1.12.4by @dependabot[bot] in #62. - Bumped
serial_testfrom3.4.0to3.5.0by @dependabot[bot] in #59.
New Contributors
- @kvndrsslr made their first contribution in #66.
What's Changed
- chore(deps): bump tokio from 1.52.1 to 1.52.2 by @dependabot[bot] in #46
- chore(deps): bump sysinfo from 0.38.4 to 0.39.0 by @dependabot[bot] in #45
- chore(deps): bump sysinfo from 0.39.0 to 0.39.2 by @dependabot[bot] in #55
- chore(deps): bump nix from 0.31.2 to 0.31.3 by @dependabot[bot] in #54
- chore(deps): bump tokio from 1.52.2 to 1.52.3 by @dependabot[bot] in #52
- chore(deps): bump regex from 1.12.3 to 1.12.4 by @dependabot[bot] in #62
- chore(deps): bump sysinfo from 0.39.2 to 0.39.3 by @dependabot[bot] in #61
- chore(deps): bump serial_test from 3.4.0 to 3.5.0 by @dependabot[bot] in #59
- chore(deps): bump serde_json from 1.0.149 to 1.0.150 by @dependabot[bot] in #57
- chore(deps): bump chrono from 0.4.44 to 0.4.45 by @dependabot[bot] in #60
- feat(cli): add
oxmgr ls --jsonto emit process list as JSON array by @kvndrsslr in #66 - chore(deps): bump anyhow from 1.0.102 to 1.0.103 by @dependabot[bot] in #68
- chore(deps): bump sysinfo from 0.39.3 to 0.39.5 by @dependabot[bot] in #67
New Contributors
- @kvndrsslr made their first contribution in #66
Full Changelog: v0.4.0...v0.5.0