MCP App Store
Lifestyle
Glinded for Birthday Videos icon

Glinded for Birthday Videos

by Glinded, Inc.

Overview

Upload your photos and videos, and Glinded turns them into a finished celebration video with music, transitions, and text overlays. Just describe what you want — no editing skills needed. Choose from thousands of professional music tracks or our Creative Commons catalog. Preview, edit in real time, and download when you're ready. Works for birthdays, anniversaries, graduations, coming of age, and family milestones.

Tools

check_task_status

ChatGPT
check_task_status (Tool) - Check Task Status Get task status including progress message and error details. Only call this if the user explicitly asks about progress — the widget already shows real-time progress. --- Returns 1. status (enum: "working", "completed", "failed", "cancelled") 2. message (string): Progress message (e.g., "Rendering frame 120/300") 3. error (string, optional): If status is failed 4. result (object, optional): If status is completed 4.1. content (array) 4.1.1. type (literal) 4.1.2. text (string)

check_task_status

ChatGPT
check_task_status (Tool) - Check Task Status Get task status including progress message and error details. Only call this if the user explicitly asks about progress — the widget already shows real-time progress. --- Returns 1. status (enum: "working", "completed", "failed", "cancelled") 2. message (string): Progress message (e.g., "Rendering frame 120/300") 3. error (string, optional): If status is failed 4. result (object, optional): If status is completed 4.1. content (array) 4.1.1. type (literal) 4.1.2. text (string)

clear_composition

ChatGPT
clear_composition (Tool) - Clear Composition Clear the Glinded project's composition so a new one can be created from scratch. This is a destructive action — it permanently discards the current composition. Only use it when the user explicitly wants to start over. Why this matters: Compositions take ~10 minutes to generate. Clearing one means the user waits another 10 minutes for a new one. Worse, even with identical inputs, a new composition will produce wildly different results — different scene order, different pacing, different creative choices. There is no undo — once cleared, the previous composition is gone forever. If the user liked the current version and just wanted edits, you've destroyed their work and replaced it with something unrecognizable. Use edit_composition_source_code to preserve what the user already likes. Use this tool when: - The user explicitly wants to start over with a completely new composition - The user confirms they want to discard the current composition and regenerate Do NOT use this tool when: - The user wants to make edits to the existing composition (use edit_composition_source_code instead) - The user hasn't explicitly confirmed they want to start over - The user asks to change duration, pacing, music, transitions, or any other aspect — these are edits, not redos After clearing: Use create_composition_task to generate a new composition from scratch. Pass the user's new direction as narrativeDirection so the new composition reflects what they asked for. Examples: ``xml <example> <signal>User explicitly wants to start over</signal> <user>This isn't working at all. Let's start from scratch.</user> <tool_calls>clear_composition({ "projectId": "...", "userRequestedFullRedo": "I confirm ..." })</tool_calls> <reasoning>The user explicitly said "start from scratch" — this is a clear request to discard and redo.</reasoning> </example> <example> <signal>User is dissatisfied but intent is ambiguous</signal> <user>I don't like it. Try a different angle to her story.</user> <tool_calls>None — clarify first</tool_calls> <assistant>I can adjust the narrative focus — for example, emphasize different memories or rearrange the scenes. Or if you'd prefer a completely fresh start, I can regenerate the whole composition (though that takes ~10 minutes and the result will be entirely different). Which would you prefer?</assistant> <reasoning>The user's intent is ambiguous — "different angle" could be an edit or a full redo. Since clearing is destructive and takes 10 minutes, clarify before proceeding.</reasoning> </example> <bad_example> <signal>User wants to shorten the video</signal> <user>Can you make the video 2-3 minutes?</user> <wrong_tool>clear_composition</wrong_tool> <correct_tool>edit_composition_source_code</correct_tool> <why_bad>Changing the duration is an edit, not a redo. The user wants to adjust the existing composition — use edit_composition_source_code to trim or restructure scenes.</why_bad> </bad_example> <bad_example> <signal>User wants to change the music</signal> <user>I don't like this music, can we change it?</user> <wrong_tool>clear_composition</wrong_tool> <correct_tool>search_epidemic_sound_music then edit_composition_source_code to apply it</correct_tool> <why_bad>Swapping music is a single edit. Don't nuke the entire composition just to change one element.</why_bad> </bad_example> <bad_example> <signal>User wants to adjust pacing or transitions</signal> <user>The transitions feel too fast, can you slow them down?</user> <wrong_tool>clear_composition</wrong_tool> <correct_tool>edit_composition_source_code</correct_tool> <why_bad>Adjusting pacing or transitions is an edit to the existing composition, not a reason to discard and rebuild everything.</why_bad> </bad_example> <bad_example> <signal>User wants to reorder or remove scenes</signal> <user>Can you remove the third scene and move the last one earlier?</user> <wrong_tool>clear_composition</wrong_tool> <correct_tool>edit_composition_source_code</correct_tool> <why_bad>Reordering or removing scenes is an edit. The composition structure is intact — just modify it.</why_bad> </bad_example> ``

clear_composition

ChatGPT
clear_composition (Tool) - Clear Composition Clear the Glinded project's composition so a new one can be created from scratch. This is a destructive action — it permanently discards the current composition. Only use it when the user explicitly wants to start over. Why this matters: Compositions take ~10 minutes to generate. Clearing one means the user waits another 10 minutes for a new one. Worse, even with identical inputs, a new composition will produce wildly different results — different scene order, different pacing, different creative choices. There is no undo — once cleared, the previous composition is gone forever. If the user liked the current version and just wanted edits, you've destroyed their work and replaced it with something unrecognizable. Use edit_composition_source_code to preserve what the user already likes. Use this tool when: - The user explicitly wants to start over with a completely new composition - The user confirms they want to discard the current composition and regenerate Do NOT use this tool when: - The user wants to make edits to the existing composition (use edit_composition_source_code instead) - The user hasn't explicitly confirmed they want to start over - The user asks to change duration, pacing, music, transitions, or any other aspect — these are edits, not redos After clearing: Use create_composition_task to generate a new composition from scratch. Pass the user's new direction as narrativeDirection so the new composition reflects what they asked for. Examples: ```xml <example> <signal>User explicitly wants to start over</signal> <user>This isn't working at all. Let's start from scratch.</user> <tool_calls>clear_composition({ "projectId": "...", "userRequestedFullRedo": "I confirm ..." })</tool_calls> <reasoning>The user explicitly said "start from scratch" — this is a clear request to discard and redo.</reasoning> </example> <example> <signal>User is dissatisfied but intent is ambiguous</signal> <user>I don't like it. Try a different angle to her story.</user> <tool_calls>None — clarify first</tool_calls> <assistant>I can adjust the narrative focus — for example, emphasize different memories or rearrange the scenes. Or if you'd prefer a completely fresh start, I can regenerate the whole composition (though that takes ~10 minutes and the result will be entirely different). Which would you prefer?</assistant> <reasoning>The user's intent is ambiguous — "different angle" could be an edit or a full redo. Since clearing is destructive and takes 10 minutes, clarify before proceeding.</reasoning> </example> <bad_example> <signal>User wants to shorten the video</signal> <user>Can you make the video 2-3 minutes?</user> <wrong_tool>clear_composition</wrong_tool> <correct_tool>edit_composition_source_code</correct_tool> <why_bad>Changing the duration is an edit, not a redo. The user wants to adjust the existing composition — use edit_composition_source_code to trim or restructure scenes.</why_bad> </bad_example> <bad_example> <signal>User wants to change the music</signal> <user>I don't like this music, can we change it?</user> <wrong_tool>clear_composition</wrong_tool> <correct_tool>search_epidemic_sound_music then edit_composition_source_code to apply it</correct_tool> <why_bad>Swapping music is a single edit. Don't nuke the entire composition just to change one element.</why_bad> </bad_example> <bad_example> <signal>User wants to adjust pacing or transitions</signal> <user>The transitions feel too fast, can you slow them down?</user> <wrong_tool>clear_composition</wrong_tool> <correct_tool>edit_composition_source_code</correct_tool> <why_bad>Adjusting pacing or transitions is an edit to the existing composition, not a reason to discard and rebuild everything.</why_bad> </bad_example> <bad_example> <signal>User wants to reorder or remove scenes</signal> <user>Can you remove the third scene and move the last one earlier?</user> <wrong_tool>clear_composition</wrong_tool> <correct_tool>edit_composition_source_code</correct_tool> <why_ba…

create_composition_task

ChatGPT
create_composition_task (Tool) - Create Composition Generate a new composition from uploaded assets. This tool delegates to an AI agent that analyzes all uploaded assets and creates a personalized narrative composition — not a generic slideshow. The agent examines each photo's content, identifies the subject, sorts them chronologically, builds a story arc, and crafts a meaningful composition with appropriate copy. Before calling this tool — ask the user first: Composition generation takes ~10 minutes and the choices below are baked into the result. Getting them wrong wastes the user's time and requires starting over. You MUST ask the user explicitly — do not assume defaults. 1. Orientation — "Will you watch this on a phone (portrait) or on a TV/laptop (landscape)?" - Wrong orientation is the most costly mistake. A portrait video on a TV looks terrible; a landscape video sent via WhatsApp/Instagram has tiny footage. There is no way to change orientation after generation without discarding the entire composition. 2. Tone / direction — "What feel do you want — reflective (slow, peaceful, nostalgic), heartfelt (warm, emotional, bittersweet), or joyful (lively, upbeat, celebratory)?" - Pass the user's answer as narrativeDirection. This shapes the story arc, music, and copy. If the user says "no preference" — that's fine, omit it. But you must ask. Prerequisites: - Assets must be uploaded (minimum 5) - The Glinded project's subjectDetails must contain the subject's name, dates, and key details (via create_project or update_project) - The user has explicitly confirmed their orientation and tone preferences (see above) Important: While this tool returns just a taskId, when the generation task completes, the widget will provide the compositionId in widget context. Use that compositionId for subsequent tools like show_player, edit_composition_source_code, grep_composition_source_code, and render_video_task. --- Returns 1. taskId (string): The task ID. Use with check_task_status only if the user asks about progress.

create_composition_task

ChatGPT
create_composition_task (Tool) - Create Composition Generate a new composition from uploaded assets. This tool delegates to an AI agent that analyzes all uploaded assets and creates a personalized narrative composition — not a generic slideshow. The agent examines each photo's content, identifies the subject, sorts them chronologically, builds a story arc, and crafts a meaningful composition with appropriate copy. Before calling this tool — ask the user first: Composition generation takes ~10 minutes and the choices below are baked into the result. Getting them wrong wastes the user's time and requires starting over. You MUST ask the user explicitly — do not assume defaults. 1. Orientation — "Will you watch this on a phone (portrait) or on a TV/laptop (landscape)?" - Wrong orientation is the most costly mistake. A portrait video on a TV looks terrible; a landscape video sent via WhatsApp/Instagram has tiny footage. There is no way to change orientation after generation without discarding the entire composition. 2. Tone / direction — "What feel do you want — reflective (slow, peaceful, nostalgic), heartfelt (warm, emotional, bittersweet), or joyful (lively, upbeat, celebratory)?" - Pass the user's answer as narrativeDirection. This shapes the story arc, music, and copy. If the user says "no preference" — that's fine, omit it. But you must ask. Prerequisites: - Assets must be uploaded (minimum 5) - The Glinded project's subjectDetails must contain the subject's name, dates, and key details (via create_project or update_project) - The user has explicitly confirmed their orientation and tone preferences (see above) Important: While this tool returns just a taskId, when the generation task completes, the widget will provide the compositionId in widget context. Use that compositionId for subsequent tools like show_player, edit_composition_source_code, grep_composition_source_code, and render_video_task. --- Returns 1. taskId (string): The task ID. Use with check_task_status only if the user asks about progress.

create_project

ChatGPT
<toolkit_overview> Glinded - MEMORIES VIDEO EDITOR Version: 1.1.0 🌟 PRESERVE AND CELEBRATE THE STORIES THAT MATTER MOST 🌟 What This Toolkit Is For The Glinded Memories Video Editor helps users create memorial and celebration videos using authentic family memories: - Memorial tributes - Honoring loved ones who have passed. - Family celebrations - Weddings, anniversaries, milestones. - Collaborative storytelling - Multiple family members contributing. - Authentic memories - Real photos, videos, and audio clips. Understanding Your User's Context - ⚠️ For memorial projects (`isMemorial: true`): The user may be grieving — they may have just received news of a loss. Be gentle and respectful. - ⚠️ For celebration projects: The user is excited — match their energy. Weddings, birthdays, and milestones call for a warm, upbeat tone. - ⚠️ In both cases: They want to delegate — make thoughtful decisions autonomously. Terminology - Glinded Project: The top-level container. Created by create_project, holds assets and at most one composition at a time. - Composition: The React component that defines the video -- scenes, transitions, text, music. Created by create_composition_task, edited by edit_composition_source_code. - Scene: A segment within a composition (opening title, photo montage, closing, etc.). - Render: The process of converting a composition into a downloadable video file. Widget Context When interactive widgets are open (video player, asset list, music selector), they maintain widget context -- structured data about what the user sees and interacts with (e.g., selected elements, current scene, playback position). Always re-read widget context before acting on each user message. It tells you what the user is looking at and has selected. The user may have navigated, seeked, or selected a different element since their last message. If no widget is open, widget context is not available. Async Tasks When an async task (create_composition_task or render_video_task) is in progress: - The widget shows real-time progress -- let it do its job - Do NOT poll `check_task_status` -- the widget already shows real-time progress, and polling will confuse the user about where to look. Only call check_task_status if the user explicitly asks about progress ("is it stuck?", "how long?") - When the task completes, the widget sends a message on behalf of the user (e.g., "Composition is ready"). Treat this like any other user message and resume normal tool use. </toolkit_overview> create_project (Tool) - Create Project Create a new Glinded video project. After calling this tool: ✅ existingFiles > 0 → "I've started a new Glinded project. Want me to import the existing 10 files?" (ask permission to import via import_chatgpt_file, one question only) ✅ existingFiles = 0 → "I've started a new Glinded project. Would you like me to open the upload interface so you can add your photos and videos?" (offer upload_assets, don't mention importing) ❌ existingFiles = 0 but mentioning "0 files to import" → don't mention the count when it's 0 ❌ Listing future steps before assets are even uploaded → focus only on the immediate next step: <bad_example> <assistant> I've created a new Glinded memorial video project! I found 10 files in our conversation that we can use. Want me to import them all? After that, I can also: - Write an emotional script (for voice-over or subtitles) - Suggest fitting music - Structure the narrative (childhood → family life → legacy) If you also have: - The person's name - Approximate years (birth/death) - A few words about who they were I can make a much more personal and powerful video. </assistant> <why_bad>Overwhelms the user with future steps they didn't ask about. The user hasn't even uploaded assets — don't talk about story structure, music, or voice-over. Focus only on the immediate next step.</why_bad> </bad_example> --- Returns 1. projectId (string): The ID of the new Glinded project - not a URL. Use this in all subsequent tool calls that require a projectId. 2. askUser (string): Ask the user about the next step you should take

create_project

ChatGPT
<toolkit_overview> Glinded - MEMORIES VIDEO EDITOR Version: 1.1.0 🌟 PRESERVE AND CELEBRATE THE STORIES THAT MATTER MOST 🌟 What This Toolkit Is For The Glinded Memories Video Editor helps users create memorial and celebration videos using authentic family memories: - Memorial tributes - Honoring loved ones who have passed. - Family celebrations - Weddings, anniversaries, milestones. - Collaborative storytelling - Multiple family members contributing. - Authentic memories - Real photos, videos, and audio clips. Understanding Your User's Context - ⚠️ For memorial projects (`isMemorial: true`): The user may be grieving — they may have just received news of a loss. Be gentle and respectful. - ⚠️ For celebration projects: The user is excited — match their energy. Weddings, birthdays, and milestones call for a warm, upbeat tone. - ⚠️ In both cases: They want to delegate — make thoughtful decisions autonomously. Terminology - Glinded Project: The top-level container. Created by create_project, holds assets and at most one composition at a time. - Composition: The React component that defines the video -- scenes, transitions, text, music. Created by create_composition_task, edited by edit_composition_source_code. - Scene: A segment within a composition (opening title, photo montage, closing, etc.). - Render: The process of converting a composition into a downloadable video file. Widget Context When interactive widgets are open (video player, asset list, music selector), they maintain widget context -- structured data about what the user sees and interacts with (e.g., selected elements, current scene, playback position). Always re-read widget context before acting on each user message. It tells you what the user is looking at and has selected. The user may have navigated, seeked, or selected a different element since their last message. If no widget is open, widget context is not available. Async Tasks When an async task (create_composition_task or render_video_task) is in progress: - The widget shows real-time progress -- let it do its job - Do NOT poll `check_task_status` -- the widget already shows real-time progress, and polling will confuse the user about where to look. Only call check_task_status if the user explicitly asks about progress ("is it stuck?", "how long?") - When the task completes, the widget sends a message on behalf of the user (e.g., "Composition is ready"). Treat this like any other user message and resume normal tool use. </toolkit_overview> create_project (Tool) - Create Project Create a new Glinded video project. After calling this tool: ✅ existingFiles > 0 → "I've started a new Glinded project. Want me to import the existing 10 files?" (ask permission to import via import_chatgpt_file, one question only) ✅ existingFiles = 0 → "I've started a new Glinded project. Would you like me to open the upload interface so you can add your photos and videos?" (offer upload_assets, don't mention importing) ❌ existingFiles = 0 but mentioning "0 files to import" → don't mention the count when it's 0 ❌ Listing future steps before assets are even uploaded → focus only on the immediate next step: <bad_example> <assistant> I've created a new Glinded memorial video project! I found 10 files in our conversation that we can use. Want me to import them all? After that, I can also: - Write an emotional script (for voice-over or subtitles) - Suggest fitting music - Structure the narrative (childhood → family life → legacy) If you also have: - The person's name - Approximate years (birth/death) - A few words about who they were I can make a much more personal and powerful video. </assistant> <why_bad>Overwhelms the user with future steps they didn't ask about. The user hasn't even uploaded assets — don't talk about story structure, music, or voice-over. Focus only on the immediate next step.</why_bad> </bad_example> --- Returns 1. projectId (string): The ID of the new Glinded project - not a URL. Use this in all sub…

create_upload_url

ChatGPT
create_upload_url (Tool) - Create Upload URL --- Returns 1. id (string) 2. url (string): The upload URL that can be shared 3. expiresAt (string): ISO 8601 timestamp of when the URL expires

create_upload_url

ChatGPT
create_upload_url (Tool) - Create Upload URL --- Returns 1. id (string) 2. url (string): The upload URL that can be shared 3. expiresAt (string): ISO 8601 timestamp of when the URL expires

delete_project

ChatGPT
delete_project (Tool) - Delete Project This tool permanently deletes a Glinded project. This action cannot be undone. Use this tool for: - Removing unwanted Glinded projects - Clean up test or abandoned Glinded projects. - Glinded project cleanup - Delete Glinded projects that are no longer needed. Do NOT use this tool when: - The user hasn't explicitly confirmed they want to delete the Glinded project. Always confirm before deleting. Warning: This action is permanent and cannot be undone. The Glinded project, its composition, assets, and all metadata will be permanently deleted.

delete_project

ChatGPT
delete_project (Tool) - Delete Project This tool permanently deletes a Glinded project. This action cannot be undone. Use this tool for: - Removing unwanted Glinded projects - Clean up test or abandoned Glinded projects. - Glinded project cleanup - Delete Glinded projects that are no longer needed. Do NOT use this tool when: - The user hasn't explicitly confirmed they want to delete the Glinded project. Always confirm before deleting. Warning: This action is permanent and cannot be undone. The Glinded project, its composition, assets, and all metadata will be permanently deleted.

delete_upload_url

ChatGPT
delete_upload_url (Tool) - Delete Upload URL

delete_upload_url

ChatGPT
delete_upload_url (Tool) - Delete Upload URL

discover_composition_packages

ChatGPT
discover_composition_packages (Tool) - Discover Composition Packages Discover available packages and their exports for use in compositions. This tool has two modes: Mode 1: List all packages Call with no parameters to see every available package and its installed version. `` discover_composition_packages() ` **Mode 2: Query package exports** Provide a package name to discover its subpath exports (fonts, transitions, components, etc.). ` // List all exports from a package discover_composition_packages({ package: "@remotion/transitions" }) // Filter exports by name discover_composition_packages({ package: "@remotion/google-fonts", query: "serif" }) ` **Use this tool when:** - The user asks to change a font, transition, or visual element and you need to find what's available - You need to look up a specific package export before using it in edit_composition_source_code - You want to check installed package versions This is used during composition editing -- not needed for initial composition generation (create_composition_task` handles that autonomously).

discover_composition_packages

ChatGPT
discover_composition_packages (Tool) - Discover Composition Packages Discover available packages and their exports for use in compositions. This tool has two modes: Mode 1: List all packages Call with no parameters to see every available package and its installed version. `` discover_composition_packages() ` **Mode 2: Query package exports** Provide a package name to discover its subpath exports (fonts, transitions, components, etc.). ` // List all exports from a package discover_composition_packages({ package: "@remotion/transitions" }) // Filter exports by name discover_composition_packages({ package: "@remotion/google-fonts", query: "serif" }) ` **Use this tool when:** - The user asks to change a font, transition, or visual element and you need to find what's available - You need to look up a specific package export before using it in edit_composition_source_code - You want to check installed package versions This is used during composition editing -- not needed for initial composition generation (create_composition_task` handles that autonomously).

edit_composition_source_code

ChatGPT
<edit_workflow> EDITING WORKFLOW Preview, refine, and render the video composition. Purpose Show the composition to the user via the player, iterate with edits based on their feedback, and render the final video when they're satisfied. The User The user is a non-technical person creating a memorial video. They don't know what code is, what TypeScript means, or how components work. They see a video player and describe what they want in plain language — "make this photo black and white", "change the text", "swap these two photos". You are the expert. You handle all code, fix all issues, and make technical decisions. The user sees only the video player and your plain-language responses. You are the only one who can edit the composition. The user has no access to the source code — there is no code editor, no file system, no way for them to see or modify code. The only way changes happen is through YOU calling edit_composition_source_code. When you fail to make an edit, the user is stuck — asking them to "manually replace X with Y" is nonsensical because they literally cannot do it. Communication Rules NEVER include in your responses: - Code snippets, JSX, CSS, JavaScript, or any programming syntax - Error messages, error codes, line numbers, file names, or component names - Technical jargon: "component", "prop", "interpolate", "frame variable", "compile", "type error", "validation", "scope", "function", "import" - Internal tool behavior: "the tool rejected", "non-unique match", "multiple occurrences", "the tool refuses to guess" - Instructions to manually edit code — this is architecturally impossible, the user has no access to source code ALWAYS communicate in plain language: - Describe changes visually: "Done — that photo is now black and white" - Describe effects naturally: "It will gradually fade to black and white over about a second" - If something went wrong and you fixed it: "Done — I also fixed a small issue that would have affected playback" - If you need clarification, ask about creative intent: "Should just this photo be black and white, or all of them?" When offering creative options, describe them visually — never with code: - "I can make it fade slowly into black and white (more cinematic) or switch instantly (more striking). Which feels right?" - Never present code as options Workflow 1. Call show_player so the user can preview the composition 2. Use read_composition_source_code to get the composition source code and understand what you are working with 3. Use edit_composition_source_code to iterate based on user feedback 4. When the user is satisfied, render the video using render_video_task 5. After rendering, the user can download directly from the widget Handling Edit Failures You will encounter tool errors. Handle them silently — never surface them to the user. Non-unique match The edit tool requires oldString to match exactly one location. If rejected: 1. Use read_composition_source_code or grep_composition_source_code to find the exact location 2. Expand oldString to include more surrounding lines until the match is unique 3. Retry the edit 4. Never tell the user the tool couldn't find a unique match or ask them to edit manually Type errors after a successful edit The tool returns typeErrors after each edit. If errors are present: 1. Read the errors yourself — they are for YOU, not the user 2. Make follow-up edits to fix them (missing imports, undefined variables, scope issues) 3. Only confirm to the user once everything is clean 4. Never show error codes, error messages, or line numbers to the user Edit applied too broadly or to the wrong place If you accidentally changed multiple scenes or the wrong element: 1. Read the source to assess what happened 2. Fix it with follow-up edits 3. Tell the user: "Done — applied only to the photo you selected" 4. Never explain internal architecture to the user Rule violations or compilation errors If the tool rejects with a rule violation: 1. Read the error yourself 2. Fix the issue in the code 3. Retry the edit 4. Never surface the error to the user Adding or including assets Users may upload new assets during this phase, or ask to include an existing asset that wasn't used. In both cases, use edit_composition_source_code to incorporate the asset into the existing composition. This is an additive edit, not a reason to regenerate. Only use clear_composition + create_composition_task if the user wants a fundamentally different narrative or needs to change orientation (portrait/landscape). Warn the user first: this regenerates the entire composition from scratch and all previous edits will be lost. Progress Update Rules When making multiple edits to the composition: - After completing a logical batch of changes: "Updated scenes 2-4: fixed dates and adjusted photo order." - When discovering issues: "Found duplicate assets in Scene 6 -- using highest quality version automatically." - Keep updates concise (1-2 sentences), focus on outcomes. Music For music changes, follow the dedicated <music_workflow>. Exception: if the user shares a direct epidemicsound.com/music/tracks/<id> URL, extract the track ID and apply it directly via edit_composition_source_code — no search needed. Rendering Before calling render_video_task, let the user preview the composition via show_player. Rendering takes minutes — let the user confirm this is the final version they want. If unsure whether the player was shown (e.g., after a conversation reset), call show_player and ask: _"Here's the current video -- shall I render this as the final version?"_ After Rendering - If the user wants changes after seeing the rendered video, continue editing and re-render when ready - If they want a different quality (e.g., 720p to 4K), just re-render with the new quality parameter - If they want a different orientation (portrait/landscape), that requires clear_composition + create_composition_task with the new orientation. Warn the user first: this regenerates the entire composition from scratch and all previous edits will be lost. Remember - You are the expert — the user is not technical. Handle all code, errors, and tool issues yourself. Never ask the user to make technical decisions. - You are the only one who can edit code. The user has no access to source code. If you can't make an edit work, you must find another approach — there is no fallback to "the user does it manually". - The composition is AI-generated — show it via show_player and iterate based on user feedback - Each edit_composition_source_code response includes typeErrors — fix any reported errors silently before confirming the work is done - Keep updates concise (1-2 sentences) - Focus on outcomes, not process - When a tool fails, retry with a different approach — never blame the tools or explain tool limitations to the user </edit_workflow> edit_composition_source_code (Tool) - Edit Composition Source Code Edits the Glinded project's composition by replacing exact string matches. The player widget updates in real time. Important: this tool is synchronous and instant Each call applies the edit immediately and returns the result. There is nothing running in the background — no task to poll, no process to wait for. When you have multiple edits to make, call them one after another without pausing. Never say "let's wait until it's done" or "I'll let you know when it's finished" — the edit is already done when the tool returns. Re-read the LATEST player widget context before acting on each user message The playerWidgetContextChecklist parameter requires you to declare what the user selected in the latest player widget context. The user may have navigated to a different scene or selected a different element since their previous message — always re-read before acting. - `scene` — You checked which scene is active - `selected_text` — The user clicked a text element - `selected_image` — The user clicked an image element - `selected_video` — The user clicked a video element - `other` — Something else not covered above - `[]` (empty) — No player selection is relevant (e.g., music swap, trimming, fixing type errors from a previous edit) Shared vs Scene-Specific Changes Scene components (e.g., PhotoWithQuote, BlurBgScene) are defined once at the bottom of the composition and reused across multiple TransitionSeries.Sequence entries. Editing a component definition changes every scene that uses it. When the user selects an element in the player and requests a change, the widget context tells you what to change but not how broadly. Use grep_composition_source_code or read_composition_source_code to understand what would be affected by the change. Content corrections (fixing text, dates, names) have obvious scope — just apply them. But for style or structural changes, if the user didn't clearly specify the scope, ask before editing. It's better to clarify upfront than to revert work and waste the user's time and energy. ``xml <example> <signal>Content correction — scope is obvious, no need to ask</signal> <widget_context>Scene 2, selected text: "Hi"</widget_context> <user>Change this text to "Welcome"</user> <action>Edit the prop at the usage site in scene 2. The user is correcting specific text — this clearly applies only here.</action> </example> <example> <signal>Data correction — scope is obviously global</signal> <widget_context>Scene 4, selected text: "1925"</widget_context> <user>Change this to 1935</user> <action>Search for all occurrences of the birth year and update them all. The user is correcting factual data — it should be consistent everywhere.</action> </example> <example> <signal>Style change — component used in multiple scenes, ask first</signal> <widget_context>Scene 3, selected text in PhotoWithQuote component</widget_context> <user>Make this text italic</user> <action>grep_composition_source_code shows PhotoWithQuote is used in 4 scenes. Ask: "Should I make the quote text italic just in this scene, or across all 4 scenes that use this style?" Then apply the appropriate approach.</action> </example> <example> <signal>Style change — component used only once, no need to ask</signal> <widget_context>Scene 5, selected text in LowerThird component</widget_context> <user>Make this text bigger</user> <action>grep_composition_source_code shows LowerThird is used only in this scene. Edit the component directly — no scope question needed.</action> </example> ` Once you know the scope, pick the right approach: **Global change** (e.g., "make all quotes italic"): → Edit the shared component definition directly. **Single-scene prop change** (e.g., different asset, quote text, or motion preset): → Edit the props at the usage site inside the TransitionSeries.Sequence, not the component definition. **Single-scene style tweak** (e.g., larger font size, different color, extra padding): → Add a prop with a default value to the shared component, then override it only at the one usage site. Existing scenes stay unchanged: `tsx // Add an optional prop with a default function PhotoWithQuote({ ..., quoteFontSize = 16 }: { ...; quoteFontSize?: number }) { return <p style={{ fontSize: quoteFontSize }}>...</p>; } // Only scene 2 passes the override <PhotoWithQuote asset={ASSET_a1b2} quote="First memory" /> <PhotoWithQuote asset={ASSET_c3d4} quote="Second memory" quoteFontSize={24} /> ` **Single-scene structural change** (e.g., different layout, added element, removed text): → Duplicate the component with a new name, modify its structure, and use it in only that scene: `tsx // BEFORE: Two scenes share PhotoWithQuote <TransitionSeries.Sequence durationInFrames={secondsToFrames(8)}> <PhotoWithQuote asset={ASSET_a1b2} quote="First memory" ... /> </TransitionSeries.Sequence> <TransitionSeries.Sequence durationInFrames={secondsToFrames(6)}> <PhotoWithQuote asset={ASSET_c3d4} quote="Second memory" ... /> </TransitionSeries.Sequence> // AFTER: Scene 2 needs a different layout — duplicate the component <TransitionSeries.Sequence durationInFrames={secondsToFrames(8)}> <PhotoWithQuote asset={ASSET_a1b2} quote="First memory" ... /> </TransitionSeries.Sequence> <TransitionSeries.Sequence durationInFrames={secondsToFrames(6)}> <PhotoWithDifferentLayout asset={ASSET_c3d4} quote="Second memory" ... /> </TransitionSeries.Sequence> // At the bottom: PhotoWithDifferentLayout is a modified copy of PhotoWithQuote ` **Why duplication is safe:** useCurrentFrame() returns the frame number local to the containing TransitionSeries.Sequence (resets to 0 for each scene). Duplicated components get their own local frame — all animations work correctly. Adding new scenes or elements edit_composition_source_code does string replacement, but you can use it for additive edits too. To insert a new scene, replace the closing tag with the new scene + the closing tag: `tsx // oldString: </TransitionSeries> // newString: <TransitionSeries.Sequence durationInFrames={secondsToFrames(6)}> <PhotoWithQuote asset={ASSET_newId} quote="New memory" ... /> </TransitionSeries.Sequence> </TransitionSeries> ` The same technique works for adding new elements inside an existing scene — find a unique anchor point and replace it with the new content + the anchor. Reading the source before editing You **MUST** read the full composition source via read_composition_source_code before your first edit to get the sourceCodeLineCount. Without this value, edit_composition_source_code will reject your call. After a successful edit, the response includes newSourceCodeLineCount — use it as sourceCodeLineCount for subsequent edits. ❌ e.g., user says "Change 'In loving memory' to 'Forever in our hearts'" and you guess oldString: "In loving memory", sourceCodeLineCount: 200 without reading the source first — the actual text may be wrapped in JSX, have different casing, or need surrounding context for a unique match. Always read_composition_source_code first. Music edits require a known track ID Do not replace resolveCreativeCommonsMusic(...) or resolveEpidemicSoundMusic(...) unless the track ID comes from one of these sources: - The user selected a track via the music widget (show_creative_commons_music or search_epidemic_sound_music results) - The user shared a direct epidemicsound.com/music/tracks/<id> URL — extract the ID from the URL path Never guess or invent track IDs. Type errors Each successful edit response includes a typeErrors field. If null, the composition is type-safe. If it contains errors, fix them with follow-up edits — **silently, without showing errors to the user**. The edit IS applied regardless — the player shows the current state, but type errors may cause rendering issues. Only confirm the change to the user once all type errors are resolved. Non-unique match failures If edit_composition_source_code rejects because oldString matches multiple locations, **you must resolve this yourself** — the user has no access to source code and cannot edit anything manually. Instead: 1. Use read_composition_source_code or grep_composition_source_code to find the exact location 2. Expand oldString to include more surrounding lines (e.g., the full <Img ... /> block, or lines above/below) until the match is unique 3. Retry the edit Verify the edit reaches the render output Adding a prop to a scene call is not enough — the receiving component must accept and use it. After a visual edit (color, size, position, filter), trace from the prop → component definition → actual style/element to confirm it's wired through. If the user says the change isn't visible, stop adjusting values and inspect the render path first. Tips - Use read_composition_source_code or grep_composition_source_code first to see exact content - Include enough context in oldString to make the match unique — if the first attempt is rejected, expand the context and retry - Set replaceAll: true` to replace all occurrences at once --- Returns 1. replacements (number) 2. snippet (string): ~5 lines of context around the change with line numbers. 3. message (string) 4. typeErrors (string, nullable): TypeScript errors found after the edit, or null if clean. Fix these with follow-up edits — the edit IS applied regardless. 5. newSourceCodeLineCount (number): Updated total line count. Use this as sourceCodeLineCount for subsequent edits.

edit_composition_source_code

ChatGPT
<edit_workflow> EDITING WORKFLOW Preview, refine, and render the video composition. Purpose Show the composition to the user via the player, iterate with edits based on their feedback, and render the final video when they're satisfied. The User The user is a non-technical person creating a memorial video. They don't know what code is, what TypeScript means, or how components work. They see a video player and describe what they want in plain language — "make this photo black and white", "change the text", "swap these two photos". You are the expert. You handle all code, fix all issues, and make technical decisions. The user sees only the video player and your plain-language responses. You are the only one who can edit the composition. The user has no access to the source code — there is no code editor, no file system, no way for them to see or modify code. The only way changes happen is through YOU calling edit_composition_source_code. When you fail to make an edit, the user is stuck — asking them to "manually replace X with Y" is nonsensical because they literally cannot do it. Communication Rules NEVER include in your responses: - Code snippets, JSX, CSS, JavaScript, or any programming syntax - Error messages, error codes, line numbers, file names, or component names - Technical jargon: "component", "prop", "interpolate", "frame variable", "compile", "type error", "validation", "scope", "function", "import" - Internal tool behavior: "the tool rejected", "non-unique match", "multiple occurrences", "the tool refuses to guess" - Instructions to manually edit code — this is architecturally impossible, the user has no access to source code ALWAYS communicate in plain language: - Describe changes visually: "Done — that photo is now black and white" - Describe effects naturally: "It will gradually fade to black and white over about a second" - If something went wrong and you fixed it: "Done — I also fixed a small issue that would have affected playback" - If you need clarification, ask about creative intent: "Should just this photo be black and white, or all of them?" When offering creative options, describe them visually — never with code: - "I can make it fade slowly into black and white (more cinematic) or switch instantly (more striking). Which feels right?" - Never present code as options Workflow 1. Call show_player so the user can preview the composition 2. Use read_composition_source_code to get the composition source code and understand what you are working with 3. Use edit_composition_source_code to iterate based on user feedback 4. When the user is satisfied, render the video using render_video_task 5. After rendering, the user can download directly from the widget Handling Edit Failures You will encounter tool errors. Handle them silently — never surface them to the user. Non-unique match The edit tool requires oldString to match exactly one location. If rejected: 1. Use read_composition_source_code or grep_composition_source_code to find the exact location 2. Expand oldString to include more surrounding lines until the match is unique 3. Retry the edit 4. Never tell the user the tool couldn't find a unique match or ask them to edit manually Type errors after a successful edit The tool returns typeErrors after each edit. If errors are present: 1. Read the errors yourself — they are for YOU, not the user 2. Make follow-up edits to fix them (missing imports, undefined variables, scope issues) 3. Only confirm to the user once everything is clean 4. Never show error codes, error messages, or line numbers to the user Edit applied too broadly or to the wrong place If you accidentally changed multiple scenes or the wrong element: 1. Read the source to assess what happened 2. Fix it with follow-up edits 3. Tell the user: "Done — applied only to the photo you selected" 4. Never explain internal architecture to the user Rule violations or compilation errors If the tool rejects with a rule violation: 1. Read the error yourself…

extend_upload_url

ChatGPT
extend_upload_url (Tool) - Extend Upload URL --- Returns 1. id (string) 2. url (string): The upload URL that can be shared 3. expiresAt (string): ISO 8601 timestamp of when the URL expires

extend_upload_url

ChatGPT
extend_upload_url (Tool) - Extend Upload URL --- Returns 1. id (string) 2. url (string): The upload URL that can be shared 3. expiresAt (string): ISO 8601 timestamp of when the URL expires

get_active_upload_url

ChatGPT
get_active_upload_url (Tool) - Get Active Upload URL --- Returns 1. uploadSession (object, nullable): The active upload URL info, or null if none exists or has expired 1.1. id (string) 1.2. url (string): The upload URL that can be shared 1.3. expiresAt (string): ISO 8601 timestamp of when the URL expires

get_active_upload_url

ChatGPT
get_active_upload_url (Tool) - Get Active Upload URL --- Returns 1. uploadSession (object, nullable): The active upload URL info, or null if none exists or has expired 1.1. id (string) 1.2. url (string): The upload URL that can be shared 1.3. expiresAt (string): ISO 8601 timestamp of when the URL expires

get_download_url

ChatGPT
get_download_url (Tool) - Get Download URL --- Returns 1. downloadUrl (string): Signed URL for downloading the rendered video

get_download_url

ChatGPT
get_download_url (Tool) - Get Download URL --- Returns 1. downloadUrl (string): Signed URL for downloading the rendered video

get_project

ChatGPT
get_project (Tool) - Get Project Retrieve Glinded project details by ID. --- Returns 1. id (string) 2. title (string) 3. subjectDetails (string) 4. isMemorial (boolean): True if the subject has passed away 5. compositionId (string, nullable): Null if no composition exists yet 6. createdAt (string) 7. updatedAt (string) 8. veryImportant (string): What tools to load for this project

get_project

ChatGPT
get_project (Tool) - Get Project Retrieve Glinded project details by ID. --- Returns 1. id (string) 2. title (string) 3. subjectDetails (string) 4. isMemorial (boolean): True if the subject has passed away 5. compositionId (string, nullable): Null if no composition exists yet 6. createdAt (string) 7. updatedAt (string) 8. veryImportant (string): What tools to load for this project

get_uploadcare_assets

ChatGPT
get_uploadcare_assets (Tool) - Get Uploadcare Assets --- Returns 1. results (array)

get_uploadcare_assets

ChatGPT
get_uploadcare_assets (Tool) - Get Uploadcare Assets --- Returns 1. results (array)

grep_composition_source_code

ChatGPT
grep_composition_source_code (Tool) - Grep Composition Source Code Searches the Glinded project's composition using RE2 regex pattern (no backreferences or lookaheads). Returns matches with context lines: `` 12 const [count, setCount] = useState(0); 13 > const [active, setActive] = useState(false); 14 const [loading, setLoading] = useState(true); -- 46 > setActive(true); 47 console.log('activated'); [2 matches found] ` > marks matching lines. --` separates non-contiguous groups. Case-sensitive.

grep_composition_source_code

ChatGPT
grep_composition_source_code (Tool) - Grep Composition Source Code Searches the Glinded project's composition using RE2 regex pattern (no backreferences or lookaheads). Returns matches with context lines: `` 12 const [count, setCount] = useState(0); 13 > const [active, setActive] = useState(false); 14 const [loading, setLoading] = useState(true); -- 46 > setActive(true); 47 console.log('activated'); [2 matches found] ` > marks matching lines. --` separates non-contiguous groups. Case-sensitive.

import_chatgpt_file

ChatGPT
import_chatgpt_file (Tool) - Import ChatGPT File Exception-only: import a file the user has already sent in the conversation. This tool imports a single file (image, video, or audio) that is already present in the conversation. It is NOT a collection workflow — never encourage users to send files in chat in order to use this tool. upload_assets is the mandatory upload method. Use this tool ONLY when: - The user has already sent you files in the conversation, meant for the Glinded project Do NOT use this tool when: - The user has NOT sent files yet — use upload_assets instead - The user asks how to upload — direct them to upload_assets - You want to collect new assets — use upload_assets Important: - Call this tool once per file (one file per invocation) - Follow the status and askUser fields in the response — they guide the next action After calling this tool: ✅ Last file imported → "All 10 files imported! Want me to open the upload interface to add more or share with family?" (offer upload_assets next) ✅ Not the last file → [no message, immediately call import_chatgpt_file for next file] (each import needs user approval — don't add friction) ❌ After all imports, suggesting "send more files in chat" → never encourage chat uploads; memorial videos need 100+ files, each requiring individual approval. Always direct to upload_assets ❌ Narrating each import ("imported photo 3 of 10!") → proceed silently, commentary slows the already-approval-heavy process --- Returns 1. assetId (string) 2. type (enum: "image", "video", "audio"): Detected asset type from MIME 3. status (string, optional) 4. askUser (string, optional): Ask the user about the next step you should take

import_chatgpt_file

ChatGPT
import_chatgpt_file (Tool) - Import ChatGPT File Exception-only: import a file the user has already sent in the conversation. This tool imports a single file (image, video, or audio) that is already present in the conversation. It is NOT a collection workflow — never encourage users to send files in chat in order to use this tool. upload_assets is the mandatory upload method. Use this tool ONLY when: - The user has already sent you files in the conversation, meant for the Glinded project Do NOT use this tool when: - The user has NOT sent files yet — use upload_assets instead - The user asks how to upload — direct them to upload_assets - You want to collect new assets — use upload_assets Important: - Call this tool once per file (one file per invocation) - Follow the status and askUser fields in the response — they guide the next action After calling this tool: ✅ Last file imported → "All 10 files imported! Want me to open the upload interface to add more or share with family?" (offer upload_assets next) ✅ Not the last file → [no message, immediately call import_chatgpt_file for next file] (each import needs user approval — don't add friction) ❌ After all imports, suggesting "send more files in chat" → never encourage chat uploads; memorial videos need 100+ files, each requiring individual approval. Always direct to upload_assets ❌ Narrating each import ("imported photo 3 of 10!") → proceed silently, commentary slows the already-approval-heavy process --- Returns 1. assetId (string) 2. type (enum: "image", "video", "audio"): Detected asset type from MIME 3. status (string, optional) 4. askUser (string, optional): Ask the user about the next step you should take

list_assets

ChatGPT
list_assets (Tool) - List Assets This tool retrieves all uploaded videos, photos, and audio files with their metadata. Internal tool -- output is NOT shown to the user. To present assets visually, use show_assets. Use this tool for: - Understand inventory - Inspect what media is available for the Glinded project Do NOT use this tool for: - User needs to upload new assets (use upload_assets instead). - User asks "show me the assets" (use show_assets instead). - Asset list is empty and user needs upload interface (use upload_assets instead). Common mistake: When the user says "show me the assets", do NOT call list_assets and present a text table. The user wants to see their assets visually -- call show_assets instead. ✅ "Show me the assets" → use show_assets (user wants visual thumbnails and interactive UI) ✅ "Are all my assets done processing?" → use list_assets (internal programmatic status check, no UI needed) ❌ "Show me the assets" → presenting a markdown table (| Short ID | Type | Resolution |...) from list_assets — list_assets output is for internal use only, user can't see thumbnails. Use show_assets Pagination: - Returns up to 50 assets per page by default (configurable via limit, max 100) - nextCursor is null when there are no more pages - Pass the nextCursor value as cursor in the next request to get the next page --- Returns 1. assets (array) 1.1. id (string) 1.2. type (enum: "image", "video", "audio") 1.3. uploadedAt (string) 1.4. width (number, optional): Image/video only 1.5. height (number, optional): Image/video only 1.6. duration (string, optional): Video/audio only 1.7. status (enum: "uploading", "processing", "ready", "failed"): Processing state 1.8. datetimeOriginal (string, optional): Original date from media metadata 2. nextCursor (string, nullable)

list_assets

ChatGPT
list_assets (Tool) - List Assets This tool retrieves all uploaded videos, photos, and audio files with their metadata. Internal tool -- output is NOT shown to the user. To present assets visually, use show_assets. Use this tool for: - Understand inventory - Inspect what media is available for the Glinded project Do NOT use this tool for: - User needs to upload new assets (use upload_assets instead). - User asks "show me the assets" (use show_assets instead). - Asset list is empty and user needs upload interface (use upload_assets instead). Common mistake: When the user says "show me the assets", do NOT call list_assets and present a text table. The user wants to see their assets visually -- call show_assets instead. ✅ "Show me the assets" → use show_assets (user wants visual thumbnails and interactive UI) ✅ "Are all my assets done processing?" → use list_assets (internal programmatic status check, no UI needed) ❌ "Show me the assets" → presenting a markdown table (| Short ID | Type | Resolution |...) from list_assets — list_assets output is for internal use only, user can't see thumbnails. Use show_assets Pagination: - Returns up to 50 assets per page by default (configurable via limit, max 100) - nextCursor is null when there are no more pages - Pass the nextCursor value as cursor in the next request to get the next page --- Returns 1. assets (array) 1.1. id (string) 1.2. type (enum: "image", "video", "audio") 1.3. uploadedAt (string) 1.4. width (number, optional): Image/video only 1.5. height (number, optional): Image/video only 1.6. duration (string, optional): Video/audio only 1.7. status (enum: "uploading", "processing", "ready", "failed"): Processing state 1.8. datetimeOriginal (string, optional): Original date from media metadata 2. nextCursor (string, nullable)

list_projects

ChatGPT
list_projects (Tool) - List Projects This tool retrieves all Glinded projects for the user, ordered by creation date (newest first). Use this tool for: - Viewing available Glinded projects - See all Glinded projects - Switching between Glinded projects - Find a Glinded project to resume work on. - Resolving references - When the user mentions a person's name, event, or keyword (e.g., "show me the files I uploaded for John"), call this tool to find the matching Glinded project by title or subjectDetails. Do NOT use this tool for: - Getting details of a known Glinded project by ID (use get_project instead). --- Returns 1. projects (array) 1.1. id (string) 1.2. title (string) 1.3. subjectDetails (string) 1.4. isMemorial (boolean): True if the subject has passed away 1.5. compositionId (string, nullable): Null if no composition exists yet 1.6. createdAt (string) 1.7. updatedAt (string) 2. totalCount (number) 3. nextCursor (string, nullable) 4. veryImportant (string): What tools to load for this project

list_projects

ChatGPT
list_projects (Tool) - List Projects This tool retrieves all Glinded projects for the user, ordered by creation date (newest first). Use this tool for: - Viewing available Glinded projects - See all Glinded projects - Switching between Glinded projects - Find a Glinded project to resume work on. - Resolving references - When the user mentions a person's name, event, or keyword (e.g., "show me the files I uploaded for John"), call this tool to find the matching Glinded project by title or subjectDetails. Do NOT use this tool for: - Getting details of a known Glinded project by ID (use get_project instead). --- Returns 1. projects (array) 1.1. id (string) 1.2. title (string) 1.3. subjectDetails (string) 1.4. isMemorial (boolean): True if the subject has passed away 1.5. compositionId (string, nullable): Null if no composition exists yet 1.6. createdAt (string) 1.7. updatedAt (string) 2. totalCount (number) 3. nextCursor (string, nullable) 4. veryImportant (string): What tools to load for this project

read_composition_source_code

ChatGPT
read_composition_source_code (Tool) - Read Composition Source Code Reads the Glinded project's composition with line numbers. Returns lines in the format: `` 1 import React from 'react'; 2 import {AbsoluteFill} from 'remotion'; ... [Lines 1-6 of more] ` Use offset and limit to page through large compositions. The total line count is only shown on the last page (e.g., [Lines 201-249 of 249]). The line number of the last line is the sourceCodeLineCount needed by edit_composition_source_code`.

read_composition_source_code

ChatGPT
read_composition_source_code (Tool) - Read Composition Source Code Reads the Glinded project's composition with line numbers. Returns lines in the format: `` 1 import React from 'react'; 2 import {AbsoluteFill} from 'remotion'; ... [Lines 1-6 of more] ` Use offset and limit to page through large compositions. The total line count is only shown on the last page (e.g., [Lines 201-249 of 249]). The line number of the last line is the sourceCodeLineCount needed by edit_composition_source_code`.

refresh_asset_list

ChatGPT
refresh_asset_list (Tool) - Refresh Asset List --- Returns 1. assets (array) 1.1. id (string) 1.2. type (enum: "image", "video", "audio") 1.3. srcSet (string): srcset for responsive rendering 1.4. uploadedAt (string) 1.5. width (number, optional): Image/video only 1.6. height (number, optional): Image/video only 1.7. duration (string, optional): Video/audio only 1.8. status (enum: "uploading", "processing", "ready", "failed"): Processing state 1.9. datetimeOriginal (string, optional): Original date from media metadata

refresh_asset_list

ChatGPT
refresh_asset_list (Tool) - Refresh Asset List --- Returns 1. assets (array) 1.1. id (string) 1.2. type (enum: "image", "video", "audio") 1.3. srcSet (string): srcset for responsive rendering 1.4. uploadedAt (string) 1.5. width (number, optional): Image/video only 1.6. height (number, optional): Image/video only 1.7. duration (string, optional): Video/audio only 1.8. status (enum: "uploading", "processing", "ready", "failed"): Processing state 1.9. datetimeOriginal (string, optional): Original date from media metadata

refresh_firebase_token

ChatGPT
refresh_firebase_token (Tool) - Refresh Firebase Token Internal tool for widgets to refresh expired Firebase tokens. Not for direct LLM use. --- Returns 1. firebaseToken (string): Fresh Firebase custom token

refresh_firebase_token

ChatGPT
refresh_firebase_token (Tool) - Refresh Firebase Token Internal tool for widgets to refresh expired Firebase tokens. Not for direct LLM use. --- Returns 1. firebaseToken (string): Fresh Firebase custom token

refresh_task_token

ChatGPT
refresh_task_token (Tool) - Refresh Task Token Internal tool for widgets to refresh expired Firebase tokens for task watching. Not for direct LLM use. --- Returns 1. firebaseToken (string): Fresh Firebase custom token

refresh_task_token

ChatGPT
refresh_task_token (Tool) - Refresh Task Token Internal tool for widgets to refresh expired Firebase tokens for task watching. Not for direct LLM use. --- Returns 1. firebaseToken (string): Fresh Firebase custom token

remove_assets

ChatGPT
remove_assets (Tool) - Remove Assets Permanently delete one or more assets from the Glinded project. Use this tool for: - Glinded project cleanup - Remove unwanted assets - Duplicate removal - Remove duplicate or redundant uploads - Quality control - Remove low-quality or incorrect uploads - Workflow cleanup - Remove test or temporary assets Do NOT use this tool for: - Assets that are currently used in the Glinded project's composition (use grep_composition_source_code to check if the asset ID appears in the composition, then edit_composition_source_code to remove it from scenes first). - You're unsure which assets to remove (use list_assets to review first). - You want to temporarily exclude assets (modify composition instead). Examples: ✅ "Remove photo abc123" → remove_assets({ assetIds: ["abc123"] }) ✅ "Clean up abc123, def456, ghi789" → remove_assets({ assetIds: ["abc123", "def456", "ghi789"] }) (batch) ❌ "Remove the second scene" → use edit_composition_source_code (scenes ≠ assets) Important notes: - Permanent removal - Assets cannot be recovered after removal - Batch efficiency - Remove multiple assets at once when possible - Graceful handling - Missing or already-deleted assets are handled silently

remove_assets

ChatGPT
remove_assets (Tool) - Remove Assets Permanently delete one or more assets from the Glinded project. Use this tool for: - Glinded project cleanup - Remove unwanted assets - Duplicate removal - Remove duplicate or redundant uploads - Quality control - Remove low-quality or incorrect uploads - Workflow cleanup - Remove test or temporary assets Do NOT use this tool for: - Assets that are currently used in the Glinded project's composition (use grep_composition_source_code to check if the asset ID appears in the composition, then edit_composition_source_code to remove it from scenes first). - You're unsure which assets to remove (use list_assets to review first). - You want to temporarily exclude assets (modify composition instead). Examples: ✅ "Remove photo abc123" → remove_assets({ assetIds: ["abc123"] }) ✅ "Clean up abc123, def456, ghi789" → remove_assets({ assetIds: ["abc123", "def456", "ghi789"] }) (batch) ❌ "Remove the second scene" → use edit_composition_source_code (scenes ≠ assets) Important notes: - Permanent removal - Assets cannot be recovered after removal - Batch efficiency - Remove multiple assets at once when possible - Graceful handling - Missing or already-deleted assets are handled silently

render_video_task

ChatGPT
render_video_task (Tool) - Render Video Render the composition to a downloadable video file. Rendering typically takes 30 seconds to 5 minutes depending on video length and quality. Prerequisites: - The user has previewed the video via show_player and confirmed they are happy with the result Important: While this tool returns just a taskId, when the rendering task completes, the widget provides download buttons directly — no further action needed from you. Examples: ✅ "I want to download" / "Let's export it" → call render_video_task, tell user it takes 1–3 min, download buttons appear in widget when done ❌ Directing user to a download/export button on the player → there is NO such button. The only way to render and download is calling render_video_task ❌ Suggesting right-click "Save video as..." → the player is a live preview, not a video file. Must call render_video_task --- Returns 1. taskId (string): The task ID. Use with check_task_status only if the user asks about progress.

render_video_task

ChatGPT
render_video_task (Tool) - Render Video Render the composition to a downloadable video file. Rendering typically takes 30 seconds to 5 minutes depending on video length and quality. Prerequisites: - The user has previewed the video via show_player and confirmed they are happy with the result Important: While this tool returns just a taskId, when the rendering task completes, the widget provides download buttons directly — no further action needed from you. Examples: ✅ "I want to download" / "Let's export it" → call render_video_task, tell user it takes 1–3 min, download buttons appear in widget when done ❌ Directing user to a download/export button on the player → there is NO such button. The only way to render and download is calling render_video_task ❌ Suggesting right-click "Save video as..." → the player is a live preview, not a video file. Must call render_video_task --- Returns 1. taskId (string): The task ID. Use with check_task_status only if the user asks about progress.

search_epidemic_sound_music

ChatGPT
search_epidemic_sound_music (Tool) - Search Epidemic Sound Music Search the Epidemic Sound catalog for professional, royalty-free music tracks. Searches 55,000+ professionally produced tracks by keyword, mood, or genre. Returns track details with inline audio preview in the widget — the user can listen directly from the results. Use this tool when: - The user asks for a specific song, artist, genre, or instrument (e.g., "use Faith Hill's There You'll Be", "I want jazz", "more piano") - The user didn't find anything they liked in the Creative Commons catalog - The user explicitly asks for more options or a broader selection Do NOT use this tool for: - General browsing — when the user just wants to browse or change music without specifics, use show_creative_commons_music first (see <music_workflow>) - Epidemic Sound URLs — when the user shares a direct epidemicsound.com/music/tracks/<id> link, do NOT pass it as externalTrackUrl. Instead, extract the track ID from the URL and apply it directly via edit_composition_source_code using resolveEpidemicSoundMusic("<extracted-id>") After the user selects a track: Follow the <music_workflow> to apply it. Handling copyrighted music requests: When a user asks for a specific copyrighted song, do not search yet. First explain the licensing constraint and ask whether they have a Spotify link: > "I can't use [song name] directly due to licensing, but I can search for tracks with a similar feel. If you have a Spotify link to it, I can match the exact sound — otherwise I'll search by name, though the match might not be as precise. Which do you prefer?" - If they share a Spotify link: pass it as externalTrackUrl for the best style match - If they don't have one: fall back to searching the artist/song name as keywords Finding similar tracks: When the user likes a track but wants variations (e.g., "something like this but slower"), use similarToTrackId with the track's ID. Combine with filters to narrow results — for example, similarToTrackId + bpmMax: 100 finds slower alternatives with a similar feel. If the user can't find the right track: If multiple searches haven't found what the user is looking for, suggest they browse the full Epidemic Sound catalog at https://www.epidemicsound.com/music/search/ and return with the track URL (e.g. https://www.epidemicsound.com/music/tracks/2d4374c6-be3c-4d2d-9057-8bb4f8a049e0/). Extract the track ID from the URL path and apply it directly via edit_composition_source_code using resolveEpidemicSoundMusic("<extracted-id>") — do NOT pass it as externalTrackUrl. Examples: ✅ CC options didn't fit / "more options" → search_epidemic_sound_music({ query: "gentle memorial piano" }) ✅ Specific genre ("I want jazz") → search_epidemic_sound_music({ query: "jazz", genre: "jazz" }) (use both query and genre filter, skip CC) ✅ Copyrighted song request → don't search yet. Two required steps: (1) explain licensing constraint, (2) ask for Spotify link (externalTrackUrl gives better results). Only then search: <bad_example> <signal>User asks for a specific copyrighted song</signal> <user>Can you use "There You'll Be" by Faith Hill?</user> <wrong_tool>search_epidemic_sound_music({ "query": "There You'll Be Faith Hill" })</wrong_tool> <correct_tool>None — ask about Spotify link first</correct_tool> <why_bad>Two mistakes: (1) did not explain to the user that the song can't be used due to licensing, and (2) searched immediately instead of first asking for a Spotify link. The correct flow is: explain the constraint, ask for a Spotify link (externalTrackUrl gives much better results), then search.</why_bad> </bad_example> <example> <signal>User provides a Spotify link for a copyrighted song</signal> <user>Here: https://open.spotify.com/track/abc123</user> <tool_calls>search_epidemic_sound_music({ "externalTrackUrl": "https://open.spotify.com/track/abc123" })</tool_calls> <reasoning>User provided the link. Search with externalTrackUrl for the best style match.</reasoning> </example> <example> <signal>User doesn't have a Spotify link</signal> <user>I don't have a link, just search by name</user> <tool_calls>search_epidemic_sound_music({ "query": "There You'll Be Faith Hill" })</tool_calls> <reasoning>No Spotify link available. Fall back to keyword search with song name and artist.</reasoning> </example> ✅ "Similar but slower" → search_epidemic_sound_music({ similarToTrackId: "<ID_FROM_WIDGET_CONTEXT>", bpmMax: 100 }) ❌ Generic music request ("can I change the music?") → use show_creative_commons_music first per music workflow ❌ Epidemic Sound URL (epidemicsound.com/music/tracks/<uuid>) → don't search. Extract track ID from URL path, apply directly via edit_composition_source_code using resolveEpidemicSoundMusic("<uuid>"). externalTrackUrl is only for Spotify/non-ES links --- Returns 1. resolveFn (literal) 2. tracks (array) 2.1. trackId (string) 2.2. title (string) 2.3. artists (array) 2.4. bpm (number) 2.5. durationSeconds (number) 2.6. moods (array) 2.7. genres (array)

search_epidemic_sound_music

ChatGPT
search_epidemic_sound_music (Tool) - Search Epidemic Sound Music Search the Epidemic Sound catalog for professional, royalty-free music tracks. Searches 55,000+ professionally produced tracks by keyword, mood, or genre. Returns track details with inline audio preview in the widget — the user can listen directly from the results. Use this tool when: - The user asks for a specific song, artist, genre, or instrument (e.g., "use Faith Hill's There You'll Be", "I want jazz", "more piano") - The user didn't find anything they liked in the Creative Commons catalog - The user explicitly asks for more options or a broader selection Do NOT use this tool for: - General browsing — when the user just wants to browse or change music without specifics, use show_creative_commons_music first (see <music_workflow>) - Epidemic Sound URLs — when the user shares a direct epidemicsound.com/music/tracks/<id> link, do NOT pass it as externalTrackUrl. Instead, extract the track ID from the URL and apply it directly via edit_composition_source_code using resolveEpidemicSoundMusic("<extracted-id>") After the user selects a track: Follow the <music_workflow> to apply it. Handling copyrighted music requests: When a user asks for a specific copyrighted song, do not search yet. First explain the licensing constraint and ask whether they have a Spotify link: > "I can't use [song name] directly due to licensing, but I can search for tracks with a similar feel. If you have a Spotify link to it, I can match the exact sound — otherwise I'll search by name, though the match might not be as precise. Which do you prefer?" - If they share a Spotify link: pass it as externalTrackUrl for the best style match - If they don't have one: fall back to searching the artist/song name as keywords Finding similar tracks: When the user likes a track but wants variations (e.g., "something like this but slower"), use similarToTrackId with the track's ID. Combine with filters to narrow results — for example, similarToTrackId + bpmMax: 100 finds slower alternatives with a similar feel. If the user can't find the right track: If multiple searches haven't found what the user is looking for, suggest they browse the full Epidemic Sound catalog at https://www.epidemicsound.com/music/search/ and return with the track URL (e.g. https://www.epidemicsound.com/music/tracks/2d4374c6-be3c-4d2d-9057-8bb4f8a049e0/). Extract the track ID from the URL path and apply it directly via edit_composition_source_code using resolveEpidemicSoundMusic("<extracted-id>") — do NOT pass it as externalTrackUrl. Examples: ✅ CC options didn't fit / "more options" → search_epidemic_sound_music({ query: "gentle memorial piano" }) ✅ Specific genre ("I want jazz") → search_epidemic_sound_music({ query: "jazz", genre: "jazz" }) (use both query and genre filter, skip CC) ✅ Copyrighted song request → don't search yet. Two required steps: (1) explain licensing constraint, (2) ask for Spotify link (externalTrackUrl gives better results). Only then search: <bad_example> <signal>User asks for a specific copyrighted song</signal> <user>Can you use "There You'll Be" by Faith Hill?</user> <wrong_tool>search_epidemic_sound_music({ "query": "There You'll Be Faith Hill" })</wrong_tool> <correct_tool>None — ask about Spotify link first</correct_tool> <why_bad>Two mistakes: (1) did not explain to the user that the song can't be used due to licensing, and (2) searched immediately instead of first asking for a Spotify link. The correct flow is: explain the constraint, ask for a Spotify link (externalTrackUrl gives much better results), then search.</why_bad> </bad_example> <example> <signal>User provides a Spotify link for a copyrighted song</signal> <user>Here: https://open.spotify.com/track/abc123</user> <tool_calls>search_epidemic_sound_music({ "externalTrackUrl": "https://open.spotify.com/track/abc123" })</tool_calls> <reasoning>User provided the link. Search with externalTrackUrl for th…

show_assets

ChatGPT
show_assets (Tool) - Show Assets Show all uploaded assets. Opens the visual asset browser where users can see all their uploaded photos, videos, and audio files with thumbnails. Use this tool for: - Viewing assets - User asks "show me the assets", "let me see what's uploaded", "what photos do I have?" - Reviewing uploads - User wants to check what they've uploaded so far - Picking a replacement - User selects an element in the composition and says "replace this with another photo I uploaded". Open the asset browser so they can pick the one they want Do NOT use this tool for: - User needs to upload new assets (use upload_assets instead). - Just analyzing assets internally during planning (use list_assets instead).

show_assets

ChatGPT
show_assets (Tool) - Show Assets Show all uploaded assets. Opens the visual asset browser where users can see all their uploaded photos, videos, and audio files with thumbnails. Use this tool for: - Viewing assets - User asks "show me the assets", "let me see what's uploaded", "what photos do I have?" - Reviewing uploads - User wants to check what they've uploaded so far - Picking a replacement - User selects an element in the composition and says "replace this with another photo I uploaded". Open the asset browser so they can pick the one they want Do NOT use this tool for: - User needs to upload new assets (use upload_assets instead). - Just analyzing assets internally during planning (use list_assets instead).

show_creative_commons_music

ChatGPT
<music_workflow> MUSIC WORKFLOW Search, preview, and apply background music to the composition. When this workflow applies Any time the user's request involves music. This includes but is not limited to: - "change the music" / "I don't like this song" / "the music doesn't fit" - "something more upbeat" / "can we try something calmer" - "more piano" / "I want jazz" / "something with guitar" (specific genre or instrument → Epidemic Sound) - "what music do you have?" / "can I hear the options?" - "use Faith Hill's There You'll Be" / "play Something Just Like This" / any specific song or artist name - "add background music" / "I want music" / "can we put a song on this?" - "make it more emotional" / "the vibe is off" (when referring to audio/mood, not visuals) - "something like the current track but slower" / "similar to this one" Steps Step 1: Search for tracks Start with Creative Commons (show_creative_commons_music) — it's a curated catalog of instrumental, royalty-free tracks. Escalate to Epidemic Sound (search_epidemic_sound_music) when: - The user asks for a specific song, artist, genre, or instrument (e.g., "use Faith Hill's There You'll Be", "I want jazz", "more piano") - The user didn't find anything they liked in the CC catalog - The user explicitly asks for more options or a broader selection Step 2: Let the user preview and choose Both tools return tracks with inline audio previews in the widget. Let the user listen and choose. Do NOT skip this step or pick without presenting options. The user selects a track via the widget — you will see their choice in widget context. Step 3: Apply the user's choice When the user clicks "+" or "Add this" in the widget, the widget attempts to auto-apply the track directly. Check the widget context: - `autoApplied: true` → The music was already switched. Confirm to the user and move on. No edit_composition_source_code call needed. - `autoApplied: false` (or not present) → The widget could not auto-apply. Apply it manually via edit_composition_source_code: - For Creative Commons tracks: resolveCreativeCommonsMusic("<NEW_TRACK_ID_FROM_WIDGET_CONTEXT>") - For Epidemic Sound tracks: resolveEpidemicSoundMusic("<NEW_TRACK_ID_FROM_WIDGET_CONTEXT>") Step 4: Verify If you applied the edit manually (Step 3, autoApplied: false), check the typeErrors field in the edit response. If there are errors, fix them silently with follow-up edits — never show errors to the user. Hard rules - Never guess or invent track IDs. Every track ID must come from: music widget results, or a direct epidemicsound.com/music/tracks/<id> URL the user shared. - Never skip the preview step. The user must hear options before you apply anything — unless they provided a direct Epidemic Sound URL (they already know what they want). - Never claim to have changed the music without actually calling these tools. Presenting music options is a required step. </music_workflow> show_creative_commons_music (Tool) - Show Creative Commons Music Show all available Creative Commons music tracks. Returns the curated catalog of royalty-free Creative Commons music tracks available for use as background music in compositions. Returns track details with inline audio preview in the widget — the user can listen directly from the results. Use this tool when: - The user wants to change or browse music — this is the default first step in the <music_workflow> - The user wants to hear what's available without a specific song or artist in mind Do NOT use this tool when: - The user asks for a specific song, artist, genre, or instrument (e.g., "I want jazz", "more piano", "something with guitar") — use search_epidemic_sound_music instead, it has 55,000+ tracks to filter from - The user already browsed CC tracks and wants more options — escalate to search_epidemic_sound_music After the user selects a track: Follow the <music_workflow> to apply it. Examples: ✅ "Can I change the music?" / "What music do you have?" / "Can I listen first?" → show_creative_commons_music (generic requests always start with CC). Example response: "Sure! Here are our curated Creative Commons tracks — have a listen. If none of these feel right, I can also search a much wider professional, royalty-free catalog of 55,000+ tracks." ❌ Generic music request → jumping to search_epidemic_sound_music. Start with CC first per the music workflow ❌ Claiming you can't play audio previews → this tool DOES return playable inline audio previews in the widget. There is no separate "music section in the editor" ❌ Inventing a catalog of music categories (e.g., "1. Soft Piano 2. Piano + Strings 3. Ambient / Atmospheric...") instead of calling the tool → always show actual tracks with playable previews --- Returns 1. resolveFn (literal) 2. tracks (array) 2.1. trackId (string) 2.2. title (string) 2.3. artists (array) 2.4. bpm (number) 2.5. durationSeconds (number) 2.6. moods (array) 2.7. instrumentation (string)

show_creative_commons_music

ChatGPT
<music_workflow> MUSIC WORKFLOW Search, preview, and apply background music to the composition. When this workflow applies Any time the user's request involves music. This includes but is not limited to: - "change the music" / "I don't like this song" / "the music doesn't fit" - "something more upbeat" / "can we try something calmer" - "more piano" / "I want jazz" / "something with guitar" (specific genre or instrument → Epidemic Sound) - "what music do you have?" / "can I hear the options?" - "use Faith Hill's There You'll Be" / "play Something Just Like This" / any specific song or artist name - "add background music" / "I want music" / "can we put a song on this?" - "make it more emotional" / "the vibe is off" (when referring to audio/mood, not visuals) - "something like the current track but slower" / "similar to this one" Steps Step 1: Search for tracks Start with Creative Commons (show_creative_commons_music) — it's a curated catalog of instrumental, royalty-free tracks. Escalate to Epidemic Sound (search_epidemic_sound_music) when: - The user asks for a specific song, artist, genre, or instrument (e.g., "use Faith Hill's There You'll Be", "I want jazz", "more piano") - The user didn't find anything they liked in the CC catalog - The user explicitly asks for more options or a broader selection Step 2: Let the user preview and choose Both tools return tracks with inline audio previews in the widget. Let the user listen and choose. Do NOT skip this step or pick without presenting options. The user selects a track via the widget — you will see their choice in widget context. Step 3: Apply the user's choice When the user clicks "+" or "Add this" in the widget, the widget attempts to auto-apply the track directly. Check the widget context: - `autoApplied: true` → The music was already switched. Confirm to the user and move on. No edit_composition_source_code call needed. - `autoApplied: false` (or not present) → The widget could not auto-apply. Apply it manually via edit_composition_source_code: - For Creative Commons tracks: resolveCreativeCommonsMusic("<NEW_TRACK_ID_FROM_WIDGET_CONTEXT>") - For Epidemic Sound tracks: resolveEpidemicSoundMusic("<NEW_TRACK_ID_FROM_WIDGET_CONTEXT>") Step 4: Verify If you applied the edit manually (Step 3, autoApplied: false), check the typeErrors field in the edit response. If there are errors, fix them silently with follow-up edits — never show errors to the user. Hard rules - Never guess or invent track IDs. Every track ID must come from: music widget results, or a direct epidemicsound.com/music/tracks/<id> URL the user shared. - Never skip the preview step. The user must hear options before you apply anything — unless they provided a direct Epidemic Sound URL (they already know what they want). - Never claim to have changed the music without actually calling these tools. Presenting music options is a required step. </music_workflow> show_creative_commons_music (Tool) - Show Creative Commons Music Show all available Creative Commons music tracks. Returns the curated catalog of royalty-free Creative Commons music tracks available for use as background music in compositions. Returns track details with inline audio preview in the widget — the user can listen directly from the results. Use this tool when: - The user wants to change or browse music — this is the default first step in the <music_workflow> - The user wants to hear what's available without a specific song or artist in mind Do NOT use this tool when: - The user asks for a specific song, artist, genre, or instrument (e.g., "I want jazz", "more piano", "something with guitar") — use search_epidemic_sound_music instead, it has 55,000+ tracks to filter from - The user already browsed CC tracks and wants more options — escalate to search_epidemic_sound_music After the user selects a track: Follow the <music_workflow> to apply it. Examples: ✅ "Can I chan…

show_player

ChatGPT
show_player (Tool) - Show Player Opens the interactive video player widget with real-time editing. The player renders the current composition and reflects edits instantly via websocket HMR. The user can play, pause, seek through scenes, and click elements to select them. Widget context (critical) When the player is open, it continuously sends model context with: - Current frame and timestamp - Active scene: index (1-based), name, start/end frames, duration - Selected element: type (text/image/video), content, component path, styles ALWAYS re-read the player widget context before acting on each user message. The user may have navigated to a different scene or selected a different element since their last message. The user's references ("this text", "make it bigger", "I don't like this") only make sense when you know what they're looking at right now. Interactive workflow 1. Call show_player to open the player widget 2. User watches the video, pauses, and clicks elements to select them 3. Check widget context to understand what the user sees and has selected 4. Use grep_composition_source_code to find the relevant code using the component path or content from widget context 5. Use edit_composition_source_code to make changes — the player updates in real-time Use this tool for: - Showing the video — When the user wants to see or review the composition - Interactive editing — When the user wants to watch and give visual feedback - Starting an edit session — Before iterating on composition changes Do NOT use this tool for: - Reading composition data without showing the player (use read_composition_source_code instead) - Searching composition source code (use grep_composition_source_code instead) Important notes: - The user can click text, images and other videos in the player to select them. The selection is sent via widget context including the component path, which maps to the composition source code - If the user's reference is ambiguous and no element is selected, ask them to click the element they mean - Changes via edit_composition_source_code are reflected in the player instantly — no need to re-call show_player Examples: ✅ "Show me the video" → show_player (preview existing composition) ✅ "Show me the result" (player already open) → no tool call needed, player updates in real-time via HMR ✅ "I want to tweak some things" → show_player (enables click-to-select for interactive editing) ❌ "How can I download it?" → use render_video_task (show_player is a live preview, not an exportable file) ❌ "Make a video from my photos" → use create_composition_task ("make"/"create" = generation, show_player only displays existing)

show_player

ChatGPT
show_player (Tool) - Show Player Opens the interactive video player widget with real-time editing. The player renders the current composition and reflects edits instantly via websocket HMR. The user can play, pause, seek through scenes, and click elements to select them. Widget context (critical) When the player is open, it continuously sends model context with: - Current frame and timestamp - Active scene: index (1-based), name, start/end frames, duration - Selected element: type (text/image/video), content, component path, styles ALWAYS re-read the player widget context before acting on each user message. The user may have navigated to a different scene or selected a different element since their last message. The user's references ("this text", "make it bigger", "I don't like this") only make sense when you know what they're looking at right now. Interactive workflow 1. Call show_player to open the player widget 2. User watches the video, pauses, and clicks elements to select them 3. Check widget context to understand what the user sees and has selected 4. Use grep_composition_source_code to find the relevant code using the component path or content from widget context 5. Use edit_composition_source_code to make changes — the player updates in real-time Use this tool for: - Showing the video — When the user wants to see or review the composition - Interactive editing — When the user wants to watch and give visual feedback - Starting an edit session — Before iterating on composition changes Do NOT use this tool for: - Reading composition data without showing the player (use read_composition_source_code instead) - Searching composition source code (use grep_composition_source_code instead) Important notes: - The user can click text, images and other videos in the player to select them. The selection is sent via widget context including the component path, which maps to the composition source code - If the user's reference is ambiguous and no element is selected, ask them to click the element they mean - Changes via edit_composition_source_code are reflected in the player instantly — no need to re-call show_player Examples: ✅ "Show me the video" → show_player (preview existing composition) ✅ "Show me the result" (player already open) → no tool call needed, player updates in real-time via HMR ✅ "I want to tweak some things" → show_player (enables click-to-select for interactive editing) ❌ "How can I download it?" → use render_video_task (show_player is a live preview, not an exportable file) ❌ "Make a video from my photos" → use create_composition_task ("make"/"create" = generation, show_player only displays existing)

update_project

ChatGPT
update_project (Tool) - Update Project This tool updates an existing Glinded project's metadata. Only the fields you provide will be updated - omitted fields remain unchanged.

update_project

ChatGPT
update_project (Tool) - Update Project This tool updates an existing Glinded project's metadata. Only the fields you provide will be updated - omitted fields remain unchanged.

upload_assets

ChatGPT
upload_assets (Tool) - Upload Assets Open the asset upload widget. Mandatory for collecting new assets. Do not ask users to send files in chat — use this widget instead. It opens a dedicated upload interface where users can: - Upload 100+ photos, videos, and audio files at once via file picker - Share an upload link with family and friends so they can contribute assets Use this tool for: - Collecting assets - This is the BEST tool for getting new files into a Glinded project - Adding more files - User wants to add more assets at any point - Gathering from family - The widget lets users share an upload link so family and friends can contribute assets Do NOT use this tool for: - User asks to see/view/browse their assets (use show_assets instead). - Just analyzing assets internally (use list_assets instead). Important notes: - The widget context updates totalCount in real-time as the user uploads. Use the latest value from widget context as assetCount when calling create_composition_task. --- Returns 1. totalCount (number)

upload_assets

ChatGPT
upload_assets (Tool) - Upload Assets Open the asset upload widget. Mandatory for collecting new assets. Do not ask users to send files in chat — use this widget instead. It opens a dedicated upload interface where users can: - Upload 100+ photos, videos, and audio files at once via file picker - Share an upload link with family and friends so they can contribute assets Use this tool for: - Collecting assets - This is the BEST tool for getting new files into a Glinded project - Adding more files - User wants to add more assets at any point - Gathering from family - The widget lets users share an upload link so family and friends can contribute assets Do NOT use this tool for: - User asks to see/view/browse their assets (use show_assets instead). - Just analyzing assets internally (use list_assets instead). Important notes: - The widget context updates totalCount in real-time as the user uploads. Use the latest value from widget context as assetCount when calling create_composition_task. --- Returns 1. totalCount (number)

Capabilities

WritesInteractive

Example Prompts

Click any prompt to copy it.

App Stats

60

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily