Adi2 - Modern GUI library for Ada with CSS styling

Show HN: A Modern GUI Library for Ada: CSS Styling, XML UI, SDL3

Adi2 - Modern GUI library for Ada with CSS styling

Adi2 is a modern GUI library for Ada that brings web-like styling and declarative UI to native applications. It offers CSS-like styling with live reload, XML layouts, animations, SVG and Lottie graphics, internationalization, and asset bundling, all implemented on SDL3. The library compiles to a single binary under 10 MB, runs on Windows XP and newer, macOS, Linux, and WebAssembly, and includes an MCP bridge for AI-driven testing and automation. Whether you prefer declarative XML or pure Ada, Adi2 provides a familiar, efficient way to build cross-platform desktop UIs.

Style your UI like the web. Selectors, pseudo-classes, parts, transitions, gradients, box shadows — all in a familiar `.css` syntax. Edit the file, save, see the change. No recompile during development.
  1. Rochus

    Cool project. Good idea to use SDL3; it brings along much more than SDL2 where you had to use a lot of other libraries to become platform independent with all features. The disadvantage might be that SDL3 itself (as SLD2) is pretty big. Ada got a bit out of fashion (unfortunately) but it's still an impressive, excellent language. Still an interesting choice. Maybe you can give more information about your choice and plans with the GUI library.

  2. nicoburns

    I'm going to ask the obvious question: why ADA?

    ---

    My framework (Dioxus Native - https://github.com/dioxuslabs/blitz) would fit quite nicely into your comparison table:

    - Compiles to self-contained OS-native app bundle

    - <10 MB (compiled with Oz) or ~15MB (with O3) (can be golfed smaller)

    - GPU or CPU rendering

    - Windows 10+ / macOS / Linux / mobile / wasm / (+ web DOM with Dioxus Web)

    - Rust

    - Memory safety: borrow checked

    - Styling: CSS (support matrix: https://blitz.is/status/css)

  3. tosti

    There's so much repetition in there. E.g.: (adi-json.adb)

    if not W.After_Key (W.Depth) then

    -- things

    else

    W.After_Key (W.Depth) := False;

    end if;

    -- ...more things...

    W.After_Key (W.Depth) := False;

    And what's the deal with those filenames? If you replace adi- with TIMMEH, you'll see what I mean.

    Code should be more DRY (don't repeat yourself).

More from this day

2026-08-24