Commits

Editorial calendar, RSS and automatic tags

Editorial calendar with AI batch generation, operations (daily backups, RSS, roadmap v3) and the first piece of v3 deployed: automatic tags with related articles.

The morning was all about the editorial calendar. At midday, operations: backups, RSS and the new roadmap. And at night, the first hit of v3: automatic tags with related articles. Three very distinct blocks, all from the same session.

Editorial calendar with batch generation

I now have a monthly view with draggable articles from one day to another: the drag triggers a PATCH on publish_at, and drafts can also be dragged to schedule them. The strong piece is the AI batch generator: up to 5 themes × 5 articles. It proposes angles, discards duplicates using embeddings (with backfill included), writes each article with keyword + Tavily, adds internal backlinks and schedules one article per day at 09:00 UTC. The batch runs as a background job with progress, cancellation and visible errors.

Before calling it done, real E2E verification in production: 1 theme × 1 article. Proposal generated, dedupe correct, article written (1,508 words in about 2 minutes), "Related reads" block inserted and article scheduled for 09:00 UTC two days from now, hidden from the public until that date. During verification a classic fix came up: the job wasn't importing ArticleService. One line, but without it there's no batch.

Polishing usability details

The articles table now marks scheduled ones with a badge; the first attempt made it with an indiscreet black dot, fixed on the spot. From the calendar, the first use made it clear that fine-tuning was missing: the cards didn't give a sense of being draggable. Now the dragged card is highlighted (opacity + ring), so is the target day, you can drop a card over Drafts to unschedule, and double-clicking opens a panel with summary and excerpt and direct actions: edit, view on the blog, publish now, unschedule or delete.

Operations: backups, RSS and v3 roadmap

v3 roadmap set: automatic tags, multilingual, RSS and API with webhooks; out of scope social media and analytics. From the operations side, three things: automated daily backups with cron on fxserver with 14-day retention, documented Cloudflare cache purge script (pending token or bypass rule), and public RSS feed at /rss.xml with the 50 latest articles, already with an autodiscovery link in the <head>.

Automatic tags and related reads

First piece of v3 deployed: articles.tags column as JSONB and AI automatic tagging on manual save or creation — never on autosave, and only if the article has no tags and already has content. Tag filter in the admin table and at /blog?tag=. On the public post, a "Related reads" block that combines shared tags with semantic ordering via the embedding I already had stored: no AI call on render.

E2E verification: manual save generates real tags, manual backfill of 6 tags to all existing published ones, visible chips on the post, working filter and related endpoint returning 3 articles with correct semantic ordering. A fix during testing: the model sometimes returned a raw array instead of the JSON object, and the parser now tolerates both formats.

Other journal entries