tldraw-offline
Drive and script tldraw offline canvases with an agent.
Skill by Lexus2016
Chalk Labs
Need help deploying tldraw-offline?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/lexus2016-tldraw-offline
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: agent-building
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Node.js package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/tldraw-offline
What's inside
- Skill name
tldraw-offline- Description
- Drive and script tldraw offline canvases with an agent.
- License
- MIT
- Instructions
- 266 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
- Instructions call the network
- Instructions read files in your home folder (~/.ssh, ~/.aws…)
Files (4)
- SKILL.md
- counter.js · scripts/
- main.js · scripts/
- validate_shapes.mjs · scripts/
SKILL.md (first lines)
# tldraw offline Skill
Work with the tldraw offline desktop app (offline.tldraw.com): read the open
canvas, make edits, and write **document scripts** — JavaScript embedded in a
`.tldraw` file that runs on load and gives the file durable behavior. The app
runs a **local HTTP API** (default `localhost:7236`) that a coding agent drives
with plain `curl` from its terminal — this is exactly how the app's own homepage
demo (Codex editing a canvas live) works. The agent does NOT use computer-use /
GUI clicking, and does NOT hand-edit the `.tldraw` file directly. Keep tldraw
offline open while you work.
## When to Use
- The user has tldraw offline open and asks you to build or modify a canvas
(diagrams, wireframes, layouts).
- You want to add durable behavior to a drawing (reactive shapes, interactive
buttons, animation, connection logic) via an embedded document script.
Do NOT hand-place shapes to imitate a drawing — write the code that generates
them. Agents are far better at scripting the canvas than at drawing on it.
## Prerequisites
- **tldraw offline installed and running**, with a document open. Releases:
https://github.com/tldraw/tldraw-offline/releases/latest (macOS DMG, Windows
x64/Arm64, Linux `x86_64`/`arm64` AppImage or amd64/arm64 `.deb`).
- **Agent skills installed in the app**: `Develop → Install Agent Skills`. The
app writes its own tldraw skill into `~/.codex/skills/`, `~/.claude/skills/`,
`~/.cursor/skills/`, and `~/.gemini/skills/` — teaching that agent the `curl`
recipes below. (This Hermes skill mirrors that guidance for Hermes.)
- **The local control API.** On launch the app writes `server.json` to its config
dir (Linux `~/.config/tldraw/`, macOS `~/Library/Application Support/tldraw/`,
Windows `%APPDATA%\tldraw\`) with `port` (default `7236`), a bearer `token`,
`pid`, and `startedAt`. Every request except `GET /` needs
`Authorization: Bearer <token>`. A clean quit removes `server.json`; if it's
present but the port doesn't answer, the app quit uncleanly — treat as not
running.
- **Re-read port + token on EVERY shell call.** Each terminal call is a fresh
shell, so an `export`ed token does not persist — "export once and reuse" sends
an empty token and 401s. Read both inline at the top of each call:
`PORT=$(jq -r .port <server.json>); TOKEN=$(jq -r .token <server.json>)`.
- No account or network needed for local editing.
## How to Run
Two distinct workflows. Pick by whether the change must survive a reload.
**A. One-off canvas edits (`/exec`)** — layout, generating shapes, cleanup. This
is a live edit, not saved script:
```bash
BASE=http://localhost:7236
TOKEN=$(python -c "import json;print(json.load(open('$HOME/.config/tldraw/server.json'))['token'])")
# find the focused document id
DOC=$(curl -s "$BASE/api/search" -X POST -H 'content-type: application/json' \
-H "Authorization: Bearer $TOKEN" \
-d '{"code":"return (await api.getFocusedDoc()).id"}' | python -c "import sys,json;print(json.load(sys.stdin)['result'])")
# run code with the live `editor` + `helpers` in scope
curl -s "$BASE/api/doc/$DOC/exec" -X POST -H 'content-type: application/json' \
-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"}'
```
**B. Durable behavior (`script/main.js`)** — reactive/interactive logic that must
survive reload. Edit the file on disk; the app's watcher applies it:
```bash
# get the live script file path for the doc
curl -s "$BASE/api/doc/$DOC/script-workspace" -X POST \
-H "Authorization: Bearer $TOKEN" # -> result.mainJsPath, result.isDefaultScript
# edit result.mainJsPath with read_file / patch / write_file (see scripts/main.js)
# then confirm the watcher applied it:
curl -s "$BASE/api/doc/$DOC/script-status" -H "Authorization: Bearer $TOKEN"
```
The ready-to-adapt document script is `scripts/main.js`.
## Quick Reference
The document-script contract (verified against the app's bundled
`script-context.d.ts`):
```js
import { createShapeId, toRichText } from 'tldraw' // primitives: import, not globals
export default function ({ editor, helpers, signal }) {
editor.run(() => { // batch = one undo step
helpers.createShapeIfMissing({ // idempotent furniture
id: createShapeId('node-1'), type: 'geo', x: 0, y: 0,
props: { geo: 'rectangle', w: 200, h: 100, richText: toRichText('hi') },
})
})
const stop = editor.store.listen(() => { /* react */ }) // fires the tick AFTER a commit
signal.addEventListener('abort', () => stop()) // REQUIRED cleanup on rerun/close
}
```
- `ctx.editor` — the live `Editor` (`createShape`, `updateShape`, `deleteShapes`,
`getCurrentPageShapes`, `getShape`, `getBindingsFromShape`, `zoomToFit`,
`on('tick'|'event', fn)`, `run(fn, { history: 'ignore' })`).
- `ctx.helpers` — `createShapeIfMissing`, `createShapesIfMissing`,
`createArrowBetweenShapes(from, to, { arrowheadEnd })`, `translateShapes`,
`onShapeTranslate(id, fn, { signal })`, `richTextToPlainText`, `boxShapes`,
`getLints`.
- `ctx.signal` — `AbortSignal`; attach every listener/interval teardown to it.
- `config.js` (separate file) registers custom shape/tool/component utils and
runs before mount; `main.js` runs against the mounted editor and reruns on save.
## Interactive UI (clickable buttons that drive state)
Drawn shapes can behave like a real app — the thing a static whiteboard can't do.
Full example: `scripts/counter.js` (a number display + MINUS/RESET/PLUS buttons).
Verification boundary — read this before claiming interaction works or doesn't.
The app's OWN agent playbook says to verify a clickable-UI script with "one
simulated click and one state read" via `/exec` (`editor.dispatch` a pointer
event, await a tick, read the shape's state) — NOT by driving a real mouse. By
that standard the counter is verified: dispatched clicks stepped itFrom Lexus2016/hermes-agent-evolution, MIT.
More from Lexus2016/hermes-agent-evolution
- 0.632score
watchers
Lexus2016
Poll RSS, JSON APIs, and GitHub with watermark dedup.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
anatomy
Lexus2016
Explain an idea as an interactive isometric machine figure.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
system-atlas
Lexus2016
Build explorable isometric architecture atlases as HTML.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
kanban-video-orchestrator
Lexus2016
Plan and run multi-agent video production pipelines.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
unreal-mcp
Lexus2016
Automate Unreal Engine editor scenes, actors, and renders.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
meme-generation
Lexus2016
Create meme PNGs from templates with Pillow text overlay.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
evm
Lexus2016
Read-only EVM client: wallets, tokens, gas across 8 chains.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
hyperliquid
Lexus2016
Hyperliquid market data, account history, trade review.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
solana
Lexus2016
Query Solana wallets, tokens, txs, and NFTs in USD.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
ai-presenter-video
Lexus2016
Make a verified AI presenter video from script + image.
SkillAFreshness: A★ 15Claude Code +9 - 0.627score
honcho
Lexus2016
Configure and troubleshoot Honcho memory for Hermes.
SkillAFreshness: A★ 15Claude Code +9 - 0.627score
brag-slim
Lexus2016
Launch video from a project or URL, upstream-maintained.
SkillAFreshness: A★ 15Claude Code +9
Signals
- Stars
- 15
- Forks
- 4
- Open issues
- 0
- Last commit (this folder)
- Aug 14, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from Lexus2016
- 0.659score
Turbo Quant Memory
Lexus2016
Local-first memory and knowledge graph for coding agents.
ConnectorAFreshness: ALocal★ 9↓ 659/wkClaude Code +5 - 0.632score
solana
Lexus2016
Query Solana wallets, tokens, txs, and NFTs in USD.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
ai-presenter-video
Lexus2016
Make a verified AI presenter video from script + image.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
evm
Lexus2016
Read-only EVM client: wallets, tokens, gas across 8 chains.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
hyperliquid
Lexus2016
Hyperliquid market data, account history, trade review.
SkillAFreshness: A★ 15Claude Code +9 - 0.632score
anatomy
Lexus2016
Explain an idea as an interactive isometric machine figure.
SkillAFreshness: A★ 15Claude Code +9
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get tldraw-offline running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
tldraw-offline skill. Agent Mart. https://agentmart.dev/skills/lexus2016-tldraw-offline (last updated 2026-10-24)