An AI publication that writes itself
The Garage AI
An automated publication covering AI in car dealerships — researched, written, judged, illustrated, and published by a pipeline, three mornings a week. Nothing on it pretends to be handwritten. I built the newsroom; the newsroom does the writing.
The Pipeline
A full newsroom, no people in it
Each editorial job is held by a different AI model, chosen for that job's shape, and every issue is one unattended run through six stages. The design constraint that shaped all of them: no stage is allowed to crash the publication. The classifier fails open, the judge and the illustrator fail soft, and a thin news week gets skipped — never padded.
- 01
Research
The Researcher · Perplexity SonarSix news-intent queries hit Perplexity's search endpoint — one HTTP call per dealership department, so every article's section is known by attribution. A deterministic blocklist drops PR wires and social posts before any model sees them.
dedup by URL · anti-repetition vs. all prior citations
- 02
Curate
The Curator · Claude Haiku 4.5A classifier separates news from promotion and scores each story's operator-importance from 0 to 2, by how much an operator would care. If the classifier errors, it fails open — a bad filter shouldn't kill an issue.
fails open
- 03
Select
deterministic codeStories cluster by section, and sections compete: high-importance count, summed importance, publisher breadth, cluster size. No section runs twice in a row. If no cluster clears the three-article bar, the issue is skipped entirely.
thin weeks are skipped, not padded
- 04
Write & Judge
The Writer · Claude Sonnet 5 → The Editor · Claude Haiku 4.5Sonnet drafts the post against the day's format spec — title, slug, summary, body, tags, sources — via structured tool-calling, no freeform output, with the operator-first POV baked into the prompt. Then a Haiku judge grades the draft against its own sources — POV, format, grounding, scored 0–2 each — and the scores are persisted on the post and shown in the dashboard.
eval fails soft · scores stored forever
- 05
Illustrate
The Art Director · Claude Opus 4.8 → The Illustrator · Recraft V4.1Opus reads the finished piece and writes a symbolic image brief — a rotating metaphor device against a rotating backdrop, never a literal scene, never stock photography. Recraft renders it in the publication's orange-forward palette. If either fails, the post ships with a placeholder instead of dying.
fails soft → placeholder
- 06
Publish
The Scheduler · APSchedulerIssues go out Monday, Thursday, and Friday at 8:00 AM sharp. In auto mode the finished post goes straight to the live site; in approve-only mode it waits in the review queue for the one human in the building. A one-minute interval job flips scheduled posts live the moment their time passes.
auto or approve-only · cron owns the calendar
Human staff: one operator, standing off to the side with an accept and a reject button.
The Schedule
Three mornings, three formats
The day of the week decides the format, and the format decides the prompt. Same pipeline, three different shapes of writing.
Monday — 08:00
The Brief
200–400 words
A Smart-Brevity memo: what happened, why an operator should care, what to do about it. Built to be read standing up, between customers.
Thursday — 08:00
The Deep Dive
600–900 words
A multi-source synthesis of the week's most important cluster — the piece that connects vendor claims to what actually changes on the lot.
Friday — 08:00
The Roundup
±500 words
The only issue that never touches the news wire. It reads the week's own published posts back out of the database and writes the recap.
The Product
A public site and an admin dashboard
The product is two apps. The public site is the publication itself — print-broadsheet-meets-terminal, one dark theme, no light mode, ever. The admin dashboard is where the operator watches the machine work: pipeline status, the review queue, and every post's judge scores on its record.




No screenshots of the admin dashboard — it lives behind a login. But the review queue looks like this: every AI draft arrives already graded by the editor, and the operator's whole job is three buttons.
Every draft arrives pre-graded by the editor — the judge's scores are stored on the post, permanently.
The Decision Log
Decisions, dated and on the record
The repository keeps a dated log of engineering decisions, incidents, and migrations. A few entries that shaped the build:
Taxonomy as validated text, not database enums
Sections, formats, and story types are plain columns validated in application code — deliberately not Postgres ENUMs. A new category graduates with a one-line code edit instead of a migration. The schema stays boring; the editorial vocabulary stays free.
Three layers of auth that fail closed
Next.js middleware guards the dashboard pages, a per-route proxy verifies the NextAuth session and attaches a shared backend secret, and FastAPI enforces that secret on every route. If the secret is missing, the backend returns 500 — it never quietly becomes an open API.
Measurement is first-class
Every post carries its full classification and its judge scores as permanent columns — not logs, record. "Which kinds of posts hold up?" is a query, not an archaeology project.
The paper silently stopped printing for two weeks
Neon's autosuspend killed pooled database connections between runs, and every scheduled issue from June 18 to July 2 died on a stale socket — the cron fired, the run failed, nothing crashed loudly enough to notice. The fix was one line: pool_pre_ping=True, so every connection is tested before it's trusted. The outage and the post-mortem are documented in the repo like any other decision.
The staff writer got retired mid-season
Anthropic retired claude-sonnet-4 and the writer started returning 404s. Because every model sits behind its own service seam, the swap to Sonnet 5 was a config-level change — the newsroom noticed nothing.
Running Costs
The nine-dollar newsroom
The entire newsroom — hosting, database, and the whole editorial staff — runs on about nine dollars a month.
Monthly operating costs
Next.js 16 · React 19 · TypeScript · Tailwind v4 · NextAuth · FastAPI · SQLAlchemy · Alembic · PostgreSQL · APScheduler · Anthropic SDK · Perplexity Sonar · fal.ai · Vitest · pytest
Sirenbase was me building software for a place I worked. The Garage AI is me building a machine that does the work — then standing back and watching it publish. If you want to talk about pipelines, prompts, or papers that write themselves, I'd love to hear from you.
© 2026 John Penafiel
Six steps, no bylines
About me
Precise and fast-learning software engineer with experience in Python, JavaScript, Typescript, React, Next, Flask, SQL databases, SQLAlchemy, APIs, AWS Cloud Services, TailwindCss and MaterialUI. Adept at designing, developing, and troubleshooting full-stack applications, with a focus on responsive design, data security, and scalable solutions. Known for a blend of technical expertise, problem-solving skills, and an adaptable mindset.
© 2025 John John Penafiel. All Rights Reserved. Build with Next.js, Typescript, and TailwindCSS. 🛠️