Source: ai-research/hermes-tldraw-offline-skill-2026-07-24.md — the official Hermes Agent docs page for the skill (hermes-agent.nousresearch.com/docs/user-guide/skills/optional/creative/creative-tldraw-offline, fetched 2026-07-24), which publishes the complete SKILL.md verbatim. Announcement date and framing cross-checked against ai-research/nous-portal-model-promos-2026-07-24.md (x_search over @NousResearch, permalink x.com/NousResearch/status/2080319476243861569).
tldraw-offline is a first-party optional Hermes skill (v1.0.0, MIT, authored “Teknium + Hermes Agent”) announced 2026-07-23 — three days after the v0.19.0 Quicksilver release, and shipped as a skill rather than a version bump. It lets the agent read, edit, and script a canvas in the tldraw offline desktop app. The interesting part is not the diagramming: it is how the agent drives a GUI application. Instead of computer-use pixel-clicking, the skill talks to a local HTTP API the app already exposes, using plain curl from the agent’s terminal.
Key Takeaways
- Install:
hermes skills install official/creative/tldraw-offline. Pathoptional-skills/creative/tldraw-offline, version1.0.0, MIT, platforms linux/macOS/Windows. Tags:tldraw,canvas,whiteboard,document-script,diagramming. - No computer-use, no file surgery. The
SKILL.mdexplicitly states the agent does not GUI-click and does not hand-edit the.tldrawfile. Both of the obvious approaches are ruled out in favor of the app’s own local HTTP API — the same path the tldraw homepage demo uses to have Codex edit a canvas live. - Local API on port 7236, Bearer-token auth. The token is read from
server.json, whose location is platform-specific (~/.config/tldraw/on Linux,~/Library/Application Support/tldraw/on macOS,%APPDATA%\tldraw\on Windows). The skill instructs the agent to re-read port and token on every shell call, because each terminal invocation is a fresh session. - Two distinct workflows.
POST /api/doc/{DOC}/execruns transient code against a liveeditorobject for one-off layout and shape generation. Writingscript/main.jsembeds JavaScript inside the.tldrawfile so it runs on load — giving the document durable, reactive behavior that survives reload and travels with the file. - Document scripts are the novel primitive. A saved
.tldrawfile can open with interactive buttons and preserved state, because the behavior ships in the file rather than in the agent session that made it. The artifact stays live after the agent is gone. - The gotchas are re-entrancy gotchas. Scripts rerun on every load, so shape creation must be idempotent (
createShapeIfMissingwith stable IDs).store.listenfires one tick after a commit, not synchronously. Listeners must detach onsignalabort or they duplicate. Andeditor.run(fn, { history: 'ignore' })keeps script writes out of the user’s undo stack. - Keep the app open. The skill drives a running instance; it is not a headless
.tldrawfile generator.
Why the mechanism matters more than the feature
This wiki already documents the other way an agent controls a desktop app: Hermes Computer Use, which grants screen-recording and accessibility permissions and drives the GUI by looking at pixels and clicking. That path is general — it works on any app — but it is slow, brittle against layout changes, permission-heavy, and (per that article) prone to overloading the context window with screenshots.
tldraw-offline takes the opposite trade: give up generality, get determinism. Because tldraw offline happens to expose a local control API, the agent can issue typed calls with real return values (return editor.getCurrentPageShapes().length) instead of inferring success from a screenshot. No permission grants, no vision tokens, no click coordinates.^[the computer-use-vs-local-API comparison is this wiki’s framing; the SKILL.md states only that the agent does not use computer-use, without contrasting the two approaches]
The generalizable lesson for anyone writing skills: before reaching for computer-use, check whether the target app already speaks HTTP on localhost. Many Electron and local-first desktop apps do. That check is the difference between a reliable integration and a flaky one. This is the desktop-side echo of the argument in The Agent-Readable Web — agents work far better against a declared interface than against a surface built for human eyes.
Implementation
Tool/Service: tldraw-offline Hermes optional skill + the tldraw offline desktop app (offline.tldraw.com)
Setup:
- Install and launch the tldraw offline desktop app; keep it open while the agent works.
hermes skills install official/creative/tldraw-offline- The agent locates port + Bearer token in
server.jsonunder the platform config directory, then drives the canvas overcurl.
Cost: The skill itself is MIT and free; cost is ordinary agent token usage. Because control is API calls rather than screenshots, it avoids the per-step image-token cost that computer-use incurs.^[inferred — the docs do not discuss cost]
Integration notes: Key endpoints are GET /api/search (find the focused document), POST /api/doc/{DOC}/exec (transient code with live editor + helpers), POST /api/doc/{DOC}/script-workspace (retrieve/edit the script file path), and GET /api/doc/{DOC}/script-status (verify the script applied). A minimal shape-creation call:
-H "Authorization: Bearer $TOKEN" \
-d '{"code":"const {createShapeId,toRichText}=await import(\"tldraw\"); editor.createShape({id:createShapeId(),type:\"geo\",x:0,y:0,props:{geo:\"rectangle\",w:200,h:100,color:\"blue\",fill:\"solid\",richText:toRichText(\"hello\")}}); return editor.getCurrentPageShapes().length"}'
Try It
- Install the tldraw offline desktop app and leave it running with a canvas open.
hermes skills install official/creative/tldraw-offline, then ask the agent to describe what is currently on your canvas — this exercisesGET /api/search+ a readexecand confirms the token path resolves on your platform.- Ask for a generated diagram (an architecture sketch, a flow) via one-off
execcalls. Check that shapes land where you expect before trying anything stateful. - Then ask for a document script — e.g. a canvas with a button that toggles a layer. Save, close, and reopen the
.tldrawfile to confirm the behavior persisted without the agent running. - If shapes duplicate on reopen, that is the idempotency gotcha: have the agent switch to
createShapeIfMissingwith stable IDs. - Pair with skill bundles if diagramming is part of a recurring workflow — bundle it behind one slash command so the agent reliably loads it instead of probabilistically choosing it.
Open Questions
- Adoption and maturity are unmeasured here. The skill is v1.0.0 and days old at ingest. No usage data, issue history, or failure reports have been reviewed — only the official docs page and the announcement.
- Security posture is undocumented in the skill page. A localhost HTTP API that executes arbitrary JavaScript in the app context is a meaningful capability; the docs page covers authentication (Bearer token) but does not discuss what happens if that token leaks to another local process, nor whether the skill interacts with the approval gates described in the security model.
- Whether the pattern generalizes officially. The
SKILL.mdnotes the tldraw homepage demo uses this same local-API path with Codex, implying the API is a tldraw feature rather than a Hermes one. Whether Nous intends to ship more “drive a local app by its own API” skills is not stated.
Related
- Hermes Agent v0.19.0 — The Quicksilver Release — the release this skill landed three days after; it shipped as a skill install, not a version bump.
- Hermes Computer Use + Venice API — the pixel-and-click approach to desktop control that this skill deliberately avoids.
- learn — Turn Any Source into a Skill — the first-party path for authoring skills like this one yourself.
- Hermes Skill Bundles — how to make an optional skill load reliably as part of a named workflow.
- Hermes Agent — Security Model — the approval and credential-scoping layers any local-API-executing skill sits inside.
- The Agent-Readable Web — the same declared-interface-beats-scraped-surface argument, on the web side.
- Hermes Agent — topic index.