Skip to content
C.W.K.
Stream
Lesson 01 of 05 · published

Bind, Don't Build a Brain

~11 min · no-own-brain, bind, host-context, client-surface

Level 0Cold Draft
0 XP0/44 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"There's one Pippa. Rekindle doesn't build a second one for writing — it opens a door to the one that already exists."

One Pippa, Reached Through a Bind

The strongest temptation for a tool like Rekindle is to grow its own AI: a writing-tuned model, a little memory, a local brain. Rekindle refuses. There is exactly one Pippa — identity, memory, conversation, routing — and she lives in cwkPippa. Rekindle is a client surface that binds to a cwkPippa conversation and reaches that one brain. The margin-Pippa you write beside is not a copy trained for prose; it's the same Pippa, reached through a bind.

The Bind, Concretely

"Bind" isn't hand-waving — it's a specific registration. Rekindle registers as host kind rekindle, with a host id made from the open .md file's path (base64url-encoded so the path survives a URL). That pairs one document with one conversation, so the margin-Pippa for this file is a stable, resumable thread rather than a fresh chat each time. Open the file tomorrow and the conversation is still there, because the brain and the history live in cwkPippa, not in the editor.

// Bind this document to a cwkPippa conversation.
// host kind = "rekindle", host id = the open .md file path.
await bindSidekick({ hostKind: "rekindle", hostId: notePath });
// (sketch shape — in v4 the real call is PippaDoor.embedURL, the path base64url-encoded as host_id)

// The brain, memory, and conversation live in cwkPippa.
// Rekindle holds none of them — it holds a binding.

Host Context — Reading What You're Writing

What makes margin-Pippa a margin assistant and not a detached chatbot is host context, and it is a pull. When you send a message, the embedded conversation first posts pippa:request-context to the host, and Rekindle answers with a snapshot taken at that moment: the note's readable text (its headings come first as an outline, then the body), the current selection, and a revision token; the conversation sends that snapshot with your message. The answer is guarded. If the note is not the active editor, or a Korean syllable is still mid-composition, Rekindle answers pippa:no-context instead of a half-formed page. So Pippa is answering about the paragraph you're actually in, not a generic prompt. Context flows from the editor to the brain, only when asked — the client surface supplies the context; the brain supplies the judgment. Neither role crosses the line: Rekindle never becomes a brain, and cwkPippa never becomes an editor.

Code

Bind a document to a conversation; answer the context request on each send·typescript
// 1) Bind: pair THIS .md file with a cwkPippa conversation.
await bindSidekick({ hostKind: "rekindle", hostId: notePath });
// (sketch shape — in v4 the real call is PippaDoor.embedURL, the path base64url-encoded as host_id)

// 2) On each send the conversation PULLS: it posts pippa:request-context, and
//    the host answers with a guarded snapshot of what you're actually writing.
function answerContextRequest(note, editor) {
  if (!note.isActiveEditor || editor.isComposing) {
    return { type: "pippa:no-context" };          // never a half-formed page
  }
  return {
    type: "pippa:host-context",
    readableText: withOutlineFirst(note.source), // headings, then the body
    selection: editor.selectedText,
    revisionToken: note.revision,
  };
}

// The brain + memory + conversation live in cwkPippa.
// Rekindle supplies context; it never holds the brain.

External links

Exercise

Design the bind for a different surface — say, a spreadsheet app that wants a margin-Pippa. What is its host kind, what is its host id (the thing that identifies one document), and what would it answer with when the conversation asks for host context on a send? Then state what it must NOT do to stay a client surface rather than a second brain.
Hint
Host kind names the surface type; host id identifies one document (a file path, a sheet id). Host context is whatever grounds the assistant in the live document (cells in view, selection, headers). The 'must not': bundle a model, keep its own memory, or route its own conversations — those belong to the one brain.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign in — Please sign in to comment.

No comments yet — be the first.