← Back to all apps

Glinded for Memorial Videos

Lifestyleby Glinded, Inc.
Launched Mar 5, 2026 on ChatGPT

Upload your photos and videos, and Glinded turns them into a finished memorial video with music, transitions, and text overlays. Just describe what you want — no editing skills needed.

Every video comes with licensed music your funeral home can actually play. Choose from thousands of professional tracks or our Creative Commons catalog.

Works for funeral slideshows, remembrance videos, and honoring beloved pets.

30ChatGPT Tools
Glinded, Inc.Developer
LifestyleCategory

Available Tools

Check Task Status

check_task_status
Full Description

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)

Parameters (2 required)
Required
projectIdstring
taskIdstring

Clear Composition

clear_composition
Full Description

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:
<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>
Parameters (2 required)
Required
projectIdstring
userRequestedFullRedostring

You must pass this exact confirmation string. Only do so if the user explicitly asked to start over. If they asked for edits (duration, music, pacing, scenes, etc.), use edit_composition_source_code instead.

Create Composition

create_composition_task
Full Description

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 — a gentle remembrance (slow, peaceful, solemn), a heartfelt tribute (warm, emotional, bittersweet), or a celebration of life (lively, joyful, upbeat)?"

  • 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.

Parameters (4 required, 1 optional)
Required
assetCountinteger

How many assets are in the project. Must match the actual count.

orientationstring

Video orientation. Ask the user before calling this tool — wrong orientation wastes ~10 minutes. "portrait" for mobile/vertical (WhatsApp, Instagram), "landscape" for TV/laptop/horizontal.

Options:landscapeportrait
projectIdstring
subjectDetailsChecklistarray

List which subject details you've verified are saved in the project's subjectDetails (via create_project or update_project).

Optional
narrativeDirectionstring

What this specific video should focus on — from the user's own words. Ask the user before calling this tool. Examples: tone (solemn vs celebratory), narrative focus ("her cooking and recipes"), music preferences, or any specific requests. Omit only if the user explicitly said they have no preference.

Create Project

create_project
Full Description

<toolkit_overview>

Glinded

  • MEMORIES VIDEO EDITOR

Version: 1.0.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

Parameters (4 required)
Required
existingFilesinteger

How many relevant files (images, videos, audio) the user has already sent in this conversation. Count them before calling this tool.

isMemorialboolean

Set to true if the subject (person or pet) has passed away. Set to false otherwise.

subjectDetailsstring

Details about the subject (person or pet) that persist across compositions (e.g., "Maria, born 1935, passed 2025. Grandmother.")

titlestring

Human-readable Glinded project name (e.g., "Grandma Maria's Memorial")

Create Upload URL

create_upload_url
Full Description

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

Parameters (1 required, 2 optional)
Required
projectIdstring
Optional
hoursToAddnumber

Hours until expiration

Default: 24
shareableboolean

Whether this session appears in get_active_upload_url. Set to false for one-time use URLs (e.g. Dropbox/Google Drive imports).

Default: True

Delete Project

delete_project
Full Description

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.

Parameters (1 required)
Required
projectIdstring

Delete Upload URL

delete_upload_url
Full Description

delete_upload_url (Tool)

  • Delete Upload URL
Parameters (1 required, 1 optional)
Required
projectIdstring
Optional
sessionIdstring

The session ID to delete. If not provided, deletes the active session.

Discover Composition Packages

discover_composition_packages
Full Description

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).

Parameters (0 required, 2 optional)
Optional
packagestring

Package name to query subpath exports. Omit to list all available packages with versions.

querystring

Optional search filter to match subpath names (e.g. "serif", "fade").

Edit Composition Source Code

edit_composition_source_code
Full Description

<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.

<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:

// 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:

// 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:

// 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.

Parameters (6 required, 1 optional)
Required
compositionIdstring
newStringstring

The replacement text. Use 2-space indentation, not tabs. Tabs will be rejected.

oldStringstring

The exact text to find and replace. Use 2-space indentation, not tabs.

playerWidgetContextChecklistarray

What the user selected in the LATEST player widget context. Re-read the player widget context before acting on every user message — it changes as the user navigates and selects different elements.

projectIdstring
sourceCodeLineCountinteger

Total lines in the composition. Read the full source via read_composition_source_code to get this value.

Optional
replaceAllboolean

Replace all occurrences instead of requiring a unique match.

Default: False

Extend Upload URL

extend_upload_url
Full Description

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

Parameters (1 required, 1 optional)
Required
projectIdstring
Optional
hoursToAddnumber

Hours to add to the current expiration

Default: 24

Get Active Upload URL

get_active_upload_url
Full Description

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

Parameters (1 required)
Required
projectIdstring

Get Download URL

get_download_url
Full Description

get_download_url (Tool)

  • Get Download URL

Returns

1. downloadUrl (string): Signed URL for downloading the rendered video

Parameters (2 required)
Required
compositionIdstring
projectIdstring

Get Project

get_project
Full Description

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

Parameters (1 required)
Required
projectIdstring

Get Uploadcare Assets

get_uploadcare_assets
Full Description

get_uploadcare_assets (Tool)

  • Get Uploadcare Assets

Returns

1. results (array)

Parameters (2 required)
Required
projectIdstring
uuidsarray

Grep Composition Source Code

grep_composition_source_code
Full Description

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.

Parameters (3 required, 1 optional)
Required
compositionIdstring
patternstring

RE2 regular expression pattern (case-sensitive) (no backreferences or lookaheads).

projectIdstring
Optional
contextinteger

Number of context lines before and after each match.

Default: 3

Import ChatGPT File

import_chatgpt_file
Full Description

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

Parameters (4 required)
Required
currentFileNumberinteger

Which file is this? (e.g., 1 for the first file, 2 for the second, etc.)

fileobject
projectIdstring
totalFilesinteger

Total number of files the user sent that need to be imported

List Assets

list_assets
Full Description

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. 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", "ready"): Processing state 1.9. datetimeOriginal (string, optional): Original date from media metadata 2. nextCursor (string, nullable)

Parameters (1 required, 3 optional)
Required
projectIdstring
Optional
cursorstring

Cursor from a previous list_assets response to get the next page. Omit for the first page.

limitinteger

Maximum number of assets to return per page.

Default: 50
sortstring

Sort order for assets. "newest" shows most recently uploaded assets first, "oldest" shows earliest uploaded assets first

Options:newestoldest
Default: newest

List Projects

list_projects
Full Description

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

Parameters (0 required, 2 optional)
Optional
cursorstring

Cursor from a previous list_projects response to get the next page. Omit for the first page.

sortstring

Sort order for projects. "newest" shows most recently created projects first, "oldest" shows earliest created projects first

Options:newestoldest
Default: newest

Read Composition Source Code

read_composition_source_code
Full Description

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.

Parameters (2 required, 2 optional)
Required
compositionIdstring
projectIdstring
Optional
limitinteger

Maximum number of lines to return.

Default: 750
offsetinteger

1-based line number to start reading from.

Default: 1

Refresh Asset List

refresh_asset_list
Full Description

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", "ready"): Processing state 1.9. datetimeOriginal (string, optional): Original date from media metadata

Parameters (1 required)
Required
projectIdstring

Refresh Firebase Token

refresh_firebase_token
Full Description

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

Parameters (2 required)
Required
compositionIdstring
projectIdstring

Refresh Task Token

refresh_task_token
Full Description

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

Parameters (2 required)
Required
projectIdstring
taskIdstring

Remove Assets

remove_assets
Full Description

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
Parameters (2 required)
Required
assetIdsarray

Array of asset IDs to remove. Get asset IDs from list_assets tool.

projectIdstring

Render Video

render_video_task
Full Description

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.

Parameters (2 required, 2 optional)
Required
compositionIdstring
projectIdstring
Optional
fpsinteger

Frames per second. Do not change unless the user explicitly requests it.

Default: 30
qualitystring

Render quality. "720p" (HD, good for mobile), "1080p" (Full HD, good for TV / laptops), "4k" (4K, larger file and longer render -- may show upscaling artifacts if source photos are small).

Options:720p1080p4k
Default: 1080p

Search Epidemic Sound Music

search_epidemic_sound_music
Full Description

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)

Parameters (2 required, 14 optional)
Required
compositionIdstring
projectIdstring
Optional
bpmMaxinteger

Maximum BPM filter.

bpmMininteger

Minimum BPM filter.

durationMaxSecondsinteger

Maximum track duration in seconds. Useful for matching video length.

durationMinSecondsinteger

Minimum track duration in seconds.

externalTrackUrlstring

Spotify URL (e.g. https://open.spotify.com/track/...). When provided, finds Epidemic Sound tracks that sound similar.

genrestring

Filter by genre/taxonomy slug (e.g., "classical", "ambient", "folk", "orchestral").

limitinteger

Maximum number of tracks to return

Default: 10
moodstring

Filter by mood slug (e.g., "calm", "uplifting", "melancholic", "sad").

querystring

Search by keywords, artist name, or song title. Provide either query or topic, not both.

similarToTrackIdstring

Epidemic Sound track ID from previous search results. When provided, finds tracks that sound similar. Combine with filters (bpm, mood, genre) to narrow results.

sortBystring

Sort results by this field (default: relevance).

Options:relevancepopularitydatedurationtitlebpm
Default: relevance
sortOrderstring

Sort order (default: descending).

Options:ascendingdescending
Default: descending
topicstring

Search by semantic topic (e.g., "memorial", "wedding", "nature documentary"). Provide either query or topic, not both.

vocalsboolean

Filter by vocals. Set to false for instrumental-only tracks.

Show Assets

show_assets
Full Description

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).
Parameters (1 required)
Required
projectIdstring

Show Creative Commons Music

show_creative_commons_music
Full Description

<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)

Parameters (2 required)
Required
compositionIdstring
projectIdstring

Show Player

show_player
Full Description

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)

Parameters (2 required)
Required
compositionIdstring
projectIdstring

Update Project

update_project
Full Description

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.

Parameters (1 required, 3 optional)
Required
projectIdstring
Optional
isMemorialboolean

True if the subject (person or pet) has passed away. False otherwise.

subjectDetailsstring

Updated details about the subject (person or pet)

titlestring

New title for the Glinded project

Upload Assets

upload_assets
Full Description

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)

Parameters (1 required)
Required
projectIdstring