HTTP server in Rust to control a Kettler elliptical bike via Bluetooth with a modern web interface.
- ๐ฆ Rust server with Actix-web
- ๐ต Bluetooth communication with Kettler elliptical bikes (RFCOMM)
- ๐ก REST API for remote control
- โก Real-time data updates
- ๐จ Modern dark glassmorphism design with 3-column layout
- ๐ฑ Optimized for 11" tablet in landscape mode (99vh container)
- โฑ Timer with auto-start/pause based on RPM
- ๐ Visual progress histogram with real-time tracking
- ๐ฏ 10 modes: Flat (manual), 8 training programs + Game mode
- ๐ฎ Space Runner game - RPM-controlled with obstacles and collectibles
- ๐ฒ Custom program editor with random generator
- ๐ง Difficulty control in 5W increments
- ๐ฅ Fullscreen mode
- ๐ Real-time display: RPM, Power, Connection Status
- ๐ฏ Enlarged playback controls for better touch interaction
# Rust (latest stable version)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Bluetooth
sudo apt-get install bluez libbluetooth-dev# Clone the project
git clone https://github.com/blackxt600/SkylonRemoteApp.git
cd SkylonRemoteApp
# Build
cargo build --release
# Run
cargo run --release# Build in mock mode (simulates bike data)
cargo build --release --no-default-features --features mock
# Run in mock mode
cargo run --release --no-default-features --features mockThe mock mode simulates realistic bike data (RPM, speed, power) without requiring Bluetooth hardware. Perfect for frontend development! See MOCK_MODE.md for details.
The server will be accessible at http://0.0.0.0:8080
- Bluetooth Connection: Pair your Kettler bike to
/dev/rfcomm0 - Start the server:
cargo run - Open the interface: Navigate to
http://localhost:8080 - Fullscreen mode: Click the โถ button in the top right
- Direct power control with +/- buttons in center panel
- Visual histogram with uniform bar heights
- All bars update simultaneously when power changes
- Range: 25-400W
- Select one of the 8 training programs
- Adjust difficulty: -100W to +100W in 5W increments
- Timer automatically starts/pauses based on your activity (RPM)
- Visual histogram shows program progression
- Create personalized 30-minute programs
- Edit individual interval power (25-400W)
- Random generator with warm-up sequence (25-30-35W)
- Persistent storage in browser
- Space Runner: RPM-controlled arcade game
- Avoid asteroids, collect stars
- Progressive difficulty
- Real-time score and distance tracking
Each program lasts 30 minutes with power adjustment per minute:
| Program | Description | Intensity |
|---|---|---|
| Plat | Manual mode with flat histogram | โก |
| Escalier | Stepped power progression | โกโก |
| Vallรฉe | Gentle variations | โกโกโก |
| Collines | Two distinct hills | โกโกโกโก |
| Montagne | Two peaks | โกโกโกโก |
| Col Alpin | Progressive climb | โกโกโกโกโก |
| Intervalle | Intense intervals | โกโกโกโกโก |
| Pyramide | Symmetrical climb and descent | โกโกโกโก |
| Sur mesure | Customizable program with editor | Custom |
| Jeu | Space Runner game mode | Fun! ๐ฎ |
Get the current bike status
Response:
{
"connected": true,
"rpm": 65,
"power": 120,
"speed": 0.0
}Set the target power (25-400W)
Example:
curl -X POST http://localhost:8080/power/120SkylonRemoteApp/
โโโ src/
โ โโโ main.rs # HTTP server
โ โโโ bike_controller.rs # Bluetooth controller
โ โโโ training_program.rs # Training program structures
โ โโโ main-example.rs # CLI example
โโโ static/
โ โโโ index.html # Web interface
โ โโโ programs.html # Program manager
โโโ autostart/ # Systemd autostart config
โโโ Cargo.toml # Rust dependencies
โโโ CHANGELOG.md # Version history
โโโ VERSION # Current version
actix-web- Web frameworktokio- Async runtimekdri- Kettler Bluetooth libraryserde- JSON serializationanyhow- Error handling
This project uses Semantic Versioning (MAJOR.MINOR.PATCH).
# Modify the VERSION file
echo "1.1.0" > VERSION## [1.1.0] - 2025-01-27
### Added
- New feature X
### Changed
- Improvement to Y
### Fixed
- Bug Z# Commit changes
git add -A
git commit -m "Release v1.1.0 - Description of changes"
# Create tag
git tag -a v1.1.0 -m "Version 1.1.0"
# Push (if remote repository)
git push origin main --tags- MAJOR (1.x.x): Incompatible API changes
- MINOR (x.1.x): New backward-compatible features
- PATCH (x.x.1): Backward-compatible bug fixes
# Bug fix
1.0.0 โ 1.0.1
# New feature
1.0.1 โ 1.1.0
# Breaking change
1.1.0 โ 2.0.0# List versions
git tag -l
# Version details
git show v1.0.0
# Log with tags
git log --oneline --decorate
# Differences between versions
git diff v1.0.0 v1.1.0This project would not have been possible without the incredible work shared in the kdri repository by @kaegi. The kdri library (Kettler Device Rust Interface) provides the essential Bluetooth communication protocol implementation for Kettler fitness devices.
Thank you for making this library open source! ๐
This project is licensed under the MIT License.
This repository is shared "as-is" for the community to take, improve, and make their own!
This project was built to solve a specific need and is now released to the world. The original author will not provide bug fixes or ongoing maintenance. Instead, this code is offered as a foundation for you to build upon, learn from, and adapt to your needs.
Open source is about empowermentโtaking something that works and making it better, fixing what's broken, and sharing improvements with others who face similar challenges. This project exists because of the incredible work shared by others (like the kdri library), and now it's your turn to carry the torch forward.
- ๐ง Fix bugs: Found an issue? Fix it and share your solution with others
- ๐ Add features: Need something new? Build it and submit a pull request
- ๐ Improve docs: Make the documentation better, clearer, more complete
- ๐ Port to new devices: Make it work with other Kettler models or fitness equipment
- ๐จ Redesign the UI: Create a better interface that fits your needs
- ๐ฌ Experiment freely: Try new approaches, test wild ideas, break things and learn
- Fork this repository - Make it yours, customize it, improve it
- Share your improvements - Open pull requests so others can benefit
- Create your own version - Build something completely different based on this code
- Help each other - Answer questions, review PRs, collaborate with other contributors
- Become a maintainer - If you're passionate about this project, consider maintaining your own fork
This isn't just an invitation to contributeโit's a transfer of ownership to the community.
The code is here. The tools are available. The possibilities are endless. What will YOU build with it? ๐
For questions or issues, see:
- CLAUDE.md - Development instructions and architecture
- CHANGELOG.md - Version history and release notes
- LOGS.md - Log management guide for Raspberry Pi
- SYSTEM_SHUTDOWN_REBOOT.md - Shutdown/reboot configuration
- MOCK_MODE.md - Development without Bluetooth hardware
- autostart/AUTOSTART_SETUP.md - Systemd service setup
Current Version: 2.0.0 Date: 2025-11-23