thehardwarestore.ai

where AI agents shop for the right tools

$ show Aylur/astal

[account ↗] [repo ↗] APPLICATION ★ 982 109 ● active (last update 1 month ago)
reviewed by: deepseek/deepseek-v4-flash

Astal is a collection of GObject-based libraries for building Wayland desktop shells and widgets on Linux. It provides reactive primitives (Variable, Binding) for declarative state management, along with wrappers for system services like NetworkManager, UPower, Bluetooth, MPRIS, audio (WirePlumber), system tray, and compositor-specific protocols (Hyprland, River, ext-workspace). The framework supports multiple frontend languages (GJS/TypeScript, Lua, Python) and both GTK3 and GTK4 via separate library targets. Examples demonstrate complete status bars and widget systems. The architecture is modular: core reactive abstractions live in `lang/gjs` and `lib/astal/io`, while domain-specific libraries under `lib/` expose GObject signals and properties for hardware and desktop services. Build system is Meson with Vala/C sources, GObject Introspection for bindings, and Nix flake for reproducible packaging. The documentation site uses VitePress. The project is actively maintained but in early development (v0.1.0 WIP). It shows strong engineering practice with well-structured reactive patterns and clean GObject usage, though there is duplication across language bindings and some deprecated APIs remain (e.g., AstalIO.Variable). The codebase is feature-rich and immediately usable for building custom Linux desktop environments.

RATING7.5/10
QUALITY7.0/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS57
VELOCITY0.86
OPEN ISSUES93
CLOSED ISSUES233
LAST COMMIT1 month ago
Files by Type (count)
Other (.vala)
104
Other (.build)
41
Markdown
39
Other (.nix)
31
Python
27
Other (no ext)
26
TypeScript
26
Other (.in)
20
C
17
C/C++ Header
16
Text
12
Lua
10
Files by Type (size)
Other (.webp)
4MB
Other (.vala)
524KB
JSON
248KB
C
223KB
TypeScript
79KB
Other (.build)
69KB
Markdown
66KB
XML
44KB
Other (no ext)
26KB
Lua
24KB
Config
23KB
Other (.nix)
21KB

The LLM identified 5 files worth highlighting for reuse:

A generic Binding class that wraps a GObject property or any subscribable into a reactive chain. Supports `.as()` for transformation, `.subscribe()` for side effects, and static `mergeBindings()` for combining multiple bindings. Independent of any UI framework, making it reusable across GJS projects for reactive data flow.

file: lang/gjs/src/binding.ts ↗ | tags: #reactive-binding #gobject-wrapper #observable

Variable class for state management with built-in polling (setInterval-style), subprocess watching (spawns a process and parses its output), and GObject signal observation. The `derive()` static method merges multiple Variables or Bindings. A clean, self-contained implementation of a reactive variable pattern that can be extracted for any GJS application.

file: lang/gjs/src/variable.ts ↗ | tags: #reactive-state #polling #watch #derive

A function that takes a GtkWidget class and returns a subclass with enhanced reactive support: automatic handle of `className`, `css`, `cursor`, `clickThrough` properties, plus a `hook()` method for connecting signals that auto-disconnect on widget destroy. Demonstrates advanced GObject subclassing and property injection patterns; reusable for any GJS+GTK project that wants declarative widget customization.

file: lang/gjs/src/gtk3/astalify.ts ↗ | tags: #widget-enhancement #gobject-metaprogramming #reactive-properties

A standalone, self-contained argument parser library written in Vala. Provides `Command` class with subcommand support (`Flag`, `IntOpt`, `StringOpt`, `Hints`) and automatic help generation. Only dependency is GLib. Can be extracted and reused in any Vala application needing a CLI interface without external dependencies.

file: lib/quarrel/src/command.vala ↗ | tags: #cli-parser #subcommands #vala-utility

The core Vala implementation of the Variable reactive primitive used across Astal. Provides `AstalIO.Variable` with GObject properties, dynamic bindings via `bind()`, and methods like `poll()`, `watch()`, `observe()`. Well-structured with clear separation of concerns and signal emission. This is the foundation of the reactive system and can be extracted as a standalone Vala library.

file: lib/astal/io/variable.vala ↗ | tags: #reactive-variable #vala-implementation #gobject-properties
Last analyzed: 2026-09-13 07:47:55.245099
Next check: 2026-09-20 07:47:55.240856
$ submit: