| Drop a star to support Nu ⭐ | Join the Nu Discord community |
About • Quickstart • Fabrics • Apps • Spec • Examples • Documentation • Community
A tiny program is a joy to write. Three lines, one substrate:
a = 2
b = 5
print(a + b)Real apps don't stay here. a moves into a database. b comes from a form submission. The result renders in a browser. A background job reruns it when either input changes. Three lines become three hundred: an ORM, a request handler, a template, a websocket, a queue. Almost none of it is about a + b anymore — it's all interaction between substrates.
Nu makes interaction the primitive.
- Ref — a name for a value, wherever it lives. A KV slot, a UI widget, an LLM endpoint, a remote object.
- Interaction — what you do with a Ref. Read, write, branch, iterate, compose.
- Fabric — binds Refs to a real backend.
Same program, a and b persisted in a KV store:
import nu
class DB(nu.Shape):
a = nu.kv.IntRef.slot()
b = nu.kv.IntRef.slot()
# compute a + b and print it
compute = DB.a.set(2) >> DB.b.set(5) >> nu.print(DB.a + DB.b)
# assemble: rocksdb-backed
app = nu.With(
nu.kv.rocksdb_navigator(".dbsum"),
body=nu.kv.auto_flow_atomic(compute),
)
nu.run(app)Same program, result rendered in a live browser dashboard:
import asyncio
import nu
class DB(nu.Shape):
a = nu.kv.IntRef.slot()
b = nu.kv.IntRef.slot()
class Dashboard(nu.ui.Page):
out = nu.ui.TextRef.slot()
class App(nu.ui.Index):
pages = nu.ui.Pages({"/": Dashboard})
# compute a + b and render into the dashboard text block
compute = DB.a.set(2) >> DB.b.set(5) >> Dashboard.out.set(DB.a + DB.b)
# assemble: rocksdb-backed, served over the browser
app = nu.With(
nu.kv.rocksdb_navigator(".dbsum"),
nu.ui.server(nu.kv.auto_flow_atomic(compute)),
)
asyncio.run(nu.arun(app))Same primitive, different substrate. One Ref for any resource, one Interaction for any op. Nu doesn't care what the backend is.
Persistence, reactivity, atomicity, observability, distribution — not features Nu has. What falls out of naming interactions instead of executing them:
- Persist across restarts — the KV slot is already durable.
- Re-render live on input changes — wrap in a
Reactinteraction. - Handle terabytes — shard the KV Fabric; the Refs don't notice.
- Run distributed across a cluster — bind through
nu.ray; the Refs don't notice.
Full walkthrough at nustack.dev.
Three steps: install, run a demo, explore Nu.
Python 3.10+ · everything ships in the wheel.
pip install "nustack-py[all]"Each one boots a live browser dashboard and picks up where it left off on restart. nu demo lists them all.
- Read the docs — tutorials, how-tos, and the fabric reference.
- Browse examples — full source for every demo, plus more programs to steal from.
Each fabric binds Refs to a real backend and unlocks a new capability.
| Fabric | What |
|---|---|
nu.mem |
In-memory state fabric. Perfect for cache, hot state, and in-process coordination. |
nu.kv |
Persistent state fabric. Refs over a KV backend (RocksDB, LMDB); transactions, snapshots, and change notifications, built in. |
nu.ui |
Web UI fabric. Same fabric shape as the others, but the Refs are widgets — text, buttons, tables — rendered in the browser and live-updated as your state changes. |
nu.invisibles |
Network fabric. Puts other fabrics on the network — bind a fabric in one process, use it from another; same Refs, same interactions, over TCP or Unix socket. |
nu.ray |
Cluster compute fabric. Teleport a Nu tree to any worker in your Ray cluster; it runs there and returns the result. |
End-user tools written as Nu programs.
| Repo | What |
|---|---|
| nustackdev/nulog | Pure-Python, serverless logger and metrics store. Log and observe metrics from any Python code; entries persist to an embedded KV store and scale to billions, in-process. One line boots a live viewer. |
Nu is a reference implementation of the interaction model — a language-agnostic specification of what an interaction is, how Refs name locations, and how Interactions compose into programs.
TODO.
Add a Nu badge to your README if you're building on Nu:
[](https://github.com/nustackdev/nu)
Considering contributing to Nu? Start by opening an issue or a PR — the codebase is small and readable, and the model is stable enough to build on.
Apache-2.0