Both features are opt-in. Nothing changes until you add the file or the hook.
01 / Try it
One file and one hook.
{"WEBVIEW_CONFIG": {"splashScreen": {"backgroundColor": "#ffffff","minDuration": 1200}}}
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.
WebMcpProviderno longer throws on every page undercatalyst serve. This is the one change since 1.0.2.- Fast Refresh works for components written as JSX in
.jsfiles, instead of reloading the page. catalyst serverefuses a build whose inlined config no longer matchesconfig/config.json.Otel.init()logs toconsoleinstead of throwing when the app never calledconfigureLogger().catalyst-coreno longer importsprop-typesat 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
WebMcpProviderno longer throwsuseRouterState must be used within a RouterDataProvideron every page undercatalyst serve. A production build can load Catalyst's router context twice, once inlined in the app's server bundle and once fromcatalyst-core/webmcp, and the two copies did not share state. The context is now shared across copies.