A desktop AI client for Windows, built on Electron. It chats with 18 models through tuskcentral.ai, runs a five-agent research pipeline, and stages debates between two models under an AI judge.
- Streaming chat: replies render as markdown with syntax highlighting, KaTeX math, and bar charts generated from data tables. Cancel any response mid-stream.
- Ultra Research: four agents (Search, Reasoning, Logic, Analytics) investigate your question in parallel; a fifth synthesizes their findings into one report.
- Debate mode: two models argue a topic for up to six rounds while a judge scores each turn; a Chief Justice model delivers the final verdict.
- Voice and tone: get answers as Analytical/Technical, Executive Briefing, Casual Advisor, or Academic Peer-Review.
- Web search toggle on every message.
- Prompt tools: rewrite a rough prompt or fix its typos before sending.
- Auto titles: the app names each new chat from your first message.
- Chat history on disk, with search, rename, pin, delete, and Markdown export.
- Discord Rich Presence: detailed, minimal, or incognito modes showing your current model and activity.
- Close to tray: keep sessions alive when the window closes.
- Zoom from 70% to 150% by keyboard or Ctrl+mouse wheel.
- No CDN calls: marked, highlight.js, and KaTeX ship inside the app.
- Node.js 18 or newer
- npm (bundled with Node.js)
npm installnpm startnpm run buildelectron-builder writes Tusk AI Companion-Setup-{version}.exe to dist/.
| Shortcut | Action |
|---|---|
Enter |
Send message |
Shift+Enter |
New line |
Ctrl+N |
Start a new chat |
Ctrl+E |
Export the current chat as Markdown |
Ctrl+F |
Focus chat history search |
Ctrl+, |
Toggle the settings pane |
Ctrl+= / Ctrl+- |
Zoom in / out |
Ctrl+0 |
Reset zoom to 100% |
Ctrl+Mouse Wheel |
Zoom from anywhere |
Escape |
Close overlays |
├── main.js # Main process: windows, tray, IPC, history storage
├── preload.js # contextBridge API between main and renderer
├── build/ # Application icons
└── src/
├── config/
│ ├── constants.js # API endpoints and default model id
│ └── models.json # Catalog of 18 models
├── services/
│ ├── chatService.js # Streaming chat, research pipeline, debate engine
│ ├── streamParser.js # Chunk-safe JSON extraction from streams
│ └── discordService.js # Discord Rich Presence management
└── ui/
├── index.html # App shell
├── renderer.js # Rendering pipeline, sessions, shortcuts
├── style.css # Dark theme stylesheet
└── vendor/ # Local copies of marked, highlight.js, KaTeX
- All AI requests go to tuskcentral.ai.
- Chat history lives at
%APPDATA%/tusk-companion/tusk_history.json. Writes go to a temp file first and then rename, so a crash mid-save cannot corrupt the file. - Stream chunks coalesce into one IPC message per frame (~16 ms), which keeps fast token streams responsive.