Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2455c3f8a | ||
|
|
1b2ab7b55c | ||
|
|
cfe134931f | ||
|
|
77f8ba3d9d | ||
|
|
0be46d4bac | ||
|
|
1e24b52f3e | ||
|
|
58bd19ecd1 | ||
|
|
7ab5a0ddb4 | ||
|
|
efca458495 | ||
|
|
c4dcbd8caf |
@@ -0,0 +1,9 @@
|
||||
# Text artifacts that are hash-pinned must check out byte-identical everywhere
|
||||
assets/fonts/FiraCode-LICENSE.txt -text
|
||||
# Binaries: never normalize
|
||||
*.ttf -text
|
||||
*.woff -text
|
||||
*.woff2 -text
|
||||
*.png -text
|
||||
*.ico -text
|
||||
*.icns -text
|
||||
@@ -25,6 +25,13 @@ jobs:
|
||||
- name: Download external tools (pandoc)
|
||||
run: node scripts/download-tools.js
|
||||
|
||||
- name: Bundle MarkItDown (optional, best effort)
|
||||
# Freezes markitdown + Python into bin/linux/markitdown; failure is
|
||||
# non-fatal — the build then ships without it and the app falls back
|
||||
# to a system markitdown at runtime.
|
||||
run: npm run bundle:markitdown
|
||||
continue-on-error: true
|
||||
|
||||
- name: Run tests
|
||||
run: npm test
|
||||
|
||||
@@ -59,6 +66,12 @@ jobs:
|
||||
- name: Download external tools (pandoc)
|
||||
run: node scripts/download-tools.js
|
||||
|
||||
- name: Bundle MarkItDown (optional, best effort)
|
||||
# Windows runners ship python + venv; non-fatal on failure — the
|
||||
# package then omits the bundled binary by design
|
||||
run: npm run bundle:markitdown
|
||||
continue-on-error: true
|
||||
|
||||
- name: Run tests
|
||||
run: npm test
|
||||
|
||||
@@ -94,8 +107,44 @@ jobs:
|
||||
dist/*.zip
|
||||
retention-days: 5
|
||||
|
||||
build-macos:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Download external tools (pandoc)
|
||||
run: node scripts/download-tools.js
|
||||
|
||||
- name: Bundle MarkItDown (optional, best effort)
|
||||
run: npm run bundle:markitdown
|
||||
continue-on-error: true
|
||||
|
||||
- name: Run tests
|
||||
run: npm test
|
||||
|
||||
- name: Build macOS packages
|
||||
run: npm run build:mac -- --publish=never
|
||||
|
||||
- name: Upload macOS artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos-artifacts
|
||||
path: |
|
||||
dist/*.dmg
|
||||
dist/*.zip
|
||||
retention-days: 5
|
||||
|
||||
release:
|
||||
needs: [build-linux, build-windows]
|
||||
needs: [build-linux, build-windows, build-macos]
|
||||
if: always()
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -115,6 +164,13 @@ jobs:
|
||||
name: windows-artifacts
|
||||
path: dist
|
||||
|
||||
- name: Download macOS artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
continue-on-error: true
|
||||
with:
|
||||
name: macos-artifacts
|
||||
path: dist
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<p align="center">
|
||||
<img src="assets/markdown-converter-assets/logo-horizontal.svg" alt="Markdown Converter" width="420">
|
||||
</p>
|
||||
|
||||
# MarkdownConverter
|
||||
|
||||
A powerful cross-platform Markdown editor and document converter powered by Pandoc, built with Electron. 100% open-source with no proprietary dependencies.
|
||||
@@ -43,6 +47,7 @@ A powerful cross-platform Markdown editor and document converter powered by Pand
|
||||
- **EPUB** - E-book format
|
||||
- **LaTeX** - Academic document format
|
||||
- **RTF** - Rich Text Format
|
||||
- **Export themes** - Five visual styles (Modern, Classic, Sepia, Minimal, Elegant) for PDF and Word exports — recolored headings, links, and fonts
|
||||
|
||||
### Advanced Features
|
||||
- **Custom headers & footers** - Add headers/footers to exports with dynamic fields
|
||||
@@ -51,12 +56,24 @@ A powerful cross-platform Markdown editor and document converter powered by Pand
|
||||
- **ASCII Art Generator** - Create text banners and diagrams
|
||||
- **Word templates** - Use custom Word templates for enhanced exports
|
||||
- **Import documents** - Import from 30+ formats (DOCX, PDF, HTML, etc.)
|
||||
- **MarkItDown import** - Any file → Markdown via [Microsoft MarkItDown](https://github.com/microsoft/markitdown): PDF, DOCX, PPTX, XLSX, Outlook .msg, EPUB, images, ZIP (audio/OCR with the `[all]` extras)
|
||||
- **Excel export** - Markdown tables to native .xlsx workbooks (one sheet per table)
|
||||
- **AI Assistant** - Multi-provider AI help (OpenAI/Anthropic/Ollama/LM Studio): chat panel, summarize/improve/translate commands, grammar proofreading
|
||||
- **Inline comments** - Anchor-based document comments in `.comments/` sidecars with F8 navigation
|
||||
- **Wiki-links & Backlinks** - `[[Note]]` links with click-to-create and a "what links here?" panel (local knowledge base)
|
||||
- **Crash recovery** - Session restore of open tabs and unsaved buffers after a crash
|
||||
- **Version history** - Automatic pre-save snapshots with restore/diff/delete from the History panel
|
||||
- **Vim mode & snippet expansion** - Vim keybindings toggle; Tab expands saved snippets
|
||||
- **Quick Note** - Global scratchpad (Ctrl+Alt+Q) that appends to `notes/quick-notes.md`
|
||||
- **Real PDF encryption** - Password protection, removal, and permissions actually work
|
||||
- **Offline math & diagrams** - KaTeX bundled locally; PlantUML renders locally when the CLI is installed
|
||||
|
||||
## Installation
|
||||
|
||||
### Prerequisites
|
||||
- [Node.js](https://nodejs.org/) (v16 or later)
|
||||
- [Pandoc](https://pandoc.org/installing.html) (required for export functionality)
|
||||
- Optional: [MarkItDown](https://github.com/microsoft/markitdown) (`pip install "markitdown[all]"`) for any-file → Markdown import
|
||||
|
||||
### Install Dependencies
|
||||
```bash
|
||||
@@ -96,9 +113,18 @@ npm run build:linux
|
||||
| Redo | Ctrl+Shift+Z |
|
||||
| New Tab | Ctrl+T |
|
||||
| Close Tab | Ctrl+W |
|
||||
| Toggle Preview | Ctrl+Shift+P |
|
||||
| Toggle Preview | Ctrl+Shift+V |
|
||||
| Zoom In | Ctrl+Shift++ |
|
||||
| Zoom Out | Ctrl+Shift+- |
|
||||
| Command Palette | Ctrl+Shift+P |
|
||||
| Zen Mode | F11 |
|
||||
| Writing Analytics | Ctrl+Shift+A |
|
||||
| Quick Note | Ctrl+Alt+Q |
|
||||
| Universal Converter | Ctrl+Shift+C |
|
||||
| Table Generator | Ctrl+Shift+T |
|
||||
| ASCII Art Generator | Ctrl+Shift+A |
|
||||
| Next Comment | F8 |
|
||||
| Add Comment at Cursor | Ctrl+Alt+M |
|
||||
|
||||
## Themes
|
||||
|
||||
@@ -140,6 +166,43 @@ Open PDF files directly in MarkdownConverter:
|
||||
- Rotate pages left or right
|
||||
- Close PDF to return to editor
|
||||
|
||||
## Bundled Dependencies, Legal Notices & Credits
|
||||
|
||||
MarkdownConverter ships as a self-contained package. Everything needed for the
|
||||
core workflows is **bundled**; a few large optional tools are detected from
|
||||
the system when present.
|
||||
|
||||
### Bundled with the app
|
||||
|
||||
| Component | License | Role |
|
||||
|---|---|---|
|
||||
| [Pandoc](https://pandoc.org) 3.9 | GPL-2.0+ (separate process) | 25+ export/import formats |
|
||||
| [FFmpeg](https://ffmpeg.org) (via ffmpeg-static) | GPL-3.0+ build (separate process) | audio/video tools |
|
||||
| [MarkItDown](https://github.com/microsoft/markitdown) (MIT) + embedded Python runtime (PSF) | MIT / PSF | any-file → Markdown import (PDF/DOCX/PPTX/XLSX/Outlook/EPUB/images/ZIP) |
|
||||
| [sharp](https://sharp.pixelplumbing.com) + libvips | Apache-2.0 / LGPL-2.1+ (dynamic) | image tools |
|
||||
| [KaTeX](https://katex.org), [marked](https://marked.js.org), [highlight.js], [DOMPurify], [mermaid], [CodeMirror 6], pdf-lib (@cantoo fork), pdfjs-dist, JSZip, simple-git | MIT / Apache-2.0 / BSD-3 / MPL-2.0 | editor, preview, PDF, Git |
|
||||
| JetBrains Mono & Fira Code fonts | SIL OFL 1.1 | editor typography |
|
||||
|
||||
GPL-licensed tools run as **separate processes** (never linked into the app)
|
||||
and their complete corresponding sources are offered in
|
||||
[SOURCES.md](SOURCES.md). Full details: [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md),
|
||||
also available inside the app under **Help → Third-Party Notices & Licenses**.
|
||||
|
||||
### Not bundled (used when installed)
|
||||
|
||||
LibreOffice (Office conversion), MiKTeX/TeX Live (LaTeX PDF), ImageMagick
|
||||
(extra image formats), PlantUML + Java (local diagrams), Calibre (MOBI),
|
||||
MarkItDown `[all]` extras (audio transcription / OCR).
|
||||
|
||||
### Credits
|
||||
|
||||
Built on open source: [Electron], [CodeMirror], [marked], [KaTeX],
|
||||
[highlight.js], [DOMPurify](https://github.com/cure53/DOMPurify),
|
||||
[mermaid](https://mermaid.js.org), [pdf-lib], [pdf.js](https://mozilla.github.io/pdf.js/),
|
||||
[sharp]/libvips, [Pandoc], [FFmpeg], [MarkItDown] by Microsoft,
|
||||
[simple-git], [JSZip], [JetBrains Mono], [Fira Code]. Thank you to all their
|
||||
authors and maintainers.
|
||||
|
||||
## Open Source
|
||||
|
||||
MarkdownConverter is 100% open-source. All dependencies are permissively licensed:
|
||||
@@ -162,4 +225,4 @@ Amit Haridas (amit.wh@gmail.com)
|
||||
|
||||
## Version
|
||||
|
||||
v4.5.0
|
||||
v4.7.1
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
# Source Code Availability (GPL / LGPL Written Offer)
|
||||
|
||||
MarkdownConverter distributes the following binaries built from GPL-licensed
|
||||
software. Per GPL §3(b), this document is the written offer: **corresponding
|
||||
source code for the exact versions listed below is available on request for
|
||||
at least three years from each release**, and permanently at the referenced
|
||||
public locations. Write to: amit.wh@gmail.com (or open a GitHub issue at
|
||||
https://github.com/amitwh/markdown-converter/issues).
|
||||
|
||||
## Pandoc — GPL-2.0-or-later
|
||||
|
||||
- Binary shipped: `bin/pandoc` (v3.9.0.2, official upstream release, unmodified)
|
||||
- SHA-256 (linux): `7d124235998ecd3cdd9a463b1e5f6691a178b6461824c29a36170a0882f05597`
|
||||
- Source: <https://github.com/jgm/pandoc/archive/refs/tags/3.9.0.2.tar.gz>
|
||||
- Pandoc statically links Haskell libraries (GHC ecosystem, mostly BSD-3);
|
||||
their sources are included in the upstream release tarball's dependency set.
|
||||
|
||||
## FFmpeg — GPL-3.0-or-later (build configuration)
|
||||
|
||||
- Binary shipped: `ffmpeg` provided by the npm package `ffmpeg-static@5.3.0`
|
||||
(Linux: johnvansickle.com build; Windows: gyan.dev; macOS: evermeet.cx —
|
||||
all `--enable-gpl` builds including x264/x265, per the build banner)
|
||||
- Source:
|
||||
- FFmpeg: <https://ffmpeg.org/releases/> (use the release matching
|
||||
`ffmpeg -version` of the shipped binary)
|
||||
- Build scripts & pinned versions: <https://github.com/eugeneware/ffmpeg-static>
|
||||
- x264: <https://code.videolan.org/videolan/x264> ·
|
||||
x265: <https://bitbucket.org/multicoreware/x265_git/> ·
|
||||
other `--enable-lib*` components: their upstream sources (all free/open)
|
||||
|
||||
## PyInstaller bootloader (inside the bundled MarkItDown binary) — GPL-2.0 with boot-exception
|
||||
|
||||
- Binary shipped: `bin/markitdown` (MarkItDown 0.1.7 frozen with PyInstaller 6.x)
|
||||
- PyInstaller grants a special exception allowing the bootloader to be
|
||||
embedded in non-GPL frozen applications; source anyway:
|
||||
<https://github.com/pyinstaller/pyinstaller>
|
||||
- Everything frozen above the bootloader (markitdown + Python packages +
|
||||
CPython runtime) is permissively licensed (MIT/Apache/BSD/PSF/MPL);
|
||||
see THIRD-PARTY-NOTICES.md §2 for the list.
|
||||
- CPython runtime source: <https://www.python.org/downloads/source/>
|
||||
(PSF License — not GPL, listed here for completeness).
|
||||
|
||||
## libvips (via sharp prebuilt binaries) — LGPL-2.1-or-later
|
||||
|
||||
- Shipped as dynamically-loaded libraries from `@img/*` prebuilts for sharp 0.35.4
|
||||
- Source: <https://github.com/libvips/libvips> · prebuilt bundle sources:
|
||||
<https://github.com/lovell/sharp-builds>
|
||||
- LGPL compliance: the app's own source is public (MIT) and the libraries
|
||||
remain separately replaceable files in the installation directory
|
||||
(`node_modules/@img/`), satisfying the relinking requirement.
|
||||
|
||||
---
|
||||
|
||||
_Versions and hashes above correspond to the release this file ships with;
|
||||
update them when bumping bundled tool versions._
|
||||
@@ -0,0 +1,108 @@
|
||||
# Third-Party Notices & Licenses
|
||||
|
||||
MarkdownConverter (this app) is MIT-licensed. This document lists the
|
||||
third-party components that are **distributed with** the application, their
|
||||
licenses, and where to obtain source code. Full license texts for the
|
||||
copyleft and font licenses referenced here are in the `third-party-licenses/`
|
||||
folder shipped alongside this file (and in the source repository).
|
||||
|
||||
This product includes software developed by third parties under the licenses
|
||||
below. Copyright and license notices are reproduced verbatim or referenced
|
||||
per each license's terms.
|
||||
|
||||
---
|
||||
|
||||
## 1. This application
|
||||
|
||||
**MarkdownConverter** — Copyright (C) 2024-2025 ConcreteInfo (Amit Haridas) —
|
||||
MIT License. See the repository `LICENSE` file.
|
||||
|
||||
---
|
||||
|
||||
## 2. Bundled external binaries
|
||||
|
||||
These run as separate operating-system processes, launched via `execFile`
|
||||
with literal argv (never a shell, never linked into the app).
|
||||
|
||||
| Component | Version | License | Notes |
|
||||
|---|---|---|---|
|
||||
| Pandoc | 3.9.0.2 | GPL-2.0-or-later | Downloaded at build time by `scripts/download-tools.js` (SHA-256 pinned); license: [GPL-2.0](third-party-licenses/GPL-2.0.txt) |
|
||||
| FFmpeg | bundled by `ffmpeg-static` 5.3.0 | **GPL-3.0-or-later build** (`--enable-gpl --enable-libx264/x265`) | License text: <https://ffmpeg.org/legal.html>; source offer below |
|
||||
| MarkItDown | 0.1.7 (+ Python deps) | MIT | Microsoft's any-file→Markdown importer, frozen with PyInstaller by `scripts/bundle-markitdown.js`; includes an embedded CPython runtime (PSF license) |
|
||||
| sharp / libvips prebuilt binaries | 0.35.4 | Apache-2.0 / **LGPL-2.1-or-later** (libvips) | Dynamically loaded native addon; LGPL compliance: this app's full MIT source is public, enabling relinking; license: [LGPL-2.1](third-party-licenses/LGPL-2.1.txt) |
|
||||
| KaTeX (CSS + fonts) | 0.18.5 | MIT | `assets/katex/` |
|
||||
| JetBrains Mono, Fira Code fonts | — | SIL OFL 1.1 | `assets/fonts/`; license: [OFL-1.1](third-party-licenses/OFL-1.1.txt) |
|
||||
| Electron | 41.x | MIT | and its bundled Chromium (BSD-style licenses) / Node.js (MIT) / OpenSSL (Apache-2.0) — see <https://www.electronjs.org/blog/electron-licensing> |
|
||||
|
||||
### GPL source availability (GPL §3 offer)
|
||||
|
||||
Corresponding source for every GPL-licensed binary distributed with this app
|
||||
is available on written request and from these permanent locations — see
|
||||
**[SOURCES.md](SOURCES.md)** for exact versions and URLs.
|
||||
|
||||
### Python packages inside the bundled MarkItDown binary
|
||||
|
||||
The frozen MarkItDown binary embeds CPython and (each MIT/Apache-2.0/BSD-3/
|
||||
PSF/MPL-2.0 licensed unless noted): markitdown, onnxruntime (MIT), numpy
|
||||
(BSD-3), magika (Apache-2.0), beautifulsoup4 / soupsieve (MIT), requests
|
||||
(Apache-2.0) + urllib3/idna/charset-normalizer, certifi (MPL-2.0),
|
||||
markdownify, defusedxml (PSF), protobuf (BSD-3), flatbuffers (Apache-2.0),
|
||||
pdfminer.six (MIT), python-docx, python-pptx, openpyxl, extract-msg,
|
||||
markdown-it-py / mdurl, pyinstaller (GPL-2.0-with-exception — build tool
|
||||
only; its bootloader is embedded, source offer included in SOURCES.md),
|
||||
Packaging, six, click, chardet (LGPL — dynamically loadable Python module).
|
||||
|
||||
---
|
||||
|
||||
## 3. npm dependencies shipped in the app (runtime)
|
||||
|
||||
| Package | Version | License |
|
||||
|---|---|---|
|
||||
| @cantoo/pdf-lib | 2.9.1 | MIT |
|
||||
| @codemirror/* (autocomplete, commands, lang-*, language, lint, search, state, theme-one-dark, view), codemirror | 6.x | MIT |
|
||||
| @replit/codemirror-vim | 6.4.0 | MIT |
|
||||
| core-util-is | 1.0.3 | MIT |
|
||||
| docx | 9.6.1 | MIT |
|
||||
| dompurify | 3.4.14 | (MPL-2.0 OR Apache-2.0) |
|
||||
| electron-store | 10.1.0 | MIT |
|
||||
| ffmpeg-static | 5.3.0 | GPL-3.0-or-later (binary; see §2) |
|
||||
| highlight.js | 11.11.1 | BSD-3-Clause |
|
||||
| html2pdf.js | 0.14.0 | MIT |
|
||||
| jszip | 3.10.1 | (MIT OR GPL-3.0-or-later) |
|
||||
| katex | 0.18.5 | MIT |
|
||||
| marked, marked-footnote, marked-highlight | 17.x / 1.4 / 2.2 | MIT |
|
||||
| mermaid | 11.17.2 | MIT |
|
||||
| pdfjs-dist | 5.5.207 | Apache-2.0 |
|
||||
| pdfkit | 0.17.2 | MIT |
|
||||
| pizzip | 3.2.0 | (MIT OR GPL-3.0) |
|
||||
| sharp | 0.35.4 | Apache-2.0 (+ LGPL libvips binaries; see §2) |
|
||||
| simple-git | 3.36.0 | MIT |
|
||||
| tslib | 2.8.1 | 0BSD |
|
||||
|
||||
(Development-only dependencies — electron-builder, eslint, prettier, jest,
|
||||
cross-env, @testing-library/dom — are not distributed with the application.)
|
||||
|
||||
## 4. Optional external tools (NOT bundled)
|
||||
|
||||
These are detected and used when the user installs them; no copy is
|
||||
distributed with this app, so no redistribution obligations arise:
|
||||
|
||||
- **LibreOffice** (MPL-2.0) — enhanced Office-format conversion
|
||||
- **MiKTeX / TeX Live** (LPPL/GPL per component) — LaTeX PDF export
|
||||
- **ImageMagick** (Apache-2.0-style) — extra image formats in the universal converter
|
||||
- **PlantUML** (GPL-3.0) + a Java runtime — local diagram rendering
|
||||
- **Calibre** (`ebook-convert`) — MOBI export
|
||||
- **System MarkItDown with `[all]` extras** — audio transcription / OCR
|
||||
|
||||
## 5. Trademarks
|
||||
|
||||
Product names used to describe compatibility (Pandoc, FFmpeg, LibreOffice,
|
||||
MarkItDown, Microsoft, Excel, Word, PowerPoint…) are trademarks of their
|
||||
respective owners and are not affiliated with this project.
|
||||
|
||||
## 6. License texts
|
||||
|
||||
See the `third-party-licenses/` directory: `GPL-2.0.txt`, `LGPL-2.1.txt`,
|
||||
`MPL-2.0.txt`, `Apache-2.0.txt`, `OFL-1.1.txt`, `PSF-Python.txt`. MIT and
|
||||
BSD-3-Clause texts are short and reproduced in each package's own repository;
|
||||
per-package LICENSE files also ship inside `node_modules/` in source form.
|
||||
@@ -1,5 +1,157 @@
|
||||
# PanConverter - Updates & Changelog
|
||||
|
||||
## Version 4.7.1 (2026-09-05)
|
||||
|
||||
### New: Export Themes (Word + PDF)
|
||||
- Theme picker in the export dialog (basic and advanced mode) for PDF and DOCX:
|
||||
**Default (Pandoc), Modern, Classic, Sepia, Minimal, Elegant**
|
||||
- PDF: LaTeX header recolors/reformats headings + links (xcolor/titlesec,
|
||||
core-TeX packages only); DOCX: styles.xml surgery recolors Heading1-6/Title/
|
||||
Subtitle/Hyperlink and swaps heading/body fonts
|
||||
- Themes persist in export presets; unknown ids in old presets fall back to
|
||||
Default instead of failing the export
|
||||
|
||||
### Branding
|
||||
- New M↓ brand identity: app icons, favicons, tray icon, welcome mark,
|
||||
README wordmark (vector kit in assets/markdown-converter-assets/)
|
||||
|
||||
### Fixes
|
||||
- **Windows**: pdfjs text/image extraction failed on Windows —
|
||||
standardFontDataUrl is now a proper file:// URL (raw backslash paths
|
||||
failed pdfjs's trailing-slash URL validation)
|
||||
- **Windows**: sharp temp-file cleanup (EPERM retry), path-separator test
|
||||
assertions, and pdfjs test timeouts fixed — the Windows CI job is green
|
||||
- FiraCode tooling downloads pinned to the immutable 6.2 release;
|
||||
.gitattributes stops CRLF checkout rewriting hash-pinned files
|
||||
- macOS pandoc extractor locates the binary in the archive (layout changed)
|
||||
- Packaged apps resolve bundled pandoc/markitdown next to the executable
|
||||
(resourcesPath lookup was wrong since 4.5 — packaged builds silently used
|
||||
system pandoc)
|
||||
|
||||
---
|
||||
|
||||
## Version 4.7.0 (2026-09-05)
|
||||
|
||||
### Bundling & Legal Compliance
|
||||
- **MarkItDown is now bundled**: `npm run bundle:markitdown` freezes Microsoft's
|
||||
markitdown (MIT) + embedded Python runtime into a single ~75MB per-platform
|
||||
binary (`bin/<platform>/markitdown`) via PyInstaller (ML extras excluded);
|
||||
the app prefers the bundled binary and falls back to system installs
|
||||
- Packaging copies the bundled markitdown for Windows/macOS/Linux alongside Pandoc
|
||||
- **THIRD-PARTY-NOTICES.md** — full license inventory of everything distributed
|
||||
(bundled binaries, npm runtime deps, fonts, embedded Python packages)
|
||||
- **SOURCES.md** — GPL §3(b) written source offer for Pandoc / FFmpeg (GPL build) /
|
||||
PyInstaller bootloader, with pinned versions + SHA-256; LGPL relinking note for libvips
|
||||
- **third-party-licenses/** — canonical texts: GPL-2.0, LGPL-2.1, MPL-2.0,
|
||||
Apache-2.0, OFL-1.1, PSF-Python
|
||||
- **Help → Third-Party Notices & Licenses** — in-app viewer for both documents
|
||||
- **download-tools.js** now SHA-256 pins and verifies every downloaded artifact
|
||||
(post-download and against the cache on every run; hard-fails on mismatch)
|
||||
- README gains a "Bundled Dependencies, Legal Notices & Credits" section
|
||||
- Large optional tools intentionally NOT bundled (documented): LibreOffice,
|
||||
MiKTeX/TeX Live, ImageMagick, PlantUML+JRE, Calibre
|
||||
|
||||
---
|
||||
|
||||
## Version 4.6.1 (2026-09-05)
|
||||
|
||||
### New Features
|
||||
- **MarkItDown import** — "File → Import with MarkItDown (Any Format)…" embeds
|
||||
Microsoft's [markitdown](https://github.com/microsoft/markitdown) (MIT) as an
|
||||
any-file → Markdown path: PDF, DOCX, PPTX, XLSX, Outlook .msg/.eml, EPUB,
|
||||
images, CSV/JSON/XML, ZIP; audio transcription and OCR with the `[all]` extras
|
||||
- Command auto-resolution: `markitdown` binary, then `python -m markitdown` /
|
||||
`python3 -m markitdown` (probed once, cached)
|
||||
- Same SEC-1 argv discipline as Pandoc (execFile only, paths never through a shell),
|
||||
50MB input cap, 120s timeout, path-sanitized errors that surface markitdown's
|
||||
actionable `pip install 'markitdown[...]'` hints
|
||||
- Output written next to the source as `<name>.md` (numeric suffix instead of
|
||||
overwriting) and opened in a new tab; `markitdown:available` / `markitdown:convert`
|
||||
IPC for future renderer flows
|
||||
- **AI Assistant: Anthropic-compatible provider** — any base URL speaking the
|
||||
Anthropic messages schema (LiteLLM proxies, Bedrock gateways, local servers);
|
||||
x-api-key + Bearer auth, keyless proxies supported, tolerates bases with or
|
||||
without a trailing `/v1`
|
||||
|
||||
### Bug Fixes
|
||||
- File → Open PDF crashed the PDF editor (null operation matched no section; now
|
||||
defaults to Merge)
|
||||
- Backlinks panel required the wrong module path (failed at registration)
|
||||
- writing-studio engines/panels now await their IPC-backed settings/file backends
|
||||
(eliminates `JSON.parse("[object Promise]")` crashes)
|
||||
- Manuscript panel's window.prompt (unsupported in Electron) replaced with an
|
||||
inline dialog; collaboration comment store made async to match its IO
|
||||
|
||||
---
|
||||
|
||||
## Version 4.6.0 (2026-09-05)
|
||||
|
||||
### New Features
|
||||
|
||||
#### AI Assistant Plugin (multi-provider)
|
||||
- Chat sidebar panel with rolling conversation history and insert-reply-into-document
|
||||
- Providers: OpenAI, Anthropic, Ollama, LM Studio, and any OpenAI-compatible endpoint
|
||||
- All provider traffic proxied through the main process — API keys never enter the renderer and the CSP stays closed to AI endpoints
|
||||
- Commands: AI Summarize / Improve / Explain / Translate selection
|
||||
- Answers the writing-studio `ai:analyze` contract, finally enabling the Proofread panel
|
||||
|
||||
#### Collaboration Plugin (inline comments)
|
||||
- Anchor-based comments stored in `.comments/` sidecar files (never exported, never committed)
|
||||
- Comments sidebar panel: add at cursor, list, resolve, delete, jump to anchor
|
||||
- Drift detection flags moved/edited anchors; F8 navigates to the next open comment
|
||||
|
||||
#### Local Knowledge Base (wiki-links + backlinks)
|
||||
- `[[Note]]`, `[[Note|alias]]`, `[[Note#section]]` render as links in the preview (code blocks excluded)
|
||||
- Clicking a wiki-link opens the note or offers to create it
|
||||
- Backlinks sidebar panel scans the folder (bounded BFS) for documents linking to the current one
|
||||
|
||||
#### Crash Recovery / Session Restore
|
||||
- Open tabs (paths + unsaved buffer content) snapshotted to localStorage, debounced on edits, on tab changes, on unload, and once a minute
|
||||
- Restore prompt on launch with per-tab restore, clean-fresh option, and 2MB content budget
|
||||
|
||||
#### Document Version History
|
||||
- Every save snapshots the previous on-disk content to `<userData>/versions/`
|
||||
- History sidebar panel: list, restore (with safety snapshot), unified diff vs. current, delete, manual "save version now"
|
||||
- Per-document pruning (20 versions), path-hash storage, id-validated reads
|
||||
|
||||
#### Editor
|
||||
- Vim keybindings (View → Vim Mode, persisted, live toggle via CodeMirror Compartment)
|
||||
- Snippet Tab-expansion: type a snippet name and press Tab to insert it
|
||||
- Zen Mode word-goal setter (the HUD progress bar finally has UI)
|
||||
|
||||
#### Export / Conversion
|
||||
- **Real PDF encryption**: pdf-lib swapped for @cantoo/pdf-lib — encrypt/decrypt/permissions now actually work (UI auto-enables via the capability probe)
|
||||
- **XLSX export**: markdown tables → native Excel workbook, one sheet per table (no Pandoc needed)
|
||||
- **ODT headers/footers + page size**: real ODF styles.xml patching replaces the empty stub
|
||||
- **Local PlantUML rendering**: diagrams render on-machine via the `plantuml` CLI when installed; plantuml.com stays as fallback
|
||||
- **KaTeX bundled locally** (CSS + fonts): math renders offline, no CDN calls
|
||||
- Writing heatmap (GitHub-style 30-day grid) in the writing-studio Goals panel
|
||||
|
||||
#### Platform
|
||||
- Quick Note global scratchpad (Ctrl+Alt+Q, works when unfocused; appends to `notes/quick-notes.md`)
|
||||
- Deep link protocol `markdownconverter://open?path=…`
|
||||
- REPL confirmation dialog before first code execution per language per session (unsandboxed-execution guard rail)
|
||||
- Writing-studio's four sidebar panels (Manuscript/Goals/Snapshots/Proofread) are now actually wired with rail icons
|
||||
- Plugin sidebar panels get automatic rail icons via `registerPanel({icon})`
|
||||
|
||||
### Bug Fixes
|
||||
- `Ctrl+Shift+P` collision: PDF (Enhanced) export now `Ctrl+Alt+Shift+P`; Command Palette keeps `Ctrl+Shift+P`
|
||||
- Universal Converter's Pandoc tool no longer always reports "not installed" (`checkConverterAvailable` gained a pandoc case with bundled-binary check)
|
||||
- CLI headless export: removed dangling `--css` / `--reference-doc` flags that made pandoc exit with an error; `--self-contained` replaced with `--standalone` (Pandoc 3.x)
|
||||
- Removed dead "Open Export Options Dialog…" button from the converter dialog
|
||||
- Removed duplicate `styles-zen.css` include
|
||||
|
||||
### Security
|
||||
- AI provider requests carry size caps (200KB prompt), timeouts (120s), and user-safe error surfaces
|
||||
- Version-history reads validate ids against traversal; history listing requires a valid document path
|
||||
- PlantUML local rendering removes the diagram-text exfiltration path when a local CLI exists (CVE-MC-007 follow-up)
|
||||
|
||||
### Tests
|
||||
- New suites: OdtStyling, AiProviders, ai-assistant prompts, collaboration comment-store, wiki-links/backlinks, session-store, XlsxExporter, VersionHistory
|
||||
- PDFOperations encryption tests rewritten for the real-encryption reality
|
||||
|
||||
---
|
||||
|
||||
## Version 4.0.0 (2026-03-04)
|
||||
|
||||
### Major Changes
|
||||
|
||||
|
Before Width: | Height: | Size: 869 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 885 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 885 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 606 B After Width: | Height: | Size: 655 B |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.1 KiB |
@@ -0,0 +1,95 @@
|
||||
# Markdown Converter — Brand Assets
|
||||
|
||||
Visual identity for [markdown-converter](https://github.com/amitwh/markdown-converter): a cross-platform Markdown editor & document converter powered by Pandoc.
|
||||
|
||||
## Concept
|
||||
|
||||
The mark is a stylized **M** whose right descender becomes a downward chevron — a literal "**M↓**" for **Markdown**, suggesting the source document flowing downward into rendered output (PDF, DOCX, PPTX, …).
|
||||
|
||||
The palette is a vibrant orange-to-deep-orange gradient (`#FB923C → #C2410C`) on a white mark — warm, energetic, distinctive. The mark itself is **white** on light surfaces, and a luminous peach-to-orange gradient (`#FFEDD5 → #FB923C`) on dark surfaces.
|
||||
|
||||
## Files
|
||||
|
||||
### App icon (vector, primary)
|
||||
|
||||
These are **true SVG app icons** — clean vector paths, no rasters. Drop them straight into a macOS/Windows/Linux app bundle, a PWA manifest, an iOS asset catalog, an Electron build, or any HTML page.
|
||||
|
||||
| File | Use it for |
|
||||
| --- | --- |
|
||||
| `app-icon.svg` | **Primary app icon.** Emerald→teal vertical gradient, subtle white highlight upper-left, white M↓ mark. |
|
||||
| `app-icon-dark.svg` | **Dark-mode app icon.** Charcoal gradient background, soft teal radial glow upper-left, mint-to-emerald gradient on the M↓ mark. |
|
||||
| `app-icon-flat.svg` | **Flat solid variant.** Single emerald background, white M↓ mark. Use when you can't render gradients (print, stickers, single-color contexts). |
|
||||
|
||||
### Logo (wordmark)
|
||||
|
||||
| File | Use it for |
|
||||
| --- | --- |
|
||||
| `logo-horizontal.jpg` (2752×1536) | High-res raster master. README hero, press kit. |
|
||||
| `logo-horizontal-1600w.jpg` (1600×893) | Web-ready compressed version. |
|
||||
| `logo-horizontal.svg` | Vector wordmark. Use in HTML, CSS, anywhere that needs to scale. |
|
||||
|
||||
### Vector mark (for code & inline use)
|
||||
|
||||
| File | Use it for |
|
||||
| --- | --- |
|
||||
| `mark.svg` | Gradient SVG mark. Drop into HTML, use as a UI element, or rasterize at any size. |
|
||||
| `mark-mono.svg` | Monochrome SVG. Uses `currentColor` — style it from CSS (`color: white;`) for any single-color context. |
|
||||
| `mark-standalone.jpg` (2048×2048) | Raster M↓ on white, for places that need a PNG (GitHub avatar, doc thumbnails). |
|
||||
|
||||
### Favicons (rasterized from `app-icon.svg`)
|
||||
|
||||
In the `favicons/` directory:
|
||||
|
||||
| File | Use it for |
|
||||
| --- | --- |
|
||||
| `favicon.ico` | Legacy `.ico` (16/32/48/64 embedded). Drop at the site root. |
|
||||
| `favicon-16x16.png`, `favicon-32x32.png`, `favicon-48x48.png` | Standard browser favicons. |
|
||||
| `apple-touch-icon.png` (180×180) | iOS home screen & "Add to Home Screen". |
|
||||
| `icon-192.png`, `icon-512.png` | Android home screen, PWA manifest, web app. |
|
||||
|
||||
### Social preview
|
||||
|
||||
| File | Use it for |
|
||||
| --- | --- |
|
||||
| `og-social-preview-1200x630.jpg` | **GitHub social preview** — set as the repository's social card image (Settings → Social preview). Also works as Open Graph / Twitter Card. |
|
||||
|
||||
## Usage in the repo
|
||||
|
||||
Drop the vector icons + favicon set into the repo root or a `/brand` folder, then in `README.md`:
|
||||
|
||||
```markdown
|
||||
<p align="left">
|
||||
<img src="./brand/app-icon.svg" width="80" alt="Markdown Converter">
|
||||
</p>
|
||||
```
|
||||
|
||||
For the favicon, in `index.html` (or any HTML site):
|
||||
|
||||
```html
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||
```
|
||||
|
||||
For an Electron app, point `build.icon` at the SVG (or a 512×512 PNG export):
|
||||
|
||||
```json
|
||||
{
|
||||
"build": {
|
||||
"icon": "brand/icon-512.png"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Color tokens
|
||||
|
||||
```
|
||||
--mc-orange-400: #FB923C /* gradient start (light) */
|
||||
--mc-orange-700: #C2410C /* gradient end (light) */
|
||||
--mc-orange-500: #F97316 /* flat / accent */
|
||||
--mc-peach-100: #FFEDD5 /* dark-mode mark start */
|
||||
--mc-orange-300: #FDBA74 /* dark-mode mark mid */
|
||||
--mc-ink-900: #0F172A /* primary text */
|
||||
--mc-ink-500: #475569 /* secondary text */
|
||||
--mc-ink-400: #94A3B8 /* tagline / muted */
|
||||
```
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Markdown Converter app icon (dark)">
|
||||
<title>Markdown Converter (dark)</title>
|
||||
<defs>
|
||||
<linearGradient id="darkBg" x1="0" y1="0" x2="0" y2="1024" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#1C1917"/>
|
||||
<stop offset="100%" stop-color="#0C0A09"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="darkGlow" cx="280" cy="180" r="780" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#EA580C" stop-opacity="0.65"/>
|
||||
<stop offset="60%" stop-color="#9A3412" stop-opacity="0.15"/>
|
||||
<stop offset="100%" stop-color="#9A3412" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="darkMark" x1="0" y1="180" x2="0" y2="844" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" stop-color="#FFEDD5"/>
|
||||
<stop offset="100%" stop-color="#FB923C"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect width="1024" height="1024" rx="224" ry="224" fill="url(#darkBg)"/>
|
||||
<rect width="1024" height="1024" rx="224" ry="224" fill="url(#darkGlow)"/>
|
||||
<g transform="translate(154, 176) scale(7.16)" fill="none" stroke="url(#darkMark)" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
||||
<line x1="26" y1="22" x2="26" y2="72"/>
|
||||
<line x1="63" y1="22" x2="63" y2="75"/>
|
||||
<polyline points="22,18 44.5,56 67,18"/>
|
||||
<polyline points="48,60 63,76 78,60"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Markdown Converter app icon (flat)">
|
||||
<title>Markdown Converter (flat)</title>
|
||||
<rect width="1024" height="1024" rx="224" ry="224" fill="#F97316"/>
|
||||
<g transform="translate(154, 176) scale(7.16)" fill="none" stroke="#FFFFFF" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
||||
<line x1="26" y1="22" x2="26" y2="72"/>
|
||||
<line x1="63" y1="22" x2="63" y2="75"/>
|
||||
<polyline points="22,18 44.5,56 67,18"/>
|
||||
<polyline points="48,60 63,76 78,60"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 609 B |
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Markdown Converter app icon">
|
||||
<title>Markdown Converter</title>
|
||||
<defs>
|
||||
<linearGradient id="iconBg" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#FB923C"/>
|
||||
<stop offset="100%" stop-color="#C2410C"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="iconHighlight" cx="0.28" cy="0.18" r="0.55">
|
||||
<stop offset="0%" stop-color="#FFFFFF" stop-opacity="0.28"/>
|
||||
<stop offset="60%" stop-color="#FFFFFF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<rect width="1024" height="1024" rx="224" ry="224" fill="url(#iconBg)"/>
|
||||
<rect width="1024" height="1024" rx="224" ry="224" fill="url(#iconHighlight)"/>
|
||||
<g transform="translate(154, 176) scale(7.16)" fill="none" stroke="#FFFFFF" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
||||
<line x1="26" y1="22" x2="26" y2="72"/>
|
||||
<line x1="63" y1="22" x2="63" y2="75"/>
|
||||
<polyline points="22,18 44.5,56 67,18"/>
|
||||
<polyline points="48,60 63,76 78,60"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 724 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 253 KiB |