I wanted a developer briefing that ended with a useful next step, not another open tab. ViralVault became an experiment in automating the repeatable work while keeping the editorial decision visible.
is an AI and tech briefing project built around scheduled web editions and a video-rendering pipeline, with each edition stored as a versioned content file.
One person runs it. Mostly, a pipeline runs it, and I run the pipeline. Here is how it works, and the one problem that turned out to matter more than all the automation.
Why hand-roll the small thing instead of installing the SDK?
ViralVault uses a few direct HTTP integrations to keep the implementation small. Skipping an SDK removes a dependency, not the credentials or security work the integration requires. I treat that trade differently for a simple data request and a payment webhook.
The site uses Next.js 16, React 19, and Tailwind v4, with Motion and Lenis for the reading treatment, deployed on Vercel.
Nothing about it is heavy, and that is on purpose.
| What it does | How it is wired | What that skips |
|---|---|---|
| Tweet embeds | react-tweet, rendered statically at build time | An X API key, and every client-side fetch |
| Stripe webhook | Signature verified by hand with node:crypto | The Stripe SDK, pulled in for exactly one endpoint |
| Freemium database | Supabase talked to over plain fetch | The Supabase client library |
That table describes implementation choices, not blanket advice to hand-roll security-sensitive code. A custom webhook verifier still needs raw-body handling, signature comparison, replay checks, and tests against the provider's contract. It is the same instinct behind building AbleMakers on a deliberately boring, swappable stack: when you are the entire team, every dependency is one you debug alone.
An edition is a committed file, and that is the whole architecture
The most important decision in ViralVault is that an edition is a JSON file committed to git. The homepage always renders the latest one, every past edition is a permalink that lives in the archive forever, and the commit that adds the file is the deploy that ships it.
That single choice cascades into everything else. The site is fully static and cacheable. The archive is permanent and version-controlled.
The scheduled workflow is a GitHub Action because the content already lives in git. Checkout, generation, validation, and commit belong in the same job. A serverless function could also write through the GitHub API; it simply was not the workflow I chose.
How does the twice-daily pipeline actually run?
The ViralVault pipeline runs in three phases, scrape, then rank and edit, then publish, and each phase has one thing it flatly refuses to do. It fires from a scheduled GitHub Action and ends by committing a file like content/editions/2026-07-01-pm.json.
| Phase | What happens | What it refuses to do |
|---|---|---|
| Scrape | About fourteen sources fire in parallel: Hacker News, Techmeme, TechCrunch and the rest of the tech press, a few subreddits, and Google News as the datacenter-friendly fallback for when Reddit blocks the server's IP. | Invent candidates when sources are unavailable. Fetching must also respect source access and reuse rules. |
| Rank, then edit | Candidates are sorted by engagement, sliced to the top 70, trimmed lean, and handed to a language model with one job: be the executive editor. It picks the five stories that matter and writes each one up. | Let the model be the primary source. Its summaries get overwritten in the next step. |
| Publish | Validate the output, write the edition file, and commit it. | Ship a thin edition. If fewer than five real candidates survived, it bails. A quiet day is better than a padded one. |
The editor's instructions are the actual product thesis, in one line: bias toward actionable. The audience is software developers, so at least half the stories should be something a developer can use or has to react to. Excitement plus actionability beats raw size.
Every story ends with a "why you care" and a next step, because a headline you can't act on is just noise with better typography.
How do you keep an unattended AI newsroom from making things up?
ViralVault treats model output as a draft that needs evidence. Validation can catch malformed editions and invented embed identifiers; re-fetching selected URLs can check what the draft is based on. Neither step proves a story is accurate, fairly framed, or cleared for republication.
An early version replaced summaries with extracted source paragraphs. That improves traceability but is not a complete editorial solution: copying a publication's text is not the same as adding analysis, and access to a page does not grant permission to republish it. The standard is concise attributed coverage with an original, reviewable point of view.
That is the same line I drew for Ember Coast, where the itinerary is assembled by deterministic code instead of written by a language model, and the same reason ResolveMesh refuses to invent a flattering score for a capability it has never observed. Fluent output is not evidence of anything.
There is also a fallback chain across several models with retries, because free-tier providers pin to overloaded routes and return truncated JSON under load. It is the scrappy cousin of Codelit's bounded multi-provider fallback.
Production runs on Gemini through an OpenAI-compatible endpoint; my local runner prefers my Codex login and falls back to Gemini if it can't reach it. A failed or truncated draft should stop publication, not become invisible just because another provider is available.
How does the freemium gate work without an entitlement system?
The ViralVault prototype used a small Supabase counter and Resend subscription state to meter five free email editions. It was a compact way to test the model without building a separate entitlement service. The tradeoff is that billing eligibility and consent must not be confused.
When you subscribe, your email goes into a Resend audience and a Supabase row that starts at zero editions received, and you get a one-time welcome email. There is a hidden honeypot field on the form so bots unsubscribe themselves silently.
After each broadcast, a Supabase function bumps every free reader's count and hands back anyone who just hit five. Those readers get flipped to unsubscribed in Resend, so future sends skip them. Pro readers are never counted.
The actual hard part was not the automation
Editorial judgment is the part an automated briefing cannot delegate away. A complete JSON file can still contain a weak selection, misleading emphasis, or derivative commentary. The pipeline needs a review decision, not only a schema check.
YouTube's channel monetization policies identify repetitive or mass-produced material as inauthentic content and separately address reused content. That is a reason to review the actual output and channel, not evidence that all automated channels are banned.
The fix is not technical. It is a genuine, recurring editorial point of view. Not headline read-outs, but an actual take on each story, the kind of thing a person who ships software would say out loud.
The reader should be able to tell why this edition exists and what it adds. That is the part I do not want to automate away. The AI does the grunt work: scraping, ranking, drafting, even generating the video and the kinetic captions from a per-word timing track. The point of view stays mine.
Where ViralVault is now
The build produced a scheduled edition workflow, web permalinks, social cards, RSS, and a Remotion video pipeline with long-form and vertical outputs. This is an architecture retrospective, not a claim that every scheduled edition or upload is currently completing. The intended video workflow is private-first review before publication.
It started, embarrassingly, as a page I would literally screen-record by opening a hidden URL that auto-scrolled the edition at a cinematic pace. That still works. It just grew a real render pipeline around it.
For a similar project, I would automate retrieval, drafting, and rendering while keeping a clear editorial review step. The decision is not whether a video file exists. It is whether the edition adds enough useful context to deserve a reader's time.
The reusable lesson is to make publication an explicit decision. Fetching, drafting, and rendering can be automated; accountability for what a reader receives cannot.
Questions people actually ask
- How does ViralVault publish twice a day without a CMS?
- Every ViralVault edition is a JSON file committed to the repository. A scheduled GitHub Action scrapes the sources, has a language model select and write the stories, validates the output, and commits the file. The commit triggers the deploy, so publishing and shipping are the same event. The homepage renders the newest file and every older edition stays reachable at a permanent link.
- Why use a GitHub Action instead of a Vercel Cron Job for scheduled publishing?
- Both can trigger publishing code, and a function can use an authenticated GitHub API call to commit. I chose GitHub Actions because checkout, validation, committing, and deployment were already part of one repository workflow. It kept the content archive version-controlled without introducing a separate storage system.
- How do you stop an automated news pipeline from hallucinating?
- Assume the model will make things up, then check its work. A validator rejects pull-quotes that only repeat the headline and forbids invented embed identifiers. Re-fetching the selected source helps check what the model relied on. That still does not establish factual accuracy or permission to reproduce an article. Keep attribution and excerpt limits explicit, and review factual claims and editorial framing before publishing. Automation is a drafting aid, not a substitute for an editor.
- Does YouTube demonetize automated news channels?
- YouTube's monetization policies cover inauthentic content, including repetitive or mass-produced material, and separately address reused content. Automation alone does not establish a violation, and a particular editing style does not guarantee approval. Original contribution, the whole channel, and compliance with the current rules matter.
- How did the ViralVault freemium prototype meter editions?
- The prototype offered five free email editions before a paid subscription. A small table counted editions for free readers, and the email provider's subscription state controlled future sends. That kept the implementation small, but billing eligibility and a person's unsubscribe choice still need to be treated as separate concepts.