| Drop a star to support Nu β | Join the Nu Discord community |
Build apps in one primitive that spans your whole stack β databases, UIs, AI agents, and services. No glue. 50x less code.
The primitive Nu is built on, in three words.
A tiny script keeps its values in memory and calls functions on them. Real apps don't stay there. Values live in a database, arrive from a browser form, render into a dashboard, get recomputed by a background job. Almost none of the code is about the values anymore β it's all interaction between systems.
Nu makes interaction the primitive.
- Ref β a name for a value, wherever it lives: a KV slot, a UI text block, an LLM endpoint, a remote object.
- Interaction β what you do with a Ref: read, write, branch, iterate, compose.
- Fabric β binds Refs to a real system. Compose as many as you need; they all speak the same primitive.
Same primitive, different system. One Ref for any resource, one Interaction for any op. Setting a browser text block is the same interaction as setting a KV slot.
Nu is the reference implementation of the interaction model in Python.
A few of Nu's fabrics β state, UIs, cluster, models. Same Python, same code shape.
Persistent state. Stores any Python type.
Reach any value by name; it survives restarts. Same code local or sharded across a cluster.
- Serverless, scales to terabytes
- Store any Python type
...
class DB(nu.Shape):
hits = nustd.kv.IntRef.slot()
# +1 to a persistent counter, starting at 0
op = DB.hits.init(0) >> DB.hits.inc()
app = nu.With(
nustd.kv.rocksdb_navigator(".db"),
body=nustd.kv.auto_flow_atomic(op),
)
...Powered by virtuals Β· rdbpy Β· RocksDB Β· LMDB.
Reactive UIs from Python. No JS, no build step, no websocket you had to write.
A text block, a chart, a form β set them like variables, they render. Update the value, the browser updates itself.
- 50+ components out of the box
- Live updates for free
...
class Dashboard(nustd.ui.Page):
hello = nustd.ui.TextRef.slot()
# renders live in the browser
op = Dashboard.hello.set("Hello, browser.")
app = nustd.ui.serve(Dashboard, op)
...Same code runs local or across the cluster. No worker pool to run.
Teleport any Nu tree to any worker; it runs there and returns the result. Where it runs is a binding, not a rewrite.
- Same code, local or remote
- Distribute with a single line
...
class DB(nu.Shape):
hits = nustd.kv.IntRef.slot()
# any Nu op
op = DB.hits.init(0) >> DB.hits.inc()
# same op β teleport it to a worker
remote = nustd.cluster.Teleport(op, target="gpu-0")
app = nu.With(
nustd.cluster.RayCluster(),
body=remote,
)
...Powered by Ray.
One wire, N providers. Ollama, OpenAI, OpenRouter, Groq, xAI β same call.
LLM chat as a Ref. Swap the model string, keep the code. Local models and hosted APIs meet at the same interface.
- Add intelligence to any Nu app
- 7 providers out of the box
...
class Bot(nu.Service):
chat = nustd.llm.ChatRef.method(temperature=0.7)
# ask the model
op = Bot.chat(prompt="one-line haiku about rust")
app = nu.With(
nustd.llm.ollama(Bot, host="localhost", model="qwen2.5:7b"),
body=op,
)
...Nu is batteries-included and covers the common cases. In-memory state, proxy, HTTP, Python objects, Claude Code, local parallelism β same model, same shape, same primitive as the four above.
Install, run a demo, start hacking.
Python 3.10+ Β· everything ships in the wheel.
pip install nucore "nustd[all]" nucliEach 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.
Batteries included. 25 modules ship on top of the kernel. The kernel holds one fabric of its own, nu.mem: in-memory state over plain dicts, users.age.set(12), and the locals a program keeps while it runs, nu.let(0, lambda n: n.set(n + 1)).
Eleven are fabrics. Bind one and every Ref inside the bracket reaches a real system.
The rest re-surface Python's standard library. Call them anywhere, no binding. Same names, same call shape as the stdlib, except a call hands back a tree, not a value. So it composes into the rest of the program.
pip install nucore "nustd[all]" # every backend
pip install nucore "nustd[kv,ui]" # or one extra per fabric| Module | What | Looks like |
|---|---|---|
| nustd.kv | Persistent state. | State.movies.append(m) |
| nustd.ui | Reactive web UI. | Dashboard.count.set_value(n) |
| nustd.cluster | Cluster compute. | Teleport(op, target="gpu") |
| nustd.llm | OpenAI-compatible chat. | Bot.chat(prompt="β¦") |
| nustd.proxy | Fabrics over the network. | InvisiblesProxy(Nav, address=...) |
| nustd.http | Nu meets the web. | Solana.get_slot() |
| nustd.service | Python objects as Refs. | Calc.add(a=2, b=3) |
| nustd.cc | Claude Code as a Ref. | Agent.ask(prompt="β¦") |
| nustd.mp | Local parallel execution. | Teleport(op, target=0) |
| nustd.mp_pool | A pool of workers, as a fabric. | Teleport(body, worker=w) |
| nustd.ws_server | Serve websocket clients. | SessionFor(body=arm) |
| nustd.math | Math functions and constants. | math.sqrt(2) |
| nustd.cmath | complex and its companions. |
cmath.polar(z) |
| nustd.random | The global RNG. | random.randint(1, 6) |
| nustd.time | The process clock. | time.monotonic() |
| nustd.datetime | Dates, times, deltas, timezones. | datetime.date.today() |
| nustd.itertools | Iterator building blocks. | itertools.product(a, b) |
| nustd.functools | A fold over a stream. | functools.reduce(nu.Attr("acc") + nu.Attr("item"), xs) |
| nustd.asyncio | The non-blocking sleep. | asyncio.sleep(1) |
| nustd.logging | Loggers and level shortcuts. | logging.getLogger(__name__) |
| nustd.pathlib | Lexical path operations. | pathlib.Path.of("a", "b") |
| nustd.uuid | UUIDs, all four versions. | uuid.uuid4() |
| nustd.decimal | Exact decimal arithmetic. | Decimal.of("0.1") |
| nustd.fractions | Exact rational arithmetic. | Fraction.of(1, 3) |
| nustd.fin | Nu's own financial types. | Percentage.of(75.5) |
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. |
| nustackdev/nuagent | An AI agent that speaks Nu. The model answers with a program, not a tool call, so one turn reads, branches, loops and writes across real state. |
| nustackdev/nuspace | Nu runtime built on Nu, self-hosted. |
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.
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


