Skip to content

Make the package tables mutex-aware and render them from JSON - #142

Merged
wolfv merged 1 commit into
RoboStack:mainfrom
baszalmstra:feat/mutex-aware-package-table
Aug 7, 2026
Merged

Make the package tables mutex-aware and render them from JSON#142
wolfv merged 1 commit into
RoboStack:mainfrom
baszalmstra:feat/mutex-aware-package-table

Conversation

@baszalmstra

@baszalmstra baszalmstra commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

The tables claimed more than the channels deliver. Everything is built against a version of the ROS distro mutex, and builds for different mutex versions cannot be installed together, so a package built only for an older mutex is not installable today. It still got a green check. On humble that is 74 packages.

Availability is now relative to a mutex. Pick one from the dropdown and the marks, versions, coverage and every filter count follow it. The newest is the default, because that is what a fresh install resolves to. Humble reads 43% instead of 46%, and the difference is the part that was never true.

Which mutex an artifact targets comes from matching its dependency spec with py-rattler rather than parsing the version out of the string. The specs already appear in two forms and I would rather not guess at the third.

The humble packages page

Switching to an older mutex recomputes everything. Coverage drops to 32%, and
ackermann-steering-controller shows 2.40.0 with a note that 2.53.1 is one mutex away.

The same page on mutex 0.6.0

Why the tables are JSON now

Each distro page was 2.2 MB of HTML holding roughly 13,700 <img> tags pointed at a jsDelivr CDN, one per check mark. That is a lot to ship for a grid of ticks, and it made the useful things impossible: you cannot search 2,297 rows of static Markdown, or filter them, or say anything per package.

The pages are stubs now and the data is generated as JSON. A page is around 18 KB, the site build went from 14.5s to 0.3s, and the search index dropped from 537 KB to 46 KB. Nothing renders from a CDN anymore.

That opened up the parts people actually asked for:

  • Search and filter across every package in the index
  • Descriptions and licences, from the package.xml in rosdistro's distribution cache
  • Links to prefix.dev, the ROS index and the upstream repo, resolved from distribution.yaml for 99% of packages
  • A flag when a package is behind what the index released, which is 305 packages on humble
  • An Add to channel button on anything nobody has built yet, pointing at the contributing guide

Worth knowing before you review

The sidebar has one Distributions entry instead of eight. Switching distros happens in the tab strip on the page, which is written into the page rather than rendered by JS so the other seven stay linked and crawlable.

Foxy and Galactic were frozen at April 2025 because their steps in the workflow are commented out. They are regenerated once here and still left off the schedule, so the snapshot is current without putting EOL distros back in CI.

Noetic reached end of life in May 2025 but had no notice on the page. It has one now, phrased about upstream rather than about our rebuilds, since we do still rebuild it.

Distro artwork comes from ros2_documentation (CC BY 4.0) and the ROS wiki (CC BY 3.0), interface icons from the sets Zensical already bundles. Both are vendored with attribution files rather than hotlinked.

docs/data/*.json is 2.5 MB committed. It replaces 13.6 MB of generated HTML, and the workflow rewrites it on the same six-hourly schedule as before.

Everything on a channel is built against one version of the ROS distro
mutex, and builds for different mutex versions cannot be installed
together. The tables ignored that, so a package built only for an older
mutex read as available. On humble that is 74 packages.

Availability is now relative to a mutex. Pick one and the marks,
versions, coverage and every count follow it. The newest is the default,
because that is what a fresh install resolves to.

The tables also stopped being static Markdown. Each distro page was
2.2 MB of HTML with roughly 13,700 img tags pointing at a CDN, one per
check mark. They are generated as JSON now and rendered in the browser,
which makes search, filtering and per-package detail possible at all.
@ruben-arts
ruben-arts changed the base branch from master to main August 6, 2026 20:20

@traversaro traversaro left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Go for me!

@wolfv
wolfv merged commit 564d342 into RoboStack:main Aug 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants