stickies.live

Stickies 0.1 (draft)

A small, open format for moving sticky notes between apps by copy and paste, drag and drop, or an agent's tools.

Status: draft. Anything here can change before 1.0.

Works with Murmur.

1. Goals

Not goals for 0.1: live sync, comments, permissions, or images inside notes.

2. Document

A Stickies document is a JSON Canvas document with one extra top-level field, stickies, that gives the version.

{
  "stickies": "0.1",
  "source": { "app": "Murmur", "url": "murmur://conversation/c_8f2" },
  "nodes": [
    {
      "id": "n_41a",
      "type": "text",
      "text": "Sticky notes as an open standard",
      "x": 0, "y": 0, "width": 240, "height": 160,
      "color": "#fdf6c8",
      "colorName": "yellow",
      "state": "progress"
    }
  ],
  "edges": []
}
FieldRequiredMeaning
stickiesyesVersion of this spec, as a string. "0.1" for now.
nodesyesThe notes. See §3.
edgesnoArrows between notes, exactly as JSON Canvas defines them.
sourcenoWhere the notes came from. See §5.

A receiver MUST ignore fields it doesn't know. A receiver SHOULD accept any document whose major version it knows (0.x for now) and do its best with the rest.

3. Notes

Each note is a JSON Canvas text node. JSON Canvas requires the first group below; this spec adds the second.

From JSON Canvas

FieldRequiredMeaning
idyesUnique within the document. Receivers SHOULD give pasted notes new IDs and keep the old one in source.id (§5).
typeyesAlways "text" for a note. Receivers SHOULD skip other node types they don't support.
textyesThe note's contents in Markdown. Short is normal.
x, yyesTop-left position in canvas pixels. Only meaningful relative to the other notes in the document.
width, heightyesSize in canvas pixels. A sender with no sizes SHOULD use 240 × 160.
colornoA hex colour like "#fdf6c8", or a JSON Canvas preset "1"–"6". Senders SHOULD use hex.

Added by Stickies

FieldRequiredMeaning
colorNamenoThe named colour (§4). Takes priority over color for a receiver that knows the name.
stateno"open", "progress" or "done" (§6). Absent means open.
authornoWho wrote it, as a display name.
createdAt, updatedAtnoWhen, as ISO 8601 UTC strings, e.g. "2026-10-28T22:47:00Z".
sourcenoWhere this one note came from, if it differs from the document's (§5).
extnoApp-specific data (§7).

Positions are relative. A receiver places the group wherever suits it, such as under the cursor, and keeps the notes' positions relative to each other.

4. Colour

Colour is for display only. It never carries meaning; that's what state is for.

Named colours:

colorNameSuggested hex (light)
yellow#fdf6c8
blue#ddedfb
green#def3d7
pink#fbe1ed
purple#ede3fb
grey#f2f2f1

color stays a hex so the document is still valid JSON Canvas. JSON Canvas's numbered presets ("1" red to "6" purple) don't match sticky-note palettes, and a number says nothing about the colour across apps.

5. Source

Where notes came from, so a receiver can link back ("Open in Murmur") and an app can recognise its own notes when they come back.

"source": {
  "app": "Murmur",
  "url": "murmur://conversation/c_8f2/note/n_41a",
  "id": "n_41a"
}
FieldMeaning
appThe sending app's name, for display.
urlA link back to the original. Receivers MUST NOT open it without the person asking.
idThe note's ID in the sending app.

The document-level source applies to every note. A note's own source overrides it field by field.

6. State

A note can say where it is in a simple workflow:

stateMeaning
open (or absent)Not started, or just an idea.
progressBeing worked on.
doneFinished.

State is kept separate from colour. A note that's done keeps its own colour; a receiver chooses how to show the state, for example a tick, a column, a strikethrough, or a colour of its own.

7. Extensions

App-specific data goes under ext, keyed by a short name the app owns:

"ext": {
  "murmur": { "workItem": true }
}

Extensions that several apps adopt can move into the core in a later version.

8. Clipboard and drag and drop

When a person copies or drags notes, the sender puts several versions on the clipboard at once. The receiver takes the richest version it understands.

OrderFormatContents
1Stickies JSON (below)The full document.
2text/htmlEach note as a coloured box, with the document in a data-stickies attribute (§8.2). Required.
3text/plainThe notes' text (§8.3).
4image/png (optional)A picture of the notes, for image-only apps.

8.1 Format names

PlatformName
Media typeapplication/vnd.stickies+json
macOS (UTI)live.stickies.json, conforming to public.json
WindowsRegistered clipboard format application/vnd.stickies+json
Web, copy and pasteapplication/vnd.stickies+json on the event's clipboardData (§8.5)
Web, drag and dropapplication/vnd.stickies+json on DataTransfer

8.2 HTML

Browsers don't let every page read custom clipboard types, so the HTML version also carries the document. The outer element has a data-stickies attribute with the full JSON document, HTML-escaped:

<div data-stickies="{&quot;stickies&quot;:&quot;0.1&quot;,…}">
  <div style="background:#fdf6c8;color:#3b3214;padding:12px 14px;border-radius:6px;width:240px;margin:0 0 8px;font:14px/1.4 system-ui,sans-serif">
    Sticky notes as an open standard
  </div>
</div>

8.3 Plain text

Each note's text, in reading order, separated by a blank line. No markers or metadata.

8.4 Receiving

A receiver SHOULD:

  1. Read the Stickies JSON if it's there.
  2. Otherwise, look for data-stickies in the HTML.
  3. Otherwise, fall back to its usual paste.

If the document's source shows it came from the receiver itself and the notes still exist, the receiver MAY offer to move or link them instead of making copies.

8.5 On the web

Web pages SHOULD write all three versions in a copy (or cut) event, with event.clipboardData.setData(), and read them in a paste event, with event.clipboardData.getData(). What browsers allow, tested in October 2026 with Chromium, WebKit and Firefox:

ChromiumWebKit (Safari)Firefox
Custom type in copy and paste events, same siteyesyesyes
Custom type in copy and paste events, another siteyesno: removedyes
web custom type through navigator.clipboard.write()readable only through navigator.clipboard.read()written, but empty when readrefused
text/html with data-stickiesyes, every caseyes, every caseyes, every case

So the HTML version is the only one that reaches every receiver, and it's required for pages (§8). Pages SHOULD NOT rely on navigator.clipboard for copying notes. A page that has to copy outside a copy event, such as from a "Copy" button, SHOULD write text/html and text/plain with navigator.clipboard.write(), and rely on data-stickies.

Browsers may store custom types in their own private clipboard format, which native apps can't read. Native apps receiving from a browser SHOULD therefore check public.html (or CF_HTML on Windows) for data-stickies.

9. Agents (MCP), non-normative

The same note shape works for agent tools. An app that offers MCP tools for notes SHOULD accept and return notes in this shape, so an agent can move notes between apps without converting them. A suggested set:

ToolInputOutput
list_notesan optional canvas or board IDa Stickies document
add_notesnotes: an array of notes, where only text is requiredthe added notes, with IDs
update_notesnotes: an array with id plus the fields to changethe changed notes

For tool input, x, y, width and height are optional; the app places notes itself when they're missing. Full tool definitions are for a later version.

10. Security

11. Implementations

AppSupports
Murmur (macOS)Copy and paste of notes on maps and boards: writes the Stickies JSON (live.stickies.json), HTML and plain text, and reads them back. Colour, state and author kept.
stickies.liveCopy and paste between boards and other apps, through the registry's use-stickies-clipboard.

12. Open questions

  1. Name. "Stickies" is also the name of Apple's Stickies app. Fine for a format, but search results will be crowded, so docs should say "the Stickies format" or "stickies.live".
  2. Time format. ISO strings are easier to read; milliseconds are what Murmur and many apps store. ISO is the current pick.
  3. More colours. Is a seventh, such as orange, worth it? Unknown names already fall back to hex.
  4. Plain-text state. Should done notes copy as - [x] text in plain text? It helps Markdown apps but adds noise everywhere else.
  5. Anchors. Murmur notes sit beside a message (nearNode). Is "attached to something" general enough for the core, or should it stay an extension?
  6. Groups and frames. JSON Canvas has group nodes. Should a group of notes travel as one?