spinss

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

MDeX · se pronuncia "em-dex" (/ˌemˈdɛks/) — la letra M seguida de "dex", dos sílabas.

Un lector y editor de Markdown multilingüe centrado en la privacidad y la asistencia con IA. Cada archivo se procesa localmente — sin red, sin subidas, sin sincronización en la nube, sin anuncios, sin telemetría por defecto; el guardado atómico (a prueba de fallos) evita la pérdida de datos ante cuelgues o cortes de energía. Desde v2.0, MDeX también ofrece edición asistida por IA opcional — y puede seguir siendo totalmente offline: un modelo local (p. ej., Ollama) no necesita internet; solo un servicio de IA en línea (OpenAI / DeepSeek / Anthropic / GLM / Gemini / Kimi, etc.) realiza una petición, y únicamente cuando lo configuras y lo activas.


🌐 Idiomas

La interfaz está disponible en 17 idiomas: English, 简体中文, Français, Deutsch, Español, Português, Italiano, Русский, 日本語, 한국어, العربية, हिन्दी, ਪੰਜਾਬੀ, Tiếng Việt, Bahasa Indonesia, اردو, Монгол (Кирилл).


✨ Características


⌨️ Atajos

Usa en macOS, Ctrl en Windows / Linux.

Atajo Acción
⌘/Ctrl + N Nuevo
⌘/Ctrl + O Abrir archivo
⌘/Ctrl + S Guardar
⌘/Ctrl + Shift + S Guardar como
⌘/Ctrl + W Cerrar pestaña
⌘/Ctrl + Shift + W Cerrar ventana
⌘/Ctrl + F Buscar
⌘/Ctrl + H Reemplazar
⌘/Ctrl + B / I / P Negrita / Cursiva / Código en línea
⌘/Ctrl + K Insertar enlace
Tab Sangría de 2 espacios
Alt/Option + arrastrar Selección rectangular (columna)
Alt/Option + Shift + ←↑↓→ Extender selección de columna
Esc Cancelar selección de columna
⌘/Ctrl + =/−/0 Zoom del último panel clicado (editor o vista previa): acercar / alejar / restablecer
⌘/Ctrl + J Edición asistida por IA

Con varias ventanas abiertas, los atajos solo afectan a la ventana enfocada. Cuando la ventana del visor de imágenes está abierta, ⌘/Ctrl + =/−/0 amplía la imagen en su lugar.


📝 Hoja de referencia rápida

Markdown: encabezados # / ## / ###, negrita **texto**, cursiva *texto*, tachado ~~texto~~, código en línea `código`, bloques de código (triple comilla invertida, con lenguaje opcional), cita > texto, listas - / 1., lista de tareas - [ ] / - [x], enlace [texto](url), imagen ![alt](url), divisor ---, tablas | A | B |.

Matemáticas: en línea $E = mc^2$; en bloque $$\int_0^1 x\,dx$$ (puede ocupar varias líneas). Usa sintaxis LaTeX, renderizada por KaTeX; el $ dentro de bloques de código no se trata como delimitador matemático. Admite align / aligned, matrices, cases y otros entornos comunes.

Citas: escribe [@key] o [@a; @b] en el texto (compatible con LaTeX \cite{key}), incrusta la biblioteca mediante un bloque ```bibtex o carga un .bib con el botón "Refs". Se genera una lista de Referencias al final; la [n] en el texto es clicable.


📤 Exportación (Guardar como)

Haz clic en "Guardar como" y elige un formato:


🔒 Offline y seguridad


📦 Instalación

Descargas precompiladas

Descarga el instalador para tu plataforma desde cualquiera de las dos fuentes:

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

Abrir la app sin firmar en macOS (omitir Gatekeeper)

Esta app no está firmada por el desarrollador ni notarizada (los escenarios offline normalmente no pueden notalizar en línea). En macOS 12+, especialmente macOS 26 (Tahoe), iniciarla directamente desde el .dmg — o desde una compilación recién copiada — falla con "MDeX.app is damaged and can't be opened." Eso es Gatekeeper, no un daño real. Arréglalo en Terminal:

  1. Primero arrastra MDeX.app del .dmg a /Applications — nunca la ejecutes directamente desde el dmg (eso activa App Translocation y el atributo com.apple.provenance, la verdadera causa de "dañada" en macOS 26).
  2. Borra los atributos y vuelve a firmar:
    xattr -cr /Applications/MDeX.app
    codesign --force --deep --sign - /Applications/MDeX.app

    com.apple.provenance está protegido por SIP y no puede eliminarse ni con sudo; volver a firmar reinicia la firma para que Gatekeeper permita ejecutarla. spctl sigue mostrando rejected para el firmado ad hoc — es esperado, y no bloquea open.

  3. Inicia con open /Applications/MDeX.app (o doble clic). El primer inicio puede seguir mostrando un aviso — confirma en Configuración del Sistema → Privacidad y Seguridad → Abrir de todos modos, o clic derecho sobre la app → Abrir.

🛠️ Compilar desde el código fuente

Código fuente: https://github.com/fwzheng/mdex. Sigue las instrucciones de compilación del repositorio (configuración, dependencias y comandos documentados allí).


📁 Estructura del proyecto

markdown/
├── app-shell.html          # shell del frontend (HTML+CSS); la lógica de la app está en src/app.js
├── src/
│   ├── app.js              # lógica de la aplicación (// @ts-check; integrada en dist por 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        # declaraciones de tipos vendor / Window para verificación de tipos
├── tsconfig.json           # config de verificación de tipos (tsc --noEmit; sin bundler)
├── tools/
│   ├── fetch-vendor.mjs    # una vez: descarga dependencias en vendor/ + bloqueo de integridad (solo aquí en línea)
│   ├── build-html.mjs      # incrusta vendor + src/app.js + i18n.js + help.js en dist/index.html (fuentes KaTeX → base64)
│   └── test-pure.mjs       # tests de funciones puras del frontend (npm test)
├── dist/index.html         # salida de compilación: archivo único independiente (Tauri frontendDist)
├── vendor/                 # caché de descargas + 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     # ventana 1200×750, CSP estricta, iconos, asociación .md, hooks de menú
    ├── capabilities/default.json
    ├── icons/              # conjunto completo de iconos desde `cargo tauri icon`
    └── src/{main.rs, lib.rs}   # menús + E/S de archivos + enrutamiento multi-ventana + escritura atómica / propiedad de archivos

🎨 Personalización

Para cambiar Dónde
Nombre de la app / Bundle ID src-tauri/tauri.conf.jsonproductName / identifier
Tamaño de la ventana tauri.conf.jsonapp.windows[0] (predeterminado 1200×750)
Iconos sustituye la imagen fuente, luego npm run icon
Colores del tema / fuentes variables CSS en :root al inicio de app-shell.html
Elementos del menú build_menu() en src-tauri/src/lib.rs
Cadenas de UI / doc de ayuda I18N / HELP_STRINGS en src/app.js
Versiones de dependencias VERSIONS al inicio de tools/fetch-vendor.mjs (luego npm run fetch -- --force)

📄 Licencia

El código propio de este proyecto es de código abierto bajo Apache License 2.0.

Componentes de terceros: el proyecto utiliza algunos componentes de terceros (incluidos, entre otros, marked, KaTeX, highlight.js, DOMPurify, jsPDF, html2canvas-pro, turndown, mermaid, @retorquere/bibtex-parser y Tauri, etc.); sus avisos de copyright y licencia se detallan en los archivos fuente respectivos. Dichos componentes se distribuyen bajo las licencias MIT, BSD-3-Clause, Apache-2.0, MPL-2.0 y otras de código abierto.

Requisitos de distribución: según la licencia Apache-2.0, redistribuir este proyecto exige conservar los archivos LICENSE y NOTICE; si modifica algún archivo fuente, debe indicar claramente los cambios en el archivo correspondiente.


📬 Contacto

Para problemas o sugerencias: 郑法伟 (Fawei Zheng) fwzheng@bit.edu.cn