App Name:
Memories Video Editor - Empowering your favorite ChatGPT to craft family slideshows and tributes
Tools for preserving memories 
What it does:
The Memories Video Editor lets users (and their families) collaboratively create memorial and celebration videos - like tributes for a loved one - directly through ChatGPT.
It provides a secure, high-fidelity way to upload and manage real family assets (photos, videos, audio clips), preserving their original quality. Family members can upload through short-lived, shareable links, and GPT can then analyze the media, help storyboard the narrative, and instruct our rendering engine to produce the final video.
We focus on authentic storytelling, using real memories rather than AI-generated imagery, while still taking advantage of ChatGPT’s creative scripting and structuring capabilities.
How it’s built:
-
Firestore for database and session state
-
Google Cloud Functions for API / MCP / rendering pipeline
-
Next.js for in-ChatGPT widgets UI (with some tweaks for proper SDK interop. happy to share tips!)
-
TypeScript end-to-end
-
Zod v4 for strict schema validation (APIs, webhooks)
-
Vitest for automated testing
Interesting patterns:
The challenge is enabling agentic, multi-step workflows inside ChatGPT. A typical family slideshow involves:
-
Uploading 50+ assets (images, clips, audio) - often collected from multiple family members.
- We provide secure, Dropbox-like upload links that preserve original quality.
-
Analyzing each asset (including video) to produce raw metadata and actual content descriptions.
-
Collaboratively building a visual storyboard with GPT - our widgets show thumbnails inline so the AI and user can iterate together.
-
Generating a full processing instruction set for the renderer, blending narrative, assets, and transitions into a final shareable tribute.
It’s a very human workflow - emotional, creative, multi-asset - and the Apps SDK has been a great foundation for bridging GPT’s intelligence with our backend.
Screenshots / Demo:
We build in public - posting weekly updates and demos on X Memories Video Editor
Feedback for the Apps SDK / ChatGPT Teams
Agentic Tool Discovery (Decision Framework)
We found a significant opportunity to improve how ChatGPT decides when to explore api_tool capabilities.
When a user says something like:
“I want to build a tribute video for my grandmother.”
ChatGPT typically assumes a text-based creative task and doesn’t explore domain tools - even though a specialized suite like Memories Video Editor exists.
Because users don’t know these tools exist, ChatGPT never discovers them unless explicitly instructed. This means even the most relevant, purpose-built SDK integrations go unused.
Suggested improvement:
-
Add a lightweight auto-discovery step whenever a user’s request involves media, uploads, or creative assembly.
-
ChatGPT could run api_tool.list_resources silently or semi-explicitly, then mention:
“I found a tool that might help with this. Would you like to use it?”
This small change would unlock huge potential for multi-modal apps like ours and make new SDK tools discoverable without requiring insider knowledge.
We’ve been coaching people to say things like:
“Please explore your available tools (including api_tool) before choosing how to help.”
…but ideally, ChatGPT shouldn’t need prompting for that.
Structured Schema Propagation
Another minor but impactful gap: the SDK’s transformation from app-defined schemas → internal api_tool instructions currently loses output type fidelity.
Example:
'create_or_extend_upload_url',
{
description: `Create a new upload URL or extend an existing one...`,
inputSchema: {
hoursToAdd: z.number().optional().default(24).describe('Hours to add to expiration'),
},
outputSchema: {
url: z.string().describe('The upload URL that can be shared'),
sessionId: z.string().describe('The upload session ID'),
expiresAt: z.string().describe('ISO 8601 timestamp of when the URL expires'),
},
}
gets transformed to:
// Create a new upload URL or extend an existing one...
type /Memories Video Editor/.../create_or_extend_upload_url = (_: {
// Hours to add to the expiration
hoursToAdd?: number, // default: 24
}) => any;
The outputSchema is well-defined, but the api_tool type still renders the return as any.
Suggestion: propagate outputSchema types just like inputSchema.
This would preserve type safety, improve SDK-generated docs, and reduce manual duplication in tool descriptions.