steam-backlog-enforcer/steam_backlog_enforcer
Krzysztof kuhy Rudnicki 0f5d234ee0 Pass SDL_JOYSTICK_HIDAPI_LG4FF=0 to Steam so the G29 keeps force feedback
SDL3's HIDAPI lg4ff driver advertises an effect-status query it cannot
answer; BeamNG.drive 0.39 native treats the failed query as a dead effect
and the wheel goes limp (12k "Failed to get joystick3 FFB effect status"
lines per session). Steam's environment on this box is exactly this
allowlist, so the hint has to live here, not in /etc/environment.

The narrow hint only demotes the Logitech wheel to the kernel driver;
gamepads keep HIDAPI (rumble, LEDs over Bluetooth).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SS8M5wk88nJTXxDWz61KKk
2026-09-14 21:35:15 +02:00
..
docs Auto-detect completed manual picks before enforcing the pick cap 2026-08-29 14:53:04 +02:00
main Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
tests Pass SDL_JOYSTICK_HIDAPI_LG4FF=0 to Steam so the G29 keeps force feedback 2026-09-14 21:35:15 +02:00
__init__.py feat: steam 100 percent extension 2026-03-02 20:29:32 +01:00
_actions.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
_allowed_games.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_attribution_labels.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_bonus_incident.py Pay an hour of gaming budget for a LeetCode solve 2026-08-30 15:22:18 +02:00
_budget_games.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_budget_log_tail.py Remove engagement gating from the gaming budget 2026-09-02 18:14:27 +02:00
_budget_resolve.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_budget_view.py Remove engagement gating from the gaming budget 2026-09-02 18:14:27 +02:00
_cdp.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_cmd_done_finalize.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
_cmd_done.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_cmd_playtime.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_config_setup.py Show the gaming budget in the web UI 2026-08-29 07:17:42 +02:00
_counted_procs.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_desktop_env.py Pass SDL_JOYSTICK_HIDAPI_LG4FF=0 to Steam so the G29 keeps force feedback 2026-09-14 21:35:15 +02:00
_echo.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
_enforce_loop.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_enforce_steps.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
_game_names.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_hltb_cached.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_hltb_comp_extract.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_hltb_confidence.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_hltb_detail.py Bring the HLTB modules under the 250-line cap 2026-08-24 15:23:13 +02:00
_hltb_matching.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_hltb_page_parse.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_hltb_search_api.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_hltb_search.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_hltb_types.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_hosts_protection.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_leetcode_bonus.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_leetcode_ledger.py Pay an hour of gaming budget for a LeetCode solve 2026-08-30 15:22:18 +02:00
_manual_pick_lifecycle.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_mcp_actions.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
_mcp_gaming_time.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_mcp_query.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
_mcp_server.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_mcp.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
_owned_apps_cache.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_pacman.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_pick_completion.py Auto-detect completed manual picks before enforcing the pick cap 2026-08-29 14:53:04 +02:00
_playtime_block.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
_playtime_budget.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_playtime_cutoff.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_playtime_history_parse.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_playtime_history.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_playtime_kill.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_playtime_log.py Remove engagement gating from the gaming budget 2026-09-02 18:14:27 +02:00
_playtime_mountinfo.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_playtime_notify.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_playtime_procs.py Remove engagement gating from the gaming budget 2026-09-02 18:14:27 +02:00
_playtime_run.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_playtime_session.py Remove engagement gating from the gaming budget 2026-09-02 18:14:27 +02:00
_playtime_state.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_playtime.py Remove engagement gating from the gaming budget 2026-09-02 18:14:27 +02:00
_polls_reporting.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_protected_apps.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
_scanning_assign.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_scanning_candidates.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_scanning_confidence.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_scanning_tampering.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_serve_guard.py Stop the web UI serving numbers the enforcer is not applying 2026-08-29 23:39:40 +02:00
_serve_stale.py Stop the web UI serving numbers the enforcer is not applying 2026-08-29 23:39:40 +02:00
_serve_startup.py Make serve re-runnable, and cover it to 100% 2026-08-29 18:52:11 +02:00
_snapshot.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_stats_display.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
_stats_gathering.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
_stats_types.py Bring _stats.py and scanning.py under the 250-line cap 2026-08-24 16:00:54 +02:00
_stats.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_status_api.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_steam_api_client.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_steam_client.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_steam_errors.py Bill gaming time only while the user is actually playing 2026-08-28 19:24:14 +02:00
_steam_launch.py Bill gaming time only while the user is actually playing 2026-08-28 19:24:14 +02:00
_steam_models.py Split steam_api and _scanning_confidence under the cap 2026-08-24 14:25:43 +02:00
_steam_process.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_steam_restart_guard.py Bill gaming time only while the user is actually playing 2026-08-28 19:24:14 +02:00
_steam_state.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
_store_iptables.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_store_tools.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_total_block_domains.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
_total_block_hosts.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_total_block_iptables.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_total_block_launchers.py Split total-block, playtime and MCP by responsibility 2026-08-23 20:52:08 +02:00
_total_block_purge.py Grade against 3.14 too, not just run on it 2026-08-29 11:44:25 +02:00
_total_block.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_web_build.py Make serve re-runnable, and cover it to 100% 2026-08-29 18:52:11 +02:00
_web_dataset.py Show which games make up the gaming budget, and bill osu!lazer 2026-08-29 18:32:03 +02:00
_web_games.py Bring _web_dataset.py under the 250-line cap — cap campaign complete 2026-08-24 16:08:12 +02:00
_web_models.py Bring _web_dataset.py under the 250-line cap — cap campaign complete 2026-08-24 16:08:12 +02:00
_web_pace.py Bring _web_dataset.py under the 250-line cap — cap campaign complete 2026-08-24 16:08:12 +02:00
_web_server.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
_whitelist_locking.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_whitelist.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
_workout_budget.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
config.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
enforcer.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
game_install.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
game_uninstall.py Import split-out names from the modules that own them; drop the four lazy facades 2026-09-12 20:22:44 +02:00
hltb.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
library_hider.py Stop the enforcer launching Steam and notifications as root 2026-08-24 13:55:44 +02:00
protondb.py pylint: clear the mechanical residue, the howlongtobeatpy 1.0.23 call, and three duplicate blocks 2026-09-12 20:31:27 +02:00
scanning.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00
steam_api.py Split steam_api and _scanning_confidence under the cap 2026-08-24 14:25:43 +02:00
store_blocker.py pylint: fold the remaining split-era duplicates back into single owners 2026-09-12 20:49:12 +02:00