spinss

MDeX v2.2.1 (macOS · Windows · Linux · Tauri v2)

MDeX · произносится «эм-декс» (/ˌemˈdɛks/) — буква M, за которой следует «dex», два слога.

Многоязычное приложение для чтения и редактирования Markdown с акцентом на конфиденциальность и поддержку ИИ. Каждый файл обрабатывается локально — по умолчанию без сети, без загрузок на сервер, без облачной синхронизации, без рекламы, без телеметрии; атомарное (устойчивое к сбоям) сохранение исключает потерю данных при сбое или отключении питания. Начиная с v2.0, MDeX также предлагает опциональное редактирование текста с помощью ИИ — и при этом может оставаться полностью автономным: локальной модели (например, Ollama) интернет не требуется; сетевой запрос выполняет только онлайн-сервис ИИ (OpenAI / DeepSeek / Anthropic / GLM / Gemini / Kimi и т. д.), и только когда вы его настроите и запустите.


🌐 Языки

Интерфейс доступен на 17 языках: English, 简体中文, Français, Deutsch, Español, Português, Italiano, Русский, 日本語, 한국어, العربية, हिन्दी, ਪੰਜਾਬੀ, Tiếng Việt, Bahasa Indonesia, اردو, Монгол (Кирилл).


✨ Возможности


⌨️ Горячие клавиши

Используйте на macOS, Ctrl на Windows / Linux.

Горячая клавиша Действие
⌘/Ctrl + N Создать
⌘/Ctrl + O Открыть файл
⌘/Ctrl + S Сохранить
⌘/Ctrl + Shift + S Сохранить как
⌘/Ctrl + W Закрыть вкладку
⌘/Ctrl + Shift + W Закрыть окно
⌘/Ctrl + F Найти
⌘/Ctrl + H Заменить
⌘/Ctrl + B / I / E Полужирный / Курсив / Строчный код
⌘/Ctrl + K Вставить ссылку
Tab Отступ на 2 пробела
Alt/Option + перетаскивание Прямоугольное (колоночное) выделение
Alt/Option + Shift + ←↑↓→ Расширить колоночное выделение
Esc Отменить колоночное выделение
⌘/Ctrl + =/−/0 Масштаб последней нажатой панели (редактор или предпросмотр): увеличить / уменьшить / сбросить
⌘/Ctrl + J Редактирование с помощью ИИ

При нескольких открытых окнах горячие клавиши действуют только на окно в фокусе. Когда открыто окно просмотра изображений, ⌘/Ctrl + =/−/0 масштабирует изображение.


📝 Краткая шпаргалка

Markdown: заголовки # / ## / ###, полужирный **текст**, курсив *текст*, зачёркивание ~~текст~~, строчный код `код`, блоки кода (тройные обратные кавычки с указанием языка по желанию), цитата > текст, списки - / 1., список задач - [ ] / - [x], ссылка [текст](url), изображение [alt](url), разделитель ---, таблицы | A | B |.

Математика: строчно $E = mc^2$; блочно $$\int_0^1 x\,dx$$ (может занимать несколько строк). Используется синтаксис LaTeX, отображается через KaTeX; $ внутри блоков кода не считается разделителем формул. Поддерживаются окружения align / aligned, матрицы, cases и другие распространённые.

Цитирование: напишите в тексте [@key] или [@a; @b] (совместимый с LaTeX \cite{key}), вставьте библиотеку через блок ```bibtex или загрузите .bib кнопкой «Ссылки». В конце формируется список ссылок; [n] в тексте кликабельны.


📤 Экспорт (Сохранить как)

Нажмите «Сохранить как» и выберите формат:


🔒 Автономность и безопасность


📦 Установка

Готовые сборки

Скачайте установщик для вашей платформы из любого источника:

macOS (.dmg, universal arm64 + x86_64), Windows (.exe, NSIS installer), Linux (.deb / .rpm / .AppImage).

Открытие неподписанного приложения на macOS (обход Gatekeeper)

Это приложение не имеет подписи разработчика / не нотаризовано (в автономных сценариях нотаризация онлайн обычно невозможна). На macOS 12+, особенно macOS 26 (Tahoe), запуск прямо из .dmg — или свежескопированной сборки — завершается ошибкой "MDeX.app is damaged and can't be opened." Это Gatekeeper, а не реальное повреждение. Исправьте в Terminal:

  1. Сначала перетащите MDeX.app из .dmg в /Applications — никогда не запускайте напрямую из dmg (это вызывает App Translocation и атрибут com.apple.provenance, настоящую причину «повреждено» на macOS 26).
  2. Очистите атрибуты и переподпишите:
    xattr -cr /Applications/MDeX.app
    codesign --force --deep --sign - /Applications/MDeX.app

    com.apple.provenance защищён SIP и не может быть удалён даже с sudo; переподпись сбрасывает подпись, чтобы Gatekeeper разрешил запуск. spctl всё равно сообщает rejected для ad-hoc подписи — это ожидаемо и не блокирует open.

  3. Запустите через open /Applications/MDeX.app (или двойной клик). При первом запуске может появиться запрос — подтвердите через Системные настройки → Конфиденциальность и безопасность → Открыть всё равно, или кликните правой кнопкой по приложению → Открыть.

🛠️ Сборка из исходников

Исходный код: https://github.com/fwzheng/mdex. Следуйте инструкциям по сборке в репозитории (настройка, зависимости и команды описаны там).


📁 Структура проекта

markdown/
├── app-shell.html          # frontend shell (HTML+CSS); app logic lives in src/app.js
├── src/
│   ├── app.js              # application logic (// @ts-check; inlined into dist by build-html.mjs)
│   ├── i18n.js            # 17-language UI strings (pure data; window.I18N, split from app.js)
│   ├── help.js            # help-document data (HELP_STRINGS + SK/sc/CITE_HELP_*, window.HELP_DATA)
│   └── globals.d.ts        # vendor / Window type declarations for type-checking
├── tsconfig.json           # type-check config (tsc --noEmit; no bundler)
├── tools/
│   ├── fetch-vendor.mjs    # one-time: download deps into vendor/ + integrity lock (online only here)
│   ├── build-html.mjs      # inline vendor + src/app.js + i18n.js + help.js into dist/index.html (KaTeX fonts → base64)
│   └── test-pure.mjs       # frontend pure-function tests (npm test)
├── dist/index.html         # build output: self-contained single file (Tauri frontendDist)
├── vendor/                 # download cache + integrity.json (.gitignore)
├── package.json            # @tauri-apps/cli + typescript(dev) + scripts
└── src-tauri/
    ├── Cargo.toml          # tauri 2 + dialog / single-instance + encoding_rs
    ├── build.rs            # tauri_build::build()
    ├── tauri.conf.json     # 1200×750 window, strict CSP, icons, .md association, menu hooks
    ├── capabilities/default.json
    ├── icons/              # full icon set from `cargo tauri icon`
    └── src/{main.rs, lib.rs}   # menus + file IO + multi-window routing + atomic write / file ownership

🎨 Кастомизация

Что изменить Где
Имя приложения / Bundle ID src-tauri/tauri.conf.jsonproductName / identifier
Размер окна tauri.conf.jsonapp.windows[0] (по умолчанию 1200×750)
Иконки замените исходное изображение, затем npm run icon
Цвета темы / шрифты CSS-переменные :root в начале app-shell.html
Пункты меню build_menu() в src-tauri/src/lib.rs
Текст интерфейса / документ справки I18N / HELP_STRINGS в src/app.js
Версии зависимостей VERSIONS в начале tools/fetch-vendor.mjs (затем npm run fetch -- --force)

📄 Лицензия

Собственный код проекта имеет открытый исходный код под Apache License 2.0.

Сторонние компоненты: проект использует ряд сторонних компонентов (включая, но не ограничиваясь marked, KaTeX, highlight.js, DOMPurify, jsPDF, html2canvas-pro, turndown, mermaid, @retorquere/bibtex-parser и Tauri и др.); их уведомления об авторских правах и лицензиях приведены в соответствующих исходных файлах. Эти компоненты распространяются под лицензиями MIT, BSD-3-Clause, Apache-2.0, MPL-2.0 и другими открытыми лицензиями.

Требования к распространению: согласно лицензии Apache-2.0, при повторном распространении этого проекта необходимо сохранять файлы LICENSE и NOTICE; если вы изменяли исходный файл, вы должны явно отметить изменения в соответствующем файле.


📬 Контакты

По проблемам или предложениям: 郑法伟 (Fawei Zheng) fwzheng@bit.edu.cn