Skip to content

Under the hood

The page with no adjectives.

What actually runs, with the components' real names and the real mechanisms. If you want the pitch, it's on the homepage. Running a company, or assessing risk for IT? Every block ends with a "Plainly" line — the takeaway, minus the jargon.

No slideware here — the actual stack: Tauri 2 desktop (Rust), local llama.cpp inference (SHA-256-pinned GGUF — Qwen3.5→3.8, Ornith 1.0), hybrid PostgreSQL memory (tsvector + pgvector, RRF fusion) with nightly curation, versioned markdown notes where every version names its author, sharing through fine-grained capabilities (Keto), an encrypted audit log with third-party-verifiable integrity hashes, and a single MCP gateway — the native integrations plus the platform modules. No fine-tuning anywhere: self-improvement rests on memory.

The architecture at a glance

The desktop client

  • Tauri 2 — React 19 webviews + Rust core. Not Electron. The edge runtime lives in Rust for a precise reason: the WebView freezes its JavaScript in the background (v0.19.0 lesson). Inference and tools survive a minimized window.
  • Signed installers — Developer ID + notarization (macOS), Authenticode EV (Windows), .deb/.rpm (Linux). minisign updates, publicly verifiable manifest.
  • Browser-based pairing — no token pasting. The token lives in the OS keychain, out of devtools' reach; on a 401, the session refreshes and the request is replayed instead of kicking you to the login screen.

Plainly: it installs like any signed software, updates itself, and the AI keeps working with the window minimized.

The recorder

  • Detection by the mic's hardware state — not the calendar, not a process scan. A CoreAudio listener (macOS — catches Meet in a browser tab), PulseAudio introspection (Linux), the ConsentStore registry (Windows).
  • Never the lobby — a debounced state machine with a 2-second "Arming" state. An open-but-idle Zoom client triggers nothing; the status glyphs Chrome grafts onto tab titles (🔊 🔴) are stripped before classification.
  • Per-process auto-stop (macOS 14.4+) — the question asked of the system: "is a process OTHER than me capturing?". Hanging up stops the recording, even if the Meet tab stays open.
  • Two streams, one WAV — mic + system audio merged into stereo (one channel each). Mute writes silence to preserve time alignment; anti-feedback excludes its own audio (excludesCurrentProcessAudio).
  • Durable upload queue — atomic manifest, retry/backoff, per-session dedup, and an append-only journal that is never purged: a chain of custody for recordings.

Plainly: nothing joins the call, the lobby is never recorded, and every recording keeps a chain of custody — precious when keeping client communications is a regulatory obligation.

The edge node — AI on your machine

  • Pairing in one commandluge-edge pair: a short code, approved from an already-connected device. The token is applied hot (~2 s), and re-pairing needs no restart — model loaded and agents intact.
  • llama.cpp as a sidecar — compiled per platform (Metal / CUDA / Vulkan). An edge catalog of 10 GGUF models pinned by SHA-256 (2.7 → 22 GB): Qwen3.5→3.8 (4B → 35B), Ornith 1.0, among others. The newest entry, Qwen3.8 27B (qwen3.8-27b-q4, 17.9 GB), is the first dense model in the catalog's top tier: the neighboring MoEs activate only 3-4B parameters per token; it brings all 27B to bear. (The edge catalog — pinned, bounded — is not the local models guide's list, which covers everything that runs.) Streamed download, rolling hash, atomic rename.
  • Local transcription — Parakeet ONNX via sherpa-onnx (+ Canary, Cohere), opt-in diarization (who spoke, when). Per-chunk checkpointed jobs: an interruption re-transcribes nothing. 100% Rust audio decoding (symphonia — zero ffmpeg).
  • Coding agents installed remotely — you pick an ACP agent in Luge (Claude Code, Codex, Copilot, Cursor, among others) and it installs on the machine without opening a terminal — through the luge-edge node (the CLI or the service), never through the desktop app, which hosts no agents. What crosses the wire is a catalog id — never a command line: the machine resolves the id locally and composes its own command. Permission asks are posted in the conversation thread.
  • 1Password secrets — the agent handles secret://alias/field, resolved on the machine right before execution, bindable to a registrable domain. The agent never sees the value (the detail — default-deny, scrubbing — is in the Tools & secrets block).
  • Honest capability gating — a node only advertises inference_capable if the model is on disk AND the server resolvable. "Why isn't my local agent answering?" is made impossible by construction.
  • The cloud never commands the machine — the backend can neither choose which model the node loads nor which MCP binaries it runs. Command lines are composed locally, by design.
  • Signed, fail-closed updatesminisign-verified self-update: invalid signature = no update, never the other way around.
  • Headless CLI ("edge light") — for servers: SSH-pairable, hot-reloaded TOML config (comments preserved), installable as an OS service.
  • Not a full Luge install on your machine — the agent hosted on your machine has neither the Luge memory, nor the Luge tools, nor document search: it works with what you give it, under your rights and your permissions. We'd rather say it ourselves.

Plainly: the AI can run entirely on the machine, a coding agent installs onto it from Luge with no terminal, and the cloud has no way to take control of it.

Memory and self-improvement — the full system

No fine-tuning anywhere: everything runs on PostgreSQL. It's the deepest part of the product, so here it is in full.

Writing

  • At most 5 memories per turn — after each AI reply, a light LLM pass extracts the durable facts (test: "still true in 30 days?"). An empty list is the normal, expected outcome.
  • 3-layer deduplication before every insert: exact SHA-256 hash → FTS rank ≥ 0.5 (paraphrases) → vector cosine ≥ 0.85 (paraphrases with no shared words). A duplicate re-confirms the original instead of piling up.
  • Anti-hijack by design — the extractor refuses to store imperatives ("a stored directive is replayed in every future context") and speaker identity; it falls back to private on any doubt.
  • The model proposes, the code applies — no LLM writes to the database directly. Validated JSON, categories clamped to the canonical enum, pinned by tests.
  • Attribution and scope — every memory carries its contributor (human ≠ AI, never conflated) and its scope: company / team (Keto sharing) / personal / ephemeral. And ephemeral really is: nothing derived is persisted.

Reading

  • Hybrid recall — tsvector + pgvector, RRF fusion (Reciprocal Rank Fusion: k=60, 50 candidates per side), weighted by freshness decay (7-day half-life, 0.7 floor).
  • Honest freshnesslast_confirmed_at (the fact was re-stated) ≠ last_used_at (a mere recall): two distinct timestamps drive the decay.
  • Core memory under a hard budget — an always-injected tier, capped (1,200 characters company / 800 personal): an addition that overflows is rejected. Scarcity is the curation mechanism — predictable preamble, no context drift.
  • Bilingual in the schema — accent-folded FTS on both sides ("prefere" typed without the accent matches the stored "préfère"), extraction in the conversation's language. Not a patch.

At night

  • Dream sweep (4:30 UTC) — memory is curated nightly: deterministic SQL pruning first (old + never recalled + rarely used; durable categories exempt), then batched LLM re-judging (keep/archive with typed reasons), merging redundancies, resolving contradictions (superseded_by). The curator reorganizes; it never invents and never DELETEs.
  • Re-scoping personal leaks — distinguishing "a fact about a third party" (stays with the team) from "a personal fact about the contributor" (goes back private).
  • Resurrection — an archived fact that gets re-stated in conversation is automatically un-archived: it cleared the extractor's bar again, so it's evidently alive.

The loop over skills and prompts

  • No judge-and-party (dated product decision, 2026-06-05) — the agent that produced a reply never judges it. A third-party observer only re-reads conversations flagged by deterministic triggers (👎, abnormal length) and records friction facts only.
  • Reversible fixes — observer → proposer → author → apply → revert pipeline: pre-mutation journal, bit-for-bit revert, the revert reason becomes feedback, the thrice-reverted is blacklisted. The dashboard measures whether the fix got used (activations_since) and whether the friction stopped (recurrence_since).

Plainly: your agents retain what matters, cleanly forget the rest, and nothing lands in their memory without passing through validated code. No retraining, ever.

Writing — notes, canvases and search

  • Versioned markdown notes — every save creates a version, and the history names each one's author: a person in the editor, an AI acting for them, or a programmatic access key. No mystery about the pen.
  • Restore = new version — going back to an old version creates a new one on top. History is never rewritten.
  • @ references and backlinks — a note points to any platform object. The reference resolves against the reader's rights: the same text shows each person only what they are allowed to see. Backlinks show who points at the note.
  • Overwrite protection in co-editing — human and agent can write in the same note; a write based on a stale version is refused instead of silently crushing the other's work.
  • Canvases — blocks on a 2D plane for building a document with several hands, exportable in an open interchange format.
  • Unified search — notes + documents, by meaning, bounded by access rights: the question is never even asked over what you cannot see. It is not a full-text search across the whole platform — we say so plainly.
  • Workspace graph — 15 object families (conversations, notes, documents, meetings, agents, captures, tables…) linked as a graph, with adjustable exploration depth. Every link respects the access rights it came from.

Plainly: your notes keep track of who wrote what — human or AI —, nothing gets erased quietly, and search cannot show you what isn't yours to see.

The sharing model

  • Fine-grained capabilities (Keto) — every action goes through a named permission. A feature without its capability doesn't even appear in the UI; destructive and critical capabilities carry dedicated flags.
  • Private / Whole-organization visibility — two levels, deliberate defaults: open for memories and documents (team knowledge serves the team), closed for everything else.
  • Read / Write sharing + access requests — a resource is shared read or write; what isn't shared with you is requested in one click. Even an admin has to ask.
  • Cascading document folders — sharing a folder opens its whole branch, no re-granting piece by piece. (Note folders, by contrast, organize: sharing there happens note by note.)
  • An agent always acts with the rights of the person talking to it — no omniscient service account. Ask the agent for a document you can't see: it can't see it either.
  • Structural multi-tenant isolation — not a configuration option: queries are tenant-scoped by construction. Not configurable — therefore not de-configurable.
  • External guests with a proven address — a person outside the organization proves their address (Google, Microsoft or a one-time code) and reaches only what was explicitly shared with them. As of v0.59.

Plainly: every person — and every AI — sees only what they're allowed to see, access is requested rather than worked around, and an outside guest proves who they are before coming in.

Tools and secrets

  • A single MCP gateway — the 25 native integrations (Slack, Teams, Gmail, Jira, GitHub, HubSpot…) plus the platform modules (documents, memory, notes, boards, telephony, HITL — human-in-the-loop…), on a single FastMCP server. Per-user OAuth, automatic refresh.
  • N+1→1 gateway — each tenant's own MCP servers are mounted as namespaced proxies on the same gateway. Cache, circuit breaker and health PER server: one slow tenant server never degrades the others. Hot-reload via Redis pub/sub.
  • 1Password secrets — the agent handles secret://alias/field, resolved locally right before execution. Default-deny, registrable-domain binding (SSO subdomains pass, bank.com.evil.com is blocked), result scrubbing under three encodings (raw, HTML, URL). ~19 dedicated tests.
  • Code execution — Claude Code in a separate Docker/K8s sandbox (4 GB / 2 CPU, ephemeral workspace, 7 lifecycle hooks, session resume).

Plainly: every integration goes through a single watched door, and your passwords never travel through the model.

The platform and compliance

  • Open-source foundation — FastAPI backend (Python 3.12) orchestrated by RoomKit (MIT). PostgreSQL 16 + pgvector, Redis + Celery, Ory Kratos (OAuth, Passkeys, API keys) + Keto (fine-grained permissions).
  • Encrypted audit log, exportable signed archive — a per-row content_hash computed on the plaintext at write time (a contract pinned by a regression test), plus a SHA-256 root over id:hash pairs at export. Tampering is detectable by a third party, without any decryption key. Exportable PDF evidence packages (beta).
  • PII: Warn / Anonymize / Block — 100% on-prem GLiNER detection + regex (SIN, health-insurance numbers, cards…), three actions chosen by policy. In Anonymize mode the round-trip is complete: masking before the model call, response re-identification via reverse-map. The external LLM never sees the real value; the user sees an intact answer.
  • Gemini served from the tenant's own GCP project, pinned region — prompts and responses stay in a single jurisdiction: Gemini is called from the tenant's own Google Cloud project (billing, quotas and logs stay theirs, verifiable in their own console), with a mandatory region at every layer — no default anywhere. A request without a region simply doesn't leave.
  • Single chokepoint (BEFORE_BROADCAST hook) — fail-closed AI consent and the monthly budget at the same crossing point, whatever the entry door: web, voice, email, Telegram, webhooks, automations. A quota bolted onto the chat UI alone leaks through automations. The block is real — but an established voice call is never cut off; it lands on the next turn.
  • Direct SIP telephony — trunks, REGISTER, credential rotation without restart: minutes at trunk price, not through a CPaaS middleman (a telephony platform resold by the minute). And call_colleague: a text agent can phone a colleague — the goal is handed to the voice agent, the result delivered back to the original room.
  • Voice rooms, note taker — a team channel can become a permanent voice room. In a meeting, the note taker is a participant everyone can see; it listens to each person separately — that's where real per-speaker attribution comes from, not from guesswork after the fact.
  • OpenAI-compatible APIPOST /api/v1/chat/completions (streaming included) with your Luge key.

Plainly: the audit can be verified without taking our word for it, personal information is masked before any external call, and consent actually blocks.

Security — the details that matter in a pentest

  • WebSocket token out of the logs — it travels in Sec-WebSocket-Protocol, specifically so it never shows up in access logs.
  • llama-server locked down even on loopback — ephemeral port + a random 24-byte API key per process, passed via environment variable (not a world-readable cmdline). Orphaned processes are tracked and killed.
  • Hardened outbound webhooks — SSRF-validated registry (double resolution), X-Luge-Signature-256 HMAC signature, per-destination delivery ledger with a copy of the exact payload sent.
  • Measurable hygiene — zero panic!()/TODO outside tests in ~17,800 lines of Rust, 338 tests, clippy as a hard gate on 3 OSes. (As of edge v0.12.0.)

Plainly: the angles a penetration test checks first are already covered.

What's not there yet

  • Windows system audio (WASAPI) — written, not wired yet. Local transcription on Windows — on the way. macOS and Linux are complete. (As of August 2026.)
  • Contributor expertise — the weighting exists in the recall formula… but equals 1.0 everywhere: the plumbing is waiting for its engine.
  • No approval gate on improvement-loop fixes — a deliberate position: pre-mutation journal, bit-for-bit revert, blacklist of reverted fixes.
  • No ANN index (approximate nearest neighbor) on embeddings — a documented multi-tenant trade-off: recall is exact, not approximate, and we watch the latency.
  • The platform isn't open source — the orchestration foundation (RoomKit) is; the distribution repo with signatures is public. We'd rather say it ourselves.

Technical questions? Open an issue or write to luge@nsolutions.ai — a human from the product team answers. Or check for yourself: download the app — everything is signed.

Nothing here asks for your trust.

Everything described on this page ships inside a signed installer: open the logs, look at the ports, read the checksums.

A specific question? We answer at luge@nsolutions.ai