obOB STUDIO
← All works
site

AI Pulse

Everything happening in AI, in one place.

Loading AI Pulse

Tip: click Fullscreen for the best experience.

One page, no build step

AI Pulse is one HTML page, one stylesheet and two scripts. No build step, no framework, no server. data.js holds everything the page knows - five countdowns, twelve dated releases, thirteen models - and script.js turns that into DOM on load. The footer says it plainly: edit data.js and refresh.

Read the build notes ↓

About this project

An AI news and model-release tracker that pulls live headlines with a graceful fallback to bundled data. Its signature is an honesty-first accuracy badge system. Every countdown and headline is labeled confirmed / likely / rumored / speculative. Alongside live countdowns, a release timeline, and a model tracker.

Built with

JavaScriptRSS / News APIIntersectionObserver

How to use it

Click the moon / sun button (top right)
Toggles between the dark and light theme, and saves the choice to localStorage so it survives a reload.
Click a news chip (All / Releases / Research / Industry)
Filters the headline grid down to one auto-guessed category.
Click a company chip under Release Timeline
Narrows the timeline to a single company - All, Anthropic, OpenAI, Google, Zhipu, Moonshot, Microsoft or MiniMax.
Click a header nav link (Coming Soon / News / Releases / Models)
Smooth-scrolls to that section, with the sticky header height already accounted for.
Click a headline title
Opens the original article from the live feed in a new browser tab.
Hover or focus an accuracy badge
Reveals the note explaining what Confirmed, Likely, Rumored, Speculative, Reported or Sample means.
Tab
Moves through every link, chip and button; a skip link slides down first and focused elements get a coloured ring.
Swipe the nav row (phones under 620px)
Scrolls the four section anchors sideways as a snapping strip instead of hiding them behind a menu.
Type an email and click Notify me
Prints a thank-you line and clears the field - there is no backend behind it.

Build notes.

One page, no build step

AI Pulse is one HTML page, one stylesheet and two scripts. No build step, no framework, no server. data.js holds everything the page knows - five countdowns, twelve dated releases, thirteen models - and script.js turns that into DOM on load. The footer says it plainly: edit data.js and refresh.

It is not affiliated with OpenAI, Anthropic, Google or any other lab it tracks. It is a public news search plus a dataset I keep by hand.

Four counters at the top tick up from zero over about a second: models tracked, verified releases, launches incoming, and the word LIVE for the news feed. Below that sits a featured countdown, then all five countdowns again in a grid, the news feed with its filter chips, a release timeline you can narrow to one company, and a model tracker marking each model available, coming soon, rumored or suspended.

Where the headlines come from

Every page load fires one fetch at rss2json, which is wrapping a Google News RSS search: artificial intelligence OR OpenAI OR Anthropic OR Gemini, last 14 days, US English. It sets cache: "no-store", so it is a fresh pull each time.

The first 12 results get chewed on. Google News formats headlines as "Some headline - Publisher", so I split on " - " and pop the last piece off as the source. That breaks the moment a headline contains its own hyphen-space and part of the title gets filed as a publisher. Descriptions arrive as HTML, so they go through a throwaway div to come back as plain text, then get cut at 160 characters. The category is a regex guess on the headline text - launch, unveil, rolls out, debut mean "release"; paper, benchmark, study mean "research"; everything else falls into "industry".

If any of that breaks - bad status, empty items array, network gone - the catch swaps in three bundled sample stories and the status bar turns amber to say the live feed is unavailable. The page never renders empty.

Six labels instead of one confident voice

There are six accuracy labels: Confirmed, Likely, Rumored, Speculative, Reported and Sample. Each carries a note, and that note goes into both the title attribute and aria-label so it is not mouse-only. The legend under the countdowns is generated from the keys of the same object the badges read, so a level cannot exist without showing up in the legend.

That system exists because most of this page is not fact. In the dataset I seeded, Gemini 3.5 Pro is marked "likely" (teased, no exact day), GPT-5.6 is "rumored", and both a Fable 5 return date and a hypothetical Claude Opus 4.9 are "speculative" - my own comment on the Opus entry calls it a pure estimate. I would rather show a guess with a label stuck to it than quietly imply I know.

The countdowns stop being honest once the date passes

renderTimer does exactly one comparison: if the target date minus now is at or below zero, print "Released!". It never looks at the accuracy badge sitting three lines above it. So a date I invented flips to a celebration the same way a date a company confirmed does.

As I write this, every dated countdown has already gone past - Fable 5 on 15 July, Opus 4.9 on 20 July, GPT-5.6 on 25 June, Gemini 3.5 Pro on 30 June - so the grid reads "Released!" across the board whether or not anything actually shipped. That is the cost of hardcoding dates into a file stamped with a fact-check date of 18 June 2026 and then not going back.

The one card that behaves is the wider-access Mythos 5 entry, where the date is null. Null renders "No date announced" and counts toward nothing. Given how the others aged, null turned out to be the more honest value.

Things worth poking at

Click the moon in the top right. The theme flips to light and stays that way - it is stored in localStorage under aipulse-theme, so it survives a reload. Light mode is not just a tint: the gradient headline text switches to different colour stops, because the original purple failed contrast on a pale background. The CSS still has the measured ratios in a comment, 5.03:1 and 5.02:1, and a note on which stop got dropped.

Turn on reduced motion in your OS and reload. The stat counters jump straight to their final numbers instead of animating, the three blurred background orbs stop drifting, and the scroll-reveal sections are just there from the start.

On a phone the nav does not collapse into a hamburger. Below 620px it drops onto its own row as a horizontally scrollable strip with snap points and a soft fade at both edges, so all four anchors stay reachable.

And press Tab from the very top. A skip link slides down before anything else takes focus.