Building AutoBrief: From RSS Ingestion to an Automated Publishing Pipeline
A practical look at how I built AutoBrief around RSS ingestion, Google Sheets processing, AI enrichment, static JSON publishing, and GitHub Actions.
AutoBrief started from a simple problem: I wanted a news product that could collect stories from many sources, process them consistently, and publish a useful reading experience without turning the frontend into a constantly running data-processing system.
The interesting part was not building another news-card UI. It was designing a pipeline where ingestion, enrichment, export, and presentation each have a clear responsibility and can fail without taking down the public site.
The pipeline
The production flow is deliberately split into stages. RSS feeds are collected on a recurring GitHub Actions schedule. The resulting records move through the Google Sheets processing layer, where structured fields and AI-assisted enrichment are prepared. An existing export step then turns the processed records into static JSON committed to the repository, which the Next.js application serves to readers.
That separation gives the public application a much simpler job: read already-prepared data, render pages, and expose predictable APIs. The ingestion and processing machinery does not need to run for every visitor.
- RSS ingestion runs every 30 minutes through GitHub Actions.
- Google Sheets acts as the upstream structured processing layer.
- AI enrichment is validated before data reaches the publishing surface.
- The export step generates static JSON and archive shards.
- Next.js reads the generated dataset and serves the public experience through Vercel.
Why keep the public dataset static?
A static dataset sounds less sophisticated than a database, but it is a useful trade-off for this particular workload. The public site does not need to perform expensive aggregation or external API authentication just because someone opened an article. The generated JSON is versioned, deployable, inspectable, and naturally fits the existing Git workflow.
The application also keeps a small recent dataset alongside archived monthly shards. A slug lookup can resolve a recent post quickly and fall back to the archive index when the article is older. That means the public application can keep serving a large historical collection without loading the entire archive into every request.
The automation boundary matters
One of the lessons from AutoBrief is that automation should have explicit boundaries. GitHub Actions handles repeatable machine work such as feed ingestion and export. Google Sheets provides a transparent processing surface. The Next.js application stays focused on delivery. This makes it easier to reason about failures because a broken upstream feed is not automatically a broken frontend deployment.
The same principle applies to AI output. Model-generated content is treated as input to a validation stage rather than as unquestioned final data. Structured fields, malformed output, and unexpected model responses need guardrails before they become part of a public publishing pipeline.
What I would improve next
The current architecture is intentionally pragmatic. If the product grows, there are several directions worth exploring: a dedicated database for richer querying, more granular background jobs, stronger retry and observability controls, and a more purpose-built editorial interface.
The important point is that those changes can be introduced at the processing boundary without forcing the public frontend to become a stateful backend application.
- Move from spreadsheet-backed processing to a dedicated database when the workload justifies it.
- Add more granular retry and failure reporting around background processing.
- Expand editorial controls without coupling them to the public read path.
- Keep generated public data versioned and independently deployable where practical.
The bigger takeaway
For me, AutoBrief has been less about choosing a particular framework and more about learning where automation belongs. A production system does not become more reliable by making every component responsible for everything. Clear boundaries, inspectable intermediate data, and a small public serving layer can be a better fit than adding infrastructure simply because it is fashionable.
I am continuing to document the engineering decisions behind projects like this because the implementation details are often more useful than a polished list of technologies.