Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use whenever the user wants to write or draft an article, blog post, essay, report, or any long-form content. Creates the content in a rich text editor instead of dumping it in chat, so it can be streamed, reviewed, edited, and exported.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 343% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 296% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 112% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 229% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 53% | 0% |
Write and edit long-form documents using the built-in rich text editor. Documents open in workspace mode with chat docked to the side. When a request is about writing prose (an article, blog post, report, essay, story, or similar), create it here rather than writing it into the chat response.
surface_id for subsequent updates. This is the entry point for any new piece of writing.surface_id. Supports replace (overwrite) and append (add to end) modes.surface_id when it belongs to the current conversation, or when the current actor is the guardian/local user. Use to verify content before editing.query, lists the current conversation's documents. With query, searches by title; guardian/local users can search across conversations, while other actors are scoped to the current conversation.surface_id. Use this when a document exists but isn't visible in the editor — for example after the user switches devices, refreshes the page, or when the editor panel was closed. Fetches the document from storage and sends it to the client.surface_id. Use to clean up unwanted documents.This is the default path when the user asks you to write something.
document_create with a title (inferred from the request). Call the tool immediately, not after conversational preamble.# for titles, ## for sections), bold, _italic_, code blocks, tables, lists, blockquotes as appropriate.document_update MULTIPLE times, not just once. Break content into logical chunks (paragraphs, sections, or every 200-300 words). Call document_update with mode: "append" for EACH chunk separately. When you are streaming into the document you just created, surface_id is optional — omit it and pass only content, and the update targets that document. The user experiences real-time content appearing as you write.If a document_update call fails with an Invalid input error, do NOT call document_create again — that produces a duplicate for the user. The most common cause is a missing content field: resend the call with the chunk's Markdown in content. You can omit surface_id to target the document you are currently writing; pass it explicitly only when editing a different existing document.
When the user requests changes to a document:
surface_id from the <active_documents> context block.document_update with the existing surface_id — do NOT call document_create again.document_update with mode: "append" — adding new content to the end.document_update with mode: "replace" — ONLY for full rewrites where the majority of the document is changing.document_find + document_replace_text — for everything else. Fixing typos, renaming terms, swapping sections, reordering content, adjusting formatting, or any edit that touches only part of the document. This is the default choice for edits. It avoids rewriting the entire document and eliminates the risk of accidentally dropping content.document_update with mode: "replace" for targeted edits. Rewriting the entire document to change a few words or rearrange sections is wasteful and error-prone.When the user asks to see, open, or pull up a document:
<active_documents> block in your context — it lists all documents in this conversation with their surface_id and title.<active_documents>, call document_list with a query matching the document title. For guardian/local users, this searches across previous conversations and sessions.surface_id, call document_open to open the editor panel. This surfaces the editor on the client and returns document metadata (surface_id, title, word_count) — not the full content. If you need the actual document text, follow up with document_read.Never search the filesystem, conversation history, or archives to find a document. Always use document_list with a query.
If the user says they can't see a document you know exists (e.g. after switching from macOS to web, or after a page refresh), call document_open with the surface_id to re-surface the editor panel on their current client.
Use document_find and document_replace_text for surgical edits that target specific text patterns without rewriting the entire document.
Search a document for literal text or regex patterns. Parameters:
surface_id (required) — the document to searchquery (required) — the search string or regex patternregex (optional, default false) — treat query as a regular expressioncase_sensitive (optional, default false) — match case exactlyReturns a list of matches with line numbers, line content, match positions, and matched text. Use this to preview what will be affected before making replacements.
Targeted find-and-replace within a document. Parameters:
surface_id (required) — the document to modifyfind (required) — the search string or regex patternreplace (required) — the replacement string (supports $1, $2 backreferences when regex is true)regex (optional, default false) — treat find as a regular expressioncase_sensitive (optional, default false) — match case exactlymax_replacements (optional) — limit the number of replacements madeReturns the number of replacements made and whether the content changed.
document_find to preview matches and confirm the pattern is correct.document_replace_text to apply the changes.Examples:
"recieve", replace with "receive"."widget" (case-insensitive), replace with "component".(\d{2})/(\d{2})/(\d{4}) with regex: true, replace with $3-$1-$2 to convert MM/DD/YYYY to YYYY-MM-DD.document_read to get the content, identify the sections to swap, then call document_replace_text to replace the first section with the second and vice versa. For complex rearrangements, use multiple document_replace_text calls with max_replacements: 1.Users can leave inline comments on documents. Open comments are surfaced in a <document_comments> context block so you can see pending feedback.
surface_id. Use this to check for feedback before or after editing, especially when the user asks you to address comments.comment_id. Use this after you have addressed the feedback in the document content. Always edit the document first, then resolve the comment.comment_id. Use this to ask clarifying questions or explain why you made (or declined) a change before resolving.<document_comments> block or call comment_list to see open comments.comment_resolve on comments you have addressed.comment_reply to ask for clarification instead of guessing.app_create for blog posts, articles, or written content. Use document_create — apps are for interactive content with state/data.document_create, not in chat and not into a .md file in the workspace. Acknowledge what you're doing and stream to the editor.document_update with mode: "append" so users see progress in real time.mode parameter on document_update defaults to append.Other measured skills in the registry, with their headline benchmark lift.