A markdown editor for macOS, built for working alongside AI.
I built this because I was frustrated with every other markdown editor — too expensive, too slow, too bloated, or too buggy. I just wanted three panes, no cloud, no account, no subscription. A clean editor, a live preview, and a file browser that stays out of your way.
Then it became something more. I work with AI coding tools daily — Claude Code, Copilot, Cursor — and they all write to files on my behalf. Every other editor treats that as an error condition. SideMark treats it as the primary workflow. When an AI tool edits your file while you're working in it, SideMark merges both sets of changes automatically. When they collide, you pick which lines to keep. No lost work, no surprises.
Grab the latest .dmg from GitHub Releases. Open it, drag to Applications, done.
Signed and notarized with Apple — no Gatekeeper warnings. macOS 12+ required. Apple Silicon supported.
Most markdown editors assume a single author. SideMark assumes two.
If you work with AI coding tools — Claude Code, Copilot, Cursor, or anything that writes to files on your behalf — these features exist because of that workflow:
Three-way merge. When you're editing a file and an external tool writes to it at the same time, the editor compares both sets of changes against the last known version. If you edited different parts of the file, both changes merge automatically — no dialog, no interruption. If you collide on the same lines, an interactive diff view lets you accept or reject each change individually, hunk by hunk.
Change notifications. When an external merge succeeds silently, a toast notification tells you what happened — so you always know when your file was touched by something outside the editor.
Git gutter markers. Green, blue, and red indicators in the editor gutter show added, modified, and deleted lines compared to the last git commit. After an external tool edits your file, you see exactly which lines changed at a glance.
Copy with context. One-click copy of file contents with the file path and line numbers prepended — designed for pasting into AI chat windows. Select text and hit ⌘⌥C to get // /path/to/file.md:L14-L27 followed by your selection. No selection copies the full file with path. Also available via right-click context menu, toolbar button, and Edit menu.
Auto-save. Keep your files continuously saved so external tools always read your latest version. Configurable delay (1-10 seconds), toggle on/off in Settings.
File deletion detection. If an external tool deletes a file you have open, you're prompted to close the tab or re-save the file to disk.
| Editor | CodeMirror 6 with markdown syntax highlighting, formatting toolbar with smart toggle detection, heading cycling, multi-line list handling, and full keyboard shortcuts (⌘B, ⌘I, ⌘K, etc.). Search and replace with case sensitivity and match navigation. Per-tab undo history. Git gutter markers for change tracking. |
| Live Preview | GitHub Flavored Markdown in real time. Bidirectional scroll sync. Local and remote images inline. Task list checkboxes. Clickable links — .md files open in a new tab, external links open in your browser. |
| Focus Mode | Distraction-free fullscreen editing. Just the toolbar and editor, centered at a comfortable column width. Auto-saves in the background. ESC or ⌘W to return. Via right-click tab menu or ⌘⇧F. |
| File Browser | Expandable directory tree with auto-refresh. Context menu: new file, new folder, rename, delete (trash), show in Finder, copy path, favorites, find in folder. |
| Favorites | Pin files and folders for quick access. Drag-and-drop reordering. Stale path detection for unmounted drives. |
| Tabs | Dirty indicators, per-tab scroll/cursor restore, context menu (show in Finder, copy path, close, close others, close to right, focus mode). Auto-scrolls to keep active tab visible. |
| Auto-Save | Optional, with configurable delay (1-10s). Toggle in Settings. Keeps files synced for external tool collaboration. |
| Export | File > Export As > PDF or HTML. Clean light-theme styling with inline CSS, no dependencies. |
| Session Restore | Tabs, active tab, folder, and window bounds persist across restarts. Multi-window support (⌘⇧N). Flush-on-quit ensures no session loss during updates. |
| Customization | Dark, light, or system themes. 7 accent colors. Editor font (SF Mono, Menlo, Monaco, Courier New, Andale Mono), preview font (Helvetica Neue, Georgia, Palatino, Avenir Next, Charter), font size, line numbers, resizable panes. |
| File Associations | Registers for .md, .markdown, .mdown, .mkd, .mkdn, .mdwn, .mdx, .txt. Shows in Finder's "Open With". |
| Auto-Updates | Checks every 4 hours. Background download. One-click "Restart & Install" with release notes. |
These are already built and shipping — the details that turn "clever idea" into "this person thought through every edge case":
Save Mine as New File. During merge conflicts, you can fork your version to a new file while accepting the AI's changes in the original. A power-user escape hatch for the worst case.
Smart hunk grouping. When the AI changes a heading and its body text, the diff resolver groups them into one logical decision instead of making you accept/reject each line individually.
Copy full file with path (⌘⌥C). With a selection, copies your text prefixed with file path and line numbers. With no selection, copies the entire file with the path header — the "paste this whole file into Claude" shortcut.
Configurable auto-save delay. Not just on/off — a knob from 1 to 10 seconds. 1-second save means the AI always reads your latest. 10-second save gives you a buffer to change your mind.
Multi-window with independent sessions. Each window remembers its own open files, tabs, and state. Open one window for docs and another for code notes.
Find in Folder (⌘⇧G). Project-wide search with case sensitivity. Results grouped by file with context lines.
No cloud sync. No real-time collaboration. No plugin system. No Vim mode. No WYSIWYG. No proprietary format. No account creation. No subscription. No telemetry.
Your files are plain markdown on disk. Open them with anything, anywhere, forever.
This app underwent an adversarial security review with comprehensive hardening:
- XSS prevention — DOMPurify sanitizes all markdown before rendering in the preview pane
- Sandbox enabled — Chromium sandbox and context isolation enforced on all windows
- Filesystem access control — Path validation limits access to home directory and /Volumes; sensitive directories (.ssh, .gnupg, .aws) blocked
- Path traversal protection —
local-resource://protocol restricted to image file extensions - URL scheme allowlisting —
shell.openExternallimited to https://, http://, mailto: - Content Security Policy — Tightened CSP on settings and update dialogs
- No network calls — except auto-update checks to GitHub Releases
Download the .dmg from Releases, open it, drag to Applications.
cd simple_markdown_editor
npm install
npm run dev| Command | Description |
|---|---|
npm run dev |
Development mode with hot reload |
npm run build |
Production build |
npm run release |
Signed build + GitHub release |
Release builds require Apple Developer ID credentials (APPLE_ID, APPLE_APP_SPECIFIC_PASSWORD, APPLE_TEAM_ID) for code signing and notarization.
| Layer | Technology |
|---|---|
| Framework | Electron 33 |
| UI | React 18 |
| Editor | CodeMirror 6 |
| Markdown | marked (GitHub Flavored Markdown) |
| Build | Vite 6 + electron-builder |
| Security | DOMPurify, sandbox, CSP |
| File Watching | chokidar |
| Diffing | diff (three-way merge, git gutter) |
| Updates | electron-updater (GitHub Releases) |
| Language | JavaScript (TypeScript migration planned) |
The application source lives in simple_markdown_editor/. The outer repository holds project-level files (README, license, changelog, roadmap).
.
├── README.md
├── LICENSE
├── CHANGELOG.md
├── ROADMAP.md
├── Architecture.md
└── simple_markdown_editor/
├── package.json
├── vite.config.js
├── electron-builder.config.js
├── build/ # App icon and entitlements
├── scripts/ # Icon generation and release scripts
└── src/
├── main/ # Electron main process (window lifecycle, IPC, file I/O)
├── renderer/ # React UI (editor, preview, file browser, tabs, toolbar)
├── settings/ # Settings overlay
└── update-dialog/ # Auto-update UI
This is a personal project built for my own use, but contributions are welcome. Open an issue first if you're planning something big.





