free-launch 0.2.5

A simple fuzzy launcher written in Rust.
Documentation
# Free Launch

A fuzzy launcher written in Rust to replace [Ulauncher](https://github.com/Ulauncher/Ulauncher).

Because there is no such thing as a free launch.

## Why Build This

NixOS warned me of multiple security issues in `libsoup-2.74.3` which was a dependency for [Ulauncher](https://github.com/Ulauncher/Ulauncher). See the related nixpxgs issue [ulauncher: dependency on webkitgtk_4 gives insecure dependency warning · Issue #430262](https://github.com/NixOS/nixpkgs/issues/430262).

Other Rust-based launchers don't meet my requirements:

- They are not being actively developed.
- They don't run on my setup.

## Versions

Version [v0.1.0](https://github.com/symplasma/free-launch/tree/v0.1.0) was written with GTK bindings. The code is still available under the [gtk_based](https://github.com/symplasma/free-launch/tree/gtk_based) branch.

Managing additional state was proving to be overly complicated in GTK so the current version was rewritten in [egui](https://github.com/emilk/egui?tab=readme-ov-file)/[eframe](https://github.com/emilk/egui/tree/main/crates/eframe) which is proving far easier to work with. Additionally, the app seems to launch faster and do not miss the first keystroke anymore, even when typing very quickly.

### Launchers in C and Other Languages

This is far from an exhaustive list. I'm mostly focusing on Rust based launchers for Linux.

- [Ulauncher]https://github.com/Ulauncher/Ulauncher: The best option I had found, but unfortunately it depends on `libsoup-2.74.3` which is marked as insecure in [nixpkgs]https://github.com/nixos/nixpkgs.
- [albert]https://github.com/albertlauncher/albert: I was actually using this first but it had a few issues. Can't remember what they were at the moment but I left it for Ulauncher.
- [rofi]https://github.com/davatorium/rofi: Not a big fan of the interface on this one, even though it's very popular.
- [Krunner]https://userbase.kde.org/Plasma/Krunner: This looks decent, worth trying for those on KDE. Actually, it should be usable on NixOS even without running KDE as the window manager.

### Rust Based Launchers

- [Loungy]https://github.com/MatthiasGrandl/loungy: This looks really excellent but: "Loungy is currently not in active development. As a new dad, my development resources have dwindled."
- [gauntlet]https://github.com/project-gauntlet/gauntlet: Recommended by Matthias Grandl, creator of Loungy but: "Web-first cross-platform application launcher with React-based plugins". No thank you.
- [kickoff]https://github.com/j0ru/kickoff: Looks great but panics with: `layer shell is not available: NotPresent`
- [elbey]https://github.com/kgilmer/elbey: Incomplete, but worth keeping an eye on.
- [raffi]https://github.com/chmouel/raffi: Fully config based. Does not auto-discover apps.
- [jolly]https://github.com/apgoetz/jolly: Looks good but panics with: `Failed to initialize any backend! Wayland status: NoWaylandLib`
- [dlauncher]https://github.com/diced/dlauncher: Based on Ulauncher which sounds good. Just need to get it to compile...
- [sklauncher]https://github.com/miyakogi/sklauncher: Not bad, but I don't love the interface, even though it reminds me of [fzf]https://github.com/junegunn/fzf/[skim]https://github.com/skim-rs/skim/[picleo]https://github.com/symplasma/picleo which is kinda awesome.
- [fuzzle]https://github.com/Psykopear/fuzzle: Looks good but is not on [crates.io]https://crates.io/search?q=fuzzle.

More Rust based launchers can be found here for those that want to keep digging: [‘fuzzy launcher’ search on Lib.rs](https://lib.rs/search?q=fuzzy+launcher).

## Features

- [x] Written entirely in Rust
- [x] Show all `*.desktop` files and allow launching them
- [x] Show all executables in path and allow launching them
- [x] Do not select the first item, now that we have highlight instead.
- [x] Launch highlighted item, even if the search box is empty

### Performance

- [x] Fast launch, but could always be faster...
- [x] Index/load items in a separate thread to not block window display
- [ ] Proper rendering and lazy loading only for the items that fit on screen
- [ ] Daemon mode with visibility switch command like Ulauncher for instantaneous invocation (allow re-showing of the window without re-reading config and re-loading items)
  - [ ] Add --daemon flag that will keep the program running in the background
  - [ ] Make LaunchItem loading/refresh a thing that happens only once at launch
  - [ ] Allow on demand refresh of LaunchItems
  - [ ] Use fsevents or similar to auto-refresh LaunchItems

### UI and UX

- [ ] Deduplicate listed items (and allow debugging by showing the paths of where duplicates are from)
- [ ] [Frecency](https://firefox-source-docs.mozilla.org/browser/urlbar/ranking.html#frecency-implementation) based sorting
- [ ] Make page up/down work properly
- [ ] Interactive help screen
- [ ] Integrate picleo for better fuzzy finding

### Functionality

- [ ] System commands: lock screen, sleep, hibernate, reboot, shutdown
- [ ] [Run or raise](https://github.com/Soft/run-or-raise) functionality for launching applications or focusing their windows
- [ ] Integrate search templates from [search-cli]https://crates.io/crates/search-cli
- [ ] Add actions for items (besides launch), invoked with Tab
  - [ ] Reveal item in filesystem
  - [ ] Show info for item
  - [ ] Quick preview item
  - [ ] Copy/Move item
- [ ] Add additional item types
  - [ ] Running apps
  - [ ] Open application windows
  - [ ] Open browser tabs
- [ ] Path navigation with autocomplete

### Configuration

- [ ] Custom commands via a config file
- [ ] Add a config file to:
  - [ ] Override descriptions
  - [ ] Add alternate names/aliases for programs
  - [ ] Hide programs, possibly duplicates
  - [ ] Add programs that are at odd paths or are not otherwise discovered
  - [ ] Set a default size/position or remember the size once moved
- [ ] Browser search templates according to config
- [ ] Synonyms/keywords from config

### Troubleshooting and Known Issues

- [ ] Better detection of screen size: This is proving much more difficult than it should be to do reliably

### Future Features

- [ ] Integrate Symplasma
  - [ ] Quick jump to common paths
  - [ ] Allow storing of items, either from the clipboard or from the current selection
  - [ ] Allow collecting items from the current clipboard
  - [ ] Use common Symplasma config lib
- [ ] Allow launching of shell aliases and functions?
- [ ] Plugin system?