+
+
+
+ Gameplay review
+
+
+ Import a session, find the clips, draft the post
+
+
+ Load a folder of keyframes from a long session, generate a concise recap, ask
+ follow-up questions, and turn the strongest moments into platform-ready clip metadata.
+
+
+
+
Selected files
+
{selectedFiles.length} file(s)
+
{formatSpoilerMode(form.spoilerMode)}
+
+
+
+
+
+ Game
+ setForm(prev => ({ ...prev, gameId: event.target.value }))}
+ className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 outline-none ring-0 transition focus:border-primary-500"
+ placeholder="Apex Legends"
+ />
+
+
+ Session title
+ setForm(prev => ({ ...prev, sessionTitle: event.target.value }))}
+ className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 outline-none ring-0 transition focus:border-primary-500"
+ placeholder="Ranked climb on Friday night"
+ />
+
+
+ Source label
+ setForm(prev => ({ ...prev, sourceLabel: event.target.value }))}
+ className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 outline-none ring-0 transition focus:border-primary-500"
+ placeholder="/recordings/apex/night-01"
+ />
+
+
+ Spoiler mode
+
+ setForm(prev => ({ ...prev, spoilerMode: event.target.value as SpoilerMode }))
+ }
+ className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 outline-none ring-0 transition focus:border-primary-500">
+ Off
+ Light
+ Full
+
+
+
+ Preset name
+ setForm(prev => ({ ...prev, presetName: event.target.value }))}
+ className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 outline-none ring-0 transition focus:border-primary-500"
+ placeholder="Apex coaching preset"
+ />
+
+
+ Focus areas
+ setForm(prev => ({ ...prev, coachingFocus: event.target.value }))}
+ className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 outline-none ring-0 transition focus:border-primary-500"
+ placeholder="aim, positioning, fight selection"
+ />
+
+
+ Preset notes
+
+
+ Clip platforms
+ setForm(prev => ({ ...prev, platforms: event.target.value }))}
+ className="w-full rounded-xl border border-stone-200 bg-white px-3 py-2 outline-none ring-0 transition focus:border-primary-500"
+ placeholder="twitch,kick,youtube"
+ />
+
+
+
+ setForm(prev => ({ ...prev, audioFeedback: event.target.checked }))
+ }
+ />
+ Enable audio summary notes
+
+
+
+
+
+
+ Choose folder / frames
+
+
+ {importBusy ? 'Importing…' : 'Import and analyze'}
+
+
+ {draftBusy ? 'Drafting…' : 'Refresh clip metadata'}
+
+
+ The core will analyze image frames. For raw video files, point this at extracted
+ keyframes.
+
+
+