Linux-first FFBeast wheel configuration for sim racing.
This project now uses:
- a Rust backend/service for device I/O, protocol parsing, telemetry, and wheel control
- a Qt desktop client implemented with Python/PySide6
The current product focus is narrow by design:
- driving simulators only
- FFBeast wheel setup first
- pedal and peripheral tuning only as advanced options
- no flight-sim UI or flight-specific settings
apps/ffbeast-service- Rust stdio JSON service process
apps/ffbeast-qt- Python/PySide6 Qt client
libs/controller- FFBeast HID/device access and protocol parsing
libs/input_manager- input and profile-related backend logic
libs/backend_api- shared request/response/event contract
docs/- migration notes and project documentation
- Linux
- Rust stable with
cargo - Python 3
- PySide6
libudevdevelopment files for the Rust HID stack
If you use Nix, the included shell is the simplest way to get a working dev environment:
nix-shell- Enter the dev shell:
nix-shell- Verify the backend crates:
cargo test -p ffbeast-controller
cargo check -p ffbeast-backend-api -p ffbeast-service- Launch the Qt client:
python3 apps/ffbeast-qt/main.pyThe Qt client starts ffbeast-service automatically by default.
Run the backend service on its own:
cargo run -p ffbeast-serviceThe service uses line-delimited JSON over stdio.
The Qt client is structured around a sim-racing workflow:
Drive- steering range
- total force strength
- soft stop settings
- dampening settings
Wheel Setup- force enablement
- direction controls
- power and braking limits
- encoder and motor setup
Profiles- save, load, and apply sim-specific profiles
Maintenance- save settings
- reset center
- reboot
- DFU
Advanced- calibration
- control-loop tuning
- GPIO/ADC and other peripheral settings
Backend checks:
cargo test -p ffbeast-controller
cargo check -p ffbeast-backend-api -p ffbeast-serviceQt syntax check:
python3 -m py_compile \
apps/ffbeast-qt/main.py \
apps/ffbeast-qt/service_client.py \
apps/ffbeast-qt/settings_tabs.py \
apps/ffbeast-qt/profile_store.pyOverride the service command used by the Qt client:
FFBEAST_SERVICE_CMD="cargo run -p ffbeast-service --quiet" python3 apps/ffbeast-qt/main.pyRun the Qt client offscreen for a smoke test:
QT_QPA_PLATFORM=offscreen python3 apps/ffbeast-qt/main.pyIf cargo test or cargo check fails with linker cc not found:
nix-shellIf the wheel is not detected:
- confirm the device appears in
lsusb - confirm your user can access
/dev/hidraw* - check
udevpermissions - try launching from the provided Nix shell first
If the Qt client starts but cannot talk to the backend:
- run
cargo run -p ffbeast-servicedirectly to confirm the service starts - check the log pane in the Qt app
- verify
FFBEAST_SERVICE_CMDis not pointing at an invalid command
This repo has moved away from the previous Tauri frontend. The active architecture is:
- Rust backend/service
- Python/PySide6 Qt client
The next validation step is real hardware testing against an FFBeast wheel on Linux.