A local-first LLM desktop chat app.
Pulse is a fast, elegant desktop chat application for interacting with large language models through OpenAI-compatible APIs. It runs entirely on your machine with all conversations, provider configurations, and custom tools stored locally in SQLite — no cloud dependency required.
Whether you're connecting to a local Ollama instance, an OpenRouter gateway, or any OpenAI-compatible endpoint, Pulse gives you a clean, distraction-free interface with powerful features like streaming responses, custom tool execution, and reasoning/thinking block support.
| Pulse | Pulse (Dark) |
|---|---|
![]() |
![]() |
- Local-first architecture — All data stored in a local SQLite database. Conversations, messages, provider configs, and tools never leave your machine.
- OpenAI-compatible API support — Connect to any OpenAI-compatible endpoint: local servers (Ollama, LM Studio, llama.cpp), OpenRouter, Together AI, and more.
- Streaming responses — Real-time token-by-token streaming with live rendering.
- Tool/function calling — The LLM can call tools during chat. Comes with built-in
web_search(DuckDuckGo) andfetch_urltools, plus the ability to create custom tools with arbitrary JavaScript handlers. - Reasoning/thinking block support — Collapsible reasoning blocks for models that output chain-of-thought or
<thinking>tags. - Custom tools — Define your own tools with JavaScript handlers. Execute arbitrary code, search the web, fetch URLs, or integrate with any API.
- Dark & light themes — Carefully crafted themes that adapt to your preference.
- Font customization — Choose from serif, sans-serif, or monospace fonts with adjustable sizes.
- Privacy-first — Your conversations and API keys stay on your machine. Nothing is uploaded to any third-party service.
| Layer | Technology |
|---|---|
| Framework | React 19 + TypeScript |
| Build tool | Vite 8 |
| Desktop wrapper | Electron 41 |
| Styling | Tailwind CSS 4 |
| Database | sql.js (SQLite in the browser) |
| Markdown rendering | react-markdown + rehype-katex + remark-math |
| Syntax highlighting | react-syntax-highlighter |
| Icons | Lucide React |
| Fonts | Fontsource (Inter, JetBrains Mono, Noto Serif) |
| Packaging | electron-builder |
- Node.js 18+ and npm
# Clone the repository
git clone https://github.com/suleiman/pulse.git
cd pulse
# Install dependencies
npm install
# Start development server
npm run devThis starts Vite, TypeScript watch, and Electron simultaneously. The app should open automatically.
# Type-check only
npm run typecheck
npm run build # General build
npm run build:macos # macOS DMG
npm run build:linux # Linux AppImage
npm run build:windows # Windows installerBuilt files go into dist/ (web) or release/ (desktop packages).
- Click Settings in the sidebar.
- Go to the LM Providers tab.
- Click Add Provider.
- Enter a name, API base URL, and API key.
- Save — the provider will appear in the provider selector.
- Select a provider from the dropdown in the sidebar.
- Type a message and press Enter.
- Responses stream in real-time with markdown and LaTeX rendering.
- Built-in tools (
web_search,fetch_url) can be toggled on/off in the Tools tab. - Custom tools can be created with the Add Tool button — define a name, description, JSON schema parameters, and a JavaScript handler function.
- Enabled tools are available to the model during chat and can be called automatically.
- Chat Settings: Adjust system prompt, font family, font size, and max tool calls per message.
- Profile: Configure your user identity and message style.
Licensed under the GNU GPLv3 license.

