A local lightweight Linux/Windows service with a Svelte web UI for Framework devices (Laptop 12, 13, 16, and Desktop). It exposes a loopback HTTP API to monitor telemetry and tweak fans, power, and charging, including auto, manual, and curve fan control with hysteresis, rate limiting, a live RPM overlay, and calibration.
Svelte
292
322 commits
updated Oct 18, 2026
A local lightweight Linux/Windows service with a Svelte web UI for Framework devices (Laptop 12, 13, 16, and Desktop). It exposes a loopback HTTP API to monitor telemetry and tweak fans, power, and charging, including auto, manual, and curve fan control with hysteresis, rate limiting, a live RPM overlay, and calibration.
⚠️ Warning (Framework 16) At minimum BIOS 3.07 is required for proper EC/fan control behavior. Install the latest BIOS before using this tool or it won't work.
![]()
https://github.com/user-attachments/assets/5d7c07c2-83cc-4b82-b685-df5f86318597
Linux install options (see LINUX_INSTALL.MD for full details):
curl -fsSL https://raw.githubusercontent.com/ozturkkl/framework-control/main/install-linux.sh | sudo bashyay -S framework-control (stable · beta)services.framework-control.enable = true; in your NixOS configurationLINUX_INSTALL.MD):
curl -fsSL https://raw.githubusercontent.com/ozturkkl/framework-control/main/uninstall-linux.sh | sudo bash
sudo pacman -R framework-control (or framework-control-beta)services.framework-control.enable = false; and run sudo nixos-rebuild switchThis software is provided "as is," without warranty of any kind, express or implied. By using it, you acknowledge that you are responsible for any configuration changes you make to your system and accept all risks associated with its use. The authors and contributors are not liable for any damage, data loss, hardware wear, unintended behavior, or other harm that may result from use or misuse of this application.
framework_tool version selection from the Settings modalframework_tool) for all EC interactionsEarly iterations used the Rust framework_lib directly. On Windows that required build-time git metadata and custom driver bindings, which added fragility to packaging and dev setup. Pivoting to the official CLI (framework_tool) gives a stable, tested interface with consistent elevation semantics on Windows. It also maps cleanly to Linux.
Pull requests are welcome only when they originate from an issue labeled pr-welcome. Please open an issue first, wait for the label, then link it in your PR (e.g. Fixes #123). PRs without a linked pr-welcome issue will be closed. See CONTRIBUTING.md for details.
Prerequisites:
Dev Commands:
# Backend (dev)
cd framework-control/service
cargo run
# Frontend (dev)
cd framework-control/web
npm i
npm run dev
web/src/api (DefaultService, OpenAPI) for all calls to the local service.fetch directly for service endpoints anywhere in the UI.web/openapi.jsonframework-control/web, run: npm run gen:api⚠️ Compile-Time Configuration Baking
All FRAMEWORK_CONTROL_* environment variables read in the service code must support both runtime and compile-time fallback using option_env!(). This allows the Linux build process to bake configuration into the binary.
Pattern to follow:
std::env::var("FRAMEWORK_CONTROL_PORT")
.ok()
.or_else(|| option_env!("FRAMEWORK_CONTROL_PORT").map(String::from))
.expect("FRAMEWORK_CONTROL_PORT must be set")
Environment Variables:
Service .env file (framework-control/service/.env):
# Allow your dev UI origin(s)
FRAMEWORK_CONTROL_ALLOWED_ORIGINS=http://127.0.0.1:5174,http://localhost:5174
# Required: port for the service
FRAMEWORK_CONTROL_PORT=8090
# Optional: GitHub repo used by the update endpoints (owner/name or full URL-ish form)
FRAMEWORK_CONTROL_UPDATE_REPO=ozturkkl/framework-control
Web UI .env.local file (framework-control/web/.env.local):
# Local service URL (optional; auto-detects from current origin if omitted)
# Set this to match your FRAMEWORK_CONTROL_PORT in the service
VITE_API_BASE=http://127.0.0.1:8090
The service provides a REST API for health and telemetry (/api/health, /api/thermal, /api/thermal/history, /api/battery/history, /api/power, /api/versions), system info (/api/system), update and helper management (/api/update/*, /api/ryzenadj/*), shortcut management (/api/shortcuts/*), and config management (/api/config).
/api/power: combined battery telemetry (SoC, capacity, voltages/currents, charger wattage) plus charge-limit info and power_control object with platform capabilities and current_state./api/thermal/history: recent temperature/RPM samples collected by the background telemetry task./api/battery/history: charge % and signed pack watts from the history task. Optional since (unix ms) returns only newer samples.Configuration is stored (by default) in C:\ProgramData\FrameworkControl\config.json on Windows (overridable via FRAMEWORK_CONTROL_CONFIG) and /etc/framework-control/config.json on Linux. It includes fan mode settings, curve points, calibration data, hysteresis, and rate limiting parameters, power AC/Battery profiles, battery charge-limit/rate settings and SoC threshold, telemetry poll/retention, update preferences, and UI theme.
journalctl on Linux2,567 followers · starred Oct 2026
1,695 followers · starred Jan 2026
1,260 followers · starred May 2026
210 followers · starred Jan 2026
A local lightweight Linux/Windows service with a Svelte web UI for Framework devices (Laptop 12, 13, 16, and Desktop). It exposes a loopback HTTP API to monitor telemetry and tweak fans, power, and charging, including auto, manual, and curve fan control with hysteresis, rate limiting, a live RPM overlay, and calibration.
Svelte
292
322 commits
updated Oct 18, 2026
A local lightweight Linux/Windows service with a Svelte web UI for Framework devices (Laptop 12, 13, 16, and Desktop). It exposes a loopback HTTP API to monitor telemetry and tweak fans, power, and charging, including auto, manual, and curve fan control with hysteresis, rate limiting, a live RPM overlay, and calibration.
⚠️ Warning (Framework 16) At minimum BIOS 3.07 is required for proper EC/fan control behavior. Install the latest BIOS before using this tool or it won't work.
![]()
https://github.com/user-attachments/assets/5d7c07c2-83cc-4b82-b685-df5f86318597
Linux install options (see LINUX_INSTALL.MD for full details):
curl -fsSL https://raw.githubusercontent.com/ozturkkl/framework-control/main/install-linux.sh | sudo bashyay -S framework-control (stable · beta)services.framework-control.enable = true; in your NixOS configurationLINUX_INSTALL.MD):
curl -fsSL https://raw.githubusercontent.com/ozturkkl/framework-control/main/uninstall-linux.sh | sudo bash
sudo pacman -R framework-control (or framework-control-beta)services.framework-control.enable = false; and run sudo nixos-rebuild switchThis software is provided "as is," without warranty of any kind, express or implied. By using it, you acknowledge that you are responsible for any configuration changes you make to your system and accept all risks associated with its use. The authors and contributors are not liable for any damage, data loss, hardware wear, unintended behavior, or other harm that may result from use or misuse of this application.
framework_tool version selection from the Settings modalframework_tool) for all EC interactionsEarly iterations used the Rust framework_lib directly. On Windows that required build-time git metadata and custom driver bindings, which added fragility to packaging and dev setup. Pivoting to the official CLI (framework_tool) gives a stable, tested interface with consistent elevation semantics on Windows. It also maps cleanly to Linux.
Pull requests are welcome only when they originate from an issue labeled pr-welcome. Please open an issue first, wait for the label, then link it in your PR (e.g. Fixes #123). PRs without a linked pr-welcome issue will be closed. See CONTRIBUTING.md for details.
Prerequisites:
Dev Commands:
# Backend (dev)
cd framework-control/service
cargo run
# Frontend (dev)
cd framework-control/web
npm i
npm run dev
web/src/api (DefaultService, OpenAPI) for all calls to the local service.fetch directly for service endpoints anywhere in the UI.web/openapi.jsonframework-control/web, run: npm run gen:api⚠️ Compile-Time Configuration Baking
All FRAMEWORK_CONTROL_* environment variables read in the service code must support both runtime and compile-time fallback using option_env!(). This allows the Linux build process to bake configuration into the binary.
Pattern to follow:
std::env::var("FRAMEWORK_CONTROL_PORT")
.ok()
.or_else(|| option_env!("FRAMEWORK_CONTROL_PORT").map(String::from))
.expect("FRAMEWORK_CONTROL_PORT must be set")
Environment Variables:
Service .env file (framework-control/service/.env):
# Allow your dev UI origin(s)
FRAMEWORK_CONTROL_ALLOWED_ORIGINS=http://127.0.0.1:5174,http://localhost:5174
# Required: port for the service
FRAMEWORK_CONTROL_PORT=8090
# Optional: GitHub repo used by the update endpoints (owner/name or full URL-ish form)
FRAMEWORK_CONTROL_UPDATE_REPO=ozturkkl/framework-control
Web UI .env.local file (framework-control/web/.env.local):
# Local service URL (optional; auto-detects from current origin if omitted)
# Set this to match your FRAMEWORK_CONTROL_PORT in the service
VITE_API_BASE=http://127.0.0.1:8090
The service provides a REST API for health and telemetry (/api/health, /api/thermal, /api/thermal/history, /api/battery/history, /api/power, /api/versions), system info (/api/system), update and helper management (/api/update/*, /api/ryzenadj/*), shortcut management (/api/shortcuts/*), and config management (/api/config).
/api/power: combined battery telemetry (SoC, capacity, voltages/currents, charger wattage) plus charge-limit info and power_control object with platform capabilities and current_state./api/thermal/history: recent temperature/RPM samples collected by the background telemetry task./api/battery/history: charge % and signed pack watts from the history task. Optional since (unix ms) returns only newer samples.Configuration is stored (by default) in C:\ProgramData\FrameworkControl\config.json on Windows (overridable via FRAMEWORK_CONTROL_CONFIG) and /etc/framework-control/config.json on Linux. It includes fan mode settings, curve points, calibration data, hysteresis, and rate limiting parameters, power AC/Battery profiles, battery charge-limit/rate settings and SoC threshold, telemetry poll/retention, update preferences, and UI theme.
journalctl on Linux2,567 followers · starred Oct 2026
1,695 followers · starred Jan 2026
1,260 followers · starred May 2026
210 followers · starred Jan 2026