2026-06-29
v0.2.0 — tabs, and then groups
Until now rumb had exactly one page open, because the bridge was built for one. v0.2.0 is what happens when you make it many.
Every tab is its own Servo WebView, painting into its own offscreen framebuffer and exporting its own dma-buf; the compositor draws the active one. That is the honest cost of tabs in this architecture — a tab is not a cheap record holding a URL, it is a live engine holding GPU memory. So a tab left idle long enough gets discarded: its WebView is dropped, the memory goes back, and we call malloc_trim so the allocator actually returns it instead of sitting on it. There are guards. A tab playing media, or with a form in progress, or with a beforeunload handler, is never suspended out from under you.
Then groups, which took most of the time. A group has a name and a colour picked as hex or off a visual chart, collapses to a single pill, and draws as one continuous coloured underline across its tabs — a side rail instead, when the strip is vertical. Tabs drag in and out of groups, and a whole group drags as a unit.
The drag feedback took several passes. Filling the drop target with a highlight tells you roughly where the thing will land; a thin accent line on the leading edge of the tab you are hovering tells you exactly where. The second is better, and it is also what exposed an off-by-one where rightward moves inserted a slot late, so reordering only ever worked leftward.
The strip itself now sits on any of the four edges, and the vertical one drags to resize like a drawer.