___ ___ ___ ___ ___
/ __|/ __| _ \_ _| _ )
\__ \ (__| /| || _ \
|___/\___|_|_\___|___/
DESKTOP
The encrypted desktop editor. Plain text, rich text, and .scrb — fully offline, zero tracking.
Built by Beeswax Pat, with Claude · Licensed under the GNU GPL v3
Download Latest Release · Changelog · Blog Post · Website
Scrib Desktop is a tabbed text editor for Windows that encrypts your files with AES-256. It handles plain text, rich text, and its own .scrb encrypted format. No internet connection required. No telemetry. No accounts. Your files, your keys, always.
Editor
- Plain text and rich text editing with per-tab mode switching (
Ctrl+M) - Multi-tab interface with inline rename (double-click tab), per-tab accent colors, middle-click close
- Right-click a tab for Close, Close Others, Close to the Right, Close All, and Rename
- Hover a tab to see its full file path
- Line numbers toggle (View menu), persistent window position and size
- Drag and drop files onto the window to open them
- Auto-save on a configurable timer
Rich Text
- Bold, italic, underline, strikethrough
- Font family and size picker (14 system fonts, sizes 8–72)
- Text color palette (10 colors) and neon highlight colors (8 colors)
- Headings (H1–H3), bullet lists, numbered lists, block quotes
- Text alignment (left, center, right, justify) and indent/outdent
- Insert images (Insert menu or the rich-text toolbar): PNG, JPEG, GIF, WebP, BMP, SVG, TIFF, TGA, ICO, PSD and more. Images are embedded in the note itself, so inside a
.scrbthey are encrypted along with the text. Large images are downscaled on insert. - Images sit inline with text: type to the left or right, press Enter for above or below, align them, and resize or remove them on hover. The size is stored on the image and survives save and reopen.
- Insert tables: a grid picker chooses the size (up to 8 columns by 10 rows), cells are edited in place with a header row, and a hover toolbar adds or removes rows and columns. Tables are stored in the note, so inside a
.scrbthey are encrypted with the text.
Tools
- Built-in calculator (Insert menu or the rich-text toolbar): evaluates as you type with operator precedence, parentheses, powers, modulo and decimals, keeps a short history, and can insert the result at the cursor in either editing mode. It uses a small built-in parser, not
eval, so a note cannot run code through it.
Search
- Find within current tab (
Ctrl+F) - Find & Replace (
Ctrl+H) - Search across all open tabs (
Ctrl+Shift+F) with match counts and click-to-jump
Encryption
- Toggle encryption on any tab with
Ctrl+E - AES-256-CBC + HMAC-SHA256 (Encrypt-then-MAC)
- PBKDF2-SHA256 key derivation, 100,000 iterations
- Lock a tab with
Ctrl+L: unsaved changes are saved, then the decrypted content and password are wiped from the tab's state. The tab stays open as a lock screen until you re-enter the password. - Auto-lock: optionally lock every encrypted tab after 1, 5, or 15 minutes of inactivity (Security menu, off by default)
- Change Password (Security menu) re-encrypts the file with a new password in one step
- Encrypting a file removes the plaintext original from disk (no stray copy left behind)
- Password strength meter, no-recovery reminder, and Caps Lock warning in the set-password dialog
- Encryption runs in a background isolate, so the UI stays responsive
Workspace
- Session restore: reopen the tabs you had open last time, at launch. Encrypted files come back locked, so launch never asks for a password and never decrypts anything unasked. Toggle in the View menu; turning it off also deletes the stored session record.
- Command palette (
Ctrl+Shift+P): fuzzy-search every command in the app and run it from the keyboard
File Format Support
- Open:
.txt,.scrb,.rtf,.md,.log,.csv,.json,.xml,.yaml,.yml,.ini,.cfg - Save:
.txt,.scrb,.rtf - RTF import/export preserves formatting when switching between editors
Appearance
- Dark, Light, and System themes (Material 3)
- 16 note colors, 5 accent colors
- Adjustable text size in plain text mode (
Ctrl+=/Ctrl+-/ click the size number for custom input)
| Shortcut | Action |
|---|---|
Ctrl+N |
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 |
Ctrl+H |
Find & Replace |
Ctrl+Shift+F |
Search all tabs |
Ctrl+E |
Toggle encryption |
Ctrl+L |
Lock / unlock tab |
Ctrl+Shift+P |
Command palette |
Ctrl+M |
Toggle plain text / rich text |
Ctrl+Z |
Undo |
Ctrl+Shift+Z |
Redo |
Ctrl+Y |
Redo (alternate) |
Ctrl+= |
Increase text size (plain text) |
Ctrl+- |
Decrease text size (plain text) |
Ctrl+0 |
Reset text size (plain text) |
Escape |
Close search bar |
F1 |
Keyboard shortcuts reference |
Requirements
- Flutter 3.7+ (tested on 3.38.6)
- Windows 10 or later
- Visual Studio 2022 with the Desktop development with C++ workload
git clone https://github.com/beeswaxpat/scrib-desktop.git
cd scrib-desktop
flutter pub get
flutter run -d windows # debug
flutter build windows --release # releaseRelease binary: build\windows\x64\runner\Release\scrib_desktop.exe
lib/
main.dart Entry point, window management, quit flow
constants.dart Brand constants, color palettes, crypto params
providers/
editor_provider.dart Tab state, file I/O, search, auto-save
screens/
main_screen.dart Menu bar, shortcuts, drag-and-drop
services/
file_service.dart Disk I/O, AES-256 encryption (.scrb v2/v3)
file_operations.dart Save / Save As decision tree
atomic_write.dart Windows atomic rename + crash recovery
settings_service.dart Persistent settings (Hive)
rtf_service.dart Quill Delta <-> RTF conversion
image_embed_service.dart Image pick / decode / downscale to data URI
table_embed.dart Table model + JSON codec (custom embed)
calc_evaluator.dart Calculator expression parser (no eval)
dialogs/
password_dialog.dart Password entry / set-password dialogs (strength meter)
about_dialog.dart About Scrib
confirm_dialog.dart Unsaved-changes / confirm / font-size dialogs
shortcuts_dialog.dart Keyboard shortcuts reference (F1)
calculator_dialog.dart Built-in calculator
widgets/
editor_widget.dart Plain text + rich text editor
image_embed_builder.dart Renders inline, resizable image embeds (raster + SVG)
table_embed_builder.dart Renders editable table embeds + size picker
formatting_toolbar_widget.dart Rich text formatting toolbar
toolbar_widget.dart Quick-action toolbar (plain text)
tab_bar_widget.dart Tab bar with rename, color, close, right-click menu
search_bar_widget.dart Per-tab Find & Replace
global_search_widget.dart Cross-tab search panel
status_bar_widget.dart Word / char / line count, status
theme/
desktop_theme.dart Dark and light Material 3 themes
scrib_colors.dart ThemeExtension color palette
24 Dart files, ~7,400 lines of code, covered by 230+ tests.
Scrib uses Encrypt-then-MAC with AES-256-CBC and HMAC-SHA256.
| Component | Detail |
|---|---|
| Key derivation | PBKDF2-SHA256, 64-byte output (32 enc + 32 mac). v2: fixed 100,000 iterations. v3: iteration count stored per-file (so it can be raised later without breaking old files). |
| IV | 16 bytes, Random.secure() per save |
| Salt | 32 bytes, Random.secure() per save |
| HMAC | SHA-256 over version ‖ KDF params ‖ IV ‖ salt ‖ ciphertext (the KDF parameters are authenticated, so a downgrade is rejected) |
| Key hygiene | PBKDF2 runs in a background isolate. Key bytes are zeroed after use. |
| Atomic writes | Saves use MoveFileExW on Windows so a crash during save never corrupts your file. |
.scrb binary layout:
v3 (current): [SCRB 4B][version=3 1B][kdfId 1B][iterations u32-BE 4B][IV 16B][salt 32B][HMAC 32B][ciphertext...]
v2 (legacy): [SCRB 4B][version=2 1B][IV 16B][salt 32B][HMAC 32B][ciphertext...]
The HMAC is verified before decryption. Tampered files are rejected. New files are written as v3; every existing v2 file is still read by a preserved v2 code path, so upgrading never strands a file.
Scrib defends against:
- Someone with read access to your
.scrbfiles but not your password - File tampering (HMAC covers the version byte, IV, salt, and ciphertext)
- Disk-level corruption during a save (atomic rename protects existing files)
Scrib does not defend against:
- A compromised machine: a key-logger, RAM dump, or malicious Flutter build can recover
the password while a file is open. Passwords are held in memory as
Stringfor the lifetime of an open encrypted tab — Dart strings are immutable and can't be securely zeroed, so the password may linger in the heap until garbage collection. - Brute force against weak passwords. PBKDF2 with 100k iterations buys time but not infinity. Use a long, high-entropy password.
- File path / filename leakage:
recentFiles, window position, and default save location are stored in a plaintext Hive box under%APPDATA%. Future versions may encrypt this; today the contents of your notes are encrypted, but the names and paths of your notes are not.
The bottom bar shows: Words · Characters · Lines · UTF-8 · Plain/Rich Text · Encryption status
Encrypted tabs display a gold lock icon. A locked tab reads "Locked (.scrb)" and its tab-bar lock turns gold until it is unlocked.
| Menu | Items |
|---|---|
| File | New, Open, Recent Files, Save, Save As, Set Save Location, Close Tab |
| Edit | Undo, Redo, Cut, Copy, Paste, Select All, Find, Find & Replace, Search All Tabs |
| Insert | Image (rich text mode), Table (rich text mode), Calculator |
| View | Increase/Decrease/Default Text Size, Line Numbers toggle, Auto-Save toggle, Reopen Tabs on Launch toggle, Theme (System/Light/Dark) |
| Security | Encrypt File / Decrypt File, Change Password, Lock Tab / Unlock Tab, Lock All Encrypted Tabs, Auto-Lock Encrypted Tabs (Off / 1 / 5 / 15 min) |
| Help | Command Palette, Keyboard Shortcuts, About Scrib |
| Package | Purpose |
|---|---|
flutter_quill |
Rich text editor (Delta format) |
flutter_svg |
Renders SVG image embeds |
image |
Decodes and downscales image formats on insert |
provider |
State management |
hive |
Local settings persistence |
file_picker |
Native open/save dialogs |
window_manager |
Window title, size, position |
desktop_drop |
Drag and drop file support |
pointycastle |
AES-256-CBC, PBKDF2, HMAC-SHA256 |
ffi |
Windows MoveFileExW for atomic rename |
PRs welcome. See CONTRIBUTING.md for guidelines.
Ground rules: No tracking. No weakening encryption. Follow existing code style.
GNU General Public License v3.0 — see LICENSE.
You are free to use, modify, and distribute this software under the terms of the GPL. If you distribute modified versions, they must also be open source under the GPL.
No tracking. No cloud. Just notes.

