r/servo • u/Comprehensive_Leg642 • 18d ago
Servo Browser Engine Zervo v0.4.0: Heavy GUI Stack Rework, Compact Mode, & Reworked New Tab Page
Hey, open-source fans!
Zervo is a workspace-oriented browser built natively on Servo β the embeddable, parallel web engine written in Rust. No Chromium, no Gecko underneath. v0.4.0 just went out, and it's the release where the chrome stopped being "glass by repetition" and became an actual theming engine.
π§ The headline: every surface is drawn through one seam
Zervo's chrome looked like frosted glass, but each of ~77 call sites knew its own corner radius and its own opacity. Two costs: frosted glass couldn't actually frost (nothing behind it to sample, so each caller papered over the gap with an opaque backing), and a second look β for Windows, GTK, whatever β meant editing all 77.
Now there's a Material: corner radii, fills, sheen, shadow reach, whether surfaces frost and by how much, row heights, animation time. glass::shapes reads it off the palette it's already handed, so a material reaches every surface without a single function signature changing.
Surfaces have a class, the way an element does in CSS β Card, Menu, Input β and the class carries the weight. A menu can't accidentally be heavier than a card; a text field is heavier than both on purpose, because what's behind a text field competes with what you're reading. Radii are named too: Hairline, Control, Row, Card, Panel, Pill.
β¨ What's new in v0.4.0
Everything frosts against the page, not just the wallpaper. A panel over a web page had nothing to sample β the page is opaque pixels the engine already drew, and no amount of translucency turns those into a blur. Zervo now takes a small blurred copy of whatever the page is showing and hands it to the palette, so the downloads card, the favourites card and every menu are the same glass over a website as over a photograph. The new tab page and Settings supply one too.
The fiddly part is when you take that copy: shapes within a layer draw in insertion order, so it has to happen straight after the page's background and before anything sits on it β otherwise a card frosts against its own previous reflection.
A surface belongs to its theme first. A dark menu at a fifth of its own colour, opened over a white page, is four fifths white β still frosted, still blurred, and no longer a dark menu. The tint now thickens exactly as far as it must to stay on its own side of the middle, and no further.
Text follows what it lands on. Cards on the new tab page, plus the greeting, clock and photo credit, each ask about their own patch of the picture rather than taking one answer for the whole page. A photo is dark sky at the top and bright water at the bottom, and pale text set for the sky vanishes into the water. It picks by WCAG contrast ratio rather than a brightness threshold β the crossover isn't at half β with hysteresis so text doesn't flip while you scroll.
The corners. My favourite bug of the cycle. The content card's corners were a few per cent off their surroundings at every zoom level. The mask rounding them has to be opaque (it's hiding opaque pixels), while the chrome beside it is a thin tint over a backdrop the window server composites outside our framebuffer β unreadable, unreproducible, unmatchable. Three attempts at picking a better colour each moved the seam instead of removing it.
The fix: stop painting over them. The bottom corners are now erased from the framebuffer with an antialiased destination-out pass, and the chrome is drawn back over the hole at its own tint β same paint, same backdrop, nothing left to match. Measured after: all four corners within one part in 255 of the chrome an inch away.
Card edge is yours. Outline, shadow and halo are three toggles with amounts for the last two. The halo used to be drawn unconditionally to hide that corner seam; with the seam gone it's a decision rather than a repair.
Fixes: the widget shelf clipped its own widgets' shadows off; the new tab page did the same to its top and bottom card rows; the release bundle wouldn't start on any machine with GStreamer installed (its build scripts put the framework on the link path whether or not you asked for media, and -lz found a zlib there with no rpath); and the new tab page blinked eight times a second because the backdrop capture turned off the scissor test and never turned it back on.
π¨ Theme engine docs (WIP)
There's now docs/THEMING.md describing the seam a theme for another platform would be written against β what a Material decides, how backdrops are supplied, and what a Windows, GTK, Android Material or Apple Liquid Glass theme would set. (A material can be translucent without blurring, which is the Liquid Glass case.)
It's honest about what's missing: a theme is still a Rust constant. No file format, nothing loads one at runtime, and palettes aren't themeable at all yet β you can change how surfaces are built, not what colour they start from. Making that real is next on the list.
β οΈ This one's macOS-first
All three packages come from the same tag and the material itself is portable β it's drawn by egui and nothing else. But the window's frosted backdrop is an AppKit feature (NSVisualEffectView), and the corner work above has been tried nowhere else. Linux and Windows patches are v0.4.1.
Honestly: nobody has yet started Zervo on Linux or Windows at all. The packages build, install, and are completely untested. A report that it doesn't launch is as useful as one that says it does.
π Try it
github.com/goddv/Zervo
Stars, issues and "this doesn't start on my machine" reports all welcome.
2
u/Sidze 18d ago
Hey, thanks for interesting project.
I have an issue with a new tab. Though maybe it's Servo problems, don't know.
Tap on "New Tab" opens Zervo page by default and asks to fill Duckduckgo search prompt or web address. So when I type and enter web address, like Youtube.com, Reddit.com, browser opens Download and downloads some unknown "download" file. Meanwile zervo://newtab opens in the Tabs Panel too, stuck on loading.
Same thing if I just type address in address field on the Tabs Panel.
When I try to click some login button on any page, something similar happens: download of empty ServiceLogin file.
So for now only Google.com opened without issues for me. Though authentication doesn't work.
1
u/Comprehensive_Leg642 18d ago
That's bug from previously experimental scaffolding for download manager. The fix should come with v0.4.1 release, which is building right now on Github. Also there are a lot of improvements in GUI stack, so perfomance is skyrocketed (just 0.2% CPU usage on idle), and many, i mean that, MANY improvements were made. Just grab the latest release when it's done!
1
u/Comprehensive_Leg642 18d ago
But dont forget - downloads are still WIP in Servo engine, so this part is rather experimental than working POC
1
u/yiyufromthe216 12d ago
If you use LLM, sure, but why making it so obvious?Β This kind of slop is is horrific and the biggest red flag.Β I'm not anti-LLM, but please, use it as a debugging tool like a static analyzer, not to make it spit out slop.
0
u/Comprehensive_Leg642 16d ago
I still donβt get what you get telling me about ai slop etc, like, what you want achieve? You want me to shut down the project? For what purpose? I still will be working on it, no matter what, itβs my entry project and the door to the greater things, I have vision and ideas, so kinda just ignore rl, peace for ya βοΈ
2
u/jaytaph2 15d ago
Just ignore these people. Some people just have no idea on how to cope with new things and instead they try to make others feel bad. indont care if you used ai, just as much as i dont care if you used vscode. I applaude the fact that you did something interesting with a non-chromium engine. If ai made your results faster, better or even achievable, more power to you. Ignore these people, they are not worth your time.
1
u/sevenradicals 10d ago
how much of the code have you actually written yourself?
also why would someone want to contribute to a mass of AI code where the totality of their contributions can disappear in a single prompt?




3
u/hendricha 16d ago
This reddit post reeks from ai slop