Updates
What is moving across the projects. Each entry links out to the release it came from — the per-project changelogs stay canonical for exactly what changed, and the blog covers why.
Images in posts, validated before they merge
Posts can carry a cover and embed images, optimised through sharp on the way out.
Alt text is required rather than encouraged, and a missing one is a failed build, not a review comment. Every embedded path is checked to resolve on the pull request that writes it — a typo’d image should not survive until the deploy.
Jonatan Kruszewski
The blog and this feed go live
/blogand/updatesare built in the brand repo and mounted on rxova.org as two more sources, through the same ingest path the project docs use.Both now sit under one shared layout with a real menu, and the components rxova.org had duplicated were deleted in favour of the ones
@rxova/brandalready exports.Jonatan Kruszewski
The docs ingest contract
rxova.org used to check out three repos and build their docs itself, which meant one project’s broken build took the whole site down with it.
Each repo now builds its own docs and ships them as a release asset; the site ingests the artifact. A project either publishes something valid or the site keeps serving the last good copy.
Jonatan Kruszewski
Rxova.org gains a blog and an updates feed
I want to document how Rxova gets built, not only ship it. Two pieces were missing.
The blog is for reasoning — why a design went one way instead of the obvious other way, and what broke on the way there.
This feed is for what actually moved. It filters by repo and by tag, so you can follow one project without reading about the rest.
Jonatan Kruszewski
use-everywhere 0.4.0
The Turborepo migration, the Starlight docs and a single-branch release model, cut as one release.
No API changed. It is the release that makes the next ones cheaper.
Jonatan Kruszewski
Clearing the audit backlog
pnpm auditis only useful if it is ever green. svgo was pinned to a vulnerable 3.3.3 by an override, so it got unpinned; brace-expansion, js-yaml, webpack-dev-server and dompurify were resolved behind it.Dropping Docusaurus left sixteen overrides pointing at packages no longer in the tree, and those went too — a stale override is a silent way to hold a dependency back.
Jonatan Kruszewski
One Turborepo standard across every repo
Four repos had drifted into four ways of running the same six checks. They now share one Turborepo pipeline and one CI shape, so a fix to the build order is made once.
Node 24, TypeScript 6 and pnpm 11 across all of them, which also got
pnpm auditworking again.Jonatan Kruszewski
Docusaurus out, Astro Starlight in
All three docs sites moved to Astro Starlight. The landing already was Astro, so this leaves one framework across the whole origin — and dropped a webpack build that had been the flakiest job in every pipeline.
react-inputs took the chance to restructure: one component library with a flat sidebar and shared guides, instead of three manuals bolted together.
Jonatan Kruszewski
A design system for rxova.org
Four surfaces on one origin only feel like one site if they share their tokens.
@rxova/brandholds the colours, type and spacing, a Starlight theme built on them, and the header, footer and project switcher every surface mounts.Social cards are generated from the same tokens rather than drawn by hand, so a palette change reaches the previews too.
Jonatan Kruszewski
Every docs site points at the aggregator
Each project used to deploy its own GitHub Pages site at its own URL. All three stopped, and now take their
urlandbaseUrlfrom the environment instead of hardcoding one.The same build therefore works standalone at
/and mounted at/packages/<name>/, which is what let rxova.org host them without forking anything.Jonatan Kruszewski
Three input libraries become one
react-intl-currency-input,react-feedback-starsandreact-otp-slotswere three repos with three CI setups, three docs sites and three release processes for what is really one problem: the tricky React inputs.They are now
@rxova/react-intl-currency-input,@rxova/react-rating-inputand@rxova/react-otp-input, with@rxova/react-inputsas the umbrella if you want all three. The old package names are deprecated, and@rxova/codemodrewrites the imports for you.Jonatan Kruszewski
rxova.org goes up as an aggregator
One origin, several projects. An Astro landing sits at
/, and each project’s docs are built in its own repo and mounted as a static tree under/packages/<name>/.That keeps every project owning its own docs while readers only ever learn one domain. It also means every cross-project link has to be absolute, which is the first thing the shared chrome had to get right.
Jonatan Kruszewski
Publishing over OIDC, with size budgets to match
npm publishes now run through trusted publishing — OIDC, no long-lived token in the repo — and every package carries provenance.
The rest of the gate went in at the same time: a changeset is required before a published package can change, each public export has its own size-limit budget, and per-file coverage has to clear 95%.
Jonatan Kruszewski
The use-everywhere docs, rewritten as walkthroughs
The docs were a hook list, which answers “what does this do” and never “why would I reach for it”. They are now walkthroughs that build something, with a per-hook reference behind them for when you already know what you want.
A concepts layer, recipes, a testing guide and a limitations FAQ fill the gaps — including the honest list of what the library cannot do.
Jonatan Kruszewski
An Inspector, and typed channels bound once
<Inspector />shows the live bus — channels, peers, who is leader — and ships on ause-everywhere/devtoolssubpath so it stays out of the bundle unless it is asked for.defineChannelbinds a channel and its message type at module level, so the shape is declared once instead of being repeated at every call site.Jonatan Kruszewski
Leader election, so exactly one tab does the work
Shared state is the easy half. The hard half is that five open tabs will happily run the same poll five times. Leader election picks one, and hands the role over when that tab closes.
Persistence landed alongside it, opt-in rather than automatic, plus an observable debug seam on the bus for anyone who needs to see what is actually crossing it.
Jonatan Kruszewski
use-everywhere is up
State and messages that exist in every tab, window and worker — the first cut is on npm.
@use-everywhere/coreowns the bus, anduse-everywherewraps it in React hooks.It arrived with the parts that are painful to add later: CI on every push, CodeQL, coverage gates, and licenses.
Jonatan Kruszewski
No entries match those filters.