Documentation
Contents
- Quick Start
- Web Studio (AI Code Console)
- Cloud Templates
- MCP Endpoint
- Agents & API → render API · service-account keys
- Cloud render skill → drop-in SKILL.md so any agent renders correctly first try
- Tools & Toolkit Profiles
- Relation Types
- Platform Integrations
- Examples
- Drawn Films (the draw contract)
- Making Films: templates, sound, reuse & your characters
- Audio & Voice Synthesis
- Provenance
- Local Installation (Free)
Quick Start
PinePaper Cloud Studio implements the MCP 2025-03 Authorization spec — OAuth 2.1 + PKCE + Dynamic Client Registration on /mcp/v1: interactive clients authorize themselves via the browser-based OAuth flow. Backend agents can instead use a service-account key (Authorization: Bearer pp_sa_…) carrying the mcp:invoke scope on /mcp (Streamable HTTP) and /rpc (JSON-RPC); mint one at /account#service-accounts. Service-account calls are billed to the organisation owner's credit balance.
1. Sign in + add credits
Sign in with Google at /auth/google, then visit /add-credits if you want to purchase credits.
2. Configure Claude Desktop
Claude Desktop launches MCP servers as local stdio processes; remote HTTP MCP servers are reached through the mcp-remote bridge, which proxies stdio ↔ HTTP and handles the OAuth handshake. Add this to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"pinepaper-cloud": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://cloud.pinepaper.studio/mcp/v1"]
}
}
}
No headers block, no static keys. On first connection mcp-remote will:
- Hit
POST /mcp/v1→ receive401with aWWW-Authenticateheader pointing at our discovery URL - Fetch
/.well-known/oauth-authorization-server+/.well-known/oauth-protected-resource - Register itself via
POST /oauth/register(RFC 7591 Dynamic Client Registration) - Open your browser to
/oauth/authorize— you'll see a consent page showing the client name and requested scopes (mcp:read,mcp:write) - Click Authorize —
mcp-remotereceives the auth code, exchanges it for an access + refresh token viaPOST /oauth/token, and starts proxying real MCP calls to Claude Desktop
The browser handoff happens once per client per device — tokens are cached locally under ~/.mcp-auth/. Refresh tokens last 30 days and rotate on every use (RFC 6819 §5.2.2.3) so a stolen refresh token's window is bounded.
3. Start Creating
Try in Claude Desktop:
- "Create a red circle that pulses"
- "Make a flowchart for user login"
- "Create a solar system with Earth orbiting the Sun"
You can see + revoke each authorized client at /account → MCP Clients.
Web Studio & AI Code Console
You don't need Claude Desktop to use PinePaper. Sign in at pinepaper.studio/editor with your PinePaper Cloud account and the in-browser AI Code Console becomes available — same tools, no install.
What you get when signed in
- AI Code Console — chat panel inside the editor that generates and runs PinePaper code on the canvas in real time.
- PinePaper LLM on Credits (coming soon) — our own model (
pinepaper-llm-v0) will be served from credits, billed per token at $0.20 / 1M input and $0.60 / 1M output (a typical design turn ~$0.0006). Until it launches, all models — including third-party (Claude, Gemini, GPT, Grok) — require BYOK; PinePaper Cloud does not resell third-party LLMs. - Modes — Design and Modify route through the KG pipeline for style learning; Chat and Help talk directly to the model.
Bring Your Own Key (BYOK)
To use a third-party model in the AI Code Console, add your own API key at /account#llm-providers. Once a key is on file, that provider's models appear in the model picker and you can switch per message:
- Anthropic — Claude Opus 5.5, Claude Sonnet 5.5, Claude Haiku 5.5, Claude Fable 5.1, Claude Opus 5, Claude Sonnet 5, Claude Haiku 4.5, Claude Fable 5; legacy: Claude Opus 4.8, Claude Sonnet 4.6. anthropic.com
- Google AI — Gemini 3.7 Flash, Gemini 3.8 Flash, Gemini 3.6 Flash, Gemini 3.5 Flash, Gemini 3.5 Flash Lite, Gemini 3.1 Flash Lite, Gemini 3.1 Pro (preview); legacy: Gemini 2.5 Pro, Gemini 2.5 Flash, Gemini 2.5 Flash Lite. ai.google.dev
- OpenAI — GPT-5.5, GPT-5.4, GPT-5.4 Mini, GPT-5.4 Nano, GPT-5.3 Codex (coding). openai.com
- xAI — Grok 4.3, Grok 4.20 (reasoning), Grok 4.20 (non-reasoning), Grok 4.20 (multi-agent), Grok Build 0.1. x.ai
- Cerebras — Llama 3.3 70B, Qwen 3 235B, GPT-OSS 120B. cerebras.ai
- Groq — Llama 3.3 70B, GPT-OSS 120B. groq.com
- OpenRouter — DeepSeek V4 Pro, DeepSeek V4 Flash, Kimi K2.6, Nemotron 3 Super 120B, Qwen 3.7 Max, Mistral Medium 3.5, Free auto-router, Nemotron 3 Ultra 550B — free, GLM 5.2 — free, Gemma 4 31B — free, Nemotron 3 Super 120B — free. One key, and the full live catalogue is searchable in the model picker. openrouter.ai
A flat $0.002/request platform fee is deducted from your credits to cover infrastructure (KG pipeline, sessions, caching); your provider bills you separately for tokens.
Set a default model
Pick a provider + model on /account#llm-providers under Default Model. New chats start with that selection; per-conversation choices still win when you reopen an existing thread. The preference is stored at GET/PUT /api/me/preferences.
How your key is protected
- Encrypted at rest with AES-256-GCM, scoped to your account via a per-user PBKDF2 salt.
- Never exposed in request or response bodies.
- Every read is recorded in a private audit log you can ask us to review.
- Remove the key any time at /account#llm-providers — takes effect immediately.
Model attribution
Every provider above is independent. PinePaper Cloud does not train, host, or fine-tune any of these models — when you BYOK, your request goes directly to the provider you selected (or to OpenRouter's gateway for OpenRouter-prefixed model IDs). For OpenRouter specifically, we send HTTP-Referer: https://cloud.pinepaper.studio + X-Title: PinePaper Cloud on every call so your usage is correctly attributed in your OpenRouter activity feed. Trademarks remain with their respective owners.
Cloud Templates
The template is the unit of saved work — items, relations, animations, canvas size — that you reload, remix, and iterate on with the AI Code Console. A scene is what you compose by chaining templates together. Local templates live in your browser (free); when signed in to PinePaper Cloud you can opt in to cloud sync so the same templates follow you across devices.
Saving from the studio
- Build a template in the editor.
- Open the Templates panel (left sidebar) and click Save. Choose Local (free, browser-only) or Cloud (synced, opt-in).
- Each cloud template gets its own conversation thread (one-to-one) so the AI Code Console remembers context as you iterate on it across sessions.
- Chain saved templates into a scene to build something larger without losing the per-template KG context.
Pricing & privacy
- Cloud templates are pay-as-you-go from your credits balance — storage is small per template.
- Templates are private to your account. The MCP Cloud knowledge graph scopes data per
templateId(preferred) orconversationId(fallback), and the PinePaper LLM service learns your style profile privately at the user level. - Toggle cloud sync off any time at /account — local templates remain in your browser.
MCP Endpoint
POST https://cloud.pinepaper.studio/mcp/v1Auth: OAuth 2.1 + PKCE — JWT access token in
Authorization: Bearer <token>
The MCP endpoint uses JSON-RPC 2.0. Auth follows the MCP 2025-03 Authorization spec (OAuth 2.1 + PKCE + Dynamic Client Registration). MCP clients that support discovery (Claude Desktop 0.10+, Cursor MCP, etc.) handle the flow automatically — see Quick Start above.
For tools that don't auto-discover OAuth, complete the flow manually and use the resulting access token:
POST /mcp/v1
Authorization: Bearer <access_token_from_oauth_flow>
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/list"
}
OAuth Flow Reference
The endpoints below implement OAuth 2.1 (RFC 6749 / draft-ietf-oauth-v2-1), PKCE S256 (RFC 7636), Dynamic Client Registration (RFC 7591), and Token Revocation (RFC 7009).
| Endpoint | Method | Purpose |
|---|---|---|
/.well-known/oauth-authorization-server | GET | RFC 8414 metadata: endpoints, scopes, grant types |
/.well-known/oauth-protected-resource | GET | RFC 9728 metadata: resource URL + authorization_servers |
/.well-known/jwks.json | GET | RFC 7517 JWKS — ES256 public keys for offline token verification |
/oauth/register | POST | RFC 7591 Dynamic Client Registration |
/oauth/authorize | GET | Authorization endpoint — PKCE S256 mandatory |
/oauth/token | POST | Token endpoint — authorization_code + refresh_token grants |
/oauth/revoke | POST | RFC 7009 token revocation |
Manual flow (for non-MCP clients)
# 1. Register your client
curl -X POST https://cloud.pinepaper.studio/oauth/register \
-H "Content-Type: application/json" \
-d '{
"client_name": "My App",
"redirect_uris": ["http://localhost:54321/cb"],
"token_endpoint_auth_method": "none"
}'
# → returns { "client_id": "mcpc_..." } (no client_secret for PKCE-only clients)
# 2. Generate a PKCE verifier + challenge
verifier=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-43)
challenge=$(printf "%s" "$verifier" | openssl dgst -sha256 -binary | \
openssl base64 | tr -d "=+/" | tr "+/" "-_")
# 3. Open this URL in a browser to sign in + approve
echo "https://cloud.pinepaper.studio/oauth/authorize?client_id=mcpc_...&redirect_uri=http://localhost:54321/cb&response_type=code&code_challenge=$challenge&code_challenge_method=S256&scope=mcp:read+mcp:write&state=xyz"
# 4. Browser redirects to your callback with ?code=mcpac_...&state=xyz
# Exchange that code for tokens:
curl -X POST https://cloud.pinepaper.studio/oauth/token \
-d "grant_type=authorization_code" \
-d "client_id=mcpc_..." \
-d "code=mcpac_..." \
-d "redirect_uri=http://localhost:54321/cb" \
-d "code_verifier=$verifier"
# → { "access_token": "eyJhbGc...", "refresh_token": "mcprt_...", "expires_in": 3600 }
# 5. Use the access token for /mcp/v1 calls
curl -X POST https://cloud.pinepaper.studio/mcp/v1 \
-H "Authorization: Bearer eyJhbGc..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":"1","method":"tools/list"}'
# 6. Refresh before the access token expires (1h)
curl -X POST https://cloud.pinepaper.studio/oauth/token \
-d "grant_type=refresh_token" \
-d "client_id=mcpc_..." \
-d "refresh_token=mcprt_..."
# → new access_token + new refresh_token (old refresh is revoked)
Note: refresh tokens rotate on every use. If a stolen refresh token is replayed after the legitimate client already refreshed, the entire chain is revoked and the user is forced to re-authorize.
Pricing
Pay-as-you-go with no subscriptions. Credits never expire.
| Operation | Cost |
|---|---|
| MCP Request (create, animate, query) | $0.001 |
| Cloud render | credits = ceil(seconds × fps/30 × resolution × format) · 1 credit = $0.015 |
| 10 s MP4 · 1080p · 30fps | $0.15 |
| 10 s MP4 · 720p · 30fps | $0.075 |
| 10 s GIF · 1080p · 30fps | $0.225 |
| 10 s animated SVG · 1080p | $0.045 |
| PNG, PDF or widget (one frame or build, any resolution) | $0.015 |
Resolution factors: 720p ×0.5, 1080p ×1, 4K ×4. Format factors: MP4/WebM ×1, GIF ×1.5, animated SVG ×0.25. Factors, limits and a calculator are at /render-pricing; POST /v1/renders:estimate returns the exact price for free. Voice and sound prices are on /pricing.
Tools & Toolkit Profiles
The full PinePaper tool registry has 180 tools across canvas, animation, diagrams, maps, fonts, exports, and more. You almost never need all of them at once — exposing the full surface to a model burns context and slows tool selection.
The MCP server organizes tools into toolkit profiles — task-shaped subsets activated per request. pinepaper_set_toolkit switches the active profile; pinepaper_tool_guide answers "which tool fits this job?" without listing the whole registry. The active profile is selected automatically based on the workflow ("draw a flowchart" → diagram profile; "highlight US states" → map profile).
Toolkit profiles
Generated from @pinepaper.studio/mcp-server@1.6.24 on 2026-11-03.
Full — 180 tools
Every tool in the registry. Use when context budget allows and the workflow spans many domains (canvas + diagrams + maps + fonts).
pinepaper_accessibility_checkpinepaper_add_filterpinepaper_add_portspinepaper_add_relationpinepaper_agent_analyzepinepaper_agent_batch_executepinepaper_agent_end_jobpinepaper_agent_exportpinepaper_agent_resetpinepaper_agent_start_jobpinepaper_analyze_designpinepaper_animatepinepaper_animate_letter_collagepinepaper_apply_animated_maskpinepaper_apply_custom_maskpinepaper_apply_effectpinepaper_apply_templatepinepaper_arrangepinepaper_artboardpinepaper_audio_beatspinepaper_auto_layoutpinepaper_backgroundpinepaper_batch_createpinepaper_batch_modifypinepaper_beat_cutspinepaper_brand_kitpinepaper_browser_connectpinepaper_browser_disconnectpinepaper_browser_screenshotpinepaper_browser_statuspinepaper_camerapinepaper_camera_animatepinepaper_camera_directorpinepaper_capture_framespinepaper_characterpinepaper_choreographpinepaper_chroma_keypinepaper_clear_canvaspinepaper_commentpinepaper_componentpinepaper_composepinepaper_connectpinepaper_connect_portspinepaper_construction_sequencepinepaper_create_chartpinepaper_create_diagonal_stripespinepaper_create_diagram_shapepinepaper_create_glossy_spherepinepaper_create_gridpinepaper_create_itempinepaper_create_letter_collagepinepaper_create_product_promopinepaper_create_scenepinepaper_crop_imagepinepaper_cutout_stylepinepaper_deformpinepaper_delete_itempinepaper_design_mediumpinepaper_design_systempinepaper_detect_objectspinepaper_diagnostic_reportpinepaper_diagram_modepinepaper_draw_knotspinepaper_draw_sashikopinepaper_draw_subdivisionpinepaper_draw_weavepinepaper_emitterpinepaper_equation_pathpinepaper_eventpinepaper_execute_custom_codepinepaper_execute_generatorpinepaper_export_scenepinepaper_export_storepinepaper_export_svgpinepaper_export_training_datapinepaper_export_widgetpinepaper_export_widget_htmlpinepaper_extract_objectpinepaper_flippinepaper_fontpinepaper_gamepinepaper_generatepinepaper_generate_estimatepinepaper_generate_statuspinepaper_geometrypinepaper_get_animatable_propertiespinepaper_get_available_easingspinepaper_get_canvas_ontologypinepaper_get_canvas_sizepinepaper_get_diagram_shapespinepaper_get_itemspinepaper_get_mask_animationspinepaper_get_mask_typespinepaper_get_performance_metricspinepaper_get_relation_statspinepaper_globepinepaper_grouppinepaper_hand_drawnpinepaper_historypinepaper_image_filterpinepaper_import_assetpinepaper_import_imagepinepaper_import_layered_characterpinepaper_import_mermaidpinepaper_import_motion_capturepinepaper_import_scenepinepaper_import_svgpinepaper_inspect_productpinepaper_instantiate_ontologypinepaper_interactionpinepaper_interchangepinepaper_keyframe_animatepinepaper_lassopinepaper_lint_scenepinepaper_list_generatorspinepaper_lookpinepaper_magicpinepaper_manage_scenespinepaper_mappinepaper_map_animationpinepaper_map_datapinepaper_map_regionspinepaper_measurementpinepaper_mediapinepaper_modify_itempinepaper_morph_sequencepinepaper_motionpinepaper_original_characterpinepaper_p5_drawpinepaper_pathpinepaper_patternpinepaper_pen_figurepinepaper_physicspinepaper_place_on_surfacepinepaper_play_timelinepinepaper_precomppinepaper_provenancepinepaper_querypinepaper_query_capabilitiespinepaper_query_mutationspinepaper_query_ontologypinepaper_query_relationspinepaper_refresh_pagepinepaper_register_custom_relationpinepaper_register_itempinepaper_relightpinepaper_remove_connectorpinepaper_remove_maskpinepaper_remove_relationpinepaper_render_batchpinepaper_render_hookpinepaper_riggingpinepaper_scene_diffpinepaper_scene_graphpinepaper_scene_playbackpinepaper_search_assetspinepaper_selectionpinepaper_sequencepinepaper_set_background_colorpinepaper_set_canvas_sizepinepaper_set_toolkitpinepaper_shader_graphpinepaper_shatter_imagepinepaper_soundpinepaper_sprite_sheetpinepaper_staggerpinepaper_stickpinepaper_storypinepaper_styled_scenepinepaper_template_paramspinepaper_text_effectpinepaper_text_stylepinepaper_tool_guidepinepaper_transformpinepaper_ui_kitpinepaper_update_connectorpinepaper_validatepinepaper_validate_designpinepaper_validate_scenepinepaper_world3dAgent (default) — 175 tools
Default profile for general-purpose AI agents. Covers canvas, items, animation, relations, effects, exports — the common creative workflow.
pinepaper_accessibility_checkpinepaper_add_filterpinepaper_add_portspinepaper_add_relationpinepaper_agent_analyzepinepaper_agent_batch_executepinepaper_agent_end_jobpinepaper_agent_exportpinepaper_agent_resetpinepaper_agent_start_jobpinepaper_analyze_designpinepaper_animatepinepaper_animate_letter_collagepinepaper_apply_animated_maskpinepaper_apply_custom_maskpinepaper_apply_effectpinepaper_apply_templatepinepaper_arrangepinepaper_artboardpinepaper_audio_beatspinepaper_auto_layoutpinepaper_backgroundpinepaper_batch_createpinepaper_batch_modifypinepaper_beat_cutspinepaper_brand_kitpinepaper_browser_connectpinepaper_browser_disconnectpinepaper_browser_screenshotpinepaper_browser_statuspinepaper_camerapinepaper_camera_animatepinepaper_camera_directorpinepaper_capture_framespinepaper_characterpinepaper_choreographpinepaper_chroma_keypinepaper_clear_canvaspinepaper_commentpinepaper_componentpinepaper_composepinepaper_connectpinepaper_connect_portspinepaper_construction_sequencepinepaper_create_chartpinepaper_create_diagonal_stripespinepaper_create_diagram_shapepinepaper_create_glossy_spherepinepaper_create_gridpinepaper_create_itempinepaper_create_letter_collagepinepaper_create_scenepinepaper_crop_imagepinepaper_cutout_stylepinepaper_deformpinepaper_delete_itempinepaper_design_mediumpinepaper_design_systempinepaper_detect_objectspinepaper_diagram_modepinepaper_draw_knotspinepaper_draw_sashikopinepaper_draw_subdivisionpinepaper_draw_weavepinepaper_emitterpinepaper_equation_pathpinepaper_eventpinepaper_execute_custom_codepinepaper_execute_generatorpinepaper_export_scenepinepaper_export_storepinepaper_export_svgpinepaper_export_training_datapinepaper_export_widgetpinepaper_export_widget_htmlpinepaper_extract_objectpinepaper_flippinepaper_fontpinepaper_gamepinepaper_generatepinepaper_generate_estimatepinepaper_generate_statuspinepaper_geometrypinepaper_get_animatable_propertiespinepaper_get_available_easingspinepaper_get_canvas_ontologypinepaper_get_canvas_sizepinepaper_get_diagram_shapespinepaper_get_itemspinepaper_get_mask_animationspinepaper_get_mask_typespinepaper_get_relation_statspinepaper_globepinepaper_grouppinepaper_hand_drawnpinepaper_historypinepaper_image_filterpinepaper_import_assetpinepaper_import_imagepinepaper_import_layered_characterpinepaper_import_mermaidpinepaper_import_motion_capturepinepaper_import_scenepinepaper_import_svgpinepaper_instantiate_ontologypinepaper_interactionpinepaper_interchangepinepaper_keyframe_animatepinepaper_lassopinepaper_lint_scenepinepaper_list_generatorspinepaper_lookpinepaper_magicpinepaper_manage_scenespinepaper_mappinepaper_map_animationpinepaper_map_datapinepaper_map_regionspinepaper_measurementpinepaper_mediapinepaper_modify_itempinepaper_morph_sequencepinepaper_motionpinepaper_original_characterpinepaper_p5_drawpinepaper_pathpinepaper_patternpinepaper_pen_figurepinepaper_physicspinepaper_place_on_surfacepinepaper_play_timelinepinepaper_precomppinepaper_provenancepinepaper_querypinepaper_query_capabilitiespinepaper_query_mutationspinepaper_query_ontologypinepaper_query_relationspinepaper_refresh_pagepinepaper_register_custom_relationpinepaper_relightpinepaper_remove_connectorpinepaper_remove_maskpinepaper_remove_relationpinepaper_render_batchpinepaper_render_hookpinepaper_riggingpinepaper_scene_diffpinepaper_scene_graphpinepaper_scene_playbackpinepaper_search_assetspinepaper_selectionpinepaper_sequencepinepaper_set_background_colorpinepaper_set_canvas_sizepinepaper_set_toolkitpinepaper_shader_graphpinepaper_shatter_imagepinepaper_soundpinepaper_sprite_sheetpinepaper_staggerpinepaper_stickpinepaper_storypinepaper_styled_scenepinepaper_template_paramspinepaper_text_effectpinepaper_text_stylepinepaper_tool_guidepinepaper_transformpinepaper_ui_kitpinepaper_update_connectorpinepaper_validatepinepaper_validate_designpinepaper_validate_scenepinepaper_world3dDiagram — 51 tools
Flowcharts, UML, network topology — diagram shapes, connectors, layout algorithms.
pinepaper_add_portspinepaper_agent_analyzepinepaper_agent_batch_executepinepaper_agent_end_jobpinepaper_agent_exportpinepaper_agent_resetpinepaper_agent_start_jobpinepaper_arrangepinepaper_auto_layoutpinepaper_backgroundpinepaper_browser_connectpinepaper_browser_disconnectpinepaper_browser_screenshotpinepaper_browser_statuspinepaper_capture_framespinepaper_clear_canvaspinepaper_connectpinepaper_connect_portspinepaper_create_diagonal_stripespinepaper_create_diagram_shapepinepaper_create_glossy_spherepinepaper_create_gridpinepaper_create_itempinepaper_delete_itempinepaper_diagram_modepinepaper_export_scenepinepaper_export_storepinepaper_export_svgpinepaper_export_training_datapinepaper_export_widgetpinepaper_export_widget_htmlpinepaper_geometrypinepaper_get_canvas_sizepinepaper_get_diagram_shapespinepaper_get_itemspinepaper_get_relation_statspinepaper_grouppinepaper_import_mermaidpinepaper_import_scenepinepaper_interchangepinepaper_modify_itempinepaper_pathpinepaper_querypinepaper_query_capabilitiespinepaper_refresh_pagepinepaper_remove_connectorpinepaper_set_background_colorpinepaper_set_canvas_sizepinepaper_set_toolkitpinepaper_tool_guidepinepaper_update_connectorMap — 36 tools
Geographic visualization — load maps, highlight regions, apply data colors, project, export GeoJSON.
pinepaper_agent_analyzepinepaper_agent_batch_executepinepaper_agent_end_jobpinepaper_agent_exportpinepaper_agent_resetpinepaper_agent_start_jobpinepaper_backgroundpinepaper_browser_connectpinepaper_browser_disconnectpinepaper_browser_screenshotpinepaper_browser_statuspinepaper_capture_framespinepaper_clear_canvaspinepaper_export_scenepinepaper_export_storepinepaper_export_svgpinepaper_export_training_datapinepaper_export_widgetpinepaper_export_widget_htmlpinepaper_get_canvas_sizepinepaper_get_itemspinepaper_get_relation_statspinepaper_globepinepaper_import_scenepinepaper_interchangepinepaper_mappinepaper_map_animationpinepaper_map_datapinepaper_map_regionspinepaper_querypinepaper_query_capabilitiespinepaper_refresh_pagepinepaper_set_background_colorpinepaper_set_canvas_sizepinepaper_set_toolkitpinepaper_tool_guideFont Studio — 41 tools
Typography workflows — font import, glyph editing, OTF export.
pinepaper_agent_analyzepinepaper_agent_batch_executepinepaper_agent_end_jobpinepaper_agent_exportpinepaper_agent_resetpinepaper_agent_start_jobpinepaper_animate_letter_collagepinepaper_arrangepinepaper_backgroundpinepaper_browser_connectpinepaper_browser_disconnectpinepaper_browser_screenshotpinepaper_browser_statuspinepaper_capture_framespinepaper_clear_canvaspinepaper_create_diagonal_stripespinepaper_create_glossy_spherepinepaper_create_gridpinepaper_create_itempinepaper_create_letter_collagepinepaper_delete_itempinepaper_export_scenepinepaper_export_storepinepaper_export_svgpinepaper_export_training_datapinepaper_export_widgetpinepaper_export_widget_htmlpinepaper_fontpinepaper_geometrypinepaper_get_canvas_sizepinepaper_grouppinepaper_import_scenepinepaper_interchangepinepaper_modify_itempinepaper_pathpinepaper_refresh_pagepinepaper_set_background_colorpinepaper_set_canvas_sizepinepaper_set_toolkitpinepaper_text_stylepinepaper_tool_guideMinimal — 20 tools
Smallest viable surface for low-context models — basic create/modify/animate only. Pair with `pinepaper_tool_guide` for on-demand discovery.
pinepaper_agent_analyzepinepaper_agent_batch_executepinepaper_agent_end_jobpinepaper_agent_exportpinepaper_agent_resetpinepaper_agent_start_jobpinepaper_backgroundpinepaper_browser_connectpinepaper_browser_disconnectpinepaper_browser_screenshotpinepaper_browser_statuspinepaper_clear_canvaspinepaper_export_storepinepaper_get_canvas_sizepinepaper_interchangepinepaper_refresh_pagepinepaper_set_background_colorpinepaper_set_canvas_sizepinepaper_set_toolkitpinepaper_tool_guideAll tools (alphabetical)
Show full registry — 180 tools
pinepaper_accessibility_checkCheck the live scene for two accessibility failures that stop ads and broadcast spots: low text contrast and flashing.
pinepaper_add_filterAdd a visual filter effect to the canvas.
pinepaper_add_portsAdd connection ports to an existing item.
pinepaper_add_relationCreate a behavior relationship between two items.
pinepaper_agent_analyzeAnalyze canvas content to get export recommendations and content insights.
pinepaper_agent_batch_executeExecute the primitive operations of a scene in a single call — canvas setup, backgrounds, items, animations, masks, effects, and playback.
pinepaper_agent_end_jobEnd the current agent job, get summary + screenshot for user validation.
pinepaper_agent_exportSmart export with automatic format detection and platform optimization.
pinepaper_agent_resetFast canvas reset without browser refresh.
pinepaper_agent_start_jobStart a new agent job for creating animations, videos, graphics, or any visual content.
pinepaper_analyze_designAnalyze a template or scene definition using the PinePaper Design Knowledge Graph.
pinepaper_animateApply a simple LOOP animation to an item.
pinepaper_animate_letter_collageApply animation to all letters in a collage with staggered timing.
pinepaper_apply_animated_maskApply an animated mask reveal to an item.
pinepaper_apply_custom_maskDirect helper for applying custom keyframe-based masks.
pinepaper_apply_effectApply a visual effect to an item.
pinepaper_apply_templateLoad a pre-built template design onto the canvas, or list available templates.
pinepaper_arrangeChange an item's stacking order (z-order) — which items draw on top of which.
pinepaper_artboardResize the artboard and control how items reflow when it changes.
pinepaper_audio_beatsDetect beats in audio and bake an item's animation onto them.
pinepaper_auto_layoutAutomatically arrange diagram items using a layout algorithm.
pinepaper_backgroundSet, clear, or query the canvas background.
pinepaper_batch_createCreate multiple items at once with a single history save.
pinepaper_batch_modifyModify multiple items at once with a single history save.
pinepaper_beat_cutsCut on the music: analyse a track's beats (or take beat times you already have), fit a beat grid, and return cut points on every beat, every bar, or every N beats — optionally splitting a video or audio clip at each one.
pinepaper_brand_kitApply a brand kit — colours, fonts and roles — across the scene.
pinepaper_browser_connectConnect to PinePaper Studio in a browser.
pinepaper_browser_disconnectDisconnect from the browser and close PinePaper Studio.
pinepaper_browser_screenshotTake a screenshot of the current PinePaper canvas.
pinepaper_browser_statusCheck the current browser connection status.
pinepaper_cameraCamera control: zoom, pan, move, reset, stop, get state.
pinepaper_camera_animateAnimate camera with keyframe-based zoom, pan, and 3D tilt sequence for cinematic effects.
pinepaper_camera_directorDirect a cinematic camera walkthrough of the scene from a high-level SHOT LIST.
pinepaper_capture_framesDeterministically render the scene at a list of times and snapshot each frame (FxTool's app.captureFramesAt, S3).
pinepaper_characterPlace a CHARACTER from the design graph and DIRECT it — no geometry, no bones, no poses.
pinepaper_choreographMake any item ACT: a list of beats compiled to one keyframe track with anticipation, squash and stretch, contact and settle — the timing a hand animator would key, from one call.
pinepaper_chroma_keyRemove a background color from an imported image (green-screen style) — one shot, no interactive session.
pinepaper_clear_canvasClear all items from the canvas, removing everything including any welcome template items.
pinepaper_commentNotes pinned to a place and a moment — review feedback on a scene.
pinepaper_componentReusable components with per-instance overrides — a master and its instances.
pinepaper_composeArrange items into a NAMED COMPOSITION and film it — "here are four photos, lay them out nicely and give me a clip".
pinepaper_connectConnect two items with a smart connector.
pinepaper_connect_portsConnect two specific ports on items.
pinepaper_construction_sequenceReveal a geometric figure step by step (FxTool's app.constructionSequence, Layer 3).
pinepaper_create_chartCreate and manage data visualizations on the canvas.
pinepaper_create_diagonal_stripesCreate a diagonal stripe pattern.
pinepaper_create_diagram_shapeCreate a diagram shape on the canvas.
pinepaper_create_glossy_sphereCreate a 3D-looking glossy sphere with realistic lighting effects.
pinepaper_create_gridCreate a grid of lines on the canvas.
pinepaper_create_itemCreate an item on the PinePaper canvas.
pinepaper_create_letter_collageCreate stylized text with per-letter customization.
pinepaper_create_product_promoCompile a user-directed promotional video with procedural browser mockups, UI typing, Ken Burns motion, and audio sync — or, with capture, from real browser screenshots of the product zooming toward each feature.
pinepaper_create_sceneCreate a complete scene with multiple items, relations, and animations in a single operation.
pinepaper_crop_imageCrop an imported image to a rectangle — one shot, no interactive session.
pinepaper_cutout_styleApply decorative cutout styles to image items (sticker effects, torn edges, etc.).
pinepaper_deformApply vertex deformation presets to items for organic motion effects.
pinepaper_delete_itemDelete a single item from the canvas by its registry ID.
pinepaper_design_mediumThe THIRD design axis: the MEDIUM — what physically makes the marks.
pinepaper_design_systemThe design vocabulary, as data you can read — and eighteen styles that can build a scene.
pinepaper_detect_objectsRun on-device object detection (fully local — no upload) over an imported image and either draw labeled boxes or promote each detection to a design node.
pinepaper_diagnostic_report[Utility] Generate a diagnostic report for bug reporting.
pinepaper_diagram_modeControl the diagram mode for interactive editing.
pinepaper_draw_knotsDraw three-dimensional embroidered knot relief (French knots, bullion coil rolls, and tension anchor tacks) with drop shadows, tight thread wraps, and specular highlight glints.
pinepaper_draw_sashikoDraw Japanese Sashiko geometric folk embroidery lattices (Seigaiha blue sea waves, Asanoha hemp-leaf stars, Hishi diamond grids) with dashed running stitches on indigo ground cloth.
pinepaper_draw_subdivisionGenerate asymmetric recursive quadtree/rectangular partition compositions (De Stijl/Mondrian, Swiss International Style, Bauhaus, Minimal) with bounded depth, asymmetric rest cell preservation, and crisp orthogonal dividers.
pinepaper_draw_weaveDraw authentic structural woven textiles (Plain/Tabby, Twill, Herringbone, Basketweave/Panama) as vector fiber lattices with alternating over/under warp and weft phase offsets.
pinepaper_emitterParticles as an ITEM whose every frame is a pure function of its spec and the scene time — so the preview, capture_frames, every export, a saved project, a template and the cloud render all draw the same particles, scrubbing backwards included.
pinepaper_equation_pathCreate a path ITEM from a math equation (FxTool's app.createEquationPath, Expression IR — S10 B5).
pinepaper_eventManage the pp:event channel — the backbone of EVENT-DRIVEN SCENE CHAINS (FxTool S11).
pinepaper_execute_custom_codeExecute arbitrary JavaScript code in the PinePaper context.
pinepaper_execute_generatorExecute a background generator to create procedural patterns.
pinepaper_export_sceneExport the scene: a SUMMARY for inspection by default, or with full: true a RESTORABLE project document saved to a file.
pinepaper_export_storeRecover an export the studio is still holding.
pinepaper_export_svgExport the scene as animated SVG.
pinepaper_export_training_dataExport relation data as training pairs for LLM fine-tuning.
pinepaper_export_widgetExport current scene as a PineWidget (pp:PinePaper ontology JSON v0.4.3).
pinepaper_export_widget_htmlExport current scene as a self-contained HTML page with tree-shaken PineWidget runtime.
pinepaper_extract_objectDetect objects in an imported image and crop the best match into a NEW item — e.g.
pinepaper_flipAnimate a layout change WITHOUT describing the motion.
pinepaper_fontFonts: which ones you can USE, and authoring new ones.
pinepaper_gameGAME-LOGIC primitives as pure computation: A* pathfinding and tilemap boards.
pinepaper_generateGenerate images with an AI model in the PinePaper cloud, and optionally place the first one on the canvas.
pinepaper_generate_estimateFree: price a pinepaper_generate call before making it, or list the models.
pinepaper_generate_statusCollect a pinepaper_generate job that outlived its timeoutSec: its status, and when done its assets and chargedUsd.
pinepaper_geometryRun an exact geometric construction (FxTool's app.geometry library) and optionally create a canvas item from the result.
pinepaper_get_animatable_propertiesWhich properties can be animated — on an ITEM, or on each mask type.
pinepaper_get_available_easings[Utility] List the easing names the studio accepts: one table serves keyframes, masks, relations and the camera.
pinepaper_get_canvas_ontologyCapture the REGISTERED canvas as compact pp: ontology triples + a structured item summary.
pinepaper_get_canvas_size[Utility] Get the current canvas dimensions.
pinepaper_get_diagram_shapes[Utility] Get a list of available diagram shapes with their properties.
pinepaper_get_items[Utility] Get all or filtered items from the canvas.
pinepaper_get_mask_animations[Utility] Get available mask animation presets.
pinepaper_get_mask_types[Utility] Get available mask shape types.
pinepaper_get_performance_metrics[Utility] Get execution performance metrics to identify bottlenecks and optimize workflows.
pinepaper_get_relation_stats[Utility] Get statistics about active relations in the scene.
pinepaper_globeTurn a loaded map into a spinning 3D globe and swing it on a cinematic world tour.
pinepaper_groupCombine several items into ONE entity that selects, drags, and animates as a single unit — or ungroup one back into loose items.
pinepaper_hand_drawnGive a path a hand-drawn look: a rough, bowed outline (sketchy), or a stroke that draws itself on (reveal).
pinepaper_historyUndo/redo and history state inspection.
pinepaper_image_filterApply image filters to raster items: a GPU set, plus painted watercolor / painterly looks for photos.
pinepaper_import_assetImport an SVG asset from search results or direct URL onto the canvas.
pinepaper_import_imageImport a raster image onto the canvas from an http(s) URL, a data: URL, or a LOCAL FILE PATH (the server reads the file).
pinepaper_import_layered_characterLand a DECOMPOSED character illustration as one Group of role-bound parts — eyes that blink, a mouth that talks, with ZERO further wiring.
pinepaper_import_mermaidImport a Mermaid diagram source string and render it onto the canvas as native diagram shapes + connectors.
pinepaper_import_motion_captureImport a BVH motion-capture clip (CMU, Mixamo) as an animated skeleton, or retarget one onto a rig that already exists.
pinepaper_import_sceneRestore a scene from a project document saved by pinepaper_export_scene { full: true }.
pinepaper_import_svgImport an SVG string or SVG from URL onto the canvas.
pinepaper_inspect_productInspect any product URL to extract brand colors, copy, and proposed promotional video shots.
pinepaper_instantiate_ontologyCompile a design ONTOLOGY (a pp:-namespaced JSON-LD graph of typed nodes + structural edges) into a real scene — the reverse of scene→graph extraction (FxTool S12-E3).
pinepaper_interactionAdd continuous physics behaviors and trigger interaction actions.
pinepaper_interchangeThe formats other tools read and write — Lottie, dotLottie, GLB, BVH, PNG sequence.
pinepaper_keyframe_animateApply keyframe-based animation with precise timing and property control.
pinepaper_lassoCut a region out of an image along a polygon — the subject cutout behind 2.5D parallax, stickers and collage.
pinepaper_lint_sceneAudit the LIVE scene's relational structure (FxTool S12-E2) — read-only, nothing is changed.
pinepaper_list_generators[Utility] Get a list of all available background generators with their parameters.
pinepaper_lookRestyle what is already drawn — one item, a group and everything in it, or the WHOLE SCENE — as a named look: palette remapped in place (colour keyframes too), strokes, type, image treatment, texture, background and a framing device.
pinepaper_magicOntology-aware auto-animation and style remixing.
pinepaper_manage_scenesManage multiple saved scenes (canvas snapshots).
pinepaper_mapLoad a map and import/export its config.
pinepaper_map_animationAnimate map regions with keyframes or wave effects.
pinepaper_map_dataCSV / GeoJSON import-export and source-info introspection.
pinepaper_map_regionsHighlight, color, label, and select map regions.
pinepaper_measurementRulers, grid overlay, snap-to-grid, and dimension readout.
pinepaper_mediaBring VIDEO and AUDIO onto the canvas from a URL, and control playback.
pinepaper_modify_itemModify an existing item's properties.
pinepaper_morph_sequenceONE element through many states, with no cuts: each state grows out of the last (a pill becomes an input field becomes a dot becomes a card).
pinepaper_motionThe generators' Animation knob, pointed at anything — the same motion engine every generator's own animation runs on, reachable for any group or list of items.
pinepaper_original_characterMake an ORIGINAL character from a base rig and a declarative variant — no drawing code, and nothing anyone else owns.
pinepaper_p5_drawExecute p5.js-style drawing code on the PinePaper canvas.
pinepaper_pathDestructive path operations — the ones that REPLACE or ADD items rather than restyling them.
pinepaper_patternMove many items with ONE stored declaration instead of a keyframe track on each: a wave running through a row of letters, a stagger spreading across a grid.
pinepaper_pen_figureDraw a mathematical figure with a pen: the tip travels the figure and the ink appears behind it, in the editor and in every export.
pinepaper_physicsRigid body physics simulation (Box2D/Planck.js).
pinepaper_place_on_surfacePut a UI ONTO A SCREEN inside a photo: a phone, a monitor, a billboard.
pinepaper_play_timelineControl keyframe animation playback.
pinepaper_precompNested compositions — group items into reusable animated precomps.
pinepaper_provenanceWhere an item came from and what depends on it.
pinepaper_queryQuery canvas items and spatial information.
pinepaper_query_capabilitiesDiscover and match capabilities across the engine — text styles, character-level text effects, generators, vertex deforms, and behavioral relations.
pinepaper_query_mutationsA property's values over time: the item's keyframe series ({t, frame, value, easing} per key), for one property or all, optionally within [from, to] seconds.
pinepaper_query_ontologyQuery the PinePaper design knowledge graph — explore types, properties, edges, hierarchy, and patterns.
pinepaper_query_relations[Utility] Query relationships for an item.
pinepaper_refresh_pageRefresh the PinePaper Studio page in the browser.
pinepaper_register_custom_relationPARAMS ARE DEFINITIONS, not values: { gap: { type: 'number', default: 60, min: 0 } } (type is number | string | boolean | array | object).
pinepaper_register_itemRegister a Paper.js item created externally.
pinepaper_relightLight the 3D world layer (pinepaper_world3d) with point and directional lights — a post pass, so the lit side of every surface reads brighter in the preview and the export.
pinepaper_remove_connectorRemove a connector from the canvas.
pinepaper_remove_maskRemove mask from an item, restoring original appearance.
pinepaper_remove_relationRemove a relationship between items.
pinepaper_render_batchRender one creative per row of data from the current scene: for each row, apply its changes (modify_item per item, and / or a template's params), then export with the shared export options.
pinepaper_render_hookCustom per-frame drawing that a saved scene CARRIES: SOURCE TEXT, compiled and run under the governor's loop guards with seeded Math, saved in the project document, the template and undo, and re-installed on load.
pinepaper_riggingRig and animate with SKELETONS — bones, IK chains, and pose keyframes (FxTool RiggingSystem).
pinepaper_scene_diffWhat changed between two states of the scene — added, removed and modified items.
pinepaper_scene_graphCreate an interactive multi-node story or quiz card graph.
pinepaper_scene_playbackControl sequential scene chain playback — play saved scenes as a slideshow presentation.
pinepaper_search_assetsSearch for free SVG assets from open repositories (Iconify, Font Awesome).
pinepaper_selectionManage item selection on canvas.
pinepaper_sequenceWork out WHEN clips start, said relative to each other instead of in absolute seconds.
pinepaper_set_background_colorSet the canvas background color.
pinepaper_set_canvas_sizeChange the canvas dimensions.
pinepaper_set_toolkitSwitch the active toolkit profile and/or verbosity level at runtime.
pinepaper_shader_graphBuild a pixel-processing graph from nodes (normal map, relighting, depth of field, bloom) and run it over an item or the whole scene.
pinepaper_shatter_imageSplit a raster into a GRID OF TILES — the primitive under every "photo breaks apart / assembles from pieces" effect.
pinepaper_soundSynthesis — and the drawing that is the same object.
pinepaper_sprite_sheetGenerate, play, and export sprite sheets from skeleton poses.
pinepaper_staggerShape a delay across many items.
pinepaper_stickThe vendored stick-figure kit — a rigged figure posed, walking, travelling, holding a prop, with a garment and hair, plus the set it stands on and among.
pinepaper_storyFORM — nav: 'scenes' is the VIDEO story: one scene per part on a scene chain that cuts in time (export as MP4); each part's length follows its role (hook 2.5 s, stat 3 s, section 3.5 s, quote 3 s, exit 3 s; 0.4 s transitions), and the reply carries the cut times.
pinepaper_styled_sceneOne composition, drawn in a built-in STYLE, as one canvas item that redraws itself every exported frame.
pinepaper_template_paramsTemplates that take typed inputs — the same scene rebuilt for your text and colours.
pinepaper_text_effectAnimate text CHARACTER BY CHARACTER — the terminaltexteffects vocabulary, reimplemented from source).
pinepaper_text_styleDisplay TEXT STYLES and variable-font axes — the stacked-layer titles a fill+stroke+shadow cannot make, and weight/width/slant as animatable properties.
pinepaper_tool_guideGet detailed guidance for PinePaper tools on demand.
pinepaper_transformTransform items: fit to the canvas, nudge position, flip, or change z-order.
pinepaper_ui_kitPlace product-UI mockups drawn properly, on brand: a phone LOCK SCREEN (Dynamic Island, status bar, clock, wallpaper) with notifications that stack in and a prompt box that types, or a standalone notification, prompt box, toggle, calendar card or ad card.
pinepaper_update_connectorUpdate the style or label of an existing connector.
pinepaper_validateSemantically validate the LIVE scene (or a proposed mutation before you apply it) and get back STRUCTURED diagnostics — not just pass/fail.
pinepaper_validate_designValidate and score a template definition against the PinePaper ontology.
pinepaper_validate_sceneAudit the LIVE canvas with FxTool's OntologyValidator and get structured, actionable diagnostics instead of console warnings.
pinepaper_world3dA real 3D WORLD under the canvas — depth-buffered terrain, sky, sun shadows, an addressable actor stage and a directed camera.
Use tools/list to fetch the live list with full descriptions and input schemas for whichever profile your client has active.
Relation Types
Behavior-driven animation relationships between items:
| Relation | Description |
|---|---|
orbits | Circular motion around target |
follows | Smooth follow toward target |
attached_to | Fixed offset from target |
maintains_distance | Stay at fixed distance |
points_at | Rotate to face target |
mirrors | Mirror target position |
parallax | Depth-based movement |
bounds_to | Constrain within area |
animates | Property animation over time |
grows_from | Scale growth from target |
staggered_with | Sequential timing offset |
indicates | Arrow/pointer to target |
circumscribes | Fit around target bounds |
wave_through | Wave motion through items |
morphs_to | Shape morphing transition |
camera_follows | Camera tracks item |
camera_animates | Camera keyframe sequence |
part_of | Semantic parent-child grouping |
expresses | Facial/body expressions |
Platform Integrations
PinePaper Cloud Studio is an HTTP MCP server with OAuth 2.1 + PKCE auth. Any MCP-aware client auto-discovers the auth flow; for other tools complete the OAuth flow once and use the resulting access token.
Claude Desktop (Native MCP)
Claude Desktop 0.10+ has native MCP discovery support. See Quick Start above — no headers, no manual key handling.
Cursor IDE (MCP Extension)
Cursor's MCP integration auto-discovers OAuth too. Add the server URL in Settings → MCP → Add server and Cursor will open the consent page in your browser on first use.
ChatGPT (Custom GPT Actions)
Custom GPTs don't currently support OAuth 2.1 + PKCE auth flows. Two options:
- OAuth-aware GPT Action — set Authentication: OAuth in the Custom GPT builder, paste the endpoints from
/.well-known/oauth-authorization-server - Static-token fallback — complete the OAuth flow once via cURL (see manual flow above), copy the access token, paste it as a Bearer header. Refresh manually before the 1h expiry.
Any HTTP Client (after completing OAuth flow)
# cURL — assumes you already ran the OAuth flow and have $ACCESS_TOKEN
curl -X POST https://cloud.pinepaper.studio/mcp/v1 \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":"1","method":"tools/list"}'
# Python — full client with refresh handling
import requests
def call_mcp(access_token, method, params=None):
res = requests.post(
"https://cloud.pinepaper.studio/mcp/v1",
headers={"Authorization": f"Bearer {access_token}"},
json={"jsonrpc": "2.0", "id": "1", "method": method, "params": params or {}}
)
if res.status_code == 401:
raise RuntimeError("Access token expired — call POST /oauth/token with refresh_token")
return res.json()
def refresh(client_id, refresh_token):
res = requests.post(
"https://cloud.pinepaper.studio/oauth/token",
data={
"grant_type": "refresh_token",
"client_id": client_id,
"refresh_token": refresh_token,
}
)
return res.json() # { access_token, refresh_token (new!), expires_in }
Supported Platforms
| Platform | Integration | Auth |
|---|---|---|
| Claude Desktop 0.10+ | Native MCP | Auto OAuth discovery |
| Cursor IDE | MCP extension | Auto OAuth discovery |
| ChatGPT | Custom GPT Actions | Manual OAuth or static token |
| Google Gemini | Function Calling | Manual OAuth or static token |
| Open WebUI | Function Calling | Manual OAuth or static token |
| LangChain | Custom Tools | Manual OAuth or static token |
Examples
Animated Text
"Create text 'HELLO' in red that pulses"
→ pinepaper_create_item + pinepaper_animate
Letter Collage
"Create a Wordle-style letter collage saying CANDY with neon colors"
→ pinepaper_create_letter_collage + pinepaper_animate_letter_collage
Flowchart Diagram
"Create a flowchart: Start → Process → Decision → End"
→ pinepaper_create_diagram_shape + pinepaper_connect + pinepaper_auto_layout
Solar System
"Create a sun at center, Earth orbiting it, Moon orbiting Earth"
→ pinepaper_create_item + pinepaper_add_relation (orbits)
World Choropleth Map
"Load a world map and color countries by population"
→ pinepaper_load_map + pinepaper_apply_data_colors
Animated Map
"Animate US states changing color in a wave pattern"
→ pinepaper_load_map + pinepaper_animate_map_wave
Camera Animation
"Zoom in on the title then pan across to the diagram"
→ pinepaper_camera_animate with keyframes
Particle Effects
"Add fire effect to the dragon and snow falling on the scene"
→ pinepaper_apply_effect (fire, snow)
Interactive Quiz
"Create a multiple choice quiz about world capitals"
→ pinepaper_create_quiz with questions and answers
Mask Reveals
"Reveal the title with an iris animation"
→ pinepaper_apply_animated_mask (iris preset)
Drawn Films (the draw contract)
There are two ways to make a piece. Tools assemble it from Studio items — text, shapes, charts, diagrams, rigs — and everything lands on the canvas, editable. A drawn film is for a picture that is painted: scenery, characters, weather, light. The model (or you) writes one plain Canvas 2D program, a pure function of time, and PinePaper renders it to MP4 or GIF. Nothing stands between the drawing and the pixels, which is why it looks better for illustration.
What makes a drawn film more than a video is its declaration: a list of every thing on screen, by name. That list is what can be selected, moved, recoloured, hidden and retimed — and what carries a film towards the Studio.
The program
const meta = { duration: 20, fps: 24, size: [1280, 720], seed: 7 };
// EVERYTHING ON SCREEN IS A NAMED ENTITY — the sky and the ground too. This list is what makes
// the film editable: each entity can be selected, moved, recoloured, hidden or retimed by id.
const entities = [
// `kit` is the design graph's motion techniques (listed below): call them, never rewrite them.
{ id: 'sky', kind: 'background', from: 0, to: 20,
params: { top: '#0b1026', bottom: '#f4a259' },
draw(ctx, t, p, rng) { kit.sky(ctx, 1280, 720, [p.top, p.bottom]); } },
{ id: 'ground', kind: 'background', from: 0, to: 20,
params: { fill: '#6aa85a' },
draw(ctx, t, p, rng) { GROUND.at = kit.hills(ctx, { w: 1280, h: 720, y: 560, scroll: t * 120, fill: p.fill, hatch: 'rgba(40,90,40,0.4)' }); } },
{ id: 'hero', kind: 'character', from: 0, to: 20,
params: { x: 300, size: 0.22, color: '#d9622b' },
// On screen from the first frame, then it acts. Anticipation, a move eased in and out, a squash on landing: the principles, by name. Its personality is in the motion; eyes: 0, because this brief asked for no character or face.
draw(ctx, t, p, rng) { const x = p.x + 500 * kit.ease.inOut(kit.seg(t, 2.4, 3.6)), s = kit.squash(t, 3.6);
kit.character(ctx, x, GROUND.at(x), { size: p.size, color: p.color, sx: s.sx, sy: s.sy, eyes: 0 }); },
bounds(t, p) { const d = p.size * 720; return [p.x - d / 2, 560 - d, d, d]; } },
];
const GROUND = { at: (x) => 560 }; // shared: the hero stands on whatever the ground entity drew
// draw() IS the loop. Write it exactly like this and draw nothing outside an entity.
// A CAMERA is an entity too: { id: 'camera', kind: 'camera', from, to, params, draw(ctx, t, p) { kit.camera(ctx, t, p.keys); } }
// — its draw only TRANSFORMS. The loop applies it inside each world entity's window; titles, captions and overlays stay put.
function draw(ctx, t, params, rng) {
const cam = entities.find((e) => e.kind === 'camera' && t >= e.from && t <= e.to);
for (const e of entities) {
if (t < e.from || t > e.to) continue;
if (e.kind === 'camera') continue;
ctx.save();
if (cam && !/^(overlay|title|caption|type)$/.test(e.kind)) cam.draw(ctx, t, cam.params, rng.for(cam.id));
e.draw(ctx, t, e.params, rng.for(e.id));
ctx.restore();
}
}
metais read without running your code, so every value is a plain number.draw(ctx, t, params, rng)draws the whole frame for timet(seconds). It must be pure: noMath.random, no clocks, no network, no DOM, nothing carried between calls. That is what lets one program be a preview, a loop and a 10-minute render that all agree.entitieslists what is on screen in paint order.draw()is the loop over it, and nothing is drawn outside an entity.- Each entity reads every tunable from its
params(p.x,p.color) — an edit changesparams, so a draw that ignores them cannot be edited. rng.for(e.id)gives each entity its own seeded randomness: hiding one thing never changes another.bounds(t, p)returns[x, y, w, h]at time t, which is what lets a person click the thing.- Length: any. One render job covers up to 600 seconds; a longer film renders as segments (
exportProfile.segment = { index, count }) on one timeline that join end to end. Program size: up to 16 MB. A frame that takes longer than 1.5 s to draw fails the render by name.
A score
Add compose(params) returning timed notes — { inst, t, midi, dur, vel } — on the same clock as draw, and the export mixes them into the MP4 with the same engine mixer every PinePaper score uses. Instruments: piano, guitar, harp, bass, violin, cello, flute, clarinet, trumpet, horn, marimba, pad, strings, pluck, bell, organ, sine (pitched; midi 60 is middle C); drums: kick, snare, tom, hat, clap; effects: beep, pop, noise, wind, whoosh, zap. Notes that start after the film ends are dropped; at most 4,000 are played. A film without compose exports with no audio track at all, not a silent one. In the chat and on /try, the player shows a Sound switch on any film with a score; it plays the same notes through the same mixer as the export, so what you hear while editing is what the file will contain.
Is the declaration true? The honesty check
A declaration is never taken on trust. The film is drawn twice — once by draw(), once entity by entity from the list — and the two are compared pixel by pixel across the film. If they match, everything on screen is a named, editable thing. If they do not, the difference is the undeclared content. A film is scored by its worst sampled frame, not its average: one undeclared shot is a shot nobody can edit. The chat runs this check itself the moment a film arrives and says the result in words — and when a film falls short, one click asks the model to declare the rest.
Render it
POST /v1/renders
{
"drawContract": "const meta = { … }; const entities = [ … ]; function draw(ctx, t, params, rng) { … }",
"exportProfile": {
"format": "mp4",
"resolution": "720p"
}
}
Priced by the same formula as any render; POST /v1/renders:estimate is free. A program with no entities still renders, and the response carries a DRAW_CONTRACT_UNDECLARED warning saying nothing in it can be edited by name.
Edit it by declaration
POST /v1/renders
{
"drawContract": "…the same program…",
"decl": {
"hide": [
"title"
],
"params": {
"fox": {
"color": "#3aa0ff",
"x": 420
}
},
"timing": {
"fox": {
"from": 1.5,
"to": 8
}
},
"add": [
{
"id": "tagline",
"kind": "text",
"from": 2,
"to": 7,
"params": {
"text": "Winter Arrival",
"x": 640,
"y": 120,
"color": "#ffffff",
"size": 36
}
}
]
},
"exportProfile": {
"format": "gif"
}
}
decl.hide removes entities by id; decl.params overrides an entity's parameters; decl.timing shifts or retimes an entity's from and to playback window; decl.add injects new canvas entities (text, badges, subtitles, shape overlays) with custom timing and params. Only the specified entities change — this is tested on real pixels. The underlying program itself does not need to be rewritten.
Edit it in the chat
When a film declares its entities, the chat lists them under the player. Click one in the list — or click it in the picture, if it has bounds — and its parameters become controls: colours, numbers, text, on/off. You can hide it or reset it, and drag it: position is params.x / params.y by convention, so anything that declares them goes where you drop it. Things that depend on each other share their params object, so a rider moves with its mount. The film re-plays with your changes at once, and Export sends exactly those changes as decl, so the file matches what you saw. An untouched film sends no decl at all.
What it cannot do yet
- A drawn film exports as MP4 or GIF. PNG, PDF and SVG are refused by name rather than returned blank.
- Retiming and canvas additions: You can retime existing elements (
decl.timing) and add new graphic overlays, text callouts, subtitles, and badges (decl.add) directly on canvas without asking the model for a redesign turn. Arbitrary algorithmic motion logic changes still benefit from model collaboration. - Inside the Studio, Run on Canvas puts a film on the canvas as one live layer: it plays with the Studio timeline, can be moved and scaled, and the Studio can export it. Its entities are not yet separate Studio items — they are edited in the chat panel.
- Sound: instruments are the engine's built-in set; a program cannot define its own. A GIF has no sound.
Making Films: templates, sound, reuse & your characters
Ask the Studio for a film in your own words. What happens next depends on what you asked for — the fastest answer that fits is used, and the answer always says which.
Three ways a request is answered
- From a template, in seconds. When a template already makes what you asked for — an invite, a sale, a quote, a recipe, a product launch, a routine — it is filled in with your words, dates, places and colours and answered in about ten seconds. The answer says "Started from the Event Invite template". Want something original instead? Add "from scratch" to your request. Filling a template costs about $0.001; rendering it is priced like any render.
- From your own earlier films. When you have rendered films before, a new film reuses your own parts: a hero with the same name is used exactly as you made it, and a scene like one you made is the starting point for the new one. This is private to your account (see below).
- Directed fresh. Anything else — a story, an explainer, a new world — is planned and written as a film: a plan, then every scene, the hero and the score written in parallel, each part run before it is handed to you (a part that crashes is rewritten), captions fitted inside the frame and drawn above the artwork. A 30-second film takes about two minutes. Films are up to 3 minutes long for now; a longer request is cut off at 3 minutes rather than rushed to fit.
Music and voice-over
- Every directed film has a score, written for the whole film: a whoosh into each scene change, a hit on each caption, chords that change with the cuts and a mood that follows the story. If the score cannot be written, the film still arrives — silent — and the answer says so.
- A voice-over only when you ask for one: "with a voice-over", "narrated by a warm voice", "a narrator tells the story". A narrator writes up to 8 short passages, each is voiced and placed on the timeline, and the music is lowered under the voice. Say "no voice-over" to make sure there is none.
- Price: the voice is charged on the seconds spoken (about $0.04 a minute through 2026), on its own line in your billing. A passage that cannot fit before the end of the film is left out before it is voiced, so you never pay for speech the film cannot hold.
Your work is reused — privately
- Only films you render are kept. Drafts are not. When a render succeeds, its scenes, hero and score are noted for your account: a small index of pointers into the render we already keep for you, not a second copy of your design.
- Only you benefit. Your parts are only ever looked up for your own account. Another account typing the same words gets nothing of yours.
- On by default, yours to turn off. Your account has the switch and a "Forget everything" button: off, new films start fresh and nothing new is noted; Forget everything deletes what was noted (your renders and characters stay). Deleting your account deletes it with your renders.
Your characters, and calling them with @
- A film's hero is saved as one of your characters under the name you gave it — write "BOT-001, a small orange box-robot" in your request, render the film, and BOT-001 is yours. A character already holding a name is never replaced by a later film; the new film is added to its list.
- Call it with @. In the Studio, ask for "a 20-second film of
@BOT-001at the beach": that exact character — as you made it — is the hero of the new film, in any conversation. A name you do not have is said back to you, not guessed at. Ask for a film (a length or the word "film"); a bare "@BOT-001waving" may be drawn as a still. - Coming next in the Studio: typing
@lists your characters with a picture, and a "My ontology" view shows everything you have made as a graph — each character, what kind of thing it is, and the films it is in. Until then, the API below lists them.
API
| Call | What it does |
|---|---|
GET /v1/my/concepts?q= | Your characters, newest first; q filters by name. |
POST /v1/my/concepts { "renderId": "…", "entityId": "pip", "name": "Pip" } | Save a character from one of your finished films (a part the film marks as a character). "dryRun": true says what would be saved and writes nothing. A name you already have is never replaced: 409 with that character; "link": true adds this film to it instead. |
PATCH /v1/my/concepts/{id} { "label": "Bolt" } | Rename one (409 if you already have that name). |
DELETE /v1/my/concepts/{id} | Forget one character. Its films and renders are untouched. |
POST /v1/inference (Studio design turn) | The answer carries fromTemplate when a template answered, filmSound (music, voice-over passages, voice price, anything left out), filmReused (what came from your earlier films) and mentions (which @names were yours, which were not found). |
POST /v1/template-route:probe { "briefs": [...] } | Which template, if any, would answer each request — and how sure the choice is. Designs nothing. |
Export on your own device
In the Studio's Export dialog, a computer that is up to it gets Export on this device · free next to the server render. The video (MP4, WebM or GIF) is made in your browser by the same frame-stepped engine the canvas plays — nothing is uploaded and no credits are used. It is offered when the browser has a video encoder (WebCodecs), 4 or more processor cores and, where the browser reports it, 4 GB of memory or more; how long a video it offers grows with the device (a GPU and a hardware encoder count). The dialog says why when it is not offered.
What only a server render adds — the dialog names whichever applies before you choose: the film's music score and voice-over mix, your mark and its verify code, the resolution picker (a device export is made at the canvas's own size), and a true MP4 in a browser with no H.264 encoder (it makes a WebM instead, and names the file that way).
Audio & Voice Synthesis
PinePaper Cloud provides high-fidelity audio engineering for all animated and video productions, adhering to streaming broadcast standards. Audio is never an afterthought or an unmetered novelty — every track is mastered, synchronized, and cryptographically accounted for.
Streaming Loudness Standards
Every export containing audio is mastered to professional streaming broadcast specifications: Stereo, 48 kHz, −14 LUFS integrated loudness, and −1 dBTP true peak (the industry standard required by YouTube, Spotify, and broadcast networks). Dialogue-led scenes target −16 LUFS to ensure crystal-clear vocal intelligibility.
Real-Time Sidechain Ducking
When voice narration or dialogue plays alongside a musical score or sound effects, the audio engine applies dynamic sidechain compression. The musical score smoothly and continuously ducks underneath the vocal frequencies, rising back to full presence during pauses, avoiding stepped or artificial volume jumps.
Voice Synthesis (/v1/voice & pinepaper_voice)
Generate high-clarity voice tracks with natural inflections, pauses, and character personas:
- Default Platform Engine: Google Gemini 3.8 Flash TTS — ranked #2 on the Artificial Analysis Speech Arena (Elo 1264). Delivers low-latency multi-speaker synthesis across 100+ languages with built-in C2PA metadata.
- Bring Your Own Key (BYOK): Connect your own keys for ElevenLabs (v3 / Flash v2.5), Cartesia Sonic 3.6, or OpenAI (gpt-4o-mini-tts). Store your keys encrypted per-organization via
POST /v1/apikeys. With BYOK, you only pay a nominal platform coordination fee ($0.002) while your vendor account pays the usage. - Multi-Speaker Scripts: Support for multi-speaker dialogues with voice casting per line (e.g. Puck & Kore).
POST /v1/voice
{
"text": "PinePaper turns prompts into knowledge graphs and brings them to life on canvas.",
"voice": "Puck",
"language": "en-US",
"speed": 1.0
}
Knowledge Graph Content Recipes & Design Direction
Instead of requiring bespoke tools for every marketing visual, PinePaper encodes quality-tested creative workflows as Knowledge Graph Nodes that any designer or agent accesses automatically via pinepaper_design_direction or natural prompt matching:
- Accessible Timed Captions (
caption_layout): Enforces 8 verified rules including 90% title-safe margins (yFrac 0.78–0.88), ≥5.5% canvas font size, 5-word / 2.8s phrase limits, contrast backing boxes (rgba(0,0,0,0.65)), keyframe synchronization to Whisper speech timestamps, and social word-highlight pop (#ffe500) or kinetic punch. - Vox Editorial Explainer Boards (
vox_board): Structural 9% gutter margin hanging all text, ≥96px hero stat callouts, animated 1–2px separator rules, 4-tier typographic hierarchy, and verified ≥4.5:1 contrast against panel backing. - Ken Burns Documentary Photo Walks (
photo_walk): Continuous subtle scale drift (1.0 → 1.10) anchored to detected faces/focal points, 0.4–0.8s paired crossfade dissolves, beat-aligned cutting, and normalized aspect ratios. - Social Share & OpenGraph Cards (
share_card): Standard 1200×630 (1.91:1) and 1080×1080 safe canvases, ≥54px mobile-legible headlines, anchored brand badges with 32px safe padding, and high-contrast scrim backing. - Compact Result Mode (
compact: true): Autonomous agents can passcompact: truein MCPtools/callto reduce token payloads by ~90%, returning concise bounds, findings, warnings, and success flags. - Unwrapped Results (
unwrap: true): By default/rpcreturns one text block whose text is the tool's whole result serialised as JSON, so an MCP client reads escaped JSON and pays tokens for the escaping. Passunwrap: true(aliasunwrapContent: true) intools/callto receive the tool's owncontentarray directly, withisErrorpropagated — except when the package refused a call that your cloud canvas drew anyway: thenisErroris false,_canvas.createdCountsays what was drawn and_canvas.packageRefusalkeeps the package's words. Omit it to keep the single-text-block shape existing agent parsers expect.
Knowledge Graph Audio & Composition Engine (pinepaper_audio_compose)
Arrange, orchestrate, and mix scores deterministically from high-level narrative briefs using the Audio Knowledge Graph:
- Orchestral Ensembles & Forms: Select curated ensembles (Chamber Strings, Symphonic, Ambient Synth, Hybrid Trailer) and musical form structures (Three-Act Arc, Product Explainer, Continuous Looping Bed).
- Moods & Tonal Palettes: Compose across harmonic tension profiles and modal scales (Major, Minor, Pentatonic, Lydian, Dorian, Phrygian).
- Visual Scene Synchronization: Declare reactive bindings between visual animation triggers (
step,land,hit,entrance,exit) and score cues. - Output Mixing Nodes & Bus Ducking: Stems route through dedicated KG buses (Master, Voiceover, Music, SFX, Ambience) with automatic -12 dB sidechain ducking under dialogue and calibrated LUFS mastering.
Google Lyria & Model Training
Generate music with Google DeepMind's Lyria 3.5 through the Gemini API: full songs up to a couple of minutes, with length steered by the prompt.
- SynthID: Google embeds an inaudible SynthID watermark in every Lyria output.
- Model training: On a paid-tier Gemini API key, Google does not use your prompts or generated audio to improve its products; on a free-tier key it does. No request setting changes this, so if you bring your own key, its tier decides.
- Sound & Audio Model Hub: Manage active music, SFX, and custom audio models, with encrypted BYOK key storage via
GET/PUT /v1/sound/configand/v1/sound/keys.
Provenance
Each cloud render carries a machine-readable record of how it was made. Today that record is unsigned: it states what produced the file, but it is not a cryptographic proof of origin, and anyone could write one.
What is written today (phase 1, unsigned)
A pinepaper.provenance/1 JSON record — render id, content hash, format, render engine and pipeline revision, the designing model, provider and prompt (capped at 500 characters), the licence of each audio track, and the render time — is written into the file:
- MP4 / WebM: the container
commenttag (ffprobe -show_formatprints it). - PNG: an iTXt chunk with keyword
PinePaperProvenance. - GIF: a Comment Extension.
- PDF: the Info dictionary, key
/PinePaperProvenance.
The record names no requester and carries no fingerprint. /verify (signed in) reads the PNG and GIF records and shows them exactly as embedded; exiftool or ffprobe read every format without an account.
Planned: C2PA signing
Signing the finished file with a C2PA manifest (c2patool in the render container, with a Level 1 certificate) is designed and waiting on our enrolment in the C2PA Conformance Program. Until then no PinePaper render is C2PA-signed.
Your visible mark
Any MP4, WebM, GIF, PNG or PDF render can carry your own visible mark — your text, your logo from your media, or both — drawn by the renderer on every frame: exportProfile.watermark = { text?, logo?, position?, opacity?, size?, verify? }. With verify: true the file also carries a short code that anyone can look up to see what you chose to say, when it was rendered and the file's content hash — so a real piece can be told from a copy with the mark pasted on. It names no account. Free, and opt-in.
Not built: invisible watermarking
No invisible watermark is applied to any export. Metadata can be stripped by platforms that re-encode uploads; the visible mark above survives a re-encode, but nothing invisible does yet.
Local Installation (Free)
The open-source MCP server is free and runs on your own computer. It shares the core canvas tools with this cloud service, but the two sets are not identical: cloud rendering, drawn films, voice and the design graph (
pinepaper_render, pinepaper_film,
pinepaper_voice, pinepaper_kg_*) are cloud-only.
Claude Desktop
Download the PinePaper extension (.mcpb) and open it. Claude Desktop installs it, with no config file to edit. It uses your installed Google Chrome.
Other MCP clients
The server needs Puppeteer to draw; without it, tools return code instead of drawing. Use npx with Puppeteer alongside:
{
"mcpServers": {
"pinepaper": {
"command": "npx",
"args": ["-y", "-p", "puppeteer", "-p", "@pinepaper.studio/mcp-server", "pinepaper-mcp"]
}
}
}
Or install both globally and point your client at the installed command:
npm install -g @pinepaper.studio/mcp-server puppeteer
{
"mcpServers": {
"pinepaper": {
"command": "pinepaper-mcp"
}
}
}
The cloud service is for users who:
- Want remote access without local installation
- Need hosted infrastructure
- Use AI clients that don't support local MCP servers