A CLI tool to sync your Obsidian vault to a GitHub repository with automatic wiki-link transformation.
- 🔄 Sync Obsidian notes to a GitHub repository
- 🖼️ Transform wiki-style image links (
![[image.png]]) to raw GitHub URLs - ⚡ Incremental sync - only processes changed files (using MD5 hashes)
- 📤 Auto-push to GitHub after sync using local ssh keys (super simple)
pip install ob-syncgit clone https://github.com/sounak07/obsidian-transformer.git
cd obsidian-transformer
pip install .pip install -e .ob-sync requires a configuration file at ~/.config/ob-sync/config.yaml.
-
Create the config directory:
mkdir -p ~/.config/ob-sync -
Create the config file:
touch ~/.config/ob-sync/config.yaml -
Add your configuration (see example below)
# Path to your Obsidian vault folder
vault_path: "~/Documents/Obsidian/MyVault"
# GitHub repository configuration
github:
username: "your-github-username"
repo: "your-repo-name"
branch: "main" # optional, defaults to "main"
# Path to your attachments folder (images, PDFs, etc.)
attachments_folder: "~/Documents/Obsidian/MyVault/assets"
# Output directory (your cloned GitHub repo)
output_path: "~/Documents/Projects/your-repo-name"
# Subdirectory for assets in the output repo
output_path_resources: "assets"
# Files to include (glob patterns)
include:
- "**/*.md"
# Files to exclude (glob patterns)
exclude:
- "**/Templates/**"
- "**/Daily/**"
- "**/.obsidian/**"
- "**/Excalidraw/**"| Option | Required | Description |
|---|---|---|
vault_path |
✅ | Absolute path to your Obsidian vault |
github.username |
✅ | Your GitHub username |
github.repo |
✅ | Target repository name |
github.branch |
❌ | Branch name (default: main) |
attachments_folder |
✅ | Path to folder containing images/attachments |
output_path |
✅ | Path to your local clone of the GitHub repo |
output_path_resources |
✅ | Subdirectory for assets in output |
include |
❌ | Glob patterns for files to include (default: **/*.md) |
exclude |
❌ | Glob patterns for files to exclude |
ob-sync syncThis will:
- Find all markdown files matching your include/exclude patterns
- Transform wiki-style image links to GitHub raw URLs
- Copy transformed files to your output directory
- Copy referenced images to the assets folder
- Commit and push changes to GitHub
ob-sync sync --no-pushob-sync sync -m "Updated notes on Docker"ob-sync statusShows:
- Vault path and existence
- Output path and existence
- Git branch and status
- GitHub repository info
ob-sync --versionob-sync --help
ob-sync sync --helpob-sync automatically transforms Obsidian wiki-style image links:
Before (Obsidian):
![[my-diagram.png]]After (GitHub-compatible):
ob-sync tracks file hashes in .sync-hashes.json to avoid re-processing unchanged files. Only modified files are transformed and copied.
- Python 3.9+
- Git installed and configured
- GitHub repository cloned locally (at
output_path) - SSH keys or credentials configured for Git push
- click - CLI framework
- GitPython - Git operations
- PyYAML - YAML config parsing
- pathspec - Glob pattern matching
MIT
Contributions are welcome! Please open an issue or submit a pull request.