vibeapp.win

The apps

The newsroom engine

Reads Norwegian food-industry sources, has Claude draft short news stories, checks them against the sources, and queues what is in doubt.

  • Since 30 August 2026
  • Page updated 15 October 2026
  • Traced to 31 sources
The newsroom engine's queue page, empty, with the menu across the top.

The newsroom engine's queue on 3 October 2026: empty, nothing waiting for review.

What it is

Kokkekunst.no is a Norwegian news site about professional cooking. Three times a day the newsroom engine fetches articles from a fixed list of public sources, discards duplicates and noise, and asks Claude to write short stories in Norwegian. Each story is checked against the text it came from. Safe stories go out without review. If anything is uncertain, the story waits in a queue for a human.

How it works

The pipeline has eight steps, each a separate background job. We assume every source will try to give the model instructions, so Claude runs with no tools, no project context and no memory between calls. A probe checks this at startup and every ten minutes. Everything the model returns is checked against a schema.

An approved story becomes a markdown file committed to the site’s repository, and Cloudflare Pages builds the site from that commit.

Duplicates across runs

Clustering still only looks inside one run, and four stories were published twice within a month. Since 7 October each new story’s title and lead are compared with everything published in the last 30 days. A similarity of 0.75 gives a warning, and 0.9 sends the story to the queue. Real duplicates had scored 0.94 or more, and different stories at most 0.88.

Instagram Reels

Since 10 October each story gets its Reel before it is published, and a story without a Reel goes to the queue. The Reel goes out eight minutes after the story, once the site has been built. Publishing the story counts as approving its Reel. Autopilot for Reels is still off.

After the first Reels were called boring, Claude cut the wine-list Reel from 28.7 to 14.7 seconds. We tried opening films from a video model on a local GPU, but they drifted towards photos even when the model was told to draw, so we removed the tool. Since 10 October every Reel has followed a generator that Henning wanted: a globe zooms in on the place, then come a pin with its name and coordinates, up to three cards and an end card, at most 28 seconds in all. The place comes from a GeoNames register, never from the model.

The scripts had to quote the story word for word. On 8 October one Reel put a points score right after the bronze winner, but the score belonged to another competitor. Both were in the story, so the check let it through.

Preview and reality

The changelog promised that the preview shows exactly what goes out. On 12 October we tried the flow on a story about state aid and found faults in Claude’s code. If a draft was corrected after its Reel was made, the Reel was released drawn by the fixed rules: a different film from the one previewed. Now the worker notices a corrected draft and holds the Reel for approval. The quote card had shown indirect speech in quotation marks. A quote now needs real quotation marks or a dash line. Quote blocks never reached the director at all, and that is fixed too.

What we expected, and what happened

Read it like a code review. Each removed line is something we expected, from a plan, a spec, a README or a code comment. The added line under it is what the history shows actually happened.

Expected: The spec assumed the CLI flag --bare would isolate the model from tools and project context.

Happened: Checked against claude --help in Claude Code 2.1.251, --bare reads only an API key and never the subscription login. The engine uses --safe-mode instead, and a startup probe checks that tools really are off.

Expected: The source register listed fourteen publishers with names and feed URLs, ready to use.

Happened: It had been seeded from memory. Half of the feed URLs did not exist, and three of the fourteen publisher names were wrong, one of them a name the publisher had stopped using eight years earlier. The names and homepages were checked against the publishers' own pages on 30 August.

Expected: A code comment in the fact gate said name extraction was symmetric, so the heuristic's noise would cancel out between draft and source.

Happened: It was not symmetric, and the gate sent 3 of 3 real drafts to the queue. After the fix it queued 4 of 10 (40 %), under the project's own limit of 50 %, measured without any new model calls.

Expected: Clustering would merge several articles about the same event into one story.

Happened: Clustering only looked inside a single run. The same jury announcement came from the organiser on 31 August and from a trade paper on 2 September, and both were published. The gates had flagged the second one; it was released from the queue anyway and later became the first story ever unpublished. The changelog's verdict: the gates worked, they were overruled.

Expected: Until clustering could see across runs, a manual rule would stop repeats: search the archive before releasing a story from the queue.

Happened: Three more stories were published twice: the world championship in Luxembourg, the WorldSkills result and the Norwegian championship winner. On 7 October a duplicate check was added that compares title and lead with the last 30 days of published stories.

Expected: The word list in the sensitivity gate would catch stories about deaths, lawsuits, court orders and convictions.

Happened: Claude had written the stems without æ, ø and å, while the normalization keeps those letters. So the list never matched words like 'dødsfall' or 'søksmål', and only the model half of the gate stopped such stories. This was found while building Reels and fixed with tests.

Expected: The status page's visitor numbers would show traffic to kokkekunst.no.

Happened: The analytics data is stored per account, and the account is shared with vibeapp.win. The query Claude wrote filtered only on time, so pages like /apps showed up among the kokkekunst.no numbers. Since 6 October only kokkekunst.no hostnames are counted.

Expected: The rule that every piece of text in a Reel script must appear word for word in the story would keep the Reels true to the story.

Happened: In the Reel about a bronze medal, the script put a points score right after the bronze winner, but the score belonged to another competitor. Both were word for word in the story, so the check let it through. The scene was swapped by hand, and the task log notes that the word-for-word check does not catch this kind of error.

Expected: With Claude writing a script for each Reel, the Reels would differ from each other.

Happened: Of the first six Reels, four got the same gold light and three opened with a clock. On 9 October the director was given the subject, light and scenes of the last six Reels and asked to pick something different.

Expected: Opening films made by a video model (Wan 2.2) on a local GPU, in a drawn style, would open the Reels.

Happened: The model drifted towards photos even when told to use a drawn style. The trial was replaced by a pencil drawing made in code, and the AI tool was removed on 10 October. The pencil opening was itself replaced the same day by the globe generator.

Expected: The changelog said the preview and the Reel that is sent are built from the same script, so the preview shows exactly what goes out.

Happened: On 12 October we tried the flow on a story about state aid. If a draft was corrected after its Reel was made, the change reached the Reel only at publishing. The direction was then reset and the Reel was released drawn by the fixed rules, so it was a different film from the one previewed. Claude's fix makes the worker notice a corrected draft and hold a Reel without a script for approval.

Page history

  1. First version of this page.
  2. 3 October 2026: the newsroom engine's repository had no new commits since this page was last updated, so the page was re-checked and left unchanged.
  3. 4 October 2026: no new commits in the newsroom engine since the last update, so we only recounted the commits (still 39); the rest of the page is unchanged.
  4. 2026-10-08: The page now covers the cross-run duplicate check, Instagram Reels with a script Claude writes for each one, the sensitivity word list that never matched æ, ø and å, and the visitor count that included vibeapp.win, plus 18 new commits.
  5. Updated 2026-10-12: since 10 October each story's Reel is made before the story is published and goes out eight minutes after it. Reels now use a globe-based generator, a trial with AI-made opening films was dropped, and the page now covers a limit of the word-for-word check.
  6. On 12 October 2026 the newsroom engine got a fix so that the previewed Reel is the one that is sent, after a trial run on a story about state aid found four faults; the page adds that fix and an updated commit count.