Skip to content

Releases: asanmateu/tldr

v2.5.0

04 Mar 11:50
d0fce4d

Choose a tag to compare

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 --browse now skips dumping summaries to stdout — progress on stderr, then straight into the results viewer

Changed

  • --batch --browse opens a filtered results view showing only the current batch run instead of the full history

v2.4.1

04 Mar 04:08

Choose a tag to compare

Fixed

  • YouTube transcript extraction now retries up to 3 times with 1.5s delay to handle intermittent YouTube API failures
  • Replaced broken youtube-transcript library (v1.2.1, returns empty arrays) with maintained fork @danielxceron/youtube-transcript (v1.2.6)
  • Batch mode now respects user fallbackToJina setting (previously ignored, always used default)
  • Batch mode now applies truncateAndScale for 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 raw getaddrinfo ENOTFOUND error

v2.4.0

28 Feb 09:29

Choose a tag to compare

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-jina config key: opt out of the Jina Reader fallback with tldr config set fallback-jina false (enabled by default)
  • Retry with exponential backoff for transient HTTP errors (429, 5xx) — up to 2 retries with Retry-After header 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, and docs:preview npm scripts

Changed

  • Browser-like HTTP headers for web fetching — replaces the tldr/1.0 User-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 edit reference in providers docs (now tldr preset edit)

v2.3.0

23 Feb 23:31

Choose a tag to compare

Added

  • --batch mode: 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)
  • --browse flag for batch mode: drop into interactive mode with history open after batch completes
  • --audio flag 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 /history and --browse
  • runBatch() exported from lib/core for programmatic use by desktop sidecar and scripts
  • BatchResult type exported from lib/core for typed batch result handling
  • /update slash command: update to the latest version without leaving the app (runs brew upgrade for Homebrew installs, shows download link otherwise)
  • Inline update notice in banner: version line shows v2.2.1 → 2.2.2 available when 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'?)
  • ProviderConfigError class for model/config validation failures, flows through SummarizerError as CONFIG code

Changed

  • Breaking (programmatic): runBatch() signature changed from input: string to inputs: string[] and now returns BatchResult[] instead of void
  • Session directories are now date-grouped: ~/Documents/tldr/{date}/{slug}/ instead of ~/Documents/tldr/{date}-{slug}/ — existing sessions are not migrated
  • Pressing q with 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(), and handleSave() callbacks from App.tsx, replacing duplicated inline logic
  • Internal: Replaced 11-case slash command switch with data-driven SLASH_COMMANDS dispatch map
  • Internal: Extracted truncateAndScale(), isAbortError(), and extractErrorMessage() helpers from App.tsx
  • Internal: Extracted useToast hook (src/hooks/useToast.ts) — shared by App.tsx and ChatView.tsx
  • Internal: Centralized voice validation into isValidVoiceForProvider() and getVoiceDisplayName() in src/lib/tts/voices.ts, replacing scattered inline checks
  • Internal: Consolidated model tier definitions — MODEL_IDS in config.ts is now a re-export of STATIC_TIER_IDS from modelDiscovery.ts
  • Internal: Added validateCliProvider() facade in src/lib/providers/index.ts, removing direct provider imports from App.tsx
  • Internal: Removed as unknown type casts — SelectionList accepts ReadonlySet<string>, configSetter uses Object.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 UpdateNotice component — 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

22 Feb 03:03

Choose a tag to compare

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

22 Feb 02:14

Choose a tag to compare

Added

  • Audio modes: six personas for spoken summaries — podcast, briefing, lecture, storyteller, study-buddy, calm
  • --audio-mode CLI flag and tldr config set audio-mode command
  • Built-in presets: morning-brief, commute-catch-up, deep-study, exam-prep, bedtime-read, story-mode, team-debrief
  • --preset CLI flag and tldr preset command (list, create, delete, use, edit)
  • Chat export: press Ctrl+s in chat view to save the conversation as chat.md in the session directory; auto-saves on every subsequent message

Changed

  • Renamed "profiles" to "presets" in CLI and docs (--profile and tldr profile still 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

21 Feb 18:12

Choose a tag to compare

Added

  • Pretty markdown rendering in CLI — headings, bold, bullets, checkboxes, numbered lists, and tables are now styled with theme colors

v2.0.1

19 Feb 16:25

Choose a tag to compare

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 (macOS say) 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 + audio hidden when system TTS fallback was used (no MP3 file to save)

v2.0.0

18 Feb 23:24

Choose a tag to compare

Breaking

  • save-audio config setting and profile editor toggle removed — Enter always 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 lists w shortcut
  • App exits directly when pressing q in 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

18 Feb 13:54

Choose a tag to compare

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-provider config 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] audio moved before [c] copy for 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 install no longer prompts for GitHub credentials
  • Added "Build from source" section to installation docs (git clonebun installbun link)