snipexpand 0.3.0

Fast, config-based text expansion for Linux and Wayland
# SnipExpand tasks

This is the prioritized product backlog. Within each group, work from top to
bottom unless user feedback provides a stronger signal.

## P0: Make the current product dependable

These tasks should come before adding major expansion features.

- [ ] Build a repeatable application compatibility suite.
  - [x] Establish an isolated, byte-exact Neovim-in-Foot baseline using the
    real evdev and Wayland injection path.
  - Cover Chromium, Firefox, Zed, terminals, Electron apps, GTK, and Qt.
  - Exercise ASCII, Unicode, multiline text, cursor placement, undo, rapid
    consecutive expansions, and configuration reloads.
  - Record known application-specific timing overrides as fixtures.
- [x] Make upgrades and removal first-class.
  - Add `snipexpand uninstall` for the user service and generated service file.
  - Ensure `snipexpand install` replaces and restarts an older running daemon.
  - Document which user configuration remains after uninstalling.
- [ ] Offer an Arch-native installation path.
  - Publish and maintain an AUR package for release binaries.
  - Ensure installation, input-group access, service setup, upgrade, and removal
    behave naturally on Omarchy and Arch Linux.
  - Keep Cargo and direct binary installation available.
- [x] Rebuild the persistent Unicode keymaps after a configuration reload.
  - Newly added Unicode snippets should not require a daemon restart or
    temporarily fall back to `wtype`.
  - Add regression coverage for adding and removing Unicode while running.
- [ ] Expand keyboard and input testing.
  - [x] Track modifiers independently across multiple keyboards and clear them
    when a device disconnects.
  - Test common non-US XKB layouts, held modifiers, dead keys, compose keys,
    key repeat, multiple keyboards, sleep and resume, and device hotplugging.
  - Document IME and Fcitx5 behavior rather than guessing at compatibility.
- [x] Remove the GitHub Actions Node 20 deprecation warnings.

## P1: Highest-value user features

These are the strongest candidates for the next feature releases.

- [x] Round out snippet metadata and composition.
  - Support Espanso-compatible `search_terms` and expose them through
    `snipexpand list --json` for the Omarchy plugin.
  - Support safe nested `match` variables so shared text can be reused without
    shell execution or copy-and-paste duplication.
  - Reject missing references and dependency cycles during `snipexpand check`.
- [x] Add pause and resume controls.
  - Expose `enable`, `disable`, and `toggle` over the existing IPC connection.
  - Include the enabled state in `status --json` and the Omarchy plugin.
  - Consider a configurable double-tap modifier only after CLI and plugin
    controls prove insufficient.
- [x] Add per-application profiles.
  - Allow different match sets, trigger modes, and injection timing by title,
    class, or executable.
  - Preserve the current exclusion syntax as the simple path.
  - Use `snipexpand detect` to expose the title, class, and executable values
    needed to write profile filters.
- [ ] Add an Espanso migration command.
  - Import the supported subset without rewriting the original configuration.
  - Report every skipped or incompatible field with its file and match.
  - Make the result pass `snipexpand check` before writing it.
- [x] Add regex triggers with capture variables.
  - Bound the input buffer and regex execution so matching stays predictable.
  - Define deletion, boundaries, case propagation, and overlapping matches
    before accepting the syntax.
- [x] Add a snippet search palette through the Omarchy plugin.
  - Search labels, triggers, and replacement previews.
  - Insert through `snipexpand paste` while keeping the daemon independent of
    the plugin.
- [x] Make word-boundary behavior configurable.
  - Add Espanso-compatible `word_separators` for punctuation, programming, and
    language-specific workflows.
  - Preserve the current Unicode-aware default when the setting is absent.
- [x] Handle duplicate triggers deliberately.
  - Automatic typing expands only when app profiles leave one match active.
  - Let launchers select an exact duplicate with its source path through
    `snipexpand paste --source`.
- [ ] Add named snippet groups and quick enable or disable controls.
  - Support global and application-scoped groups.
  - Expose group state through the CLI and status JSON.
- [ ] Add an optional long-text injection strategy.
  - Benchmark persistent typing before choosing a clipboard or compositor-native
    backend.
  - If clipboard insertion is added, make it explicit, preserve prior clipboard
    contents, and retain the clipboard-free default.

## P2: Differentiators and power-user features

- [ ] Build an opt-in snippet opportunity advisor.
  - Detect text the user repeatedly types even though an equivalent snippet
    already exists.
  - Show the highest-value missed opportunity and estimated daily, weekly,
    monthly, and yearly savings.
  - Keep captured text local, make retention configurable, and provide a clear
    way to inspect and delete all collected data.
- [ ] Add safe variable types.
  - Consider UUID, random selection, environment values, and clipboard contents
    individually after nested matches.
  - Require explicit opt-in for sensitive sources such as the clipboard.
  - Continue rejecting arbitrary shell and script execution by default.
- [ ] Support multiple cursor stops.
  - Let Tab advance through declared positions after expansion.
  - Define cancellation behavior for mouse input, focus changes, and manual
    cursor movement.
- [ ] Add Git-based snippet sharing.
  - Start with import and export of ordinary directories.
  - Pin revisions and validate all imported YAML.
  - Do not build a hosted package registry until this proves insufficient.
- [x] Ship an Omarchy companion plugin.
  - Search, insert, add, edit, remove, diagnose, and restart snippets and the
    service while keeping the daemon independent of the UI.
- [ ] Explore a cross-platform desktop companion only when another supported
  platform needs one.

## P3: Broader platform work

- [ ] Add tested support for more Wayland compositors, starting with those that
  expose reliable active-window and virtual-keyboard protocols.
- [ ] Investigate macOS and Windows backends without weakening the Linux and
  Wayland implementation.
- [ ] Consider optional encrypted sync only after local import, export, and
  conflict behavior are solid.

## Not planned for the core daemon

These features add substantial security or product complexity and should not be
accepted without a new design decision:

- Arbitrary shell or script execution
- Forms and choice windows inside the daemon
- HTML, images, and application-specific rich-text insertion
- A hosted public package registry
- Mandatory accounts, telemetry, or cloud services

## Prioritization signals

The ordering favors reliability and small additions that strengthen ordinary
text expansion. Espanso's `search_terms`, nested matches, pause controls, and
configurable word separators fit SnipExpand's existing architecture. Forms,
rich text, clipboard automation, and arbitrary code execution do not.

Useful upstream signals:

- [Espanso feature requests and ideas]https://github.com/espanso/espanso/discussions/categories/feature-requests-and-ideas
- [Wayland application detection and per-app configuration]https://github.com/espanso/espanso/issues/2730
- [Custom configuration locations for dotfile workflows]https://github.com/espanso/espanso/issues/2382
- [Wayland expansion reliability]https://github.com/espanso/espanso/issues/1966

Revisit priorities after the project receives its first substantive user issues
or discussions. Direct SnipExpand feedback should outweigh inferred demand from
other projects.