aboutsummaryrefslogtreecommitdiffstats
path: root/CLAUDE.md
diff options
context:
space:
mode:
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md23
1 files changed, 23 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index a5469a1..9f63595 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -246,6 +246,28 @@ keypair bundle, or anything that looks like a user's public key.
the group named in the invitation (an operator pairs node-wide while opening a
group)
+## Where Phase 13 stands (2026-08-19)
+
+Stages A–D are **built and running**, not designed. `docs/desktop-client-v1.md` is still
+the decision record; the sections below it describe what was decided, and this says what
+exists.
+
+- Built: named roots, `ops.py` + CLI, device linking and hub device auth, the Electron
+ client (protocol handler, CSP header, `safeStorage` keys, streamed downloads to disk,
+ native folder picker), the group Settings tab, per-account resume positions, uploads
+ the operator can close
+- Deployed: the hub runs MNP 0.3 with migration `e5a2b7d31f88`. **The SPA served in
+ production is older than this tree** — check `/a/<hash>/` against
+ `meshbay_hub.api.webapp.ASSET_V` before concluding a fix is missing. `site/` and the
+ Caddy config have never been deployed
+- Not built: D5 (node management panel), D6 (first-run wizard), D8 (`.deb`/`.rpm` — the
+ package must ship `chrome-sandbox` root-owned 4755), D9 (Python sidecar `group://`),
+ D10 (video thumbnails), D11 (Windows), D12 (release key and repo)
+- One UI source: `packages/meshbay-hub/src/meshbay_hub/static/` is the interface, for the
+ web and the app alike. `packages/meshbay-client/build/sync-ui.js` copies it and CI
+ fails if the copy drifts — **never edit `packages/meshbay-client/ui/` by hand**
+- Throwaway `e2e*` accounts accumulate on the production hub; the operator deletes them
+
## Desktop client — decided, not built (2026-08-17)
See `docs/desktop-client-v1.md`. Nothing here is implemented; it is the design and the
@@ -685,6 +707,7 @@ SFR residential Fedora 44 → meshbay.org OVH VPS:
| Streamed download (browser) | `static/downloads.js` + `static/sw.js` | Needs the page *controlled*, and the worker confirms it served the request |
| Leave a group (hub) | `meshbay_hub.api.groups` | `POST /v1/groups/{id}/leave` — self only; the owner is refused |
| Public group cap (hub) | `meshbay_hub.api.groups` | `_check_public_group_quota` — 10 live public groups per owner, staff exempt. **Checked at creation only, because PATCH refuses to change visibility** |
+| Uploads on/off (node) | `meshbay_node.roster` + `transport.webrtc_server` | `member_upload_allowed` / `set_member_upload`, gate in `_do_file_upload`. Per group, **operator-signed** (`OP_MEMBER_UPLOAD`), stored in `roster.db`, cached in the group context because the upload path is synchronous. **Absent means allowed** at every layer |
| Node presence (hub) | `meshbay_hub.api.groups` | `node_online` on `/v1/groups/mine`, read from the signaling registry — no poll, no timer |
| Chat paging (node) | `meshbay_node.chat.store` | `get_recent` / `get_before` / `has_before`. `get_messages` pages *forwards* and is not what a chat opens with |
| Liveness (MNP) | `meshbay_common.protocol` | `PING`/`PONG` on an **already-open** channel; never for discovery — a handshake costs 0.6-7 s |