All posts
ProductFFmpeg26 Jan 2026 · 2 min read

Two days that built the course, the desktop app, and a backend

JPJean Perez

On January 21 and 22, 2026, PRs #4 through #18 landed. On January 25, PRs #19 through #48 landed, between 01:03 and 20:16 UTC. Between those two stretches, BeemMeUp went from an analysis tool with a command builder to a product with an interactive course, an Electron desktop app, certificates, and a Supabase-backed dashboard.

The course, one module at a time

PR #4 opens the stretch with an FFMPEG command builder: a build mode and an analyze mode, backed by a library of flag explanations. What follows is the tutorial system itself: a typed content-block structure for lessons, a sidebar, diagram visualization, then modules landing almost one PR at a time. "Module 5 and 6," "Module 7... advanced filters," an optimization-performance module, "module 10... advanced techniques." A Turborepo migration gets wedged into the same stretch, committed as "wip adding turbo."

By the end of it, there were 9 real modules under apps/web/lib/tutorial/data/modules/: fundamentals, video processing, audio processing, ffprobe, ffplay, advanced filters, advanced techniques, optimization and performance, and common use cases. 122 files total. Each lesson is a plain TypeScript object, which is what makes the module-per-PR pace possible: adding a lesson means adding a value to an array. No rendering code changes.

export const whatIsFFmpeg: Lesson = {
  id: 'what-is-ffmpeg',
  title: 'What is FFMPEG?',
  module: 'Fundamentals',
  duration: 15,
  content: [
    {
      type: 'text',
      title: 'Introduction',
      content:
        'FFMPEG is a multimedia framework that can decode, encode, transcode, mux, demux, stream, filter, and play almost any media format...',
    },
    {
      type: 'code',
      command: 'ffmpeg -version',
      explanation: 'Check your FFMPEG installation and version information',
      flagBreakdown: [
        {
          flag: '-version',
          description: 'Display version information and build configuration',
        },
      ],
    },
  ],
};

Quizzes came in as their own content-block type in the same window, scored and tracked separately from lesson completion.

One day, thirty PRs

January 25 opens with PR #19, "initial Desktop Application," which does two things in one commit: it scaffolds an Electron app under apps/desktop (Forge config, bundled ffmpeg binaries, an executor, a probe module, IPC handlers, a menu) and it restructures the whole repo into an apps/web / apps/desktop pnpm workspace. Everything that had lived at app/ and lib/ moves to apps/web/app/ and apps/web/lib/ in the same PR that adds the desktop shell, paired with web-side adapters (lib/desktop-adapter.ts, lib/storage-desktop.ts, lib/transcoder-desktop.ts) so the same UI can talk to either the cloud pipeline or the local one.

Certificates come next, PR #22: generation and verification pages, tied into quiz completion. Then, across PRs #25 through #33, study tools land: flash cards, a multiple-choice dialog, a quick-reference panel, a dedicated study-session mode.

Study tools shipped against localStorage first. Supabase and tRPC don't show up until PRs #34, #36, #37, and #38, a few PRs after study tools were already live, adding routers for users, tutorials, quizzes, flash cards, videos, study sessions, and certificates, and moving that state off the browser and onto a real backend. The feature was built, then reworked to actually persist, in the same day.

PRs #43 through #48, the last stretch of the day, add a dashboard: stats, activity, a tutorial-progress card, and a theme toggle sitting on top of the backend that had just landed underneath it.

Origin still has branches named bmu-29 through bmu-64 sitting under this stretch of work, which is the closest thing to a paper trail connecting these PRs to Linear tickets, even though none of the merged commits mention a BMU id directly.

None of it was planned as one epic. Each PR built on whatever the one before it had just shipped.

The next commit in this repo is dated September.