A local-first, privacy-preserving alternative to Google NotebookLM — Tauri 2, React 19, Rust, Ollama
Rust
45
91 commits
updated Sep 6, 2026
A local-first desktop notebook for source-grounded research and chat.
Gloss is a source-implemented local-first desktop notebook for source-grounded research and chat. The input, retrieval, provider, and receipt paths described below are source-level capabilities; live provider/model and release-grade desktop behavior are not verified in this snapshot.
[!WARNING] Gloss is under active development and currently distributed as source. Linux x86_64 is the maintained development/build target. The repository does not publish a tagged, end-user binary release.
The current source/build verification passes for the checked paths, including frontend tests/build, Cargo feature checks/tests, strict Clippy, dependency policy checks, and a Tauri debug compile. Those results do not establish live desktop behavior, an installed workflow, or real provider/model execution.
The scripted desktop contract passes, but no live GUI driver or live desktop receipt exists for this snapshot. AppImage installer smoke is also blocked because no release AppImage artifact is available. Treat Gloss as source/build/test verified, not release-proven.

Representative interface screenshot; illustrative only and not evidence of current live desktop or release behavior.
Gloss is for people who want a source-implemented local notebook that makes the intended path from imported source to model response inspectable.
It is a good fit when you want:
all, selected, or none retrieval scope;It is not currently a packaged end-user release, a hosted synchronization service, a formal security/compliance product, or a substitute for validating model answers.
The evidence states below are deliberately separate:
| Surface | State in this snapshot | Boundary |
|---|---|---|
| Frontend unit and contract tests | Verified-executed | 28 frontend tests plus static contract checks passed locally |
| Frontend production build | Verified-executed | npm run build passed; Vite emitted a non-blocking chunk-size advisory |
| Rust default, semantic-memory, and TurboQuant profiles | Verified-executed | Cargo checks passed for all three profiles |
| Rust feature test suite | Verified-executed | 212 passed, 2 intentionally ignored |
| Strict Clippy | Verified-executed | -D warnings passed for the TurboQuant profile |
| Tauri debug desktop compile | Verified-executed | npm run verify built target/debug/gloss without bundling |
| Scripted desktop contract | Verified-executed | Contract harness passed, but live_desktop_exercised=false |
| AppImage packaging | Blocked | No AppImage artifact is available and the release packaging toolchain is incomplete in the current environment |
| Installed package workflow | Not verified | No installed GUI workflow receipt exists beyond the available scripted/package checks |
| Real provider/model chat | Blocked | No live provider/model smoke receipt exists for this snapshot |
| Offline cached Nomic embedding smoke | Blocked | The local Hugging Face cache does not contain the model |
| Other desktop operating systems | Not verified in this snapshot | No CI, packaging, or live-runtime evidence is provided here for non-Linux platforms |
The canonical release projection is intentionally release_ready: false and public_claim_ready: false until a live, release-grade desktop receipt exists.
The verified CI development path uses:
rustfmt;On Ubuntu/Debian, the repository's Linux CI path installs this system set. This does not certify other distributions, desktop platforms, or installed workflows. Review system-package changes before running them:
sudo apt-get update
sudo apt-get install -y \
build-essential curl file \
libayatana-appindicator3-dev librsvg2-dev libssl-dev \
libwebkit2gtk-4.1-dev libxdo-dev pkg-config wget
Install Rust through rustup and use Node.js 22 from your preferred package manager or runtime manager.
git clone https://github.com/RecursiveIntell/Gloss.git
cd Gloss
npm ci
Run the repository-owned verifier:
npm run verify
A full run with no skipped gates ends with a JSON receipt whose status is "passed". This status covers the listed source/build/dependency gates only.
npm run tauri:dev:release
This command launches a Tauri development app using the semantic-memory-turbo-quant feature profile. It was not exercised in a live GUI session here; the debug compile and scripted contract were verified instead.
Open Settings to select a provider and model. Chat can use no retrieval context, but interactive model-backed chat still requires a configured provider and model.
The following are source-declared paths. They are covered by the repository's build/tests/static gates to varying degrees, but they have not all been live-smoke tested in this snapshot.
.glosspkg.tar.gz notebook archives with manifest and per-file SHA-256 validation.all, explicit selected-source, and none retrieval scope.Source-level Studio paths define structured outputs and deterministic fallback artifacts. Their live model-backed execution is not verified in this snapshot; deterministic fallback paths are covered by source/build tests.
The canonical source owner is import_capability.rs. Unknown, archive, binary, and model formats are not silently widened into text import.
| Input | Behavior | Boundary |
|---|---|---|
| Text, Markdown, reStructuredText, code, config | Local UTF-8 extraction with format/language metadata | Source text is not automatically summarized or normalized |
| CSV/TSV | Plain-text import | Table normalization is not claimed |
| Bounded local extraction | OCR, forms, and layout fidelity are not claimed | |
| DOCX/XLSX/PPTX | Bounded OOXML text/value extraction | Rendering fidelity is not claimed |
| Legacy DOC/XLS/PPT | Optional antiword, xls2csv, and catppt tools | Timeout, output-size, and redacted receipt boundaries apply |
| EPUB | Bounded spine/XHTML extraction | DRM and layout fidelity are not supported |
| HTML files | Source-text import | Readability extraction is not applied |
| URL | One consented HTTP(S) fetch | Public-host, redirect, content-type, timeout, and byte limits; no crawling/authenticated fetch |
| YouTube | Public caption tracks only | Per-import network consent; no video download or authenticated access |
| Images | Vision-job route | Quality depends on the configured vision-capable model |
| Audio | ffprobe metadata plus optional cached Whisper transcription | Transcription is skipped unless a compatible local model is already cached |
| Video | Bounded ffmpeg/ffprobe processing | Full video understanding and general transcription are not claimed |
| Provider | Default endpoint | Default policy |
|---|---|---|
| Ollama | http://localhost:11434 | Loopback only |
| llama.cpp | http://localhost:8080/v1 | Loopback only |
| OpenAI | https://api.openai.com/v1 | Official HTTPS host; custom endpoint requires opt-in |
| Anthropic | https://api.anthropic.com/v1 | Official HTTPS host; custom endpoint requires opt-in |
RFC1918 LAN endpoints for local providers require allow_lan_local_providers. Custom OpenAI/Anthropic HTTPS endpoints require allow_custom_cloud_endpoints. Provider URLs reject embedded credentials, query strings, and fragments.
API keys are stored in an application-managed AES-256-GCM encrypted file. On Unix, Gloss applies owner-only permissions to the secret directory, key, and ciphertext. This is not an operating-system keyring; a user who can read both the key and ciphertext under the same account can decrypt the secrets.
Gloss has no hosted synchronization service in the current source. Network activity still occurs when you:
When a cloud provider is selected, the assembled prompt and source context leave the machine. “Local-first” does not mean “network impossible.”
flowchart LR
A[Notebook + selected scope] --> B[Extraction and chunking]
B --> C[SQLite FTS5/BM25]
B --> D[Configured embedding backend:\nOllama when selected/reachable;\notherwise Candle/Nomic fallback]
D --> E[HNSW/usearch]
C --> F[Candidate fusion]
E --> F
F --> G[Optional rerank or disclosed fallback]
G --> H[Bounded prompt context]
H --> I[Local or explicitly configured provider]
I --> J[Answer, citations, terminal state, and receipts]
The text equivalent is: notebook scope controls which source records enter extraction; FTS/BM25 and optional dense HNSW search produce candidates; Gloss fuses or degrades those candidates; the prompt is bounded; the provider returns a stream; and the answer is persisted with citations and runtime evidence.
source scope -> extraction/chunking -> FTS + dense candidates
-> fusion/rerank/fallback -> bounded prompt -> provider stream
-> persisted response + citations + receipts
The frontend renders backend-owned attempt, source-scope, retrieval, and terminal state. It does not invent cancellation completion or silently widen an invalid selected-source scope.
| Command | Purpose | Evidence boundary |
|---|---|---|
npm run dev | Vite frontend development server | Does not launch the Tauri desktop shell by itself |
npm run tauri:dev:release | Tauri development app with the release feature profile | Live GUI behavior remains environment-dependent |
npm run build | TypeScript check plus production Vite build | Frontend build only |
npm test | Frontend unit and static contract tests | Does not prove live Tauri interaction |
npm run verify | Canonical source/build verification | Checks static gates, Cargo profiles/tests, frontend tests/build, cargo-deny, npm audit, and a debug Tauri compile; it does not prove AppImage packaging, live GUI behavior, or provider/model execution |
npm run desktop-smoke | Scripted runtime/evidence contract harness | Passes without proving a headed live GUI workflow |
npm run installer-smoke | Release bundle and installer smoke | Requires release packaging tools and an artifact; currently blocked here |
The active Rust manifest declares these profiles:
semantic-memory-backend plus semantic-memory-turbo-quant;semantic-memory-backend: semantic-memory integration without TurboQuant candidate features;semantic-memory-turbo-quant: semantic-memory plus TurboQuant candidate codecs.The runtime and README treat semantic-memory/TurboQuant as experimental/candidate surfaces. Their compile/test coverage is not a claim that every model/cache/provider combination is live-proven.
cargo fmt --all -- --check
cargo clippy --locked \
--manifest-path src-tauri/Cargo.toml \
--features semantic-memory-turbo-quant \
--all-targets -- -D warnings
cargo test --locked \
--manifest-path src-tauri/Cargo.toml \
--features semantic-memory-turbo-quant \
--all-targets
bash validation/run_all_gloss_repair_gates.sh .
The CI workflow runs npm run verify on pull requests and pushes to main. The local verifier currently performs:
The current local evidence is source/build/test verified. The release projection remains blocked until live desktop, installed workflow, and real provider/model evidence exists.
src/ React desktop interface and Zustand stores
src-tauri/src/ Rust/Tauri commands, providers, ingestion, retrieval, and data layer
src-tauri/vendor/ Reviewed local copies of selected RecursiveIntell crates
scripts/ Build, smoke, replay, and canonical verification entry points
validation/ Static, contract, packaging, and release-consistency gates
docs/ Current plans, receipts, audits, and archived evidence
fixtures/ Deterministic import and runtime-log fixtures
prompts/ Source-owned Studio prompt templates
Canonical ownership and development rules are in AGENTS.md. The active import policy is in import_capability.rs; provider network policy is in providers/mod.rs; chat lifecycle ownership is in commands/chat/mod.rs; and release verification is in scripts/verify_release.py.
SECURITY.md is not currently present; do not put credentials, private source text, local paths, or unredacted receipts in public issues.npm run verify and strict Clippy before requesting review.For security-sensitive reports, avoid public reproduction details containing secrets or private data. Use a private maintainer/security channel when available rather than posting credentials or unredacted evidence publicly.
Gloss is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only).
91 commits
Rust
54.1%
Python
25.1%
TypeScript
19.3%
Shell
1.0%
A local-first, privacy-preserving alternative to Google NotebookLM — Tauri 2, React 19, Rust, Ollama
Rust
45
91 commits
updated Sep 6, 2026
A local-first desktop notebook for source-grounded research and chat.
Gloss is a source-implemented local-first desktop notebook for source-grounded research and chat. The input, retrieval, provider, and receipt paths described below are source-level capabilities; live provider/model and release-grade desktop behavior are not verified in this snapshot.
[!WARNING] Gloss is under active development and currently distributed as source. Linux x86_64 is the maintained development/build target. The repository does not publish a tagged, end-user binary release.
The current source/build verification passes for the checked paths, including frontend tests/build, Cargo feature checks/tests, strict Clippy, dependency policy checks, and a Tauri debug compile. Those results do not establish live desktop behavior, an installed workflow, or real provider/model execution.
The scripted desktop contract passes, but no live GUI driver or live desktop receipt exists for this snapshot. AppImage installer smoke is also blocked because no release AppImage artifact is available. Treat Gloss as source/build/test verified, not release-proven.

Representative interface screenshot; illustrative only and not evidence of current live desktop or release behavior.
Gloss is for people who want a source-implemented local notebook that makes the intended path from imported source to model response inspectable.
It is a good fit when you want:
all, selected, or none retrieval scope;It is not currently a packaged end-user release, a hosted synchronization service, a formal security/compliance product, or a substitute for validating model answers.
The evidence states below are deliberately separate:
| Surface | State in this snapshot | Boundary |
|---|---|---|
| Frontend unit and contract tests | Verified-executed | 28 frontend tests plus static contract checks passed locally |
| Frontend production build | Verified-executed | npm run build passed; Vite emitted a non-blocking chunk-size advisory |
| Rust default, semantic-memory, and TurboQuant profiles | Verified-executed | Cargo checks passed for all three profiles |
| Rust feature test suite | Verified-executed | 212 passed, 2 intentionally ignored |
| Strict Clippy | Verified-executed | -D warnings passed for the TurboQuant profile |
| Tauri debug desktop compile | Verified-executed | npm run verify built target/debug/gloss without bundling |
| Scripted desktop contract | Verified-executed | Contract harness passed, but live_desktop_exercised=false |
| AppImage packaging | Blocked | No AppImage artifact is available and the release packaging toolchain is incomplete in the current environment |
| Installed package workflow | Not verified | No installed GUI workflow receipt exists beyond the available scripted/package checks |
| Real provider/model chat | Blocked | No live provider/model smoke receipt exists for this snapshot |
| Offline cached Nomic embedding smoke | Blocked | The local Hugging Face cache does not contain the model |
| Other desktop operating systems | Not verified in this snapshot | No CI, packaging, or live-runtime evidence is provided here for non-Linux platforms |
The canonical release projection is intentionally release_ready: false and public_claim_ready: false until a live, release-grade desktop receipt exists.
The verified CI development path uses:
rustfmt;On Ubuntu/Debian, the repository's Linux CI path installs this system set. This does not certify other distributions, desktop platforms, or installed workflows. Review system-package changes before running them:
sudo apt-get update
sudo apt-get install -y \
build-essential curl file \
libayatana-appindicator3-dev librsvg2-dev libssl-dev \
libwebkit2gtk-4.1-dev libxdo-dev pkg-config wget
Install Rust through rustup and use Node.js 22 from your preferred package manager or runtime manager.
git clone https://github.com/RecursiveIntell/Gloss.git
cd Gloss
npm ci
Run the repository-owned verifier:
npm run verify
A full run with no skipped gates ends with a JSON receipt whose status is "passed". This status covers the listed source/build/dependency gates only.
npm run tauri:dev:release
This command launches a Tauri development app using the semantic-memory-turbo-quant feature profile. It was not exercised in a live GUI session here; the debug compile and scripted contract were verified instead.
Open Settings to select a provider and model. Chat can use no retrieval context, but interactive model-backed chat still requires a configured provider and model.
The following are source-declared paths. They are covered by the repository's build/tests/static gates to varying degrees, but they have not all been live-smoke tested in this snapshot.
.glosspkg.tar.gz notebook archives with manifest and per-file SHA-256 validation.all, explicit selected-source, and none retrieval scope.Source-level Studio paths define structured outputs and deterministic fallback artifacts. Their live model-backed execution is not verified in this snapshot; deterministic fallback paths are covered by source/build tests.
The canonical source owner is import_capability.rs. Unknown, archive, binary, and model formats are not silently widened into text import.
| Input | Behavior | Boundary |
|---|---|---|
| Text, Markdown, reStructuredText, code, config | Local UTF-8 extraction with format/language metadata | Source text is not automatically summarized or normalized |
| CSV/TSV | Plain-text import | Table normalization is not claimed |
| Bounded local extraction | OCR, forms, and layout fidelity are not claimed | |
| DOCX/XLSX/PPTX | Bounded OOXML text/value extraction | Rendering fidelity is not claimed |
| Legacy DOC/XLS/PPT | Optional antiword, xls2csv, and catppt tools | Timeout, output-size, and redacted receipt boundaries apply |
| EPUB | Bounded spine/XHTML extraction | DRM and layout fidelity are not supported |
| HTML files | Source-text import | Readability extraction is not applied |
| URL | One consented HTTP(S) fetch | Public-host, redirect, content-type, timeout, and byte limits; no crawling/authenticated fetch |
| YouTube | Public caption tracks only | Per-import network consent; no video download or authenticated access |
| Images | Vision-job route | Quality depends on the configured vision-capable model |
| Audio | ffprobe metadata plus optional cached Whisper transcription | Transcription is skipped unless a compatible local model is already cached |
| Video | Bounded ffmpeg/ffprobe processing | Full video understanding and general transcription are not claimed |
| Provider | Default endpoint | Default policy |
|---|---|---|
| Ollama | http://localhost:11434 | Loopback only |
| llama.cpp | http://localhost:8080/v1 | Loopback only |
| OpenAI | https://api.openai.com/v1 | Official HTTPS host; custom endpoint requires opt-in |
| Anthropic | https://api.anthropic.com/v1 | Official HTTPS host; custom endpoint requires opt-in |
RFC1918 LAN endpoints for local providers require allow_lan_local_providers. Custom OpenAI/Anthropic HTTPS endpoints require allow_custom_cloud_endpoints. Provider URLs reject embedded credentials, query strings, and fragments.
API keys are stored in an application-managed AES-256-GCM encrypted file. On Unix, Gloss applies owner-only permissions to the secret directory, key, and ciphertext. This is not an operating-system keyring; a user who can read both the key and ciphertext under the same account can decrypt the secrets.
Gloss has no hosted synchronization service in the current source. Network activity still occurs when you:
When a cloud provider is selected, the assembled prompt and source context leave the machine. “Local-first” does not mean “network impossible.”
flowchart LR
A[Notebook + selected scope] --> B[Extraction and chunking]
B --> C[SQLite FTS5/BM25]
B --> D[Configured embedding backend:\nOllama when selected/reachable;\notherwise Candle/Nomic fallback]
D --> E[HNSW/usearch]
C --> F[Candidate fusion]
E --> F
F --> G[Optional rerank or disclosed fallback]
G --> H[Bounded prompt context]
H --> I[Local or explicitly configured provider]
I --> J[Answer, citations, terminal state, and receipts]
The text equivalent is: notebook scope controls which source records enter extraction; FTS/BM25 and optional dense HNSW search produce candidates; Gloss fuses or degrades those candidates; the prompt is bounded; the provider returns a stream; and the answer is persisted with citations and runtime evidence.
source scope -> extraction/chunking -> FTS + dense candidates
-> fusion/rerank/fallback -> bounded prompt -> provider stream
-> persisted response + citations + receipts
The frontend renders backend-owned attempt, source-scope, retrieval, and terminal state. It does not invent cancellation completion or silently widen an invalid selected-source scope.
| Command | Purpose | Evidence boundary |
|---|---|---|
npm run dev | Vite frontend development server | Does not launch the Tauri desktop shell by itself |
npm run tauri:dev:release | Tauri development app with the release feature profile | Live GUI behavior remains environment-dependent |
npm run build | TypeScript check plus production Vite build | Frontend build only |
npm test | Frontend unit and static contract tests | Does not prove live Tauri interaction |
npm run verify | Canonical source/build verification | Checks static gates, Cargo profiles/tests, frontend tests/build, cargo-deny, npm audit, and a debug Tauri compile; it does not prove AppImage packaging, live GUI behavior, or provider/model execution |
npm run desktop-smoke | Scripted runtime/evidence contract harness | Passes without proving a headed live GUI workflow |
npm run installer-smoke | Release bundle and installer smoke | Requires release packaging tools and an artifact; currently blocked here |
The active Rust manifest declares these profiles:
semantic-memory-backend plus semantic-memory-turbo-quant;semantic-memory-backend: semantic-memory integration without TurboQuant candidate features;semantic-memory-turbo-quant: semantic-memory plus TurboQuant candidate codecs.The runtime and README treat semantic-memory/TurboQuant as experimental/candidate surfaces. Their compile/test coverage is not a claim that every model/cache/provider combination is live-proven.
cargo fmt --all -- --check
cargo clippy --locked \
--manifest-path src-tauri/Cargo.toml \
--features semantic-memory-turbo-quant \
--all-targets -- -D warnings
cargo test --locked \
--manifest-path src-tauri/Cargo.toml \
--features semantic-memory-turbo-quant \
--all-targets
bash validation/run_all_gloss_repair_gates.sh .
The CI workflow runs npm run verify on pull requests and pushes to main. The local verifier currently performs:
The current local evidence is source/build/test verified. The release projection remains blocked until live desktop, installed workflow, and real provider/model evidence exists.
src/ React desktop interface and Zustand stores
src-tauri/src/ Rust/Tauri commands, providers, ingestion, retrieval, and data layer
src-tauri/vendor/ Reviewed local copies of selected RecursiveIntell crates
scripts/ Build, smoke, replay, and canonical verification entry points
validation/ Static, contract, packaging, and release-consistency gates
docs/ Current plans, receipts, audits, and archived evidence
fixtures/ Deterministic import and runtime-log fixtures
prompts/ Source-owned Studio prompt templates
Canonical ownership and development rules are in AGENTS.md. The active import policy is in import_capability.rs; provider network policy is in providers/mod.rs; chat lifecycle ownership is in commands/chat/mod.rs; and release verification is in scripts/verify_release.py.
SECURITY.md is not currently present; do not put credentials, private source text, local paths, or unredacted receipts in public issues.npm run verify and strict Clippy before requesting review.For security-sensitive reports, avoid public reproduction details containing secrets or private data. Use a private maintainer/security channel when available rather than posting credentials or unredacted evidence publicly.
Gloss is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only).
91 commits
Rust
54.1%
Python
25.1%
TypeScript
19.3%
Shell
1.0%