845 GitHub stars and counting — mattpocock/course-video-manager is a TypeScript project TopGit is tracking across repositories on the platform.
Snapshot summary built from the project's own GitHub metadata — there's no written TopGit review yet. The page will update automatically when a full review is published.
WHY NO REVIEW YET
TopGit writes full reviews for the most-starred, most-requested repositories. This page is a snapshot until then — see the READ ME tab for the original README in full.
A tool for managing course video publishing workflows — editing metadata, generating descriptions, creating thumbnails, and posting to social platforms.
Repository layout
A Turborepo monorepo over the pnpm workspace:
Directory
What it is
apps/local
The application as it runs on the author's machine: the React Router app, the Video Editor, the Diagram Playground, the Publish flow, ffmpeg, the recorder service, and the cvm CLI
packages/core
The domain database — the Drizzle schema, the DrizzleService and every db-* operations service. Every piece of SQL in the repo lives here
packages/overlay-renderer
The standalone Remotion renderer for every overlay content-kind — subtitles, the CTA, and Definition Cards — with its own toolchain
packages/core has no filesystem access, no child_process and no git
coupling, so it can be deployed as well as run locally. pnpm lint:boundaries
enforces that — anything that needs a machine is injected from apps/local
(see packages/core/services/diagram-thumbnail-store.ts for the shape).
.env lives at the workspace root: one file for the whole monorepo, which is
also where cvm looks for it (apps/local/app/cli/env.ts).
Commands
Run these from the workspace root; Turborepo fans them out and re-runs only what
changed.
Script
Description
pnpm typecheck
Typecheck every package
pnpm test
Run every suite once
pnpm test:watch
Run every suite in watch mode
pnpm lint:boundaries
Enforce the package boundaries
pnpm dev
Start the local application
pnpm build
Build the local application
Each of these filters out @cvm/overlay-renderer: it ships its own
toolchain (Remotion, and a Chromium download) and has never been part of the
application's checks. Run it with pnpm --filter @cvm/overlay-renderer.
Deploys
Vercel gets one project per deployable directory, each with its own Root
Directory, and relies on Vercel's built-in unaffected-project skipping to
decide what to deploy. There is deliberately no Ignored Build Step:
turbo-ignore is deprecated, and native skipping does not consume a concurrent
build slot. If a custom step is ever needed it is turbo query affected.
Only main deploys.apps/remote/vercel.json sets
git.deploymentEnabled to { "**": false, "main": true }, so a push to any
other branch builds nothing: no Preview Deployment for an open PR. Production
still deploys on a merge to main, because a branch that matches two rules
deploys if either one is true. The pattern is ** and not *, as * does
not match a slash and a feat/thing branch would still deploy. This is the
supported per-branch control — Vercel's dashboard has no equivalent, and the
repo takes no Ignored Build Step.
Database migrations
Schema changes are managed with drizzle-kit generate / migrate (versioned SQL files), not push. The schema, the migrations and the drizzle config all live in packages/core.
Making a schema change
Edit packages/core/db/schema.ts.
pnpm db:generate — creates a new numbered .sql file under packages/core/db/migrations/.
Commit it, then pnpm db:migrate — run by hand, against DIRECT_DATABASE_URL — before or as part of deploying apps/remote. Applying migrations used to be the deploy's job exclusively; it moved to a manual step because that ran on every Vercel build, previews included, and could land an unmerged migration on the production schema. See apps/remote/README.md and ADR 0026.
Against any non-local host, pnpm db:migrate (and drizzle-kit push) refuses unless you are on a clean main at exactly origin/main — an unmerged branch once migrated production out of order. Merge first, then migrate from the main checkout. Local databases are never checked. See the ADR 0026 addendum.
Migrations are additive-only: no dropped or renamed columns without a two-step release. A cvm invocation may be in flight while a deploy lands, and it is the additive rule — not the version gate — that keeps that from breaking. The version gate refuses the box's next command, naming both migration counts and telling it to pull (packages/core/rpc/schema-version.ts).
First-time setup on an existing database
If the database was originally created via drizzle-kit push and has never run migrations:
pnpm db:baseline
This registers the 0000 baseline migration as already-applied so the next pnpm db:migrate won't replay the initial CREATE TABLE statements.
Scripts
Script
Description
pnpm db:generate
Generate a new migration from schema changes
pnpm db:migrate
Apply pending migrations by hand (deploy no longer does this)
pnpm db:baseline
Mark the 0000 baseline as applied (one-time setup)
pnpm db:studio
Open Drizzle Studio
Zapier Webhook Setup (Buffer Integration)
The app uses a Dropbox → Zapier → Buffer pipeline to post videos to social media. When you click "Post to Buffer" in the app, it:
Copies the video file into a local Dropbox folder
Waits for Dropbox to sync the file to the cloud
Sends a webhook to Zapier with the caption and file path
Zapier finds the file in Dropbox and adds it to your Buffer queue
Prerequisites
Dropbox desktop client installed and running (the app uses dropbox filestatus to poll sync status)
Buffer account connected in Zapier
Zapier account with access to the Webhooks by Zapier and Buffer integrations
Environment Variables
Variable
Description
BUFFER_POSTS_PATH
Local path to a folder inside your Dropbox directory where video files are copied before posting (e.g. ~/Dropbox/buffer-posts)
ZAPIER_BUFFER_WEBHOOK_URL
The webhook URL generated by your Zapier Zap (see below)
AI_HERO_BASE_URL
Base URL for the AI Hero instance (e.g. https://www.aihero.dev). Required for AI Hero posting integration.
Creating the Zapier Zap
Step 1: Create a "Webhooks by Zapier" trigger
Create a new Zap in Zapier
For the trigger, choose Webhooks by Zapier
Select Catch Hook as the trigger event
Copy the generated webhook URL
Set it as the ZAPIER_BUFFER_WEBHOOK_URL environment variable in your app
The webhook receives a JSON payload with this shape:
{
"caption": "Your post caption text",
"dropboxFilePath": "/full/path/to/buffer-posts/video.mp4"
}
Step 2: Add a "Dropbox: Find File" action
Add an action step and choose Dropbox
Select Find File as the action event
Configure it to look up the file using the dropboxFilePath value from the webhook payload
Step 3: Add a "Buffer: Add to Queue" action
Add another action step and choose Buffer
Select Add to Queue as the action event
Map the media field to the Dropbox file URL from Step 2
Map the text field to the caption value from the webhook payload
Step 4: Test and enable
Use the app to trigger a test post so Zapier can capture a sample webhook payload
Walk through each step to verify the data mapping is correct
Does mattpocock/course-video-manager have any tags?
TopGit's last sync did not record any GitHub topics for mattpocock/course-video-manager. GitHub topics appear in the right sidebar of a repository page; that's the authoritative place to check.
How active is development on mattpocock/course-video-manager?
The most recent commit recorded on mattpocock/course-video-manager was 3 days ago, based on the GitHub push timestamp. The repository has 177 forks — one of the better signals of community interest.
How many stars does mattpocock/course-video-manager have?
mattpocock/course-video-manager has 845 GitHub stars — refresh the page for the live number, or check github.com/mattpocock/course-video-manager. TopGit mirrors GitHub's count but does not claim minute-by-minute accuracy.
What language is mattpocock/course-video-manager written in?
mattpocock/course-video-manager is written primarily in TypeScript. GitHub's language field is based on the largest share of bytes in the default branch.
Where can I see mattpocock/course-video-manager in action?
The project maintains a homepage at https://course-video-manager-remote.vercel.app. The README tab on this page also usually contains screenshots and a quickstart.
Where do I read more about mattpocock/course-video-manager?
This TopGit page is a snapshot — the READ ME tab shows the project's own README content (links stripped, images preserved). The GitHub repository at github.com/mattpocock/course-video-manager is the definitive source.
Read full README in the tab above.
Is course-video-manager worth your time?
ChatGPT, Claude and Perplexity can all read this page. Ask one of them what it makes of course-video-manager.