Skip to main content
Drop a star to support Nu ⭐ Join the Nu Discord community
Nu

Nu – the interaction primitive

Build apps in one primitive that spans your whole stack — databases, UIs, AI agents, and services. No glue. 50x less code.

Discord Twitter Follow

Platform Support PyPI - Python Version PyPI Package License PyPI Downloads



AboutQuick StartFabricsAppsSpecExamplesDocumentationCommunity


ℹ️ About

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 React interaction.
  • 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.

🏁 Quick Start

Three steps to a live counter on a browser dashboard, persisted across restarts.

1. Install (Python 3.10+):

pip install "nustack-py[all]"

2. Run the bundled demo:

nu demo counter

3. Open the browser tab that pops up — the counter ticks once a second, the dashboard mirrors it live. Kill it, run again, it picks up where it left off.

More demos: nu demo. Full walkthrough at nustack.dev/docs. Source in examples/. For lean installs and source builds see nustack.dev/docs/how-to/install.

🧵 Fabrics

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.

📦 Apps built on Nu

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.

📐 Spec

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.

nustackdev/interaction-model

🛣️ Roadmap

TODO.

👥 Community

Nu README badge

Add a Nu badge to your README if you're building on Nu:

Nu

[![Nu](https://img.shields.io/badge/built%20with-Nu-%237A4CE0)](https://github.com/nustackdev/nu)

Contributing to 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.

More questions?

  1. Read the docs
  2. Open a feature request or report a bug
  3. Join the Discord community

License

Apache-2.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nustack_py-0.1.10.tar.gz (1.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nustack_py-0.1.10-py3-none-any.whl (444.1 kB view details)

Uploaded Python 3

File details

Details for the file nustack_py-0.1.10.tar.gz.

File metadata

  • Download URL: nustack_py-0.1.10.tar.gz
  • Upload date:
  • Size: 1.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for nustack_py-0.1.10.tar.gz
Algorithm Hash digest
SHA256 6951dede404faea7e939ad7fd5a01904e336616825ca6a6d66c512d35583f4e9
MD5 6061a088f3a951807793cf96bb3137a6
BLAKE2b-256 e44c5f03ea1db8dce2897d6bad92e91c123aeff3c39ed6c74f89693738cfe22c

See more details on using hashes here.

Provenance

The following attestation bundles were made for nustack_py-0.1.10.tar.gz:

Publisher: publish-nu.yml on nustackdev/nu

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nustack_py-0.1.10-py3-none-any.whl.

File metadata

  • Download URL: nustack_py-0.1.10-py3-none-any.whl
  • Upload date:
  • Size: 444.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for nustack_py-0.1.10-py3-none-any.whl
Algorithm Hash digest
SHA256 f81090120940f6969376c5c9e17581ed01895f6b39553eb5e7a1120a0e8aae86
MD5 f537ab02ac8ac41759ded99343ab838d
BLAKE2b-256 556b8ad72ca0d7330dde95fce7c10e920a0aec043e993260171c38d91c781c25

See more details on using hashes here.

Provenance

The following attestation bundles were made for nustack_py-0.1.10-py3-none-any.whl:

Publisher: publish-nu.yml on nustackdev/nu

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page