Convert Evernote's .enex export file to .md Markdown files for iA Writer
and other Markdown-compatible editors.
enex2writer is an offline Evernote to Markdown converter. It turns an
Evernote desktop .enex export into one UTF-8 .md file per note, a shared
assets/ directory, and a manifest.json conversion report. It uses only
Python’s standard library at runtime, so the conversion can run without
network access.
- Preserves note titles, body text, headings, paragraphs, emphasis, lists, checkboxes, blockquotes, tables, code blocks, and horizontal rules.
- Extracts images and other ENEX resources, linking attachments from Markdown.
- Writes created/updated timestamps and tags in YAML frontmatter.
- Rewrites common Evernote internal links to local Markdown when the target is present in the same export.
- Preserves unresolved Evernote links and reports them in
manifest.json. - Uses safe filenames, resolves duplicate titles, deduplicates identical resources, and refuses accidental note overwrites by default.
- Makes no HTTP/API calls and does not perform OCR on scanned documents.
Python 3.10 or newer is required. Install from a checkout:
python3 -m pip install .For development, an editable install is convenient:
python3 -m pip install -e .The package has no runtime dependencies. Building the wheel may use the
standard setuptools build backend declared in pyproject.toml.
- In Evernote Desktop, export a notebook as ENEX with tags and attributes.
- Convert it into a new folder:
enex2writer ~/Exports/Research.enex ~/Documents/Notes/ResearchThe same command is available as a module:
python3 -m enex2writer ~/Exports/Research.enex ~/Documents/Notes/ResearchPreview the counts without writing anything:
enex2writer Research.enex Notes/Research --dry-runIf the destination already contains a note with the same planned filename,
the command stops safely. Use --overwrite only when replacing those files is
intentional:
enex2writer Research.enex Notes/Research --overwriteThe converter never deletes unrelated files in the destination.
Research/
├── A useful note.md
├── Another note.md
├── assets/
│ ├── diagram.png
│ └── paper.pdf
└── manifest.json
Example note:
---
title: "A useful note"
created: "2024-03-12T09:30:00Z"
updated: "2026-07-01T14:05:00Z"
tags:
- "work"
- "idea"
source: "evernote"
evernote_guid: "0123456789abcdef0123456789abcdef"
---
# A useful note
The converted note body appears here.Relative Markdown links use the generated filenames, and attachment links
point into assets/. The manifest contains the source filename, note-to-file
mapping, extracted resources, warnings, and unresolved internal links.
enex2writer INPUT.enex OUTPUT_DIR [options]
Options:
--overwrite Replace existing generated note/asset/manifest files.
--no-manifest Do not write manifest.json.
--no-frontmatter Omit YAML frontmatter from generated notes.
--dry-run Parse and plan the conversion without writing files.
-q, --quiet Print only errors.
-V, --version Print the installed version.
-h, --help Show help.
Run a small notebook first, then review images, PDFs, checkboxes, tables, encrypted notes, clipped web pages, and internal links in iA Writer. Evernote encrypted content is preserved only to the extent that it is present in the ENEX export; this tool does not decrypt it. Scanned PDFs are copied as files, but OCR is outside the project’s scope.
Run the standard-library test suite from the project root:
python3 -m unittest discover -s tests -vThe project is released under the MIT License. See LICENSE.
For contribution expectations, see CONTRIBUTING.md. The
release-readiness record is docs/oss-checklist.md,
and vulnerability-reporting guidance is in SECURITY.md.