Skip to content

v2.14.0: Shells, statuses, and structured output

Choose a tag to compare

@jdx jdx released this 21 Jun 16:03
· 208 commits to main since this release
Immutable release. Only release title and notes can be modified.
eca6d09

A practical release focused on day-to-day ergonomics: filterable daemon lists, machine-readable output across the CLI, a configurable shell for run commands, and fixes for HTTPS proxying and TUI scrolling.

Added

  • pitchfork list --status <STATUS> (#529) — @gaojunran. Filter the daemon list by one or more statuses (running, stopped, waiting, stopping, failed, errored, available, disabled). The flag is repeatable and combines with OR logic:

    pitchfork ls --status running
    pitchfork ls --status available --status stopped

    Shell completion for daemon IDs is now subcommand-aware — pitchfork stop <TAB> only suggests running daemons, pitchfork start <TAB> only suggests available/stopped/errored/failed ones, and so on.

  • --json flag across the CLI (#527) — @gaojunran. list, status, logs, daemons, proxy status, and settings (including settings list / settings get) can now emit structured JSON suitable for scripting. Each command returns command-specific fields, e.g. list includes id, namespace, name, pid, status, disabled, available, proxy_url, error, and port; proxy status includes computed LAN/TLS info and slug entries.

  • logs.timestamp setting and --no-timestamp flag (#526) — @gaojunran. Strip the leading timestamp from pitchfork logs output, useful when piping into tools like lnav or processing JSON log lines. Configure globally via logs.timestamp = false (or PITCHFORK_LOG_TIMESTAMP=false), or per-invocation with pitchfork logs --no-timestamp.

  • Configurable shell for daemon run commands (#531) — @gaojunran. New general.shell setting (default "sh -c") controls how run scripts are executed. The run string is now passed verbatim as the final argument to the shell, fixing a previous split→join round-trip that mangled variable expansion and globs.

    [settings.general]
    shell = "bash -c"
    # or for safer defaults:
    # shell = "sh -o errexit -o pipefail -c"

    Because pitchfork wraps run in a shell, the tracked PID is the shell process. To make it match your daemon binary, prefix with exec:

    [daemons.api]
    run = "exec node server.js"

Fixed

  • Proxy: downgrade forwarded requests to HTTP/1.1 (#515) — @iain. Since v2.10.0 the TLS proxy advertised h2 via ALPN, so browsers connected with HTTP/2 and the request was forwarded upstream still tagged HTTP/2 — which HTTP/1.1 backends (e.g. Vite dev server) rejected, producing 502s. The proxy now normalizes forwarded requests to HTTP/1.1.

  • TUI: daemon list scrolls with the selection (#519) — @disintegrator. The dashboard table is now rendered as a stateful widget so the viewport follows the selected row when navigating past the visible area.

  • pitchfork list table layout (#529) — Disabled marker, proxy URL, and error message are merged into a single trailing column with priority-based coloring (error > disabled > proxy), making the table easier to read on narrow terminals.

  • Dependency updates with user-visible upstream fixes: listeners 0.6 (#525), sysinfo 0.39 (#500), rusqlite 0.40 (#498), mdns-sd 0.20 (#497), and vue-router v5 for the web UI (#506).

Documentation

  • Added Web UI screenshots to the docs (#528) — @gaojunran.
  • Fixed a broken Tera template link in configuration-templates.md (#520) — @StefanBRas.

New Contributors

Full Changelog: v2.13.1...v2.14.0

💚 Sponsor pitchfork

pitchfork is built by @jdx, who ships developer tools like mise, hk, pitchfork, and more. Development is sustained by sponsorships.

If pitchfork has a place in your dev workflow, please consider sponsoring on GitHub. Individual and company sponsorships are what keep the project healthy and moving forward.