Updated

Evernote to Markdown: export ENEX and convert your notes

Evernote to Markdown, step by step: export ENEX from the desktop app, convert it with Yarle, evernote2md or Obsidian Importer, then check links and files.

Evernote has no Markdown export. To move from Evernote to Markdown, export each notebook as an .enex file from the Mac or Windows desktop app, then convert those files. Evernote Web cannot export. The desktop app exports a whole notebook or up to 100 selected notes at a time, so go notebook by notebook.

Two free converters turn ENEX into a folder of Markdown files you own, with no other notes app involved. Yarle has a desktop interface and handles note links and tasks. evernote2md is a single command-line binary for scripted runs. Obsidian’s Importer plugin does the same job inside the free Obsidian app. The comparison below shows how each handles note links, Evernote tasks and encrypted text.

Step 1: Export your notebooks as ENEX

ENEX is Evernote’s XML export format: one file holds a notebook’s notes, tags, dates, source URLs and attachments. Every converter below reads it, so ignore the HTML options.

Evernote’s export article gives the steps for the desktop app:

  1. Select a notebook, or up to 100 notes, then right-click and choose Export. Obsidian’s import help gives a second route: Notebooks, then a notebook’s More actions menu (the three dots), then Export Notebook.
  2. Choose ENEX as the file format.
  3. Leave every attribute checked. Tags, dates and the source URL become your frontmatter, and an attribute you uncheck never reaches the file.
  4. Set the maximum file size to 2 GB, the largest Evernote offers.
  5. Save, then repeat for each notebook. Evernote’s article says the file goes to your desktop, so look there if no save dialog appears.

A notebook bigger than the size cap arrives as several ENEX files. Yarle and Importer write each file to its own folder, so merge those folders afterwards. Free accounts can export. Evernote has no Linux app, so Linux users need a borrowed Mac or Windows machine, or evernote-backup.

Four things to do before you export

  1. Decrypt encrypted text. Encrypted passages export as ciphertext. Search Evernote for encryption:, click the arrow on each encrypted block, and choose Decrypt permanently.
  2. Rename tags. ENEX stores tags as a flat list, so japan nested under travel arrives as plain japan. Rename child tags to the full path, such as travel/japan. Yarle and Importer also turn underscores into slashes and spaces into hyphens by default, so to_read becomes to/read. Rename those first, or change Yarle’s nestedTags setting.
  3. Make a Table of Contents note in each notebook whose notes link to each other, as the links section below describes.
  4. Write down your notebook stacks. ENEX holds one notebook and nothing about the stack above it.

Exporting a whole account at once

evernote-backup (1.14.0, August 2026, MIT licensed) runs on Linux, Mac and Windows. It downloads every note into a local database, then writes one ENEX file per notebook. Stacked notebooks go in a folder named after the stack.

brew install evernote-backup                    # macOS
uv tool install evernote-backup                 # Linux or Windows
winget install -e --id vzhd1701.EvernoteBackup  # Windows

evernote-backup init-db
evernote-backup sync
evernote-backup export enex/

An interrupted sync resumes where it stopped. Evernote’s free plan allows one active session, so on Windows or macOS use evernote-backup init-db --oauth-method import to reuse the desktop app’s sign-in.

Step 2: Choose a converter

All of these are free and open source. Versions were checked on October 10, 2026.

Tool Latest version How you run it Best for
Yarle 6.17.0 on npm, desktop builds 6.16.1, March 2026 Desktop app for Mac, Windows and Linux, or npx with a JSON config Note links, tasks and frontmatter templates, with no notes app needed
evernote2md 0.23.0, August 23, 2026 One binary, or brew install evernote2md Scripted conversion of text-heavy notebooks
Obsidian Importer 3.1.14, October 7, 2026 A plugin inside the free Obsidian app Note links across every notebook in one import. Its Evernote code grew out of Yarle
Joplin 3.7.21, September 25, 2026 Inside the Joplin app: import ENEX, then export Markdown Working through menus

Skip enex2md, whose last release dates from November 2019. If you ran evernote2md before 0.23.0, convert again: older versions could overwrite attachments that shared a file name, so several notes showed the same image.png.

What each converter does with Evernote features

These rows come from a test notebook run through Yarle 6.17.0 and evernote2md 0.23.0 on Windows. Importer’s column comes from its source code, since it runs only inside Obsidian, and Yarle’s task row from its documentation.

Evernote feature Yarle evernote2md Obsidian Importer
Link to another note Matched by title Left as an Evernote URL Matched by title, across all notebooks in one import
Tags Inline #tags by default, frontmatter through a template. _ becomes /, spaces become - Frontmatter with --addFrontMatter, plus a tag line in the body, underscores kept Frontmatter tags:, with the same _ and space rules as Yarle
Checklists - [x] and - [ ] - [x] and - [ ] - [x] and - [ ]
Evernote Tasks, with due dates Emoji task markers with taskOutputFormat: "ObsidianMD", plain checkboxes otherwise Dropped Emoji markers for due date, reminder and priority
Note reminder Available as a template field Dropped Frontmatter reminder:
Encrypted text Decrypted if you list passphrases in encryptionPasswords, ciphertext otherwise Ciphertext as a plain paragraph A code block labeled “Encrypted content” with Evernote’s hint
File names Titles kept: Packing list.md Spaces become underscores: Packing_list.md Titles kept
Attachments A _resources folder image/ and file/ folders, clashing names get a suffix The vault’s attachment folder
Notebook stacks Not handled Not handled Name the file Stack@@@Notebook.enex

evernote2md’s underscores matter later, because a [[Packing list]] link typed in your new app will not find Packing_list.md. The emoji task markers follow the format of the Obsidian Tasks plugin, and the Jotura section below rewrites their due dates.

Converting with Yarle

Yarle’s desktop app asks the questions below in a form. From a terminal, save yarle.json and frontmatter.tmpl, then run npx:

{
  "enexSources": ["./enex"],
  "outputDir": "./converted",
  "templateFile": "./frontmatter.tmpl",
  "outputFormat": "ObsidianMD",
  "taskOutputFormat": "ObsidianMD",
  "skipWebClips": false,
  "useHashTags": false,
  "keepEvernoteLinkIfNoNoteFound": true,
  "resourcesDir": "_resources"
}
---
{tags-yaml-list-block}tags: {tags-yaml-list}{end-tags-yaml-list-block}
{created-at-block}created: {created-at}{end-created-at-block}
{source-url-block}source: {source-url}{end-source-url-block}
---

{content-block}{content}{end-content-block}
npx -p yarle-evernote-to-md@latest yarle --configFile ./yarle.json

Pointing enexSources at a folder converts every notebook in one run, so links between them resolve. Yarle writes each notebook to <outputDir>/notes/<notebook>/, while a single listed file gave names like _enex_Travel in a Windows test. keepEvernoteLinkIfNoNoteFound leaves an unmatched link as its Evernote URL for the check script to report.

ObsidianMD is Yarle’s name for its wikilink output, which Jotura reads. With StandardMD, add "urlEncodeFileNamesAndLinks": true, or links come out as [what to pack](what to pack) with raw spaces many apps cannot follow. Keep skipWebClips at false, since Yarle’s sample config sets it to true.

Converting with evernote2md

evernote2md takes a file, a folder of ENEX files, or a glob, plus an output folder:

brew install evernote2md
evernote2md --addFrontMatter --tagTemplate "#{{tag}}" enex/ notes/

On Windows, run evernote2md.exe from the release zip with the same arguments. --addFrontMatter writes title, dates, tags and source URL as YAML. Without --tagTemplate, the tag line under each title is code spans such as `travel`, which no app reads as tags. Avoid --folders: it names every note file README.md.

Converting inside another notes app

Obsidian’s Importer runs as a plugin inside the free Obsidian app. Set File format to Evernote (.enex) and select every ENEX file at once, since links between notebooks resolve only within one import. Each file becomes a folder under Evernote/, and Work@@@Clients.enex lands as Work/Clients. The result is an ordinary folder of Markdown that opens in Jotura unchanged.

Joplin converts through its menus. Choose File, Import, “Evernote Export File (as Markdown)”, then export with the “Markdown + Front Matter” format. Joplin also matches note links by title.

An Evernote note link points at the target note’s internal ID: evernote:///view/..., https://www.evernote.com/shard/... or https://share.evernote.com/note/.... An exported note does not record its own ID, so the converter cannot look the target up. It reads the link’s visible text and finds the note with that title.

An edited link breaks this. A link reading “what to pack” that points at Packing list has no note to match. Yarle’s ObsidianMD output turned it into [[what to pack|what to pack]], a link to nothing. Two notes sharing a title break it too.

Yarle’s template docs give the fix, and Importer reads it too. Select every note in the notebook, right-click, and choose Copy internal links, then Copy app links. Paste the result into a new note titled exactly Table of Contents and export it with the notebook. If that menu is missing, Evernote’s shortcut copies one note’s internal link: Ctrl+Alt+Shift+C on Windows, Ctrl+Opt+Cmd+C on Mac.

With that note in the export, the same link came out as [[Packing list|what to pack]], a wikilink to the right note. Their source code matches a link only when its URL equals one in the table, so app links there will not repair links written as web links. The Table of Contents note itself lands in your folder too.

What ENEX loses

Run the Evernote searches in this table before exporting to see how many notes each loss touches.

Evernote feature What happens What to do
Note links Matched by title, since notes carry no IDs Add a Table of Contents note per notebook, then run the check script
Tag hierarchy Flattened to the child tag’s name Rename child tags to parent/child before export
Reminders A date in frontmatter at most. Nothing alerts you Move live reminders to your calendar first
Tasks with due dates (contains:task) Emoji task markers from Yarle or Importer, dropped by evernote2md Use Yarle or Importer, then rewrite due dates for Jotura as shown below
Tables (contains:table) Evernote tables have no header row and Markdown needs one. evernote2md promoted the first row, Yarle added an empty one. Merged cells and colors are gone Fix the tables you reread, using the Markdown tables guide
Web clips (contains:webclip) Long Markdown with leftover formatting. The source URL survives in frontmatter Fix the clips you reread
Notebook stacks Absent from ENEX Rebuild as folders, or use evernote-backup or Importer’s @@@ naming
Encrypted text (encryption:) Ciphertext Decrypt permanently before export
Text found inside images and scans Not written into any converted note Add a line of context under scans you search for
Note history Current version only Keep the ENEX files as your baseline
Saved searches and shortcuts Not exported Recreate the few you use

Image search is the hardest loss. In Evernote, typing a shop name found the scanned receipt, and after conversion that receipt is a picture in a folder. Joplin is the exception here: with OCR enabled, its docs say it recreates that recognition data after an ENEX import. PDFs with a text layer stay searchable in any app that indexes them, as the guide to converting PDF and Word files to Markdown explains.

Check the result before you cancel

This Python 3 script needs no extra packages. It reports every ENEX attachment whose bytes appear nowhere in the output, every link whose target is missing, and every Evernote URL left in a note.

import base64, hashlib, re, sys
import xml.etree.ElementTree as ET
from pathlib import Path
from urllib.parse import unquote

enex_dir, vault = Path(sys.argv[1]), Path(sys.argv[2])

expected, enex_notes = {}, 0
for enex in sorted(enex_dir.glob("*.enex")):
    for _, el in ET.iterparse(enex):
        if el.tag != "note":
            continue
        enex_notes += 1
        for res in el.iter("resource"):
            data = base64.b64decode(res.findtext("data") or "")
            name = res.findtext("resource-attributes/file-name") or "unnamed"
            expected.setdefault(hashlib.md5(data).hexdigest(), (enex.name, el.findtext("title"), name))
        el.clear()

files = [p for p in vault.rglob("*") if p.is_file()]
notes = [p for p in files if p.suffix == ".md"]
found = {hashlib.md5(p.read_bytes()).hexdigest() for p in files if p.suffix != ".md"}
names = {p.name.lower() for p in files}
for digest, (enex, title, name) in expected.items():
    if digest not in found:
        print(f"attachment lost: {name} from note '{title}' ({enex})")

evernote_url = re.compile(r"(?:evernote:|https?://(?:share\.evernote\.com/note/|(?:www\.)?evernote\.com/shard/))[^\s)>\]]*")
md_link = re.compile(r"\]\(<([^>]+)>\)|\]\(([^)]+)\)")
wiki_link = re.compile(r"\[\[([^\]|#^]+)")
for note in notes:
    text = note.read_text(encoding="utf-8", errors="replace")
    where = note.relative_to(vault)
    for m in evernote_url.finditer(text):
        print(f"Evernote link left: {where} -> {m.group(0)}")
    for m in md_link.finditer(text):
        target = unquote(re.sub(r'\s+"[^"]*"$', "", m.group(1) or m.group(2)).strip())
        if re.match(r"[a-zA-Z][a-zA-Z0-9+.-]*:|#", target):
            continue
        if not (note.parent / target).exists():
            print(f"broken link: {where} -> {target}")
    for m in wiki_link.finditer(text):
        target = m.group(1).strip()
        name = Path(target).name if Path(target).suffix else Path(target).name + ".md"
        if not (note.parent / target).exists() and name.lower() not in names:
            print(f"broken wikilink: {where} -> [[{target}]]")

print(f"{enex_notes} notes and {len(expected)} attachments in the ENEX files, "
      f"{len(notes)} markdown notes in {vault}")

Save it as check_migration.py, then pass the ENEX folder and the converted folder:

python3 check_migration.py enex/ converted/

On Windows, type python instead of python3, and run it from a short path such as C:\ev. Paths past 260 characters produce false “attachment lost” and “broken link” lines.

Hashing contents catches the old evernote2md overwrite, where every file exists but two notes show the same picture. On the test notebook the script flagged the leftover Evernote URLs from both converters, the [[what to pack]] link, and a deliberately overwritten image. Both note counts on the last line should match.

Then open a note from every notebook by hand, plus a table, a scan, and the web clips you care about. Keep the ENEX files in two places, and keep the Evernote account for a month while you live with the new folder.

Opening the folder in Jotura

Jotura opens the converted folder as a vault, with no import step, and leaves the files where they are. Wikilinks resolve by the same rules Obsidian uses, case-insensitive with the shortest matching path, so [[Packing list|what to pack]] opens Packing list. Frontmatter stays byte for byte, and Jotura reads tags and aliases from it. The Tags pane counts frontmatter and inline #tags together, so you can see whether to_read came through whole or split into to/read.

Checklists land in Jotura’s Tasks pane, which collects - [ ] items from every note. It reads due dates written as @due(2024-02-01). This command rewrites the calendar-emoji due dates from Yarle and Importer. It needs Git Bash or WSL on Windows, and leaves their hourglass reminder dates and arrow priority markers in place as plain text.

find converted -name '*.md' -exec perl -CSD -pi -e 's/\x{1F4C5} (\d{4}-\d{2}-\d{2})/\@due($1)/g' {} +

With document conversion on, PDFs and Word files from Evernote get a searchable Markdown copy beside them, as the documents docs explain. Conversion is on by default. A folder written by Importer sits inside an Obsidian vault, where Jotura asks first, and Coming from Obsidian covers the rest of that case.

Jotura has no ENEX importer, so a converter still comes first. It has no OCR, so scans stay pictures, and no browser web clipper, though the CLI’s jotura clip saves a page from its URL. There is no iOS app, and the Android app reaches your desktop notes only through paid Jotura Sync. Stay with Evernote when searching text inside scans or clipping from the browser matters most. The Jotura vs Evernote comparison sets out the rest.

Frequently asked questions

Can Evernote export Markdown directly?

No. The Evernote desktop app exports ENEX or HTML, and single notes can be saved as PDF. Markdown comes from a converter run on the ENEX file afterwards. Evernote Web and the mobile apps cannot export.

How many notes can I export from Evernote at once?

Evernote’s help center says the desktop app exports up to 100 selected notes at a time, or entire notebooks. Notebook exports have no note limit. To export every notebook in one pass, the open-source evernote-backup tool downloads the whole account and writes one ENEX file per notebook.

What is the best way to convert Evernote to Markdown?

Export each notebook as ENEX from the Evernote desktop app, then convert every file in one Yarle run so links between notebooks resolve. If your notes link to each other, add a Table of Contents note to each notebook before exporting. evernote2md suits scripted runs on text-heavy notebooks, and Obsidian’s Importer does the same job inside the Obsidian app.

Can I open Evernote notes in Jotura?

After conversion, yes. Jotura cannot read ENEX, so convert with Yarle or evernote2md first, then open the output folder in Jotura as a vault. It reads the wikilinks, tags, checklists and frontmatter the converters write.

Do I need the command line to convert ENEX to Markdown?

No. Yarle has a desktop app for Mac, Windows and Linux. Obsidian Importer and Joplin also work through menus, inside their own apps. evernote2md and evernote-backup are command-line tools.

An exported ENEX note does not record its own Evernote ID, so converters match each link to a note by the link’s visible text. A link whose text differs from the target’s title breaks, and so does a title shared by two notes. A note titled Table of Contents, holding the app links of every note, gives Yarle and Obsidian Importer the real mapping.

How to export Notion to Markdown, and what you lose2026-10-10
Export Notion to Markdown step by step: the settings that matter, what databases and links lose, stripping IDs from filenames, and checking nothing was lost.

More in Migrating.

Download free

Jotura is free, and your notes stay plain markdown files you keep forever.