Open Source

NotBad

NotBad

A quiet place to write — on every desktop

Markdown editors make you choose: stare at raw syntax, or split the screen with a preview pane. NotBad does neither. Marks like ** and # fade as you type, what remains reads like the finished piece, and every bit of chrome recedes until you reach for it. It's a from-scratch, pure-Flutter port of the macOS-only Trace — no web view, no CodeMirror — so one Dart codebase behaves identically on Windows, macOS, and Linux.

NotBad demo — sidebar, command palette, view modes, live styling, focus mode, and accent colors

The app driving itself: sidebar, command palette, three view modes, live styling, focus mode, find, and accent switching.

What it does

  • Concealed syntax with a caret-line reveal — three view modes one keystroke apart: styled with marks hidden (the caret's line reveals its marks so editing stays predictable), styled with marks visible, and plain monospace source.
  • Everything within reach, nothing in view — a fuzzy command palette, keyboard-driven file sidebar, hover table of contents, find & replace with live highlights, and a floating toolbar that fades while you type.
  • Trustworthy with files — session restore, autosave, crash-safe untitled drafts, external-change detection, CRLF/LF preservation, and single-instance document handoff. Plain .md files, no lock-in.
  • A writer's editor — smart list continuation, auto-pairing, focus mode with typewriter scrolling, smart typography, Copy as Rich Text, and HTML export.

Under the hood

The upstream app is ~28k lines of Swift wrapped around ~14.6k lines of TypeScript; NotBad re-imagines it in ~3.5k lines of Dart. A custom TextEditingController styles Markdown live with per-line span caching, concealed marks stay in the text (painted invisible) so caret math never drifts from the file, and the chrome — hidden title bar, custom caption buttons, receding toolbar — is drawn by the app itself. Ships with an Inno Setup installer, "Open with NotBad" shell integration, CI builds for all three platforms, and an in-app update check against GitHub releases.