A native GTK4 + libadwaita desktop controller for a standing desk, built with Rust and Relm4.
The desk itself is driven by an ESP32 module. This desktop app never talks to the ESP32 directly — it's designed to speak to a small proxy server that relays commands to the desk and streams its state back. For now that link is mocked locally (see src/device.rs) so the UI has a realistic, animated desk to drive while the real proxy server is built out.
- Live desk visualization — a hand-drawn, animated side-view of the desk that rises and lowers smoothly in real time.
- Hold-to-move controls — press and hold to raise or lower, release to stop, just like the physical buttons on the desk.
- Sit / Stand presets for one-tap height changes.
- Routines — schedule automatic sit/stand transitions by time of day and day-of-week (every day, weekdays, or weekends), fully editable inline.
- Settings — proxy server address, connection status, and a cm/inch unit toggle.
- A splash screen that simulates the initial handshake with the proxy server.
| Main | Settings |
|---|---|
![]() |
![]() |
| Routines | Routine editor |
|---|---|
![]() |
![]() |
src/main.rs— entry point, CSS/logging setup.src/app.rs— the root Relm4 component: window shell, page navigation, wiring.src/device.rs— mocked link to the desk (stands in for the real proxy-server client).src/desk_canvas.rs— the animated cairo-drawn desk illustration.src/routine.rs/src/routine_row.rs— scheduled routine data model and its list-row factory component.src/settings.rs— app settings (height unit, proxy address).
Requires Rust, GTK4, and libadwaita development libraries installed.
cargo run- Replace
MockDevicewith a real WebSocket client to the desk proxy server. - Persist routines and settings across restarts.
- Connection-lost / retry handling on the splash screen.



