v1.1.0Latest

Splash screens, animated.Your app, ready for agents.

An animated HTML splash screen for universal apps, experimental WebMCP support, and the same calm terminal output across every CLI command.

Add public/splashscreen.html. One file, no network, and the native splash hands over to it.

Ask an agent in plain words. It calls the tools your app registered.

Both features are opt-in. Nothing changes until you add the file or the hook.

01 / Try it

One file and one hook.

config/config.jsonThen add public/splashscreen.html
{
"WEBVIEW_CONFIG": {
"splashScreen": {
"backgroundColor": "#ffffff",
"minDuration": 1200
}
}
}
ProductPage.jsInside WebMcpProvider
import { useTool } from "catalyst-core/webmcp"
useTool({
name: "add_to_cart",
description: "Add this product to the cart.",
inputSchema: { type: "object" },
execute: async () => addToCart(productId),
})

Full setup: HTML splash and WebMCP.

02 / What's new

New since 1.0.1.

Splash screens, animated

Ship public/splashscreen.html and the native splash image hands over to your page, which stays up until the app's first page has loaded. minDuration holds it a little longer, and it is dismissed after 10 seconds regardless.

Your app, ready for agentsExperimental

useTool() registers a tool from a component, a route's tool field derives one from the route, and WebMcpProvider adds navigate, get_current_route and get_page_info. This docs site registers its own, like search_docs.

A calmer terminal

Every command prints a short header, one line per step with its timing, and one diagnostic block on failure with the error code, location, hint and docs link. The full bundler output lives behind --verbose.

03 / Goodbye, hello

Goodbye react-helmet-async, hello React 19 <head>.

MetaTag no longer depends on react-helmet-async. Route metadata from setMetaData renders through React 19's own <head> support, and head tags no longer outlive their page after client navigation. If your app imported react-helmet-async itself, add it to your own dependencies.

04 / Also fixed

Smaller things, sorted.

  • WebMcpProvider no longer throws on every page under catalyst serve. This is the one change since 1.0.2.
  • Fast Refresh works for components written as JSX in .js files, instead of reloading the page.
  • catalyst serve refuses a build whose inlined config no longer matches config/config.json.
  • Otel.init() logs to console instead of throwing when the app never called configureLogger().
  • catalyst-core no longer imports prop-types at runtime without declaring it.
  • Signing passwords are redacted from the output of a failed signed build.

Everything else on this page first shipped in 1.0.2, earlier the same day.

Thank you.

Catalyst 1.1.0 was built by these people.

Questions or ideas? Find us on Discord, X and GitHub Discussions.

Full release notes

This release contains everything in 1.0.2, namely the HTML splash screen, experimental WebMCP support and the new CLI output, plus one fix. There are no breaking API changes.

Fixes

  • WebMcpProvider no longer throws useRouterState must be used within a RouterDataProvider on every page under catalyst serve. A production build can load Catalyst's router context twice, once inlined in the app's server bundle and once from catalyst-core/webmcp, and the two copies did not share state. The context is now shared across copies.