RichDir65 downloadsImport Instagram videos into structured Markdown (MD) notes with captions, metadata, and optional local transcription.
Reel2MD turns supported Instagram video URLs into structured Markdown notes for Obsidian or any Markdown-based knowledge base.
It is intentionally small and local-first: a Python CLI performs ingestion and local transcription, while an optional desktop-only Obsidian plugin provides configuration, validation, dependency checks, live job output, and a one-command queue workflow.
New to Reel2MD? Start with the Beginner installation guide. It walks through installation, first setup, testing, and common problems step by step.
/reel/, /reels/, /p/, and legacy /tv/ URL forms.yt-dlp.faster-whisper.small.en) and multilingual transcription (small); multilingual mode automatically detects the spoken language.aliases property while keeping the filename tied to the stable source ID./p/ URLs are accepted when they contain video media. Photo-only posts are rejected with a clear unsupported-post error.
---
type: instagram-reel
platform: instagram
source_url: "https://www.instagram.com/reel/EXAMPLE/"
source_id: "EXAMPLE"
aliases:
- "Example Reel Title"
creator: "example_creator"
creator_id: "example_creator"
published_at: "2026-09-17"
captured_at: "2026-09-17T08:00:00-04:00"
source_access: "anonymous"
metadata_access: "anonymous"
media_access: "anonymous"
caption_status: fetched
caption_method: yt-dlp
transcript_status: completed
transcript_method: "faster-whisper-small"
transcript_language: "en"
transcript_language_probability: 0.998
tags:
- source/instagram
- media/reel
---
# Example Reel Title
## Source
https://www.instagram.com/reel/EXAMPLE/
## Caption
Original caption...
## Transcript
Local transcript...
## Notes
## Derived Knowledge
Instagram URL(s)
↓
Reel2MD CLI
├─ yt-dlp: metadata + media URL
├─ ffmpeg: temporary speech audio / optional retained media
└─ faster-whisper: local transcript
↓
Structured Markdown
↓
Obsidian / Git / any Markdown workflow
The Obsidian plugin is deliberately thin. It starts the local CLI and does not copy Instagram cookies or credentials into the vault.
Reel2MD is local-first, but ingestion and model setup require explicit external access:
yt-dlp requests metadata and media for the Instagram URLs you choose to process. Media may be served from Instagram/CDN endpoints.faster-whisper model metadata/files are accessed when the selected model is not already cached, and when you explicitly run the network test.yt-dlp reads the selected browser's existing session only when anonymous Instagram access fails. Reel2MD does not copy browser cookie values into the vault or generated Markdown.child_process.spawn to start only the configured reel2md CLI and ffmpeg executables. It does not construct shell command strings or enable shell execution.Opening the settings page runs local dependency checks only. Instagram and Hugging Face network checks run only when you explicitly choose Test network. Reel2MD does not implement analytics or telemetry.
ffmpeg available on the system, or an explicit path configured.The Python package installs these runtime dependencies:
yt-dlpfaster-whisperhuggingface-hubIf you are not a developer, use this section. You do not need to clone the repository or build anything from source.
Current testing status: Reel2MD 0.1.4 has been tested end-to-end on Ubuntu. Windows and macOS users are especially welcome to test it and report anything that behaves differently.
Reel2MD needs:
Check Python:
Windows PowerShell
py --version
macOS / Linux
python3 --version
Check ffmpeg:
ffmpeg -version
If ffmpeg is missing, common installation commands are:
Windows PowerShell
winget install Gyan.FFmpeg
macOS with Homebrew
brew install ffmpeg
Ubuntu / Debian
sudo apt update
sudo apt install ffmpeg
After installing Python or ffmpeg, close and reopen Obsidian before continuing.
Until Reel2MD is available in the Obsidian Community Plugins directory, installation is manual.
Download exactly these two files:
The ZIP is the Obsidian plugin. The .whl file is the local Reel2MD command-line component used by the plugin.
You can also view the complete Reel2MD 0.1.4 release.
The commands below create a dedicated Reel2MD Python environment so it does not interfere with your other Python software.
Assuming the wheel is in your Downloads folder:
py -m venv "$HOME\.reel2md"
& "$HOME\.reel2md\Scripts\python.exe" -m pip install --upgrade pip
& "$HOME\.reel2md\Scripts\python.exe" -m pip install "$HOME\Downloads\reel2md-0.1.4-py3-none-any.whl"
& "$HOME\.reel2md\Scripts\reel2md.exe" deps
Your Reel2MD executable is:
%USERPROFILE%\.reel2md\Scripts\reel2md.exe
In Reel2MD settings, use the full expanded path shown by:
Write-Output "$HOME\.reel2md\Scripts\reel2md.exe"
Assuming the wheel is in your Downloads folder:
python3 -m venv "$HOME/.reel2md"
"$HOME/.reel2md/bin/python" -m pip install --upgrade pip
"$HOME/.reel2md/bin/python" -m pip install "$HOME/Downloads/reel2md-0.1.4-py3-none-any.whl"
"$HOME/.reel2md/bin/reel2md" deps
Your Reel2MD executable is:
$HOME/.reel2md/bin/reel2md
To print the full path for the Obsidian setting:
echo "$HOME/.reel2md/bin/reel2md"
A successful reel2md deps check reports Reel2MD, yt-dlp, faster-whisper, and huggingface-hub.
.obsidian folder..obsidian, open or create the plugins folder.reel-to-md
The final location should be:
<Vault>/.obsidian/plugins/reel-to-md/
reel2md-0.1.4-plugin.zip.reel-to-md folder:main.js
manifest.json
styles.css
Do not leave them inside an extra nested folder.
If Reel2MD does not appear, see Troubleshooting below.
Open:
Settings → Reel2MD
Start with these settings:
Sources/Media/Instagram-Queue.mdffmpeg if ffmpeg -version worked in your terminal.small) if Reels may contain different spoken languages. This is the default.small.en) if you expect English speech only.You do not need to change the other settings for a basic first run.
Create the queue note you selected in Step 5 and place one supported Instagram URL on its own line, for example:
https://www.instagram.com/reel/EXAMPLE/
Supported URL types are:
/reel/<shortcode>
/reels/<shortcode>
/p/<shortcode> (video posts only)
/tv/<shortcode>
Photo-only /p/ posts are intentionally not supported.
In Settings → Reel2MD, click Test setup.
A successful result looks like:
Reel2MD setup OK: queue note, CLI dependencies, ffmpeg, and local settings validated.
If this test fails, fix the reported item before continuing.
Click Test network.
A successful result looks similar to:
Reel2MD network OK: instagram_metadata=anonymous instagram_media=anonymous huggingface=ok
The first Hugging Face/model access can take longer than later runs.
Open the Command Palette and run:
Process Instagram Reel queue
If Show live job output is enabled, a window shows progress while Reel2MD runs.
A successful single-item job ends with:
SUMMARY created=1 skipped=0 failed=0
Your generated Markdown note should then appear in the configured output folder.
Check all of these:
reel-to-md;.obsidian/plugins/;main.js, manifest.json, and styles.css are directly inside that folder;Correct:
.obsidian/plugins/reel-to-md/manifest.json
.obsidian/plugins/reel-to-md/main.js
.obsidian/plugins/reel-to-md/styles.css
Incorrect:
.obsidian/plugins/reel-to-md/reel2md-0.1.4-plugin/manifest.json
The Reel2MD executable setting is probably incorrect.
Use the full path:
Windows
C:\Users\USERNAME\.reel2md\Scripts\reel2md.exe
macOS / Linux
/Users/USERNAME/.reel2md/bin/reel2md
or:
/home/USERNAME/.reel2md/bin/reel2md
Then reopen Reel2MD settings.
Install the current wheel again:
Windows PowerShell
& "$HOME\.reel2md\Scripts\python.exe" -m pip install --upgrade --force-reinstall "$HOME\Downloads\reel2md-0.1.4-py3-none-any.whl"
macOS / Linux
"$HOME/.reel2md/bin/python" -m pip install --upgrade --force-reinstall "$HOME/Downloads/reel2md-0.1.4-py3-none-any.whl"
Then restart Obsidian.
First check:
ffmpeg -version
If that fails, install ffmpeg using Step 1.
If it works in your terminal but Reel2MD still cannot find it, enter the full ffmpeg path in Reel2MD settings.
macOS / Linux
which ffmpeg
Windows
where.exe ffmpeg
Try these in order:
Authenticated fallback does not bypass Instagram permissions. It only uses access already available to your logged-in browser session.
Check that your network can reach Hugging Face.
In Reel2MD settings, Disable Hugging Face Xet is enabled by default because it can improve compatibility on some networks. Leave it enabled unless you have a reason to change it.
The first download of a selected model can take some time. Switching between English only (small.en) and Multilingual / auto-detect (small) uses a different model, so the newly selected model may need to download once before transcription can start.
/p/ Instagram URL is rejectedReel2MD accepts /p/ URLs only when the post contains video. Photo-only posts are not supported.
skipped=1Reel2MD deduplicates Instagram sources by shortcode. A source that has already been processed may be skipped instead of being imported again.
When either retention option is enabled, Media folder is required.
Either:
Start with Inherit system proxy.
If you need a manually configured HTTP/HTTPS proxy, select Manual HTTP/HTTPS proxy and enter the proxy URL.
The plugin UI does not currently support manually configured SOCKS proxy URLs.
When reporting a problem, include:
Operating system:
Obsidian version:
Reel2MD version:
Python version:
ffmpeg version:
Test setup result:
Test network result:
Live job output / error:
Instagram URL type: reel / reels / p / tv
You do not need to share private Instagram URLs or credentials.
For more technical installation details, see docs/INSTALL.md.
From a clone of this repository:
python3 -m venv ~/.reel2md
~/.reel2md/bin/pip install --upgrade pip
~/.reel2md/bin/pip install -e ./cli
~/.reel2md/bin/reel2md deps
~/.reel2md/bin/reel2md batch --input "Instagram Queue.md" --output "Instagram"
On Windows, use the equivalent virtual-environment executables under Scripts.
reel2md deps is a local, non-network check that reports the installed versions/status of Reel2MD, yt-dlp, faster-whisper, and huggingface-hub.
The repository-root manifest.json is the manifest consumed by the Obsidian Community directory. plugin/manifest.json is kept byte-for-byte identical for local development and release packaging.
The plugin is desktop-only because it starts a local process.
From plugin/:
npm install
npm run build
For manual development installation, copy manifest.json, main.js, and styles.css into a vault plugin folder named reel-to-md. The folder name should match the plugin id in manifest.json.
The settings UI is grouped by workflow:
.md extension or omit it.small.en or multilingual auto-detect small), metadata, and optional live job output.ffmpeg, with automatic local dependency status and install/repair hints.Test setup and Test network use the same standard button style. Local dependency checks run when the settings page opens; network access is only tested when the user explicitly runs Test network.
See docs/INSTALL.md for detailed setup.
The plugin supports three proxy modes:
ALL_PROXY variables from Reel2MD child processes.HTTP_PROXY/HTTPS_PROXY variables from one configured proxy URL and remove ALL_PROXY.Manual SOCKS proxy configuration is not currently supported by the plugin UI.
The optional Disable Hugging Face Xet setting sets HF_HUB_DISABLE_XET=1 for Reel2MD child processes. This can help on networks where Hugging Face Xet/CAS downloads do not work correctly.
Proxy values are stored in the plugin's local settings. Avoid embedding sensitive credentials in a proxy URL unless you accept that storage model.
Authenticated fallback is off by default. If enabled, Reel2MD asks yt-dlp to read cookies from the browser selected by the user, such as Firefox.
The Browser field is only shown while authenticated fallback is enabled.
Reel2MD does not copy browser cookies into the vault or generated notes. The fallback does not bypass access controls; it can only request content the logged-in browser account is already permitted to access.
By default:
Video and/or audio retention can be enabled explicitly. The Media folder setting appears only while retention is enabled, and processing is blocked if retention is enabled without a media folder. The CLI applies the same guard when used directly.
Reel2MD always uses a 2-second minimum pause between jobs. The user selects a maximum from 2 to 60 seconds. For each gap between jobs, Reel2MD randomly chooses a delay between 2 seconds and the selected maximum.
The CLI enforces the same 2–60 second range even when invoked directly.
Run the Python regression suite from the repository root:
PYTHONPATH=cli python3 -m unittest discover -s tests -v
The regression coverage includes supported URL forms, canonicalization, deduplication, aliases, clear rejection of photo-only /p/ posts, request-spacing clamps, retention safety, and dependency-report shape.
Reel2MD is intended for personal research, note-taking, and archiving content you are permitted to access and process. Instagram behavior and endpoints can change without notice. Respect applicable rights, platform terms, and rate limits.
Reel2MD 0.1.4 is the current public release.
It has been validated end-to-end on Ubuntu with the Obsidian desktop plugin, including clean CLI installation, local dependency checks, Instagram/Hugging Face network diagnostics, and real queue processing.
Broader operating-system and environment coverage is still limited.
Release: https://github.com/aptoren/obsidian-reel2md/releases/tag/0.1.4
MIT. See LICENSE.