Status: Frozen v1
Operations, diagnostics, and recovery guide for the rmenu module system.
/modules.reload— reload external modules./modules.list— list loaded modules./modules.telemetry.reset— clear host telemetry.
rmenu.exe --modules-debug
rmenu.exe --modules-dir .\modules --modules-debug--modules-debug prints module status/telemetry and exits.
--modules-dir <PATH> overrides module discovery for this run. It is intended for local development, debugging, and portable installs where modules are not in the default location.
Module directory resolution order:
--modules-dir <PATH>when provided.RMENU_MODULES_DIRenvironment variable when set and non-empty.%APPDATA%\rmenu\moduleswhen available.modulesnext tormenu.exe.modulesrelative to the current working directory as a development fallback.
If a higher-priority candidate does not exist, the resolver continues to the next candidate. --modules-debug must report the final resolved directory so install and debug sessions are reproducible.
loaded— host is operational.degraded— host has recent errors but is still recoverable.disabled— host is disabled by policy or configuration.unloaded— descriptor exists with no active host.
mkdir modules
copy .\my-module.rmod .\modules\my-module.rmod
rmenu.exe --modules-debugmodules/
my-module/
module.toml
module.js
Validate:
rmenu.exe --modules-debugSee also MODULES_QUICKSTART.md.
The /rmods command is a core-owned installer UI for .rmod single-file packages and rpack folder modules published in a GitHub registry repository. The registry layout is:
rmenu-rmods/
modules/
my-module.rmod
rpacks/
my-folder-module/
module.toml
module.js
config.json
README.md
registry.json
scripts/
generate-registry.*
.github/
workflows/
update-registry.yml
registry.json is generated from modules/*.rmod and rpacks/* by GitHub Actions. Maintainers add or update module files and push; they do not edit the registry by hand.
Schema v1 supports rmod and rpack package kinds and includes module identity, version, description, integrity metadata, tags, and optional rMenu compatibility. See docs/rmods-registry.md for the full schema.
Use /rmods in the launcher to fetch the registry, mark modules for change with Space, refresh with F5/Ctrl+R, select updates with Ctrl+U, and apply marked changes with Enter. Markers mean [x] installed, [ ] not installed, and [/] pending change. Installed files land in <data_dir>\modules, with supporting cache/state under <data_dir>\state.
Some rpack modules may declare a [resident] helper. These helpers are background native processes managed by rmenu-daemon, intended for features that must work while the rMenu window is closed.
Operational rules:
rmenu-daemonowns helper lifecycle.- Helpers are started from module-local relative paths.
- Helpers receive generic module/state/config context; they do not receive privileged core APIs.
- Helpers are stopped when the daemon quits or when the module is removed/disabled during helper sync.
- Helper stdout/stderr should be hidden to avoid console flashes.
- Failures are logged and should not prevent rMenu from opening.
Security note: resident helpers can implement global hooks. Install only trusted rpacks and review their README/source before enabling them.
Troubleshooting:
- Check
%APPDATA%\rmenu\rmenu-daemon.logforresident helper started,resident helper start failed, andresident helper stoppedlines. - Confirm the installed rpack contains the helper path declared by
[resident].command. - Restart or quit/start
rmenu-daemonif a helper was installed while no daemon was running. - If a helper remains after daemon quit, stop the process manually and report it; the expected v1 shutdown policy is process termination.
Manual validation checklist for resident mouse helpers:
- install through
/rmods; - confirm daemon starts the helper;
- validate the intended gesture only in its documented scope;
- validate the gesture does not leak outside that scope;
- uninstall or disable and confirm helper stops on the documented sync/daemon lifecycle point.
In [Modules] in config.ini:
provider_total_budget_ms = 35
provider_timeout_ms = 1500
max_items_per_provider_host = 24
dedupe_source_priority = core_first
host_restart_backoff_ms = 800
max_ipc_payload_bytes = 262144Approximate global per-query budget for collecting external provider responses. Once the budget is exhausted, later provider hosts may be skipped for that query. This protects input latency.
Default: 35.
Maximum time to wait for one external host request before treating it as failed. Timeout failures are isolated to the module host and may trigger restart/backoff/disable policy.
Default: 1500.
Maximum provider items accepted from one host before sanitization and merge. Extra items are dropped to bound memory, rendering, and ranking work.
Default: 24.
Controls which source wins when core items and provider items resolve to the same launch target.
Values:
core_first: built-in launcher sources win over provider items.provider_first: provider items win over built-in launcher sources.
Default: core_first.
Minimum delay before trying to restart a failed external host again. This avoids restart loops when a module repeatedly fails.
Default: 800.
Maximum IPC request/response payload size. Oversized payloads are rejected to protect the launcher process.
Default: 262144.
Invalid or missing values fall back to safe defaults. Use rmenu.exe --modules-debug to inspect the effective policy and host health.
Key 1..0 moves selection to the visible item with that quickSelectKey.
It does not automatically submit.
Key 1..0 selects and immediately submits the visible item.
If multiple items use the same key:
- the first visible item wins,
- later duplicates lose key/badge,
- a warning is recorded.
Namespaced format:
/module::command
Rules:
- if an alias belongs to a single module, it can be routed deterministically;
- if an alias belongs to multiple modules, the non-namespaced alias is rejected;
- on collision, use the explicit namespace.
The modules/calculator.rmod module validates the full action flow from external host to core.
Manual test:
- Run
rmenu. - Type:
2+2
Expected result:
- the bar shows
=4aligned to the right; - the text uses the
InputAccessoryKind::Successcolor; - the lower list does not show fuzzy results while the calculation is valid;
- no
permission_deniedmessages appear for undeclared hooks.
If fuzzy results appear during calculation, check that the module uses ctx.replaceItems([]) and that the core respects items_replaced_in_cycle.
If [success] =4 appears, check that input_accessory_text() renders only accessory.text.
The modules/local-scripts.rmod module validates the explicit local-intent pattern with ctx.replaceItems(...).
Manual test:
- Run
rmenufrom the project root. - Type:
>
Expected result:
- the list shows configured local scripts;
- the input accessory shows
local scripts: N; - no History, Start Menu, or PATH results appear.
- Filter:
> bu
Expected result:
buildandbuild-prodappear;- items keep subtitle/path and extension badge.
- Exact match:
> build
Expected result:
buildis first;buildshows theexactbadge;build-prodappears below it.
- Global launcher:
build
Expected result:
- local-scripts mode is not entered;
- normal global ranking is used.
- Submit:
- select
buildinside> build; - press Enter;
- the script should run through the
targetgenerated by the module.
If fuzzy/global results appear inside >, check that the module calls ctx.replaceItems(items) and that the core applies external actions to the real AppState.
The modules/shortcuts.rmod module validates exact search aliases for favorite launch targets.
Manual test:
- Run
rmenufrom the project root. - Type:
b
Expected result:
- the list shows only Blender;
- the row shows the
[b]visual cue badge; - the input accessory shows
shortcut: Blender; - pressing Enter launches
C:\Program Files\Blender Foundation\Blender 5.0\blender-launcher.exe.
- Type:
1
Expected result:
- Blender appears as the matched shortcut;
- the row still shows
[b]as the visual cue; - pressing Enter launches Blender.
- Type non-exact inputs:
bl
b foo
1 foo
Expected result:
- the shortcuts module does not activate;
- normal global launcher search is used.
If the shortcut activates for partial input, check that the module compares input.trim() against key and alias exactly, not with startsWith.
- Search for a normal launcher item, for example Bambu Studio.
- Select it.
- Press
Ctrl+B.
Expected result:
- the input changes to
/shortcuts::bind; - the accessory says
binding <title>: type alias and press Enter.
- Type the alias after the command:
/shortcuts::bind bs
- Press Enter.
- Restart or reopen
rmenuif needed, then type:
bs
Expected result:
- the newly bound item appears as the only shortcut result;
- the row shows
[bs]as visual cue; - Enter launches the saved target.
User-defined shortcuts are persisted in module state:
<data_dir>\state\modules\shortcuts\shortcuts.user.json
<data_dir>\state\modules\shortcuts\shortcuts.pending.json
Older local installs may have used the installed module directory. Move those files to the state directory before updating the shortcuts rpack if you need to preserve them.
With shortcuts loaded, typing normal text should remain immediate. Plain text key presses are not dispatched to module key hooks, and hot query snapshots are lightweight. If input feels delayed:
- confirm the release binary was rebuilt with
cargo build --release; - check that modules do not perform synchronous disk I/O in
onQueryChange; - inspect
--modules-debugfor host errors/timeouts.
The .rmod file does not start with:
#!rmod/v1
Missing block:
---module.js---
The module did not declare the required capability.
Example:
permission_denied module='x' operation='provide_items' capability='providers'
The host did not respond within the configured timeout.
The module exceeded the consecutive error/timeout threshold.
- Run:
rmenu.exe --modules-debug- Check:
- host state,
request_count,error_count,timeout_count,restart_count,recent_errors.
-
Fix manifest/capabilities/script.
-
Reload:
/modules.reload
- Confirm the state returns to
loaded.
If a module is broken:
- Disable it in the manifest (
enabled = false) or move it out ofmodules/. - Run
/modules.reloador restartrmenu. - Fix errors.
- Re-enable it.
- Validate with
--modules-debug.
A healthy system should show:
- hosts in
loaded, - few or zero recent errors,
- zero timeouts,
- low restart counts,
- stable latencies,
- external descriptors matching expected modules.