A production-grade Rust daemon for Linux desktop automation. Control GTK, Qt, and other applications through AT-SPI with multi-user, multi-desktop support on Wayland and X11.
GitHub | Documentation | Architecture | Installation
# Install
sudo apt install deskd
# Start daemon (per-user)
systemctl --user start deskd
# Use the CLI tool
deskctl click "Submit Button"
deskctl type "Hello World"
deskctl focus "Input Field"- Wayland-Native - Pure Wayland support with X11 compatibility, not the other way around
- Multi-User - Secure per-user daemon instances with optional system-wide mode
- Accessibility-First - Uses AT-SPI for semantic UI control, not vision-based
- Multi-Desktop - Handles multiple desktops per user (GNOME, KDE, Sway, etc.)
- Persistent State - SQLite database for tasks, workflows, and audit logs
- Smart Input - Multiple input methods with intelligent fallback (Portal → libei → ydotool)
- Sub-100ms Latency - Async I/O, connection pooling, and caching for speed
- Audit Trail - Complete operation history for debugging and compliance
deskd exposes three primary interfaces:
- AT-SPI Tree - Semantic UI element discovery and interaction
- Wayland Protocols - Direct desktop control (focus, input, screenshots)
- Unix Socket - JSON-RPC daemon API and CLI tool (
deskctl)
See ARCHITECTURE.md for details.
| Document | Purpose |
|---|---|
| Installation | Setup and system requirements |
| Quick Start Guide | Common tasks and examples |
| Configuration | Configuration file reference |
| CLI Reference | deskctl command reference |
| Database Schema | SQLite tables and operations |
| Deployment Models | Per-user vs system daemon |
| Security | Permissions and multi-user isolation |
| Development | Build, test, and contribute |
- Wayland-native, not X11 with Wayland hacks
- Multi-user from ground up, not bolted on
- Persistent state in SQLite
- Production daemon architecture
- Local execution, no cloud dependency
- Accessibility-first, not vision-based
- Multi-session support
- Fully auditable, works offline
- Free and open source
- Standard Linux daemon conventions
- No vendor lock-in
- Community-driven
Choose the model that fits your use case:
Per-User Daemon (Primary, Recommended)
- Each user runs their own daemon:
systemd --user - Socket:
~/.local/run/deskd.sock - Database:
~/.local/share/deskd/state.db - Most secure, isolated by user boundaries
System-Wide Daemon (Alternative)
- Single daemon for all users
- Socket:
/var/run/deskd.sock - Database:
/var/lib/deskd/state.db - Requires privilege separation and auth
Hybrid (Recommended for Complex Setups)
- User daemons for desktop interaction
- Optional system daemon for coordination
- Cross-user workflow support
See DEPLOYMENT.md for details.
Core operations via JSON-RPC over Unix socket:
{
"method": "type",
"params": { "text": "Hello World" }
}Supported operations:
- Input:
type,type_secure,key_press,key_combo,paste,copy - Clicking:
click,right_click,double_click,drag,scroll - Focus:
focus_element,focus_window,get_focused_element,wait_for_focus - Desktop:
list_desktops,switch_desktop,execute_on_desktop - Clipboard:
clipboard_get,clipboard_set,clipboard_history - Database:
db_query,get_task_history,save_workflow,resume_workflow
See CLI_REFERENCE.md for the full protocol.
git clone https://github.com/sebyx07/deskd
cd deskd
cargo build --release
cargo testSee DEVELOPMENT.md for detailed build instructions.
- Linux kernel 5.10+
- Wayland or X11 display server
- systemd for daemon management
- AT-SPI (usually installed with desktop environment)
- Rust 1.70+ (for building from source)
deskd is actively under development. Current phase: Foundation & AT-SPI Integration.
Phase 1 ✓ Foundation & project structure Phase 2 🔄 AT-SPI input operations Phase 3 ⏳ Wayland & multi-input methods Phase 4 ⏳ Multi-desktop sessions Phase 5 ⏳ Advanced features & polish
Contributions welcome! Please see DEVELOPMENT.md for guidelines.
deskd uses secure-by-default practices:
- Memory zeroing for sensitive operations (
type_secure) - Per-user isolation with systemd
- Wayland portal permission model
- Audit trail in SQLite
- No direct sudo requirement
See SECURITY.md for details.
Sebi (@sebyx07) - sebyx07.pro@gmail.com
(Add your license here)
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: ./docs
Made with ❤️ for the Linux desktop automation community