Help us improve
Share bugs, ideas, or general feedback.
From hyday
Create, edit, list, query, inspect, and lay out Hyday whiteboards through the hyday-whiteboard MCP server. Use whenever the user adds, modifies, moves, deletes, lists, or asks about whiteboard cards, sticky notes, groups, or connections — or wants to inspect what's on a board, build a layout from existing notes, or organize notes visually — or mentions whiteboard, canvas, board, sticky note, group. Common triggers: "幫我做張白板", "列出我的白板", "把這幾篇筆記放上白板", "白板上有什麼", "整理筆記成白板". Requires the `hyday-whiteboard` MCP server to be configured (see installation below).
npx claudepluginhub mukiwu/hyday-skills --plugin hydayHow this skill is triggered — by the user, by Claude, or both
Slash command
/hyday:hyday-whiteboardThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **First time in this conversation? Run Step 0 from `hyday-vault-layout` to find the vault root.** The whiteboard MCP server below resolves it for you automatically (from `~/Library/Application Support/Hyday/settings.json` on macOS or `%APPDATA%\Hyday\settings.json` on Windows — `journalPath` field), so as long as the server is configured and the user has opened Hyday once, you're fine. If you...
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Breaks plans, specs, or PRDs into thin vertical-slice issues on the project issue tracker using tracer bullets. Useful for converting high-level work into grabbable implementation tickets.
Share bugs, ideas, or general feedback.
First time in this conversation? Run Step 0 from
hyday-vault-layoutto find the vault root. The whiteboard MCP server below resolves it for you automatically (from~/Library/Application Support/Hyday/settings.jsonon macOS or%APPDATA%\Hyday\settings.jsonon Windows —journalPathfield), so as long as the server is configured and the user has opened Hyday once, you're fine. If you ever need to call the server with--data-root, see Step 0 inhyday-vault-layoutfor the lookup chain.
Hyday's Whiteboard is a 2D canvas where the user pins note cards, sticky notes, and grouping containers, and draws connections between them.
Unlike notes (which are plain .md files), whiteboard state lives in a sidecar JSON at <DATA_ROOT>/.hyday/whiteboards-v2.json. You operate it through the hyday-whiteboard MCP server, which exposes 12 tools.
Before this skill works, the user must configure the MCP server in their agent's MCP config. See mcp-servers/hyday-whiteboard/README.md in this repo for the exact steps. The short version:
npm install inside mcp-servers/hyday-whiteboard/..mcp.json pointing node at whiteboard-server.cjs.settings.json; override with --data-root if needed.Once configured, the agent has access to tools named mcp__hyday-whiteboard__* (or similar — the exact prefix depends on the agent).
A board contains zero or more items and zero or more connections.
| Kind | What it is | Created with |
|---|---|---|
note (card) | A card linked to an existing .md note. Shows the note's title and a preview. | addNoteToWhiteboard or buildWhiteboardLayout |
sticky | A free-form text snippet that lives only on the board — no backing .md file. | addStickyNote |
group | A visual container that wraps other items under a labelled header. | createWhiteboardGroup or buildWhiteboardLayout |
Edges between two items. The server auto-picks the best handle (top/bottom/left/right) for the shortest path.
x increases to the right, y increases downward (top-left is 0,0).Use buildWhiteboardLayout. It takes groups of note IDs plus optional connections and handles all positioning — column distribution, group sizing, card heights, connection handles. This avoids overlapping cards and bad spacing.
.md file in the vault (see hyday-markdown and hyday-vault-layout). Get each note's fileId (filename without .md).[{title, noteIds}].[{fromNoteId, toNoteId, label?}].buildWhiteboardLayout once. The server returns a summary of what was created.Example call shape:
{
"groups": [
{"title": "Foundations", "noteIds": ["systems-thinking-intro", "feedback-loops"]},
{"title": "Case studies", "noteIds": ["case-toyota", "case-netflix", "case-spotify"]},
{"title": "Practice", "noteIds": ["weekly-review-template", "decision-journal"]}
],
"connections": [
{"fromNoteId": "systems-thinking-intro", "toNoteId": "case-toyota", "label": "applies to"}
]
}
The server arranges groups left-to-right, places cards in 1 or 2 columns per group depending on count, sizes each card based on note content length, and draws connections with optimal handle positions.
For incremental edits, use the per-item tools:
listWhiteboards — find the right boardId (default is 'main').listWhiteboardItems(boardId) — see what's already there. Note each item's id, x, y, width, height.addNoteToWhiteboard — append one card. Use the returned width×height to pick the next card's Y.addStickyNote — add a sticky.createWhiteboardGroup — wrap existing cards in a group (create the group after the cards so you know their bounding box).createWhiteboardConnection — connect two items by their itemIds.moveWhiteboardItems — batch reposition / resize.updateWhiteboardItem — edit text / color / size of a single item.removeWhiteboardItems — delete items (auto-drops their connections).All tools take an optional boardId; omit to target the default board ('main').
listWhiteboards() — returns boards with id, name, itemCount.listWhiteboardItems({boardId?}) — returns items with id, noteId, itemKind, title, x, y, width, height.createWhiteboard({name}) — new board.deleteWhiteboard({boardId}) — soft-delete (recoverable). Cannot delete 'main'.addNoteToWhiteboard({boardId?, noteId, x, y, width?, height?})
noteId is the note's filename without .md.height — let the server estimate from content. The response includes the actual width×height; use it to compute the next card's Y.width is 200. Standard card.addStickyNote({boardId?, content, x, y, color?})
content is plain text — keep it short (a few words to one sentence).color: yellow (default), blue, green, pink, purple, orange.200×150.createWhiteboardGroup({boardId?, title, x, y, width?, height?})
title MUST be a meaningful theme name (e.g. "系統思考基礎"). Do not pass generic strings like "Group Name" — the server's description literally calls this out.x = leftmost-card-x - 30, y = topmost-card-y - 60 (room for title).width = card-area-width + 60, height = card-area-height + 90.createWhiteboardConnection({boardId?, fromItemId, toItemId, label?}) — by item ID, not note ID. Handles are picked automatically.updateWhiteboardItem({boardId?, itemId, content?, color?, width?, height?}) — change at least one field.moveWhiteboardItems({boardId?, moves: [{itemId, x, y, width?, height?}]}) — batch.removeWhiteboardItems({boardId?, itemIds}) — also removes connections touching the removed items.buildWhiteboardLayout({boardId?, groups, connections?, cardWidth?, columns?}) — see workflow above. Preferred for any layout of >2 cards.noteId ≠ note title. It's the filename without .md. If you only have a title, find the file first (see hyday-vault-layout).nextY = previousY + previousHeight + 40. With buildWhiteboardLayout this is handled for you.height to addNoteToWhiteboard. The auto-estimate is content-aware; an explicit height usually makes the card too tall or too short.zIndex = 0). Create cards first, then groups, otherwise the group title visually sits under cards.itemId, not noteId. Item IDs are returned when a card is created (or appear in listWhiteboardItems). Inside buildWhiteboardLayout, you specify connections by noteId because the server maps note → item for you.hyday-markdown skill to create them if needed):
reading-notes-atomic-habits.mdreading-notes-deep-work.mdreading-notes-thinking-fast-slow.md{
"tool": "buildWhiteboardLayout",
"input": {
"groups": [
{
"title": "Best of Q3",
"noteIds": ["reading-notes-atomic-habits", "reading-notes-deep-work"]
},
{
"title": "Skim again later",
"noteIds": ["reading-notes-thinking-fast-slow"]
}
],
"connections": [
{
"fromNoteId": "reading-notes-atomic-habits",
"toNoteId": "reading-notes-deep-work",
"label": "shared theme: deliberate practice"
}
]
}
}
{
"tool": "addStickyNote",
"input": {
"content": "Q3 Reading Review",
"x": 0,
"y": -100,
"color": "yellow"
}
}
After any whiteboard operation, verify:
noteId you used corresponds to a real .md file (otherwise the card shows the noteId as title and no preview)."Group Name" or "Untitled".height from each addNoteToWhiteboard to space them).itemIds (per-item flow) or real noteIds (buildWhiteboardLayout flow).buildWhiteboardLayout when creating >2 cards at once..hyday/whiteboards-v2.json). If the user's vault folder is inside iCloud, Dropbox, or another file-sync tool, the whiteboard syncs across machines along with the vault..backup.1, .backup.2, .backup.3) next to the sidecar.trashedBoards inside the same sidecar — they're not gone.mcp-servers/hyday-whiteboard/README.mdhyday-markdown skillhyday-vault-layout skill