Releases: cablehead/xs
Release v0.12.0
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:
.lastreturns 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
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
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.registerEach 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
Highlights
.lastnow supports topic filtering and-nflag:.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
Highlights
- Wildcard topic filtering:
.lastnow supports wildcard topics (e.g.,user.*) - New
.catflags:--last <n>returns the most recent N events;--from <id>starts from a specific frame ID (inclusive) xs.thresholdfix: now emitted with--followregardless of--limitor--last- Breaking:
.evalinxs.nunow 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
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
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
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
--fromflag (inclusive counterpart to--after) - New
--last <n>flag for tail-like behavior
-
exec renamed to eval (breaking):
xs exec '<script>'is nowxs 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
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
v0.7.1
Highlights
- Streaming
.headcommand: The.headcommand now supports--followflag for real-time updates when the head of a topic changes - Improved interrupt handling: Fixed Ctrl-C signal handling in
.cat -fstreaming mode
Changelog
- feat: add --follow flag to .head command for streaming updates
- fix: respect interrupt signals in .cat -f streaming