Skip to content

Releases: cablehead/xs

Release v0.12.0

13 Apr 16:59

Choose a tag to compare

Highlights

Updated embedded Nushell to 0.112.1 (from 0.111.0). This required bumping the minimum Rust version to 1.92.0.

In xs.nu, job spawn --tag is now job spawn --description to match upstream Nushell changes.

Added an xs.nu integration test that exercises the core commands (.append, .cat, .cas, .get, .last, .id, .remove) through .tmp-spawn. This test now runs in CI across Linux, macOS, and Windows.

Bug fixes

  • fix: .last returns a record when count is 1

Changelog

  • chore: upgrade nushell dependencies to 0.112.1
  • chore: bump rust-version to 1.92.0 (required by nu 0.112.1)
  • chore: bump @astrojs/check to ^0.9.8
  • test: add xs.nu integration test
  • test: add xs.nu integration test to CI
  • fix: .last returns a record when count is 1

Release v0.11.0

02 Mar 19:15

Choose a tag to compare

Highlights

The .active frame metadata now uses a single start enum field instead of separate new (boolean) and after (optional ID) fields. This simplifies how actors communicate their startup context.

Updated embedded Nushell to 0.111.0.

Breaking changes

  • feat!: replace new/after with start enum in .active frame metadata

Changelog

  • chore: upgrade nushell dependencies to 0.111.0
  • docs: discord-bot example
  • docs: rework getting started tutorial to use metadata instead of CAS

Release v0.10.0

13 Feb 21:27

Choose a tag to compare

Highlights

Modules live on the stream. Append any Nushell module as a *.nu topic and it
becomes available to actors, services, and actions via standard use imports:

# register a module
http get https://example.com/discord.nu | .append discord.nu

# use it in an actor
r#'{
  run: {|frame, state|
    use discord
    discord channel message create $frame.meta.channel_id {content: "hi"}
    {next: $state}
  }
}'# | .append bot.register

Each processor snapshots the modules that existed at registration time, so
updating a module doesn't affect already-running processors until they are
re-registered.

Actors now thread state explicitly, matching Nushell's generate command:

{
  initial: 0
  run: {|frame, state|
    let next = $state + 1
    {out: {count: $next}, next: $next}
  }
}

Return {out: ..., next: ...} to emit and continue, {next: ...} to skip
output, or {out: ...} / null to stop. The old single-parameter closure
shape is no longer supported.

Record output from all three processor types now goes to frame metadata by
default -- no CAS round-trip needed to read structured data. Non-record output
(strings, binary) requires return_options: { target: "cas" }.

The processor codebase has been reorganized: handlers, generators, and commands
are now actors, services, and actions, each running as independent
tasks under src/processor/.

Graceful shutdown: when xs receives a signal it emits xs.stopping, giving
services time to clean up before exit.

Breaking changes

  • feat!: actor closure shape matches nushell generate (#137)
  • feat!: actor, service, and action record output goes to frame metadata by default
  • refactor!: unified dispatcher with VFS module system (#136)
  • refactor!: remove dispatcher, each processor owns its lifecycle
  • refactor!: rename handlers -> actor, generators -> service, commands -> action
  • refactor!: move processor modules under src/processor/ umbrella
  • feat!: remove xs/ prefix from VFS module paths
  • refactor!: replace .last -n flag with positional count
  • refactor!: disallow numeric prefix in topic names

Changelog

  • feat: graceful shutdown via xs.stopping frame
  • feat: add --with-timestamp flag to frame-returning endpoints
  • fix: compact error messages for eval and connection failures
  • fix: show helpful message when store is locked
  • fix: include docs build in check.sh to catch MDX errors
  • docs: align doc structure with Diataxis framework
  • docs: add service lifecycle tutorial
  • docs: add guidance on meta vs CAS for structured data

Release v0.9.4

04 Feb 21:27

Choose a tag to compare

Highlights

  • .last now supports topic filtering and -n flag:
    .last note              # last frame for topic "note"
    .last                   # last frame across all topics
    .last note -n 5         # last 5 frames for topic "note"
    .last -n 10             # last 10 frames across all topics
    .last "user.*"          # last frame matching wildcard
    .last note --follow     # stream updates for topic "note"

Changelog

  • feat: add optional topic and -n flag to .last (#135)

Release v0.9.3

29 Jan 01:32

Choose a tag to compare

Highlights

  • Wildcard topic filtering: .last now supports wildcard topics (e.g., user.*)
  • New .cat flags: --last <n> returns the most recent N events; --from <id> starts from a specific frame ID (inclusive)
  • xs.threshold fix: now emitted with --follow regardless of --limit or --last
  • Breaking: .eval in xs.nu now mirrors the CLI signature with --commands (-c) and file arguments, replacing the old positional script parameter

Changelog

  • fix!: align .eval wrapper and docs with CLI signature
  • fix: emit xs.threshold with --follow regardless of --limit or --last
  • feat: add --last and --from flags to nu .cat commands
  • feat: support wildcard topics in .last command
  • docs: add cargo binstall to installation guide

Release v0.9.2

22 Jan 05:48

Choose a tag to compare

Highlights

  • Fixed cargo-binstall support: Pre-built binaries now install correctly with cargo binstall cross-stream

Changelog

  • fix: add v prefix to binstall version templates

Release v0.9.1

22 Jan 05:19

Choose a tag to compare

Highlights

  • Windows binary support: Pre-built Windows binaries are now available in GitHub releases
  • cargo-binstall support: Install xs in seconds instead of 20 minutes with cargo binstall cross-stream

Changelog

  • feat: add Windows binary build support
  • feat: add cargo-binstall support for pre-built binaries

Release v0.9.0

21 Jan 18:50

Choose a tag to compare

v0.9.0

Highlights

  • Hierarchical topics replace contexts (breaking): Context isolation has been removed. Topics now support hierarchical organization (e.g., user.id1.messages) with wildcard queries (--topic user.*).

  • Reworked streaming semantics (breaking): Clearer naming throughout:

    • .head.last
    • --tail--new
    • --last-id--after
    • New --from flag (inclusive counterpart to --after)
    • New --last <n> flag for tail-like behavior
  • exec renamed to eval (breaking): xs exec '<script>' is now xs eval -c '<script>'. File evaluation: xs eval <addr> <file>.

  • Append route changed (breaking): POST /<topic>POST /append/<topic> to avoid collision with reserved routes.

  • SQLite in nushell pipelines: sqlite commands are now available within nushell scripts.

  • fjall upgraded to v3 (breaking): Storage engine updated to fjall 3.0.

  • Nushell 0.110: Updated embedded nushell to 0.110.0.

Changelog

  • ci: test cachix cache performance
  • ci: add Cachix for nix binary caching
  • chore: include Windows async dependencies in Cargo.lock
  • fix: enable async feature for win_uds on Windows
  • chore: update flake.lock for Rust 1.91.0 support
  • fix: CI failures from nushell 0.110 and fjall 3.0 updates
  • fix: enable bloom filters for upper-level point read optimization
  • chore: enable LTO and single codegen unit for release builds
  • chore: update nushell to 0.110.0
  • fix: add missing .cas-post to xs.nu, fix exec typo in docs
  • fix: add missing --from flag to xs.nu
  • feat: add --last flag to cat for tail-like behavior
  • feat: add --from flag as inclusive counterpart to --after
  • feat: add hierarchical topic index and wildcard queries
  • refactor: rename store.head() to store.last()
  • fix: scope store ignore to root directory
  • refactor: upgrade fjall v2 to v3
  • refactor: remove context isolation feature
  • refactor: rename handler config and TTL for consistency
  • refactor: rename .head to .last for consistency
  • refactor: rename --last-id to --after for consistency
  • refactor: rename --tail flag to --new for clarity
  • examples (datastar-todomvc): pin the datastar sdk to our out of date version
  • fix: Windows compatibility for sqlite test
  • refactor: replace deprecated cargo_bin function with macro
  • feat: enable sqlite commands in nushell pipelines
  • fix: improve help text for --tail flag and update XS_ADDR docs
  • feat!: change append route from POST / to POST /append/
  • feat!: rename exec to eval, add -c flag for inline commands
  • docs: replace realpath with path expand
  • docs: improve first-stream tutorial with XS_ADDR setup instructions

Release v0.8.0

06 Jan 21:18

Choose a tag to compare

v0.8.0

Highlights

  • Windows support: xs now runs natively on Windows via Unix domain sockets (AF_UNIX), making it available across all major platforms
  • Improved broadcast ordering: Fixed append serialization to guarantee broadcast ordering consistency

Changelog

  • feat: Windows support (#134)
  • fix: serialize appends to guarantee broadcast ordering

Release v0.7.1

03 Jan 21:42

Choose a tag to compare

v0.7.1

Highlights

  • Streaming .head command: The .head command now supports --follow flag for real-time updates when the head of a topic changes
  • Improved interrupt handling: Fixed Ctrl-C signal handling in .cat -f streaming mode

Changelog

  • feat: add --follow flag to .head command for streaming updates
  • fix: respect interrupt signals in .cat -f streaming