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
- 5 transcription providers — OpenAI Whisper, ElevenLabs, OpenRouter, Sarvam AI, Local (offline)
- 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
--jsonon main commands — for scripting and AI agent integration- Arrow-key onboarding wizard — interactive setup, installs missing dependencies
Quick Start
Install
# From PyPI (recommended)
pip install anyscribecli
# Or use the install script (checks and installs dependencies too)
curl -fsSL https://raw.githubusercontent.com/rishmadaan/anyscribecli/main/install.sh | bash
# Or clone for development
git clone https://github.com/rishmadaan/anyscribecli.git
cd anyscribecli && pip install -e .
Set up
ascli onboard
Interactive wizard with arrow-key selectors:
- Checks system dependencies (yt-dlp, ffmpeg) — installs missing ones
- Choose provider from 5 options (arrow keys)
- Enter API key
- Configure Instagram credentials (optional)
- Choose language, media storage, post-transcription download behavior
- Creates your Obsidian workspace
Transcribe
# From a URL
ascli transcribe "https://www.youtube.com/watch?v=VIDEO_ID"
# From a local file
ascli transcribe /path/to/podcast.mp3
Always wrap URLs in quotes — shells like zsh break URLs with
?in them. Or just runascli transcribeand paste when prompted. Local file paths don't need quotes.
Download (no transcription)
ascli download "https://www.youtube.com/watch?v=VIDEO_ID" # video
ascli download "https://www.youtube.com/watch?v=VIDEO_ID" --audio-only # audio
Commands
| Command | Description |
|---|---|
ascli onboard |
Interactive setup wizard |
ascli transcribe "<url or file>" |
Transcribe a video or local file to markdown |
ascli download "<url>" |
Download video or audio only |
ascli batch <file> |
Batch transcribe URLs or file paths from a file |
ascli config show/set/path |
View and change settings |
ascli providers list/test |
Manage transcription providers |
ascli update |
Update to the latest version |
ascli doctor |
Check system health |
Transcribe options
ascli transcribe "<url>"
--provider, -p <name> # Override provider (openai, elevenlabs, local, etc.)
--language, -l <code> # Language code (default: auto-detect)
--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:
ascli transcribe "https://..." # quoted URL (primary)
ascli transcribe /path/to/file.mp3 # local audio/video file
ascli transcribe # interactive prompt (no quoting needed)
ascli transcribe --clipboard # read URL from system clipboard
Download options
ascli 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
ascli 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
ascli transcribe "https://youtube.com/watch?v=abc123" --json
{
"success": true,
"file": "~/.anyscribecli/workspace/sources/youtube/2026-03-27/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
~/.anyscribecli/
├── config.yaml # Settings (no secrets)
├── .env # API keys + passwords
├── workspace/ # Obsidian vault (pure markdown)
│ ├── _index.md # Master index (newest first)
│ ├── sources/
│ │ ├── youtube/YYYY-MM-DD/<slug>.md
│ │ ├── instagram/YYYY-MM-DD/<slug>.md
│ │ └── local/YYYY-MM-DD/<slug>.md
│ └── daily/YYYY-MM-DD.md
├── media/ # Downloads (separate from vault)
│ ├── audio/<platform>/YYYY-MM-DD/ # Kept audio (if keep_media=true)
│ └── video/<platform>/YYYY-MM-DD/ # Downloaded videos
├── sessions/ # Login sessions
└── logs/ # Processing logs
Media is separate from the vault — your Obsidian workspace stays lightweight, just markdown.
Providers
| Provider | Best for | API key |
|---|---|---|
| OpenAI Whisper (default) | General purpose, multilingual | OPENAI_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
prompt_download: never # never | ask | always — download video after transcription
local_file_media: skip # skip | copy | move | ask — what to do with local files
API keys and passwords live in ~/.anyscribecli/.env (separate from config, never committed).
See Configuration Guide for all options.
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.4.1.tar.gz.
File metadata
- Download URL: anyscribecli-0.4.1.tar.gz
- Upload date:
- Size: 81.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32223cc570e9148be938f7074a013921292fbde3a404298c9ca09454b3340d0c
|
|
| MD5 |
4873cc526cab6b8ba3de25c96b029804
|
|
| BLAKE2b-256 |
351e6201126a4822fadd39015a5c98bf4347bd0108e333da6f58cb3f9c522d25
|
File details
Details for the file anyscribecli-0.4.1-py3-none-any.whl.
File metadata
- Download URL: anyscribecli-0.4.1-py3-none-any.whl
- Upload date:
- Size: 63.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
958ce38b8899742e25bf09a290ecc326d6d2557aef1d535b83e13cd3fbb4d58a
|
|
| MD5 |
91b0eb11607bfb6cfe4f75cdde933d31
|
|
| BLAKE2b-256 |
dcbeedf5fe838c2983959682e0694e45073df95723db7c7cd775dd10b4297f5e
|