Open-source · macOS · Windows · Linux

Read anything.
Write anywhere.

A desktop app with a live reader on the left and a real WYSIWYG Markdown editor on the right — and AI that turns what you're reading into a first draft.

Read a paper, a GitHub repo, a PDF, or an EPUB. Snip a region straight into your notes. Polish, translate, or generate long-form drafts — using the AI subscription you already pay for.

MIT-licensed · Built with Electron, React, Milkdown & CodeMirror

My Notes — Workspace ◆ arxiv.org/abs… repo ✂ snip Attention Is All You Need figure / diagram # Notes on Transformers ![](images/snip-01.png) ✶ Generate from reader · Claude Code streaming… 1,284
Why it exists

One window for read-and-write work

Reading a paper to write about it, turning a tutorial into notes, browsing a repo to draft a post — that work fits neither a browser tab nor a notes app.

Browser-only

You screenshot, alt-tab, paste, repeat. Nothing remembers what you were reading, and your draft lives somewhere else entirely.

Notes-only

Obsidian, Notion, Bear… the source material is in another window. Pasting a URL is a sad substitute for having it next to what you're writing.

ReadWrite

A live reader on the left, an editor on the right, a snip tool that drops region screenshots straight into your doc as a relative-path image — and AI that can read what's in the reader and draft something for you on the right.

What's inside

Everything in two panes

📖

A reader that handles real sites

Multi-tab, four kinds of source, all in one pane:

  • Web & GitHub repos via a real Chromium view — cookies, logins, and sites that block iframes just work.
  • PDF with continuous scroll & zoom.
  • EPUB with per-tab location memory.
  • Local code folders with a live, hot-refreshing file tree.
✂️

Region snip → straight into the doc

Hit ⇧⌘S (or Ctrl+Shift+S), drag a rectangle, and the cropped PNG is saved to the doc's images/ folder and inserted as a relative-path Markdown reference. Native capture — instant, no external tool.

✍️

A real WYSIWYG editor

Milkdown 7 with GFM, history, and slash commands — one click to a CodeMirror source view sharing the same buffer. Paste any image and it auto-saves locally. Autosave keeps references relative, so moving a folder never breaks anything.

🗂️

Workspaces are just folders

Each document is its own subfolder with its .md and an images/ directory. Switch workspaces from the title bar — each remembers its own open tabs, recent items, and last document. iCloud-friendly default path on macOS.

📤

Publish where you actually post

One-click copy to WeChat 公众号 with per-element inline styles and base64-embedded images (three themes), direct publish to a WeChat draft, or copy as inlined HTML for email and Notion.

🔒

Local-first & private

Your files stay plain Markdown on disk. API keys and the WeChat secret are encrypted with the OS keychain (Electron safeStorage), never in plaintext. AI text goes only to the endpoint you configure.

The non-obvious part

AI, two ways

Short edits go over an API. Long-form drafts run through the AI CLI you already have installed — using the seat you already pay for.

Inline actions · API

Polish · Translate · Summarize · Explain

Short, in-place edits over any OpenAI-compatible endpoint — OpenAI, Anthropic, Google, DeepSeek, Moonshot, Azure, local Ollama. Every change opens a Cursor-style diff: Accept / Reject / Regenerate. Nothing touches your text until you say so.

Generate from reader · local CLI

Long-form drafts from what you're reading

Reads the active reader tab, then asks your local Claude Code / Codex / Gemini / OpenCode CLI to draft a Markdown artifact — no extra API key, no extra subscription. Pick a writing style × template, watch it stream in, route to a new doc / append / replace.

The CLI runs in a no-tools / sandboxed mode, so prompt-injected reader content can't trick the model into reading your local files.

Get started

From zero to first draft

1

Install

Download a build for your platform below, or run from source with pnpm install && pnpm dev (Node ≥ 20, pnpm ≥ 9).

2

Pick a workspace folder

Any folder works. On macOS the default lives under iCloud Drive so your notes sync across devices automatically.

3

Open something to read

Press the + in the reader tab bar and paste a URL, a GitHub owner/repo shorthand, or open a local PDF / EPUB / code folder.

4

(Optional) Wire up your AI CLI

If you have one of these installed and authenticated, ReadWrite can use it for long-form generation — no extra key needed:

# check what you already have
which claude    # Anthropic Claude Code (recommended)
which codex     # OpenAI Codex
which gemini    # Google Gemini CLI
which opencode  # opencode.ai

# then in-app: Settings → AI → External AI CLI → Detect CLI
5

Read, snip, and write

Snip regions with ⇧⌘S, use inline AI actions on a selection, or hit Generate from reader to draft from the whole tab. Then copy to WeChat or export as HTML when you're done.

Read the full user guide ↗

Download

Free, open source, every platform

Grab the latest installer from GitHub Releases.

macOS
.dmg · Apple Silicon & Intel
Download
Windows
.exe installer
Download
Linux
.AppImage · .deb
Download

Builds aren't code-signed yet — on first launch macOS Gatekeeper / Windows SmartScreen may warn you. See the install notes to get past it.

FAQ

Good questions

Do I need to pay for AI to use ReadWrite?

No. The reader, editor, snip tool, workspaces, and publishing all work with zero AI configured. AI is optional. When you do want it, inline actions need an OpenAI-compatible API key, and long-form generation reuses a CLI subscription you already have (Claude Code, Codex, Gemini, OpenCode) — no separate key.

Where are my notes stored?

In a plain folder you choose — each document is a subfolder with a Markdown file and an images/ directory. No proprietary database for your content; it's all files you can sync, back up, or open in any other editor.

Is my data sent anywhere?

Only when you trigger an AI action, and only to the endpoint or CLI you configured. API keys are encrypted in the OS keychain, never stored in plaintext. There's no telemetry baked into the app.

Why does the web reader work where iframes fail?

It uses Electron's WebContentsView — a real Chromium tab layered above the app — instead of an iframe or the deprecated <webview>. That's why authenticated sites and sites that send X-Frame-Options: DENY render correctly.

Which platform is most stable?

macOS is the most-used and most-tested path. Windows and Linux are built by CI on every release but get less manual QA. This is early-stage open source — bug reports and PRs are very welcome.

Can I contribute?

Yes. The project is MIT-licensed. See CONTRIBUTING.md — branch off main, use Conventional Commits, and make sure pnpm typecheck && pnpm lint && pnpm test && pnpm build passes.