<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dominik Oswald</title>
    <description>The latest articles on DEV Community by Dominik Oswald (@d-oit).</description>
    <link>https://dev.to/d-oit</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F384915%2F870da9b2-b54e-4020-9934-144149653cec.jpg</url>
      <title>DEV Community: Dominik Oswald</title>
      <link>https://dev.to/d-oit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/d-oit"/>
    <language>en</language>
    <item>
      <title>GitHub rust-2026-template — my Rust starter in 2026</title>
      <dc:creator>Dominik Oswald</dc:creator>
      <pubDate>Sun, 24 May 2026 16:37:12 +0000</pubDate>
      <link>https://dev.to/d-oit/github-rust-2026-template-my-rust-starter-in-2026-20b5</link>
      <guid>https://dev.to/d-oit/github-rust-2026-template-my-rust-starter-in-2026-20b5</guid>
      <description>&lt;p&gt;I got tired of setting up the same things every new Rust project. Clippy config, CI pipelines, linker flags, pre-commit hooks, &lt;code&gt;cargo-nextest&lt;/code&gt;... all from scratch, every time. And then doing it &lt;em&gt;again&lt;/em&gt; every time I switched AI coding tools — re-explaining the project structure, the lint rules, what's off-limits.&lt;/p&gt;

&lt;p&gt;So I built rust-2026-template. Click "Use this template", point your agent at it, and you're coding — not configuring.&lt;/p&gt;

&lt;p&gt;Version &lt;strong&gt;0.3.2&lt;/strong&gt; is the current release. Here's what's in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup I always end up with anyway
&lt;/h2&gt;

&lt;p&gt;Rust 2024 edition, MSRV &lt;strong&gt;1.88&lt;/strong&gt; pinned via &lt;code&gt;rust-toolchain.toml&lt;/code&gt;. Workspace layout from day one with resolver &lt;code&gt;"3"&lt;/code&gt; — even for small projects. Refactoring a single-crate project into a workspace later is just pain you don't need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crates/
  example-crate/
  sample-app/
  actor-runtime-template/
  checkpoint-template/
  hybrid-storage-template/
  mcp-server-template/
  example-registry-pattern/
  example-storage-pattern/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rename those, done. The crates cover patterns you'll want anyway: actor runtime, checkpointing, MCP server, storage backends.&lt;/p&gt;

&lt;h2&gt;
  
  
  One script, full quality gate
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;./scripts/quality-gates.sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This runs &lt;code&gt;fmt&lt;/code&gt;, &lt;code&gt;clippy&lt;/code&gt;, &lt;code&gt;cargo nextest&lt;/code&gt;, &lt;code&gt;cargo audit&lt;/code&gt;, &lt;code&gt;cargo deny&lt;/code&gt;, and optionally &lt;code&gt;cargo mutants&lt;/code&gt;. Same thing CI runs. I run it before every commit so there are no surprises.&lt;/p&gt;

&lt;p&gt;There's also a &lt;code&gt;Makefile&lt;/code&gt; for common tasks if you prefer that over the shell script.&lt;/p&gt;

&lt;p&gt;The Clippy setup is worth calling out: the workspace &lt;code&gt;Cargo.toml&lt;/code&gt; starts with &lt;code&gt;pedantic = "allow"&lt;/code&gt; and then &lt;em&gt;selectively promotes&lt;/em&gt; specific lints to &lt;code&gt;warn&lt;/code&gt;. Things like &lt;code&gt;float_cmp&lt;/code&gt;, &lt;code&gt;cast_possible_truncation&lt;/code&gt;, &lt;code&gt;redundant_clone&lt;/code&gt;, and &lt;code&gt;missing_const_for_fn&lt;/code&gt; — correctness signals and free compile-time wins — are turned on. Template ergonomics like &lt;code&gt;unwrap_used&lt;/code&gt;, &lt;code&gt;panic&lt;/code&gt;, &lt;code&gt;too_many_arguments&lt;/code&gt; stay allowed so you're not fighting the linter while scaffolding. You adjust as your project matures.&lt;/p&gt;

&lt;p&gt;Mutation testing with &lt;code&gt;cargo-mutants&lt;/code&gt; is the one I'd push people to try — it tells you whether your tests actually catch bugs or just touch code. Very different things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security defaults, not an afterthought
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;deny.toml&lt;/code&gt; — license policy and banned crates&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.gitleaks.toml&lt;/code&gt; — secret scanning before anything gets committed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; — hooks run locally, not just in CI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.shellcheckrc&lt;/code&gt; — shell script quality gate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SECURITY.md&lt;/code&gt; — vulnerability reporting process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is that you never have to remember to do this. It just happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI agents work out of the box
&lt;/h2&gt;

&lt;p&gt;This is the part I use the most now. Every AI coding tool needs project context — and they all want it in a slightly different place. Instead of re-explaining conventions every session, it's all checked in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agents/            — skill definitions per agent + cross-repo context
  context/          — context files for repositories derived from this template
  skills/           — executable task knowledge and canonical workflows
.claude/            — Claude Code config
.cursor/            — Cursor rules
.gemini/            — Gemini CLI config
.mimocode/          — Mimocode config
.opencode/          — OpenCode config
.qwen/              — Qwen CLI config
.windsurf/          — Windsurf config
agents-docs/        — detailed documentation for AI agents
AGENTS.md           — canonical project rules, read by every agent
llms.txt            — machine-readable project overview
llms-full.txt       — complete source context for deep analysis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; is the key file. It tells any agent: the workspace layout, the lint rules, commit conventions, and what to never touch. You switch from Claude Code to Codex to OpenCode mid-project — they all read the same rules. No re-onboarding.&lt;/p&gt;

&lt;p&gt;The template uses a &lt;strong&gt;layered documentation strategy&lt;/strong&gt; that makes the audience explicit:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;File / Directory&lt;/th&gt;
&lt;th&gt;Audience&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Human Onboarding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;QUICKSTART.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Humans&lt;/td&gt;
&lt;td&gt;High-level overview and setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent Contract&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AI Agents&lt;/td&gt;
&lt;td&gt;Canonical rules (SSOT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reusable Procedures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.agents/skills/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AI Agents&lt;/td&gt;
&lt;td&gt;Step-by-step executable task knowledge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tool Adapters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;.cursorrules&lt;/code&gt;, etc.&lt;/td&gt;
&lt;td&gt;Specific Tools&lt;/td&gt;
&lt;td&gt;Tool-specific deltas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;.agents/context/&lt;/code&gt; carries cross-repo context for projects that derive from the template. When you fork this and build on top of it, agents in the child repo can still pull structured knowledge about the base template's conventions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;llms-full.txt&lt;/code&gt; is auto-generated and contains the full source context for agents that need deep analysis. Regenerate both after significant architectural changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash scripts/generate-llms-txt.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you start a new project from this template, you can also just hand the repo URL directly to your agent as context:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use github.com/d-oit/rust-2026-template as the reference for this project."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It'll pick up the structure, the tooling choices, and the conventions without you writing a single prompt about them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance defaults you forget to add
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;.cargo/config.toml&lt;/code&gt; sets the &lt;code&gt;mold&lt;/code&gt; linker. One line, noticeably faster incremental builds. The dev profile is tuned to avoid the "my debug build takes forever" problem.&lt;/p&gt;

&lt;p&gt;The release profile sets &lt;code&gt;lto = "fat"&lt;/code&gt;, &lt;code&gt;codegen-units = 1&lt;/code&gt;, and &lt;code&gt;strip = "symbols"&lt;/code&gt; — maximum runtime performance. There's also a &lt;code&gt;release-full&lt;/code&gt; alias for backward compatibility and a &lt;code&gt;bench&lt;/code&gt; profile with &lt;code&gt;debug = true&lt;/code&gt; so Criterion can produce symbol-annotated flamegraphs.&lt;/p&gt;

&lt;p&gt;Nix users get &lt;code&gt;flake.nix&lt;/code&gt; with &lt;code&gt;clang&lt;/code&gt; and &lt;code&gt;mold&lt;/code&gt; in the devShell, plus &lt;code&gt;.envrc&lt;/code&gt; for direnv/nix-direnv integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;benchmarks/&lt;/code&gt; workspace crate contains all Criterion harnesses under &lt;code&gt;benchmarks/benches/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;end_to_end.rs&lt;/code&gt; — end-to-end throughput scenarios&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;memory_usage.rs&lt;/code&gt; — allocation and memory pressure scenarios&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sanitization_bench.rs&lt;/code&gt; — input sanitization pipeline benchmarks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also includes a &lt;code&gt;benchmarks/events/&lt;/code&gt; directory and &lt;code&gt;benchmarks/history.jsonl&lt;/code&gt; for tracking benchmark results over time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo bench &lt;span class="nt"&gt;-p&lt;/span&gt; benchmarks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;fuzz&lt;/code&gt; crate is &lt;em&gt;excluded&lt;/em&gt; from the workspace (&lt;code&gt;exclude = ["fuzz"]&lt;/code&gt; in &lt;code&gt;Cargo.toml&lt;/code&gt;) so it doesn't affect normal builds. The CI pipeline compile-checks benchmarks on every PR so they never silently break.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fuzz Testing
&lt;/h2&gt;

&lt;p&gt;A fuzz testing scaffold is included using &lt;code&gt;cargo-fuzz&lt;/code&gt; with one target: &lt;code&gt;fuzz_parse_input&lt;/code&gt; (in &lt;code&gt;fuzz/fuzz_targets/&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install cargo-fuzz (nightly required)&lt;/span&gt;
cargo &lt;span class="nb"&gt;install &lt;/span&gt;cargo-fuzz

&lt;span class="c"&gt;# Run the fuzz target&lt;/span&gt;
cargo fuzz run fuzz_parse_input &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;-max_total_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fuzzer runs weekly via GitHub Actions (&lt;code&gt;fuzz.yml&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature Flags
&lt;/h2&gt;

&lt;p&gt;All features are &lt;strong&gt;opt-in&lt;/strong&gt; (&lt;code&gt;default = []&lt;/code&gt;). Enable what you need:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CLI binary support (clap, anyhow, colored)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;persistence&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SQL persistence backend (libsql)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;parallel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CPU parallelism via rayon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wasm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WASM build target support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MCP server support (requires &lt;code&gt;cli&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tracing-json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON tracing output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tracing-opentelemetry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenTelemetry tracing backend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: &lt;code&gt;mcp&lt;/code&gt; has a declared dependency on &lt;code&gt;cli&lt;/code&gt; in the feature graph — enabling &lt;code&gt;mcp&lt;/code&gt; automatically enables &lt;code&gt;cli&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime Configuration
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;config/profiles/&lt;/code&gt; directory carries environment-specific JSON configuration files (&lt;code&gt;default.json&lt;/code&gt; and others). The &lt;code&gt;schema/&lt;/code&gt; directory holds JSON Schema definitions for config and API contracts — keeps your config validated and agent-readable from day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  VERSION file
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;VERSION&lt;/code&gt; file at the repo root is the plain-text single source of truth for tooling that can't parse TOML. The CI pipeline verifies &lt;code&gt;VERSION&lt;/code&gt; matches &lt;code&gt;Cargo.toml&lt;/code&gt; on every push to main — no more version drift.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;VERSION&lt;/code&gt; tracks the generated project's starter version; &lt;code&gt;.template/CHANGELOG-TEMPLATE.md&lt;/code&gt; tracks internal template evolution separately (see issue #135).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  GitHub Actions workflows
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ci.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PR / push&lt;/td&gt;
&lt;td&gt;Format, Clippy, tests, audit, deny, bench compile-check, VERSION check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mutants.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Periodic&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cargo-mutants&lt;/code&gt; mutation testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fuzz.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cargo-fuzz&lt;/code&gt; fuzzing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;release.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tag push&lt;/td&gt;
&lt;td&gt;cargo-dist release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;patch-release-on-label.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PR label&lt;/td&gt;
&lt;td&gt;Automated patch releases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hotfix.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Hotfix branch workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dora-fdrt.yml&lt;/code&gt; / &lt;code&gt;dora-report.yml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Events&lt;/td&gt;
&lt;td&gt;DORA metrics tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs-check.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PR&lt;/td&gt;
&lt;td&gt;Documentation build check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sync-labels.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;Issue label sync&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Release engineering
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dist-workspace.toml&lt;/code&gt; + &lt;code&gt;release.toml&lt;/code&gt; for &lt;code&gt;cargo-dist&lt;/code&gt; automated releases&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cliff.toml&lt;/code&gt; for git-cliff changelog generation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MIGRATION.md&lt;/code&gt; for upgrade guidance between template versions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docflow.json&lt;/code&gt; and &lt;code&gt;opencode.json&lt;/code&gt; for AI-assisted doc and code workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code quality integrations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Codecov&lt;/strong&gt; (&lt;code&gt;.codecov.yml&lt;/code&gt;) — coverage gate enforcement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codacy&lt;/strong&gt; (&lt;code&gt;.codacy.yml&lt;/code&gt; + &lt;code&gt;.codacy/&lt;/code&gt;) — static analysis with agent review configs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;commitlint&lt;/strong&gt; (&lt;code&gt;commitlint.config.cjs&lt;/code&gt;) — conventional commits enforced&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;yamllint&lt;/strong&gt; (&lt;code&gt;.yamllint.yml&lt;/code&gt;) — YAML quality gate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;markdownlint&lt;/strong&gt; (&lt;code&gt;.markdownlint-cli2.jsonc&lt;/code&gt;) — Markdown quality gate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Output Artifacts
&lt;/h2&gt;

&lt;p&gt;Generated output goes to predictable, git-ignored locations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;reports/&lt;/code&gt;&lt;/strong&gt; — HTML reports for coverage, audit, benchmarks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.agents/ci/&lt;/code&gt;&lt;/strong&gt; — CI health artifacts (&lt;code&gt;ci-status.json&lt;/code&gt;, &lt;code&gt;ci-summary.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;analysis/&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;plans/&lt;/code&gt;&lt;/strong&gt; — agent working directories&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Hit &lt;strong&gt;"Use this template"&lt;/strong&gt; on GitHub — or tell your agent: use &lt;code&gt;github.com/d-oit/rust-2026-template&lt;/code&gt; as the reference for this project&lt;/li&gt;
&lt;li&gt;Follow &lt;code&gt;QUICKSTART.md&lt;/code&gt; — rename the crates, update &lt;code&gt;Cargo.toml&lt;/code&gt; metadata&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;./scripts/quality-gates.sh&lt;/code&gt; once locally&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MIT licensed. PRs welcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://github.com/d-oit/rust-2026-template" rel="noopener noreferrer"&gt;github.com/d-oit/rust-2026-template&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>rust</category>
      <category>github</category>
      <category>cicd</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Gemini CLI: Disable Interactive Shell If Tab Keeps Jumping Into the Shell Pane</title>
      <dc:creator>Dominik Oswald</dc:creator>
      <pubDate>Mon, 04 May 2026 17:21:31 +0000</pubDate>
      <link>https://dev.to/d-oit/gemini-cli-disable-interactive-shell-if-tab-keeps-jumping-into-the-shell-pane-j5d</link>
      <guid>https://dev.to/d-oit/gemini-cli-disable-interactive-shell-if-tab-keeps-jumping-into-the-shell-pane-j5d</guid>
      <description>&lt;p&gt;On Linux, I ran into a Gemini CLI behavior that was easy to misread at first: the problem was not just a command hanging, but Gemini’s embedded shell taking over the focus flow. The UI literally shows &lt;code&gt;Shell awaiting input&lt;/code&gt; and tells you to press &lt;code&gt;Tab to focus&lt;/code&gt;, which means Tab is being used to move focus into the interactive shell pane inside Gemini CLI. &lt;a href="https://geminicli.com/docs/tools/shell/" rel="noopener noreferrer"&gt;geminicli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That may be useful if you want a real terminal session inside Gemini CLI. It is much less useful when you only want non-interactive commands to run and return output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setting
&lt;/h2&gt;

&lt;p&gt;At the time of writing, the current stable Gemini CLI release is v0.40.0. The shell docs also describe &lt;code&gt;tools.shell.enableInteractiveShell&lt;/code&gt; as a boolean setting that controls the interactive shell experience, defaults to &lt;code&gt;true&lt;/code&gt;, and requires a restart after changes. &lt;a href="https://geminicli.com/docs/changelogs/latest/" rel="noopener noreferrer"&gt;geminicli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add this to &lt;code&gt;~/.gemini/settings.json&lt;/code&gt; (or project setting.json):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shell"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"enableInteractiveShell"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What this changes
&lt;/h2&gt;

&lt;p&gt;Gemini CLI says interactive shell support uses &lt;code&gt;node-pty&lt;/code&gt;, which allows real interactive sessions for commands like &lt;code&gt;vim&lt;/code&gt;, &lt;code&gt;nano&lt;/code&gt;, &lt;code&gt;htop&lt;/code&gt;, and &lt;code&gt;git rebase -i&lt;/code&gt;. The docs also state that when an interactive command is running, you can send input to it from Gemini CLI and focus the shell with &lt;code&gt;Tab&lt;/code&gt;. &lt;a href="https://google-gemini.github.io/gemini-cli/docs/tools/shell.html" rel="noopener noreferrer"&gt;google-gemini.github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the key detail. If Tab keeps jumping into the shell pane, that is not random terminal behavior. It is part of Gemini CLI’s interactive shell design. &lt;a href="https://geminicli.com/docs/cli/keyboard-shortcuts/" rel="noopener noreferrer"&gt;geminicli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you set &lt;code&gt;enableInteractiveShell&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt;, Gemini falls back to the simpler non-interactive execution path instead of the richer pseudo-terminal workflow. According to the docs, that fallback uses &lt;code&gt;child_process&lt;/code&gt;, which does not support interactive commands. &lt;a href="https://geminicli.com/docs/tools/shell/" rel="noopener noreferrer"&gt;geminicli&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gemini</category>
    </item>
    <item>
      <title>Creating YouTube Videos with Remotion: A Complete Guide to the Kimi AI Negotiation Project</title>
      <dc:creator>Dominik Oswald</dc:creator>
      <pubDate>Fri, 30 Jan 2026 20:30:20 +0000</pubDate>
      <link>https://dev.to/d-oit/creating-youtube-videos-with-remotion-a-complete-guide-to-the-kimi-ai-negotiation-project-48e5</link>
      <guid>https://dev.to/d-oit/creating-youtube-videos-with-remotion-a-complete-guide-to-the-kimi-ai-negotiation-project-48e5</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Creating professional YouTube videos programmatically has never been easier thanks to &lt;a href="https://remotion.dev" rel="noopener noreferrer"&gt;Remotion&lt;/a&gt; - a React-powered video creation framework that lets you build videos using familiar web technologies. In this tutorial, I'll walk you through how I created a complete YouTube video demonstrating an AI negotiation workflow, combining multiple video segments, PowerPoint slides, and screenshots into a polished final product.&lt;/p&gt;

&lt;p&gt;The project showcases an innovative approach: using Kimi AI (Moonshot AI's chatbot) to negotiate the lowest possible subscription price, then automating the entire negotiation process with Comet Browser Assistant. But more importantly, it demonstrates the power of Remotion for creating professional video content entirely through code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;The final video demonstrates a three-phase workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1&lt;/strong&gt;: Analyzing Kimi's sale page negotiation rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2&lt;/strong&gt;: Extracting constraints and opportunities from the AI's responses
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 3&lt;/strong&gt;: Executing an automated negotiation loop via Comet Browser Assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this was composed from 3 MP4 video files, 1 PowerPoint presentation, and 1 screenshot - orchestrated entirely through Remotion's React-based composition system. &lt;a href="https://www.youtube.com/watch?v=J7ixZts5GyY" rel="noopener noreferrer"&gt;youtube&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Kimi AI Negotiation Context
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.kimi.com/kimiplus/sale?activity_enter_method=h5_share" rel="noopener noreferrer"&gt;Kimi sale page&lt;/a&gt; presents an interesting challenge: "Your Black Friday price runs on my mood". The exploit prompt technique involves: &lt;a href="https://www.youtube.com/watch?v=J7ixZts5GyY" rel="noopener noreferrer"&gt;youtube&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Analyzing the sale page rules&lt;/strong&gt; - Understanding what "price runs on my mood" means for negotiation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identifying constraints&lt;/strong&gt; - The checkout price is final, but negotiation is possible beforehand
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finding cost reduction opportunities&lt;/strong&gt; - Including referral bonuses (10 OK Computer credits for existing Pro users)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crafting an iterative negotiation script&lt;/strong&gt; - Politely requesting the lowest price ($0.99) allowed under the rules&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key prompt used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Analyze the sale page at https://www.kimi.com/kimiplus/sale?activity_enter_method=h5_share
and help me reach the lowest legitimate first-month price available under 
the posted rules. Then run an iterative, polite negotiation script 
(one message at a time) that I can paste into the chat, aiming for the 
lowest price you are allowed to offer.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Project Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;React 18&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UI component framework for video scenes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Remotion 4.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Video composition and rendering engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript 5.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Type-safe development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vite 5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast build tool and dev server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FFmpeg&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Video encoding and export&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;remotion-video/
├── src/
│   ├── Root.tsx              # Main composition entry
│   ├── compositions/
│   │   ├── Intro.tsx         # Opening sequence (90 frames)
│   │   ├── Segment1.tsx      # The Exploit Prompt (~143s)
│   │   ├── Segment2.tsx      # Kimi's Response (~437s)
│   │   ├── Segment3.tsx      # 3-Phase Workflow (~20s)
│   │   ├── Outro.tsx         # Closing sequence (120 frames)
│   │   └── MainVideo.tsx     # Full composition
│   ├── components/
│   │   ├── VideoSegment.tsx  # Video player component
│   │   ├── VideoOverlay.tsx  # Text overlay system
│   │   ├── ProgressBar.tsx   # Visual progress indicators
│   │   └── TitleCard.tsx     # Animated title cards
│   └── styles/
└── static/                   # Video files, images, audio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before starting, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js 18.0+&lt;/strong&gt; installed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; or &lt;strong&gt;yarn&lt;/strong&gt; package manager&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FFmpeg&lt;/strong&gt; for video rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/d-oit/remotion-youtube-kimi-comet-chat.git
&lt;span class="nb"&gt;cd &lt;/span&gt;remotion-youtube-kimi-comet-chat/remotion-video
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Development Workflow
&lt;/h3&gt;

&lt;p&gt;Start the Remotion development server to preview your video in real-time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This launches an interactive preview where you can scrub through your composition, adjust timing, and see changes instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Dynamic Text Overlays
&lt;/h3&gt;

&lt;p&gt;Remotion makes it easy to create animated text overlays with precise timing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;interpolate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useCurrentFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useVideoConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;remotion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VideoOverlay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;startFrame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
  &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startFrame&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCurrentFrame&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fps&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useVideoConfig&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Fade in animation&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;interpolate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;startFrame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startFrame&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;extrapolateRight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clamp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nx"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rgba(0,0,0,0.7)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;20px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Multi-Segment Composition
&lt;/h3&gt;

&lt;p&gt;The project combines multiple video segments with frame-perfect transitions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intro&lt;/strong&gt;: 90 frames @ 30fps (3 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segment 1&lt;/strong&gt;: 4,290 frames (143 seconds) - The Exploit Prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segment 2&lt;/strong&gt;: 13,110 frames (437 seconds) - Kimi's Response
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segment 3&lt;/strong&gt;: 600 frames (20 seconds) - The 3-Phase Workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outro&lt;/strong&gt;: 120 frames @ 30fps (4 seconds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each segment is a separate React component that can be developed and rendered independently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MainVideo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;durationInFrames&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Intro&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;durationInFrames&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;4290&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Segment1&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;4380&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;durationInFrames&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;13110&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Segment2&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;17490&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;durationInFrames&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Segment3&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;18090&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;durationInFrames&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Outro&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Video Configuration
&lt;/h3&gt;

&lt;p&gt;Configure your output settings in &lt;code&gt;src/Root.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RemotionRoot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Composition&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"MainVideo"&lt;/span&gt;
        &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;MainVideo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;durationInFrames&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;18210&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rendering Your Video
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Render the Complete Video
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;span class="c"&gt;# Output: out/video.mp4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Render Individual Segments
&lt;/h3&gt;

&lt;p&gt;For faster iteration, render segments independently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build-intro        &lt;span class="c"&gt;# Intro only&lt;/span&gt;
npm run build-segment1     &lt;span class="c"&gt;# Phase 1&lt;/span&gt;
npm run build-segment2     &lt;span class="c"&gt;# Phase 2&lt;/span&gt;
npm run build-segment3     &lt;span class="c"&gt;# Phase 3&lt;/span&gt;
npm run build-outro        &lt;span class="c"&gt;# Outro only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Complete Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Source Material Preparation
&lt;/h3&gt;

&lt;p&gt;Gather your raw materials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video recordings (screen captures, demos)&lt;/li&gt;
&lt;li&gt;PowerPoint presentations (exported as video or images)&lt;/li&gt;
&lt;li&gt;Screenshots and graphics&lt;/li&gt;
&lt;li&gt;Background music/audio&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Create React Components
&lt;/h3&gt;

&lt;p&gt;Build reusable components for common patterns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// components/VideoSegment.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VideoSegment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;startFrom&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;startFrom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;volume&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Video&lt;/span&gt; 
      &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;staticFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;startFrom&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;startFrom&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;volume&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Compose Sequences
&lt;/h3&gt;

&lt;p&gt;Layer your components with precise timing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;durationInFrames&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;VideoSegment&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"recording1.mp4"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;VideoOverlay&lt;/span&gt; 
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Step 1: Analyze the sale page"&lt;/span&gt; 
    &lt;span class="na"&gt;startFrame&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
  &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Sequence&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Add Polish
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Progress indicators&lt;/strong&gt;: Visual feedback for multi-step processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transitions&lt;/strong&gt;: Smooth fades between segments
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio mixing&lt;/strong&gt;: Background music with proper volume levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography&lt;/strong&gt;: Consistent fonts and styling across all text overlays&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advanced Techniques
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Programmatic Asset Generation
&lt;/h3&gt;

&lt;p&gt;The project was created using Kimi K2.5 AI with &lt;a href="https://github.com/d-oit/remotion-youtube-kimi-comet-chat" rel="noopener noreferrer"&gt;OpenCode CLI&lt;/a&gt; for asset generation and code scaffolding. This demonstrates how AI tools can accelerate video production workflows. &lt;a href="https://www.youtube.com/watch?v=J7ixZts5GyY" rel="noopener noreferrer"&gt;youtube&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Render Scripts
&lt;/h3&gt;

&lt;p&gt;For advanced encoding options, use custom FFmpeg configurations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# render-ffmpeg.sh&lt;/span&gt;
remotion render MainVideo out/video.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--codec&lt;/span&gt; h264 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--quality&lt;/span&gt; 90 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--concurrency&lt;/span&gt; 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Benefits of the Remotion Approach
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Version Control&lt;/strong&gt;: Your entire video is code - track changes with Git&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusability&lt;/strong&gt;: Create component libraries for consistent branding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation&lt;/strong&gt;: Generate variations programmatically (translations, A/B tests)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Precision&lt;/strong&gt;: Frame-perfect timing without manual timeline scrubbing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration&lt;/strong&gt;: Multiple developers can work on different segments simultaneously&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/d-oit/remotion-youtube-kimi-comet-chat" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt; - Complete source code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://remotion.dev/docs" rel="noopener noreferrer"&gt;Remotion Documentation&lt;/a&gt;&lt;/strong&gt; - Official framework docs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/remotion-dev/remotion" rel="noopener noreferrer"&gt;Remotion GitHub&lt;/a&gt;&lt;/strong&gt; - Framework repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://kimi.com" rel="noopener noreferrer"&gt;Kimi AI&lt;/a&gt;&lt;/strong&gt; - Moonshot AI's chatbot platform&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Remotion transforms video creation from a manual timeline-based process into a programmatic, version-controlled workflow. By treating videos as React components, you gain the power of modern web development tools while creating professional video content.&lt;/p&gt;

&lt;p&gt;The Kimi negotiation project demonstrates how complex multi-segment videos with overlays, transitions, and synchronized timing can be built entirely through code - making video production scalable, maintainable, and collaborative.&lt;/p&gt;

&lt;p&gt;Whether you're creating educational content, product demos, or automated video variations, Remotion provides the foundation for treating video as a first-class programmatic medium. Give it a try for your next YouTube project!&lt;/p&gt;

</description>
      <category>youtube</category>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>AI-Powered Git Commits: Alternative for GitHub Copilot with Mistral codestral</title>
      <dc:creator>Dominik Oswald</dc:creator>
      <pubDate>Wed, 22 Oct 2025 18:17:57 +0000</pubDate>
      <link>https://dev.to/d-oit/ai-powered-git-commits-alternative-for-github-copilot-with-mistral-codestral-502n</link>
      <guid>https://dev.to/d-oit/ai-powered-git-commits-alternative-for-github-copilot-with-mistral-codestral-502n</guid>
      <description>&lt;p&gt;Building clear, concise commit messages can feel like a chore—especially when you’ve got context switching, PR reviews, and deadlines breathing down your neck. GitHub Copilot’s “generate commit” feature is handy, but you may hit retry limits or find that it simply won’t fire off a good message.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;Codestral&lt;/strong&gt;, an AI‑powered chat API from Mistral that you can hook into your local workflow with a single shell script. Below, we’ll walk through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why you might look beyond Copilot for commit messages&lt;/li&gt;
&lt;li&gt;How to grab your free Codestral API key&lt;/li&gt;
&lt;li&gt;A drop‑in &lt;code&gt;.sh&lt;/code&gt; script you can drop into your repo to generate and confirm AI‑crafted commit messages&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. When Copilot’s “Generate Commit” Hits Its Limit or Windsurf "is only available for users on a paid plan"
&lt;/h2&gt;

&lt;p&gt;Copilot is great—and for many small changes, it nails the message on the first try. But if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push the “retry” button too many times&lt;/li&gt;
&lt;li&gt;Get rate‑limited mid‑flow&lt;/li&gt;
&lt;li&gt;Find its output too verbose or vague&lt;/li&gt;
&lt;li&gt;Source: Windsurf&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;AI commit message generation is only available for users on a paid plan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By using an external AI backend via a simple &lt;code&gt;curl&lt;/code&gt; call, you sidestep GitHub’s limits and get ultra‑low‑latency responses fine‑tuned for commit messages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hint&lt;/strong&gt;: You could replace the codestral api with any other OpenAI-compatible API and model. Only replace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CODESTRAL_API_KEY -&amp;gt; FOO_API_KEY&lt;/li&gt;
&lt;li&gt;DEFAULT_MODEL=foo-latest&lt;/li&gt;
&lt;li&gt;API_URL=&lt;a href="https://my.foo.ai/v1/chat/completions" rel="noopener noreferrer"&gt;https://my.foo.ai/v1/chat/completions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Grab Your Free Codestral Key
&lt;/h2&gt;

&lt;p&gt;Sign up for a free API key at Mistral’s console:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://console.mistral.ai/codestral" rel="noopener noreferrer"&gt;La Plateforme - codestral&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ll be prompted to log in or create an account, then copy your &lt;strong&gt;Codestral API key&lt;/strong&gt;—a long alphanumeric token that you’ll stash in an environment variable or &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Drop‑in Shell Script: &lt;code&gt;ai-git-commit.sh&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Below is an alternative to GitHub Copilot AI commit message generator. Save this as &lt;code&gt;scripts/ai-git-commit.sh&lt;/code&gt; (or wherever you keep your helper scripts), make it executable, and watch it auto‑stage, summarize diffs, call Codestral, and prompt you for confirmation.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;




&lt;p&gt;&lt;a href="https://gist.github.com/d-oit/c184cc30804f1d79474782a991a47f4e" rel="noopener noreferrer"&gt;Gist with Revisions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Staging&lt;/strong&gt;: Automatically stages tracked changes, with an optional prompt for untracked files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diffing&lt;/strong&gt;: Pulls in your staged diff (up to ~6,000 characters).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payload&lt;/strong&gt;: Wraps the diff in a JSON payload for the Codestral chat endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API call&lt;/strong&gt;: Sends &lt;code&gt;model: codestral-latest&lt;/code&gt; with low temperature to get a focused message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup&lt;/strong&gt;: Strips Markdown fences and polish quotes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirmation&lt;/strong&gt;: Shows you the AI’s message before committing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohutyf7pmwd0k0h60000.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohutyf7pmwd0k0h60000.png" alt="Windsurf: AI commit alternative"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It All Together
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install prerequisites&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   brew install jq
   # or your distro’s package manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt; at your project root:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   CODESTRAL_API_KEY=sk-&amp;lt;your-free-key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Make the script executable&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   chmod +x scripts/ai-git-commit.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use it instead of &lt;code&gt;git commit&lt;/code&gt;&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   ./scripts/ai-git-commit.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voilà—every commit message now backed by a world‑class open‑source AI model, with none of Copilot’s rate limits or UI hurdles.&lt;/p&gt;




&lt;h3&gt;
  
  
  Data use and privacy
&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;&lt;br&gt;
For details on how Mistral handles user data, see “Do you use my user data to train your Artificial Intelligence models?”&lt;br&gt;
&lt;a href="https://help.mistral.ai/en/articles/347617-do-you-use-my-user-data-to-train-your-artificial-intelligence-models" rel="noopener noreferrer"&gt;https://help.mistral.ai/en/articles/347617-do-you-use-my-user-data-to-train-your-artificial-intelligence-models&lt;/a&gt;&lt;br&gt;
&lt;/small&gt;&lt;br&gt;
&lt;small&gt;&lt;strong&gt;Controls on la Plateforme&lt;/strong&gt;&lt;/small&gt;&lt;br&gt;
&lt;small&gt;- Experiment Plan (Free subscription): As stated during subscription, we may use your data (input and output) to train our artificial intelligence models.&lt;/small&gt;&lt;br&gt;
&lt;small&gt;- You have the right to opt out of this program at any time; see: Can I opt-out of my input or output data being used for training? &lt;a href="https://help.mistral.ai/en/articles/347614-can-i-opt-out-of-my-input-or-output-data-being-used-for-training" rel="noopener noreferrer"&gt;https://help.mistral.ai/en/articles/347614-can-i-opt-out-of-my-input-or-output-data-being-used-for-training&lt;/a&gt;&lt;br&gt;
&lt;/small&gt;&lt;/p&gt;

</description>
      <category>mistral</category>
      <category>codestral</category>
      <category>ai</category>
      <category>git</category>
    </item>
  </channel>
</rss>
