Skip to content

Importing from Joplin

When to use

When a user imports a Joplin JEX file (.jex) or a RAW export folder. (Joplin can also export Markdown + Front Matter — if they did that, use importing-from-markdown instead.) You own it end to end. Read limestone-vault-conventions, working-with-collections, and importing-from-obsidian first.

Run the import (one tool call)

Call limestone_import_notebook(path, collection_name) with the .jex (or the RAW folder). Returns the usual summary + unconverted list.

How the import works (what the tool does)

A JEX is a tar of flat <id>.md items (notes, notebooks, tags, links) plus a resources/ dir. The importer reassembles them:

Joplin Limestone
each note item (type_: 1) a record (title = the item's first line)
created_time / updated_time (ISO ms) Created / Updated date properties
the note's notebook (parent_id) a Notebook text property
source_url a Source URL text property
tags (a separate type_: 5/6 join) real note tags
![](:/<resourceId>) / [x](:/<id>) the file from resources/, embedded inline as ![[filename]]

Finalizing (your job)

The importing-from-obsidian playbook applies. Joplin-specific:

  1. Group or split by notebook. Every note lands in one collection with a Notebook property. If notebooks are really distinct record types, split them into their own collections; otherwise group the table by Notebook.
  2. To-dos. Joplin to-dos import as plain notes (the is_todo/todo_completed metadata isn't mapped). Add a checkbox/date property if the user tracks tasks here.
  3. Resolve unconverted items (unsupported resource types, missing resources) as usual.

Evolving this skill

If a Joplin structure recurs badly, work out the mapping, apply it, and propose an update here or to importers/joplin.py. Keep the two in sync.