The Problem
Natively addresses the demand for a privacy-first AI assistant that provides real-time support during meetings, interviews, and live conversations without the detection risks or data concerns of commercial alternatives. The project explicitly markets itself as "completely undetectable in video calls, screen shares, and recordings" while positioning itself as a trustworthy open-source option.
What This Does
Natively is a desktop AI assistant that runs on top of other applications, providing live answers, context-aware suggestions, and screenshot analysis during active conversations. It supports local AI via Ollama for offline operation and requires users to bring their own API keys (BYOK model) for cloud providers. Core features include global keyboard shortcuts, rolling context memory, real-time transcription via Google Speech-to-Text, and instant generation of follow-ups, summaries, and replies. The interface stays "invisible and always on top" during screen shares and meetings.
File evidence: The electron directory (45 files) handles the desktop wrapper, audio capture, and system integration, while src (66 files) contains the React/Tailwind frontend. The native-module (20 files) contains Rust code for audio capture, and renderer (19 files) manages the webview interface.
How It Is Wired
Execution begins at handleStartMeeting in src/App.tsx:29, which reaches 14 functions. The primary runtime entry is initializeApp in electron/main.ts:1119, which triggers init -> runMigrations [db via this.db.exec]. Meeting processing flows through processCompletedMeetingForRAG in electron/main.ts:579 → getRecentMeetings [db via this.db.prepare]. The most critical inference path is generateContent, called from 11 places and ultimately invoking a model. The call graph shows getInstance (11 callers), isVisible (10 callers), and getMainWindow (9 callers) as highly distributed functions.
A significant structural issue: seven modules participate in circular imports, specifically electron/main.ts, electron/ProcessingHelper.ts, and electron/WindowHelper.ts, which mutually reference each other and create instability score 0.8. Three files exceed 800 lines (electron/main.ts at 899 lines, electron/LLMHelper.ts, src/components/NativelyInterface.tsx), creating high cognitive load and ripple effects for any change. Additionally, 514 duplicated 6-line code blocks appear across 32 files, including in electron/config/languages.ts, src/config/languages.ts, and electron/db/DatabaseManager.ts. An empty catch {} in electron/db/DatabaseManager.ts silently discards errors. The intent classifier in electron/llm/IntentClassifier.ts has 28 branch points over 84 lines, indicating decision-heavy logic that would benefit from decomposition.
How To Use It
Setup: This is a desktop application built with Electron, React, and Tailwind. No build commands are documented beyond what appears in the repository structure (package.json implies npm). Rust is required for the native audio capture module.
Configuration: A .env.example file exists at root level. Environment variables for API keys are referenced in the README but the actual configuration file location within the source structure is not mapped by this analysis. The README explicitly states users must provide their own Google Cloud Service Account JSON key for STT, placed somewhere accessible to the application, though the exact ingestion path within the codebase is unspecified.
Running it: The README directs users to download prebuilt releases from the GitHub Releases page rather than building from source. No start command or exported function is documented for local invocation.
Real-World Use
During a live interview, Natively listens via the system audio capture module (electron/audio/SystemAudioCapture.ts), processes speech through Google STT using the user-provided service account, and feeds transcript context to the LLM pipeline. When the speaker pauses, generateWithFlash or runWhatShouldISay triggers, routing through IntelligenceManager.setMode and setMode (called 7 times from various entry points) to produce a contextual suggestion displayed in the overlay window. After the meeting ends, handleEndMeeting in src/App.tsx:62 saves the transcript via saveMeeting [db via this.db.prepare] and can generate a PDF recap using generateMeetingPDF → addText (called 8 times) and addVerticalSpace (called 9 times).
Code Health & Issues
The repository has no CI/CD pipeline, no automated build or test gate. Dependabot or Renovate are not configured across the 4 manifest files. A demo.gif at 48.2MB sits unversioned in the root; this repository carries one blob over 5MB, consistent with a pattern where twenty-plus blobs over 5MB were found in a related project. The test suite contains 1 test file against 109 source files (ratio 0.009). Convention files .editorconfig, .gitattributes, and a formatter config are absent. Critically, the circular import cycle between electron/main.ts, electron/ProcessingHelper.ts, and electron/WindowHelper.ts means refactoring any of these three modules risks breaking the others without a shared type extractor or deferred import.
The Bottom Line
This is a functional open-source privacy assistant that avoids shared API keys and offers local AI via Ollama, but the codebase shows significant technical debt: oversized files, circular dependencies, duplicated logic, and zero automated testing or CI. It will suit users who need a self-hosted, bring-your-own-keys assistant and are comfortable patching the gaps, but it is not yet production-grade for teams requiring reliability or auditability.