Skip to content

Add 82s promo video built with Remotion - #287

Closed
claude-tmgbedu wants to merge 6 commits into
mainfrom
task/promo-video
Closed

claude-tmgbedu wants to merge 6 commits into
mainfrom
task/promo-video

Conversation

@claude-tmgbedu

@claude-tmgbedu claude-tmgbedu commented Oct 19, 2026 •

Copy link
Copy Markdown

Summary

A 93s promo video (1920x1080, 30fps, no voiceover) built with Remotion in promo-video/. It is remade around the current onboarding flow: uvx fastapi-startkit@latest init (or the curl/PowerShell installers), then uv run python artisan db:install. Every snippet and output line on screen is real.

Storyboard: promo-video/SCRIPT.md. ADR: docs/adr/043-promo-video.md, renumbered from 021 (021 is taken on main and 042 is claimed by the validation module). Index row added.

Scenes

# Scene Duration
1 Hook — "Laravel-style productivity for FastAPI" 5s
2 Create a project — install.sh / install.ps1 / uvx fastapi-startkit@latest init 6s
3 Interactive installer — real prompt boxes (directory, services, database, frontend, confirm), the file plan, then "Your application is ready." 13s
4 Application — generated bootstrap/application.py, plus an AppProvider with register/boot 9s
5 Routing — Router + resource() and the seven CRUD routes 8s
6 Database — HasMany/BelongsTo, with_().where().get(), paginate 9s
7 Console — db:install real output, then db:make:migration → db:migrate 12s
8 Cache — CacheConfig, remember, lock, tags 9s
9 AI agents — SupportAgent(Agent) with @provider, tools() and schema() structured output (pydantic OrderStatus), plus fake 8s
10 Frontend — generated HomeController, Jinja Vite/Inertia helpers, fastapi-vite-plugin 8s
11 CTA — uvx fastapi-startkit@latest init, docs and repo links 6s

Where the real output comes from

  • Prompt boxes (src/installer-prompts.json) were recorded by driving installer.prompts.Prompter (color=False, width=64) with scripted keys.
  • Installer plan and summary come from a fastapi-startkit init run with the web service, SQLite and React. The generated bootstrap and controller are the installer's own files.
  • db:install, db:make:migration and db:migrate output is copied from actual runs.
  • Cache and AI snippets were executed against the package. The AI snippet runs against the fake and returns an OrderStatus in structured_response. @max_steps is not shown because the runner never reads it.

Verification

  • npx tsc -p . passes.
  • ffprobe reports h264, 1920x1080, 30/1 and duration=93.000000.
  • ffmpeg blackdetect (d=0.5, pix_th=0.10) found no black segments.
  • I rendered a still for every scene and checked it for overflow and legibility. Fixes I made along the way: disabled ligatures, tightened the box-drawing line height, and resized the Routing, Providers and Frontend cards.

Stills (from the final MP4)

AI agents

Installer
Application
Console
Frontend

Render: cd promo-video && npm install && npm run render -- --concurrency=4 writes out/promo.mp4 (8.2 MB, committed).

🤖 Generated with Claude Code

@claude-tmgbedu

Copy link
Copy Markdown
Author

Review: changes requested

Most of it checks out. Two snippets in the video don't match the code, and the brief says nothing shown should be invented.

Must fix

  1. Routing scene: wrong path parameter (src/scenes.tsx, ACTIONS). The route list shows /organizations/{id}. Router.resource() takes the singular of the resource name as the parameter (name.rstrip("s"), see fastapi/routers/router.py:111), so the real routes are /organizations/{organization} and /organizations/{organization}/edit. Update the four rows.
  2. Artisan scene: migration that doesn't exist (src/scenes.tsx, Artisan). 2026_04_27_145006_create_posts_table isn't in the repo. The real files in example/database-app/databases/migrations/ with that timestamp are create_profiles_table and create_categories_table. It also suggests that db:make:model Post made a migration, which it only does with -m. Either use a real migration name, or run db:make:model Post -m and show the output it actually prints.

Nits (optional)

  • Real migrate output has one space after Migrated: (Migrator.py:151), not two.
  • auth = Router(dependencies=[Depends(auth)]) reuses auth for itself. AGENTS.md uses Depends(auth_middleware).

Verified OK

  • Application(base_path=, providers=[..., (DatabaseProvider, DatabaseConfig), ...]) works, and tuple providers are handled in application.py:91. Provider.register/boot, self.app.bind/make("inertia") and Inertia.share also match the code.
  • env() dataclass config, Config.get, and the Router import and resource(), with the PUT update route.
  • HasMany["..."]/BelongsTo["..."](local_key=, foreign_key=) match the test fixtures. Model.with_, .where().get(), query().paginate(per_page, page) and paginator.result all exist.
  • db:make:model prints Model created: app/Post.py (the default directory is app). The db:migrate Migrating:/Migrated: (Xs) strings match.
  • Inertia.render (sync static), the Jinja vite()/inertia(page) globals, and import fastapi from "fastapi-vite-plugin" match example/inertia-pingcrm-app.
  • 0.66.0 matches pyproject.toml.
  • ADR 021 follows the repo format (Problem, Alternatives, Decision, Implementation, Validation). The index row is correct, and 021 isn't used anywhere else on main.
  • src/ has no comments or docstrings. node_modules/ and out/* are gitignored, with only promo.mp4 whitelisted, and nothing from builds or node_modules is committed.
  • promo-video/ isn't in the uv workspace (members = ["application", "example/*"]). The PR doesn't touch any toml or lock file, and uv sync --dry-run resolves. uv lock --check fails the same way on main, so that's an existing issue and not caused by this PR.
  • MP4: h264, 1920x1080, 30fps, 82.0s, 5.8MB. Frames taken at 3/10/20/30/40/50/60/70/78s all render cleanly and the text is legible.

Once the two fixes are in, re-render and update out/promo.mp4.

@codecov

codecov Bot commented Oct 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@tmgbedu
tmgbedu marked this pull request as draft October 19, 2026 02:51
jobins-bedram and others added 2 commits October 19, 2026 19:05
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tmgbedu and others added 2 commits October 29, 2026 01:42
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eleven scenes, 93s: one-command install (curl, PowerShell, uvx), the
interactive installer with prompt boxes recorded from the real Prompter,
generated bootstrap and providers, routing, ORM, db:install then
db:make:migration and db:migrate, cache, AI agents, Inertia + Vite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@claude-tmgbedu
claude-tmgbedu marked this pull request as ready for review October 29, 2026 08:49
tmgbedu and others added 2 commits October 29, 2026 01:57
…cene

ADR 042 is claimed by the validation module. Agent.max_steps is never
read by the runner, so the AI scene now shows schema() structured output,
verified against the fake.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants