Skip to content

Desktop App (Tauri)

Mac + Windows · Scholar and Wizard tiers · Tauri v2

The loci desktop app is the memory hub: the primary search interface, room management UI, and config layer for users who want a first-class native experience beyond the browser extension.

The browser extension collects. The desktop app organises, navigates, and exposes.


Two builds, one codebase

The app ships in two tier configurations, controlled by a build flag (LOCI_TIER):

ScholarWizard
ThemeGreen / creamDark stone / amber
Onboarding3-screen simple5-screen palace setup
Rooms UIHiddenPalace floor plan nav
MCP serverNoYes (Rust, port 3721)
LLM providerNoYes (local or API)
Config UISimpleFull
Window chromeStandardCustom dark

Download

PlatformTierFile
macOS (Universal)Scholarloci-scholar-mac.dmg
macOS (Universal)Wizardloci-wizard-mac.dmg
Windows x64Scholarloci-scholar-windows.exe
Windows x64Wizardloci-wizard-windows.exe

loci.garden/download


What the app does that the extension can't

  • Persistent, windowed search UI: full conversation browser, not just a floating overlay
  • Room management: create, name, configure rooms; assign conversations to rooms
  • Locus creation: crystallise insights from conversations into .locus files
  • MCP server: expose rooms as MCP tools to Claude Code, Cursor, Zed (Wizard tier)
  • LLM integration: connect a local Ollama instance or API key for summarisation (Wizard tier)
  • System tray: quick-access search from the menu bar without opening the full app
  • File system access: direct read/write to ~/.loci/ via Rust backend

Onboarding

Scholar (3 screens)

1: Welcome Scholar crystal + headline: "Your AI memory, finally searchable." Single CTA: "Let's set it up"

2: Connect your tools Checklist: Claude.ai / ChatGPT. Button: "Install Chrome extension" (opens CWS). Status: "Extension detected ✓" or "Waiting for extension…" (polls via native messaging).

3: Your first search Live search bar. If extension is connected: searches already-indexed conversations. If not: demo mode with example results. CTA: "Open loci"

Wizard (5 screens)

1: The Palace Awakens Palace floor plan SVG, amber-lit. "Your palace is ready."

2: Choose your rooms Checkboxes for each room. Deselected rooms exist but are hidden from nav.

3: Configure your LLM Provider: Local (Ollama) / Claude API / OpenAI API / Skip. API keys stored in OS keychain: never in config.json.

4: MCP setup Toggle: "Expose rooms as MCP tools." If on: port config + copyable IDE config snippet. "Test connection" button.

5: Enter the palace Floor plan now lit with selected rooms. CTA: "Enter the palace"


File structure bootstrapped on first run

~/.loci/ is created by loci_init() (Rust command) on first launch. Idempotent: safe to call again.

→ See Architecture: file structure


Building from source

Prerequisites: Rust (stable), Node.js ≥ 18, Tauri CLI v2

bash
git clone https://github.com/loci-garden/loci
cd tauri-app
npm install

Development:

bash
npm run tauri dev

Production build:

bash
# Scholar, Mac universal
LOCI_TIER=scholar npm run tauri build -- --target universal-apple-darwin

# Wizard, Windows
LOCI_TIER=wizard npm run tauri build -- --target x86_64-pc-windows-msvc

Or use the build script:

bash
./build.sh scholar mac
./build.sh wizard all

Rust backend commands

CommandDescriptionTier
loci_init()Bootstrap ~/.loci/ file structureAll
get_config()Read config.jsonAll
set_config(patch)Write config.jsonAll
list_rooms()List configured roomsAll
create_room(name)Create new room directory + .room.jsonAll
start_mcp_server()Start local MCP server on port 3721Wizard
register_native_host()Register Chrome native messaging hostAll
build_tray()System tray setupAll

System tray

Tray icon: loci crystal (22px, monochrome on dark menu bar).

Search…                     ← opens ⌘K overlay or focuses search
─────────────────
Open loci / Open Palace     ← focuses main window
Settings
─────────────────
Quit

Extension ↔ App communication

The extension sends indexed conversations to the desktop app using Chrome native messaging.

Native host registration: The Tauri app registers a native messaging host (garden.loci.app) on first launch via register_native_host(). This writes the required JSON manifest to the OS-specific path.

Protocol: Simple JSON messages over the native messaging channel:

json
{ "type": "conversation_indexed", "id": "...", "platform": "claude", "title": "...", "turns": [...] }
{ "type": "sync_request" }
{ "type": "search", "query": "..." }

Note (open question): Native messaging vs local HTTP (localhost:3721). Native messaging is more secure (no port exposure) but requires native host registration. Local HTTP is simpler. Cipher to advise before Phase 2 implementation.


Roadmap

PhaseFeaturesDuration
1Tauri scaffold, ~/.loci/ bootstrap, Scholar onboarding, basic search2 weeks
2Native messaging with extension, "extension detected" status1 week
3Wizard features: onboarding, palace nav, MCP server, LLM config2–3 weeks
4Code signing, auto-update, distribution1 week

Built by Hux × Vesper · Apache 2.0