Notes

Editorial calendar, RSS and automatic tags

Editorial calendar with AI batch generation, operations (daily backups,

3 min read

The morning was about the editorial calendar. At noon, 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 already have a monthly view with articles draggable from one day to another: drag does 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 topics × 5 articles. It proposes angles, discards duplicates with 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 in a background job with progress, cancellation and visible errors.

Before calling it done, real E2E verification in production: 1 topic × 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 didn't import ArticleService. One line, but without it there's no batch.

Polishing usage details

The articles table now marks scheduled ones with a badge; the first attempt used an overly subtle black dot, fixed on the spot. From the calendar, the first use made it clear fine-tuning was needed: the cards didn't feel draggable. Now the dragged card is highlighted (opacity + ring), so is the target day, you can drop a card on Drafts to remove the schedule, 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 locked in: automatic tags, multilingual, RSS and API with webhooks; social networks and analytics out. On the operations side, three things: automated daily backups with cron on the fxserver with 14-day retention, Cloudflare cache purge script documented (pending token or bypass rule) and public RSS feed at /rss.xml with the latest 50 articles, already with autodiscovery link in <head>.

Automatic tags and related reads

First piece of v3 deployed: articles.tags column in 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 already stored: no AI calls on render.

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

Other journal entries