← {Portfolio}
{AI project: 01} AI feature

Rebokser newsroom

An AI news pipeline running on a VPS. It collects boxing news from sources in many languages and turns each one into a ready English draft in WordPress.

{My role}
[Your role, e.g. idea, pipeline, panel, deploy]
{Backend}
Python, Flask, SQLite, Claude API
{Panel}
React, TypeScript, Vite, PWA
{Infra}
VPS, systemd timers, Caddy, WordPress
{Year}
2026

{The problem}

One news story, ten manual steps

An English boxing news site lives on speed. The news, though, appears across sites in English, Polish, German, Spanish and more, and each story had to be handled by hand. [Add how long one article used to take.]

  1. 01Check many sources in several languages
  2. 02Spot stories that were already covered
  3. 03Rewrite the story in English, keeping every fact
  4. 04Add each main fighter's record, without KO counts
  5. 05Pick one of 29 news types and the weight division
  6. 06Match the venue to a city or country background
  7. 07Write a three-level news brief
  8. 08Choose tags for the main fighters
  9. 09Follow the house style rules
  10. 10Paste it all into WordPress in the right format

{The solution}

The pipeline, from source to draft

Machines do the repetitive work around the clock. The editor keeps the final say: every story ends as a draft, not a published post.

  1. {Runs by itself · VPS, around the clock}
  2. 01 every 30 min

    Collect

    19 news sites, checked first by a diagnostics tool for RSS, robots.txt and blocking.

    02 every 5 min

    Watch X

    Three accounts are polled for short FLASH posts with their own one-paragraph format.

  3. 03 on fetch

    Extract

    Trafilatura pulls the article text, duplicates are dropped and everything lands in SQLite.

  4. 04 after each run

    Notify

    A push on the phone via ntfy or Telegram lists the new titles.

  5. {Editor in the loop · one tap at a time}
  6. 05 one tap

    Prepare

    Claude rewrites the story in English and returns tags, a metadata decision and a brief as JSON.

  7. 06 instantly

    Validate

    Code builds the metadata block, picks the background and flags style problems for the editor.

  8. 07 one tap

    Draft in WP

    The finished post goes to WordPress as a draft. The editor reviews it and publishes.

{Key idea}

The model decides.
The code builds.

The model returns plain JSON: a title, paragraphs, tags, a metadata decision and a brief. Code then does everything that has to be exactly right. It inserts separators, builds the metadata block, picks the background image and rejects briefs that break the site's rules. The model never writes URLs.

{Model} {Code}
Rewrites the facts in English Inserts paragraph separators
Chooses the news type and division Validates them and builds the metadata block
Names the city or country Picks the matching background image
Writes the three-level brief Rejects a brief that breaks the site rules
Flags a possible duplicate Lints style: dashes, records, weight classes

{Output}

One story, three outputs

{01: Article}

Joshua Stops Prenga in Second Round

Former unified Heavyweight Champion Anthony Joshua (30-4) defeated Kristian Prenga (20-2) via a second-round knockout at the Jeddah Superdome in Saudi Arabia.

During the opening round, Prenga scored two knockdowns against Joshua. Following the break, Joshua utilized his jab to reestablish distance and control the pace of the match.

{02: Metadata}

type      NORMAL
division  HEAVY
country   sa → background image picked by code
tags      joshua, prenga

{03: Brief}

Former unified Heavyweight Champion Anthony Joshua (30-4) recovered from two first-round knockdowns to defeat Kristian Prenga (20-2) by second-round knockout in Saudi Arabia.

  • Bout progression
  • Stoppage details
  • Future implications

Source: a published example from the project's instruction set

{Panel}

A newsroom in your pocket

The panel is a PWA built mainly for the phone, with bottom navigation, filters in a sheet and a reader with actions under the thumb. On desktop it adds an image editor for 400×131 backgrounds and 200×250 fighter photos.

{In the panel}

  • News list with filters
  • Reader with the AI draft and one-tap actions
  • FLASH posts from X
  • Image editor for backgrounds and fighter photos

{Guardrails}

AI you can trust with facts

{01}

Same facts only

No new information, down to round numbers, scores and venues.

{02}

Records from a database

Main fighters get their record from the boxer database, never from the model's memory, and never with KO counts.

{03}

House style in the prompt

Weight class names, capital Champion, no dashes, no quotation marks in titles.

{04}

API wallet

Every request is counted by tokens, so the panel shows what is left on the account.

19
news sources diagnosed
3
X accounts watched
29
news types to choose from
169
backend tests (pytest)
27
frontend test files (Vitest)

{Result}

[Before and after: time per article, articles per day, cost per article from the API wallet.]

{Takeaways}

[What you learned about writing instructions for a model and keeping it to the facts.]

{mattstudio}

Thanks for
looking.

← {Back to portfolio}