Skip to content
CAI
Software that uses CAICheck a score

elkowar/eww

56.7

Adequate · 29 September 2026

12k

lines of production code

Rust

with JavaScript

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Eww is a daemon-based desktop widget system that renders user-defined interfaces using the Yuck markup language and SCSS styling. It manages reactive state through a scope graph and supports dynamic data via a built-in expression language and background script execution. The system integrates with modern Linux desktop environments by providing Wayland and X11 window management alongside a StatusNotifier host for system tray functionality.

How it got here

2020 — Eww 0.6.0 release and workspace restructuring

5 changes.

This period marks the Eww 0.6.0 release, introducing breaking changes to the safe access operator and new widget features like SVG filling and hover selectors. The codebase underwent significant architectural shifts, including migration to a Cargo workspace, removal of legacy HOCON configuration parsing, and deletion of the standalone GTK entry point.

2021 — Architecture refactoring and new features

9 changes.

This period focused on significantly refactoring the EWW daemon's internal architecture into modular components, introducing a new scope graph for state management, and restructuring configuration loading. Concurrently, the project expanded its capabilities by adding a new expression language crate, several new widget types, and improved error reporting in the Yuck parser.

2022–2024 — System tray integration and build improvements

4 changes.

This period focused on implementing StatusNotifierHost and StatusNotifierWatcher D-Bus protocols to enable system tray integration and icon display. The build process was enhanced to embed Git commit metadata for precise version reporting, and a new example was added to demonstrate widget state management.

Features

Add D-Bus proxies for StatusNotifierItem and StatusNotifierWatcher

The notifier host now includes generated Rust proxies for the \org.kde.StatusNotifierItem\ and \org.kde.StatusNotifierWatcher\ D-Bus interfaces, enabling the application to register as a status notifier host and interact with system tray items. These proxies, generated via \zbus-xmlgen\ from XML introspection data, expose methods for registering items, handling activation and context menus, and listening for status updates, which is foundational for the system tray functionality.

_crates/notifier\host/src/proxy · high confidence

Add data structures example demonstrating Eww widgets and state management

A new example located in examples/data-structures has been added to demonstrate Eww capabilities. It includes a Yuck layout file defining a window with interactive animal emoji buttons that update a selected state variable, and a corresponding SCSS file styling the layout, buttons, and selection states.

examples/data-structures · high confidence

Add example EWW bar configuration

Added a new example configuration for the EWW bar in the \examples/eww-bar\ directory, including \eww.yuck\ for the widget layout and \eww.scss\ for styling. The example demonstrates a dock-style bar with workspaces, music status, system metrics (volume, RAM, disk), and a clock, utilizing features like string interpolation and magic variables.

examples/eww-bar · high confidence

Introduce shared utility types for localization, spans, and variable naming

This change introduces the \eww\_shared\_util\ crate, providing foundational types and utilities for the application. It adds a \get\_locale\ function that determines the system locale by checking \LC\_ALL\, \LC\_TIME\, and \LANG\ environment variables in that order, adhering to POSIX standards. It also defines a \Span\ struct to represent code locations (start/end positions and file IDs) with support for dummy spans and point spans, alongside a \Spanned\ trait. Additionally, it introduces strongly-typed wrappers \VarName\ and \AttrName\ for variable and attribute names, enabling safe conversions between them and improved debugging output.

_crates/eww\_shared\util · high confidence

Introduce simplexpr expression language crate

This change introduces the \simplexpr\ crate, a new parser and interpreter for a simple expression syntax designed to be embedded in other applications. It provides a lexer and parser (generated via LALRPOP) that support arithmetic, logical, and comparison operators, string interpolation with \${}\ syntax, JSON literals, null-safe access (\?.\), and function calls. The crate also includes an evaluation engine that resolves variable references and handles dynamic value conversion, along with comprehensive snapshot tests for the lexer and parser.

crates/simplexpr · high confidence

New widget types and widget definition system

This change introduces several new widget types to the EWW widget library, including a Graph widget for plotting data over time, a Circular Progress widget for radial indicators, a Transform widget for applying CSS-like transforms (rotation, translation, scaling) to child widgets, and a System Tray widget for displaying system notifications. It also introduces a new \def\_widget\ macro and a \build\_widget.rs\ module that centralize the logic for parsing widget attributes, managing scope listeners, and constructing GTK widgets from Yuck definitions, replacing the previous ad-hoc widget registration approach.

crates/eww/src/widgets · high confidence

Support for system tray (StatusNotifier) integration

The application now implements the StatusNotifierHost and StatusNotifierWatcher DBus protocols, allowing it to register as a system tray and display icons for other applications. This adds new modules for managing tray items, loading icons from DBus (including pixmap and theme-based fallbacks), and handling tray lifecycle events, enabling desktop environment integration for status notifications.

_crates/notifier\host/src · high confidence

Removals

Removal of GTK-based standalone application entry point

The standalone GTK application entry point in \src/main.rs\ has been removed. This file previously contained the logic for initializing a GTK application, parsing a hardcoded HOCON configuration, and rendering a simple window with basic widgets (text, button, slider). Its deletion indicates that the project has shifted away from a self-contained GTK binary towards a different architecture, likely a daemon-based model where the UI is managed separately.

src · high confidence

Removal of legacy HOCON-based widget configuration parsing

The internal HOCON configuration parsing module (\src/config\) has been removed, eliminating the previous mechanism for defining widgets via HOCON syntax. This change removes the \WidgetDefinition\, \WidgetUse\, and related parsing logic, indicating a shift away from the old configuration format in favor of a new implementation.

src/config · high confidence

Architecture

Eww daemon architecture refactored into modular components

The eww daemon's internal structure has been reorganized into distinct modules to improve maintainability and separation of concerns. The application logic is now split across \app.rs\ (core daemon state and command handling), \ipc\_server.rs\ (Unix socket communication), \client.rs\ (CLI-to-daemon interaction), \display\_backend.rs\ (X11/Wayland window initialization), and \script\_var\_handler.rs\ (background script execution). This change introduces a cleaner lifecycle management system via \application\_lifecycle.rs\ and a dedicated error handling context in \error\_handling\_ctx.rs\, while preserving the existing CLI interface and daemon functionality.

crates/eww/src · high confidence

New scope graph and state management infrastructure

The state module has been restructured to introduce a new \ScopeGraph\ that models scopes as a graph with inheritance and attribute-provisioning relationships, replacing the previous flat or implicit state model. This change adds a \OneToNElementsMap\ to efficiently manage parent-child scope relationships, defines \Scope\ and \Listener\ structs to track variable data and reactive callbacks, and includes comprehensive tests for scope creation, deletion, and value propagation. Users benefit from a more robust and explicit state management system that correctly handles scope inheritance and variable scoping.

crates/eww/src/state · high confidence

Refactored config loading and system stats into a new module structure

The configuration loading logic has been reorganized into a dedicated \config\ module, introducing \EwwConfig\ to manage widget/window definitions, initial variables, and script variables. System statistics (CPU, RAM, disk, network, battery, temperatures) are now handled via a new \system\_stats\ module using the \sysinfo\ crate, and built-in magic variables (like \EWW\_CPU\, \EWW\_RAM\, \EWW\_TIME\) are defined in \inbuilt.rs\. SCSS parsing is now isolated in \scss.rs\, and script variable execution is managed by \script\_var.rs\. This change improves code organization and separation of concerns without altering the external API of magic variables.

crates/eww/src/config · high confidence

Behavioural changes

Build script embeds Git commit hash and date into the binary

The Eww build process now captures the current Git commit hash and commit date at compile time, exposing them as environment variables (GIT\_HASH and GIT\_COMMIT\_DATE) to the Rust code. This enables the application to report precise build metadata, such as in the --version output, without requiring manual version string management.

crates/eww · high confidence

Eww 0.6.0 release with breaking safe-access change and new widget features

This entry covers the Eww 0.6.0 release, which introduces a breaking change to the safe access operator (\?.\): attempting to index an empty JSON string now triggers an error instead of returning null. The release adds several new features, including \eww poll\ to force-poll variables, on-demand window focus support for Wayland, and \raw-output\ support for the \jq\ function. Widget enhancements include \:fill-svg\ and \:preserve-aspect-ratio\ for images, \:truncate\ for labels, \:hover\ CSS selectors for tray items, and \min\/\max\/\log\/\floor\/\ceil\/\formatbytes\ functions in expressions. Fixes address crashes on invalid \formattime\ or NaN graph values, re-enable SCSS features, fix the GTK \stack\ and \expander\ widgets, correct \EWW\_NET\ values, and improve Wayland monitor name handling. The Rust toolchain is updated to 1.81.0.

(repo-wide) · high confidence

Removal of the widgets module entry point

The \src/widgets/mod.rs\ file has been deleted, removing the module entry point for the widgets subsystem. This change eliminates the previous module structure for widgets, likely as part of a broader refactoring or restructuring of how widgets are defined and exposed within the application.

src/widgets · medium confidence

Volume script now supports pamixer with amixer fallback

The getvol script in the EWW bar examples has been updated to prioritize pamixer for retrieving volume levels, including mute state detection, while retaining amixer as a fallback if pamixer is not installed. This change improves compatibility with systems using pamixer and ensures the volume indicator continues to function correctly across different audio setups.

examples/eww-bar/scripts · high confidence

Yuck configuration parser refactored with improved error reporting and validation

The Yuck configuration parser has been restructured to provide more precise and helpful error messages for users. This change introduces a new \AstError\ and \ValidationError\ system that pinpoints issues like missing widget arguments, unknown variables, and duplicate definitions with specific source locations. It also adds support for optional widget arguments (prefixed with \?\), allows monitor selection by name or numeric index, and enables backend-specific window options for both X11 and Wayland, such as focus behavior and window types.

crates/yuck · high confidence

Dependencies

Migrate to Cargo workspace and update core dependencies

The project has been restructured into a Cargo workspace, splitting the codebase into separate crates (eww, simplexpr, yuck, eww\_shared\_util, notifier\_host) to improve modularity. This change includes a significant update to the GTK ecosystem, upgrading gtk, gdkx11, and related bindings from version 0.9 to 0.18, and updating the CLI library clap to version 4.5. Additionally, the expression parser now utilizes the jaq library (versions 1.5-1.6) for jq-compatible functions, and the build system now uses lalrpop 0.21 for grammar generation. The Cargo.lock has been regenerated to reflect these dependency changes, including updates to underlying libraries like anyhow (1.0.89) and tokio (1.39.2).

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 62 → 57 (-5.4)
  • Rubric changed (rubric-2026.09.8 → rubric-2026.09.17) — scores are not directly comparable.

Lenses

  • Code Health 88 → 89 (+0.1)
  • Architecture 100 → 95 (-5.1)
  • Maturity 42 → 42 (+0.0)
  • Readiness 68 → 67 (-1.0)
  • Security 85 → 81 (-3.5)
  • Accessibility 59 (new)
  • Performance 100 (new)

Resolved (1)

  • Off-boarding risk: anonymized user #1

New (8)

  • Dependency hygiene PARTLY measured — Cargo dependencies read, dependency currency not (crates.io unreachable)
  • Documentation: contradicts the code (docs/src/troubleshooting.md)
  • End-of-life runtime: Rust 1.81
  • Inconsistent access patterns for the underlying string data. into_inner() consumes the value, as_string() returns a reference/result, and the tuple field .0 is publicly exposed. This creates three different ways to access the same data with different ownership semantics, which is confusing for API users.
  • Inconsistent naming for constructor-like factory methods. var_ref is descriptive of the semantic action, while synth_literal and synth_string use a 'synth' prefix that is not used for other types (like var_ref). Additionally, literal is used in SimplExpr.literal while synth_literal is also present, creating confusion between literal and synth_literal.
  • Inconsistent return patterns for collection operations. One method takes a mutable destination to fill (void/Unit return implied by signature style or missing return type in snippet but distinct from the other), while the other returns the collection directly. This forces callers to use different patterns depending on which method they choose.
  • Off the main sequence: eww_shared_util
  • Off-boarding risk: anonymized user #1

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

elkowar/eww was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 29 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 48f5aa8b379adf29da0b0bb9ca04164f65d8bdaa — the exact code this score is about.
  • Scored under rubric-2026.09.17 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-70910855e4b4.