# 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?