Everything below is discussed-but-not-built, ordered easiest → hardest.
The config schema itself (markers / programs / rules / universal, templates,
merge model) is implemented — read src-tauri/src/default_config.yaml for the
canonical shape.
Parse target lists and emit one terminal action per target.
Makefile: lines matching^([A-Za-z0-9_.-]+):(?!=)minus.PHONYetc.justfile:just --summaryifjuston PATH, else parse^([a-z0-9_-]+).Taskfile.yml: YAML parse, keys undertasks:.
Cap at ~20. Register "task-targets" in rules.rs::provider_actions, then add
the [Makefile, justfile, Taskfile.yml] rule to default_config.yaml.
Files: rules.rs (or a providers/ split if it grows), default_config.yaml.
The Windows half shipped (see Done): TermKind table (wt / alacritty /
wezterm), a terminal: pin and terminal_template: override, the shell:
knob + per-shell shell_wrap, list_terminals / list_shells, and the
Settings dropdowns. The Linux distribution work (see shipped-alongside) means
there's a real CachyOS/KDE box to validate against now. Left:
- Linux emulator table —
terminalize()'s#[cfg(not(windows))]branch still spawns the bare command with no window. Add the same table shape:alacritty --working-directory D -e CMD·kitty --directory D CMDwezterm start --cwd D -- CMD·gnome-terminal --working-directory=D -- CMDkonsole --workdir D -e CMD·foot --working-directory=D CMDxterm -e sh -c 'cd D; CMD; exec $SHELL'- Wayland-only emulators + the
x-terminal-emulatoralias. Verify on WSLg / VM.
shell_wrapon non-Windows — currently the branch runs the command bare; wireconfig.shell+ the per-shell "run and hold" flags in there too.
Files: rules.rs (terminalize, shell_wrap), default_config.yaml.
The > app scope shipped (see Done): Windows discovery (Start Menu + Store +
Uninstall keys + bounded %LOCALAPPDATA%\Programs scan), extracted+cached
icons, frecency, apps.{enabled,extra_dirs,exclude}, Settings controls. Left:
- Blended overflow — when a no-prefix repo query has few/no matches, show the
top ~4 app hits under a dim
— Apps —divider without leaving repo scope. Needs the keyboard-nav model to walk a mixed list and Enter to branch (repo → action menu, app → launch). - App action menu — Tab on an app row → Open / Open file location / Run as
administrator / Copy path. Currently Tab is a no-op in the
>scope. - Native enumeration — replace the embedded PowerShell script with direct
registry reads +
IShellLinkif the ~4 s cold rescan ever matters.
Files: src-tauri/src/apps.rs, src/App.svelte, src/lib/components/AppList.svelte.
Avoid the "stale until next open + rescan" model.
notifycrate (+notify-debouncer-full).- Shallow, non-recursive watch on each root (recursive inotify on
~/gitblows pastmax_user_watcheson Linux). React only to dir create/remove/rename. - Debounce ~750 ms →
scan_root(one_root)(new incremental fn) →cache::merge→ emitrepos:updated. - Watchers start in
setup(), restart whenrootschanges; keep the TTL rescan as the backstop for deeper changes a shallow watch misses.
Files: new watch.rs, scan.rs (scan_root), lib.rs, commands.rs, Cargo.toml.
tauri-plugin-global-shortcut → global-hotkey is X11-only on Linux. Wayland
has no global-grab; it needs the GlobalShortcuts XDG portal (compositor
support varies), and the plugin has no portal support upstream yet.
Status: the X11 grab via XWayland is confirmed working on KDE Wayland (native
and inside the Flatpak with --socket=x11), and the limitation is now
documented in docs/linux-distribution/phase-4-flatpak.md. So this is no longer
"the hotkey is broken on Wayland" — it's the portal path as a nice-to-have.
- Detect session type via
tauri-plugin-os. - On Wayland without XWayland: attempt the portal; if unavailable, surface a clear message and fall back (tray-only activation).
Files: lib.rs, docs. Blocked on upstream tauri-plugin-global-shortcut
portal support.
Eclipse-family IDEs have no CLI to open an arbitrary project — only
-data <workspace>, and the project must already be registered in that
workspace's .metadata. The fatten pass ships the naive form ("Open in
Anypoint Studio" = -data {{path}}), which is one-click only when the scanned
folder is the workspace.
A real "open this repo as a project" needs a pre-launch provisioner —
a new action-type concept (provision: step that runs before the spawn):
- Option A (preferred): write
<workspace>/.metadata/.plugins/org.eclipse.core.resources/.projects/<name>/.location(semi-documented binary URI format, stable since 3.x) for a repo that has a.projecton disk, then-data <workspace>launch. Nothing to ship; degrades to "import once by hand" if the format drifts. Needs ananypoint: { workspace: <path> }config knob. - Option B: bundle a ~50-line headless Eclipse plugin
(
loadProjectDescription→create→open→ open workbench) indropins/. Correct, but you then maintain it per Studio / Eclipse / STS version.
Files: new provisioner hook in rules.rs / launch.rs, config.rs (workspace
knob), default_config.yaml.
Same manifest → [(name, dir)] → per-module terminal actions shape as the
dotnet / go-work / maven-modules / gradle-modules providers, for the
ecosystems that need more than a flat parse:
- Cargo workspaces — root
Cargo.toml[workspace] members = [...]incl. globs (crates/*). Needs a TOML parser (new dep) or a careful hand-parse.cargo build -p <member>from the root. Largely redundant withinspect'scrates/discovery — low ROI. - Nx / Turborepo / Bazel — build graphs, not flat lists:
nx.json+ scatteredproject.json,turbo.json+ workspace globs, orbazel query //.... Heavier; niche.
Files: rules.rs (one provider arm each) + a small parser module per tool;
default_config.yaml.
Today {{...}} is plain string substitution — no conditionals, no fallbacks,
no computed values. That's the wall every "detect X, then adapt" case hits, and
it's why things like venv-aware Python had to be built in Rust rather than
authored in rules.yaml.
Concretely, a user can already:
- match a rule on a directory (
match: [.venv, venv]— dir names are in the file list), and - use
{{path}}/{{file}}in a template-expandedprogram:, e.g.program: "{{file}}/bin/python", withwhen: windows/when: unixfor theScriptsvsbinsplit.
What they can't do:
- Fallback — one action that uses the venv interpreter if
.venvexists and barepythonotherwise. No{{venv_python | default: python}}. You end up duplicating every action (venv set + plain set → noise), or hardcoding a path that's broken on projects without a venv. - Existence-guard an action — a rule action's raw
program:isn't verified to be a real file the way aprograms:candidate is; it's used as typed. - Compute once, use many —
venvthreads into pip + pytest + django + run uniformly in Rust; in config you'd repeat the literal in each action. - Project-relative
programs:—programs:entries resolve once, process-wide, before any project is known, so{{path}}isn't available there; no reusable project-scoped program key.
Possible directions (pick one, keep it small):
{{a | default: b}}/{{a ?? b}}coalescing inexpand().- A rule/action-level
when_file:/unless_file:guard (glob, relative to the project dir) so an action only emits when a path exists — covers the venv case without a full expression language. - Computed vars: a rule
let:block (venv_py: "{{path}}/.venv/bin/python") whose values are only bound when their referenced path exists.
Files: rules.rs (expand + build_action), config.rs (schema),
docs/rules-engine.md.
Dependabot flags a moderate-severity soundness bug in glib 0.15–0.19's
VariantStrIter iterator impl (NULL-deref crash under specific GVariant
string-array iteration; RUSTSEC-2024-0429). It's transitive — pulled in by
gtk 0.18.x, itself required by tauri 2.11.5's Linux tray/window backend —
and can't be bumped independently: cargo update -p glib --precise 0.20.0
fails because tauri hard-pins gtk = "^0.18".
Linux-only at compile/runtime (Windows never links glib/gtk); dev-prompt doesn't call the affected iterator itself, so realistic exposure is low. No action possible until Tauri ships on a gtk-rs 0.20+ base — check Tauri's own releases rather than re-investigating this alert from scratch.
Tracking: Dependabot alert #1.
- #1 Fatten
default_config.yaml— 2026-08-31 - #2 VCS row badge — 2026-08-31 (PR #1)
- #3 Folder picker for roots — 2026-08-31 (PR #1)
- #4 Start at login — 2026-08-31 (PR #1); extended 2026-09-07 to work inside
the Flatpak sandbox via the
org.freedesktop.portal.Backgroundportal (src-tauri/src/autostart.rs,ashpd) - #5
collapse_nestedtoggle (true/false/auto) — 2026-09-01 - #8 per-repo rule trace in Settings ("Trace a repo") — 2026-09-01
- #7
dotnetprovider —.sln/.slnx/ lone.??proj→ build/run/test — 2026-09-01 - go-work / maven-modules / gradle-modules providers (#14's cheap tier) — 2026-09-01
- Sub-project discovery generalized —
has_any_marker()used to hardcode 5 ecosystems (.sln, package.json, Cargo.toml, go.mod, Python); the other 13 rule-based ones (compose, Maven, Gradle ×2, CMake, Bundler, Mix, Composer, Deno, Nix ×2, Docker, Eclipse) only ever worked at a repo root, invisible as a sub-project. Now checksproj.filesagainst the samediscovery_globsscan.rs uses to find repos, so any rule — present or future — is automatically enough. — 2026-09-01 - Flutter/Dart support —
pubspec.yamlrule (pub get/run/build/test), plusflutter-androidreaching intoandroid/for the Gradle project Flutter generates there (one level below the project root, invisible togradle-modules); uses the bundledgradlewwrapper when present. — 2026-09-01 - Python provider fleshed out — was just pip/uv/poetry install. Now:
venv-aware interpreter (
.venv/venv→Scripts/python.exe), Django (manage.py→ runserver/migrate/test), pytest (conftest.py/pytest.ini/tox.ini/tests/), run entry (main.py/app.py/__main__.py), pipenv + pdm runners, and more markers (setup.py,setup.cfg,Pipfile,manage.py) so non-requirements.txtprojects get detected. — 2026-09-01 - Terminal emulator selector (Windows) —
TermKindtable (wt/alacritty/wezterm),terminal:pin +terminal_template:override inconfig.yaml,list_terminalscommand, Settings dropdown. — 2026-09-01 - #9 "Run command…" + shell default (Windows) —
prompt: trueactions +{{input}}; a 4th overlay mode (RunCommand.svelte) with a per-run shell picker;run_command/list_shells;config.shell+ per-shellshell_wrap("run and hold" for pwsh / cmd / bash / nu / …) + a Settings Shell dropdown. — 2026-09-01 - App launcher —
>scope (Windows) — type>in the search bar to search installed apps instead of repos.apps.rsdiscovery via one embedded PowerShell script (Start Menu +Get-StartAppsStore + Uninstall hives + bounded%LOCALAPPDATA%\Programsscan), extracted + disk-cached icons,keep_entrynoise filter + path dedupe;apps.jsoncache (24 h TTL),list_apps/rescan_apps/run_app,app-usage.jsonfrecency;AppList/AppRow,config.apps.{enabled,extra_dirs,exclude}+ Settings controls. Phase 2 in #16. — 2026-09-01 - Second app-launcher hotkey + hotkey guard —
config.apps_hotkey(defaultCtrl+Shift+.) opens straight into the>scope; scopedoverlay:shownpayload.hotkeys.ts::classifyHotkeyblock/warn list in the recorder (extracted toHotkeyRecorder.svelte, used for both hotkeys). Settings: hotkeys side-by-side, Shell inline with Terminal, "Start at login" to the top, a zero-height sticky Save, save-first "Rescan" buttons. — 2026-09-01
Remaining, hardest-first: #6 task-targets provider, #16 app-launcher phase 2, #15 conditional template expansion, #14 (Cargo-workspace / Xcode / Nx-Turbo- Bazel), #10 terminal abstraction (non-Windows), #11 fs watcher, #12 Wayland hotkey, #13 Eclipse provisioner.
Release pipeline (CalVer + GitHub Actions + signed auto-update), config.yaml /
rules.yaml split, per-action icons + Settings icon browser, proactive update
notifications (launch + daily check, footer chip, tray tooltip, system
notification), CI workflow + main branch protection, empty-state guidance,
mouse back/forward navigation, hover/scroll fix.
Linux distribution (its own roadmap: docs/linux-distribution/) — Aug–Sep
2026. Phase 1 packaging metadata (.desktop + AppStream, CI validation); Phase 3
self-hosted signed apt + rpm + pacman repo on GitHub Pages (repo.yml,
build-repo.sh); Phase 4 self-hosted GPG-signed Flatpak (sandbox-aware
flatpak-spawn --host launch, host tool detection, /run/host app discovery,
Background-portal autostart, built in the flathub-infra container); the > app
scope on Linux (freedesktop .desktop discovery, theme icons, gtk-launch);
Dependabot (grouped weekly). Phase 2 (AUR) parked on registration, Phase 5 (Snap)
skipped (can't self-host), Phase 6 (official repos) passive. Reviewed + hardened
2026-09-07 (docs/review/20260907/).