Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ crates/
├── allmystuff-term # `amst` — the command-line terminal (a mesh PTY in your own terminal)
├── allmystuff-cec-protocol # CEC Support's wire types: support ids, consent control, the help beacon
├── allmystuff-cec-consent # a customer's standing technician approvals (once / 3 hours / forever)
├── allmystuff-ashlar # `allmystuff-ashlar` — answer an Ashlar program's `mesh.sites` space over JSON Lines
├── allmystuff-mobile-core # the phone's model: viewer/controller capability set + NodeProfile (docs/MOBILE.md)
├── allmystuff-updater # self-update: release feed, SHA-256 verify, stage-then-apply
├── allmystuff-service # install/manage the OS background service (systemd / launchd / Windows SCM)
Expand Down Expand Up @@ -218,6 +219,31 @@ Everything AllMyStuff puts on a wire, with no dependency heavier than
per-device identities (no shared secrets); see MyOwnMesh
`docs/NETWORK-TYPES.md` for the governance contract.

### allmystuff-ashlar

The seam an [Ashlar](https://github.com/mrjeeves/ashlar) site reaches this
machine through. Ashlar has one boundary for everything outside its builtin
set, and two space names derive to a co-process rather than to a library the
project supplies: `mesh` — the roster, answered by `myownmesh ashlar` — and
`mesh.sites`, answered by the `allmystuff-ashlar` binary here. Sites are the
half that needs a proxy able to carry a TCP connection to a peer, which is
exactly what this node has and MyOwnMesh alone does not.

Four calls over JSON Lines on stdin/stdout — `expose`, `unexpose`,
`published`, `nearby` — driving ops the node already had (`site_exposed`,
`site_set_exposed`, `site_mappings`, `site_map`, `session_snapshot`,
`mesh_networks`). Publishing stays **opt-in at the node**: `expose` adds one
port to the owner's exposed selection, the proxy still refuses every port
outside it, and `nearby` reads what peers *advertise* rather than scanning
anyone.

It lives in the light workspace and speaks the node's control wire
(`[u32 BE len][tag][JSON]`) instead of linking `allmystuff-node`, so it builds
in seconds and `cargo test --workspace` covers it. That is a real coupling:
the frame format is defined in `node/src/node_control.rs` and re-implemented
here, pinned by `frame_roundtrips_the_node_wire`. Change that wire and change
both.

### allmystuff-bridge

The one place hardware vocabulary meets graph vocabulary. Turns an
Expand Down
9 changes: 9 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ members = [
# mesh) and by the standalone CEC Support client app.
"crates/allmystuff-cec-protocol",
"crates/allmystuff-cec-consent",
# The Ashlar seam: a co-process answering an Ashlar program's `mesh.sites`
# space. It speaks the node's control wire rather than linking the node, so
# it belongs in this fast workspace and not beside the media stack.
"crates/allmystuff-ashlar",
]
# The Tauri desktop app (`gui/src-tauri`) and the headless mesh node
# (`node/` — the `allmystuff-node` engine + the `allmystuff-serve` binary)
Expand Down Expand Up @@ -49,6 +53,7 @@ allmystuff-service = { path = "crates/allmystuff-service", version = "0.2.49" }
allmystuff-mobile-core = { path = "crates/allmystuff-mobile-core", version = "0.2.49" }
allmystuff-cec-protocol = { path = "crates/allmystuff-cec-protocol", version = "0.2.49" }
allmystuff-cec-consent = { path = "crates/allmystuff-cec-consent", version = "0.2.49" }
allmystuff-ashlar = { path = "crates/allmystuff-ashlar", version = "0.2.49" }

serde = { version = "1", features = ["derive"] }
serde_json = "1"
Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ It's free, open source, and runs on macOS, Linux, and Windows.
- **Sites.** Open a machine's local web service in your browser — even one
bound to loopback — through a port mapped on the machine you're sitting at.
Only ports the host advertises are ever proxied.
- **Ashlar sites.** An [Ashlar](https://github.com/mrjeeves/ashlar) program
reaches this node across its own foreign boundary: `ashlar run --mesh`
publishes the port it is serving to a private mesh, and the peers on that
mesh open it in a browser through a locally mapped port. No forwarded port,
no public address, nothing vendored — the site names a capability and this
node answers it (`allmystuff-ashlar`).
- **KVM appliances.** Point a NanoKVM-class device at a machine and you can
reach its screen and keyboard even when its OS is down — BIOS included —
with power and reset a click away; the KVM's own web UI opens through the mesh.
Expand Down
31 changes: 31 additions & 0 deletions crates/allmystuff-ashlar/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# The Ashlar seam: a co-process that answers an Ashlar program's `mesh.sites`
# space over JSON Lines, driving this machine's AllMyStuff node.
#
# It lives in the LIGHT workspace on purpose. The node engine carries the media
# stack (xcap / cpal / openh264 / …) and takes minutes to build; this speaks the
# node's control wire instead of linking it, so the seam compiles and tests in
# seconds and a `cargo test --workspace` covers it. The wire it re-implements is
# small and fixed — `[u32 BE len][tag][JSON]`, defined in
# `node/src/node_control.rs` — and `frame_roundtrips_the_node_wire` pins it.
[package]
name = "allmystuff-ashlar"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
description = "Answer an Ashlar program's `mesh.sites` space — publish this machine's site to the mesh, and reach the peers'."

[lib]
name = "allmystuff_ashlar"
path = "src/lib.rs"

[[bin]]
name = "allmystuff-ashlar"
path = "src/main.rs"

[dependencies]
serde_json = { workspace = true }
interprocess = { workspace = true }
dirs = { workspace = true }
Loading
Loading