Rxova

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.

  1. Shared chrome, two new sections, and analytics on rxova.org

    WebsiteBrandfeature@rxova/brand@0.8.2

    One header and one footer across every page now, both from @rxova/brand.

    The landing gains a “Why Rxova” section and a maintainer block, with a longer /about page behind them.

    Traffic is measured by Cloudflare Web Analytics, chosen because it sets no cookies and does not track the reader — page path and referrer, in aggregate, and nothing else.

    Jonatan Kruszewski

  2. Images in posts, validated before they merge

    Brandfeature@rxova/website-schemas@0.3.0

    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

  3. The blog and this feed go live

    WebsiteBrandfeature@rxova/brand@0.5.0

    /blog and /updates are 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/brand already exports.

    Jonatan Kruszewski

  4. The docs ingest contract

    WebsiteJourneyuse-everywherereact-inputsinfra

    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

  5. Rxova.org gains a blog and an updates feed

    WebsiteBrandfeatureinfra

    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

  6. use-everywhere 0.4.0

    use-everywherereleaseuse-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

  7. Clearing the audit backlog

    Journeyreact-inputsuse-everywherefixinfra

    pnpm audit is 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

  8. One Turborepo standard across every repo

    Journeyuse-everywherereact-inputsBrandinfra

    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 audit working again.

    Jonatan Kruszewski

  9. Docusaurus out, Astro Starlight in

    use-everywherereact-inputsJourneydocsfeature

    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

  10. A design system for rxova.org

    Brandrelease@rxova/brand@0.1.0

    Four surfaces on one origin only feel like one site if they share their tokens. @rxova/brand holds 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

  11. Every docs site points at the aggregator

    Journeyreact-inputsuse-everywhereinfra

    Each project used to deploy its own GitHub Pages site at its own URL. All three stopped, and now take their url and baseUrl from 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

  12. Three input libraries become one

    react-inputsreleasebreaking@rxova/react-inputs@0.1.1

    react-intl-currency-input, react-feedback-stars and react-otp-slots were 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-input and @rxova/react-otp-input, with @rxova/react-inputs as the umbrella if you want all three. The old package names are deprecated, and @rxova/codemod rewrites the imports for you.

    Jonatan Kruszewski

  13. rxova.org goes up as an aggregator

    Websitefeatureinfra

    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

  14. Publishing over OIDC, with size budgets to match

    use-everywhereinfra

    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

  15. The use-everywhere docs, rewritten as walkthroughs

    use-everywheredocs

    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

  16. An Inspector, and typed channels bound once

    use-everywherefeature

    <Inspector /> shows the live bus — channels, peers, who is leader — and ships on a use-everywhere/devtools subpath so it stays out of the bundle unless it is asked for.

    defineChannel binds 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

  17. Leader election, so exactly one tab does the work

    use-everywherefeatureuse-everywhere@0.2.0

    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

  18. use-everywhere is up

    use-everywherereleaseinfrause-everywhere@0.1.0

    State and messages that exist in every tab, window and worker — the first cut is on npm. @use-everywhere/core owns the bus, and use-everywhere wraps 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