A supermarket blog, written with AI
For a supermarket chain, AI writes, optimizes for Google and illustrates every article; the team just reviews and approves. We also rescued 429 articles from the old WordPress site and cleaned them of malware. It's finished and in its launch phase.
Next.js · NestJS · Python · OpenAI y Gemini · PostgreSQL- 429
- articles rescued from WordPress
- $0.60
- to analyze 499 articles with AI
The client’s problem
A supermarket chain in Paraná, Brazil, had a WordPress blog with almost 500 articles and nothing new since November 2025. Keeping it going had become too much work, and when we looked closer we found something worse: 425 articles had hidden malicious code, and not a single image had alt text.
They wanted to get back to publishing one or two articles a week without hiring anyone. The goals were specific: under 30 minutes of human work per article, under $10 a month on AI, and a look that felt professional and on-brand.
How it works
We built a custom admin panel with an editor, SEO tools, an image library, pages and menus, plus a public blog in Portuguese.
Here’s how an article comes to life:
- Someone on the team types the idea into the panel. The system pulls context from the web so the piece doesn’t come out generic.
- Three agents work at the same time: one writes, another prepares the title, description and keywords for Google, and the third designs the images.
- Only the text is generated at first. Images get created once the team approves it. That way the text can be revised several times without paying for images that end up thrown away.
- The article stays a draft until a person publishes it. The AI never publishes on its own.
Each agent has a main model and two backups: if OpenAI fails, it switches to Gemini and then to a third provider. The agents’ instructions can be edited from the panel, with version history and the option to roll back if a change makes the writing worse.
Everything runs on the client’s own server, with no pay-per-use services involved.
The tough call and why
The internal panel was translated into three languages (Spanish, Portuguese and English), so the obvious question was whether to publish the blog in all three as well.
We measured before deciding. The panel had nearly a thousand strings translated three times over for just three internal users, and a quarter of the Spanish translations were identical to the Portuguese. Publishing in three languages meant weeks of development, tripling the editorial workload for good (24 articles a month instead of 8), and putting Google rankings at risk with machine translations.
The public blog stayed in Portuguese only, the language all of the chain’s customers speak. We’ll revisit that only if the chain starts operating outside Brazil or real traffic shows up in another language.
A smaller decision made the same way: for images we used a model 13 times cheaper than the best-known one. The quality gap wasn’t worth the price for a supermarket blog.
What broke along the way
- A healthy server flagged as down. On the first deployment the site was responding fine, but the health check was pointed at a different network address than the one the app was listening on. The load balancer treated it as dead and visitors got a 503 error. We fixed the health check address.
- The generator started without its keys. A configuration library wasn’t passing the credentials to every part of the system, so every article request failed silently. We now load the credentials explicitly and added tests.
- The anti-abuse limit locked out the team itself. The whole panel goes out through a single connection, and the limit of 20 requests per minute ran out just by opening one screen. We raised it for the panel and kept it strict only on login.
- The AI gave everything a 75. The SEO score came from a model that returned almost the same number for any text. We replaced it with fixed rules that can be checked.
- Five articles deleted by mistake. During the migration, a cleanup with a bad filter deleted five articles. We recovered them from the original backup we made before touching anything.
Results
The system is finished and tested end to end; the new blog is in its launch phase.
- WordPress migration: we analyzed 499 articles with AI for $0.60 total, without a single failure. We rescued 429 of them, cleaned of the malicious code, along with 1,774 images that now have alt text.
- Cost per new article: the budget is about $0.30 of AI per article, covering text, SEO and images.
- Site quality: 92 to 94 out of 100 for speed and 100 out of 100 for accessibility and SEO, according to Google Lighthouse, measured before launch.
- Reliability: more than 400 automated tests on the server and 59 on the agents, which run before every change.