Releases: asanmateu/tldr
Releases · asanmateu/tldr
v2.5.0
Added
- Pretty-printed ANSI-formatted markdown output in batch mode when stdout is a TTY (colors, styled headings, bullets, tables) — raw markdown preserved when piped
- Interactive batch results viewer (
--batch --browse): navigable list with success/fail status per URL, Enter to view individual summaries, replaces the previous full-history fallback --batch --browsenow skips dumping summaries to stdout — progress on stderr, then straight into the results viewer
Changed
--batch --browseopens a filtered results view showing only the current batch run instead of the full history
v2.4.1
Fixed
- YouTube transcript extraction now retries up to 3 times with 1.5s delay to handle intermittent YouTube API failures
- Replaced broken
youtube-transcriptlibrary (v1.2.1, returns empty arrays) with maintained fork@danielxceron/youtube-transcript(v1.2.6) - Batch mode now respects user
fallbackToJinasetting (previously ignored, always used default) - Batch mode now applies
truncateAndScalefor long documents, matching interactive mode behavior (prevents excessive tokens for 100k+ word content) - Audio generation failure in batch mode no longer marks the entire URL as failed — the summary is still saved and printed to stdout
- DNS resolution failures now show a friendly message (
Could not resolve hostname "...") instead of the rawgetaddrinfo ENOTFOUNDerror
v2.4.0
Added
- Jina Reader fallback: when Readability fails to extract content (JS-rendered SPAs, empty pages), tldr automatically retries via Jina Reader (
r.jina.ai) which renders JavaScript server-side fallback-jinaconfig key: opt out of the Jina Reader fallback withtldr config set fallback-jina false(enabled by default)- Retry with exponential backoff for transient HTTP errors (429, 5xx) — up to 2 retries with
Retry-Afterheader support - Actionable error messages for blocked (403) and rate-limited (429) responses instead of returning unusable HTML
- Use Cases documentation page with workflows from quick triage to automated daily digests, covering presets, batch mode, audio, cron scheduling, and accessibility tuning
- VitePress docs site with home page, sidebar navigation, local search, and dark mode
- GitHub Actions workflow to deploy docs to GitHub Pages on push to
main docs:dev,docs:build, anddocs:previewnpm scripts
Changed
- Browser-like HTTP headers for web fetching — replaces the
tldr/1.0User-Agent with Chrome-like headers, reducing 403 blocks from bot detection - Consolidated 5 demo GIFs into a single hero GIF covering summarize + audio flow
- Slowed down hero tape timings and typed URL in segments for a natural feel
- Widened hero tape canvas (1400x800, font 14) for better readability
- Removed per-page GIF embeds from audio, configuration, providers, and installation docs
- Trimmed README Audio section to a concise teaser linking to the Audio guide
- Removed redundant "Alternative providers" section from README (already covered in Installation)
- Removed redundant "Switching Providers" section from providers docs (each provider section already shows this)
- Removed all-Yes "Streaming" row from providers comparison table
- Deduplicated audio modes table — canonical home is now
docs/audio.md, configuration.md links to it - Deduplicated TTS model table — canonical home is now
docs/audio.md, providers.md links to it - Trimmed Model Discovery/Validation section in configuration docs to remove implementation details (cache paths, API method names, fallback IDs)
- Moved "Saving chat transcripts" from audio docs to configuration docs under Interactive Commands
- Reframed installation prerequisites so Claude Code is not presented as a hard requirement
- Removed implementation detail ("costs one extra API call") and UI state description from audio docs
Fixed
- Fixed stale
tldr profile editreference in providers docs (nowtldr preset edit)
v2.3.0
Added
--batchmode: run headlessly with no TUI — extract, summarize, and print to stdout in a single command (e.g.tldr --batch <url>)- Multi-URL
--batch: pass multiple URLs to process them sequentially with continue-on-error (e.g.tldr --batch url1 url2 url3) --browseflag for batch mode: drop into interactive mode with history open after batch completes--audioflag for batch mode: opt-in audio generation during headless runs--output <dir>flag for batch mode: override the session output directory- Batch results are now added to history immediately, so they appear in
/historyand--browse runBatch()exported fromlib/corefor programmatic use by desktop sidecar and scriptsBatchResulttype exported fromlib/corefor typed batch result handling/updateslash command: update to the latest version without leaving the app (runsbrew upgradefor Homebrew installs, shows download link otherwise)- Inline update notice in banner: version line shows
v2.2.1 → 2.2.2 availablewhen an update is available, replacing the separate colored notice line - Setup wizard now starts with AI provider selection — standalone (Homebrew) users pick their provider instead of defaulting to Claude Code
- Setup wizard ends with audio mode selection, surfacing the v2.2.0 podcast/briefing/lecture/etc. feature during onboarding
- Setup wizard shows per-provider env var guidance (e.g.
ANTHROPIC_API_KEY,OPENAI_API_KEY) when the chosen provider needs an API key - Multi-input queue: paste or drop multiple URLs/file paths and process them all sequentially — intermediate results auto-save and pin upward, last result stays in the active view
- Input hint shows detected source count for multi-input (e.g. "example.com + 2 more — 3 sources")
- Queue progress in processing view (e.g. "(1/3) Extracting from...")
- Dynamic model discovery: available models are fetched from provider APIs and cached locally for 24 hours (
~/.tldr/models-cache.json) - Model picker in preset editor: the model and TTS model fields now show a selectable list of available models fetched from the provider, with free-text fallback when listing fails
- Model validation before provider calls: invalid model names now show actionable errors with "Did you mean?" suggestions (e.g.
Model 'claude-opus-4.6' not found. Did you mean 'claude-opus-4-6'?) ProviderConfigErrorclass for model/config validation failures, flows throughSummarizerErrorasCONFIGcode
Changed
- Breaking (programmatic):
runBatch()signature changed frominput: stringtoinputs: string[]and now returnsBatchResult[]instead ofvoid - Session directories are now date-grouped:
~/Documents/tldr/{date}/{slug}/instead of~/Documents/tldr/{date}-{slug}/— existing sessions are not migrated - Pressing
qwith an empty input now requires a double-tap within 2 seconds to quit — first press shows a warning, preventing accidental exits - Tier aliases (haiku/sonnet/opus) now resolve dynamically to the latest model from the provider API cache, falling back to static IDs when cache is empty
- Internal: Extracted
resetToIdle(),refreshHistory(),handleAudioGenerate(), andhandleSave()callbacks from App.tsx, replacing duplicated inline logic - Internal: Replaced 11-case slash command switch with data-driven
SLASH_COMMANDSdispatch map - Internal: Extracted
truncateAndScale(),isAbortError(), andextractErrorMessage()helpers from App.tsx - Internal: Extracted
useToasthook (src/hooks/useToast.ts) — shared by App.tsx and ChatView.tsx - Internal: Centralized voice validation into
isValidVoiceForProvider()andgetVoiceDisplayName()insrc/lib/tts/voices.ts, replacing scattered inline checks - Internal: Consolidated model tier definitions —
MODEL_IDSin config.ts is now a re-export ofSTATIC_TIER_IDSfrom modelDiscovery.ts - Internal: Added
validateCliProvider()facade insrc/lib/providers/index.ts, removing direct provider imports from App.tsx - Internal: Removed
as unknowntype casts —SelectionListacceptsReadonlySet<string>, configSetter usesObject.assign() - Internal: Extracted magic numbers to named constants (
LONG_CONTENT_WORD_THRESHOLD,LONG_CONTENT_MAX_TOKENS,DISCARD_TIMEOUT_MS)
Fixed
- Setup wizard no longer assumes Anthropic API key — shows the correct environment variable name for the selected provider
- Pasting multiple space-separated URLs into the interactive input no longer crashes — the first URL is extracted and processed
- File paths with trailing text no longer include junk in the extracted path (parity with URL first-token fix)
- Typing
/now correctly shows the slash command menu — bare/was incorrectly classified as a file path after the v2.2.1 file-path fix - Missing API key or CLI now shows a clear error (e.g. "Set ANTHROPIC_API_KEY…") instead of a cryptic SDK message, for all providers
Removed
- Clipboard hint below input prompt — no longer reads or displays clipboard contents on mount
- Standalone
UpdateNoticecomponent — update information is now displayed inline in the banner - API key text input from setup wizard — replaced by environment variable guidance screen
v2.2.1
Fixed
- File paths (e.g.
/Users/.../file.md) dragged onto the input no longer trigger "Unknown command" — they are correctly submitted as input
Changed
- File detection hint now shows the actual filename and type (e.g.
notes.md — document) instead of generic "Detected: File" - Banner symbol changed from
»to◆for better visual hierarchy next to the>input prompt
v2.2.0
Added
- Audio modes: six personas for spoken summaries — podcast, briefing, lecture, storyteller, study-buddy, calm
--audio-modeCLI flag andtldr config set audio-modecommand- Built-in presets: morning-brief, commute-catch-up, deep-study, exam-prep, bedtime-read, story-mode, team-debrief
--presetCLI flag andtldr presetcommand (list, create, delete, use, edit)- Chat export: press
Ctrl+sin chat view to save the conversation aschat.mdin the session directory; auto-saves on every subsequent message
Changed
- Renamed "profiles" to "presets" in CLI and docs (
--profileandtldr profilestill work as aliases) - Audio rewriting uses template-driven prompts instead of hardcoded podcast persona
- Chat view: role labels changed from "You"/"AI" to
›/◆symbols, messages wrapped in bordered card, consistent spacing between messages
v2.1.0
Added
- Pretty markdown rendering in CLI — headings, bold, bullets, checkboxes, numbered lists, and tables are now styled with theme colors
v2.0.1
Fixed
- App exits directly when pressing Esc during extraction/summarization if launched with a positional argument (
tldr <url>), instead of returning to the interactive prompt - Audio save with
[w]after fallback TTS (macOSsay) no longer silently retries broken edge-tts; shows clear error instead - Audio save errors are now surfaced in the audio panel instead of being silently swallowed
[w] save + audiohidden when system TTS fallback was used (no MP3 file to save)
v2.0.0
Breaking
save-audioconfig setting and profile editor toggle removed —Enteralways saves without audio,[w]always saves with audio
Added
- Chat panel: bordered card in result view with
[t] start chatting - Audio panel: persistent bordered card showing audio shortcuts, playback state, and generation progress
Fixed
- Exiting result view (
q) clears scrollback buffer - Audio generation spinner no longer causes screen strobe
- Audio failure during save-with-audio shown in save toast
- Help view (
/help) now listswshortcut - App exits directly when pressing
qin result view with positional argument
Changed
- Cognitive traits moved to their own "Accessibility" section in the profile editor
- Save flow stays on result view with "Saved" footer status
- Audio panel is now persistent with state-aware content
- Playback footer shows voice name and speed
- Save toast differentiates "Saved" vs "Saved with audio" vs "Saved (audio failed)"
v1.2.0
Added
- App integration tests covering state machine transitions, keybindings, abort handling, and provider fallback
- GitHub URL support: blob URLs (
github.com/.../blob/...) now fetch raw file content directly instead of scraping GitHub's HTML page - TTS provider abstraction: choose between Edge TTS (free, default) and OpenAI TTS (high quality, requires
OPENAI_API_KEY) tts-providerconfig key:tldr config set tts-provider openai/edge-tts- TTS Provider selector in profile editor (
tldr profile edit//config) - OpenAI TTS voices: Alloy, Echo, Fable, Onyx, Nova, Shimmer
- Voice list in profile editor now updates dynamically when switching TTS providers
- Audio hint: accent-colored "Press [a] to listen" appears for 5 seconds when a summary first appears
- Spinner animation during audio generation and save-with-audio (matches processing view style)
Changed
- Footer reordered:
[a] audiomoved before[c] copyfor better discoverability - Voice validation relaxed in
config set voice— any string is now accepted (voices are provider-dependent)
Fixed
- GitHub blob extractor falls back to web extractor on non-2xx or HTML responses (e.g. private repos returning 404 or login redirects)
- Fixed concurrent processing when input is submitted rapidly in interactive mode (previous extraction is now aborted)
- Homebrew tap repo (
asanmateu/homebrew-tldr) made public —brew installno longer prompts for GitHub credentials - Added "Build from source" section to installation docs (
git clone→bun install→bun link)