by fschuett | 2025-10-20 15:59:07+00:00
I know about Dioxus / Blitz, but it's a very, very different project. The only common part is that both Azul and Blitz use taffy for flexbox / grid, but both the technologies, architecture, funding and goals are extremely different:

Blitz:

- Custom renderer (Skia?) vs Azuls WebRender fork (to get rid of any C dependencies)

- Stylo (CSS parser) vs azul-css (to support compilation of CSS to const items)

- HarfRust (font shaping) - vs allsorts (I used allsorts also in printpdf, so it fits)

- Skrifa (font parsing) - vs allsorts again (simplifies things)

- Fontique (font selection) - vs rust-fontconfig (custom pure-Rust rewrite of fontconfig)

- Parley (line breaking) - vs Azuls text3 engine

- All as separate projects vs Azuls monorepo-style

Dioxus:

- RSX macros, data + function coupled together vs Azuls "C function callbacks + HTML dataset" model

- Binary hot-patching vs Azuls dynamic linking model

- Macros vs Azuls HTML/CSS to Rust/C compiler build tool (no macros)

- Funded by YC (not sure about upsell?) vs funded by donations (once it's stable enough) and my Maps4Print cartography startup (dogfooding)

These things matter, even for small decisions. For example, Azul uses a custom CSS parser because the CSSProperty is a C-compatible enum, so that later on you can compile your entire CSS to a const fn and use CSS strings without even doing any allocations. So even on that level, there's a technological-architectural difference between Azul and Stylo.

But the core point is more architecturally: Azuls architecture is built for de-coupling the user data from the function callbacks, because I see this as the Archilles heel that all GUI systems so far have failed at:

https://github.com/fschutt/azul/blob/master/doc/guide/02_App...

Dioxus however repeats this exact same pattern again, and even the Elm architecture doesn't really fix it. I didn't finish the document but basically there is a (1) "hierarchy of DOM elements" and a (2) "graph of UI data" and those two are not always the same - they can overlap, but the core assumption of many GUI toolkits is that (2) is a tree (it's a graph, really) and (2) is always in the same hierarchy as (1), which is why GUI programming is a pain, no matter what language / framework. Electron just makes the visual part easier, but then you still need React to deal with the pain of data model / view sync.

I can collaborate on the flex / grid solver ofc, but it's very hard to collaborate on anything else because the technologies used, the goals, the architecture, etc. are very different between Dioxus / Azul. Azul is more "monorepo-NIH integrated solution" (because I often got bug reports in 2019 that I couldn't fix because I didn't own the underlying crate, so I had to wait for the maintainers to do another release, etc. - I learned from that).

As a note, the layout engine is also now heavily vibe-coded (sorry not sorry), so I don't take credit - but feel free to take inspiration or copy code. Gemini says the solver3 code is a "textbook implementation", take that as you will. My idea was to build a "AI feedback loop" to semi-automatically put the HTML input, the debug messages (to see what code paths are hit), the source code and the final display list into a loop to let the AI auto-debug the layout engine. So that part of writing the HTML engine isn't really hard, assuming the plan works out. The hardest part is caching, scrolling, performance debugging, interactions between different systems, and especially supporting the C API. Layout is comparably simple.