Watches chosen subreddits for newly posted video footage, downloads it, runs it through QC Buddy's detection engine, and — if issues are found — adds an entry to a local review queue with a drafted comment. Nothing is ever posted to Reddit automatically. A human always reviews and posts the comment manually.
There are three ways to use this: a double-clickable desktop app, a manual one-shot terminal command, and a fully automated background watcher. The app and manual command need no Reddit API access at all. Reddit's self-serve API app creation is currently locked down and access requires an approval ticket that can take a long time or go unanswered, so the app is the practical way to use this today.
-
Build the QC Buddy sidecar (one-time, from the main repo root):
npm run build-sidecar
This produces
swift-sidecar/.build/release/QCBuddySidecar, which this tool spawns directly — no GUI or Electron runtime involved. -
Create a virtualenv and install dependencies (from this folder):
python3 -m venv .venv .venv/bin/pip install -r requirements.txt
-
Configure
config.yaml:output_dir— where downloaded videos land. Any plain filesystem path works, including a mounted/mapped NAS path.subreddits— only used by automated mode (below); harmless to leave as-is.keep_clean_downloads— settrueto keep every download, or leavefalseto delete files that scan clean (flagged files are always kept).
Double-click QC Buddy Reddit Checker.app in this folder. It's a small
window with:
- A "Subreddit or Reddit URL" field and an "Open JSON in Browser"
button — type a subreddit name (e.g.
filmmakers) and click it. That opensreddit.com/r/filmmakers/new.jsonin your default browser. Because it's your own logged-in browser doing the fetch (not a script), this always works — it's the same trick as manual mode below, just automated. - Select all the text on that page (Cmd+A), copy it (Cmd+C), come back to the app, and paste it (Cmd+V) into the big box.
- Click "Check for Issues". It downloads every video post in that listing, scans each one, and lists any that got flagged below — with the post link and a drafted comment, each with its own Copy Link / Copy Comment button.
Posts it's already checked before are skipped automatically on future runs
(shared dedup with the other two modes), and everything flagged also lands
in data/review_queue.md for a running log.
If double-clicking does nothing or complains setup isn't finished, do the
Setup steps above first (the app needs .venv and the sidecar binary
built), then try again.
Same idea as the app, but for a single post from the terminal. For when you
spot an interesting video post yourself while browsing Reddit normally.
Paste the post's link (and, if it's an external link post, the actual video
URL) and it downloads, scans, and prints a drafted comment for you to copy
and post yourself. This never logs into Reddit, never calls Reddit's API,
and never needs .env filled in — it only ever talks to yt-dlp and the
local sidecar binary.
.venv/bin/python -m reddit_watcher.manual \
"https://www.reddit.com/r/VideoEditing/comments/abc123/my_short_film/" \
--author theirusernameIf the post links to an external video (YouTube, Vimeo, Dropbox) rather than
being a native v.redd.it post, pass that video URL as a second argument:
.venv/bin/python -m reddit_watcher.manual \
"https://www.reddit.com/r/VideoEditing/comments/abc123/my_short_film/" \
"https://www.youtube.com/watch?v=..." \
--author theirusernameFlagged results get appended to data/review_queue.md same as automated
mode, so you keep one running log either way.
-
Register a Reddit app. Go to https://www.reddit.com/prefs/apps, click "create app", choose type script, and set any redirect URI (e.g.
http://localhost:8080, unused for read-only access). Note the client ID (under the app name) and client secret. As of mid-2026 this self-serve flow is largely non-functional; the fallback is a Data Access Request ticket atsupport.reddithelp.com/hc/en-us/requests/new?ticket_form_id=14868593862164(inquiry type: "I'm a developer and want to build a Reddit App that does not work in the Devvit ecosystem"). -
Configure credentials. Copy
.env.exampleto.envand fill inREDDIT_CLIENT_ID/REDDIT_CLIENT_SECRET/REDDIT_USER_AGENTfrom step 1. Only read-only access is used — this tool never logs in as a Reddit user, posts, or votes. -
Finish
config.yaml: fill in the realsubredditslist. -
Run it manually first to confirm everything works:
.venv/bin/python -m reddit_watcher.main
Leave it running for a bit, then check
data/review_queue.mdanddata/watcher.dbonce a flagged post comes through. Stop with Ctrl-C. -
Install as a background job (macOS launchd), so it runs continuously:
cp com.qcbuddy.redditwatcher.plist ~/Library/LaunchAgents/ launchctl load ~/Library/LaunchAgents/com.qcbuddy.redditwatcher.plist
Logs go to
data/watcher.log/data/watcher.err.log. To stop it:launchctl unload ~/Library/LaunchAgents/com.qcbuddy.redditwatcher.plist
Open data/review_queue.md periodically. Each entry has the post link,
author, subreddit, the issues QC Buddy found, and a drafted comment you can
copy, edit, and post yourself. Nothing here posts on your behalf.
reddit_watcher/gui.py— the Tkinter desktop app (QC Buddy Reddit Checker.appis a thin double-clickable wrapper around this). Runs downloads/scans on a background thread so the window stays responsive.reddit_watcher/batch.py— parses pasted Reddit JSON (any shape: a listing, a single post's[post, comments]response, or a bare post dict) and runs the download-scan-draft pipeline over every video post in it. Shared by the app; not restricted toconfig.yaml's subreddit list.reddit_watcher/manual.py— the single-post terminal equivalent ofbatch.py, for one pasted post link instead of a whole listing.reddit_watcher/watcher.py— one read-only PRAW stream across all configured subreddits, filtered down to video posts (nativev.redd.itor a configured domain allowlist) and per-subreddit flair rules. Automated mode only; needs approved API access.reddit_watcher/post_filters.py— the video/flair filtering rules, shared by bothwatcher.py(PRAW) andbatch.py(pasted JSON) so the two modes agree on what counts as "a video post worth checking."reddit_watcher/downloader.py— shells out to yt-dlp, saving intooutput_dirwith the Reddit post ID in the filename, remuxed to.mp4.reddit_watcher/scan_bridge.py— spawns the compiled Swift sidecar binary and speaks its existing newline-delimited JSON protocol (the same one Electron uses) to run one analyze job per file.reddit_watcher/review_queue.py— SQLite dedup (processed_posts, shared across all three modes) and flagged-post storage (review_queue), withdata/review_queue.mdregenerated from the database each run.reddit_watcher/comment_templates.py— drafts the comment text from the issues the scan returned.reddit_watcher/main.py— automated-mode orchestrator; auto-restarts the stream with backoff if it crashes.