A lightweight, fast, and beautiful code editor for reading and editing large code files. No bloat. Nothing you don't need.(vibecoded)
Notepad is old & VS Code is heavy.
Codepad lives in between — instant startup, syntax highlighting for the languages you actually use, and a UI that respects your screen.

Feature set is intentionally minimal:
- Syntax highlighting (15+ languages)
- Multi-tab editing
- Open / Save / Save As
- Dark and light themes (hand-tuned, not defaults)
- Font size control
- Find & replace (built into CodeMirror)
- Drag and drop files
- Remembers your theme + font size
That's it. No terminal. No git panel. No extensions. No 400mb.
| Layer | Technology |
|---|---|
| Shell | Tauri 1.x — native webview, no Chromium |
| Backend | Rust — file I/O, OS dialogs, CLI arg handling |
| Editor | CodeMirror 6 — modular, fast, battle-tested |
| UI | Vanilla JS + ES modules — no framework overhead |
| Bundler | Vite 5 |
| Fonts | JetBrains Mono (editor), Inter (UI) |
Binary target: < 10mb installed. Cold start: < 300ms.
- Node.js ≥ 18
- Rust (stable, 1.70+)
- Tauri system dependencies — follow the Tauri prerequisites guide for your OS
# 1. Clone
git clone https://github.com/you/codepad
cd codepad
# 2. Install JS dependencies
npm install
# 3. Run in development mode
npm run tauri dev
# 4. Build for production
npm run tauri buildThe release binary will be in src-tauri/target/release/ and the installers in src-tauri/target/release/bundle/.
codepad/
├── index.html # App shell HTML
├── package.json
├── vite.config.js
├── src/
│ ├── main.js # Entry point — boots app, wires events
│ ├── store.js # Reactive state store
│ ├── tabs.js # Tab state + DOM rendering
│ ├── fileops.js # File I/O + language detection
│ ├── keybindings.js # Global keyboard shortcuts
│ ├── editor/
│ │ ├── index.js # CodeMirror instance manager
│ │ ├── themes.js # Hand-tuned dark + light themes
│ │ └── languages.js # Lazy language loader
│ └── styles/
│ └── main.css # Full design system
└── src-tauri/
├── Cargo.toml
├── build.rs
├── tauri.conf.json
└── src/
└── main.rs # Rust: file commands + OS integration
| Shortcut | Action |
|---|---|
Ctrl+N / Ctrl+T |
New tab |
Ctrl+O |
Open file |
Ctrl+S |
Save |
Ctrl+Shift+S |
Save As |
Ctrl+W |
Close tab |
Ctrl+Tab |
Next tab |
Ctrl+Shift+Tab |
Previous tab |
Ctrl+F |
Find (CodeMirror built-in) |
Middle click tab |
Close tab |
To add a language not currently included:
- Install the CodeMirror language package:
npm install @codemirror/lang-<name> - Add a case in
src/editor/languages.js - Add the extension mapping in
src/fileops.js→detectLanguage() - Add display name in
languageLabel()and badge inlanguageBadge()
- Each tab gets one persistent CodeMirror instance. Switching tabs shows/hides existing instances rather than recreating — zero re-parse cost.
- Language support is lazy-loaded: the parser for Python isn't loaded until you open a
.pyfile. - Release builds use
opt-level = "z"(size), LTO, and symbol stripping. This keeps the Rust binary small. - The Vite build tree-shakes CodeMirror — only language support you actually
importis bundled.
Place your icon files in src-tauri/icons/:
32x32.png128x128.png[email protected]icon.icns(macOS)icon.ico(Windows)
You can generate all sizes from a single source PNG using the Tauri CLI:
npx tauri icon path/to/your-icon.pngMIT