Look - Keyboard-First Launcher#
Look is a keyboard-first, local-first launcher for macOS, Windows, and Linux. It provides instant access to apps, files, folders, and system settings without leaving the keyboard.
Why Look?#
If you're tired of slow launchers or expensive tools like Raycast, Look offers a free, lightweight alternative that stays out of your way. It's designed for developers and power users who want quick access to everything on their machine without leaving the keyboard.
Core Concepts#
- Local-first indexing: All search indexing happens locally on your machine
- SwiftUI (macOS) + Tauri v2 (Windows/Linux): Native UI shells powered by efficient Rust search
- Bounded query-time scoring: Typical search under 1 ms on a 2000-item index
- Usage-aware ranking: Results improve over time based on your usage patterns
- Customizable themes: Multiple built-in themes with full customization options
- Minimal permissions: No Accessibility, Full Disk Access, or Screen Recording required
Key Features#
- Fast Local Search: Instantly search apps, files, folders, and system settings
- Query Prefixes: Use prefixes like
a",f",d",r"to narrow search scope - Path-like queries: Type
git/project/readmefor path-biased matches - Inline calculator: Type
2^10,4!,200*15%,sqrt(2)— no mode switch needed - Port-based kill: Command mode
kill :3000force-quits whatever owns the port - Clipboard History: Access recent clipboard items with
c" - Translation: Quick translation with
t"and dictionary lookup withtw" - Command Mode: Built-in calculator, pomodoro timer, force quit, shell commands, and system info
- Customizable Themes: Multiple built-in themes including Catppuccin, Tokyo Night, and more
- Privacy-First: No account, no telemetry, network only on explicit actions
Installation#
macOS#
Requirements: macOS 15.0+
brew tap kunkka19xx/tap
brew install --cask lookThen bind Cmd+Space to Look — disable Spotlight's shortcut in System Settings → Keyboard → Keyboard Shortcuts... → Spotlight.

Update:
brew upgrade --cask kunkka19xx/tap/lookOther macOS install options (curl, pin version)
curl -fsSL https://raw.githubusercontent.com/kunkka19xx/look/main/scripts/install-look.sh | bashPin a version or fork:
curl -fsSL https://raw.githubusercontent.com/kunkka19xx/look/main/scripts/install-look.sh | bash -s -- --version <version> --repo kunkka19xx/lookLinux#
Arch Linux (AUR):
yay -S look-bin
# or
paru -S look-binOr without an AUR helper:
git clone https://aur.archlinux.org/look-bin.git
cd look-bin
makepkg -siUbuntu/Debian:
curl -fsSL https://raw.githubusercontent.com/kunkka19xx/look/main/scripts/linux/install-look.sh | bashOr download the .deb manually from Releases and run sudo dpkg -i Look_*.deb.
Any distro (AppImage):
chmod +x Look_*.AppImage
./Look_*.AppImageNixOS (flake):
nix run github:kunkka19xx/look?dir=apps/linows
# or install to profile
nix profile install github:kunkka19xx/look?dir=apps/linowsPre-built binaries are served via Cachix. For declarative NixOS install, see the README.
Windows#
iex "& { $(irm https://raw.githubusercontent.com/kunkka19xx/look/main/scripts/windows/install-look.ps1) }"SmartScreen may warn on first run — click "More info → Run anyway". The launcher's global hotkey (Alt+Space) is configurable in Settings → Appearance.
First Launch#
After installing, launch with lookapp from a terminal, or search "Look" in your app launcher / Start menu. On first run, Look indexes your apps, files, and folders in the background — results appear as indexing completes.
| Platform | Toggle hotkey | Notes |
|---|---|---|
| macOS | Cmd+Space | Disable Spotlight's shortcut first |
| Windows / Linux | Alt+Space | Autostarts on login (on full DEs like GNOME/KDE) |
Window manager users (i3, sway, Hyprland): Add Look to your WM config manually — see the README for examples.
GNOME desktops: Log out and log back in after the first install so the GNOME Shell extension (for window focusing on Wayland) can load.
Uninstall#
# macOS
brew uninstall --cask look
# Arch
yay -R look-bin
# Ubuntu/Debian
sudo dpkg -r lookapp
# Windows
iex "& { $(irm https://raw.githubusercontent.com/kunkka19xx/look/main/scripts/windows/install-look.ps1) } -Uninstall"Remove local state (optional):
# macOS
rm -f ~/.look.config && rm -rf ~/Library/Application\ Support/look
# Linux
rm -f ~/.look.config && rm -rf ~/.local/share/lookPermissions#
Look is designed to need as few permissions as possible:
- No Accessibility permission required (macOS)
- No Full Disk Access required — Look indexes standard user directories. Add extras via
file_scan_extra_rootsin~/.look.config. - No Screen Recording required (macOS)
- Network access is used only for explicit actions:
t"translation,tw"dictionary lookup,Cmd/Ctrl+Enterweb search
Getting Started#
Basic Usage#
- Open Look: Press
Cmd+Space(macOS) orAlt+Space(Windows/Linux) - Type to Search: Start typing to search apps, files, folders, or settings
- Navigate: Use
Tab/Shift+Tabor arrow keys to move between results - Open: Press
Enterto open the selected item
Query Prefixes#
Use these prefixes to narrow your search scope:
| Prefix | Mode | Example |
|---|---|---|
a" | Apps only | a"term |
f" | Files only | f"term |
d" | Folders only | d"term |
r" | Regex search (case-insensitive) | r"pattern |
c" | Clipboard history | c"term |
t" | Quick translation panel | t"hello |
tw" | Dictionary lookup panel | tw"word |
Apps only search example#

Directories only search example#

Path-like queries (e.g., git/project/readme) are also supported and bias toward path matches.
Quick calc and kill#
No need to enter command mode for simple math — Look evaluates inline:
2^10→10244!→24200*15%→30(percent shorthand)sqrt(2)→1.41422*pi→6.283210%3→1(modulo between operands)
Kill a process by port — open command mode with Cmd+/ (macOS) or Ctrl+/ (Windows/Linux), then:
kill :3000— kills whatever owns port 3000 (with confirmation)kill port 3000— same thing, verbose form
Query Aliases#
Define aliases in ~/.look.config to map search terms to related apps:
alias_note=Notion|Obsidian|Notes|Apple Notes|Bear|Logseq
alias_code=Visual Studio Code|VSCode|Cursor|Windsurf|IntelliJ IDEA|PyCharm|WebStorm|Neovim|Xcode|Zed- Aliases apply to app + System Settings search only
- Aliases boost matching apps but don't create synthetic results
- Keep lists short (5-10 targets) for best results
Typical Workflow#
- Press
Cmd+Space(macOS) orAlt+Space(Windows/Linux) to open launcher - Type to search apps/files/folders/settings
- Use
Tab/Shift+Tabor arrow keys to navigate - Press
Enterto open
Keyboard Shortcuts#
Global Shortcuts#
| Action | macOS | Windows / Linux |
|---|---|---|
| Toggle launcher | Cmd+Space | Alt+Space |
| Open/close settings | Cmd+Shift+, | Ctrl+Shift+, |
| Reload configuration | Cmd+Shift+; | Ctrl+Shift+; |
Navigation#
| Shortcut | Action |
|---|---|
Tab | Next result |
Shift+Tab | Previous result |
↑ / ↓ | Move selection up/down |
Enter | Open selected result |
Escape | Go back / close (context dependent) |
Actions#
On Windows/Linux, replace Cmd with Ctrl for all shortcuts below.
| Shortcut | Action |
|---|---|
Cmd+H | Toggle help/shortcuts screen |
Cmd+Enter | Web search current query (Google) |
Cmd+F | Reveal selected item in file manager |
Cmd+C | Copy selected file/folder to pasteboard/clipboard |
Cmd+P | Toggle pick on selected file/folder (multi-select copy) |
Cmd+Shift+P | Clear all picked items |
Cmd+/ | Enter command mode (resumes the last command panel you visited; defaults to /calc) |
:cmd (e.g. :calc 2+2, :pomo, :kill chrome, :sys) | Jump to a command directly from the home screen |
Cmd+Q | Hide launcher (macOS) |
Cmd+Option+Q / Alt+Shift+Q | Quit Look |
Command Mode#
Cmd+1..Cmd+5 switch command panels only while command mode is open. On the home screen these keys go to the running-apps switcher (see below).
| Shortcut | Action |
|---|---|
Cmd+1 | Switch to calc |
Cmd+2 | Switch to pomo |
Cmd+3 | Switch to kill |
Cmd+4 | Switch to shell |
Cmd+5 | Switch to sys |
Y / N | Confirm / cancel in kill prompts |
Space / R / P (in pomo) | Start/pause session • Reset • Toggle music play/pause |
Running Apps Switcher#
Available on macOS, Linux, and Windows. The modifier is platform-native: Cmd on macOS, Alt on Linux/Windows.
When enabled, running-app icons appear in the right half of the search bar. On the home screen, Cmd/Alt+the digit shown on each icon's corner badge activates that running app.
| Shortcut | Action |
|---|---|
Cmd+1..Cmd+9 (macOS) / Alt+1..Alt+9 (Linux, Windows) | Activate the running-app whose badge shows that digit (badges are assigned ergonomically — not always sequential; see [Features](#features) for the assignment table) |
| Click on an icon | Same as the keyboard shortcut |
Toggle on/off via Settings → Appearance → Running Apps. Turning it off hides the row and disables the digit-switching shortcut; the search bar then spans the full width.
Settings Panel Zoom#
| Shortcut | Action |
|---|---|
Cmd+- | Zoom out (temporary) |
Cmd+= | Zoom in (temporary) |
Cmd+0 | Reset zoom |
Query Prefixes#
| Prefix | Mode |
|---|---|
a" | Apps only |
f" | Files only |
d" | Folders only |
r" | Regex search |
c" | Clipboard history |
t" | Translation |
tw" | Dictionary lookup |
Features#
Copy File or Folder (`Cmd/Ctrl+C`)#
With a file or folder selected, press Cmd+C (macOS) or Ctrl+C (Windows/Linux) to copy it to the clipboard.
- Paste into a file manager, Mail, Slack, or any app that accepts files → pastes the actual file/folder
- Paste into a text editor or terminal → pastes the path as a string
- Works on results of kind
fileandfolder; apps useEnterorCmd/Ctrl+Finstead
Multi-Pick Files/Folders (`Cmd/Ctrl+P`)#
Build up a set of files/folders and paste them anywhere in one go.
Cmd+Pon a focused file or folder toggles it in or out of the picked set; every toggle rewrites the system pasteboard with all picked items.- The right panel switches to a Picked (N) list while the set is non-empty: each row has an
Xto remove a single item, plus a Clear all button. Cmd+Shift+Pclears the entire picked set and the pasteboard.- Paste behavior matches
Cmd+C— into Finder/Mail/etc. you get the actual files; into a text field you get the paths.
Clipboard History (`c"`)#
Access recently copied text items:
- Type
c"to enter clipboard mode - Browse recent text clips
- Press
Enterto copy an item back to clipboard
Note: Clipboard history is in-memory only and cleared on restart. File/folder copies (both Cmd+C and Cmd+P) are excluded from the history.
Clipboard histories search example#

Translation (`t"` / `tw"`)#
Quick translation without leaving the launcher:
t"hello→ Translate "hello" to Vietnamese/English/Japanesetw"word→ Dictionary lookup with definitions and examples
Translate sentences, words via web#

Search words by MacOS's built-in LookUp#

Translation requires network connectivity.
Command Mode (`Cmd+/` or `:cmd` from home)#
Two ways in:
Cmd+/enters command mode and resumes the last command panel you visited (defaults tocalcon first run); useTaborCmd+1–5to switch.- From the home screen, type
:followed by a known command id::calc 2+2— the space after the command id is the live trigger; you switch with2+2already typed and can keep typing without pressing Enter.:calcthenEnter— switch with empty input.- The
:shortcut only triggers when the word right after it is an exact known command id (calc,pomo,kill,shell,sys); anything else (:foo,:Users/me/...) stays in normal search. :kill chromeand:shell ...switch into command mode but never auto-execute — the existing kill confirmation and shell input gate still apply.
Built-in quick commands:
| Command | Description | Jump key |
|---|---|---|
calc | Calculator | Cmd+1 |
pomo | Pomodoro focus timer | Cmd+2 |
kill | Force quit app or port owner | Cmd+3 |
shell | Execute shell commands | Cmd+4 |
sys | System information | Cmd+5 |

calc#
Supports ^, !, % (shorthand and modulo), constants pi/e, functions sqrt/abs/round/floor/ceil:
2^10→10244!→24200*15%→3010%3→12*pi→6.2832
Most of these also work from the main input without entering command mode.
shell#
Run a shell command from the launcher. Input containing sudo shows an orange warning cue.
kill#
Force-kill a running app or process with explicit confirmation. Supports port-based targeting:
kill :3000— kills whatever owns port 3000kill port 3000— same, verbose form- Use
Up/Downto navigate process results,Y/Nto confirm or cancel
pomo#
A pomodoro focus timer that lives inside command mode.
- Editable session list — plan a sequence of focus + break blocks, each with its own duration and name (e.g. Deep Work 30m → Short Break 5m → Review 30m → Long Break 15m). The timer auto-advances through the list and loops the music folder while a session runs.
- Three timer styles (switchable via the gear icon): Modern Ring, Vintage Dial, Minimal Text.
- Background music: pick any folder of audio files (
mp3,m4a,wav,aac,flac,ogg,aiff,alac). Tracks are streamed one at a time (no full-folder load), shuffled per launch, and looped at the end of the list. - Standby fade — after 5s of no input the panel collapses to clock-only (the sidebar hides too); any key/mouse input restores it.
- "Ending soon" alert — at 10s remaining, a chime + a popover from the menu-bar timer (and a system notification, if granted) fires once per session.
- Menu-bar mini-timer — visible whenever a session is active, even when the launcher window is hidden. Click it to jump straight back into
/pomo. - Keyboard:
Spacestart/pause •Rreset •Ptoggle music play/pause. - Persistence: the session list, selected timer style, and music folder path are saved to
~/.look.configand survive restarts.
sys#
Displays system information at a glance.
Running Apps Switcher#
Available on macOS, Linux, and Windows. Modifier is Cmd on macOS and Alt on Linux/Windows.
When enabled, running-app icons fill the right half of the search bar (the search field takes the left half), right-aligned and growing leftward as more apps open. Each icon has a corner number badge; press Cmd/Alt+the badge digit on the home screen to activate that app. The launcher window stays the same size whether the row is shown or hidden.
- Stable order — icons sit in alphabetical order and don't shuffle when you switch apps. The badge digit for "Discord" stays the same until you launch or quit something.
- Ergonomic badge keys — easy-to-reach keys are assigned first. We pull from
1, 2, 3, 9, 8, 4, 7, 6, 5in that order and sort the result ascending for display, so painful middle keys (5/6/7) only appear when you have many running apps:
| Running apps | Badges shown |
|---|---|
| 4 | 1, 2, 3, 9 |
| 5 | 1, 2, 3, 8, 9 (no 4/5/6/7) |
| 6 | 1, 2, 3, 4, 8, 9 |
| 7 | 1, 2, 3, 4, 7, 8, 9 |
| 8 | 1, 2, 3, 4, 6, 7, 8, 9 |
| 9 | 1, 2, 3, 4, 5, 6, 7, 8, 9 |
- Windowless apps (macOS only — Finder with no Finder windows, App Store, etc.) get a fresh window via a Dock-style "reopen" instead of an empty flash. Hidden apps (
Cmd+H) are unhidden first. On Linux/Windows the switcher only lists apps that currently own a visible window, so this case doesn't arise. - Linux compositor support — focus dispatches via X11
_NET_ACTIVE_WINDOW(GNOME/KDE/i3),i3-msg(i3),swaymsg+ wlr-foreign-toplevel (sway/wlroots),hyprctl(Hyprland), and a bundled GNOME Shell extension on GNOME Wayland. - Show/hide via Settings → Appearance → Running Apps (on/off toggle).
- In command mode, the digit shortcuts keep their existing command-catalog semantics (calc / pomo / kill / shell / sys); the running-apps switcher only fires on the home screen. Suspended modes (translate, command) also ignore the digit keys so the hidden strip can't fire from a stale cache.
Persisted as running_apps_placement in ~/.look.config — see Configuration.
Background Image#
Add a custom background image:
- Place image in
~/look_bg.png - Adjust opacity and blur in settings
- Choose layout mode: fill, fit, tile, or stretch
Lazy Indexing#
When enabled (default), the app only reindexes when:
- File/app changes are detected
- Manual reload is triggered (
Cmd+Shift+;) - App restarts
Disable for immediate indexing on every launch (slower but fresher results).
Settings Panel#
Open with Cmd+Shift+,. Contains three tabs:
Appearance#
- Theme: 7 built-in presets (Catppuccin, Tokyo Night, Rose Pine, Gruvbox, Dracula, Kanagawa, Custom)
- Tint Color: accent color (RGB + opacity)
- Blur: blur material and opacity
- Font: name and size
- Font Color: text color (RGB + opacity)
- Border: thickness and color
Advanced#
- Background image (path, layout mode, opacity, blur)
- Indexing settings (File Scan Depth: 1-12, File Scan Limit: 500-50000)
- Backend log level
- Launch at login
- Config reset:
Create Fresh Configbutton with confirmation popup
Shortcuts#
- In-app keyboard shortcut documentation
- Toggle help screen with
Cmd+H
Configuration#
Look uses a configuration file at ~/.look.config. Changes take effect immediately after saving, or you can press Cmd+Shift+; to reload.
Configuration File Location#
- Default:
~/.look.config - Custom: Set
LOOK_CONFIG_PATHenvironment variable - Reload:
Cmd+Shift+; - Reset: Settings → Advanced → "Create Fresh Config"
Format#
- One
key=valueper line #starts a comment- Unknown keys ignored
- Invalid values fall back to defaults
Backend Settings#
App Scanning#
app_scan_roots=/Applications,/System/Applications,/System/Applications/Utilities,/System/Library/CoreServices/Applications
app_scan_depth=3
app_exclude_paths=
app_exclude_names=File Scanning#
file_scan_roots=Desktop,Documents,Downloads
file_scan_extra_roots=
file_scan_depth=4
file_scan_limit=4000
file_exclude_paths=Use file_scan_extra_roots to add user-specific directories on top of the defaults (overlap and risky-root validation is enforced).
Other Backend Options#
lazy_indexing_enabled=true
skip_dir_names=node_modules,target,build,dist,library,applications
backend_log_level=info
launch_at_login=falseBackend Keys Reference#
| Key | Description | Default |
|---|---|---|
app_scan_roots | Directories to scan for apps | (see above) |
app_scan_depth | Max depth for app scanning | 3 |
file_scan_roots | Directories to scan for files | Desktop,Documents,Downloads |
file_scan_extra_roots | Extra user-specific directories to index | (empty) |
file_scan_depth | Max depth for file scanning (1-12) | 4 |
file_scan_limit | Max files to index (500-50000) | 4000 |
lazy_indexing_enabled | Enable lazy indexing | true |
skip_dir_names | Directories to skip | (see above) |
backend_log_level | Log verbosity | info |
launch_at_login | Start at login | false |
UI Theme Settings#
Theme Preset#
ui_theme=catppuccin
Available: catppuccin, tokyoNight, rosePine, gruvbox, dracula, kanagawa, custom
Appearance#
ui_tint_red=0.08
ui_tint_green=0.10
ui_tint_blue=0.12
ui_tint_opacity=0.55
ui_blur_material=hudWindow
ui_blur_opacity=0.95
ui_font_name=SF Pro Text
ui_font_size=14
ui_font_red=0.96
ui_font_green=0.96
ui_font_blue=0.98
ui_font_opacity=0.96
ui_border_thickness=1.0
ui_border_red=1.0
ui_border_green=1.0
ui_border_blue=1.0
ui_border_opacity=0.12Background Image#
ui_background_image=~/look_bg.png
ui_background_image_mode=fill
ui_background_image_opacity=0.5
ui_background_image_blur=10| Key | Options |
|---|---|
ui_background_image_mode | fill, fit, tile, stretch |
Settings Panel#
settings_blur_multiplier=0.8Running Apps Switcher (macOS only)#
running_apps_placement=right| Key | Options | Default |
|---|---|---|
running_apps_placement | none (off), right (on) | right |
When none, the running-apps row in the search bar is hidden and the Cmd+1..Cmd+9 switching shortcut is disabled; any other value shows it. Legacy top/bottom values from older releases still load as "on" and normalize to right on next save. The key is auto-appended to existing ~/.look.config files on first Save Config, so upgrading from an older Look install doesn't reset other settings. See Features → Running Apps Switcher for the badge-key behavior.
Linux and Windows configs currently ignore this key — the strip lives only in the macOS shell at this time.
Search Aliases#
Define aliases to map search terms to related apps:
alias_note=Notion|Obsidian|Notes|Apple Notes|Bear|Logseq
alias_code=Visual Studio Code|VSCode|Cursor|Windsurf|IntelliJ IDEA|PyCharm|WebStorm|Neovim|Xcode|Zed
alias_term=Terminal|iTerm|iTerm2|Ghostty|WezTerm|Alacritty|Kitty|Warp
alias_chat=Slack|Discord|Telegram|Messages
alias_music=Spotify|Apple Music|Music
alias_brow=Safari|Arc|Google Chrome|Chrome|Firefox|BraveAlias behavior:
- Aliases apply to app + System Settings search only
- Aliases boost matching apps but don't create synthetic results
- If an aliased app is not installed, no error is shown
- Keep lists short (5-10 targets) for best results
Troubleshooting#
Hotkey Doesn't Open Launcher#
- Check Spotlight shortcut conflict:
System Settings→Keyboard→Keyboard Shortcuts...→Spotlight- Disable or rebind "Show Spotlight search"
- Relaunch Look and try again
- Check if app is running:
ps aux | grep LookResults Seem Stale or Incomplete#
- Reload configuration:
Cmd+Shift+; - Check scan settings in
~/.look.config:file_scan_rootsfile_scan_depth(range: 1-12)file_scan_limit(range: 500-50000)
- Verify exclude rules aren't too broad
- Keep
lazy_indexing_enabled=trueand useCmd+Shift+;to force refresh
Translation Returns Warnings/No Result#
- Confirm network connectivity
- Check that translation service is accessible
App Doesn't Appear in Search#
- Check
app_scan_rootsincludes the app's location - Verify
app_exclude_namesdoesn't exclude it - Reload config:
Cmd+Shift+;
Launcher Opens Behind Another Window#
This is usually a focus-handoff timing issue. Hide the launcher (Escape) and reopen. If it reproduces consistently, please file an issue with your macOS version.
High CPU or Slow First Launch#
The initial index scan is a one-time cost; subsequent launches use the cached SQLite index. If you have very large user directories, lower file_scan_depth and file_scan_limit in ~/.look.config.
A Config Change Was Ignored#
- Look reads
~/.look.configat launch; after editing manually, reload withCmd+Shift+;or restart Look. - Confirm you edited the active config path.
LOOK_CONFIG_PATHoverrides~/.look.configwhen set.
First Launch Issues#
Current releases are signed and notarized. If you still encounter Gatekeeper issues:
- Confirm you installed a recent release
- Check System Settings → Privacy & Security for any blocks
- Legacy workaround (older builds only):
- Right-click app →
Open→ confirm - Or use
Privacy & Security→Open Anyway
- Right-click app →
Need to Inspect Local DB#
You can query the local SQLite database to inspect indexed candidates:
sqlite3 "$HOME/Library/Application Support/look/look.db" "SELECT id,title,use_count FROM candidates ORDER BY use_count DESC LIMIT 20;"Reset Configuration#
To reset to default configuration:
- Open Settings (
Cmd+Shift+,) - Go to Advanced → "Create Fresh Config"
- Confirm the action (press
Y)
This replaces your current ~/.look.config with the latest default template.
Development#
Building from Source#
Requirements#
- macOS: macOS 15.0+, Xcode
- Windows/Linux: Rust stable toolchain, system deps (see BUILDING.md)
- Rust stable toolchain (for core engine)
Repository Structure#
look/
├── apps/macos/LauncherApp/ # SwiftUI shell (macOS)
├── apps/linows/ # Tauri v2 app (Windows + Linux)
│ └── src-tauri/ # Rust backend
├── core/ # Rust engine (shared)
│ ├── engine/ # Search & indexing
│ ├── matching/ # Fuzzy matching
│ ├── ranking/ # Result ranking
│ └── storage/ # SQLite storage
├── bridge/ffi/ # Swift-Rust FFI (macOS)
└── docs/ # DocumentationBuild Commands#
# Check Rust core workspace
cd core
cargo check --workspace
# Check FFI bridge (macOS)
cd bridge/ffi
cargo check
# Run macOS dev app
make app-run
# Run Tauri dev (Windows/Linux)
cd apps/linows
cargo tauri devDev App Behavior#
make app-run:
- Builds local app bundle with Xcode (Debug)
- Stops any running Look process (including a Homebrew-installed instance)
- Launches with
LOOK_CONFIG_PATH=$HOME/.look.dev.config - Shows red
TEST APPbadge for visual distinction
Side-by-Side Dev Build#
make app-run-dev installs /Applications/Look Dev.app with a separate bundle id (noah-code.Look.Dev), so the Homebrew-installed Look.app stays untouched:
make app-run-devOverride the dev config path when needed:
make app-run DEV_CONFIG_PATH="$HOME/.look.qa.config"
make app-run-dev DEV_CONFIG_PATH="$HOME/.look.qa.config"Running Tests#
# Rust tests
cd core
cargo test --workspace
# FFI bridge tests
cd bridge/ffi
cargo testBenchmarks#
Run the query-engine benchmark:
cargo run --manifest-path core/engine/Cargo.toml --example perf_benchSnapshots land under docs/bench-notes/ — add a new snapshot when scoring, matching, or indexing changes.
Architecture Overview#
Look uses a shared Rust core with platform-specific UI shells:
- macOS: SwiftUI shell communicating with Rust engine via FFI
- Windows + Linux: Tauri v2 shell (vanilla HTML/CSS/JS frontend) calling Rust engine directly as crate deps
- Rust Engine: Fast search and indexing, shared across all platforms
- SQLite Storage: Local database for candidates and usage data
Core Components#
- Search Engine: Handles fuzzy matching and ranking
- Index Manager: Manages file/app indexing
- Storage Layer: SQLite for persistence
- FFI Bridge: Swift-Rust communication (macOS)
- Tauri Commands: Direct Rust calls (Windows/Linux)
Contributing#
Contribution flow:
- Branch from
dev(notmain) - Open PRs into
dev— PRs tomainare reserved for maintainer-coordinated hotfix/release work - Run local checks before opening a PR:
bash cargo test --workspace --manifest-path core/Cargo.toml cargo test --manifest-path bridge/ffi/Cargo.toml - Update docs when user-visible behavior changes
See CONTRIBUTING.md and DEVELOPMENT.md for details.