Canvas document: simple versioned format with JSON, Markdown and image export #93

Open
opened 2026-10-08 10:43:37 +00:00 by kayg · 1 comment
Owner

Owner (2026-10-08): the canvas should live in a very simple format that exports easily to JSON, Markdown and pretty images.

Today the clusters mockup keeps the canvas in an in-memory model (apps/tracer/src/clusters-model.ts, proto-clusters). It mixes in viewport pixel sizes and mock terminal lines, and nothing is persisted. D178 makes the canvas per account and synced, so it needs a canonical document.

Proposal (to grill before building):

  • One versioned JSON document per account ({ "version": 1, "views": [...] }). It is viewport-independent: view positions on the coarse grid in cells; columns with relative width weights; windows as { id, kind, ref }, where ref points to a session, container, VM or node id. It holds no content (no scrollback, no secrets) and no device camera (that stays per device, D178).
  • Stored server-side and synced live (D178). Small, so it diffs cheaply.
  • Markdown export: a readable outline (view → column → window kind, host and session name).
  • Image export through the share studio (separate issue).
  • Import of the same JSON (restore or move a layout).
  • Privacy: exports hide IPs and hostnames on request, matching the D120 share defaults.
Owner (2026-10-08): the canvas should live in a very simple format that exports easily to JSON, Markdown and pretty images. Today the clusters mockup keeps the canvas in an in-memory model (`apps/tracer/src/clusters-model.ts`, proto-clusters). It mixes in viewport pixel sizes and mock terminal lines, and nothing is persisted. D178 makes the canvas per account and synced, so it needs a canonical document. Proposal (to grill before building): - **One versioned JSON document per account** (`{ "version": 1, "views": [...] }`). It is viewport-independent: view positions on the coarse grid in cells; columns with relative width weights; windows as `{ id, kind, ref }`, where `ref` points to a session, container, VM or node id. It holds no content (no scrollback, no secrets) and no device camera (that stays per device, D178). - Stored server-side and synced live (D178). Small, so it diffs cheaply. - **Markdown export:** a readable outline (view → column → window kind, host and session name). - **Image export** through the share studio (separate issue). - **Import** of the same JSON (restore or move a layout). - Privacy: exports hide IPs and hostnames on request, matching the D120 share defaults.
Author
Owner

Owner answers recorded as D180 (main). Internal format is ours; exports JSON, Markdown, image, Excalidraw; JSON Canvas only if cheap. Grants referenced by name only. Topology renamed Mesh.

Owner answers recorded as D180 (main). Internal format is ours; exports JSON, Markdown, image, Excalidraw; JSON Canvas only if cheap. Grants referenced by name only. Topology renamed Mesh.
Sign in to join this conversation.
No labels
launch-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/infraternal#93
No description provided.