isacco@gianlucaiunco:~$

Blog + editorial automation · 2025 — present

Scientifico — science blog

Scientifico is an Italian science communication blog on WordPress that publishes Gemini-generated articles through a Python script run by GitHub Actions. I started the blog in 2025 and in 2026, with the help of Claude Code, I automated text and image generation, publishing and sharing on Instagram and Telegram. I review every article after it goes live, and each one states that it was generated with AI.

Scientifico blog home page

Background

Scientifico is an Italian science communication blog built on WordPress and hosted on Altervista that automatically publishes articles generated with Google's Gemini model through a Python script run by GitHub Actions. I started the blog in April 2025 and automated its publishing in July 2026. It is my own project: I came up with the blog, designed and built the automation with the help of Claude Code, and I review every article after it goes live.

Goal

Scientifico sets out to explain science to readers without a scientific background. From the first posts in 2025 I picked the topics and an AI model wrote the texts; in 2026 I automated the whole cycle, from choosing the subject to social media. Every article states clearly that it was produced with the help of AI.

What I built

How are the articles published?

Articles are published by a Python script that GitHub Actions runs every Monday, Wednesday and Friday. Each run:

  1. picks the next of six rotating subject areas, from space to neuroscience;
  2. asks Gemini 2.5 Flash for an article in JSON, with title, HTML body, tags, meta description and image descriptions;
  3. generates a cover and an in-text image with Cloudflare Workers AI (the FLUX.2 model), falling back to Pollinations;
  4. adds a table of contents, a "read also" section and up to three open-access, peer-reviewed sources found through OpenAlex;
  5. publishes to WordPress through the REST API with dedicated authentication, setting Altervista's AI-content flag and the Yoast SEO focus keyphrase;
  6. notifies search engines of the new URL through IndexNow.

I can also request an article on a specific subject from a manual workflow without disturbing the rotation. On the site itself I added PHP snippets for JSON-LD structured data.

Instagram, Reels and Telegram

For every new article the automation publishes an Instagram carousel, a Reel and a post on the Telegram channel. The carousel has six vertical 4:5 slides drawn in Python with Pillow. The Reel is a 1080×1920 mp4 video built with NumPy and imageio-ffmpeg, with background music generated in code, so no licensed tracks are involved. Instagram goes through Meta's Graph API with the native "AI info" label, and Telegram through the Bot API; the Facebook page is connected to WordPress directly. A second workflow runs on Tuesdays and Thursdays and creates the carousel, Telegram post and Reel for one older article.

How are the generated articles checked?

Generated articles go through automated checks before they go out and through my own review once they are published. The instructions given to Gemini set the blog's voice (an opening anecdote, addressing the reader directly), rule out seven sensitive subjects and add a medical disclaimer whenever health comes up. After generation, the script compares the topic with the full archive: if it repeats a subject from the last six months it tries a different one, and if the duplicate persists it publishes nothing.

The hardest part

The main difficulties were free-tier limits, invalid model responses, duplicates on social media and off-topic images.

  • Free-tier quotas. Gemini, Cloudflare and Instagram all throttle requests: the script retries with growing waits, checks the Instagram quota before doing any work and caps images and posts per run.
  • Invalid responses. Gemini sometimes returns malformed JSON or times out, so the two cases get separate retry budgets.
  • Duplicates. A state file links each article to its carousel and its Reel, so nothing goes out twice.
  • Generic images. Image descriptions ask for one concrete subject in a photographic scene, because abstract styles produced the same picture for every topic.
  • Instagram's interface. Reel text stays clear of the areas covered by Instagram's buttons.

Images, sources and social posts are optional steps: if one fails, the article is still published.

Outcome

Today Scientifico publishes three articles a week without me starting anything by hand and shares them on Instagram, Telegram and Facebook; my part is reviewing and correcting the texts after publication. If you need a similar automation to publish content on a website and connect it to social media, you can see what I offer on the services page.