Skip to content

Release v0.18.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 21:01
· 15 commits to main since this release

v0.18.0

Highlights

  • xs store: 0.13.3 -> 0.14.1. Several behavior changes can affect existing stores and scripts. See the xs 0.14.0 and 0.14.1 release notes for the full list.

    • Services now restart when their pipeline finishes cleanly (restart: "on-success" is the default). A one-shot service, such as a seed or migration step, now runs again every second unless it sets restart: "never".
    • A following read (.cat --follow, .last --follow) now ends when it falls more than 4096 frames behind, instead of silently skipping frames. An SSE client sees its stream close and can reconnect from the last id it received.
    • .id unpack returns ts_ms (integer milliseconds) and when (a datetime) in place of timestamp. .id, .id unpack and .id pack are now three separate commands, so .id unpack $id | get ts_ms type-checks.
    • Frames with a ttl: time:<ms> are now deleted from disk when they expire, not just hidden from reads.
  • Streaming requests release their thread when the client disconnects. Previously a handler streaming to sse from .bus sub, .cat --follow or .last --follow kept its thread until the stream next produced output, which on a quiet topic could be never. The thread is now freed once the client goes away. A stream that is not piped through to sse still holds its thread until it produces its first item.

  • Actors, services and actions can use .mj, .md and .highlight (#48). These were only registered on the HTTP handler engine, so calling them from an xs processor failed. The $HTTP_NU const, -I lib dirs and --plugin commands are not yet available there.

  • Nushell engine: 0.113.1 -> 0.116.0. Scripts may need small edits:

    • str downcase / str upcase are deprecated in favor of str lowercase / str uppercase, and get -i / reject -i / select -i in favor of -o.
    • A custom command's declared output type is now enforced when it runs. A command declared record -> record that returns null errors; declare oneof<record, nothing> instead.
    • Type checking at parse time is stricter, so an annotation that used to pass may now be rejected.
    • Importing a module no longer implicitly imports its exported submodules; add export use sub to keep the old behavior.
    • from yaml now defaults to YAML 1.2.
    • New from kdl / to kdl.
    • Minimum Rust is now 1.96.1.
  • Datastar SDK: 1.0.2 -> 1.0.4. The bundle http-nu serves under --datastar advances to /datastar@1.0.4.js. Upstream changes:

    • an opt-in CSP mode that runs without unsafe-eval, with support for aliased nonce attributes;
    • a new @query() action that sends QUERY requests with signals in the request body;
    • the current signals are sent when retrying a request after a network error;
    • fixes for request-cancellation races, reactivity after deleting a key from an object-shaped signal, signal patches when truncating arrays, action calls inside string and template literals, and data-bind on a <select> that gains multiple.
  • SIGTERM runs the xs shutdown protocol (#53). With --store, xs.stopping now runs on SIGTERM as well as Ctrl-C, so services get to stop cleanly under process managers and containers.

  • The access log fits the terminal width, down to a minimum of 96 columns, so wide terminals show more of each path. Paths are now shortened by character rather than byte, which fixes a crash that stopped the access log when a long path contained multi-byte characters.

  • An inherited XS_APPEND_META is no longer stamped on appended frames. When http-nu was started from inside an xs service, that service's identity leaked into frames http-nu appended.

  • New example: markdown-mermaid, which renders mermaid diagrams inside markdown documents.

Raw commits

  • build: bump cross-stream to 0.14.1 (2026-09-29)
  • ci: fail the workflow when any platform fails (2026-09-29)
  • test: check plugin sharing by process id, not timing (2026-09-29)
  • fix: drop an inherited XS_APPEND_META from new engines (2026-09-29)
  • fix: truncate access log paths on char boundaries, not bytes (2026-09-29)
  • feat: processor engines get http-nu's context-free commands (.mj etc.) (#48) (2026-09-29)
  • docs: pass the topic to .cat with -T in the getting-started guide (2026-09-29)
  • build: upgrade to cross-stream 0.14.0 and nushell 0.116.0 (2026-09-29)
  • deps: update datastar to v1.0.4 (2026-09-29)
  • fix: release a streaming request's thread when its client disconnects (2026-09-29)
  • feat: add an example which renders mermaid diagrams within markdown documents (2026-09-04)
  • style: cargo fmt (2026-09-04)
  • feat: fit the access log to the terminal width, 96 columns at the narrowest (2026-09-04)
  • test: pin per-burst release of brotli stream output (2026-09-03)
  • fix: run xs.stopping shutdown protocol on SIGTERM, not just SIGINT (#53) (2026-08-07)
  • chore: bump to v0.17.3-dev (2026-06-09)