{"slug": "show-hn-hearth-an-open-source-local-ai-that-runs-your-pc-files-apps-voice", "title": "Show HN: Hearth, an open-source local AI that runs your PC (files, apps, voice)", "summary": "Hearth, an open-source local AI assistant, launches as a framework that controls a user's Windows PC—opening apps, managing files, driving a browser, and responding via voice—without cloud dependency or telemetry. The project offers a full installer with a bundled GPU model server and a lite edition for existing endpoints, aiming to provide a persistent, private alternative to cloud-locked assistants.", "body_md": "**The local AI that actually runs your computer.**\n\nIt talks. It listens. It opens your apps, reads and writes your files, drives a real browser you can watch, and remembers you, all on your own machine.\n\nNo account. No cloud required. No telemetry.\n\n*The framework is Hearth. The assistant it ships with is named JARVIS, rename it to anything. The resident, and the house.*\n\nThe smartest AI in the world lives in someone else's cloud. It's brilliant, and it can't touch your computer, it forgets you the moment the tab closes, and the meter never stops.\n\nSo you ran a model locally. Now what? Most \"local AI\" projects are one of three things:\n\n**A chat UI** around a model (LibreChat, Open WebUI, big-AGI). Beautiful, but it's just chat. It can't open your files or*do*anything on your machine.**A coding agent**(Aider, Cline, Continue, Open Interpreter). Powerful, but scoped to \"write code in this folder,\" not \"be the AI on my PC.\"**A cloud-locked assistant**(ChatGPT, Claude, Gemini). Great, until they change the rules, deprecate your model, or you go offline.\n\n**Hearth is the fourth thing.** A local-first operator that runs on the model you already have, controls your actual Windows PC, files, shell, apps, browser, the desktop itself (clicks and types), screenshots, voice, talks back, listens, and remembers you across sessions. Nothing ever leaves your machine except a web search, and only when you ask.\n\nAnd it keeps growing: **skills are shareable.** A skill is a folder that teaches Hearth a workflow (\"clean up my Downloads\", \"turn this folder of photos into a contact sheet\"). Installing one someone else wrote is a single line, `/skill install someone/their-repo`\n\n, and writing your own is one command.\n\nReach it however you work: a terminal **CLI**, a desktop/web **app**, a headless **bridge**, or an **MCP server**.\n\nv0.7-preview, the CLI and desktop app are the daily drivers. Voice and the bundled llama.cpp server work but are preview-quality (see notes below). Windows is the supported platform; macOS/Linux run from source with most tools working.\n\nWhere it's headed, grounded computer-use (it watches the screen, points, and acts), a guided \"walk me through this\" mode, and Mac/Linux, is in the ** Roadmap**.\n\nDisposable facts get archived, what matters builds a wall of memory |\nBuilt-in model manager, no LM Studio needed |\nSkills, reminders, your workspace |\n\nGrab the [latest release](https://github.com/0pen-sourcer/Hearth/releases/latest), no Python, no git, no setup. Two editions:\n\n**Hearth Full (~1 GB)** bundles a GPU model server (CUDA llama.cpp). It downloads and runs models for you, so there is nothing else to install.**Hearth Lite (~500 MB)** skips the bundled server, for when you already run LM Studio, Ollama, or another OpenAI-compatible endpoint.\n\nBoth install to your user folder, no admin needed. Started on Lite and want the built-in server later? Run the Full installer over it, your settings, memory, and chats stay exactly where they are.\n\nNeeds **Python 3.11+**. Windows has a one-line installer:\n\n```\ngit clone https://github.com/0pen-sourcer/Hearth.git\ncd Hearth\n.\\install.ps1                      # bring your own server (LM Studio / Ollama / vLLM / llama.cpp / a cloud key)\n.\\install.ps1 -BuiltinLLM cuda     # NVIDIA GPU: Hearth installs + runs its own llama.cpp server\n.\\install.ps1 -BuiltinLLM cpu      # no GPU: same server, on CPU\n.\\hearth.bat                       # launch\n```\n\nThe installer is idempotent (safe to re-run) and has switches to skip optional pieces, voice, STT, MCP SDK, file readers, desktop window, browser control. Run `Get-Help .\\install.ps1 -Detailed`\n\nfor the full list. On macOS and Linux you clone and run with Python (`pip install -r requirements.txt`\n\n, then `python hearth_cli.py`\n\n), steps in the macOS / Linux section below.\n\nOn first launch, a short onboarding flow asks which model brain to use, lets you pick a voice and rename the assistant to anything you want, and sets its tone.\n\nIf you installed **Full** (or ran `install.ps1 -BuiltinLLM`\n\n), Hearth has its own bundled llama.cpp server, open the Models tab, pick a model, and it downloads and runs it for you, no other app needed. Otherwise Hearth auto-detects a running **LM Studio** (port 1234), **Ollama** (11434), or **llama.cpp** server (8080) at boot, no configuration needed. To use something else, set `LOCAL_API_BASE`\n\nto any OpenAI-compatible endpoint.\n\nA cloud key is optional. In the desktop app's Settings (or via env vars), you can point the chat brain at Gemini, OpenAI, Grok, or OpenRouter and switch back to local at any time without restarting. Files, voice, and memory stay local regardless; only the prompt goes to the provider you choose.\n\nAny ~7B-or-larger model with OpenAI-style tool-calling works. On ~8GB VRAM, tool adherence is best on recent tool-trained models. Small local models handle everyday tasks well (open this, read that, remember this) but can fumble long multi-step chains; a built-in loop guard catches and breaks those spirals. For heavier reasoning (deep web research, multi-page browser sessions) a larger or cloud model helps.\n\nHearth ships a tool-call parser that recognizes the formats emitted by Gemma, Hermes, Qwen 2.5/3, Llama 3.x, Mistral, Phi, Granite, and Cohere Command-R, plus a generic `<function=NAME>`\n\nform, so models whose tool calls aren't natively parsed by the server still work.\n\nHearth runs from source on macOS and Linux. The CLI and web UI work, and most tools (shell, files, screenshots, app launching, window focus, clipboard, web search, reminders, notifications) have native POSIX paths. Linux is verified (tested on Mint 22 / Ubuntu 24.04); macOS shares the same POSIX paths but has had less testing. The desktop-control layer, the one-click installer, and the packaged build are Windows-only for now; everywhere else you clone and run with Python. See ** docs/INSTALL_LINUX_MAC.md** for the exact steps, and\n\n[CONTRIBUTING.md](/0pen-Sourcer/Hearth/blob/main/CONTRIBUTING.md)if you want to help port the rest.\n\n| Interface | Launch | Notes |\n|---|---|---|\nCLI |\n`.\\hearth.bat` |\nTerminal app with voice loop, command history, slash-command autocomplete, model control, and a context-usage footer. |\nDesktop app / Web UI |\n`python -m hearth.tray --open` (or `Hearth.exe` from a release build) |\nNative window with multi-chat sidebar, a Models tab for downloading and loading GGUFs, voice mode, file drop, inline permission prompts, and a settings panel. Same backend as the CLI. |\nBridge |\n`python -m hearth.headless --prompt \"...\"` |\nNon-interactive. Emits JSONL events to stdout so you can drive Hearth from scripts, CI, or another agent. `--format text` for human-readable output. |\nMCP server |\n`python -m hearth.mcp_server` |\nExposes Hearth's tools to any MCP-aware chat host (LM Studio, Cline, Claude Desktop, Cursor). |\n\n**Files.** Read, write, edit, list, move, delete. `read_file`\n\nextracts clean text from PDF, DOCX, XLSX, PPTX, EPUB, IPYNB, CSV, JSON, HTML, RTF, and single-stream `.gz`\n\n/`.bz2`\n\n/`.xz`\n\n. It peeks into and pulls files out of zip/tar archives without unpacking them, and can summarize very large PDFs, hundreds of pages that don't fit in context, by working through them in chunks.\n\n**Shell.** Real PowerShell or cmd commands, with output captured and sanitized.\n\n**Apps and URLs.** Open any installed app, file, folder, Start Menu shortcut, or URL with one tool. Media opens in your default player, archives in your archive tool, folders in Explorer.\n\n**Browser.** Drive a real Chrome / Brave / Edge session you can watch: `browse`\n\nopens a page and lists its clickable elements, `browse_click`\n\nscrolls the target into view and clicks it, `browse_type`\n\nfills fields. The session persists across calls for multi-step flows.\n\n**Desktop control.** Beyond the browser, Hearth can operate the actual desktop. `desktop_snapshot`\n\nreads a window's real buttons, fields and menu items as a list (an accessibility snapshot, precise, not pixel-guessing), then `desktop_click`\n\n/ `desktop_type`\n\nact on them by name. It can also move the mouse, click, type, and press key combos directly, you watch the real cursor move. Every action that changes something asks first. Windows for now (cross-platform in progress).\n\n**Screen and vision.** Take a screenshot, or attach an image, and have a vision-capable model describe it.\n\n**Web.** Search and fetch pages via DuckDuckGo. No API key.\n\n**Memory.** Per-fact markdown files that persist across sessions. The index is always loaded and the facts most relevant to your message are folded into context automatically. Memory self-curates: each fact tracks how often it's recalled, cold facts archive automatically (never deleted) when a category grows too large, and an archived fact warms back to active storage once it's recalled enough. When you save something that overlaps an existing fact, Hearth notices and decides whether to update or add.\n\n**Reminders.** One-shot or recurring, set in natural language (\"in 25 minutes\", \"every weekday at 9am\"). A reminder can also fire a tool when it pops (for example, run a web search and include the result in the toast). Reminders that came due while Hearth was closed surface on next launch, in the CLI they print into the chat, since Windows often suppresses the toast. Set an [ntfy](https://ntfy.sh) topic and reminders also push to your phone, so they reach you even when the PC is asleep.\n\n**Phone.** Reach Hearth from your phone through a **Telegram** or **Discord** bot, bot token only, no OAuth, no public server to host. Message the bot and it runs the same agent loop as the CLI, replies (long answers chunked), and sends back any file it produced. An allowlist (your chat/user id) is the only gate. Configure it in the desktop app under **Settings → Reach from phone** (or hand-edit the config); reminders can also push to your phone via [ntfy](https://ntfy.sh). An experimental WhatsApp bridge exists too (unofficial, see the caveats). Opt-in; full setup in [docs/PHONE.md](/0pen-Sourcer/Hearth/blob/main/docs/PHONE.md).\n\n**Skills, and you can share them.** A skill is a folder with a `SKILL.md`\n\nthat teaches Hearth a repeatable workflow; the model sees a one-line summary of each and loads the full steps only when it uses one, so dozens can be installed without bloating context. Built-in skills cover PDFs, slide decks (PPTX), spreadsheets (XLSX), diagrams (SVG/HTML), and ASCII art (plus PDF split/merge). The part that compounds: **install a skill someone else wrote with one line**, `/skill install owner/repo`\n\n(or paste a GitHub link in chat), and publish your own by pushing a folder to GitHub. Install discloses what a skill can do and asks before it lands; its scripts only ever run through the same permission prompt as any command. Write once, share with a link, see [docs/SKILLS.md](/0pen-Sourcer/Hearth/blob/main/docs/SKILLS.md) and the community index, [awesome-hearth-skills](https://github.com/0pen-sourcer/awesome-hearth-skills).\n\n**Sub-agents.** Fork focused workers that run with a tightened system prompt and a restricted tool allowlist. Six personas ship: researcher, coder, archivist, librarian, summarizer, and a PDF coordinator that fans out summarizer workers over a document and reduces their results. Workers run synchronously or in the background; background results arrive in your next chat turn rather than blocking. Fork depth is bounded to prevent runaway spawning.\n\n**Watch a team build.** Ask for a team, \"one frontend, one backend, one architect\", and Hearth spawns each as a sub-agent and opens a live terminal pane per agent (Windows Terminal split-panes, or tmux on Linux/macOS), so you watch them think, call tools, and finish side by side. Opt-in; the agents act on their own once you ask, so it only runs when you do.\n\n**Background jobs.** Long-running operations (whole-drive scans, big searches) return a job ID immediately and run in a background thread while you keep working. List jobs and collect results when they finish.\n\n**MCP, both directions.** Hearth exposes its own tools as an MCP server, and it also consumes other MCP servers: drop an `mcp.json`\n\nin the workspace and their tools appear alongside the built-ins.\n\n**Voice.** Text-to-speech (Kokoro) streams sentence by sentence; speech-to-text (faster-whisper) supports a continuous-listen mode with mid-sentence barge-in, start talking and the current reply stops. Both auto-detect your hardware: text-to-speech runs on CUDA or DirectML, speech-to-text on CUDA, and either falls back to CPU. Preview-quality at v0.7.\n\n**Self-extending tools.** When Hearth hits a capability gap, it can write a new tool for itself with `create_plugin`\n\n, validated, saved to the workspace, and usable the same turn. You can also hand-write plugins (a `TOOL`\n\ndict plus a `run(args)`\n\nfunction); any `*.py`\n\nin the plugins folder auto-loads at startup.\n\n**Identity.** A `soul.md`\n\nfile rides at the top of every system prompt. The assistant can write its own durable identity instructions there, and you can rename the whole agent, the chat avatar, persona, and workspace folder all follow.\n\n**Image and video generation.** Optional tools for cloud image/video generation, plus integration with a local Stable Diffusion (Forge) install for fully local image generation.\n\n**A long tool list isn't context bloat.** Hearth has ~100 tools, but the model never sees all of them at once. A core set loads by default; the rest stay behind a `load_tools`\n\nmeta-tool the model calls on demand and then uses inline, so the per-turn prompt stays small no matter how many tools exist. The model only ever loads what it needs. Set `HEARTH_ALL_TOOLS=1`\n\nto load everything up front.\n\n```\n   you (mic) ──▶ faster-whisper ──┐\n   you (kbd) ───────── text ──────┤\n                                   ▼\n                            Hearth core (CLI / app / bridge)\n                                   │  messages + tools (OpenAI format)\n                                   ▼\n                  local server (LM Studio / Ollama / built-in llama.cpp)\n                  or an OpenAI-compatible cloud endpoint\n                                   │  reply + tool calls\n                                   ▼\n                            tool executor\n                  files · shell · web · apps · browser · memory\n                  + your plugins + remote MCP servers + sub-agents\n                                   │\n                                   ▼  (loops until done; a loop guard stops spirals)\n   you (ears) ◀── Kokoro TTS ◀── streamed reply\n```\n\nThe same tool executor is exposed through `hearth/mcp_server.py`\n\n, so any MCP-aware chat host sees the same tools, memory, and workspace as the Hearth CLI or desktop app.\n\n```\n~/Jarvis/                  ← the agent's home (override with $env:JARVIS_WORKSPACE)\n├── soul.md                ← self-written identity, loaded into every prompt\n├── rules.md               ← plain-text house rules, re-read every turn\n├── memory/\n│   ├── MEMORY.md          ← always-loaded index\n│   ├── <fact>.md          ← per-fact files\n│   └── _archive/          ← cold facts (recalled back automatically)\n├── logs/                  ← activity log (JSONL) + history\n├── voices/                ← Kokoro / Whisper model files\n├── screenshots/\n├── plugins/               ← auto-loaded custom tools\n├── PDFs/ · PPTX/ · XLSX/  ← generated documents, by type\n└── subagents/             ← per-worker transcripts\n```\n\nReads default to your whole disk (the assistant needs to know your machine). Writes, deletes, and moves are confined to the workspace unless you grant access to a folder. Set `JARVIS_LOCKDOWN=1`\n\nto confine reads to the workspace too.\n\n| Variable | Default | Purpose |\n|---|---|---|\n`LOCAL_API_BASE` |\nauto-detected | OpenAI-compatible endpoint |\n`LOCAL_API_KEY` |\n(none) | API key for the endpoint, if it needs one |\n`LOCAL_MODEL` |\nauto-detected | Override the served model id |\n`JARVIS_WORKSPACE` |\n`~/Jarvis` |\nWhere memory/logs/voices live |\n`JARVIS_LOCKDOWN` |\n`0` |\n`1` = confine reads to the workspace too |\n`JARVIS_AUTO_APPROVE` |\n`0` |\n`1` = skip risky-tool permission prompts |\n`JARVIS_EXTRA_WORKSPACES` |\n(none) | Extra paths writes are allowed in |\n`JARVIS_VOICE` |\n`am_michael` |\nKokoro voice id |\n`JARVIS_VOICE_SPEED` |\n`1.0` |\nTTS playback rate |\n`JARVIS_STT_DEVICE` |\nauto | force `cpu` or `cuda` for speech-to-text (auto-detects GPU when unset) |\n`JARVIS_WAKE_WORD` |\n(none) | If set, continuous listen only triggers on this prefix |\n`JARVIS_BUILTIN_PORT` |\n`1234` |\nPort for the bundled llama.cpp server |\n`JARVIS_COMPACT_AT` |\n`0.75` |\nAuto-compact context past this fraction |\n`JARVIS_NO_ONBOARDING` |\n`0` |\n`1` = skip the first-run setup |\n`HEARTH_PERSONA_NAME` |\n`JARVIS` |\nAssistant name |\n`HEARTH_PERSONA` |\n(none) | Tone overlay: `bro` / `chill` / `professional` / `formal` |\n`HEARTH_ALL_TOOLS` |\n`0` |\n`1` = load every tool up front instead of on demand |\n`HEARTH_NTFY_TOPIC` |\n(none) |\n|\n\n`HEARTH_*`\n\nand `JARVIS_*`\n\nprefixes are interchangeable.\n\n```\n/help                 full list\n/brain <provider>     switch brain: local, grok, gemini, openai, openrouter, custom (keys persist)\n/models, /model <n>   list / download / switch model (built-in server)\n/tools                list available tools\n/voice [on|off]       text-to-speech toggle; /stt <model> sets the whisper size\n/listen [on|off]      continuous voice input (/listen alone = one-shot)\n/think [on|off]       show/hide model reasoning\n/mem                  memory index; /curate merges duplicates\n/import-memory        pull your memory in from ChatGPT / Claude\n/context <n|auto>     set / auto-detect the context window; /tokens shows usage\n/compact              summarize old turns + extract facts to memory\n/agent <slug> \"...\"   dispatch a sub-agent; /jobs manages background ones\n/skill install <src>  install a skill from a GitHub repo\n/mcp                  MCP status / config\n/phone                Telegram / Discord / ntfy bridge status\n/migrate <hermes|openclaw>   import memory + skills from another agent\n/name <new>           rename the assistant; /learn re-scans your machine\n/allow <path>         grant write access to a folder; /lockdown confines reads\n/perms                show / reset cached tool permissions\n/update               check for and install the latest release\n/clear                wipe history (keep system prompt); /exit to quit\n```\n\nPlus `@<path>`\n\nto attach a file (text spliced inline, images sent to vision), arrow-key history, reverse search, and a multi-line input mode.\n\n**Text-to-speech (Kokoro):** ~80 MB ONNX model. Runs on CPU in real time, or offloads to your GPU via CUDA (NVIDIA) or DirectML (any GPU). The installer offers to download the model; pick a voice with `JARVIS_VOICE`\n\n.\n\n**Speech-to-text (faster-whisper):** the `base.en`\n\nmodel (~150 MB) auto-downloads on first `/listen on`\n\n. It auto-detects CUDA and uses the GPU when available, otherwise CPU. Use `/listen`\n\nfor one-shot or `/listen on`\n\nfor continuous mode with barge-in.\n\n**Does it need LM Studio?** No. Anything OpenAI-compatible works, Ollama, vLLM, llama.cpp, LocalAI, or the bundled llama.cpp server (`-BuiltinLLM`\n\n).\n\n**Can it use a cloud model?** Optionally. Set a cloud endpoint in Settings or via env vars. Local is the default; your files, voice, and memory stay local either way.\n\n**Is anything sent to the cloud?** Only web search/fetch (DuckDuckGo), and only when the model invokes them. No telemetry.\n\n**Will it touch my files unexpectedly?** Writes are confined to the workspace by default and risky tools prompt for permission the first time per session. `JARVIS_AUTO_APPROVE=1`\n\nremoves the prompts.\n\n**Does it work offline?** Yes, except web search/fetch.\n\n**Why \"Hearth\"?** It's the framework, the warm center of the machine. The default character is JARVIS, but personas, voices, and models are all swappable.\n\nGood first PRs: POSIX ports of the Windows-specific tools in [ hearth/tools.py](/0pen-Sourcer/Hearth/blob/main/hearth/tools.py), more voice presets in\n\n[, and new tools (one function plus a definition in](/0pen-Sourcer/Hearth/blob/main/hearth/voice.py)\n\n`hearth/voice.py`\n\n`TOOL_DEFINITIONS`\n\n). See [CONTRIBUTING.md](/0pen-Sourcer/Hearth/blob/main/CONTRIBUTING.md).\n\nHearth runs on your machine and **collects nothing**, no account, no telemetry, no analytics, no server the author operates. Your files, prompts, and memory stay local.\n\nThe only things that ever leave your computer are ones **you** turn on, and they go to the service *you* chose, not to us:\n\n- a\n**cloud model**, if you point the brain at one (Gemini/OpenAI/Grok/OpenRouter/Anthropic/Custom), then your prompt goes to that provider; **web search / fetch**(DuckDuckGo), when the model looks something up;** ntfy**push and the** Telegram**bridge, if you configure them;** email**, if you set up the optional IMAP/SMTP tool.\n\nAll of those are off by default. Run against a local model with none of them configured and Hearth is fully offline. Because it's a local, no-data-collection tool, there's no privacy policy or terms to agree to, and the [MIT license](/0pen-Sourcer/Hearth/blob/main/LICENSE) is the warranty/liability disclaimer.\n\nHearth is free and MIT-licensed, built by one developer. If it's useful to you, a ⭐ is the biggest help, it's how other people find the project. If you'd like to go further, sponsorship options are in [docs/SUPPORT.md](/0pen-Sourcer/Hearth/blob/main/docs/SUPPORT.md).\n\n[MIT](/0pen-Sourcer/Hearth/blob/main/LICENSE) © [@0pen-sourcer](https://github.com/0pen-sourcer).\n\n[Kokoro TTS](https://github.com/thewh1teagle/kokoro-onnx), text-to-speech[faster-whisper](https://github.com/SYSTRAN/faster-whisper), speech-to-text[LM Studio](https://lmstudio.ai), local LLM runner[Model Context Protocol](https://modelcontextprotocol.io), tool interop", "url": "https://wpnews.pro/news/show-hn-hearth-an-open-source-local-ai-that-runs-your-pc-files-apps-voice", "canonical_source": "https://github.com/0pen-Sourcer/Hearth", "published_at": "2026-07-17 13:34:04+00:00", "updated_at": "2026-07-17 13:51:20.410452+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-tools", "ai-products", "ai-agents"], "entities": ["Hearth", "JARVIS", "LibreChat", "Open WebUI", "Aider", "Cline", "Continue", "Open Interpreter"], "alternates": {"html": "https://wpnews.pro/news/show-hn-hearth-an-open-source-local-ai-that-runs-your-pc-files-apps-voice", "markdown": "https://wpnews.pro/news/show-hn-hearth-an-open-source-local-ai-that-runs-your-pc-files-apps-voice.md", "text": "https://wpnews.pro/news/show-hn-hearth-an-open-source-local-ai-that-runs-your-pc-files-apps-voice.txt", "jsonld": "https://wpnews.pro/news/show-hn-hearth-an-open-source-local-ai-that-runs-your-pc-files-apps-voice.jsonld"}}