Notepad++ for the Mac — an HTML interface wrapped in Python.
Ships as three editions from one codebase (./build_app.sh builds all):
| Notepad-- (classic) | Notepad-- Plus | Notepad-- AI | |
|---|---|---|---|
| Entry point | python3 app.py --classic |
python3 app.py --plus |
python3 app.py |
| Tabs, syntax, find/replace, session restore, Run console | ✅ | ✅ | ✅ |
| PDF viewing + annotation | — | ✅ | ✅ |
| Apple Notes integration | — | ✅ | ✅ |
| Decide panel (Claude-powered decision briefs) | — | — | ✅ |
Classic stays true to Notepad++; Plus is everything we've built minus the AI; AI is the fully evolved edition. Each keeps its own session, so tabs never leak between them.
A lightweight, classic-Notepad++-style text editor. The UI is HTML/CSS/JS (with CodeMirror for editing) rendered inside a native macOS window via pywebview, which uses the system WKWebView — so there's no bundled browser and the app stays small.
- Tabs — open many files at once; middle-click or ✕ to close; red/blue dot shows unsaved/saved state (like Notepad++'s floppy icons)
- Session restore — quit any time; your tabs and unsaved text come back
exactly as you left them, Notepad++ style (stored in
~/Library/Application Support/Notepad--/session.json) - Syntax highlighting — Python, JavaScript, JSON, HTML, CSS, XML, Markdown, C/C++/Java, Shell, SQL, YAML; auto-detected by file extension, switchable from the Language menu
- Find & Replace — with match-case and regular expressions
(including
$1capture groups in replacements), live match highlighting and match counts, wrap-around search - Find in Files — ⇧⌘F greps a whole folder (binary files and the usual junk dirs skipped) into a results panel; click any hit to jump straight to that file and line
- Line operations — duplicate (⌘D), move up/down (⌥⌘↑/↓), delete (⇧⌘K), join (⌘J), sort, UPPERCASE/lowercase, and comment/uncomment (⌘/) aware of each language's comment syntax
- Multi-cursor editing — ⌘-click to add cursors, ⌥-drag for column/rectangle selection, and brackets/quotes auto-close as you type
- Markdown preview — ⇧⌘M splits the editor with a live rendered preview (headings, lists, code fences, quotes, links) for .md tabs
- Folder sidebar — File → Open Folder… puts a collapsible file tree beside the editor; click to open, drag its edge to resize
- Recent Files — the File menu remembers your last 15 files
- Tabs, continued — drag tabs to reorder them; ⌘1–⌘9 jumps to tab N; drop files from Finder anywhere on the window to open them
- Disk watching — if an open file changes on disk (a git pull, another editor), Notepad-- notices within seconds and offers to reload it
- The classics — line numbers, word wrap toggle, go-to-line, zoom, current-line highlight, bracket matching, line/column/selection status bar, Windows/Unix line-ending detection (preserved on save)
- Your work is protected — closing a tab with unsaved changes asks Save / Don't Save / Cancel; saving warns if another program changed the file on disk since you opened it; files keep their original encoding (UTF-8, UTF-8-BOM, ANSI) instead of being silently re-encoded
- Run scripts — ⌘R runs the current Python or shell file (saving it first if needed) with live stdout/stderr streaming into a console panel; ⇧⌘R runs any one-off shell command in the file's directory, with command history, a Stop button, and exit-code status — like Notepad++'s Run menu. The console is resizable (drag its edge) and docks to the bottom or the right side; size and position are remembered.
- PDF annotation — Highlight mode marks selected text; Note mode pins comments anywhere on a page. Annotations persist across sessions (stored alongside the app, the original PDF is untouched) and Export Annotated… saves a copy of the PDF with the highlights and notes drawn in.
- Decide (decision intelligence) — ⇧⌘A sends the open document to the
Claude API and streams back a decision brief: what's being decided, the
options with trade-offs, risks, a recommendation, and next actions. Ask
free-form questions about the document in the same panel. Works on text
tabs and PDFs (via extracted text). Provider-agnostic: use Claude
(Anthropic), OpenAI, or any OpenAI-compatible endpoint — including a
local Ollama server for fully offline, free analysis. Configure once
under Decide → AI Provider Settings (keys stored locally with 0600
permissions;
pip3 install anthropicand/oropenai). - Opens from Finder — the built app registers itself for text, code, and PDF files, so right-click → Open With → Notepad-- and setting it as the default app both work. Double-clicked files open whether the app is closed (launches with the file) or already running (the file lands in a new tab and the window comes to the front) — handled via the macOS open-documents Apple Event
- Skins — six looks under View → Skin: Classic (the Notepad++
default), Dark, Solarized Light, Solarized Dark, Monokai,
and Matrix (black and phosphor green, glow included). A skin restyles
the whole app — menus, toolbar, tabs, editor and syntax colors — and is
remembered across sessions. Skin: Custom… creates
~/Library/Application Support/Notepad--/custom-skin.csswhere you can override any palette variable to build your own - Decide, on a selection — Decide → Analyze Selection sends just the highlighted text instead of the whole document
- Apple Notes — File → Open Apple Note… lists your notes (filter-as- you-type), opens one as a tab, and ⌘S saves your edits back into Apple Notes; Send Tab to Apple Notes turns any tab into a new note. Uses macOS automation — the first use asks permission to control Notes. Formatting is flattened to plain text while editing (lists become "- item" lines); Save As to a file detaches the tab from Notes.
- PDF viewing — open a
.pdfand it renders in a read-only tab (PDF.js, vendored, works offline): page navigation, zoom/fit-width, ⌘L go-to-page, text selection, and ⌘F search with highlighting across pages. File → Open PDF as Text (or the Open as Text button) extracts all the text into a normal editable tab. PDF tabs restore with your last page and zoom, like everything else.
pip3 install -r requirements.txt
python3 app.py./build_app.shThis produces dist/Notepad--.app — drag it into Applications and pin it
to your Dock. (Requires Python 3 from python.org or Homebrew; the script
installs pyinstaller automatically.)
| Action | Shortcut |
|---|---|
| New / Open / Save / Save As | ⌘N / ⌘O / ⌘S / ⇧⌘S |
| Close tab | ⌘W |
| Find / Replace | ⌘F / ⌥⌘F |
| Find next / previous | ⌘G / ⇧⌘G |
| Go to line | ⌘L |
| Zoom in / out / reset | ⌘+ / ⌘− / ⌘0 |
Note: because unsaved text is always preserved in the session, closing the window never loses work — just like Notepad++.
Known caveat: macOS may bind ⌘W to "close window" at the native menu level before the app sees it. If that happens, your tabs are restored on relaunch.
app.py # Python shell: native window, file dialogs, disk I/O, session
ui/index.html # the interface
ui/css/style.css # classic Notepad++ styling
ui/js/app.js # tabs, find/replace, menus, session logic
ui/vendor/ # CodeMirror 5 + PDF.js (vendored, no network needed)
build_app.sh # makes dist/Notepad--.app with PyInstaller
ui/index.html also runs in a plain browser (demo mode with limited file
access) — handy for UI development.
