A local-first AI planning assistant. Extracts action items from meeting transcripts, manages tasks on a kanban board, and uses a local LLM (via LM Studio) for smart planning — all without sending data to the cloud.
| View | Dark | Light |
|---|---|---|
| Dashboard | ![]() |
![]() |
| Kanban Board | ![]() |
![]() |
| Space & Notes | ![]() |
![]() |
| Weekly Review | ![]() |
![]() |
| AI Chat | ![]() |
![]() |
| Settings | ![]() |
![]() |
- Dashboard — smart filters: My Tasks, Overdue, Due Today, Blocked, by project
- Kanban Board — Time-based, Status, Day-by-day, and Calendar views
- Spaces — per-project workspace with notes, tasks, booked hours, and semantic search
- AI Chat — daily/weekly planning via local LLM; changes confirmed before writing
- Document Processing — upload transcripts (.txt, .md, .pdf), auto-extract action items
- Time Tracking — book hours per space, weekly timesheet grid, daily activity chart
- Semantic Search — per-space vector index powered by LM Studio embeddings
- Model Recommendations — RAM-aware model suggestions with LM Studio copy-paste commands
- 100% Local — no network calls except localhost. No telemetry.
| Layer | Technology |
|---|---|
| App framework | Tauri 2.x (Rust backend) |
| Frontend | React 19 + TypeScript |
| Styling | Tailwind CSS |
| State | Zustand |
| LLM | OpenAI-compatible API via LM Studio |
| Storage | Markdown + JSON files |
~/Documents/ThoughtForge/
spaces/
{id}/
space.json # metadata (name, color, time entries)
notes/
{note-id}.md # YAML frontmatter + markdown body
tasks/
{task-id}.md # YAML frontmatter + notes body
search_index.json # per-space vector index
boards/
kanban.md
uploads/
transcripts/
documents/
config.yaml
- macOS / Windows / Linux
- Rust (1.70+):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - Node.js (20+):
brew install node - LM Studio: lmstudio.ai — for AI features
git clone https://github.com/larsroettig/thoughtforge.git
cd thoughtforge
npm installnpm run tauri devnpm run tauri buildProduces a .app bundle and .dmg installer in src-tauri/target/release/bundle/.
- Install LM Studio and load models:
lms load qwen2.5-14b-instruct # chat (recommended for 16–32 GB RAM) lms load nomic-embed-text-v1.5 # embeddings (for semantic search) - In ThoughtForge → Settings → verify URL is
http://localhost:1234 - Select your chat model from the dropdown
See Settings → Model Recommendations for RAM-matched model suggestions.
The chat connects to your local LLM and can propose task modifications:
- Ask "plan my day" or "change priority of X to high"
- The AI responds with proposed changes
- A confirmation card appears — review each change, apply or skip individually
- The AI never writes to your vault without explicit confirmation
| Command | Description |
|---|---|
/plan-day |
Daily plan with priorities and time blocks |
/plan-week |
Day-by-day weekly breakdown |
/status |
Overview of all projects and blockers |
/blocked |
Show blocked or overdue items |
/extract |
Extract action items from pasted text |
/summarize |
Summarize a project |
/prioritize |
Suggest priority ordering |
ThoughtForge ships a built-in Model Context Protocol server. Enable it in Settings → MCP & Integrations, then add the server to claude_desktop_config.json:
{
"mcpServers": {
"thoughtforge": {
"command": "/Applications/ThoughtForge.app/Contents/MacOS/vaultmind-mcp",
"args": ["--stdio"]
}
}
}Available tools: list_tasks, create_task, update_task, delete_task, list_spaces, list_notes, create_note, search_notes, list_goals, create_goal, update_goal, delete_goal.
See docs/mcp.md for the full tool reference and HTTP transport setup.
- User Guide — getting started, all features explained
- MCP Server — Claude Desktop integration, tool reference, security
- GitHub Pages — landing page
ThoughtForge requests only the Tauri capabilities it needs. See PERMISSIONS.md for a full table of every granted permission, the code that uses it, and the rationale.
Key points:
- No network calls outside localhost — SSRF guard in
src-tauri/src/llm.rsblocks all non-localhost hosts - No telemetry — the app cannot phone home
- Frontend never touches the filesystem directly — all I/O goes through validated Rust commands
- MCP bearer token compared with constant-time equality
npm test # Vitest unit tests
npm run test:e2e # Playwright E2E (requires: npm run dev in another terminal)
cd src-tauri && cargo test # Rust unit testsBuilt by Lars Roettig.
MIT











