From c103e1257f9c83e2244641754a59bfc9a75b68be Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Wed, 26 Aug 2026 19:03:33 +0300 Subject: [PATCH] docs: list neshub, and say the tree does not know what it runs The payload-independence rule is the one thing about this repo that is easy to violate by being helpful. Stating it where it will be read before the first edit is cheaper than catching it in review. --- CLAUDE.md | 12 ++++++++++-- README.md | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d6a00bb3..83eeb84a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ fact about it and most of the rules below follow from it. Split by *what a thing is*, not by what language it is written in. ``` -apps/ what runs api, auth (TS) · nescope, neswire, nescapture (Rust) +apps/ what runs api, auth (TS) · nescope, neswire, nescapture, neshub (Rust) crates/ shared Rust nesprotocol packages/ shared TS core, auth docs/ long-form alchemy.md @@ -63,7 +63,15 @@ half matters. **Rust components are guest-side**: they run inside a virtual machine, not on the control plane. `nescope` composites, `nescapture` captures and encodes frames from inside the workload's own process, `neswire` handles audio, and -`nesprotocol` is the wire format all three share. None of them talk to the API. +`neshub` muxes all of it into one connection to the client. `nesprotocol` is +the wire format they share. None of them talk to the API. + +**None of them depend on what they are running.** The box starts a payload that +the open components are not allowed to understand, so no code here may branch on +which one it is. `nescope` does mention Steam and Proton in comments — it +implements public Wayland and Vulkan protocols that gamescope also implements, +and those comments say which real case motivated a workaround. That is the +allowed kind: a name in prose, never a dependency in code. ## Conventions diff --git a/README.md b/README.md index aec40ae6..dc2712e1 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,8 @@ control plane. | [`apps/nescope`](apps/nescope) | A headless Wayland compositor for one fullscreen client. A lighter answer to the same problem gamescope solves. | | [`apps/nescapture`](apps/nescapture) | A Vulkan implicit layer. It captures frames from inside the workload's own process and encodes them on the GPU that drew them — no copy out to the CPU and back. | | [`apps/neswire`](apps/neswire) | Audio capture and transport. | -| [`crates/nesprotocol`](crates/nesprotocol) | The wire types all three share, so no two ends can drift apart silently. | +| [`apps/neshub`](apps/neshub) | One connection out of the box. Muxes video, audio, cursor and input into a single QUIC stream to the client. | +| [`crates/nesprotocol`](crates/nesprotocol) | The wire types they all share, so no two ends can drift apart silently. | The hypervisor these run under is [`nesbox`](https://github.com/nestrilabs/nesbox), a separate repository: a micro-VM with a real GPU in it, using virtio-gpu native