{"agentGuide":"https://glide.29court.com/agent","agentManifest":"https://glide.29court.com/agent.json","app":"https://glide.29court.com/","exports":["mp4 (WebCodecs, offline, includes clip audio)","gif (looping, no audio)"],"limits":["No server API or headless rendering: the app page must be open in a browser-like environment.","MP4 export requires WebCodecs; GIF export does not.","Local media files cannot be uploaded or fetched by the app; clips need a File in the page and relinking after reload.","Share links refuse projects containing images or video clips; move projects as getState() JSON."],"methods":{"addObject":{"returns":"created object; props: x, y, label, text, fill, color, fontSize, w, h, src (data URL, image only)","signature":"addObject(type, props?)"},"addVideoFromFile":{"returns":"clip summaries; file is a File/Blob with a video MIME type","signature":"await addVideoFromFile(file)"},"capabilities":{"returns":"static capability summary","signature":"capabilities()"},"deleteKeyframe":{"returns":"boolean; an object always keeps at least one keyframe","signature":"deleteKeyframe(id, t)"},"deleteObject":{"returns":"boolean; also deletes clips","signature":"deleteObject(id)"},"exportGIF":{"returns":"{ filename, bytes, type, blob, url, frames, audio: false, seconds }","signature":"await exportGIF({ fps?, width?, dither? })"},"exportMP4":{"returns":"{ filename, bytes, type, blob, url, frames, audio, seconds }; throws when WebCodecs encoding is unavailable","signature":"await exportMP4(opts?)"},"getClips":{"returns":"clip summaries without blob URLs","signature":"getClips()"},"getKeyframes":{"returns":"keyframes sorted by t","signature":"getKeyframes(id)"},"getObject":{"returns":"object or clip, or null","signature":"getObject(id)"},"getPlayhead":{"returns":"seconds","signature":"getPlayhead()"},"getState":{"returns":"JSON-safe project { v, name, duration, objects, clips, playhead, playing, selectedId }","signature":"getState()"},"help":{"returns":"{ version, doc, manifest, methods }","signature":"help()"},"lastExportStats":{"returns":"frame-source stats of the last render or null","signature":"lastExportStats()"},"loadProject":{"returns":"new state","signature":"loadProject(projectOrJsonString)"},"newProject":{"destructive":"replaces current project in the editor (undoable)","returns":"new state","signature":"newProject({ name?, duration? })"},"openExportPanel":{"returns":"true when the human export dialog opened","signature":"openExportPanel()"},"pause":{"returns":"false","signature":"pause()"},"play":{"returns":"true","signature":"play()"},"ready":{"returns":"capabilities plus live WebCodecs support","signature":"await ready()"},"sampleAt":{"returns":"interpolated transform { t, x, y, scale, rotation, opacity, easing } or null","signature":"sampleAt(id, t)"},"select":{"returns":"selected id","signature":"select(idOrNull)"},"setDuration":{"returns":"state","signature":"setDuration(seconds)"},"setKeyframe":{"returns":"the keyframe written; transform: any of x, y, scale, rotation, opacity, easing; omitted fields keep the object's value at t","signature":"setKeyframe(id, t, transform)"},"setName":{"returns":"state","signature":"setName(name)"},"setPlayhead":{"returns":"clamped playhead time","signature":"setPlayhead(t)"},"stop":{"returns":"0","signature":"stop()"},"updateObject":{"returns":"updated object; props: label, text, fill, color, fontSize, w, h, src","signature":"updateObject(id, props)"}},"model":{"clips":"Video clips stream from a local File via blob URL; never uploaded, never read into memory. After reload they keep trims/keyframes but must be relinked by passing the same File to addVideoFromFile.","keyframe":{"easing":"linear | easeIn | easeOut | easeInOut (applies to the segment starting at this keyframe)","opacity":"0..100","rotation":"degrees","scale":"number, 1 = base size","t":"seconds","x":"number","y":"number"},"objectFields":["id","type","label","w","h","fill","text","fontSize","color","src","keys"],"objectTypes":["rect","ellipse","text","image"],"project":{"clips":"array (magnetic timeline)","duration":"seconds, 2..1800, default 8","name":"string","objects":"array"},"stage":{"coordinates":"object x/y are center coordinates in stage pixels","height":720,"width":1280}},"name":"Glide","surface":{"global":"window.GlideAgent","kind":"in-page-javascript","notes":"The editor runs entirely in the browser. Open the app page in a browser-like environment, wait for window.GlideAgent (or the glide-agent-ready event), then call its methods. There is no REST API, webhook, or account.","readyEvent":"glide-agent-ready","server":null},"tagline":"Video editing without keyframes. Just move things.","version":"1.0.0"}