Aulinx: Two Products, One Codebase

Semantic Desktop Layer + AI-Native Compositor, built simultaneously

Workspace Structure

compositor/ → Rust workspace with 3 crates
compositor/ — Cargo workspace root
  Cargo.toml — workspace members
  crates/semantic/ — aulinx-semantic (the core library)
    src/
      lib.rs — public API
      graph.rs — semantic scene graph data structure
      node.rs — SemanticNode: window, element, text, etc.
      diff.rs — incremental change detection + events
      query.rs — scene.query(), scene.find(), filters
      action.rs — element.activate(), semantic actions
      sources/
        mod.rs — Source trait (pluggable data providers)
        atspi.rs — AT-SPI accessibility tree → nodes
        compositor_ipc.rs — Sway/Hyprland/niri IPC → windows
        direct.rs — direct surface injection (used by compositor)
  crates/daemon/ — aulinx-semanticd (standalone daemon, Product 1)
    src/
      main.rs — daemon entry: detect compositor, start sources, serve IPC
      ipc.rs — Unix socket JSON-RPC server
      events.rs — event stream subscriptions
  crates/compositor/ — aulinx-compositor (Smithay compositor, Product 2)
    src/
      main.rs — entry, backend selection, event loop
      state.rs — AulinxState + Smithay delegates
      backend/ — winit.rs + udev.rs
      shell/ — xdg.rs + layer.rs + decoration.rs
      layout/ — tiling.rs + floating.rs
      input/ — physical + injection
      render/ — Glow renderer
      semantic_bridge.rs — feeds surface data directly into aulinx-semantic
      ipc.rs — unified IPC: semantic + compositor commands

How the Crates Connect

Dependency graph
Product 1: aulinx-semanticd
Standalone daemon
Works on Sway / Hyprland / GNOME / niri
depends on
aulinx-semantic
+ atspi source
+ compositor_ipc source
Product 2: aulinx-compositor
Full Wayland compositor
Deeper integration, no AT-SPI needed
depends on
aulinx-semantic
+ direct source
+ Smithay
aulinx-semantic (shared core)
The semantic scene graph engine — the novel technology
Scene Graph
Windows → elements
→ properties
Diff Engine
Change detection
semantic events
Query Engine
find, filter
spatial queries
Actions
activate, set_text
semantic intents
▲ Unix Socket — JSON-RPC — scene.query / scene.subscribe / element.activate ▲
Python AI Agent (connects to whichever product is running)

Parallel Build Tracks

What gets built when
aulinx-semantic
aulinx-semanticd
aulinx-compositor
Week 1-2
Scene graph + node types
Query engine basics
Source trait
IPC server skeleton
AT-SPI source
Smithay skeleton
Winit backend
Blank window
Week 3-4
Diff engine
Event subscriptions
Action dispatch
Compositor IPC source
(Sway/Hyprland)
Event streaming
XDG Shell
Window rendering
Basic input
Week 5-6
Cross-app context
Spatial queries
Polish + tests
Python integration
DEMO READY
Tiling layout
Floating + decorations
semantic_bridge.rs
Week 7-10
Direct source
(compositor integration)
Vision fallback
source
IPC + input injection
Layer Shell + XWayland
Screen capture
COMPOSITOR READY

The Semantic IPC (shared by both products)

Query
scene.graph() → full tree
scene.window(id) → one window
scene.find("Save") → matching elements
scene.focused() → active window + element
Subscribe
scene.subscribe("*") → all events
scene.subscribe("window.*") → window events
scene.subscribe("element.changed") → UI changes
scene.subscribe("focus.*") → focus changes
Act
element.activate(id) → click/press
element.set_value(id, text) → set text
element.scroll(id, direction) → scroll
window.focus(id) → focus window
Compositor-only (Product 2)
window.move(id, x, y, w, h)
input.type(text) → virtual keyboard
input.key(combo) → key shortcut
screen.capture(region?) → PNG