Releases: everettjf/readwrite
Releases · everettjf/readwrite
Release list
ReadWrite v0.1.11
Fixed
- build: exclude release/ from app.asar to prevent bundle bloat (2a448f6)
ReadWrite v0.1.10
Added
- layout: center editor content across editor + sidebar (ee73426)
- ai: rewrite tech blog template as What → How → Why narrative (5e165f9)
- reader: preserve links and images as Markdown when extracting article text (9666ec4)
- sidebar: make docs list sort selectable (modified / created / name) (82cad59)
- ai: allow minimizing Generate from reader while generation continues (0039a74)
Fixed
ReadWrite v0.1.9
Added
- reader: add user-editable Quick Links on empty state (4648a48)
ReadWrite v0.1.8
Fixed
- main: don't re-register IPC handlers on macOS activate (832334f)
ReadWrite v0.1.7
Fixed
- secrets: discard unreadable safeStorage ciphertext on read (2aaeff4)
ReadWrite v0.1.6
Added
- reader: floating selection toolbar across all readers (PDF / EPUB / Code / Web). Select a passage in the reader pane and a small toolbar appears above the selection with one-click Summarize → notes, Translate → notes, Interpret…, and Custom… actions — each one feeds the selected text into the existing AIInterpretDialog so the result lands directly in the note you're writing. (8ffadaa)
- reader/pdf: PDFs now have a real text layer overlaid on the canvas, so passages are selectable (and feed the new toolbar). Re-renders cleanly on zoom; the text layer is torn down on unmount so the toolbar never lingers across reader switches. (8ffadaa)
- shortcut:
⌘⇧A/Ctrl+Shift+Aopens the AI dialog with the current reader selection pre-filled and an empty prompt, for free-form chat against the passage without going through the toolbar. (8ffadaa) - i18n: zh/en strings for the new selection toolbar and its default prompts. (8ffadaa)
Changed
- ai/interpret-dialog: reworked to also accept reader-side selections as input, not just editor selections — the dialog is now the single AI surface for both panes. (8ffadaa)
ReadWrite v0.1.5
Fixed
- ci: tighten release asset filter to ReadWrite-* (e5c5550)
ReadWrite v0.1.4
Fixed
- ci: pass --publish=never to electron-builder (331ced1)
ReadWrite v0.1.1
ReadWrite v0.1.0
The first published release of ReadWrite — a side-by-side reader + Markdown editor with workspaces, screenshots, AI actions, and WeChat 公众号 publishing.
Highlights
- Workspace model — pick or create a folder; every document lives inside as its own subfolder with a
<name>.mdplus animages/directory. Move the folder anywhere; relative-path image refs travel with the doc. - Multi-tab reader for the web (real Chromium via
WebContentsView, so cookies / CSP /X-Frame-Options: DENYsites all work), GitHub (owner/reposhorthand), PDFs, EPUBs, and local code folders. - Milkdown WYSIWYG editor with a one-click toggle to a full CodeMirror 6 source mode that shares the same buffer. Autosave with a configurable debounce.
- Region-snip tool (⇧⌘S / Ctrl+Shift+S): drag a rectangle on any reader pane, the cropped PNG goes to the clipboard and into the doc's
images/folder, with a relative-path Markdown link inserted automatically. - AI actions (OpenAI-compatible endpoint, BYO key): Polish selection / whole document, Translate selection or document to English / 中文, Summarize, Explain, plus an Interpret dialog with a custom prompt. API keys live in the OS keychain via Electron's
safeStorage. - Copy to WeChat 公众号 with three style themes — produces self-contained HTML (per-element inline styles, no
<style>tag, base64-embedded images, the<li>-children-wrapped-in-<p>quirk) that survives a paste into mp.weixin.qq.com unchanged. - Direct publish to WeChat: upload all images, create a draft, and (optionally) push it to followers — all without leaving the editor.
Detailed feature list
Workspaces (Obsidian-style)
- Mandatory workspace concept. The first-launch onboarding offers three paths: create a new workspace, open an existing folder, or pick from recent ones.
- iCloud-friendly defaults — on macOS, the picker suggests iCloud Drive ahead of
~/Documentsso notes sync across your Macs by default. - Multiple workspaces, switchable from a title-bar dropdown or
Settings → Workspaces. Cross-window sync via aworkspace:active-changedbroadcast keeps the main and Settings windows in sync. - Per-workspace last-doc memory: the document you were editing reopens automatically on next launch, per workspace.
- Settings → Workspaces panel: list, switch, reveal-in-Finder, forget. "Forget" only removes the entry from the known list — the folder on disk is preserved.
Documents
- Folder-per-document model —
<name>.md+images/per doc. - New / Open / Rename buttons in the title bar. Rename atomically renames both the folder and the .md; relative image refs keep working.
- Path transforms at the I/O boundary: in-memory editor content carries
file://image URLs (so the WYSIWYG view actually renders them), but on save they're rewritten to relative paths so the on-disk markdown is portable. - Autosave (default 1.5 s debounce, configurable) — first edit on the welcome doc lazily creates the folder.
- Workspace docs sidebar (toggleable) listing every document, sorted by last modified, with search filter and per-doc Rename / Reveal in Finder / Move to Trash. Auto-refreshes when the workspace folder changes on disk (Finder, iCloud, Git pulls).
- Move to Trash uses
shell.trashItemso docs go to the system Trash and can be restored.
Reader
- Web / GitHub tabs render in a native Electron
WebContentsView(not iframe) so cookies, CSP, andX-Frame-Options: DENYsites Just Work. - PDF via
pdfjs-distwith page nav and zoom. - EPUB via
epubjs+react-reader, with location persisted per tab. - Local code folder via Monaco (read-only) + a
chokidar-driven file tree that hot-refreshes on disk changes.
Editor
- Milkdown 7.x with commonmark + GFM + history + listener + clipboard + upload presets.
- CodeMirror 6 source-mode toggle that shares the buffer.
- Live editor font / family / max-width controlled by CSS variables driven from settings.
- Pasted/dropped images are auto-saved to the doc's
images/folder via@milkdown/plugin-upload, then inserted as a relative Markdown link.
Snip
- Title-bar Crop button (also ⇧⌘S / Ctrl+Shift+S) freezes the reader pane, lets you drag a rectangle, and routes the cropped PNG to clipboard + disk + editor in one motion. For web tabs the native
WebContentsViewis briefly hidden so the renderer-side overlay can be drawn on top, then restored automatically.
AI
- OpenAI-compatible endpoint configurable in Settings → AI. Works with OpenAI, DeepSeek, Moonshot, Azure OpenAI, Ollama (local), etc.
- Connection test in Settings issues a real chat-completions request.
- Editor-toolbar AI menu with Polish (selection / doc), Translate (selection / doc → English / 中文), Summarize, Explain, and Interpret-with-prompt actions.
- Interpret dialog accepts a custom prompt (with quick-pick chips for common ones), then lets the user review and choose where to insert the response.
- AI requests route through the main process; the API key never leaves the renderer's network panel.
WeChat 公众号
- Settings → WeChat: AppID + AppSecret with a credential-verification button that hits the real
cgi-bin/tokenendpoint. - Editor toolbar → Export → Copy to WeChat 公众号: three themes (Default sans, Serif, Compact). Inline-styled HTML, base64-embedded images.
- Editor toolbar → Export → Publish draft to WeChat 公众号: uploads every inline image to WeChat's permanent media endpoint, replaces
data:URLs withmmbiz.qpic.cnURLs, uploads the cover separately forthumb_media_id, and POSTs the article to/cgi-bin/draft/add. Access tokens are cached for 7200s. - A "Publish to followers" button on the draft success state calls
/cgi-bin/freepublish/submitto push the article live without round-tripping through mp.weixin.qq.com.
Security
- AI API key and WeChat AppSecret are encrypted at rest via Electron's
safeStorage(macOS Keychain, Windows DPAPI, Linux libsecret). The renderer never sees ciphertext; the main process decrypts on demand. Existing plaintext values from older installs auto-migrate on first launch.
Build & release
electron-builderconfiguration for macOS (.dmg), Windows (NSIS), Linux (AppImage +.deb).deploy.shscript for local cross-platform packaging and tag-triggered CI release..github/workflows/release.yml: tag-triggered three-OS matrix that builds all three platforms natively and publishes a GitHub Release with the binaries attached. Release notes are auto-extracted from this CHANGELOG.- v0.1.0 binaries ship unsigned — macOS users open with right-click → Open the first time; Windows users see SmartScreen warnings.
Tooling
- TypeScript strict across all three processes.
- ESLint + Prettier + Husky + lint-staged + commitlint (Conventional Commits) on every commit.
- Vitest for unit tests; GitHub Actions CI runs typecheck + lint + test on every PR plus a cross-platform build.
Acknowledgements
- The "Copy to WeChat 公众号" pipeline borrowed the per-element inline-styles approach and the
<li>-children-wrapped-in-<p>quirk directly from Spute/obsidian-copy-to-mp. - Milkdown, CodeMirror, pdfjs-dist, epubjs, shadcn/ui, Radix UI.