Local-first CLI for turning Instagram, YouTube, TikTok, and Bilibili content into structured Markdown.
Project description
Media2MD
A local-first CLI for turning creator content into Markdown for humans, agents, and knowledge workflows.
Media2MD collects content from Instagram, YouTube, TikTok, and Bilibili, extracts captions, OCR text, or speech transcripts on your own machine, and writes the result as structured Markdown.
It is built for a different job than a normal downloader: follow creators over time, refresh saved catalogs, process backlogs, and turn platform content into durable local files that can be searched, summarized, archived, or fed into a wiki, RAG pipeline, or agent workflow.
Why Media2MD
- Local-first: OCR, transcription, and runtime state stay on your own machine
- Creator-oriented: track creators and process saved backlogs, not just one URL at a time
- Markdown-first: output is easy to archive, diff, search, and reuse
- Agent-ready: stable command surfaces and machine-readable
ndjsonoutput - Runtime/code separation: installed package code and managed runtime state are kept separate
- Caption-first where possible: prefers captions and subtitles before falling back to local transcription
Supported Platforms
- Instagram
- reels
- posts
- carousel posts
- optional local OCR for post images
- YouTube
- TikTok
- Bilibili
Install
Base install:
pip install media2md
Or install by agent, give it this repo doc and ask it to follow it:
Read https://github.com/danielcanfly/media2md/blob/main/docs/AGENT_INSTALL.md and install, initialize, verify auth, and validate the Media2MD setup on this machine. Do not ask for passwords, do not bypass 2FA/CAPTCHA, and stop if manual login is required.
Provider extras:
pip install "media2md[instagram]"
pip install "media2md[youtube]"
pip install "media2md[tiktok]"
pip install "media2md[bilibili]"
pip install "media2md[all]"
Instagram post OCR:
pip install "media2md[instagram,ocr-mac-os]"
pip install "media2md[instagram,ocr-windows-linux]"
Check the installed version:
media2md version
Quick Start
Initialize the runtime:
media2md init --language <language> --markdown-language <markdown-language> --timezone <timezone> --non-interactive
Connect provider auth:
media2md auth profiles youtube --browser chrome
media2md auth connect youtube --browser chrome --profile Default
media2md auth verify youtube
Track a creator and process content:
media2md creator add https://www.youtube.com/@creator-name --provider youtube
media2md creator refresh-catalog @creator-name --provider youtube --force-full
media2md creator run @creator-name --provider youtube
Check status:
media2md status
media2md doctor all
Common Workflows
Single URL:
media2md media inspect <media-url>
media2md media add <media-url> --process-now
Drain a backlog:
media2md creator run @creator-name --provider youtube --mode drain --batch-size 1 --max-batches 5
Runtime paths:
media2md runtime status
media2md runtime base-path
media2md runtime path
Docs
- Human setup: First Run Guide
- Agent setup: Agent Install Guide
- Full command reference: CLI Reference
- Release process: RELEASE_PROCESS.md
Good Fit
Media2MD is a strong fit when you want to:
- follow creators over time instead of manually checking feeds
- build a local Markdown archive from social and video content
- feed normalized Markdown into search, notes, RAG, or agent workflows
- keep processing on your own machine instead of relying on a hosted service
It is a weaker fit when you need:
- a hosted SaaS workflow
- remote browser login automation
- challenge bypasses or account-evasion tooling
- a cloud-managed ingestion service
Safety
Media2MD does not type passwords, bypass 2FA, solve CAPTCHA, or defeat provider access controls. It works best when the target account session is already healthy in a local browser profile that you explicitly choose.
Links
- Repository: danielcanfly/media2md
- PyPI: media2md
- First Run Guide: docs/FIRST_RUN.md
- Agent Install Guide: docs/AGENT_INSTALL.md
- CLI Reference: docs/CLI_REFERENCE.md
- Release Process: docs/RELEASE_PROCESS.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file media2md-0.9.6.tar.gz.
File metadata
- Download URL: media2md-0.9.6.tar.gz
- Upload date:
- Size: 344.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1385b33a621847bc172c60dd4b34e82aa67ee283e3f64957de1b9d8f2f45b8fa
|
|
| MD5 |
fa0530d30e74850e61059045d2de20f8
|
|
| BLAKE2b-256 |
79266fc39a9c2fc01968f27d706c353d2e6f43778833e8471f0e9b61304563a2
|
Provenance
The following attestation bundles were made for media2md-0.9.6.tar.gz:
Publisher:
release-pypi.yml on danielcanfly/media2md
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
media2md-0.9.6.tar.gz -
Subject digest:
1385b33a621847bc172c60dd4b34e82aa67ee283e3f64957de1b9d8f2f45b8fa - Sigstore transparency entry: 2043674781
- Sigstore integration time:
-
Permalink:
danielcanfly/media2md@71659458a5ba87e4d5fbe1de6f5161bfc02cd62f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/danielcanfly
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@71659458a5ba87e4d5fbe1de6f5161bfc02cd62f -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file media2md-0.9.6-py3-none-any.whl.
File metadata
- Download URL: media2md-0.9.6-py3-none-any.whl
- Upload date:
- Size: 294.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
911ab9c558d555ee9710cf0843bea2cdf717faca16ecc5140a75dcaafa74b409
|
|
| MD5 |
96c86938ca5efdf4daba969c4953b738
|
|
| BLAKE2b-256 |
a00b143b90619e7bfee42dfc79f39f0dbcd62d0e69948983ea7b9c1e7d3680df
|
Provenance
The following attestation bundles were made for media2md-0.9.6-py3-none-any.whl:
Publisher:
release-pypi.yml on danielcanfly/media2md
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
media2md-0.9.6-py3-none-any.whl -
Subject digest:
911ab9c558d555ee9710cf0843bea2cdf717faca16ecc5140a75dcaafa74b409 - Sigstore transparency entry: 2043674792
- Sigstore integration time:
-
Permalink:
danielcanfly/media2md@71659458a5ba87e4d5fbe1de6f5161bfc02cd62f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/danielcanfly
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-pypi.yml@71659458a5ba87e4d5fbe1de6f5161bfc02cd62f -
Trigger Event:
workflow_dispatch
-
Statement type: