Arcmark Agent Skill
Arcmark is a macOS sidebar app for organizing bookmarks and short markdown
notes inside named, color-coded workspaces. This skill lets you create
and rearrange that content on the user's behalf — atomically, with no manual
file editing.
Setup / prerequisites
- Arcmark must be running. All commands talk to a local HTTP server inside
the running app.
- If a command exits with
code: "app_not_running", stop and ask the user
to launch Arcmark.app before retrying. Do not loop on retries.
- You do not need network access; everything is on
127.0.0.1.
Glossary
- Workspace — a named, colored top-level container (e.g. "Reading",
"Work"). Workspaces hold nodes. The agent can create and rename them, but
cannot delete workspaces — this is a hard rule.
- Folder — a named container that can hold links, notes, and other
folders. Nestable.
- Link — a bookmark with a title and a URL. The app fetches favicons
automatically.
- Note — a markdown document with a title and a body. Body content is
stored as a
.md file and read/written with notes:read and notes:write.
- Node — any of folder, link, or note. Generic operations like
nodes:move work on all three.
Common Actions
| User phrasing |
Command |
| "Save this here" / "Add this to the workspace I'm in" |
workspaces:current to get the id, then links:create --workspace WS_ID --url URL |
| "Save this link in my Reading workspace" |
links:create --workspace WS_ID --url URL |
| "Add a folder called Reading" |
folders:create --workspace WS_ID --name "Reading" |
| "Group these tabs into a Research folder in my Reading workspace" |
create folder, then nodes:move each link with --to-parent FOLDER_ID |
| "Move this link to my Work workspace" |
nodes:move LINK_ID --to-workspace WORK_WS_ID |
| "Rename this folder to Inbox" |
folders:rename FOLDER_ID --name "Inbox" |
| "Take a note titled Plan" |
notes:create --workspace WS_ID --title "Plan" |
| "Write up this meeting in a note" |
notes:create ... --content - then pipe markdown to stdin |
| "What's in my Reading workspace?" |
tree WS_ID |
| "Make a new workspace called Research" |
workspaces:create --name "Research" |
| "Delete this bookmark" |
nodes:delete NODE_ID (or links:delete) |
Workflow
- Find ids first. Run
arcmark.js state (or arcmark.js workspaces:list
plus arcmark.js tree WORKSPACE_ID) to discover the workspace, folder,
and node UUIDs you need. Never invent or guess ids.
- When the user says "this workspace", "the current one", "the one I'm
in", or "here", resolve it with
arcmark.js workspaces:current. The
response is { selected, settingsSelected, workspace: { id, name, colorId } | null }.
If selected is false (e.g. the user is on the Settings screen),
ask which workspace to use instead of guessing.
- Decide on a target. Pick which workspace and (optionally) parent
folder a new node should live in. If the user is ambiguous, ask.
- Compose atomic mutations. Run one CLI command per action. Each
command is a single API call; the running app updates the sidebar
immediately.
- Confirm before destructive bulk work. Before deleting multiple
nodes — especially folders containing many children — confirm with the
user. Deletes are not undoable from the CLI.
Writing note bodies
Three ways to supply note content, in order of preference for long
documents:
--content - reads the body from stdin. Use this when piping or
here-docs:
./scripts/arcmark.js notes:write NOTE_ID --content - <<'EOF'
# Heading
Paragraph with **markdown**.
EOF
--file path/to/file.md reads a file from disk.
--content "..." for short snippets that fit on a single command line.
notes:read NOTE_ID prints the body to stdout so you can fetch existing
content before editing.
Moving across workspaces
nodes:move is the universal mover. It accepts:
--to-workspace ID — moves to a different workspace. Omit to move within
the current workspace.
--to-parent ID — drops the node inside that folder. Pass the literal
root to move to the workspace root.
--index N — position within the parent (0-based). Omit to append.
Combinations:
- Same workspace, reorder:
nodes:move ID --to-parent FOLDER_ID --index 0
- Cross workspace, into a folder:
nodes:move ID --to-workspace WS --to-parent FOLDER_ID
- Cross workspace, to root:
nodes:move ID --to-workspace WS --to-parent root
Rules and limits
- Never delete a workspace. There is no command for it; do not try.
If the user explicitly asks, explain that workspaces must be removed
manually from the app.
- Workspace color names: Blush, Apricot, Butter, Leaf, Mint, Sky,
Periwinkle, Lavender. Case-insensitive; raw enum cases (ember, ruby,
coral, tangerine, moss, ocean, indigo, graphite) also work.
- Every command exits non-zero on failure and prints
{ error, code, ... }
to stderr. Inspect code — app_not_running, workspace_not_found,
parent_not_folder, node_not_found are the common ones.
Commands Reference
state Dump the full AppState JSON.
tree WORKSPACE_ID Dump one workspace's tree.
workspaces:list
workspaces:current Workspace currently visible in the app.
workspaces:create --name "X" [--color NAME]
workspaces:rename ID --name "Y"
workspaces:set-color ID --color NAME
folders:create --workspace ID [--parent ID|root] --name "X" [--expanded true|false]
folders:rename ID --name "Y"
folders:delete ID
links:create --workspace ID [--parent ID|root] --url URL [--title T]
links:rename ID --title "Y"
links:set-url ID --url URL
links:delete ID
notes:create --workspace ID [--parent ID|root] --title T [--content TEXT | --file PATH | --content -]
notes:rename ID --title "Y"
notes:read ID
notes:write ID --content TEXT | --file PATH | --content -
notes:delete ID
nodes:move ID [--to-workspace ID] [--to-parent ID|root] [--index N]
nodes:delete ID
Examples
Group two existing links into a new folder inside the Reading workspace:
# 1. Find the ids.
./scripts/arcmark.js workspaces:list
# -> [{"id":"...reading...","name":"Reading", ...}]
./scripts/arcmark.js tree READING_WS_ID
# Pick out the two link ids from the tree output.
# 2. Create the folder.
FOLDER_ID=$(./scripts/arcmark.js folders:create \
--workspace READING_WS_ID --name "Research" \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
# 3. Move each link into it.
./scripts/arcmark.js nodes:move LINK_ID_1 --to-parent "$FOLDER_ID"
./scripts/arcmark.js nodes:move LINK_ID_2 --to-parent "$FOLDER_ID"
Create a note in Reading and fill it with markdown from stdin:
NOTE_ID=$(./scripts/arcmark.js notes:create \
--workspace READING_WS_ID --title "Weekly plan" \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
./scripts/arcmark.js notes:write "$NOTE_ID" --content - <<'EOF'
# Weekly plan
- Finish the report
- Email the team
EOF
Save a link in Work, then move it to a Reading subfolder:
LINK_ID=$(./scripts/arcmark.js links:create \
--workspace WORK_WS_ID --url "https://anthropic.com" \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
./scripts/arcmark.js nodes:move "$LINK_ID" \
--to-workspace READING_WS_ID --to-parent RESEARCH_FOLDER_ID
Source: Geek-1001/arcmark — distributed by TomeVault.
1---2name: geek-1001-arcmark-arcmark3description: Arcmark Agent Skill4---56# Arcmark Agent Skill78Arcmark is a macOS sidebar app for organizing bookmarks and short markdown9notes inside named, color-coded **workspaces**. This skill lets you create10and rearrange that content on the user's behalf — atomically, with no manual11file editing.1213## Setup / prerequisites1415- **Arcmark must be running.** All commands talk to a local HTTP server inside16 the running app.17- If a command exits with `code: "app_not_running"`, **stop and ask the user18 to launch Arcmark.app** before retrying. Do not loop on retries.19- You do not need network access; everything is on `127.0.0.1`.2021## Glossary2223- **Workspace** — a named, colored top-level container (e.g. "Reading",24 "Work"). Workspaces hold nodes. The agent can create and rename them, but25 **cannot delete workspaces** — this is a hard rule.26- **Folder** — a named container that can hold links, notes, and other27 folders. Nestable.28- **Link** — a bookmark with a title and a URL. The app fetches favicons29 automatically.30- **Note** — a markdown document with a title and a body. Body content is31 stored as a `.md` file and read/written with `notes:read` and `notes:write`.32- **Node** — any of folder, link, or note. Generic operations like33 `nodes:move` work on all three.3435## Common Actions3637| User phrasing | Command |38|---|---|39| "Save this here" / "Add this to the workspace I'm in" | `workspaces:current` to get the id, then `links:create --workspace WS_ID --url URL` |40| "Save this link in my Reading workspace" | `links:create --workspace WS_ID --url URL` |41| "Add a folder called Reading" | `folders:create --workspace WS_ID --name "Reading"` |42| "Group these tabs into a Research folder in my Reading workspace" | create folder, then `nodes:move` each link with `--to-parent FOLDER_ID` |43| "Move this link to my Work workspace" | `nodes:move LINK_ID --to-workspace WORK_WS_ID` |44| "Rename this folder to Inbox" | `folders:rename FOLDER_ID --name "Inbox"` |45| "Take a note titled Plan" | `notes:create --workspace WS_ID --title "Plan"` |46| "Write up this meeting in a note" | `notes:create ... --content -` then pipe markdown to stdin |47| "What's in my Reading workspace?" | `tree WS_ID` |48| "Make a new workspace called Research" | `workspaces:create --name "Research"` |49| "Delete this bookmark" | `nodes:delete NODE_ID` (or `links:delete`) |5051## Workflow52531. **Find ids first.** Run `arcmark.js state` (or `arcmark.js workspaces:list`54 plus `arcmark.js tree WORKSPACE_ID`) to discover the workspace, folder,55 and node UUIDs you need. Never invent or guess ids.56 - When the user says "this workspace", "the current one", "the one I'm57 in", or "here", resolve it with `arcmark.js workspaces:current`. The58 response is `{ selected, settingsSelected, workspace: { id, name, colorId } | null }`.59 If `selected` is false (e.g. the user is on the Settings screen),60 ask which workspace to use instead of guessing.612. **Decide on a target.** Pick which workspace and (optionally) parent62 folder a new node should live in. If the user is ambiguous, ask.633. **Compose atomic mutations.** Run one CLI command per action. Each64 command is a single API call; the running app updates the sidebar65 immediately.664. **Confirm before destructive bulk work.** Before deleting multiple67 nodes — especially folders containing many children — confirm with the68 user. Deletes are not undoable from the CLI.6970## Writing note bodies7172Three ways to supply note content, in order of preference for long73documents:7475- `--content -` reads the body from stdin. Use this when piping or76 here-docs:7778 ```bash79 ./scripts/arcmark.js notes:write NOTE_ID --content - <<'EOF'80 # Heading81 Paragraph with **markdown**.82 EOF83 ```8485- `--file path/to/file.md` reads a file from disk.8687- `--content "..."` for short snippets that fit on a single command line.8889`notes:read NOTE_ID` prints the body to stdout so you can fetch existing90content before editing.9192## Moving across workspaces9394`nodes:move` is the universal mover. It accepts:9596- `--to-workspace ID` — moves to a different workspace. Omit to move within97 the current workspace.98- `--to-parent ID` — drops the node inside that folder. Pass the literal99 `root` to move to the workspace root.100- `--index N` — position within the parent (0-based). Omit to append.101102Combinations:103104- Same workspace, reorder: `nodes:move ID --to-parent FOLDER_ID --index 0`105- Cross workspace, into a folder: `nodes:move ID --to-workspace WS --to-parent FOLDER_ID`106- Cross workspace, to root: `nodes:move ID --to-workspace WS --to-parent root`107108## Rules and limits109110- **Never delete a workspace.** There is no command for it; do not try.111 If the user explicitly asks, explain that workspaces must be removed112 manually from the app.113- Workspace **color names**: Blush, Apricot, Butter, Leaf, Mint, Sky,114 Periwinkle, Lavender. Case-insensitive; raw enum cases (ember, ruby,115 coral, tangerine, moss, ocean, indigo, graphite) also work.116- Every command exits non-zero on failure and prints `{ error, code, ... }`117 to stderr. Inspect `code` — `app_not_running`, `workspace_not_found`,118 `parent_not_folder`, `node_not_found` are the common ones.119120## Commands Reference121122```123state Dump the full AppState JSON.124tree WORKSPACE_ID Dump one workspace's tree.125126workspaces:list127workspaces:current Workspace currently visible in the app.128workspaces:create --name "X" [--color NAME]129workspaces:rename ID --name "Y"130workspaces:set-color ID --color NAME131132folders:create --workspace ID [--parent ID|root] --name "X" [--expanded true|false]133folders:rename ID --name "Y"134folders:delete ID135136links:create --workspace ID [--parent ID|root] --url URL [--title T]137links:rename ID --title "Y"138links:set-url ID --url URL139links:delete ID140141notes:create --workspace ID [--parent ID|root] --title T [--content TEXT | --file PATH | --content -]142notes:rename ID --title "Y"143notes:read ID144notes:write ID --content TEXT | --file PATH | --content -145notes:delete ID146147nodes:move ID [--to-workspace ID] [--to-parent ID|root] [--index N]148nodes:delete ID149```150151## Examples152153Group two existing links into a new folder inside the Reading workspace:154155```bash156# 1. Find the ids.157./scripts/arcmark.js workspaces:list158# -> [{"id":"...reading...","name":"Reading", ...}]159160./scripts/arcmark.js tree READING_WS_ID161# Pick out the two link ids from the tree output.162163# 2. Create the folder.164FOLDER_ID=$(./scripts/arcmark.js folders:create \165 --workspace READING_WS_ID --name "Research" \166 | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')167168# 3. Move each link into it.169./scripts/arcmark.js nodes:move LINK_ID_1 --to-parent "$FOLDER_ID"170./scripts/arcmark.js nodes:move LINK_ID_2 --to-parent "$FOLDER_ID"171```172173Create a note in Reading and fill it with markdown from stdin:174175```bash176NOTE_ID=$(./scripts/arcmark.js notes:create \177 --workspace READING_WS_ID --title "Weekly plan" \178 | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')179180./scripts/arcmark.js notes:write "$NOTE_ID" --content - <<'EOF'181# Weekly plan182183- Finish the report184- Email the team185EOF186```187188Save a link in Work, then move it to a Reading subfolder:189190```bash191LINK_ID=$(./scripts/arcmark.js links:create \192 --workspace WORK_WS_ID --url "https://anthropic.com" \193 | python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')194195./scripts/arcmark.js nodes:move "$LINK_ID" \196 --to-workspace READING_WS_ID --to-parent RESEARCH_FOLDER_ID197```198199---200> Source: [Geek-1001/arcmark](https://github.com/Geek-1001/arcmark) — distributed by [TomeVault](https://tomevault.io).201<!-- tomevault:4.0:skill_md:2026-06-30 -->