Scrivenite
Convert Scrivener projects to Obsidian-compatible Markdown — preserving your binder structure, internal links, and inspector metadata.
Features
- 📁 Binder Structure Preserved: Your Scrivener folder hierarchy maps directly to folders in your Obsidian vault, with optional
01 -ordering prefixes so the Manuscript reads in binder order - 🔗 Wikilink Conversion: Internal Scrivener links (
scrivlnk://andscrivener://) become Obsidian[[Wikilinks]], with aliases when the link text differs from the title - 🏷️ YAML Frontmatter: Every note gets frontmatter with its original
scrivener_idand the document title as an alias, for robust search and cross-referencing - 📋 Metadata Rescue: Synopses, inspector Notes, and inline Comments are appended to each note under
## Synopsis,## Notes, and## Commentsheaders - 🖼️ Media Support: Images and PDFs are copied over with companion
.mdfiles containing![[embeds]] - 🧹 Clean Markdown Output: Strips RTF artifacts, excessive escaping, Scrivener compile placeholders (
<$PROJECTTITLE>,<$wc100>, …), and stray backticks - 🔀 Collision-Safe Filenames: Titles become safe filenames (truncated to 100 chars); name collisions get a short UUID suffix
Download the Mac App (no setup required)
Not a terminal person? Grab Scrivenite.dmg from the latest release — a standalone Mac app (Apple Silicon) with everything bundled, including pandoc. Open the DMG, drag Scrivenite to Applications, and follow the first-launch note inside the DMG (the app is unsigned, so macOS asks you to approve it once via System Settings → Privacy & Security → "Open Anyway").
Then: pick your .scriv project, pick an output folder, click Convert.
Installation (command line)
Requires Python 3.8+ and Pandoc (macOS: brew install pandoc).
pip install scrivenite
Or from source:
git clone https://github.com/krishnakumar-kapil/scrivenite.git
cd scrivenite
pip install -e .
Usage
Point the tool at the .scrivx file inside your .scriv project bundle:
scrivenite path/to/MyNovel.scriv/MyNovel.scrivx output_folder
(python scriv_to_obsidian.py … works too from a source checkout, and scrivenite-gui launches the same graphical interface as the Mac app.)
Options
| Option | Description |
|---|---|
-v, --verbose |
Detailed logging of every item processed |
--clear |
Delete the output folder before converting (useful when re-running) |
-o, --ordered-folders |
Folder titles whose contents get 01 - ordering prefixes (default: Manuscript; repeatable) |
--skip-trash |
Don't convert the contents of the Trash folder |
--conservative |
Disable opinionated cleanup heuristics (stray-backtick stripping, character-sheet header promotion). Use if your documents contain inline code or literal backticks |
Example with options:
scrivenite MyNovel.scriv/MyNovel.scrivx vault/MyNovel --clear -o Manuscript -o Characters -v
Example Project Structure
Input Scrivener binder:
MyNovel.scriv
├── Manuscript
│ ├── Chapter 1
│ │ ├── Scene 1
│ │ └── Scene 2
│ └── Chapter 2
└── Characters
└── Protagonist
Generated Obsidian vault:
output_folder/
├── Manuscript/
│ ├── 01 - Chapter_1/
│ │ ├── 01 - Scene_1.md
│ │ └── 02 - Scene_2.md
│ └── 02 - Chapter_2/
└── Characters/
└── Protagonist.md
Troubleshooting
- "File name too long" errors: Filenames are automatically truncated to 100 characters — update to the latest version if you still see this.
- Backticks around normal text: An artifact of RTF conversion; the cleanup pass removes them. Please open an issue with a sample if any slip through.
- XML errors on start: Check that you passed the
.scrivxfile (not the.scrivfolder) and that it isn't empty (0 bytes). - Pandoc errors: Make sure
pandocis installed and on yourPATH(pandoc --version).
Roadmap
- Signed & notarized macOS app (no "Open Anyway" step), plus an Intel build
- Fully configurable header detection (currently tuned for character-sheet templates)
- Long-term: a native Obsidian plugin for 1-click imports
Development
Install with test dependencies and run the suite:
pip install -e ".[test]"
pytest
For iterating on cleanup rules or link resolution, convert into the same output directory each time (with --clear) so you can diff results in one vault. A --debug-port 5678 option is available for attaching a remote debugger (pip install debugpy).
To build the standalone Mac app + DMG locally (bundles Python, Tcl/Tk, and pandoc via pypandoc-binary):
./build_macos_app.sh # outputs to /tmp/scrivenite_build/dist/
The release workflow builds and attaches the DMG automatically when a v* tag is pushed.
Project Structure
scriv_to_obsidian.py: Main script with conversion logicscrivenite_gui.py: Tkinter GUI (what the Mac app runs)build_macos_app.sh: PyInstaller + DMG build scripttests/: Unit tests and a sample Scrivener project undertests/data/
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Run the tests
- Submit a pull request
Bug reports with weird RTF edge cases or unusual Scrivener templates are especially welcome — they make the parser more robust for everyone.
License
MIT License - See LICENSE file for details
Metadata
Release files for scrivenite 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| scrivenite-0.2.0.tar.gz | 23.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| scrivenite-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.5 kB
Release files / scrivenite-0.2.0.tar.gz
| Download URL | scrivenite-0.2.0.tar.gz |
|---|---|
| Size | 23.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1a5ed14d7957232c58e4d34e8c245a1756769c18e26b2d7699b103b1cf979cfd
|
|
BLAKE2b-256 checksum How to use checksums |
9cfe5da19efadf663738c363dbe47d70f6243d7d625df036a3aa3a6d0159cd50
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / scrivenite-0.2.0-py3-none-any.whl
| Download URL | scrivenite-0.2.0-py3-none-any.whl |
|---|---|
| Size | 17.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
224d33d9d4bbfa7e895e8794b2723cbec68b67f2054ece0a3b7329101327143e
|
|
BLAKE2b-256 checksum How to use checksums |
7bcbbdfb9ad97482a8259981dc3daedd86fc4ea18bc8901e36402a40fb81f817
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|