Notepad++ reimagined for the modern web stack β powered by Monaco, Electron, an integrated terminal, local AI, a real source-control panel, language-server IntelliSense, draw.io structured diagrams, and a hand-drawn whiteboard.
π₯ Download β’ Quick Start β’ Features β’ Architecture β’ Roadmap β’ π Report a bug β’ β¨ Request a feature
Auto-update is broken for the 1.7.4 β 1.7.5/1.7.6 hop. The toolbar pill freezes at
Downloading 100%and the install never starts (electron-updater rejects our self-signed certificate's untrusted root). The fix is already shipping in 1.7.6 onwards β but the broken code is the one running on your machine, so the very next update has to be done by hand, this one time only.What to do:
- Download the latest installer: notepp-win-x64.exe
- Right-click the downloaded
.exeβRun as administrator(required so it can replace the existing install)- Let it overwrite your current installation
From 1.7.6 onward, in-app auto-update works normally again β this is a one-time manual step.
Note++ is what happens when you take the spirit of Notepad++ and rebuild it on a modern foundation. It's not trying to be another VS Code, and it's not trying to be a generic notepad β it sits comfortably in between: fast to launch, low-friction to use, with the editing power developers actually need day to day, plus a handful of opinionated extras you won't find anywhere else.
Under the hood it runs the same Monaco engine that powers VS Code, in a lightweight Electron shell, with an integrated xterm terminal (true PTY via node-pty), live preview for HTML and Markdown, Mermaid diagrams, an Excalidraw-powered hand-drawn whiteboard, draw.io structured diagrams (downloaded on demand, persists across upgrades), Language Server Protocol integration (Pyright for Python, click-to-install), a full Git source-control panel with inline diff gutter, a local AI assistant (Ollama with Agent mode + multi-turn chat + quick-action chips), per-file AES-256-GCM encryption, Compare (file & folder diff like Diff.Net / WinMerge), Recent Files, an external-change file watcher, silent auto-update with a polished progress window, and cloud session sync. Ships for Windows, macOS, and Linux.
Built for developers who want a snappy editor that does more than just edit text β not a full IDE, not a plain text box.
- Features
- Quick Start
- Tech Stack
- Project Structure
- Architecture
- Git Integration
- AI Assistant
- Language Server Protocol (LSP)
- draw.io Diagrams
- Encrypted Pad
- Whiteboard
- Compare (File & Folder Diff)
- Find / Replace / Mark / Find in Files
- Live Preview & Mermaid
- Auto-Update
- Keyboard Shortcuts
- Roadmap
- Contributing
- License
- Multi-tab editor powered by Monaco β the engine behind VS Code
- 50+ language syntax highlighters out of the box
- IntelliSense auto-complete for JavaScript, TypeScript, and friends
- Language Server Protocol β real diagnostics + hover + completion + go-to-definition for Python (Pyright); click-to-install pill in the status bar when the server isn't present
- Find / Replace / Mark / Find in Files β Notepad++-style search results panel, multi-colour persistent highlights, gutter+minimap markers update live as you type
- Inline git diff gutter β green/blue/red bars on every changed line vs
HEAD, updates as you edit - Persistent UI toggles β Word Wrap, Dark Mode, Zoom, Minimap, etc. survive a restart (saved to
settings.json) - Command Palette (
Ctrl+Shift+P) and Quick Open (Ctrl+P) - Bookmarks, breadcrumbs, minimap, word wrap toggles
- Recent Files menu (last 15, deduped, stale entries auto-pruned)
- External-change watcher β clean tabs auto-reload; dirty tabs ask first
- Snappy by default β no ligatures (
!=stays!=), no caret animations, no smooth scrolling, no inline color decorators
- Compare two files β side-by-side Monaco diff editor (or inline), syntax-highlighted, next/prev change navigation
- Compare two folders β side-by-side tree with
added Β· removed Β· differ Β· equalcolour coding (Diff.Net / WinMerge style) - Click a differing file row in the folder-diff β opens that file's diff in a new tab
- Right-click a tab β
Select for Compare, then on another tab βCompare with selected - Skips
node_modules / .git / dist / build / out / .next / .cache / .vscode / .idea / __pycache__ - See
DIFF.mdfor the design
- Auto-detected Git repos β opens any file and Note++ walks up for
.git - Source Control side panel (
Ctrl+Shift+G) β VS Code-style staging, commit, branches - Status-bar pill showing branch Β· ahead/behind Β· dirty count
- File-tree decorations β color-coded
M / A / D / R / U / ?badges on every changed file - Push, pull, sync, fetch with one click; respects your
pull.rebaseconfig - Branch switch + create from a dropdown menu
- Auto-refresh on window focus + after save + after every git op; background
git fetchevery 3 min
- One-click setup β clicking π€ detects Ollama, auto-starts the daemon, auto-downloads
qwen2.5-coder:1.5bif no models installed - Multi-turn chat β full conversation history; ask follow-ups, refine answers
- Agent mode β‘ β AI's reply replaces editor content via a Monaco diff editor preview: review, then Apply or Reject
- Quick-action chips β
β¨ PolishΒ·π§ RefactorΒ·π CommentsΒ·π§ͺ TestsΒ·π‘ ExplainΒ·π Memory AGENTS.mdsupport β vendor-neutral standard adopted by Cursor / Codex / Copilot / Cline / Codex / Jules / Gemini / Windsurf / Zed β auto-injected into the AI system prompt for any repo containing one.notepp/memory.mdβ Note++-specific per-project instructions, auto-loaded every turn- Multi-model picker β pick separate models for Chat vs Agent (e.g. fast
qwen2.5-coder:1.5bfor chat, beefierdeepseek-coder:6.7bfor agent) - Selection-aware β highlight a function β Agent β "convert to TypeScript"
- Streaming responses with token-by-token preview
- Action bar in chat mode: Insert at cursor / Replace selection / Append / Replace entire file
- Six recommended models from Ollama in the picker β Phi, Llama, Qwen, DeepSeek, Gemma
- Per-file encryption with a single profile-wide password
- AES-256-GCM + PBKDF2-SHA-256 (600 000 iterations) + gzip pre-compression
- Recovery key β Crockford base32, displayed once at setup, downloadable as JSON
- Auto-detect on open β encrypted files prompt for unlock, decrypt in memory, look like normal files
- Toolbar π to encrypt the active tab; π badge on the tab name; π status-bar indicator
- Standard JSON envelope on disk β versioned, inspectable, future-proof
- See
ENCRYPTION.mdfor the full threat model and design
- Excalidraw 0.18 in an iframe β same engine as excalidraw.com
- Rectangles, ellipses, diamonds, arrows, lines, freedraw, text, images, libraries, frames, laser pointer
- Save lifecycle matches text tabs β red dot on first edit,
Ctrl+Sprompts Save As for new tabs; session auto-save guards unsaved work against crashes .excalidrawfile format native support; opens raw Excalidraw exports too- v1 β v2 migration on load β old auto-backed whiteboards still open and migrate cleanly on first save
- Full draw.io editor in an iframe β pinned to v30.0.2, runs entirely offline (
stealth=1) - Downloaded on demand the first time you open a
.drawiofile or clickTools β Diagram (draw.io) β New Diagram(~40 MB, one-time) - Bundle persists across upgrades β lives in
userData, electron-updater leaves it untouched - Starter templates in
Tools β Diagram (draw.io) β From Template: Flowchart Β· Sequence Diagram Β· Class Diagram (UML) Β· Entity Relationship - Manual update check β
Tools β Diagram (draw.io) β Check for updatescompares the installed version to whatever Note++ has pinned
- Integrated terminal (xterm + true PTY via
node-pty) β proper resize, ANSI colours, full PowerShell/bash - File tree sidebar for fast navigation
- Live preview for HTML and Markdown (
Ctrl+Shift+V) β with zoom controls (Ctrl+Wheel) and a βΆ maximise button that hides the editor pane - Mermaid Live Editor for
.mmd/.mermaidfiles β auto-opens split pane, templates, SVG/PNG export, zoom - Run file with a single keystroke (
F5) - Cloud session sync β Google Drive, OneDrive, Dropbox
- Auto-save session β pick up exactly where you left off; encrypted tabs re-prompt unlock
- Auto-backup to a configurable location with version retention
- File-association double-click β open any
.txt / .md / .json / .html / .excalidraw / .drawio / β¦file with Note++ from Windows Explorer / macOS Finder / Linux file managers (deferred-flush IPC so the file always loads even if the renderer is still booting) - Auto-update β silent background download via
electron-updater; the toolbar pill on the right edge surfacesNew update available β Downloading X% β Click to update. Clicking opens a dedicated progress window with a success animation, then relaunches. Settings βCheck for Updates Automaticallyto disable.
- Code formatting β JSON, XML, language-aware
- Base64 encode / decode
- Regex tester with live matching
- Sort lines, remove duplicates, remove empty lines, case conversion
- Dark / light mode toggle with first-class theming for every panel and modal
- Zoom controls, configurable preferences, status bar with line/col/length/encoding/EOL/language
- About dialog with a clickable credit and live version info
Grab the latest installer for your OS from Releases:
Pick the right file for your OS β every link below resolves permanently to the latest release (no per-version URL maintenance):
| OS | Two options |
|---|---|
| Windows (x64) | π¦ Installer (.exe) Β· π Portable (.zip) |
| macOS | π Intel (.dmg) Β· π Apple Silicon (.dmg) |
| Linux (x64) | π§ Portable (.AppImage) Β· π§ Debian/Ubuntu (.deb) |
Filenames are version-less by design β the actual version is shown in the installer UI, the About dialog, and on the Releases page title. You'll also see a handful of *-mac.zip / *.blockmap / latest*.yml files in each release β those are auto-updater payloads, not for manual download.
Note++ registers itself as a handler for .txt, .md, .json, .html, .excalidraw, .drawio and friends β right-click any file β Open with Note++.
macOS first launch: builds are currently unsigned. Right-click β Open the first time to bypass Gatekeeper. Linux AppImage: on Ubuntu 24.04+ you may need
sudo apt install libfuse2t64.
# Prerequisites: Node.js 18+, Git, one of Windows / macOS / Linux
git clone https://github.com/YogeshPraj/Note-.git
cd Note-
npm install # auto-runs `npm run build:wb` via postinstall
npm start # or double-click launch.bat (Windows)npm run build # auto-detects current OS
# Or target a specific platform explicitly
npm run build:win # Windows β NSIS .exe
npm run build:msi # Windows β MSI installer
npm run build:mac # macOS β .dmg + .zip (x64 + arm64)
npm run build:linux # Linux β AppImage + .deb (x64)Cross-platform builds must run on the target OS (native modules like
node-ptycompile per-OS). The 3-OS GitHub Actions matrix handles this for releases β tag push β parallel builds onwindows-latest/macos-latest/ubuntu-latest.
| Layer | Technology |
|---|---|
| Runtime | Electron 32 (Node 20.18, Chromium 128) |
| Editor | Monaco Editor 0.45 |
| Markdown | marked v18 |
| Diagrams (hand) | Excalidraw 0.18 + React 18 (bundled via esbuild into iframe) |
| Diagrams (struct.) | draw.io v30 (downloaded on demand, served via drawio:// protocol) |
| Diagrams (mermaid) | Mermaid v11 |
| Inline git diff | diff (jsdiff) |
| LSP | Pyright (Python) via stdio JSON-RPC; custom client wired to Monaco |
| Terminal | xterm 5.3 + xterm-addon-fit + node-pty 1.1 (true PTY) |
| AI | Ollama (local LLM via HTTP at 127.0.0.1:11434) |
| Auto-update | electron-updater + GitHub provider |
| File diff | Monaco's built-in createDiffEditor |
| Folder diff | dir-compare (content-hash comparison, MIT) |
| Crypto | Web Crypto API β AES-256-GCM, PBKDF2-SHA-256, HKDF |
| Compression | Native CompressionStream / DecompressionStream |
| Bundler | esbuild 0.24 (only for the Excalidraw iframe app) |
| Security | contextIsolation: true, nodeIntegration: false |
| Node bridge | src/preload.js β window.electronAPI |
| Platforms | Windows Β· macOS (x64 + arm64) Β· Linux (AppImage + .deb) |
Note++/
βββ package.json β "main": "src/main.js"
βββ launch.bat β double-click to run
βββ build-whiteboard.js β esbuild script: bundles Excalidraw + copies fonts
βββ CLAUDE.md β Claude session context
βββ features/ β per-feature design specs
β βββ AGENT.md β AI agent-mode spec
β βββ DIFF.md β Compare (file + folder diff) spec
β βββ ENCRYPTION.md β encrypted-pad feature spec
β βββ GIT.md β git integration spec
β βββ LSP.md β language-server-protocol integration spec
β βββ ROADMAP.md β three-tier feature roadmap (Tier 1 / 2 / 3)
βββ tools/ β scratch / legacy artefacts not in the shipped app
βββ src/
βββ main.js β Electron main process (IPC, file dialogs, menus)
βββ preload.js β IPC bridge (window.electronAPI)
βββ index.html β Renderer entry point
βββ renderer.js β All UI logic (~6500 lines)
βββ style.css β All styles
βββ monaco-worker.js β Monaco web worker helper
βββ crypto.js β AES-GCM / PBKDF2 / HKDF / gzip (encrypted pad)
βββ git-service.js β Git CLI wrapper (main process)
βββ lsp-service.js β Main-process LSP subprocess manager + JSON-RPC framing
βββ lsp-client.js β Renderer-side bridge: Monaco providers β LSP requests
βββ drawio-service.js β On-demand download + extract for draw.io bundle
βββ drawio.html β draw.io iframe shell (postMessage broker)
βββ whiteboard.html β Excalidraw iframe shell
βββ whiteboard-app.jsx β React + Excalidraw entry (source)
βββ whiteboard.bundle.* β generated by esbuild (gitignored)
βββ excalidraw-fonts/ β generated, self-hosted fonts (gitignored)
βββ mermaid-live-view.htmlβ Mermaid Live Editor overlay
βββ updater.html β Auto-update progress + success window
βββ updater-preload.js β Strict preload for the updater window
βββ assets/ β SVG toolbar icons
βββ games/ β in-app HTML games (Dev Arcade)
Note++ follows Electron's recommended security model β contextIsolation is on, nodeIntegration is off. All filesystem, Node, and git/ollama access flows through preload.js, which exposes a narrow API on window.electronAPI.
Renderer (renderer.js)
β
β window.electronAPI.readFile(path)
β window.electronAPI.git.status(repoRoot)
β window.electronAPI.aiChat({ model, messages })
βΌ
Preload (preload.js) β context bridge
β
β ipcRenderer.invoke('read-file', path)
βΌ
Main process (main.js + git-service.js) β Node.js, fs, dialog, child_process
The renderer never calls require() directly β that's the whole point of the bridge.
Monaco's vs/loader.js installs a global define(). Every UMD script that exposes its API via window.X must load before vs/loader.js, otherwise they register as anonymous AMD modules and never set their global (we hit this twice β first with marked, then again with xterm in v1.4.1):
<!-- index.html β order matters -->
<script src="../node_modules/marked/lib/marked.umd.js"></script> <!-- 1 -->
<script src="../node_modules/xterm/lib/xterm.js"></script> <!-- 2 -->
<script src="../node_modules/xterm-addon-fit/lib/xterm-addon-fit.js"></script> <!-- 3 -->
<script src="../node_modules/mermaid/dist/mermaid.min.js"></script> <!-- 4 -->
<script src="../node_modules/diff/dist/diff.min.js"></script> <!-- 5 -->
<script src="../node_modules/monaco-editor/min/vs/loader.js"></script><!-- 6. AFTER all UMD -->
<script src="crypto.js"></script> <!-- 7 -->
<script src="lsp-client.js"></script> <!-- 8 -->
<script src="renderer.js"></script> <!-- 9 -->Excalidraw is bundled separately by build-whiteboard.js (esbuild) into src/whiteboard.bundle.{js,css} and loaded inside the whiteboard.html iframe. React lives only inside that iframe; the main renderer stays vanilla JS. Fonts are self-hosted under src/excalidraw-fonts/ β no CDN call. See CLAUDE.md for the full whiteboard architecture and v1βv2 format migration.
draw.io is not bundled with the installer. The first time you open a .drawio file or click New Diagram, src/drawio-service.js (main process) downloads draw.war from GitHub releases, extracts it via extract-zip, and writes a version.json marker into userData/drawio-bundle/. The iframe loads drawio://app/index.html?embed=1&proto=json&β¦ via a custom privileged protocol (registerSchemesAsPrivileged + registerFileProtocol with a path-traversal guard). src/drawio.html brokers the embed-mode postMessage protocol between the inner drawio iframe and the parent renderer (dw-load / dw-state / dw-ready / dw-theme), mirroring the whiteboard shell pattern.
src/lsp-service.js (main) spawns one subprocess per language with stdio JSON-RPC framing (Content-Length: <n>\r\n\r\n<body>). src/lsp-client.js (renderer) registers Monaco completion / hover / definition providers that translate to textDocument/* LSP requests, and feeds diagnostics through setModelMarkers. Adding a new language is one entry in the LSP_LANGUAGES registry plus a Monaco language id mapping.
Note++ ships with a full Source Control workflow β see GIT.md for the spec.
| Open the panel | Ctrl+Shift+G or click β in the toolbar |
| Backend | Shells out to the system git CLI (child_process.spawn) |
| Detection | Walks up from the active file's folder looking for .git |
| Status format | git status --porcelain=v1 -b -z (NUL-separated; handles paths with spaces) |
| Refresh | On focus + after save + after any git op; background git fetch every 3 min |
| Auth | Inherits system credential manager (Windows Credential Manager / Keychain / git-credential) |
| Out of scope (v1) | Inline diff gutter, blame annotations, merge conflict UI, multi-repo aggregation |
Panel features:
- Commit message + β Commit + βΊ Amend (Ctrl+Enter shortcut inside the textarea)
- Staged and Changes lists with per-file Stage / Unstage / Discard buttons
- Stage All / Unstage All / Discard All (Discard All confirms first)
- Push / Pull / Sync / Fetch buttons; Sync = pull then push
- Branch picker β switch existing or create new
- File-tree badges color-coded per status
Local, private, free. Powered by Ollama on 127.0.0.1:11434.
Click π€ in the toolbar and Note++:
- Detects whether Ollama is installed (PATH + standard install locations)
- Starts the Ollama daemon if it's installed but not running (
ollama servedetached) - Downloads
qwen2.5-coder:1.5b(~1 GB) if you have no models yet β with a live progress bar - Picks the first installed model and connects
If Ollama isn't installed at all, the panel shows an Open download page button linking to ollama.com/download.
Toggle in the panel header β π€ Chat β β‘ Agent:
- Chat (default): conversation thread, follow-ups, action bar lets you Insert / Replace / Append the latest reply
- Agent: AI's reply replaces the editor content via a Monaco diff editor preview. You see exactly what's changing, then Apply or Reject. Multi-turn β each follow-up rebuilds the system prompt from your current editor content so iterations work naturally
See AGENT.md for the full spec.
Real diagnostics, hover docs, completion, and go-to-definition β driven by the actual language server (not Monaco's built-in shallow analyser). Currently ships with Pyright for Python; the registry pattern in lsp-service.js makes adding new languages a one-entry change.
| Transport | JSON-RPC over stdio (standard LSP framing) |
| Spawned by | Main process (src/lsp-service.js) β one subprocess per language, auto-restart on crash (β€ 3 in 30 s) |
| Renderer bridge | src/lsp-client.js β translates Monaco completion / hover / definition / setModelMarkers to LSP requests |
| Languages | Python (Pyright) β out of the box; tries pyright-langserver then npx -y pyright-langserver --stdio |
| Click-to-install | Status-bar pill goes β¬ Install pyright (orange, clickable) β runs npm install -g pyright β retries automatically |
| Status pill | π§ LSP: pyright startingβ¦ β π§ LSP: pyright (green) β β missing (clickable to install) β β crashed |
| Lifecycle | Auto-starts the moment a .py file becomes active; idle servers stop after 30 s; all servers shut down on app quit |
| Spec | LSP.md |
Note++ ships the full draw.io structured-diagram editor, downloaded on first use and persisted across upgrades. Lives alongside the Excalidraw whiteboard, doesn't replace it β Excalidraw for hand-drawn sketching, draw.io for flowcharts, UML, ERDs, network topology, BPMN, AWS/Azure architecture (huge stencil library).
| Editor version | draw.io v30.0.2 (pinned; bump via DRAWIO_VERSION in src/drawio-service.js) |
| Bundle size | ~40 MB download, ~50 MB unpacked |
| Bundle location | %AppData%\notepp\drawio-bundle\ (Windows) / ~/Library/Application Support/notepp/ (macOS) / ~/.config/notepp/ (Linux) β preserved across electron-updater upgrades |
| Protocol | Custom drawio://app/... privileged scheme β no file:// quirks, no internet calls (stealth=1) |
| Tab type | 'drawio' with an amber dw pill badge |
| File extensions | .drawio, .xml (auto-detected by content sniffing for <mxfile> / <mxGraphModel>) |
| Menu | Tools β Diagram (draw.io) β New Diagram Β· From Template βΆ Β· Check for updates |
- Click
Tools β Diagram (draw.io) β New Diagram(or open a.drawiofile) - A small modal appears: "Download draw.io (β40 MB)" with a progress bar
- ~30 seconds later (depending on connection), tab opens to a blank canvas
- From then on, every subsequent open is instant
Four pre-built scaffolds under From Template:
- Flowchart β Start (green) β Process (blue) β Decision (yellow) β End (red), connected with orthogonal arrows
- Sequence Diagram β two UML lifelines with one solid request + one dashed response message
- Class Diagram (UML) β one class swimlane with attributes / separator / methods
- Entity Relationship β Customer + Order tables with PK/FK columns and a
places1:N edge
Per-file encryption with a single profile-wide password. Open a .txt (or anything) β click π β confirm β file is saved as an encrypted JSON envelope. Re-open it later β password prompt β decrypt in memory β looks like a normal file.
| Cipher | AES-256-GCM (authenticated encryption) |
| KDF | PBKDF2-HMAC-SHA-256, 600 000 iterations (OWASP 2023 minimum) |
| Compression | gzip before encryption (negates the base64 overhead; typical text files shrink vs the plaintext) |
| Recovery | 256-bit random key, Crockford base32 (~32 readable chars, no ambiguous O/0/I/L) |
| Recovery file | Downloadable recovery.json containing the key |
| Disk format | Inspectable JSON envelope with _notepp_encrypted: true, salt, IV, ciphertext |
| Profile location | %AppData%\notepp\encryption\profile.json (wrapped DEK only, never the plaintext) |
| Threat model | See ENCRYPTION.md |
Powered by Excalidraw 0.18 running in an iframe. Same engine as excalidraw.com β hand-drawn shapes, rough.js style, full keyboard parity.
- Rectangle, ellipse, diamond, arrow, line, freedraw, text, image, library, frame, laser pointer
- Save lifecycle matches every other tab type β new tabs are in-memory, red dot appears the first time you draw,
Ctrl+Spops the Save As dialog. Session auto-save still captures unsaved work for crash recovery. - Open existing
.excalidrawfiles from anywhere β Note++ detects raw Excalidraw exports and routes them correctly - v1 β v2 format migration on load β old auto-backed whiteboards (pre-v1.5.1) still open; first save migrates them out of
%AppData%\notepp\Whiteboards\to a user-picked location
Inspired by Diff.Net / WinMerge / Beyond Compare. Two flavours, both render as new tabs.
| Engine (files) | Monaco's built-in createDiffEditor (zero new deps) |
| Engine (folders) | dir-compare β content-hash comparison |
| Tab type | 'diff' (file) or 'folder-diff' (folder) with an orange badge |
| Spec | DIFF.md |
Entry points:
File β Compare β Compare Filesβ¦β pick two filesFile β Compare β Compare with Savedβ¦β compare current tab vs a picked file- Right-click a tab β
Select for Compareβ right-click another tab βCompare with selected
Inside the diff tab:
- Side-by-side or inline view (toggle in the toolbar)
- Full Monaco syntax highlighting per file language
β Prev/β Nextchange navigationβ Swapreverses left β rightβ» Reloadre-reads both files from disk
Entry point: File β Compare β Compare Foldersβ¦
Inside the folder-diff tab:
- Two-column side-by-side tree
- Summary header:
N added Β· N removed Β· N differ Β· N equal - Colour coding:
- π’ Green β only on right (added)
- π΄ Red β only on left (removed)
- π‘ Yellow β in both, content differs
- Click a differing file row β opens that file's diff in a new tab
Show only changescheckbox hides equal entries (on by default)- Skips
node_modules / .git / dist / build / out / .next / .cache / .vscode / .idea / __pycache__
Four-tab search panel with a Notepad++-style results panel:
- Yellow bar + β dot in the gutter on every match line
- Orange bar + larger orange dot on the current match
- Yellow ticks on the right-side scrollbar minimap for match density
- All update live as you type (120 ms debounce)
- Status bar shows
3 of 58 matches
- Recursive search via the main process β pick a directory, set a filter (
*.js,*.md), hitFind in Files - Results grouped per file in the green-headed panel; click any row β opens the file + jumps to the line
- Skips the same heavy folders as Compare; caps at 5 000 files / 5 000 hits
- Pick a colour (yellow / cyan / pink / green / orange) β
Mark All - Persistent coloured highlight β stacks across multiple Marks with different colours
- Survives closing the Find panel; clear with
Clear Marks
Note++ ships with a split-pane preview for HTML and Markdown:
- Toggle with
Ctrl+Shift+Vor the π toolbar button - Resizable drag handle between editor and preview
- Zoom controls in the preview header (β, %, +) and
Ctrl+Wheelinside the body - βΆ Maximise toggle β preview takes the full editor row, hiding the editor pane
- 400 ms debounce on keystrokes β no jitter while typing
- Markdown parsed by
marked.parse(), with a custom renderer that handsmermaidblocks to Mermaid - HTML rendered in a sandboxed
<iframe srcdoc>with the Mermaid script injected into<head> - Bare Mermaid files (no fences, starting with
graph/flowchart/etc.) auto-detected and rendered directly .mmd/.mermaidfiles open in a dedicated Mermaid Live Editor split with templates, SVG/PNG export, and zoom (Ctrl+scrollworks too)
Example β a Mermaid block in any .md file:
```mermaid
flowchart LR
A[Edit] --> B{Save?}
B -- Yes --> C[Write to disk]
B -- No --> D[Discard]
```β¦renders live as you type.
Note++ ships with electron-updater wired to the GitHub releases provider β silent background download, explicit click-to-install. Default-on, persisted setting.
β οΈ One-time manual upgrade required if you're on 1.7.4 or earlier (Windows). Auto-update freezes atDownloading 100%for that one hop because the Windows trust store rejects our self-signed code-signing certificate's root. Download notepp-win-x64.exe and run it as administrator (right-click βRun as administrator). Auto-update works normally from 1.7.6 onward.
- ~8 s after launch (and every 6 h while running) Note++ asks GitHub if there's a newer release
- If yes, a pill appears on the far right of the toolbar:
- π΅
New update available (vX.Y.Z)β download just kicked off - π
Downloading 42%β live percent ticks as the file streams - π’
Click to update to vX.Y.Zβ clickable, hover highlight
- π΅
- Click the green pill β main window hides β a small frameless updater window opens with a progress animation β success card (
β Upgraded to vX.Y.Z) β ~2 s later the install fires and the new version relaunches
? menu β Check for Updates Automatically (checkbox, persisted to settings.json) β or Check for Updates Now (manual trigger, dev-mode shows a "only runs in installed build" notice).
| Shortcut | Action |
|---|---|
Ctrl+N |
New tab |
Ctrl+O |
Open file |
Ctrl+S / Ctrl+Shift+S |
Save / Save All |
Ctrl+W |
Close tab |
Ctrl+P |
Quick Open |
Ctrl+Shift+P |
Command Palette |
Ctrl+Shift+G |
Toggle Source Control |
Ctrl+Shift+A |
Toggle AI Assistant |
Ctrl+Alt+Shift+G |
Open Dev Arcade games tab |
Ctrl+Shift+V |
Toggle Live Preview |
Ctrl+F |
Find |
Ctrl+Shift+F |
Format Document |
Ctrl+H |
Replace |
Ctrl+G |
Go to Line |
Ctrl+`` |
Toggle Terminal |
F5 |
Run file |
F12 |
Go to definition |
Shift+F12 |
Go to references |
F2 |
Rename symbol |
Ctrl+Alt+W |
Toggle word wrap |
Ctrl+Alt+D |
Toggle dark mode |
Ctrl++ / Ctrl+- |
Zoom in / out |
A full list lives inside the Command Palette (Ctrl+Shift+P).
-
node-ptyintegration β true PTY with proper resize -
electron-builderpackaging + GitHub Actions release workflow - Git integration in editor (Source Control panel + branch ops)
- Inline git diff gutter β green/blue/red markers for added/modified/deleted lines vs HEAD
- Auto-backup with version retention
- AI Assistant (Ollama) with multi-turn chat + Agent mode
- Encrypted pad with recovery key
- Excalidraw-powered whiteboard
- draw.io structured-diagram editor β downloaded on demand, persists across upgrades, 4 starter templates
- LSP integration β Pyright for Python, click-to-install pill, diagnostics + hover + completion + go-to-def
- Compare β file diff (Monaco) + folder diff (dir-compare, Diff.Net-style tree)
- Find in Files β recursive search across a folder, results panel
- Mark β multi-colour persistent highlights
- Recent Files menu (last 15, persisted)
- External-change file watcher β auto-reload / "Keep mine" prompt
- macOS + Linux builds β 3-OS CI matrix, NSIS / DMG / AppImage / .deb artifacts
- Silent auto-update β electron-updater + toolbar pill + dedicated progress window
- Persistent UI toggles β Word Wrap / Dark Mode / Zoom / Minimap / Whitespace survive restarts
- Session dirty-flag persistence β unsaved tabs come back showing the red dot after restart
-
AGENTS.md+.notepp/memory.mdauto-injected into AI prompt - Multi-model picker (chat vs agent)
- Preview pane zoom + maximise
- Snappy editor defaults (no ligatures / caret animations / smooth scroll)
- Find live decorations (gutter + minimap markers, current-match indicator)
- LSP for more languages β Go (gopls), Rust (rust-analyzer), TypeScript (deeper than Monaco's built-in), etc. The registry pattern in
lsp-service.jsmakes each new language a one-entry addition. - Git blame and history view
- Hunk-by-hunk apply/reject in Agent mode diff
- Windows Hello / macOS Touch ID integration for encryption unlock
- MCP client support β connect to community MCP servers (filesystem, GitHub, etc.)
- Inline AI completion (Cursor-Tab style) via Ollama FIM
- macOS code-signing (currently unsigned; first-launch Gatekeeper warning)
- Voice input β proper
whisper.cppnative bindings (the previous transformers.js attempt was unstable in Electron and was removed)
Contributions are welcome. The project is small and easy to read end-to-end β renderer.js is the heart of it, main.js is the Electron shell, and each spec file (in features/ β ENCRYPTION.md, GIT.md, AGENT.md, DIFF.md, ROADMAP.md) documents its own feature in detail.
Good first issues:
- Pick anything from the Roadmap
- Add a new entry to the Command Palette (
renderer.jsβcmdItems) - Add a Monaco syntax theme
- Improve keyboard shortcut coverage
- Add a new LSP language registry entry in
src/lsp-service.js(e.g.goplsfor Go,rust-analyzerfor Rust) - Add another draw.io template scaffold to
DRAWIO_TEMPLATESinsrc/renderer.js
Workflow:
- Fork the repo
- Create a branch (
git checkout -b feature/your-thing) - Commit with a clear message
- Open a PR against
main
Note++ runs untrusted file content (and HTML previews of it) inside the renderer. The defenses in place:
contextIsolation: true,nodeIntegration: false- HTML preview is rendered inside a sandboxed
<iframe srcdoc> - All filesystem and Node access funnels through a narrow preload API
- Whiteboard runs in its own iframe with its own CSP, separate from the parent renderer
- AI traffic stays local β Ollama runs on
127.0.0.1:11434, no remote calls - Encrypted pad uses standard Web Crypto API primitives β no rolled-our-own crypto
If you find a vulnerability, please open a private security advisory on GitHub rather than a public issue.
MIT β see LICENSE for the fine print.
Built with curiosity, Monaco, and a lot of Electron docs.
Created by Yogesh Prajapati
Report a bug β’ Request a feature β’ Releases