Commit Graph

1734 Commits

Author SHA1 Message Date
11d283585c forza-trigger: drop pedal-off early-returns (root cause of "no reaction")
Live diagnostic on yarn revealed the daemon was receiving 324-byte FH5
packets correctly (5.7MB on the systemd socket; strace showed steady
recvfrom + write to /dev/hidraw7) but writing trigger mode 0x05
(no-resistance) on nearly every tick. Cause: `accel` and `brake` are
0 most of the time during normal play (off-throttle on straight
sections, off-brake when not braking). Both handlers had:

  if accel/255 <= THROTTLE_INPUT_THRESHOLD: effect.off(); return
  if brake/255 <= BRAKE_INPUT_THRESHOLD:    effect.off(); return

Every off-pedal packet set the trigger to OFF. Brief pedal-on moments
set vibration. The result: rapidly oscillating off↔vibration state,
imperceptible at 60 Hz packet rate.

These early-returns were holdovers from the previous Race-Element 1:1
port (variant A), which IS designed to be silent unless slipping.
Variant D's whole point is "always feels something" — Cosmii has no
pedal-off gate, and its baseline branch produces feedback even at
brake=0/accel=0 with strength clamped to MIN.

Fix: remove both early-returns. Foot-off-pedal flows through the
baseline branch and produces feedback(strength=MIN_*_RESISTANCE). The
user feels light constant resistance instead of silence. Trigger only
returns to physical-rest when out-of-race (run-loop's reset_triggers).

Also drop the now-dead BRAKE_INPUT_THRESHOLD / THROTTLE_INPUT_THRESHOLD
constants. Two tests renamed and updated to assert MIN-strength
baseline feedback instead of effect.off() on zero pedal.

54/54 tests pass. Build clean.
2026-05-07 14:18:47 -04:00
e159f4d90f dualsense: possibly fix weird vibrations
All checks were successful
Build and Deploy / mreow (push) Successful in 1m1s
Build and Deploy / yarn (push) Successful in 1m6s
Build and Deploy / muffin (push) Successful in 1m25s
2026-05-07 01:27:53 -04:00
03c3d01c66 forza-trigger: things 2026-05-07 01:27:49 -04:00
0568a571a1 update
All checks were successful
Build and Deploy / mreow (push) Successful in 11m49s
Build and Deploy / yarn (push) Successful in 1m6s
Build and Deploy / muffin (push) Successful in 1m17s
2026-05-06 18:53:36 -04:00
78d6aa01d5 flare: update patches and upstream source 2026-05-06 15:21:53 -04:00
f1321d2223 pi: fix pyghidra_mcp_projects folder generation
All checks were successful
Build and Deploy / mreow (push) Successful in 2m48s
Build and Deploy / yarn (push) Successful in 1m11s
Build and Deploy / muffin (push) Successful in 2m42s
2026-05-06 13:09:53 -04:00
f1e4f8480e niri: fix sleep 2026-05-06 13:09:36 -04:00
b21f9799a5 caddy: fix plugin hash???
Some checks failed
Build and Deploy / mreow (push) Successful in 53s
Build and Deploy / yarn (push) Successful in 55s
Build and Deploy / muffin (push) Failing after 22m41s
2026-05-06 10:32:58 -04:00
b90c0b614c update
Some checks failed
Build and Deploy / mreow (push) Successful in 3m13s
Build and Deploy / yarn (push) Successful in 1m4s
Build and Deploy / muffin (push) Failing after 1m13s
2026-05-06 09:58:09 -04:00
717a836be2 update
Some checks failed
Build and Deploy / mreow (push) Successful in 5m53s
Build and Deploy / yarn (push) Successful in 1m2s
Build and Deploy / muffin (push) Failing after 3m34s
2026-05-06 00:51:00 -04:00
d61433019d firefly-iii-data-importer: allow exit status 73 for no imports done 2026-05-06 00:50:56 -04:00
52e902c23c update
Some checks failed
Build and Deploy / mreow (push) Successful in 1h48m22s
Build and Deploy / yarn (push) Failing after 3h23m42s
Build and Deploy / muffin (push) Successful in 2m51s
2026-05-05 17:34:54 -04:00
3da843c3ff fix secrets
Some checks failed
Build and Deploy / mreow (push) Successful in 56s
Build and Deploy / yarn (push) Successful in 53s
Build and Deploy / muffin (push) Failing after 33s
2026-05-05 12:40:11 -04:00
92d49571b9 pi: fix python env
Some checks failed
Build and Deploy / mreow (push) Successful in 1m14s
Build and Deploy / yarn (push) Successful in 57s
Build and Deploy / muffin (push) Failing after 32s
2026-05-05 03:22:22 -04:00
c1f1959aa1 firefly-iii-data-importer: fix allowlist
All checks were successful
Build and Deploy / mreow (push) Successful in 1m14s
Build and Deploy / yarn (push) Successful in 56s
Build and Deploy / muffin (push) Successful in 1m13s
2026-05-05 02:21:31 -04:00
4c45874401 firefly-iii-data-importer: rotate PAT
All checks were successful
Build and Deploy / mreow (push) Successful in 49s
Build and Deploy / yarn (push) Successful in 54s
Build and Deploy / muffin (push) Successful in 1m8s
2026-05-05 02:07:54 -04:00
8ba6decc1f firefly-iii-data-importer: init
All checks were successful
Build and Deploy / mreow (push) Successful in 1m38s
Build and Deploy / yarn (push) Successful in 55s
Build and Deploy / muffin (push) Successful in 1m40s
2026-05-05 02:05:16 -04:00
82213c2917 firefly-iii: init
All checks were successful
Build and Deploy / mreow (push) Successful in 1m14s
Build and Deploy / yarn (push) Successful in 55s
Build and Deploy / muffin (push) Successful in 1m58s
2026-05-05 01:40:29 -04:00
b248f3592f pi: drop redundant pkgs.ghidra from home.packages
All checks were successful
Build and Deploy / mreow (push) Successful in 2m58s
Build and Deploy / yarn (push) Successful in 1m3s
Build and Deploy / muffin (push) Successful in 1m5s
The pyghidra-mcp wrapper bakes in GHIDRA_INSTALL_DIR via makeWrapperArgs
referencing pkgs.ghidra, which makes ghidra a runtime closure dep.
Adding pkgs.ghidra explicitly to home.packages caused buildEnv to merge
*two* ghidra-12.0.4 store paths (one from pyghidra's propagatedBuildInputs,
one from the explicit list) and fail with a path collision on
GPL/DMG/LICENSE.txt.

Drop the explicit add. The agent-driven workflow doesn't need the GUI;
manual exploration via 'nix run nixpkgs#ghidra' is one command away if
ever wanted.
2026-05-04 20:36:24 -04:00
ea6ef4a446 arr: more things
Some checks failed
Build and Deploy / mreow (push) Failing after 2m59s
Build and Deploy / muffin (push) Has been cancelled
Build and Deploy / yarn (push) Has been cancelled
2026-05-04 20:33:27 -04:00
05b2741ec0 pi: generic-ize ghidra skill (drop game-specific examples) 2026-05-04 20:33:14 -04:00
feae0f8002 pi: package pyghidra-mcp + wire as OMP MCP server
Adds two inline Python derivations to home/progs/pi.nix:

  - ghidrecomp 0.5.9 (clearbluejar/ghidrecomp) — required by pyghidra-mcp,
    not in nixpkgs.
  - pyghidra-mcp 0.2.2 (clearbluejar/pyghidra-mcp) — headless MCP server
    that exposes Ghidra's analysis primitives (decompile, disassemble,
    list_strings, get_xrefs_to, etc.) over Model Context Protocol stdio.

The wrapper bakes in GHIDRA_INSTALL_DIR=${pkgs.ghidra}/lib/ghidra so
pyghidra discovers the Ghidra install at runtime without env munging.

Wires into OMP via:
  - home.packages: pyghidra-mcp + pkgs.ghidra (GUI for occasional manual
    exploration alongside the agent-driven flow).
  - ~/.omp/agent/mcp.json: registers a 'ghidra' MCP server that spawns
    pyghidra-mcp on stdio when any of its tools are invoked.
  - ~/.omp/agent/skills/ghidra/SKILL.md: tells the agent when to reach
    for Ghidra (static binary RE) vs. usbmon (dynamic capture) vs. the
    built-in tools, and gives the canonical exploration workflow.

Replaces the previously-recommended LaurieWired/GhidraMCP, which has
been stale since June 2025. clearbluejar/pyghidra-mcp is actively
maintained (last commit 3 days ago), pure-Python via pyghidra+jpype, and
multi-binary capable in a single session.

Verified: pi.nix parses, the yarn NixOS closure evaluates, both
derivations build, and the wrapped binary's --help works (Ghidra runtime
discovered correctly via GHIDRA_INSTALL_DIR).
2026-05-04 20:28:13 -04:00
9ef9389672 *arr: fix (?)
All checks were successful
Build and Deploy / mreow (push) Successful in 1m7s
Build and Deploy / yarn (push) Successful in 52s
Build and Deploy / muffin (push) Successful in 1m16s
2026-05-04 20:25:04 -04:00
a95f614dd9 qbt: adjust settings
All checks were successful
Build and Deploy / mreow (push) Successful in 1m11s
Build and Deploy / yarn (push) Successful in 51s
Build and Deploy / muffin (push) Successful in 1m8s
2026-05-04 15:09:52 -04:00
c3139fd659 update
All checks were successful
Build and Deploy / mreow (push) Successful in 4m7s
Build and Deploy / yarn (push) Successful in 1m7s
Build and Deploy / muffin (push) Successful in 1m13s
2026-05-04 14:49:35 -04:00
6501fe2ddb forza-trigger: rewrite 2026-05-04 14:47:00 -04:00
09175cd0dc torrent-audit: make more robust 2026-05-04 14:46:41 -04:00
ce42ccdcc0 wireshark: disable (build fails)
All checks were successful
Build and Deploy / mreow (push) Successful in 1h37m30s
Build and Deploy / yarn (push) Successful in 15m23s
Build and Deploy / muffin (push) Successful in 42s
2026-05-03 23:10:05 -04:00
8d3436ff8b update
Some checks failed
Build and Deploy / mreow (push) Failing after 5m48s
Build and Deploy / muffin (push) Has been cancelled
Build and Deploy / yarn (push) Has been cancelled
2026-05-03 23:01:45 -04:00
35ae3087d2 pi: do not grep/find over /nix/store 2026-05-03 22:59:47 -04:00
71b797730a fh5: use proton experimental
All checks were successful
Build and Deploy / mreow (push) Successful in 3m33s
Build and Deploy / yarn (push) Successful in 1m25s
Build and Deploy / muffin (push) Successful in 1m6s
2026-05-03 22:47:49 -04:00
1fc2f995c7 yarn: forza dualsense adaptive trigger bridge 2026-05-03 22:47:41 -04:00
4d0ba317e1 Revert "lact: disable undervolt"
This reverts commit 6e69b40b4e.
2026-05-03 22:45:12 -04:00
a65a7e7bda steam-config-nix: move to my fork and drop gameMods 2026-05-03 22:45:11 -04:00
1686a2ecc5 remove stupid comment from optiscalar config 2026-05-03 22:44:15 -04:00
e4b3c19d00 yarn: drop GE-Proton compat-tool pin from steam-config-nix
nixpkgs' proton-ge-bin (the package wired into programs.steam.extra-
CompatPackages via modules/desktop-steam.nix) registers in Steam's
compat-tool list under its versioned id, currently GE-Proton10-34.
steam-config-nix's README example uses the unversioned string
"GE-Proton", which on a fresh boot wrote that literal value into
localconfig.vdf — Steam resolved it to no installed tool and silently
fell back to bundled Proton 10. FH5 then launched on stock Proton,
which doesn't pick up PROTON_FSR4_UPGRADE the way GE does.

Drop both `compatTool` (per-app) and `defaultCompatTool` (global).
The wrapper-based launchOptions.env path is unaffected — env vars
still pass through to whatever Proton Steam ends up using. Tool
selection goes back to manual Steam UI > Properties > Compatibility.

A versioned pin (`compatTool = "GE-Proton10-34";`) would work but
couples the host config to whatever the proton-ge-bin nixpkgs entry
ships this week; not worth the maintenance.
2026-05-03 22:44:14 -04:00
2404792b61 game-mods: drop in-house launchOptions writer, hardcode FH5 ini
Replaces three handfuls of custom code with upstream / static data:

- Per-app Steam launch options now declared via different-name/steam-
  config-nix's `programs.steam.config.apps.<n>` instead of a custom
  ~70-line `apply_launch_options` Python function. The dropped writer
  was racy: it edited localconfig.vdf without checking for a running
  Steam, so any timer firing while Steam was open would lose its
  changes on the next Steam shutdown. steam-config-nix's `closeSteam`
  flag closes that race.

  Also moves the GE-Proton compat-tool pin to declarative config —
  one fewer manual click in Steam UI to remember.

- `mods.<>.launchOptions` option, the `launchOptionsData` aggregation,
  and `LAUNCH_OPTIONS_DATA` are removed from desktop-game-mods.nix.
  The module now does file-drops only; Steam config lives in its own
  `programs.steam.config` namespace, where it belongs.

  fh5-vkd3d-no-hvv (which existed only to set VKD3D_CONFIG) collapses
  into the FH5 launchOptions block in hosts/yarn/default.nix.

- `unitConfig.X-ConfigHash` on game-mods.service is replaced with
  `restartTriggers`. NixOS already emits `X-Restart-Triggers=<hash>`
  on the unit; the workaround was redundant. The Type=oneshot,
  RemainAfterExit=no semantics make `systemctl restart` re-run
  ExecStart cleanly on hash change.

- The awk pipeline that patched OptiScaler's stock OptiScaler.ini at
  build time is replaced with a hand-written hosts/yarn/optiscaler-
  fh5-rdna3.ini containing only the keys we override (5 of them).
  OptiScaler's Config::readString defaults missing keys to "auto"
  (Config.cpp:1568), so a minimal file is sufficient. Side benefits:
  one upstream-source dependency removed, a key-rename in upstream
  becomes a behavior change rather than a silent awk-no-match.

  Override values + sources:
    Fsr4Update=true              FH5 wiki, FSR4 Linux Setup
    DlssReactiveMaskBias=0.65    FH5 wiki, "Known Issues"
    FsrNonLinearColorSpace=true  FSR4 wiki, "Image Quality"
    EnableFsr2Inputs=false       FH5 wiki, "Known Issues"
    Dxgi=false                   FH5 wiki

- forza-trigger's three custom Python derivations (pydualsense,
  hidapi-usb, fdp) factored out of default.nix into a sibling
  python-packages.nix. Same logic, single-purpose file. Bumping a
  version is now a one-place hash roll.

- pkgs.dualsensectl removed from the daemon's environment.system-
  Packages. Single-shot writes from the CLI get clobbered by the BG
  sendReport thread within ~4ms anyway, so the tool is only useful
  with the daemon stopped — not worth the unconditional install.
  Bring it in ad-hoc with `nix-shell -p dualsensectl`.
2026-05-03 22:44:14 -04:00
2680b85d77 game-mods: restore BACKUP_SUFFIX, doc launchOptions, fix blank lines
Three small follow-ups to 1751603:

- BACKUP_SUFFIX was lost during the launchOptions refactor. apply_mod
  references it on every non-skip path (new target, drifted bytes, or
  replace mode), so the moment a deployment hit one of those, the
  service would NameError at runtime. The bug was latent on yarn
  because every dropped file's bytes already matched its source, so
  every apply short-circuited at the byte-match check; an empirical
  rm libxell.dll + systemctl start reproduced the NameError before
  the fix and showed a successful recreate after.

- Mention launchOptions in the leading file docstring. The Example
  block already covers file ops; the new option had no entry-level
  doc.

- Normalize blank lines between top-level Python defs in the heredoc
  (PEP-8 wants exactly two: we had four between apply_mod and
  apply_launch_options, zero between apply_launch_options and main).
2026-05-03 22:43:55 -04:00
510d2702b7 yarn: FH5 OptiScaler FSR 4 + VKD3D upload-hvv workaround
Drops OptiScaler v0.9.1 + a FH5-tuned OptiScaler.ini into the FH5
install dir to unlock FSR 4 INT8 on this RDNA 3 (Navi 32) box.
OptiScaler intercepts FH5's DLSS/XeSS calls and reroutes them through
the bundled FFX SDK. Per the OptiScaler FH5 wiki page: rename
OptiScaler.dll to dxgi.dll, set Dxgi=false, DlssReactiveMaskBias=0.65,
and Fsr4Update=true for the INT8 RDNA 3 path.

Sets Steam launch options PROTON_FSR4_UPGRADE=1 and
DXIL_SPIRV_CONFIG=wmma_rdna3_workaround on fh5-optiscaler (the FSR 4
wiki documents both as required for RDNA 3 on Linux).

fh5-vkd3d-no-hvv is its own mod (no files, just one launchOptions
entry for VKD3D_CONFIG=no_upload_hvv) so the upload-hvv workaround
can be removed when a future Proton release fixes the underlying
issue without disturbing the OptiScaler config.

Extends the intro skip stub to cover the hires variant of the
T10/Microsoft Studios splash; the engine picks SD or hires based on
the installed asset profile, so stub both per PCGamingWiki.
2026-05-03 22:43:54 -04:00
4b7f23859e optiscaler: package v0.9.1
stdenvNoCC + p7zip extraction; strips installer scripts and README,
keeps Licenses/. dontFixup since the artifacts are Windows DLLs.
meta.license is unfreeRedistributable to reflect the bundled XeSS
(Intel SLA) alongside the GPL-3.0 source.

Wires lib/overlays.nix into mkDesktopHost (was muffin-only) and adds
"optiscaler" to the unfree allowlist on jovian hosts so yarn can
consume it without flipping the global allowUnfree flag.
2026-05-03 22:43:32 -04:00
713eb5f880 game-mods: list-merged launchOptions, init mode, writable targets
Three additions on top of the file-replacement scaffolding:

- mode = "init": create-on-first-apply, leave-alone-otherwise. For
  files the application writes back to (configs edited in-game, save
  files). Operator pushes a new template by deleting the target.

- chmod 644 after every copy. shutil.copy2 preserved the source's
  /nix/store mode (0o444), which made dropped DLL configs read-only.
  Apps that wrote back (OptiScaler "Save INI") got EACCES, which in
  OptiScaler's case cascaded into CreateSwapChainForHwnd returning
  E_FAIL and crashed FH5 on launch.

- launchOptions = listOf str. Multiple mods targeting the same
  steamAppId have their lists concatenated (mod-name alphabetical),
  joined with spaces, %command% appended once. Written into Steam's
  per-app block in userdata/<id>/config/localconfig.vdf via vdf
  parse + atomic os.replace. Idempotent.

- X-ConfigHash on the systemd unit so switch-to-configuration switch
  re-runs apply when the manifest changes.
2026-05-03 22:43:32 -04:00
21a32b76b7 game-mod: extend module 2026-05-03 22:43:32 -04:00
50568aa01b steamos: disable steam deck cmdlineConfig for non-steamdeck hosts 2026-05-03 22:43:32 -04:00
483961ac1b lact: disable undervolt 2026-05-03 22:43:31 -04:00
a1d2090ff2 game-mods: init
Add override for fh5 startup video
2026-05-03 22:43:30 -04:00
69ac586e98 omp: remove patch 2026-05-03 22:42:43 -04:00
d475e368c2 lact: -130 -> -120 2026-05-03 22:42:43 -04:00
c5eed7679c update 2026-05-03 22:42:43 -04:00
004d5962bb lact: -150 -> -130 2026-05-03 22:42:43 -04:00
975c4f7af1 yarn: declarative lact config 2026-05-03 00:35:48 -04:00