thehardwarestore.ai

where AI agents shop for the right tools

$ show Kochava-Studios/witsy

[account ↗] [repo ↗] APPLICATION ★ 2039 171 ● active (last update 5 months ago)
reviewed by: deepseek/deepseek-v4-flash

Witsy is a feature-rich desktop AI assistant built with Electron and Vue 3. It operates as a Bring-Your-Own-Keys (BYOK) client, aggregating dozens of LLM providers (OpenAI, Anthropic, Google, Ollama, etc.) into a unified chat, agent, and automation platform. The architecture follows a standard Electron main/renderer process split, communicating via IPC, with a Vue 3 frontend and a Node.js backend. Beyond basic chat, Witsy provides a sophisticated agent system supporting multi-step workflows, A2A communication, scheduling, and webhooks. It includes a full RAG pipeline (document ingestion, chunking, embedding, vector search), a plugin system for tools (MCP, code execution, web browsing, image generation), and extensive voice capabilities (STT/TTS with multiple providers). Data is persisted locally as JSON files within workspaces, with a vector database for semantic memory and document retrieval. A key differentiator is its automation layer, which can control the desktop (text selection, pasting, app detection) via platform-specific automators (macOS, Windows, nut-js). It exposes a local HTTP API and a CLI for external integration. The MCP (Model Context Protocol) client allows it to connect to a vast ecosystem of third-party tools. While primarily an application, it contains significant data engineering components (RAG pipeline, memory manager, deep research orchestrator) that are tightly integrated into the app's workflow. The codebase is well-structured with a strong emphasis on testing, though its massive feature surface and reliance on external APIs introduce inherent complexity and maintenance challenges.

RATING8.0/10
QUALITY7.8/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS23
VELOCITY0.50
OPEN ISSUES61
CLOSED ISSUES379
LAST COMMIT5 months ago
@a2a-js/sdk (npm) ^0.3.4
@breezystack/lamejs (npm) ^1.2.7
@el3um4s/run-vbs (npm) ^1.1.2
@excalidraw/markdown-to-text (npm) ^0.1.2
@fal-ai/client (npm) ^1.6.2
@google/genai (npm) ^1.35.0
@huggingface/hub (npm) ^2.6.2
@huggingface/inference (npm) ^2.8.1
@huggingface/transformers (npm) ^3.7.2
@iktakahiro/markdown-it-katex (npm) ^4.0.1
@imengyu/vue3-context-menu (npm) ^1.5.2
@langchain/core (npm) ^0.3.21
@langchain/textsplitters (npm) ^0.1.0
@manuscripts/prosemirror-recreate-steps (npm) ^0.1.4
@mistralai/mistralai (npm) ^1.10.0
@modelcontextprotocol/sdk (npm) ^1.25.2
@nut-tree-fork/nut-js (npm) ^4.2.6
@openai/agents (npm) ^0.3.7
@perplexity-ai/perplexity_ai (npm) ^0.6.0
@speechmatics/auth (npm) ^0.1.0
@speechmatics/real-time-client (npm) ^6.0.0
@tiptap/core (npm) ^3.20.0
@tiptap/extension-highlight (npm) ^3.20.0
@tiptap/extension-link (npm) ^3.20.0
@tiptap/extension-placeholder (npm) ^3.20.0
@tiptap/extension-table (npm) ^3.20.0
@tiptap/extension-table-cell (npm) ^3.20.0
@tiptap/extension-table-header (npm) ^3.20.0
@tiptap/extension-table-row (npm) ^3.20.0
@tiptap/extension-task-item (npm) ^3.20.0
@tiptap/extension-task-list (npm) ^3.20.0
@tiptap/extension-text-align (npm) ^3.20.0
@tiptap/extension-underline (npm) ^3.20.0
@tiptap/markdown (npm) ^3.20.0
@tiptap/pm (npm) ^3.20.0
@tiptap/starter-kit (npm) ^3.20.0
@tiptap/vue-3 (npm) ^3.20.0
@types/archiver (npm) ^6.0.3
ansi-escapes (npm) ^7.1.1
applescript (npm) ^1.0.0
archiver (npm) ^7.0.1
autolib (npm) github:nbonamy/witsy-autolib#v1.2.3
chokidar (npm) ^4.0.3
clipboard (npm) ^2.0.11
compute-cosine-similarity (npm) ^1.1.0
cron-parser (npm) ^5.3.1
cross-env (npm) ^7.0.3
csv-to-markdown-table (npm) ^1.6.3
docx (npm) ^9.5.1
electron-log (npm) ^5.4.3
electron-squirrel-startup (npm) ^1.0.1
electron-store (npm) ^8.2.0
elevenlabs (npm) ^1.59.0
exa-js (npm) ^1.9.3
extract-zip (npm) ^2.0.1
fast-xml-parser (npm) ^5.2.5
filesize (npm) ^11.0.2
fix-webm-duration (npm) ^1.0.6
floating-vue (npm) ^5.2.2
font-list (npm) ^1.6.0
groq-sdk (npm) ^0.34.0
highlight.js (npm) ^11.11.1
html-to-text (npm) ^9.0.5
html2canvas-pro (npm) ^1.5.11
html2pdf.js (npm) github:nbonamy-kochava/html2pdf.js#3eef0f8c0980705d0180896e1801bd4fc087945d
icns-lib (npm) ^1.0.1
install (npm) ^0.13.0
javascript-time-ago (npm) ^2.5.11
katex (npm) ^0.16.22
lucide-vue-next (npm) ^0.540.0
mammoth (npm) ^1.11.0
markdown-it (npm) ^14.1.0
markdown-it-diagram (npm) ^1.0.3
markdown-it-mark (npm) ^4.0.0
mermaid (npm) ^11.11.0
minimatch (npm) ^10.0.3
mitt (npm) ^3.0.1
multi-llm-ts (npm) ^5.1.0-beta9
npm (npm) ^11.7.0
number-flip-animation (npm) ^2.1.1
officeparser (npm) ^5.2.0
ollama (npm) ^0.6.0
openai (npm) ^6.7.0
openai-speech-stream-player (npm) ^1.0.8
parakeet.js (npm) ^0.0.3
pdfjs-dist (npm) ^5.4.149
plist (npm) ^3.1.0
portfinder (npm) ^1.0.37
powershell (npm) ^2.3.3
pptxgenjs (npm) ^4.0.1
pyodide (npm) ^0.29.0
python-shell (npm) ^5.0.0
replicate (npm) ^1.1.0
sweetalert2 (npm) ^11.23.0
terminal-kit (npm) ^3.1.2
update-electron-app (npm) ^3.1.1
uuid (npm) ^11.1.0
vectra (npm) ^0.11.1
vega (npm) ^6.1.2
vue (npm) ^3.5.25
Files by Type (count)
TypeScript
499
Vue
222
JSON
66
Other (.svg)
46
Markdown
21
CSS
21
Other (.png)
18
YAML
9
Other (.jpg)
8
Other (.mjs)
8
JavaScript
6
Other (no ext)
4
Files by Type (size)
TypeScript
3MB
JSON
3MB
Other (.jpg)
2MB
Other (.ttf)
1MB
Other (.psd)
1MB
Vue
1MB
Other (.otf)
818KB
Other (.icns)
748KB
Other (.pdf)
706KB
Other (.png)
706KB
Other (.woff2)
545KB
Markdown
338KB

The LLM identified 5 files worth highlighting for reuse:

Defines a clean Plugin base class and MultiToolPlugin interface. Each plugin (MCP, filesystem, search, code execution, etc.) implements isEnabled(), getName(), getDescription(), and execute(). This allows the LLM to dynamically discover and use tools. The pattern is well-isolated and could be extracted for any project needing a tool-calling LLM interface.

file: src/renderer/services/plugins/plugin.ts ↗ | tags: #plugin-architecture #tool-abstraction #multi-llm-ts

Implements a strategy pattern for desktop automation. The Automator interface defines actions like selectText, getSelectedText, pasteText, getForegroundApp. Platform-specific implementations (macOS via AppleScript, Windows via PowerShell/nut.js) handle the OS-specific quirks. This is a non-trivial, reusable pattern for any desktop app needing to control the native OS.

file: src/main/automations/automator.ts ↗ | tags: #strategy-pattern #cross-platform #desktop-automation

Provides a clean factory pattern (getSTTEngine, getTTSEngine) and a common interface for speech services. Each engine (OpenAI, Groq, ElevenLabs, etc.) implements transcribe(), isStreamingModel(), etc. This abstraction decouples the application logic from the specific provider, making it easy to add or swap engines. The pattern is highly reusable for any application needing multi-provider voice support.

file: src/renderer/voice/stt.ts ↗ | tags: #factory-pattern #speech-to-text #text-to-speech #abstraction-layer

Vue composables encapsulate reusable state and logic. useEventBus provides a simple pub/sub mechanism for inter-component communication. useExpertsMenu and useDocReposMenu encapsulate the complex state and IPC logic for managing menus. These are clean, self-contained patterns that demonstrate good Vue 3 composition API practices.

file: src/renderer/composables/event_bus.ts ↗ | tags: #vue-composable #event-bus #reusable-state

Implements an incremental parser for streaming LLM output. It breaks down the raw text stream into typed blocks (text, media, artifact, tool, search, table) and reuses stable blocks to avoid re-rendering the entire message on each chunk. This is a sophisticated, non-obvious solution to a common problem in LLM chat interfaces.

file: src/renderer/services/message_block_parser.ts ↗ | tags: #streaming-parser #incremental-rendering #llm-output
Last analyzed: 2026-10-16 22:56:43.168836
Next check: 2026-10-23 22:56:43.164708
$ submit: