CLI tool to download, transcribe, and convert video/audio to structured markdown
Project description
anyscribecli
Download. Transcribe. Markdown. A CLI tool that turns YouTube videos, Instagram reels, and local audio/video files into structured, searchable markdown — browsable in Obsidian.
What it does
URL or local file → Download/convert audio → Transcribe → Formatted Markdown → Obsidian Vault
- 6 transcription providers — OpenAI Whisper, Deepgram Nova, ElevenLabs, OpenRouter, Sarvam AI, Local (offline)
- Speaker diarization —
--diarizeflag for multi-speaker transcripts (meetings, interviews, podcasts) - 3 input sources — YouTube, Instagram (reels + posts), local files (mp3, mp4, m4a, wav, opus, ogg, flac, webm)
- Obsidian-native output — YAML frontmatter, word count, reading time, tags
- Master index + daily logs — browse everything in Obsidian
- Download-only mode — grab video or audio without transcribing
- Batch processing — transcribe a list of URLs from a file
- Web UI —
scribe uilaunches a local dashboard in your browser (transcribe, browse history, manage settings) --jsonon main commands — for scripting and AI agent integration- Arrow-key onboarding wizard — interactive setup, installs missing dependencies
Quick Start
Install
macOS / Linux (one command — installs Python, ffmpeg, and scribe):
curl -fsSL https://raw.githubusercontent.com/rishmadaan/anyscribecli/main/install.sh | bash
Windows (PowerShell — installs Python, ffmpeg, and scribe):
irm https://raw.githubusercontent.com/rishmadaan/anyscribecli/main/install.ps1 | iex
Or install manually:
pip install anyscribecli
Get started
scribe ui # opens web dashboard — guides you through setup
The web UI detects missing dependencies and walks you through setting up a transcription provider API key.
Windows: If
scribeisn't recognized, usepython -m anyscribecli uiAlternative:
scribe onboardruns a CLI setup wizard for terminal-based configuration.
Transcribe
# From a URL
scribe "https://www.youtube.com/watch?v=VIDEO_ID"
# From a local file
scribe /path/to/podcast.mp3
Always wrap URLs in quotes — shells like zsh break URLs with
?and&.
Download (no transcription)
scribe download "https://www.youtube.com/watch?v=VIDEO_ID" # video
scribe download "https://www.youtube.com/watch?v=VIDEO_ID" --audio-only # audio
Commands
| Command | Description |
|---|---|
scribe onboard |
Interactive setup wizard |
scribe transcribe "<url or file>" |
Transcribe a video or local file to markdown |
scribe download "<url>" |
Download video or audio only |
scribe batch <file> |
Batch transcribe URLs or file paths from a file |
scribe config show/set/path |
View and change settings |
scribe providers list/test |
Manage transcription providers |
scribe ui |
Launch the web UI in your browser |
scribe install-skill |
Install Claude Code skill |
scribe update |
Update to the latest version |
scribe doctor |
Check system health |
Transcribe options
scribe transcribe "<url>"
--provider, -p <name> # Override provider (openai, deepgram, elevenlabs, local, etc.)
--language, -l <code> # Language code (default: auto-detect)
--diarize, -d # Enable speaker diarization (multi-speaker transcripts)
--json, -j # JSON output for scripting/AI agents
--keep-media # Keep the downloaded audio file
--clipboard, -c # Read URL from clipboard
--quiet, -q # Suppress progress output
Provide a URL, file path, or use interactive mode:
scribe transcribe "https://..." # quoted URL (primary)
scribe transcribe /path/to/file.mp3 # local audio/video file
scribe transcribe # interactive prompt (no quoting needed)
scribe transcribe --clipboard # read URL from system clipboard
Download options
scribe download "<url>"
--video / --audio-only # Video (default) or audio only
--json, -j # JSON output
--quiet, -q # Suppress progress
--clipboard, -c # Read URL from clipboard
Batch options
scribe batch <file>
--provider, -p <name> # Override provider
--language, -l <code> # Override language
--json, -j # JSON output
--keep-media # Keep audio files
--quiet, -q # Suppress progress
--stop-on-error # Stop at first failure
JSON output
scribe transcribe "https://youtube.com/watch?v=abc123" --json
{
"success": true,
"file": "~/anyscribe/sources/youtube/video-title.md",
"title": "Video Title",
"platform": "youtube",
"duration": "12:34",
"language": "en",
"word_count": 1500,
"provider": "openai"
}
Prerequisites
The onboarding wizard checks for these and offers to install them:
| Dependency | Required | Install |
|---|---|---|
| Python 3.10+ | Yes | python.org |
| yt-dlp | Yes | brew install yt-dlp or pip install yt-dlp |
| ffmpeg | Yes | brew install ffmpeg or ffmpeg.org |
| API key | Yes (for cloud providers) | See Provider Guide |
Directory structure
~/anyscribe/ # Obsidian vault (configurable)
├── _index.md # Master index (newest first)
├── sources/
│ ├── youtube/<slug>.md
│ ├── instagram/<slug>.md
│ └── local/<slug>.md
└── daily/YYYY-MM-DD.md
~/.anyscribecli/ # App internals (hidden)
├── config.yaml # Settings (no secrets)
├── .env # API keys + passwords
├── downloads/ # Downloads (separate from vault)
│ ├── audio/<platform>/ # Kept audio (if keep_media=true)
│ └── video/<platform>/ # Downloaded videos
├── sessions/ # Login sessions
└── logs/ # Processing logs
Workspace is visible and configurable — transcripts default to
~/anyscribe/(no hidden dot-dir). Change it withscribe config set workspace_path /your/path. Downloads stay separate to keep the vault lightweight.
Providers
| Provider | Best for | API key |
|---|---|---|
| OpenAI Whisper (default) | General purpose, multilingual | OPENAI_API_KEY |
| Deepgram Nova | Diarization (auto-selected with --diarize), Hinglish |
DEEPGRAM_API_KEY |
| ElevenLabs Scribe | High accuracy, 99 languages, word timestamps | ELEVENLABS_API_KEY |
| Sarvam AI | Indic languages (Hindi, Tamil, Telugu, etc.) | SARGAM_API_KEY |
| OpenRouter | Access to various AI models | OPENROUTER_API_KEY |
| Local (faster-whisper) | Offline, free, no API key needed | None |
See Provider Guide for detailed comparison, pricing, and setup.
Configuration
# ~/.anyscribecli/config.yaml
provider: openai # Transcription provider
language: auto # Language (auto-detect or ISO code)
keep_media: false # Keep audio files after transcription
output_format: clean # clean | timestamped | diarized
diarize: false # enable speaker diarization
prompt_download: never # never | ask | always — download video after transcription
local_file_media: skip # skip | copy | move | ask — what to do with local files
workspace_path: "" # empty = ~/anyscribe (default), or set a custom path
API keys and passwords live in ~/.anyscribecli/.env (separate from config, never committed). You can set API keys directly:
scribe config set deepgram_api_key YOUR_KEY
scribe config set openai_api_key YOUR_KEY
Diarization auto-routing: When you use
--diarizewithout specifying a provider, scribe automatically switches to Deepgram (if configured) for best speaker detection. Override with-p openaiif needed.
See Configuration Guide for all options.
Claude Code Integration
scribe ships with a Claude Code skill that teaches Claude how to transcribe, configure providers, and troubleshoot on your behalf. After installing scribe:
scribe install-skill
Or run scribe onboard — it auto-detects Claude Code and offers to install the skill. Once installed, Claude can use /scribe or auto-activate when you ask it to transcribe something.
Documentation
| For | Where |
|---|---|
| First-time users | Getting Started |
| Command reference | Commands |
| All config options | Configuration |
| Provider comparison | Providers |
| AI developers | CLAUDE.md |
| Agent directives | AGENTS.md |
| Developer memory | Building Docs |
Development
git clone https://github.com/rishmadaan/anyscribecli.git
cd anyscribecli
pip install -e ".[dev]"
ruff check src/ # lint
ruff format src/ # format
pytest # test
License
MIT
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 anyscribecli-0.7.4.7.tar.gz.
File metadata
- Download URL: anyscribecli-0.7.4.7.tar.gz
- Upload date:
- Size: 3.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1285dfdb9de289c0e1fe0e0830138274db88076ebb7bb30a43fe5ae06a337144
|
|
| MD5 |
8798cc8c06571a237c5b2582272aa566
|
|
| BLAKE2b-256 |
47c27367b2a40e3be8891bdd21f747bcc9acfe8da85a24c3c368c24fd256cb03
|
Provenance
The following attestation bundles were made for anyscribecli-0.7.4.7.tar.gz:
Publisher:
publish.yml on rishmadaan/anyscribecli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
anyscribecli-0.7.4.7.tar.gz -
Subject digest:
1285dfdb9de289c0e1fe0e0830138274db88076ebb7bb30a43fe5ae06a337144 - Sigstore transparency entry: 1338723526
- Sigstore integration time:
-
Permalink:
rishmadaan/anyscribecli@8fa5236023f6a8fef90dfc2014856bc5af3a5f84 -
Branch / Tag:
refs/tags/v0.7.4.7 - Owner: https://github.com/rishmadaan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8fa5236023f6a8fef90dfc2014856bc5af3a5f84 -
Trigger Event:
push
-
Statement type:
File details
Details for the file anyscribecli-0.7.4.7-py3-none-any.whl.
File metadata
- Download URL: anyscribecli-0.7.4.7-py3-none-any.whl
- Upload date:
- Size: 1.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03f46f8a21af39c6e7d915a54572b627af68690165ed89e4bd2d17be0aad0d1b
|
|
| MD5 |
c24a2dee967e895e889bcfa11942dbdc
|
|
| BLAKE2b-256 |
61d21c6ad806c8c547ab017804b3f1e52813ad49ad9b8d351a5253bbf4555164
|
Provenance
The following attestation bundles were made for anyscribecli-0.7.4.7-py3-none-any.whl:
Publisher:
publish.yml on rishmadaan/anyscribecli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
anyscribecli-0.7.4.7-py3-none-any.whl -
Subject digest:
03f46f8a21af39c6e7d915a54572b627af68690165ed89e4bd2d17be0aad0d1b - Sigstore transparency entry: 1338723535
- Sigstore integration time:
-
Permalink:
rishmadaan/anyscribecli@8fa5236023f6a8fef90dfc2014856bc5af3a5f84 -
Branch / Tag:
refs/tags/v0.7.4.7 - Owner: https://github.com/rishmadaan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8fa5236023f6a8fef90dfc2014856bc5af3a5f84 -
Trigger Event:
push
-
Statement type: