nxsflow

The nxs open-source suite

The record your agents work from.

One binary, three products — flow, memory, and chat — on a single offline-first CRDT substrate. Agent-native, deterministic, convergent.

$ curl -fsSL https://nxsflow.com/nxs/install.sh | sh
macOS & Linux · Apple Silicon and x86-64 · signed, same-origin updatesnxsflow/nexus-flow

See it work

next and blocked — derived, not stored

nxf — agent session
$ nxf next
0001  P1  open  [epic]  Payments revamp
0002  P1  open  [feature]  Design new checkout flow
    ↳ 0001 · Payments revamp

$ nxf blocked
0003  P2  open  [chore]  Migrate billing webhooks
    ↳ blocked by: 0002 (open)

$ nxf next --json[{"archived":null,"assignee":null,"belongs_to":null,"closed_at":null,"closing_comment":null,"completion_criterion":null,"created_at":"2026-06-23T00:00:00Z","defer_until":null,"deleted":null,"description":"Rework the payments stack for v2.","design":null,"due":null,"id":"ab12.0001","parent":null,"priority":"1","priority_label":"P1","status":"open","title":"Payments revamp","type":"epic","type_label":"epic","updated_at":"2026-06-23T00:00:00Z"},{"archived":null,"assignee":null,"belongs_to":"ab12.0001","closed_at":null,"closing_comment":null,"completion_criterion":null,"created_at":"2026-06-23T00:00:00Z","defer_until":null,"deleted":null,"description":"One-page checkout with saved cards.","design":null,"due":null,"id":"ab12.0002","parent":{"id":"ab12.0001","title":"Payments revamp","type":"epic","type_label":"epic"},"priority":"1","priority_label":"P1","status":"open","title":"Design new checkout flow","type":"feature","type_label":"feature","updated_at":"2026-06-23T00:00:00Z"}]
$ 

Real output captured from nxf and drift-guarded in CI: the ready work, the work the graph holds back, and the same query as --json.

Why it's built this way

An engine agents can trust

01

Offline-first by default

Everything lives in a local database, so reads and writes are instant and keep working when the network is gone.

02

Convergent CRDT sync

Each change is appended to a change-log, never overwritten. Concurrent edits from different devices merge without last-write-wins data loss.

03

Derived, never stored

ready, blocked, and next are computed deterministically from the dependency graph — so the work list is always consistent, never a stale cache.

04

Plugin-declared vocabulary

Item types, ranking, and presentation live in plugins — an issue tracker and a personal to-do ship in the box; you can declare your own.

05

--json everywhere

A deterministic, byte-stable machine surface on every command — the contract agents build on, and the measuring stick for the whole CLI.

06

One binary, one substrate

flow, memory, and chat share one local database, one sync, and one change-log — so an agent's plan, its memory, and its messages converge as one truth.

Changelog

What's new

0.27.0

2026-07-14
  • Changed`nxs mcp serve` with no `--workspace`/`--db` now defaults its auto-initialized board to a neutral, nxs-owned location (`com.nxsflow.nxs` under the platform data dir) instead of a specific consumer app's data home. The OSS server no longer assumes any consumer; a consumer that wants its own board installs its own `--workspace`-pinned MCP entry (and may import this board's data). If you relied on the previous default location, point the entry at it explicitly with `--workspace`.
  • AddedMore `--json` reads now carry the same additive fields the primary reads already do, for cross-verb agent consistency: `blocked` and `search` gain `priority_label`/`type_label`, `next`'s nested `parent` join gains `type_label`, and `blocked`/`deferred`/`closed`/`archived` plus `prime` now carry the sparse plugin `custom` field map (identical to `list`/`next`/`show`). Canonical fields are unchanged; all additions are additive and appear only where relevant.

0.26.0

2026-07-13
  • FixedPiping CLI output into a reader that closes early (`nxf blocked | head`, `nxf list | grep -m1 …`) no longer panics with "failed printing to stdout: Broken pipe". The process now terminates quietly on SIGPIPE like any other Unix filter, so agent scripts that page or truncate output stay clean.
  • Added`nxf show`, `list`, and `next --json` now carry additive `priority_label` and `type_label` fields — the active plugin's display labels (e.g. `P2`, `epic`) — alongside the canonical `priority`/`type` keys, so an agent no longer needs a separate `schema` lookup to render them. `create` and `update` now also accept the canonical ordinal priority **key** (e.g. `2`) in addition to the label (`P2`), so a value read back from `--json` round-trips as valid input. The canonical `priority`/`type` keys, the human (non-`--json`) output, and the embedding/MCP record are all unchanged.
  • ChangedThe "no embedded minisign public key" error from `nxs self-update` and `nxf verify-signature` is now actionable: it explains that the binary is unsigned (a locally-built or development build) and points to the official signed-release install (`curl -fsSL https://nxf.nxsflow.com/install.sh | sh`), instead of referencing an internal spec document that isn't shipped with the binary. The fail-closed refusal itself is unchanged.

0.25.1

2026-07-13
  • AddedPlugins can now declare their own **custom item fields** on top of the 16 built-in ones. A plugin declares them in a `[fields]` table (each with a type — `text`/`longtext`/`date`/`enum` — an optional `on` type scope, `required`, and a display `label`); you then set them with `nxf create`/`nxf update --set <name>=<value>` (type-validated; an empty value clears). They surface everywhere reads do: `nxf schema --json` lists each declared field (marked `custom`, with its `kind`/`on`/`required`/`label`, and `values` for an enum), and `nxf show`/`list`/`next --json` attach a sparse `custom` map with the item's set values (a field that is unset — or belongs to a different plugin — is simply omitted). The MCP `flow_schema`/`flow_show`/`flow_list`/`flow_next` tools carry the identical shape. `nxf show`'s human view also prints declared custom fields under their label. This replaces overloading `labels`/`description` for domain data (a file's `uri`, a person's `email`, a project's `stage`).
  • FixedPlugin custom fields follow-ups (post-v0.25.0 review): `nxf create --json -` now accepts custom fields via a `set` array in the JSON payload (mirroring the `--set` flag), so an item whose type has a **required** custom field can be created from a JSON payload too — previously that path silently dropped custom fields. The "custom field does not apply to this type" error now also lists the type(s) the field applies to, so an agent can self-correct without a `schema` round-trip.

0.24.2

2026-07-12
  • FixedOpening a freshly-created workspace database from two connections at once — e.g. `nxs init` / `nxf init` over an existing workspace (or an E4 sync reset) while a long-lived app is watching it — no longer intermittently fails with "duplicate column name: domain". The schema migration now runs under a write lock, so concurrent openers serialize instead of both applying the same `ALTER`.
  • FixedThe "your first move" suggestion after `nxs init` / `nxf init` now names a type the active plugin actually declares (e.g. `epic` for issue-tracker, `project` for personal-todo), so the copy-pasted first command works. Previously it hardcoded `--type task`, which no bundled plugin accepts — the very first suggested command errored on a stock install.
  • FixedThe ready lane (`next`) is dramatically faster on larger boards. Resolving the ready set no longer issues one query per item — each of which re-materialised the parent projection, making the lane O(n·edges) — it now bulk-resolves in a single query. On a ~156-item board this cuts `read::next` from ~0.7 s to well under 100 ms, speeding every board refresh and session start (`nxf next`, `nxs prime`).

0.24.1

2026-07-12
  • AddedAdded a bulk labels read to the embedding API — `Engine::labels_bulk(ids)` (and `read::labels_bulk`, `Store::labels_of_bulk`) — that returns the present labels for many items in a single indexed query instead of one `labels(id)` call per item. Decorating a whole lane (the app-bridge `with_labels` seam) now costs one query rather than N. The `list`/`next --json` label projection uses it internally, so those lane reads collapse their per-row label lookups to one bulk read while the output stays byte-identical. The existing `labels(id)` is unchanged; the new method is additive and backward-compatible.
  • Addednexus-chat now gates its `nxc` CLI/onboarding surface behind a default-on `cli` Cargo feature. An embedding consumer that links only `nexus_chat::engine::Engine` can build with `default-features = false` and drop the whole CLI/TUI dependency closure — clap, nxs-ui (and its inquire/crossterm), nxs-init, inventory, sha2 — leaving just the engine/facade/store/model/watch surface over the shared substrate. The `nxs` binary and `nxc` are unchanged (the feature is on by default).
  • FixedThe `nxc inbox` (and the inbox section of `nxc prime`) now displays unread messages in deterministic causal order. Following the message-ordering fix, the inbox's own display order was still keyed on the raw ULID `message_id`, so two unread messages posted in the same millisecond could show in an arbitrary, per-database order. It now orders by the CRDT clock `(lamport, site, message_id)` — the same guarantee the channel, thread and search reads already give — while the unread cursor keeps its own `message_id` watermark unchanged.
  • FixedChat messages now read back in a deterministic, causal order. Reads (channel history, thread assembly, search, and the M2 review board) are ordered by the CRDT clock `(lamport, site, message_id)` instead of the raw `message_id`. A `message_id` is `m-`+ULID (a millisecond timestamp plus random bits), so two messages posted in the same millisecond — an `ask` opener and its first reply, or a rapid send/reply burst — previously sorted by ULID randomness, i.e. in an arbitrary, per-database order. Lamport is the substrate's logical clock (a reply's op is emitted after the request it answers), so the read order now always matches post order and is reproducible across runs and across sites/merges.

In production

Powered by nexus-flow

Two products bundle the suite invisibly and put their own surface on top.

Get started

Install the suite

One artifact to install, verify, and update — signed and same-origin. Detects your platform and drops nxs (with nxf/nxm/nxc) on your PATH.

Download the latest releasemacOS (Apple Silicon) · macOS (Intel) · Linux (x86-64) · Linux (aarch64)