A local-first AI chat and story-writing studio for Windows, macOS and Linux. Website & download
OpenPlot AI is a desktop application built on Electron, React and SQLite. It connects to any AI provider — OpenAI, Anthropic, OpenRouter, Groq, Ollama, LM Studio, or any OpenAI-compatible /v1 endpoint — and combines the conversation with a structured writing environment: a story bible, an outline board, chapters, writing statistics and long-term memory. All data is stored locally. There is no account, no cloud service and no telemetry.
The project was formerly known as InkWell.
Chat — streaming replies, reasoning display, agent tools, reply styles, attachment chips, prompt library (/), @-mentions and per-message token counts.
Reply styles — pick how the assistant writes (Concise, Editorial, Empathetic, …) straight from the composer; edit or add your own in Settings.
Zen mode — the header and composer dim while you read or write; Esc brings everything back. The sidebar slides away too, for a full-width chat.
Story bible — worlds, locations, characters, items and lore with tags, search and cross-links.
Chapters — a per-project editor with statuses, word counts and version history.
Story flow — a three-act outline board that can be linked to chapters.
Statistics — daily goals, streaks, a 90-day activity heatmap and per-project progress.
Themes — ten themes and ten accent colors, with English and Bahasa Indonesia interface languages.
Chat
- Multi-provider, multi-model. Any model from any connected provider can be selected per chat.
- Streaming responses with a reasoning/thinking display (Anthropic extended thinking, DeepSeek-style
reasoning,<think>tags). - Reply styles — builtin personas (Default, Concise, Explanatory, Editorial, Empathetic, Formal) injected as a system fragment; pick one in the composer, edit builtins or add custom styles in Settings → Styles.
- Attachments as chips — attach files (or drag & drop them onto the chat), and drag story-bible entries or chapters straight from their views; they ride in the model context without polluting the composer text.
- Token accounting — prompt/completion tokens are captured from the provider when reported (estimated otherwise) and shown per message; Settings → Usage summarizes per model and per chat.
- Pinned chats — pin conversations to keep them at the top of the sidebar; Zen mode and a hideable sidebar for a distraction-free workspace.
- Agent tools: the model can save memories, read the whole story bible in one call, append to chapters, list/read projects, and create, update and search story entries and chapters directly.
- Prompt library with
/templates and{placeholder}substitution. - @-mentions that expand story-bible entries and chapters into the model context.
- Edit and resend, regenerate, delete, and export a conversation to Markdown.
- A context guard trims the oldest turns from the request when a chat exceeds the configured model context window. Nothing is deleted from the transcript.
- Per-chat overrides: system prompt, temperature, max tokens, top-p, thinking budget, tools and memory toggles, project binding.
Writing tools
- Story bible entries with tags and links, full-text search, and per-category counts.
- Chapters with draft/revising/done status, reading-order reordering, focus mode, and a scene board per chapter.
- Default skills shipped with the app (Continuity Guardian, Prose Polisher, Dialogue Coach, Pacing Analyst) — editable, deletable, and extensible with your own.
- Chapter version history: snapshots are taken on save, before an AI reply is appended, and before a restore. Any snapshot can be restored or deleted (last 30 kept per chapter).
- One-click AI actions on the open chapter: continue writing, critique, beat outline.
- Writing statistics: daily goal with progress bar, current and best streak, weekly totals, 90-day heatmap, and per-project stakes (1–10) with an AI arc analysis.
Export
- Whole-project export to Markdown, plain-text manuscript, or EPUB (assembled in the main process, no external dependencies) with author and language metadata from Settings.
- Per-chat Markdown export.
Organization
- Projects bind chats, story bible, chapters and statistics together.
- Collapsible folders for chats, full-text chat search, command palette (
Ctrl/Cmd+K).
Extensibility
agent.mdinstructions injected into every chat.- Reply styles (builtin + custom), skill packs, sandboxed JavaScript plugins with lifecycle hooks, when/then automations, and an MCP server registry. See docs/PLUGIN_API.md.
Privacy and storage
- All data lives in a local SQLite database in the OS user-data directory.
- API keys are encrypted at rest with the OS credential vault (DPAPI, Keychain or libsecret) when available.
- Memories — manual and agent-saved — are visible and deletable in Settings; a single action clears all of them.
Prebuilt binaries for v1.1.1 are attached to the GitHub releases. Two packaging styles are provided for each platform:
- Full app — a single installer or self-contained file. Install (or run) and the app appears in the usual place for your system.
- Folder — a compressed archive containing the application directory. Extract it anywhere and run the binary inside; useful for portable setups and systems without installer permissions.
| Platform | Full app | Folder |
|---|---|---|
| Windows | OpenPlot.AI.Setup.1.1.1.exe (NSIS installer) |
OpenPlot.AI-1.1.1-win.zip |
| macOS | OpenPlot.AI-1.1.1-universal.dmg (universal) |
OpenPlot.AI-1.1.1-universal-mac.zip (universal) / OpenPlot.AI-1.1.1-arm64-mac.zip (Apple silicon) |
| Linux | OpenPlot.AI-1.1.1.AppImage |
openplot-ai-1.1.1.tar.gz |
The macOS disk image and the main macOS zip are universal binaries containing both Intel and Apple silicon builds; the arm64-mac.zip remains available for a smaller Apple silicon-only download. Older assets for v1.0.0, v1.0.1, v1.0.2 and v1.1.0 stay attached to their releases.
Releases are built automatically by GitHub Actions on tagged commits.
Requirements: Node.js 18 or newer and npm.
npm install # install dependencies
npm run dev # development (Vite + Electron, hot reload)
npm run typecheck # TypeScript, no emit
npm run build # build renderer and main process
npm start # run the built app
npm test # headless test suite (DB, engine, parsers, tools)
npm run test:e2e # + GUI end-to-end tests (boots vite + Electron)
npm run dist:win # Windows NSIS + zip
npm run dist:linux # Linux AppImage + tar.gz
npm run dist:mac # macOS dmg + zipDevTools do not open automatically in development; set OPENPLOT_DEVTOOLS=1 to enable them.
npm test runs every headless test in scripts/ (mock HTTP servers + temp
sqlite DB — no GUI, no network beyond localhost, no real API keys). It
auto-rebuilds dist-electron when electron/*.ts is newer than the build.
npm test # headless group (~10s)
npm run test:e2e # headless + GUI end-to-end groups
node scripts/run-all-tests.mjs --list # show all groups
node scripts/run-all-tests.mjs --include=e2e-attach # + tests for a RUNNING app (:9222)Groups: headless (default), e2e-local (boots its own vite + Electron in an
isolated profile), e2e-attach (drives an already-running dev app over CDP;
skipped with a notice when the app isn't running), and manual (touches the
real installed app / real profile / real API keys — never run automatically,
only via explicit --include=manual).
- Open Settings → AI Providers → Add provider.
- Set the base URL:
| Provider | Base URL |
|---|---|
| OpenAI | https://api.openai.com/v1 |
| Anthropic | https://api.anthropic.com/v1 |
| OpenRouter | https://openrouter.ai/api/v1 |
| Ollama | http://localhost:11434/v1 |
| LM Studio | http://localhost:1234/v1 |
| Groq | https://api.groq.com/openai/v1 |
- Paste the API key, run Fetch models, then select a model in the chat header.
Ollama and LM Studio need no API key. The key validator treats a 404 model not found response from the model list as a valid key, so hosted gateways that reject probe models are handled correctly.
| Shortcut | Action |
|---|---|
Ctrl/Cmd+N |
New chat |
Ctrl/Cmd+Shift+N |
New project |
Ctrl/Cmd+S |
Save the open chapter |
Ctrl/Cmd+K |
Command palette |
Ctrl/Cmd+, |
Settings |
Escape |
Exit focus mode / close menus |
The database is stored at the OS user-data path (%APPDATA%/openplot-ai on Windows, ~/Library/Application Support/openplot-ai on macOS, ~/.config/openplot-ai on Linux). Uninstalling the application does not remove the database. Settings → Data can reset everything, including memories, story content and chapters.
electron/ main process: database, AI engine, tools, plugins, IPC
src/ React renderer
components/ ChatView, StoryBibleView, ChaptersView, SettingsView, ...
docs/ plugin API reference, stress test notes, original README
scripts/ engine, GUI and end-to-end test scripts
MIT — Mahakam Moonlight Studio.







