Obsidian Export

Obsidian Export is a CLI program and a Rust library to export an [Obsidian] vault to regular Markdown.

Please note obsidian-export is not officially endorsed by the Obsidian team. It supports most but not all of Obsidian's Markdown flavor.

Installation

Pre-built binaries

Binary releases for x86-64 processors are provided for Windows, Linux and Mac operating systems on a best-effort basis. They are built with GitHub runners as part of the release workflow defined in .github/workflows/release.yml.

The resulting binaries can be downloaded from https://github.com/zoni/obsidian-export/releases

Building from source

When binary releases are unavailable for your platform, or you do not trust the pre-built binaries, then obsidian-export can be compiled from source with relatively little effort. This is done through [Cargo], the official package manager for Rust, with the following steps:

  1. Install the Rust toolchain from https://www.rust-lang.org/tools/install
  2. Run: cargo install obsidian-export

    It is expected that you successfully configured the PATH variable correctly while installing the Rust toolchain, as described under "Configuring the PATH environment variable" on https://www.rust-lang.org/tools/install.

Upgrading from earlier versions

If you downloaded a pre-built binary, upgrade by downloading the latest version to replace the old one.

If you built from source, upgrade by running cargo install obsidian-export again.

Basic usage

The main interface of obsidian-export is the obsidian-export CLI command. As a text interface, this must be run from a terminal or Windows PowerShell.

It is assumed that you have basic familiarity with command-line interfaces and that you set up your PATH correctly if you installed with cargo. Running obsidian-export --version should print a version number rather than giving some kind of error.

If you downloaded a pre-built binary and didn't put it a location referenced by PATH (for example, you put it in Downloads), you will need to provide the full path to the binary instead.

For example ~/Downloads/obsidian-export --version on Mac/Linux or ~\Downloads\obsidian-export --version on Windows (PowerShell).

Exporting notes

In it's most basic form, obsidian-export takes just two mandatory arguments, a source and a destination:

sh obsidian-export /path/to/my-obsidian-vault /path/to/exported-notes/

This will export all of the files from my-obsidian-vault to exported-notes, except for those listed in .export-ignore or .gitignore.

Note that the destination directory must exist, so you may need to create a new, empty directory first.

If you give it an existing directory, files under that directory may get overwritten.

It is also possible to export individual files:

````sh

Export as some-note.md to /tmp/export/

obsidian-export my-obsidian-vault/some-note.md /tmp/export/

Export as exported-note.md in /tmp/

obsidian-export my-obsidian-vault/some-note.md /tmp/exported-note.md ````

Note that in this mode, obsidian-export sees some-note.md as being the only file that exists in your vault so references to other notes won't be resolved. This is by design.

If you'd like to export a single note while resolving links or embeds to other areas in your vault then you should instead specify the root of your vault as the source, passing the file you'd like to export with --start-at, as described in the next section.

Exporting a partial vault

Using the --start-at argument, you can export just a subset of your vault. Given the following vault structure:

my-obsidian-vault ├── Notes/ ├── Books/ └── People/

This will export only the notes in the Books directory to exported-notes:

sh obsidian-export my-obsidian-vault --start-at my-obsidian-vault/Books exported-notes

In this mode, all notes under the source (the first argument) are considered part of the vault so any references to these files will remain intact, even if they're not part of the exported notes.

Character encodings

At present, UTF-8 character encoding is assumed for all note text as well as filenames. All text and file handling performs lossy conversion to Unicode strings.

Use of non-UTF8 encodings may lead to issues like incorrect text replacement and failure to find linked notes. While this may change in the future, there are no plans to change this behavior in the short term.

Advanced usage

Frontmatter

By default, frontmatter is copied over "as-is".

Some static site generators are picky about frontmatter and require it to be present. Some get tripped up when Markdown files don't have frontmatter but start with a list item or horizontal rule. In these cases, --frontmatter=always can be used to insert an empty frontmatter entry.

To completely remove any frontmatter from exported notes, use --frontmatter=never.

Ignoring files

By default, hidden files, patterns listed in .export-ignore as well as any files ignored by git (if your vault is part of a git repository) will be excluded from exports.

These options may be adjusted with --hidden, --ignore-file and --no-git if desired. (See --help for more information).

Notes linking to ignored notes will be unlinked (they'll only include the link text). Embeds of ignored notes will be skipped entirely.

Ignorefile syntax

The syntax for .export-ignore files is identical to that of [gitignore] files. Here's an example:

````

Ignore the directory private that is located at the top of the export tree

/private

Ignore any file or directory called test

test

Ignore any PDF file

*.pdf

..but include special.pdf

!special.pdf ````

For more comprehensive documentation and examples, see the [gitignore] manpage.

Recursive embeds

It's possible to end up with "recursive embeds" when two notes embed each other. This happens for example when a Note A.md contains ![[Note B]] but Note B.md also contains ![[Note A]].

By default, this will trigger an error and display the chain of notes which caused the recursion.

This behavior may be changed by specifying --no-recursive-embeds. Using this mode, if a note is encountered for a second time while processing the original note, instead of embedding it again a link to the note is inserted instead to break the cycle.

Relative links with Hugo

The [Hugo] static site generator does not support relative links to files. Instead, it expects you to link to other pages using the [ref and relref shortcodes].

As a result of this, notes that have been exported from Obsidian using obsidian-export do not work out of the box because Hugo doesn't resolve these links correctly.

[Markdown Render Hooks] (only supported using the default goldmark renderer) allow you to work around this issue however, making exported notes work with Hugo after a bit of one-time setup work.

Create the file layouts/_default/_markup/render-link.html with the following contents:

```` {{- $url := urls.Parse .Destination -}} {{- $scheme := $url.Scheme -}}

{{- /* whitespace stripped here to avoid trailing newline in rendered result caused by file EOL */ -}} ````

And layouts/_default/_markup/render-image.html for images:

```` {{- $url := urls.Parse .Destination -}} {{- $scheme := $url.Scheme -}}

{{ . | safeHTML }}

{{- /* whitespace stripped here to avoid trailing newline in rendered result caused by file EOL */ -}} ````

With these hooks in place, links to both notes as well as file attachments should now work correctly.

Note: If you're using a theme which comes with it's own render hooks, you might need to do a little extra work, or customize the snippets above, to avoid conflicts with the hooks from your theme.

Library usage

All of the functionality exposed by the obsidian-export CLI command is also accessible as a Rust library, exposed through the obsidian_export crate.

To get started, visit the library documentation on obsidianexport and obsidianexport::Exporter.

License

Obsidian-export is dual-licensed under the [Apache 2.0] and the [MIT] licenses.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Changelog

v22.1.0 (2022-01-02)

Happy new year! On this second day of 2022 comes a fresh release with one notable new feature.

New

Other


updated-dependencies:


updated-dependencies: md5-68316fbde608895ffb02656c941fa42e

Bumps pulldown-cmark-to-cmark from 7.0.0 to 7.1.0.

  • Release notes

  • Changelog
  • Commits

  • updated-dependencies: md5-c52f1a737132b0d0f2560c643a702d5f

    Bumps pulldown-cmark-to-cmark from 6.0.4 to 7.0.0.

  • Release notes

  • Changelog
  • Commits

  • updated-dependencies: md5-69a75422d110eac6eccd4f0a21b52bf8

    Bumps pathdiff from 0.2.0 to 0.2.1.

  • Release notes

  • Commits

  • updated-dependencies: md5-6c14db80459498a4c8e386755a0dd74f

    Bumps pulldown-cmark-to-cmark from 6.0.3 to 6.0.4.

  • Release notes

  • Changelog
  • Commits

  • updated-dependencies: md5-72598eeb189d7239f478d0d288ea7838

    Bumps pretty_assertions from 0.7.2 to 1.0.0.

  • Release notes

  • Changelog
  • Commits

  • updated-dependencies: md5-3c0decbe09a2d5ca5ae877f0edb3a946

    v21.9.1 (2021-09-24)

    Changes

    md5-d8d72aa308a41ea13e647fd5c938b28c

    Other

    md5-5b11c2b4b54a06910921384d3edca55f
    updated-dependencies: md5-0ede5925023e87d274bc6b68d8c85d56

    Bumps serde_yaml from 0.8.20 to 0.8.21.

  • Release notes

  • Commits

  • updated-dependencies: md5-292df7b6d35f893bd98e681a5f1bf18d

    v21.9.0 (2021-09-12)

    md5-f0ada3b77f0af25ccd3495a70ee510a6

    New

    md5-e8035ef3e15ca454f3c03d11fa8f1756

    Other

    md5-6dbed160be48404ee79f3806be399232
    updated-dependencies: md5-6a9830bf57047ccfa68787a2a309431a

    This was caught by a recently introduced clippy rule

    Bumps serde_yaml from 0.8.17 to 0.8.19.

  • Release notes

  • Commits

  • updated-dependencies: md5-ecf7f6ca4bd3b9a4269e64e154bf4a58

    Bumps regex from 1.4.6 to 1.5.3.

  • Release notes

  • Changelog
  • Commits

    Bumps pretty_assertions from 0.7.1 to 0.7.2.

  • Release notes

  • Changelog
  • Commits

    Bumps regex from 1.4.5 to 1.4.6.

  • Release notes

  • Changelog
  • Commits
  • v0.7.0 (2021-04-11)

    New

    Fixes

    Other

    v0.6.0 (2021-02-15)

    New

    Changes

    Fixes

    Other

    v0.5.1 (2021-01-10)

    Fixes

    v0.5.0 (2021-01-05)

    New

    Changes

    Other

    v0.4.0 (2020-12-23)

    Fixes

    Other

    v0.3.0 (2020-12-21)

    New

    Changes

    Other

    v0.2.0 (2020-12-13)

    v0.1.0 (2020-11-28)