spinss

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

MDeX · "em-dex"(/ˌemˈdɛks/)로 발음 — 글자 M 뒤에 "dex"가 오는 2음절 단어입니다.

개인정보 보호와 AI 지원에 중점을 둔 다국어 Markdown 리더 및 에디터입니다. 모든 파일은 로컬에서 처리되며, 기본적으로 네트워크 연결·업로드·클라우드 동기화·광고·원격 측정이 없습니다. 원자적(크래시 방지) 저장 덕분에 크래시나 정전 시에도 데이터가 손실되지 않습니다. v2.0부터 선택적 AI 보조 편집 기능도 제공합니다 — 완전히 오프라인으로 유지할 수 있습니다: 로컬 모델(예: Ollama)은 인터넷이 필요 없으며, 온라인 AI 서비스(OpenAI / DeepSeek / Anthropic / GLM / Gemini / Kimi 등)만이 요청을 보내고, 그것도 사용자가 구성하여 호출할 때뿐입니다.


🌐 언어

인터페이스는 17개 언어로 제공됩니다: English, 简体中文, Français, Deutsch, Español, Português, Italiano, Русский, 日本語, 한국어, العربية, हिन्दी, ਪੰਜਾਬੀ, Tiếng Việt, Bahasa Indonesia, اردو, Монгол (Кирилл).


✨ 기능


⌨️ 단축키

macOS에서는 , Windows / Linux에서는 Ctrl 를 사용하세요.

단축키 동작
⌘/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 AI 보조 편집

여러 창이 열려 있을 때, 단축키는 포커스된 창에만 적용됩니다. 이미지 뷰어 창이 열려 있을 때, ⌘/Ctrl + =/−/0은 이미지를 확대/축소합니다.


📝 치트 시트

Markdown: 제목 # / ## / ###, 굵게 **text**, 기울임 *text*, 취소선 ~~text~~, 인라인 코드 `code`, 코드 블록(삼중 백틱, 언어 지정 가능), 인용 > text, 목록 - / 1., 작업 목록 - [ ] / - [x], 링크 [text](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 블록으로 라이브러리를 임베드하거나 "Refs" 버튼으로 .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은 임시 서명(ad-hoc)에 대해 계속 rejected를 보고하지만, 이는 예상된 동작이며 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
테마 색상 / 글꼴 app-shell.html 상단의 :root CSS 변수
메뉴 항목 src-tauri/src/lib.rsbuild_menu()
UI 문자열 / 도움말 문서 src/app.jsI18N / HELP_STRINGS
의존성 버전 tools/fetch-vendor.mjs 상단의 VERSIONS(이후 npm run fetch -- --force)

📄 라이선스

본 프로젝트 자체 코드는 Apache License 2.0로 오픈소스입니다.

제3자 구성 요소: 이 프로젝트는 일부 제3자 구성 요소(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