A fully-featured, modern Markdown editor with live preview, auto-save, and fullscreen editing built with HTML, CSS, and JavaScript.
See docs/SYSTEM.md for the current architecture, invariants, storage model, scroll-sync design, and the offline/deployment checklist.
- Real-time Preview: See your markdown rendered as you type
- Split Pane Layout: Editor and preview side-by-side with resizable divider
- IndexedDB Storage: Large-capacity browser storage (50MB - several GB) for multiple files
- File Browser: Browse and manage all your saved files with a beautiful modal interface
- Auto-Save: Your work is automatically saved to IndexedDB as you type (never lose data again!)
- File Persistence: Resume exactly where you left off across browser sessions
- Fullscreen Editing: Distraction-free editing mode with smooth transitions
- Syntax Highlighting: Code blocks are highlighted using highlight.js
- File Operations: New, Open, and Save markdown files with smart workflow
- Word Document Import: Import and convert Word documents (.docx) to Markdown automatically
- Drag & Drop Support: Drop markdown files or Word documents onto either the editor or preview pane
- Image Paste Support: Paste images from clipboard as embedded inline images
- Image Widget System: Collapse long data URLs into moveable image objects
- Mermaid Diagrams: Full support for Mermaid flowcharts, sequence diagrams, and more -- with a dedicated diagram viewer (zoom, pan, copy SVG)
- KaTeX Math Rendering: Inline and block LaTeX math formulas
- Minimap Navigation: Sublime-style minimap for both editor and preview panes
- Format Toolbar: Quick access to common markdown formatting
- Keyboard Shortcuts:
Ctrl/Cmd + N: New fileCtrl/Cmd + O: Open fileCtrl/Cmd + S: Save file (download)Ctrl/Cmd + E: Export to PDFCtrl/Cmd + P: PrintCtrl/Cmd + B: Bold textCtrl/Cmd + I: Italic textCtrl/Cmd + Z: Undo (native browser)Ctrl/Cmd + Y/Ctrl/Cmd + Shift + Z: Redo (native browser)Escape: Exit fullscreen mode or close settings modalTab: Indent textShift + Tab: Unindent text
- Auto-completion: Automatic closing of brackets, quotes, and parentheses
- Smart Indentation: Proper tab handling for code blocks and lists
- Line Numbers & Statistics: Real-time word count, character count, and line count
- Cursor Position: Shows current line and column
- Dark/Light Theme: Toggle between themes with persistent preference
- View Mode Persistence: Editor/preview mode preferences saved across sessions
- Fullscreen Mode: Click the eye button for immersive editing with mode switching
- Smooth Transitions: All UI changes are beautifully animated
- Responsive Design: Works on desktop, tablet, and mobile devices
- Modern Interface: Clean, professional design with intuitive controls
- Smart Notifications: Toast notifications for all operations (saves, loads, errors)
- Visual Feedback: Drag-over effects, image processing indicators, and auto-save status
- Embedded Images: Pasted images are converted to data URLs for self-contained documents
- Image Widgets: Collapsible image objects that can be moved, deleted, and expanded
- Dual View Modes: Switch between widget view and raw markdown view
- Copy HTML: Export rendered HTML to clipboard
- Print Support: Optimized print styles for preview content
- Storage Management: Monitor storage usage and export/import data
- Scroll Synchronization: Preview scrolls with editor (wrap-aware, one-way: editor drives preview)
- Minimap: Sublime-style canvas minimap on both editor and preview panes -- click or drag to navigate
- Mermaid Diagrams: Full support for flowcharts, sequence diagrams, Gantt charts, and more
- Mermaid Diagram Viewer: Click any diagram to open a viewer with zoom, pan, and copy SVG
- KaTeX Math: Inline math with
$...$and block math with$$...$$ - Advanced Error Handling: Robust Mermaid parsing with helpful error messages
- Format Buttons: Quick formatting for:
- Headers (H1, H2, H3)
- Bold, Italic, Code
- Lists (Bullet, Numbered)
- Quotes, Links, Images
- Tables
- Mermaid Diagrams
- GitHub Flavored Markdown: Full GFM support including tables and code blocks
- Accessibility: Keyboard navigation and screen reader support
- Open the Editor: Open
index.htmlin any modern web browser - Start Writing: Begin typing markdown in the left pane
- Auto-Save: Your work is automatically saved to IndexedDB (debounced)
- Live Preview: See the rendered output in the right pane
- Fullscreen Mode: Click the eye button for distraction-free editing
- New File: Use
Ctrl/Cmd+N- Shows dialog with options: Save on Browser (default), Download, Cancel, or Delete - Open Files: Use
Ctrl/Cmd+O- Opens file browser to select from saved files, or open from disk - File Browser: Browse all saved files, search by name, view metadata, and manage files
- Save to Computer: Use
Ctrl/Cmd+Sto download your markdown file - Save to Browser: Files are automatically saved to IndexedDB
- Drag & Drop: Drag markdown files or Word documents onto the editor or preview pane
- Word Import: Click the Word import button or drag & drop
.docxfiles for automatic conversion - Paste Images: Copy any image and paste (
Ctrl/Cmd+V) directly into the editor - Mermaid Diagrams: Create diagrams with code blocks tagged
```mermaid - Math: Use
$...$for inline math,$$...$$for block math (KaTeX) - Minimap: Click or drag the minimap on either pane to navigate quickly
- Diagram Viewer: Click any Mermaid diagram in the preview to zoom/pan or copy SVG
MarkdownViewer-web-pro/
├── index.html # Main HTML file
├── css/ # Modular CSS files
│ ├── base.css # Base styles and layout
│ ├── buttons.css # Button styling
│ ├── editor.css # Editor pane styles
│ ├── modals.css # Modal dialogs
│ ├── preview.css # Preview pane styles
│ ├── responsive.css # Mobile responsiveness
│ ├── toolbar.css # Toolbar styling
│ └── variables.css # CSS custom properties
├── js/ # Modular JavaScript files
│ ├── app.js # Application initialization
│ ├── core.js # Core editor functionality and scroll sync
│ ├── events.js # Event and keyboard shortcut handling
│ ├── file-operations.js # File open/save operations
│ ├── file-browser.js # File browser modal interface
│ ├── indexeddb-manager.js # IndexedDB storage management
│ ├── storage-manager.js # localStorage management (compatibility)
│ ├── drag-drop.js # Drag & drop functionality
│ ├── image-paste.js # Image paste handling
│ ├── minimap.js # Sublime-style minimap for editor and preview
│ ├── notifications.js # Toast notifications
│ ├── pane-resizer.js # Split pane resizing
│ ├── syntax-highlight.js # Editor syntax highlighting overlay
│ └── simple-image-collapse-v2.js # Image widget system
├── lib/ # Vendored third-party libraries (all offline)
│ ├── markdown-it.min.js # Primary Markdown renderer
│ ├── marked.min.js # Legacy/auxiliary Markdown parser
│ ├── highlight.min.js # Syntax highlighting
│ ├── highlight.min.css # Syntax highlighting styles
│ ├── mermaid.min.js # Mermaid diagram rendering
│ ├── katex.min.js # KaTeX math rendering
│ ├── katex.min.css # KaTeX styles
│ ├── katex-auto-render.min.js # KaTeX auto-render extension
│ ├── mammoth.min.js # Word document conversion
│ └── fonts/ # Bundled fonts (KaTeX, etc.)
├── docs/ # Documentation
│ ├── SYSTEM.md # Architecture and invariants reference
│ ├── LOCALSTORAGE.md # localStorage implementation (legacy)
│ └── ... # Other design and feature docs
├── test/ # Test files
│ └── test-mermaid.md # Sample/test markdown files
├── archive/ # Archived old versions
├── build.sh # Build script
├── check-deployment.sh # Deployment validation script
└── build-info.js # Build metadata
All dependencies are vendored locally for offline functionality (in lib/):
- markdown-it: Primary Markdown renderer with source line tracking for scroll sync
- Marked.js: Legacy/auxiliary parser (kept vendored, not the primary renderer)
- Highlight.js: Syntax highlighting for code blocks
- Mermaid.js: Diagram and flowchart rendering
- KaTeX: LaTeX math formula rendering
- Mammoth.js: Word document to HTML/Markdown conversion
- No CDNs: Do not load runtime JS/CSS/fonts from
http(s)://(no<script src="https://...">,<link href="https://...">, or CSS@import url(https://...)). - Vendored libraries only: Any third-party runtime dependency must be committed into this repo under
lib/and referenced via relative paths. - Offline-first: The app must run locally with zero network access.
This is enforced by check-deployment.sh (it fails if any external runtime assets are detected).
- Chrome/Chromium (recommended)
- Firefox
- Safari
- Edge
- Any modern browser with ES6+ support
| Shortcut | Action |
|---|---|
Ctrl/Cmd + N |
New file (offers to save current work) |
Ctrl/Cmd + O |
Open file |
Ctrl/Cmd + S |
Save file (download) |
Ctrl/Cmd + E |
Export to PDF |
Ctrl/Cmd + P |
|
Ctrl/Cmd + B |
Bold selected text |
Ctrl/Cmd + I |
Italic selected text |
Ctrl/Cmd + Z |
Undo (native browser) |
Ctrl/Cmd + Y / Ctrl/Cmd + Shift + Z |
Redo (native browser) |
Escape |
Exit fullscreen mode or close settings modal |
Tab |
Indent line/selection |
Shift + Tab |
Unindent line/selection |
This editor uses IndexedDB as its primary storage, providing much larger capacity than localStorage:
- File Content: Your markdown text as you type (with full image data URLs)
- Cursor Position: Exact position for seamless resume
- File Name: Document title and metadata
- Modified State: Track unsaved changes
- File Metadata: Creation date, modification date, file size, word count, line count
- Auto-Save: Saves to IndexedDB every ~1 second after you stop typing (debounced)
- Session Restore: Automatically loads your most recently modified file when you return
- Smart Workflow: Clear document dialog offers 4 options: Save on Browser (default), Download, Cancel, or Delete
- Visual Feedback: A subtle LED indicator in the footer shows save activity
- Migration: On load, migrates localStorage to IndexedDB non-destructively (does not clear localStorage unless explicitly requested)
- Multiple Files: Store many files in IndexedDB (50MB - several GB capacity)
- File Browser: Beautiful modal interface to browse, search, open, and delete files
- Search: Search files by name in the file browser
- Data Persistence: Works completely offline, no server required
- Large Capacity: IndexedDB provides 50MB to several GB (vs 5-10MB for localStorage)
- Error Handling: Graceful handling of storage quota limits
- Backward Compatible: Falls back to localStorage if IndexedDB is unavailable
- Backup/Restore: Export a full JSON backup (files + images) from the Settings modal and restore it later
IndexedDB data does NOT automatically sync across devices. Each browser/device maintains its own copy. Use the download feature or export backup to transfer files.
Attention (hosts): To use Drive, you must register the app once in Google Cloud Console and set
DRIVE_CLIENT_IDinjs/drive-auth.js. End users only see Google’s “Allow this app?” screen.
You can connect Google Drive to save and open .md files in a Markdown-pro folder (with subfolders). The app uses Google Identity Services (GIS) in the browser; there is no backend.
- Open Google Cloud Console – Credentials.
- Create or select a project, enable Google Drive API.
- Create credentials → OAuth client ID → type Web application.
- Add Authorized JavaScript origins (e.g.
https://yourname.github.iofor GitHub Pages, orhttp://localhost:3000for local testing). - Copy the Client ID into
js/drive-auth.jsasDRIVE_CLIENT_ID.
If you want the Google Auth setup to be public-facing, use these pages in the Google Auth Platform branding settings:
- Application home page:
https://markdownpro.eyesondash.com/about.html - Application privacy policy:
https://markdownpro.eyesondash.com/privacy.html - Application terms of service:
https://markdownpro.eyesondash.com/terms.html - Support / developer contact:
ds@sudoall.com
The Client ID identifies your app to Google (not the end user). It is safe to commit in a public repo; do not commit any Client Secret. Anyone hosting their own copy must create their own OAuth client and add their own origin.
- No app server: The token never leaves the browser to your site; there is no backend to receive it.
- Minimal scope:
drive.filemeans the app can only access files it created in Drive, not the user’s full Drive. - User control: Google shows “Allow this app?”; the user can deny or revoke access anytime in their Google Account.
flowchart LR
subgraph userDevice [User device only]
Browser[Browser tab]
Memory[Token in memory]
Browser --> Memory
end
Google[Google OAuth popup Allow or Deny]
DriveAPI[Drive API drive.file]
Browser -->|click Connect| Google
Google -->|user allows| Memory
Memory -->|Bearer token only to Google| DriveAPI
DriveAPI --> OnlyCreated[Only files this app created]
NoServer[No app server token never sent to host]
style NoServer fill:#e8f5e9
style OnlyCreated fill:#e8f5e9
If GIS does not load (offline or blocked), the Drive button stays hidden and the app works as before with IndexedDB only.
When creating a new file, you'll see a dialog with 4 options:
- Save on Browser (default): Saves current file to IndexedDB
- Download: Downloads the file to your computer
- Cancel: Keeps current document open
- Delete: Removes the file from IndexedDB storage
The editor automatically migrates files from localStorage to IndexedDB on first load:
- One-Time Migration: Runs automatically when you first open the editor
- Smart Deduplication: Skips files already in IndexedDB (unless localStorage version is newer)
- Non-Destructive by Default: localStorage is kept unless you explicitly clear it
- Manual Cleanup: Use
migrateToIndexedDB(true)in the browser console to migrate and clear localStorage
Both the editor and preview panes have a Sublime-style minimap on the right edge:
- Editor Minimap: Renders a scaled-down representation of the text in the textarea
- Preview Minimap: Scans the rendered DOM and draws proportional blocks for headings, paragraphs, code fences, images, tables, and Mermaid diagrams
- Navigation: Click anywhere on the minimap to jump to that position; drag the viewport slider to scroll
- Theme-Accurate: Colors match the current light/dark theme
Use standard LaTeX syntax to embed math in your documents:
- Inline math: Wrap expressions in single dollar signs:
$E = mc^2$ - Block math: Wrap expressions in double dollar signs on their own lines:
$$
\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}
$$
Math is rendered via KaTeX entirely offline.
The editor supports drag and drop onto both the editor and preview panes:
- Drag a File: Select any supported file (
.md,.txt,.markdown,.docx) from your file system - Drop on Editor or Preview: You'll see a visual indicator on the target pane
- Smart Handling: If you have unsaved changes, you'll get a dialog with options to save, replace, or cancel
- Automatic Conversion: Word documents are automatically converted to Markdown during the drop
.md,.markdown(Markdown files).txt(Plain text files).docx(Microsoft Word documents - automatically converted to Markdown)
Paste images directly from your clipboard with automatic embedding:
- Copy Image: Copy any image (screenshots, web images, etc.)
- Paste in Editor: Press
Ctrl/Cmd+Vin the editor - Automatic Processing: The image is converted to a base64 data URL and embedded as markdown
- Data URL Embedding: Images are self-contained in the document
- Automatic Naming: Pasted images get timestamped filenames
- Multiple Images: Paste multiple images sequentially
- Cursor Positioning: Images are inserted at your current cursor position
Long base64 data URLs are collapsed into compact, interactive image widgets to keep the editor readable:
- Collapsed Display: Large data URLs hidden and replaced with thumbnails
- Drag & Drop: Move images by dragging widgets to different lines
- Quick Actions: Expand to raw markdown or delete with one click
- Dual View: Toggle between widget view and raw markdown view
- Expand: Switch to raw markdown view and select the image data
- Delete: Remove the image with a confirmation dialog
- Toggle: Switch between raw markdown and widget views
Import Microsoft Word documents (.docx) with automatic conversion to Markdown:
- Import Button: Click the Word document import button (W icon) in the toolbar
- Drag & Drop: Drag a
.docxfile onto the editor or preview pane
- Headings (H1-H6), bold/italic, lists, links, tables, code blocks, blockquotes
- Images: Embedded images converted to base64 data URLs
- Smart Filename Handling: Original filename preserved with
.mdextension
- Complex formatting (custom styles, advanced layouts) may be simplified
- Some Word-specific features (comments, track changes) are not preserved
- Very large documents may take longer to process
Full support for Mermaid diagrams with an integrated diagram viewer:
- Flowcharts:
graph TD,graph LR,flowchart TD - Sequence Diagrams:
sequenceDiagram - Gantt Charts:
gantt - Class Diagrams:
classDiagram - State Diagrams:
stateDiagram - Journey Maps:
journey - Pie Charts:
pie - Git Graphs:
gitgraph - Entity Relationship:
erDiagram
Create a code block tagged mermaid:
```mermaid
graph TD
A[Start] --> B{Decision}
B -->|Yes| C[Action 1]
B -->|No| D[Action 2]
C --> E[End]
D --> E
```
Click any rendered diagram in the preview to open a full-screen viewer with:
- Zoom: Scroll or use buttons to zoom in/out
- Pan: Click and drag to pan around large diagrams
- Copy SVG: Copy the raw SVG to clipboard
Click the eye button to enter fullscreen mode:
- Mode Switching: Toggle between edit-only and preview-only modes
- Smooth Transitions: Animated mode changes
- Floating Controls: Clean interface with floating mode toggle buttons
- Keyboard Exit: Press
Escapeto exit fullscreen - View Mode Persistence: Your last used mode is remembered across sessions
- Edit Mode: Show only the editor for focused writing
- Preview Mode: Show only the preview for reading
- Exit: Return to normal dual-pane view (or press
Escape)
Full GitHub Flavored Markdown including:
- Headers (
#,##,###, etc.) - Bold and italic text
Inline codeand code blocks- Lists (ordered and unordered)
- Blockquotes
- Links and images
- Tables
- Horizontal rules
- Strikethrough text
- Task lists
- Mermaid diagrams
- LaTeX math (KaTeX)
The editor uses CSS custom properties for easy theming. Edit css/variables.css to change the color scheme.
- CSS Modules: Separate files for different components
- JavaScript Modules: Clean separation of concerns
- Extensible Design: Easy to add new features
docs/SYSTEM.md: Architecture, invariants, storage model, scroll sync, and deployment checklist (primary reference)docs/LOCALSTORAGE.md: Legacy localStorage implementation notestest/: Test files and debugging tools
- Minimap: Sublime-style canvas minimap on both editor and preview panes
- KaTeX Math: Inline (
$...$) and block ($$...$$) LaTeX math rendering - Mermaid Diagram Viewer: Click any diagram for a full-screen viewer with zoom, pan, and SVG copy
- View Mode Persistence: Editor/preview split mode remembered across sessions
- Drag-Drop on Preview: Files can be dropped onto the preview pane as well as the editor
- Internal Anchor Links: Fixed in-page anchor navigation
- IndexedDB Storage: Upgraded from localStorage to IndexedDB (50MB - several GB capacity)
- File Browser: Modal interface to browse, search, and manage all saved files
- Multiple Files: Store and manage multiple markdown files in browser storage
- Enhanced Clear Dialog: New file dialog with 4 options: Save on Browser, Download, Cancel, Delete
- Scroll Sync: Wrap-aware one-way scroll synchronization (editor drives preview)
- markdown-it: Switched to markdown-it as the primary renderer with source line tracking
- Chrome/Chromium: Full support (recommended)
- Firefox: Full support
- Safari: Full support
- Edge: Full support
- Mobile Browsers: Responsive design works on all modern mobile browsers
- Requirements: ES6+, IndexedDB, modern CSS features
- Offline-First: Works completely offline
- Fast Loading: All dependencies vendored locally
- Efficient Storage: Debounced auto-save prevents performance issues
- Responsive: Smooth performance on all device types
This project is open source and available under the MIT License.