Inspiration
Building a product and explaining it well are two different jobs. After creating projects like Roamstead and Habiwatch, we kept repeating the same production work: planning a story, recording screens, writing narration, and editing everything together.
We built Veyframe to make that process easier for founders and marketing teams. It applies agentic AI to a practical media workflow: turning a working website into a video people can understand, without replacing the real product with invented screens.

What it does
Give Veyframe a website URL, a title, and a brief describing what you want to show. Choose a format, then follow the job from research and scripting through recording, narration, and rendering.
- Product Demo: a continuous walkthrough with voiceover and optional smooth zoom.
- Presentation Demo: a roughly two-minute, slide-by-slide story with real product footage.
- Spotlight: a 30-second feature-focused video.
- Short: a 45-second video with layouts for landscape or portrait.
Recordings include visible mouse movement and click feedback. Reusable templates, highlighted captions, and narration make the output consistent. Projects keeps finished videos together; Jobs shows progress and errors; Sources exposes saved research and available generation activity. Users can download an MP4, with optional YouTube upload after Google authorization.
Roughly two-minute Presentation Demo using the Roamstead property-search app:

Roamstead in the portrait Short layout:

How we built it
Veyframe combines a Next.js interface, FastAPI backend, and dedicated media workers.
Parallel Search is called directly through its official Python SDK during research. We send a research objective and targeted queries, restrict results to the product's domain, and save returned URLs, titles, and excerpts. That evidence informs the script; missing results are reported rather than invented.
The backend imports the official client with from parallel import Parallel. Inside our search adapter, this is the actual request:
response = self._client.search(
objective=objective,
search_queries=list(queries),
mode=self.mode,
max_chars_total=MAX_CHARS_TOTAL,
advanced_settings={
"max_results": MAX_RESULTS,
"source_policy": {"include_domains": [domain]},
},
)
SDK import and Search implementation · Where generation calls it and saves research. These are implementation excerpts, not standalone scripts. A resumed job may reuse its saved research.
Gemini and Google ADK turn the brief and evidence into structured slide copy, narration, and direction. Gemini TTS produces the voiceover. Model outputs must pass typed validation before affecting execution.
Our ADK slide director uses tools=[read_research_and_capture_context] and output_schema=SlideScript. After the runner returns, the code checks that the evidence tool was called and validates the result:
if not evidence_reads:
raise ValueError("ADK did not read the saved research before writing")
draft = SlideScript.model_validate_json(final)
ADK agent and evidence tool · Runner and validation · Gemini TTS request.
Playwright records real browser interactions. FFmpeg combines footage, reusable templates, smooth camera motion, audio, and highlighted captions. The runtime never executes model-generated shell commands or arbitrary browser JavaScript.
Capture and template composition · FFmpeg renderer.
A completed Roamstead Short in the running local editor—not a mockup. This shows the output and review interface; the code links above show how the integrations are connected.

Google Cloud Run hosts the web, API, and worker services, with Cloud Tasks, Firestore, Cloud Storage, and Secret Manager supporting jobs, persistence, and credentials. GitHub-connected builds automate deployment. ADK runs inside the API service.

Cloud deployment configuration and instructions · Explore the full source code.
Challenges we ran into
- Matching narration to slide timing without making speech sound rushed or stretched.
- Handling slow-loading websites and provider rate limits.
- Diagnosing long-running cloud jobs and fixing jitter in word-highlighted captions.
Accomplishments that we're proud of
- Connecting research, real browser capture, narration, and rendering across four video formats.
- Making generation progress and failures visible through detailed job updates.
- Publishing an early benchmark comparing selected local timings with clearly labeled manual-production estimates—not a controlled study or guaranteed saving.

What we learned
- A good script is only part of the result; readable footage and natural audio matter just as much.
- AI works best for planning the story, while typed instructions and deterministic rendering keep execution predictable.
- Clear progress updates and recoverable failures are essential when generation takes time.
What's next for Veyframe
- Add presenter support directly to demo mode, combining a person on camera with product footage.
- Add consistent text animations and animated callouts to Presentation Demo.
- Optimize generation time by reusing completed work and reducing unnecessary processing.
- Improve recording reliability across more websites and reuse footage across multiple formats.
Built With
- gemini
- google-cloud
- parallel
- python
- react










Log in or sign up for Devpost to join the conversation.