Priler/jarvis
Offline voice assistant that respects your privacy. Forged in Rust. WIP.
Single-maintainer risk — review before adopting
weakest axisnon-standard license (Other); top contributor handles 92% of recent commits…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 3mo ago
- ✓7 active contributors
- ✓Other licensed
Show all 7 evidence items →Show less
- ✓Tests present
- ⚠Single-maintainer risk — top contributor 92% of recent commits
- ⚠Non-standard license (Other) — review terms
- ⚠No CI workflows detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: clarify license terms
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/priler/jarvis)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/priler/jarvis on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: Priler/jarvis
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Priler/jarvis shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Single-maintainer risk — review before adopting
- Last commit 3mo ago
- 7 active contributors
- Other licensed
- Tests present
- ⚠ Single-maintainer risk — top contributor 92% of recent commits
- ⚠ Non-standard license (Other) — review terms
- ⚠ No CI workflows detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live Priler/jarvis
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/Priler/jarvis.
What it runs against: a local clone of Priler/jarvis — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in Priler/jarvis | Confirms the artifact applies here, not a fork |
| 2 | License is still Other | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 109 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Priler/jarvis. If you don't
# have one yet, run these first:
#
# git clone https://github.com/Priler/jarvis.git
# cd jarvis
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of Priler/jarvis and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Priler/jarvis(\\.git)?\\b" \\
&& ok "origin remote is Priler/jarvis" \\
|| miss "origin remote is not Priler/jarvis (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
&& ok "license is Other" \\
|| miss "license drift — was Other at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "crates/jarvis-core/src/lib.rs" \\
&& ok "crates/jarvis-core/src/lib.rs" \\
|| miss "missing critical file: crates/jarvis-core/src/lib.rs"
test -f "crates/jarvis-core/src/listener.rs" \\
&& ok "crates/jarvis-core/src/listener.rs" \\
|| miss "missing critical file: crates/jarvis-core/src/listener.rs"
test -f "crates/jarvis-core/src/stt.rs" \\
&& ok "crates/jarvis-core/src/stt.rs" \\
|| miss "missing critical file: crates/jarvis-core/src/stt.rs"
test -f "crates/jarvis-core/src/lua/engine.rs" \\
&& ok "crates/jarvis-core/src/lua/engine.rs" \\
|| miss "missing critical file: crates/jarvis-core/src/lua/engine.rs"
test -f "crates/jarvis-core/src/audio.rs" \\
&& ok "crates/jarvis-core/src/audio.rs" \\
|| miss "missing critical file: crates/jarvis-core/src/audio.rs"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 109 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~79d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Priler/jarvis"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Jarvis is a fully offline, privacy-respecting voice assistant built in Rust using Tauri for the desktop GUI. It combines speech-to-text (Vosk), wake-word detection (Rustpotter/Porcupine), and audio processing (noise suppression via nnnoiseless, VAD via energy detection) into a single local application that never sends data to the cloud. Monorepo with 4 crates: jarvis-core contains audio I/O, processing pipelines (gain normalization, VAD, noise suppression), commands, config, and database logic; jarvis-app is the Tauri desktop frontend (Svelte + SCSS UI); jarvis-cli wraps core for command-line use; jarvis-gui (in workspace but file list incomplete). Audio pipeline is pluggable with trait-based implementations (e.g., rodio vs kira backends).
👥Who it's for
Privacy-conscious users who want a voice assistant that runs entirely offline on their machine, and Rust developers building cross-platform desktop applications with neural network inference and real-time audio processing.
🌱Maturity & risk
Experimental/WIP status — the README is explicitly marked outdated, NLU is not implemented yet, TTS options are struck through as unused, and Wake Word detection is marked 'Partially implemented, still WIP'. Single maintainer (Abraham Tugalov), no visible CI/CD setup in file list, making this early-stage research code rather than production-ready.
High dependency on external forks (pv_recorder, rustpotter, vosk-rs) maintained by contributors, potential API key requirement for Porcupine wake-word (non-free), and incomplete core features (NLU missing, TTS not functional) suggest the project is actively being reshaped. No test files visible in the top 60 structure indicates weak test coverage.
Active areas of work
Core focus appears to be stabilizing audio capture and processing (recent work on gain normalization, VAD energy-based detection, noise suppression integration). Wake-word detection via Rustpotter is partially implemented. i18n framework is in place (Fluent with en.ftl and ru.ftl locales) but only Russian is fully supported. No recent commit dates visible in file list, limiting ability to assess activity level.
🚀Get running
git clone https://github.com/Priler/jarvis.git
cd jarvis
# Install Rust (https://rustup.rs/)
# Install Node.js (required for Tauri frontend build)
cargo tauri dev
# Or build release:
cargo tauri build
Daily commands:
Development: cargo tauri dev (runs Vite dev server + Tauri window). Production build: cargo tauri build (outputs platform-specific binary in src-tauri/target/release/). Makefile.toml in crates/jarvis-app/ likely contains custom build tasks — check with cat Makefile.toml for available targets.
🗺️Map of the codebase
crates/jarvis-core/src/lib.rs— Core library entry point exporting all major modules; foundational for understanding the entire voice assistant pipeline.crates/jarvis-core/src/listener.rs— Wake word detection abstraction supporting Porcupine, Rustpotter, and Vosk; critical for triggering the assistant.crates/jarvis-core/src/stt.rs— Speech-to-text abstraction currently using Vosk; essential for converting audio input to text commands.crates/jarvis-core/src/lua/engine.rs— Lua script execution engine for command handling and extensibility; core automation framework.crates/jarvis-core/src/audio.rs— Audio playback abstraction with Kira and Rodio backends; handles system audio output for responses.crates/jarvis-core/src/ipc/server.rs— Inter-process communication server for app-to-core messaging; bridges GUI/CLI with the core engine.crates/jarvis-app/src/main.rs— Desktop application entry point using Tauri; primary user-facing interface.
🛠️How to make changes
Add a New Wake Word Listener Backend
- Create a new listener module in crates/jarvis-core/src/listener/ (
crates/jarvis-core/src/listener/your_backend.rs) - Implement the Listener trait with start(), stop(), and process_audio() methods (
crates/jarvis-core/src/listener.rs) - Add a conditional feature flag and enum variant in the listener module (
crates/jarvis-core/Cargo.toml) - Wire the new backend in the listener factory pattern (
crates/jarvis-core/src/listener.rs)
Add a New Lua API Module
- Create new file in crates/jarvis-core/src/lua/api/ (
crates/jarvis-core/src/lua/api/your_module.rs) - Copy the template from _new_api_module_example.rs and implement functions (
crates/jarvis-core/src/lua/api/_new_api_module_example.rs) - Register the module in the Lua engine initialization (
crates/jarvis-core/src/lua/engine.rs) - Export your module in the api module manifest (
crates/jarvis-core/src/lua/api.rs)
Add a New Audio Processor (VAD, Noise Suppression, Gain)
- Create implementation file under crates/jarvis-core/src/audio_processing/ (
crates/jarvis-core/src/audio_processing/your_processor/mod.rs) - Implement the processor trait (e.g., VoiceActivityDetector, NoiseSupressor, GainNormalizer) (
crates/jarvis-core/src/audio_processing.rs) - Update config to allow selecting the processor (
crates/jarvis-core/src/config/structs.rs) - Integrate processor into the audio pipeline (
crates/jarvis-core/src/audio_processing.rs)
Add a New Command Handler
- Define command in YAML config (usually in project config directory) (
crates/jarvis-core/src/commands/structs.rs) - Create Lua script in user config directory with matching command name (
crates/jarvis-core/src/lua/engine.rs) - Implement command logic using Lua API modules (core, audio, http, etc.) (
crates/jarvis-core/src/lua/api/core.rs) - Test via CLI or app by triggering the intent matching (
crates/jarvis-cli/src/main.rs)
🔧Why these technologies
- Rust — Memory safety, zero-cost abstractions, and excellent FFI support for integrating C/C++ ML models (Vosk, Porcupine).
- Tauri — Lightweight desktop framework that bundles the Rust backend directly, avoiding separate server processes while offering native OS integration.
- Vosk Speech Recognition — Open-source, offline STT via KALDI; no cloud dependency aligns with privacy-first goals.
- Lua Scripting — Sandboxed, lightweight scripting for extensible command handlers without requiring recompilation; embedded well in Rust via mlua.
- ONNX Runtime — Standardized format for deploying neural nets (embeddings, intent classifiers, GLiNER NER); portable across platforms.
⚖️Trade-offs already made
-
Offline-only with local models
- Why: Privacy requirement—no data sent to cloud.
- Consequence: Higher local compute cost, larger app size, slower inference than cloud APIs, but zero network dependency.
-
Multiple audio backend options (cpal, portaudio, pvrecorder)
- Why: Flexibility across different OS and hardware configurations.
- Consequence: undefined
🪤Traps & gotchas
Porcupine API key: Wake-word detection via Porcupine requires a free or paid AccessKey from Picovoice — must be configured in settings or env var. Platform-specific audio libraries: PvRecorder and Vosk may require OS-level dependencies (ALSA on Linux, CoreAudio on macOS, WinMM on Windows) — build.rs hints at this but errors are not obvious until compile time. Partially implemented features: TTS is completely disabled (all options struck through), so no audio output capability yet — app can only listen, not speak. Model files: Vosk and Rustpotter require model files (not bundled in repo — must be downloaded at runtime or provided). Cargo.lock in repo: Workspace uses locked dependencies, which can cause issues if forked crates (pvrecorder, rustpotter) have unpublished changes. Lua scripting: mlua is a dependency but no scripts visible in file list — unclear if this is used or vestigial.
🏗️Architecture
💡Concepts to learn
- Voice Activity Detection (VAD) — VAD filters silence and background noise to prevent continuous STT processing on every audio frame — Jarvis implements energy-based VAD in
audio_processing/vad/energy.rsto detect speech onset and reduce inference load - Audio Gain Normalization — Normalizes microphone input levels across devices and environmental conditions so STT models receive consistent audio; Jarvis implements SimpleGainNormalizer in
audio_processing/gain_normalizer/simple.rs - Spectral Subtraction (Noise Suppression) — Removes background noise from audio before STT; Jarvis uses nnnoiseless (a Rust port of RNNoise) to suppress non-speech frequencies, improving recognition accuracy in noisy environments
- Offline Inference / Edge ML — Jarvis is designed to run all ML models (Vosk STT, Rustpotter wake-word, fastembed embeddings) locally without cloud calls; critical for privacy and latency, but requires larger binaries and more CPU
- Trait-Based Audio Backend Abstraction — Jarvis abstracts audio I/O (rodio vs kira) and processing stages (gain, VAD, suppression) as pluggable traits; allows swapping implementations without recompiling core logic
- Fluent Localization — Jarvis uses Mozilla Fluent (.ftl files) for i18n instead of flat key-value JSON; enables pluralization, context-aware translations, and language-specific grammar
- WebSocket IPC (Tauri + Tungstenite) — Jarvis frontend (Svelte) communicates with Rust backend via tokio-tungstenite WebSockets; allows real-time streaming of audio buffers, VAD events, and STT results without blocking
🔗Related repos
alphacep/vosk-api— Upstream STT engine that Jarvis wraps via vosk-rs; understanding Vosk model loading and inference is essential for debugging speech recognitionGiviMAD/rustpotter— Upstream wake-word detection library that Jarvis partially integrates; Priler maintains a fork, so monitoring this repo for updates is criticalPicovoice/porcupine— Alternative wake-word engine supported by Jarvis (requires API key); useful for comparing wake-word accuracy vs Rustpottercoqui-ai/TTS— One of the disabled TTS backends listed in Jarvis roadmap; unfreezing this integration would restore voice output capabilitytauri-apps/tauri— Desktop framework Jarvis is built on; Tauri version and API changes will directly impact app compilation and security patches
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add integration tests for audio processing pipeline (VAD + Noise Suppression + Gain Normalization)
The audio_processing module has three independent components (VAD, noise suppression, gain normalization) but there are no visible integration tests verifying they work together correctly. Given this is a voice assistant processing audio input, a test suite validating the full pipeline with sample audio would catch regressions and ensure quality. This is critical for offline voice processing reliability.
- [ ] Create crates/jarvis-core/tests/audio_processing_integration.rs
- [ ] Add test fixtures (sample .wav files) to crates/jarvis-core/tests/fixtures/audio/
- [ ] Write tests validating: energy-based VAD detection, noise suppression output quality, gain normalization consistency
- [ ] Test the pipeline with crates/jarvis-core/src/audio_processing.rs public APIs
- [ ] Add assertion helpers for audio signal comparison (energy levels, SNR improvement)
Implement missing TTS backend and document speech synthesis architecture
The README explicitly shows TTS implementation is incomplete ('~~Silero TTS~~ (currently no...'). The codebase has well-structured backends for STT (Vosk) and wake-word detection (Porcupine, Rustpotter) following a clear trait pattern, but TTS is absent. Adding a TTS backend (e.g., piper-tts or espeak-ng via Rust bindings) following the existing audio backend pattern in crates/jarvis-core/src/audio/ would complete the assistant's voice capabilities.
- [ ] Research and select TTS library compatible with offline/privacy requirements
- [ ] Create crates/jarvis-core/src/tts.rs with trait definition (similar to crates/jarvis-core/src/listener.rs pattern)
- [ ] Implement one TTS backend (e.g., crates/jarvis-core/src/tts/piper.rs)
- [ ] Add TTS config struct to crates/jarvis-core/src/config/structs.rs
- [ ] Add documentation/example to README explaining TTS architecture and supported voices
Add command/intent execution tests with Lua API mocking
The codebase has intent classification (crates/jarvis-core/src/intent/), command definitions (crates/jarvis-core/src/commands/), and Lua scripting support (crates/jarvis-core/src/lua/), but there are no visible tests verifying end-to-end command execution. Testing the flow from classified intent → command execution → Lua API calls would validate the core voice assistant logic and prevent regressions in command handling.
- [ ] Create crates/jarvis-core/tests/command_execution.rs
- [ ] Add mock/test implementations of crates/jarvis-core/src/lua/api.rs functions
- [ ] Write tests for: intent classification → command matching, command parameter extraction, Lua execution context
- [ ] Create test fixtures with sample commands in crates/jarvis-core/tests/fixtures/commands/
- [ ] Test error handling for invalid intents and malformed Lua scripts
🌿Good first issues
- Implement missing TTS backend: Pick one of the commented-out options (Silero, Coqui, or SAM) and restore it to working state. Start by creating
crates/jarvis-core/src/tts.rswith a trait matching the audio.rs pattern, then integrate into the audio pipeline. This unblocks voice output for the entire assistant. - Add unit tests for audio processing modules:
crates/jarvis-core/src/audio_processing/gain_normalizer/simple.rsandcrates/jarvis-core/src/audio_processing/vad/energy.rshave no visible test files. Write property-based tests (using proptest or quickcheck) to verify normalization doesn't clip, and VAD correctly identifies silence thresholds. - Complete i18n for English and Ukrainian: Locale files exist only for Russian (
en.ftlandru.ftlare stubs). Extract all hardcoded strings fromcrates/jarvis-app/src/Svelte components andcrates/jarvis-core/src/log.rs, translate to English and Ukrainian Fluent syntax, then add language selection UI in the settings panel.
⭐Top contributors
Click to expand
Top contributors
- @Priler — 79 commits
- @el1sha256 — 2 commits
- @sawixy — 1 commits
- @Alim4567 — 1 commits
- @benzlokzik — 1 commits
📝Recent commits
Click to expand
Recent commits
520b981— AI models shared registry + Code cleanup + Better async handling + Some fixes, etc (Priler)a8ff344— some fixes + gliner first implementation (Priler)b9d5f41— Fix intent classifier init (Priler)8e83033— New intent classification engine - MiniLM L6v2 and MiniLM L12v2 ONNX (Priler)4815c7f— Bump to Lua 5.5 (Priler)13d6686— Merge branch 'master' of https://github.com/Priler/jarvis (Priler)acc806d— Improved wake-word & command detection, with dual mode (Priler)b10b5f9— Mark README as outdated (Priler)baf84e0— library files required for the build added (Priler)7440baa— basic Lua 5.4 implementation with few example commands (Priler)
🔒Security observations
- High · Lua Script Execution Without Sandboxing —
crates/jarvis-core/src/lua/api/ (http.rs, fs.rs, system.rs). The codebase includes a Lua engine (crates/jarvis-core/src/lua/) with multiple API modules exposed to Lua scripts. The lua/sandbox.rs file suggests sandboxing attempts, but exposing HTTP, filesystem, and system APIs to user-defined Lua scripts creates significant attack surface. Malicious Lua scripts could potentially access the filesystem, make network requests, or execute system commands. Fix: Implement strict Lua sandboxing with whitelist-based API access control. Restrict filesystem access to specific directories only. Disable or heavily restrict HTTP capabilities. Implement resource limits (memory, CPU time) for Lua execution. Validate all inputs passed to Lua functions. - High · Dependency on Git-Based Packages Without Version Pinning —
Cargo.toml workspace dependencies. Multiple dependencies are sourced directly from Git repositories without pinned commit hashes: 'pv_recorder' from Priler/pvrecorder and 'rustpotter' from Priler/rustpotter. This allows for supply chain attacks where branch changes or account compromise could inject malicious code. Fix: Replace git dependencies with exact commit hashes using the 'rev' parameter. Alternatively, publish these packages to crates.io with proper versioning. Regularly audit git-based dependencies and maintain a list of approved commits. - High · HTTP Client Without TLS Certificate Validation Controls —
crates/jarvis-core/src/lua/api/http.rs. The reqwest dependency is included with 'blocking' and 'json' features, but there's no evidence in the file structure of TLS configuration, certificate pinning, or proxy security settings. The http.rs Lua API module could be vulnerable to MITM attacks. Fix: Implement certificate pinning for critical endpoints. Explicitly configure TLS version requirements (TLS 1.2 minimum). Validate certificate chains. Disable insecure redirects. Provide configuration for custom CA certificates if needed. - Medium · Potential SQL Injection in Database Layer —
crates/jarvis-core/src/db/manager.rs. The database manager (crates/jarvis-core/src/db/manager.rs) exists but the actual query implementation is not visible. Without verification of parameterized queries, there's risk of SQL injection if raw SQL concatenation is used. Fix: Verify that all database queries use parameterized statements or prepared statements. Use ORM libraries (e.g., sqlx with compile-time checked queries) rather than raw SQL. Never concatenate user input into SQL queries. - Medium · IPC Server Without Authentication/Authorization —
crates/jarvis-core/src/ipc/server.rs, crates/jarvis-core/src/ipc/events.rs. The IPC server (crates/jarvis-core/src/ipc/server.rs) handles inter-process communication but without visibility into authentication mechanisms. Local privilege escalation or unauthorized command execution from other processes could be possible. Fix: Implement authentication for IPC connections. Validate caller process identity and permissions. Use Unix domain sockets with restrictive file permissions on non-Unix systems. Implement rate limiting and connection limits. Validate all received messages against expected schema. - Medium · Embedded Models Without Integrity Verification —
crates/jarvis-core/src/models/loaders/. The codebase loads neural network models (fastembed, ort, gliner_models) but there's no evidence of checksum verification or signature validation. Compromised model files could lead to adversarial attacks or data exfiltration. Fix: Implement cryptographic hash verification (SHA-256 or similar) for all model files. Store expected hashes separately from the application. Verify hashes before loading models. Consider signing models with a private key and verifying signatures. - Medium · Unrestricted File Operations in Lua API —
crates/jarvis-core/src/lua/api/fs.rs. The Lua fs module (crates/jarvis-core/src/lua/api/fs.rs) likely provides filesystem access functions without clear directory restrictions, potentially allowing traversal attacks or unauthorized file access. Fix: Implement a whitelist of allowed directories.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.