Install
openclaw skills install craft-doClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
Integrate with Craft.do to automate tasks, create/manage documents and folders, edit markdown content, and migrate Obsidian vaults using their REST API.
openclaw skills install craft-doComplete REST API integration for Craft.do - the beautiful note-taking and document app.
This skill provides full programmatic access to Craft.do for:
Craft.do features:
export CRAFT_API_KEY="pdk_xxx"
export CRAFT_ENDPOINT="https://connect.craft.do/links/YOUR_LINK/api/v1"
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/folders"
Returns all locations: unsorted, daily_notes, trash, templates, and custom folders.
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/documents?folderId=FOLDER_ID"
# Root-level folder
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"folders": [{
"name": "Projects"
}]
}' \
"$CRAFT_ENDPOINT/folders"
# Nested folder (requires parent folder ID)
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"folders": [{
"name": "Q1 2024",
"parentFolderId": "PARENT_FOLDER_ID"
}]
}' \
"$CRAFT_ENDPOINT/folders"
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"documents": [{
"title": "Document Title"
}],
"destination": {
"folderId": "FOLDER_ID"
}
}' \
"$CRAFT_ENDPOINT/documents"
Note: Documents are created without content initially. Use the /blocks endpoint to add content.
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"blocks": [{
"type": "text",
"markdown": "# Document content\n\nFull markdown support!"
}],
"position": {
"pageId": "DOCUMENT_ID",
"position": "end"
}
}' \
"$CRAFT_ENDPOINT/blocks"
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/blocks?id=DOCUMENT_ID"
Returns full markdown content with all blocks.
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tasks": [{
"markdown": "Task description",
"location": {"type": "inbox"},
"status": "active"
}]
}' \
"$CRAFT_ENDPOINT/tasks"
curl -X PUT \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tasksToUpdate": [{
"id": "TASK_ID",
"markdown": "- [x] Completed task"
}]
}' \
"$CRAFT_ENDPOINT/tasks"
# Active tasks
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/tasks?scope=active"
# All completed (logbook)
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/tasks?scope=logbook"
# Upcoming
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/tasks?scope=upcoming"
# Inbox only
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/tasks?scope=inbox"
curl -X PUT \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"documentIds": ["DOC_ID"],
"destination": {"location": "unsorted"}
}' \
"$CRAFT_ENDPOINT/documents/move"
Note: Can only move to unsorted, templates, or custom folder IDs. Cannot move directly to trash.
# Create task in Craft from Mission Control
TASK_TITLE="Deploy new feature"
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"tasks\": [{
\"markdown\": \"$TASK_TITLE\",
\"location\": {\"type\": \"inbox\"},
\"status\": \"active\"
}]
}" \
"$CRAFT_ENDPOINT/tasks"
TODAY=$(date +%Y-%m-%d)
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"documents\": [{
\"title\": \"Daily Note - $TODAY\",
\"content\": [{\"textContent\": \"# $TODAY\\n\\n## Tasks\\n\\n## Notes\\n\"}],
\"location\": \"daily_notes\"
}]
}" \
"$CRAFT_ENDPOINT/documents"
# Get all completed tasks
curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/tasks?scope=logbook" | jq '.items[] | {id, markdown, completedAt}'
Problem: Mission Control has automation but ugly UI. Craft has beautiful UI but no automation.
Solution: Use Mission Control as the source of truth, sync completed work to Craft for viewing.
#!/bin/bash
# sync-to-craft.sh - Sync completed tasks to Craft
# Read completed tasks from Mission Control
COMPLETED_TASKS=$(cat mission-control/tasks.json | jq -r '.[] | select(.status=="done") | .title')
# Push each to Craft
echo "$COMPLETED_TASKS" | while read -r task; do
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"tasks\": [{
\"markdown\": \"- [x] $task\",
\"location\": {\"type\": \"inbox\"}
}]
}" \
"$CRAFT_ENDPOINT/tasks"
done
Craft fully supports markdown:
# H1, ## H2, etc.- item, 1. item- [ ] todo, - [x] done[text](url)`inline` or ```block```*italic*, **bold**All content is stored and returned as markdown, making it perfect for programmatic manipulation.
Common errors:
VALIDATION_ERROR - Check required fields (markdown, location)403 - Invalid/expired API key404 - Document/task ID not foundExample validation error:
{
"error": "Validation failed",
"code": "VALIDATION_ERROR",
"details": [{
"path": ["tasks", 0, "markdown"],
"message": "Invalid input: expected string"
}]
}
When Craft adds to their API:
# 1. Create a project folder
PROJECT_ID=$(curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Q1 2024 Projects"}' \
"$CRAFT_ENDPOINT/folders" | jq -r '.id')
# 2. Create a project document
DOC_ID=$(curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"documents\": [{
\"title\": \"Project Alpha\",
\"content\": [{\"textContent\": \"## Overview\\n\\nProject details here.\"}],
\"location\": \"$PROJECT_ID\"
}]
}" \
"$CRAFT_ENDPOINT/documents" | jq -r '.items[0].id')
# 3. Create tasks for the project
curl -X POST \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tasks": [
{"markdown": "Design wireframes", "location": {"type": "inbox"}},
{"markdown": "Build prototype", "location": {"type": "inbox"}},
{"markdown": "User testing", "location": {"type": "inbox"}}
]
}' \
"$CRAFT_ENDPOINT/tasks"
# 4. Mark first task complete
TASK_ID=$(curl -H "Authorization: Bearer $CRAFT_API_KEY" \
"$CRAFT_ENDPOINT/tasks?scope=active" | jq -r '.items[0].id')
curl -X PUT \
-H "Authorization: Bearer $CRAFT_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"tasksToUpdate\": [{
\"id\": \"$TASK_ID\",
\"markdown\": \"- [x] Design wireframes\"
}]
}" \
"$CRAFT_ENDPOINT/tasks"
Status: Tested and working (2026-01-31) Tested with: Craft API v1 Author: Eliza