Skip to content

Studio

Studio is where you write. Not where you chat, not where you read briefings, not where you tune Sadie. Just writing.

The surface is a Tiptap editor bound to a Yjs document. You get real-time multiplayer with presence cursors, persistent offline state, text-anchored comments, and a filing pipeline that lifts polished drafts back into Sources for the wiki compiler.

Studio is organized into workspaces. Each workspace has its own slug, color token, and access grants. Inside a workspace, documents are typed as draft, note, brief, essay, or post. Status moves through draft, published, and filed.

A default workspace is always created for you at bootstrap. You can add more in the workspace switcher.

Studio uses @tiptap/extension-collaboration over a Yjs Y.Doc. Two persistence layers keep your work safe:

  • y-indexeddb stores the document locally so it survives a refresh without a server round trip.
  • y-websocket syncs state between browsers through the collab server.

Presence is Yjs awareness: cursor positions and collaborator names update in real time. In development, run pnpm dev:collab to start the websocket server on ws://127.0.0.1:1234. In production, point NEXT_PUBLIC_COLLAB_WS_URL at your deployed server.

Solo editing works without the websocket server. IndexedDB persists your work; multiplayer just isn’t live until the websocket comes up.

Comments anchor to character ranges in the text, not to node IDs. Select a range, add a comment, and it travels with the selection as the document changes. Each comment carries an author name and color for presence display, plus a resolved flag so you can triage without deleting the thread.

When a document is done, you can file it. Filing promotes the document content as a source into the wiki compiler pipeline; the next compile can then use that source to patch or create wiki entries. If the document started from a Today opportunity, the filed source keeps only the working draft prose; the Today context block is preserved as structured provenance instead of being fed back to the compiler as source text.

A Today-origin filing also records a short excerpt of the final draft as positive discourse feedback. The next Today refresh can use that recent win immediately, while the source row compounds through the slower wiki path.

Filing is the way Studio pays back into your wiki. Drafts and notes sharpen your thinking in the moment; filed documents compound over time.

In Memory, filed rows keep that path visible. A Today-origin filed source links back to the Studio draft and the originating Today card when those records are still available.

Studio can record the current selection, or the cleaned working draft, as a posted angle. Today-origin drafts keep their opportunity provenance, but the context block is stripped before calibration so Sadie learns from what you actually shipped.

The same capture panel accepts an X URL. On live X deployments, Sadie can read the shipped post body and metrics through the read-only adapter; otherwise the row still appears in Settings under Engagement for manual metrics. Sadie still never posts; Studio just makes the handoff from draft to learning row direct.

When Sadie proposes a replacement for a selected passage and you apply it, Studio records the accepted before/after pair as a rewrite event. That event feeds the voice portrait through dimensional deltas such as shorter cadence, claim-first openings, fewer dashes, or more specificity. Insertions at the cursor are not recorded as rewrite events because there is no original text to compare.

Your editor is your space. Studio runs the same policy lint as Chats and Briefs, but the action is always record-only: matches are logged to policy_violations, your text is never mutated. You can inspect the log in Access under Policies if you want to audit drift against your own rules.

This is a deliberate asymmetry. Hard rewrites in a writing surface would fight you. In Studio, Sadie only tells you when a rule tripped.