No description
  • Rust 46.8%
  • TypeScript 46.7%
  • CSS 5%
  • HTML 0.8%
  • Dockerfile 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jolly Good c254c2d632
All checks were successful
build / build (ubuntu-latest) (push) Successful in 2m19s
build / e2e (ubuntu-latest) (push) Successful in 2m48s
build / build (windows-latest) (push) Successful in 6m59s
build / e2e (windows-latest) (push) Successful in 7m7s
custom actions per websearch
2026-09-07 09:57:04 +02:00
.forgejo fix collisions on win 2026-08-25 12:21:49 +02:00
patches add e2e test via playwright + CI integration to build for win + linux 2026-08-21 13:02:03 +02:00
public wip: refactor 2026-08-14 03:27:31 +02:00
src custom actions per websearch 2026-09-07 09:57:04 +02:00
src-tauri #1 improve websearch, ui/ux, styling, etc 2026-09-05 23:34:49 +02:00
tests/e2e remove stupid comments 2026-08-25 12:11:09 +02:00
.gitignore add e2e test via playwright + CI integration to build for win + linux 2026-08-21 13:02:03 +02:00
bun.lock custom actions per websearch 2026-09-07 09:57:04 +02:00
index.html update csp tauri 2026-09-03 22:42:20 +02:00
LICENSE license update mit 2026-06-11 07:29:40 +02:00
linux-builder.Dockerfile relase/build yaml try 2 2026-08-20 00:00:39 +02:00
onboarding.html update csp tauri 2026-09-03 22:42:20 +02:00
package.json custom actions per websearch 2026-09-07 09:57:04 +02:00
playwright.config.ts fix collisions on win 2026-08-25 12:21:49 +02:00
README.md wip: refactor 2026-08-14 03:27:31 +02:00
tsconfig.json add e2e test via playwright + CI integration to build for win + linux 2026-08-21 13:02:03 +02:00
vite.config.ts cleanup and reorg, phase 1 migration of ui-lib components 2026-09-03 21:10:05 +02:00

unimo — desktop launcher (Tauri)

A Spotlight/Raycast-style launcher: a frameless, transparent, always-on-top panel summoned with Cmd/Ctrl+Space near the cursor. Searches installed apps, built-in commands, and the web (via the unimo SDK's account.search), and learns from what you pick.

This is a Tauri 2 port of the Electron desktop.unimo app. The UI is a small Solid app (src/ui/*.tsx) rendering to light DOM so the existing global CSS, popover-based dropdowns, and platform data-attributes keep working; the OS backend is Rust.

Architecture: Rust vs. TypeScript

Accounts, search ranking/merging, the built-in command palette, search history (frecency), and web search are all business logic and run in TypeScript, using the unimo-sdk client SDK for accounts and end-to-end-encrypted storage. Rust is kept to OS interaction and secrets only:

  • Installed-app enumeration, icon extraction, and launching (src-tauri/src/search/apps.rs)
  • The favicon disk cache (favicon.rs)
  • A generic OS-keychain secret store (secrets.rs) — opaque secret_get/secret_set/ secret_delete, used by the frontend to persist device seeds and other secrets
  • Window/tray/global-shortcut/updater management and native app control (quit/reload/devtools)

See src/unimo/ (accounts, backed by the SDK), src/search/ (ranking, history, command palette, web search), and src/ui/ (the Solid UI: SearchPanel, ResultItem, ActionTabs, Onboarding, plus the search-state signal graph) for the TypeScript side.

Web search itself is a plain SDK call: account.search.search(query) / account.search.suggest(query) (added to unimo-sdk — see vendor/README.md), ridden over the same authenticated connection as everything else the account does. There's no separate search-gateway endpoint/token to configure anymore — whatever backend the account is registered on (its backend URL from onboarding) serves search too.

Features

  • Local search merging three providers by score: installed apps (macOS mdfind, Linux .desktop, Windows registry), built-in commands (Settings / Reload / Quit / DevTools), and history (frecency learning) — all ranked/merged in TypeScript (src/search/).
  • Web search via the unimo SDK's account.search (typeahead suggestions + full results, reconnect handled by the SDK's Connection) — src/search/websearch.ts is a thin adapter over it. Degrades gracefully to empty results when offline or logged out.
  • Icons: app icons (macOS .icns → PNG via sips; Linux icon themes) and web favicons (DuckDuckGo service), both lazy-loaded and cached.
  • Window: cursor-anchored panel, global shortcut toggle, hide-on-blur, tray icon, single-instance, macOS dock-hidden + visible on all Spaces.
  • Accounts are registered/logged in via the unimo SDK (post-quantum end-to-end encryption); only the resulting device/recovery seeds are persisted, opaquely, in the OS keychain via Rust's generic secret store.
  • Search history at rest is stored in the account's own end-to-end-encrypted KV collection (via the SDK) — no bespoke crypto in this app anymore.

Setup

bun install

No .env/gateway config needed — web search rides the logged-in account's own connection to whatever unimo backend it registered on. Without a logged-in account, local (apps/commands/history) search still works; web search returns nothing.

Commands

  • bun run tauri devrun dev: builds Rust, opens the window, runs Vite with HMR
  • bun run tauri buildbuild for production: installers in src-tauri/target/release/bundle/
  • bun run clean — remove build artifacts (dist/ and the Rust target/)
  • bun run rebuildclean rebuild: clean, then a production build
  • bun run build — frontend only: tsc + vite builddist/
  • bunx tsc — frontend typecheck; cargo check / cargo clippy (in src-tauri/) — backend

Notes

  • Cmd+Space collides with Spotlight on macOS; if the OS owns it, registration is logged and skipped — use the tray's Show/Hide instead, or change the modifier in src-tauri/src/lib.rs (register_shortcut).
  • Windows app-icon extraction is not implemented (falls back to a default glyph).
  • On unsigned dev rebuilds, macOS may prompt for keychain access (the ad-hoc signature changes between builds); signed release builds don't.