Posted by aurellius 9/9/2025
I’ve always been a fan of application launchers, and I was impressed by the approach the Raycast team took — especially their extension system. About six months ago I started building something similar for Linux, aiming to integrate deeply at the OS level and give extensions a lot of power.
Vicinae is written in C++ with Qt Widgets. I chose Widgets over QML for more imperative control of the UI, especially around extension handling. So far that’s worked well — modern C++ is great.
To support my goals I built a number of custom widgets, including a fully virtualized list that can efficiently render tens of thousands of items. That gave me a lot of respect for Qt — it’s a powerful framework that mostly stayed out of my way.
A key feature is support for Raycast extensions (React + TypeScript), most of which can be installed and used directly inside the launcher (though not all features are implemented yet). There’s also a native API package (@vicinae/api) for writing Vicinae-specific extensions with additional capabilities. This required writing a custom React reconciler — surprisingly straightforward, though still unpolished.
Like Raycast, Vicinae ships with powerful built-in modules, but the goal isn’t to make a clone. I want it to grow into its own project that fits the FOSS model better, while staying compatible with the Raycast ecosystem. I also plan to bring it to other OSes eventually.
I’d love feedback on the technical approach, and suggestions for what would make this useful to you. Contributions are very welcome — I’ve already been pleasantly surprised by how quickly people started helping.
Docs: https://docs.vicinae.com Repo: https://github.com/vicinaehq/vicinae
However, the sole reason I'm keeping an eye out for raycast-compatible launchers is the ability to integrate the raindrop.io extension - which seems to be broken when used through Vicinae.
Maybe someone else running raindrop got it to work; "TypeError: Cannot read properties of undefined (reading 'subscribers')".
Mostly comparison of consumed RAM with identical set of extensions might help me choose without trying each of this projects.
Or after a while without interaction bloated RAM get swapped out and launcher invocation need to fetch swapped out info.
For comparison here is how krunner looks on my current machine. After some time without interactions:
$ systemctl --user status plasma-krunner.service|head
● plasma-krunner.service - KRunner
Loaded: loaded (/usr/lib/systemd/user/plasma-krunner.service; static)
Active: active (running) since Sun 2025-08-10 20:31:40 WEST; 1 month 12 days ago
Main PID: 57749 (krunner)
Tasks: 37 (limit: 17782)
Memory: 64.6M (peak: 1.4G swap: 338.2M swap peak: 679.8M zswap: 12.4M)
CPU: 2h 58.702s
CGroup: /user.slice/user-1000.slice/user@1000.service/background.slice/plasma-krunner.service
└─57749 /usr/bin/krunner
It seems to me I feel how it was less on the first invocation.Great to see it already has a Nix flake too! I was able to get it setup basically instantly.
I'm used to drun/rofi and enjoy their simplicity, but have also secretly envied the out-of-the-box experience of more fully featured launchers on macOS. I remember using Spotlight and Alfred many years ago, and being impressed by the experience.
I like that you chose to make it compatible with Raycast, and how easy it is to extend, based on a quick look at the docs.
I'll definitely keep an eye on your project, and give it a try. Thanks for sharing!