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.12.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.12-py3-none-any.whl (444.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: nustack_py-0.1.12.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.12.tar.gz
Algorithm Hash digest
SHA256 b5f08be1aad63dedbc323529a2f87f4a077768e716722aec57f8c6e819b5f2b9
MD5 6e0601cf82175cf0c1f96cff10a88b18
BLAKE2b-256 6d941df69f5e147828abb81f142a6bea77b3b019762b3ef1f90cd8f63b4238a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for nustack_py-0.1.12.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.12-py3-none-any.whl.

File metadata

  • Download URL: nustack_py-0.1.12-py3-none-any.whl
  • Upload date:
  • Size: 444.9 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.12-py3-none-any.whl
Algorithm Hash digest
SHA256 2a674b5b9325652666eae3071a2ed2ffd526706ffdeea52575d6172efb196720
MD5 291c864c6dacf682eaf75a7edf0388b0
BLAKE2b-256 d5b850f1bfe7455d3a8ab91b1e9da19c4e11ac8bec368a87c508cc7a7c71f8e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for nustack_py-0.1.12-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