All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project uses Calendar Versioning for current releases. Older releases before the CalVer migration retain their original version labels.
- Replace the Google Drive bot commands with
/google_drive_loginand/google_drive_folder, removing the old/code,/login, and/foldercommand entries. - Merge image-based similar search into
/search, so text input searches saved photos and photo input finds visually similar media.
- Save searchable MissAV
missav.aiOpen Graph metadata by falling back to readable mirror metadata when the main page blocks preview fetches. - Show saved video details when
/detailreplies to a video message.
- Make the save data directory configurable with
SAVE_IT_DATA_DIR, defaulting to./datalocally and/datain the Docker image, with Docker Compose persisting/dataon a named volume. - Store URL Open Graph metadata in dedicated Typesense fields instead of using it as the saved caption, keeping captions limited to user-provided Telegram text.
- Use local Twitter cookies from
cobalt-cookies.jsonto fetch authenticated X metadata for login-restricted posts before falling back to public Open Graph metadata.
- Render successful resource creation info logs in green in runtime logger output.
- Save a webpage
og:imagepreview when a URL resolves to a non-media resource instead of storing the resolved HTML or document file. - Send and index a generated preview image when a downloaded URL video is too large for Telegram video upload, while still saving the downloaded video locally.
- Use random UUIDv7 filenames for downloaded resources while preserving the original file extension.
- Preserve URL video preview aspect ratios by sending accurate display dimensions and square-pixel Telegram covers/thumbnails.
- Improve generated video preview clarity by sending higher-resolution Telegram covers while keeping thumbnails within Telegram limits.
- Show chat type, public visibility, bot admin status, and bot Privacy Mode status in the
/aboutcommand. - Store public link preview thumbnail URLs in Typesense for URL media saves and webpage preview fallbacks.
- Keep ordinary informational logs uncolored and reserve green logs for successful resource creation events.
- Reduce default runtime log noise by moving successful intermediate download, file-write, link-preview, search, and video-probing details out of the normal log stream.
- Use YouTube Open Graph titles as captions for URL-only saves, and keep X captions based on Open Graph descriptions with title fallback.
- Fix Zeabur Cobalt cookie setup to use a file config at
/cookies.jsoninstead of mounting a volume as a file. - Keep GHCR prerelease images reachable through the
stagtag after stablelatestimages are published. - Log link preview metadata fetch failures so missing URL captions and thumbnail URLs can be diagnosed from runtime logs.
- Send URL-downloaded media back to the source Telegram topic, build private supergroup topic source message URLs with the message thread id, and stop indexing the unused
source_message_idfield. - Stop storing invalid Telegram
source_message_urlvalues for private DM saves, where Telegram does not provide a direct message URL. - Store resolved media download URLs in Typesense for successful URL photo, video, HLS, and multi-image saves.
- Support downloading X resources that require login or verification when self-hosted Cobalt is configured with local cookies.
- Improve photo search to support caption full-text matching and high-confidence image semantic matching.
- Upgrade the bundled Cobalt service image from v10 to v11 for local and Zeabur deployments.
- Use user-provided Telegram text as captions for URL and photo saves, and fall back to URL Open Graph descriptions when a link has no user description.
- Fail application startup when
TELEGRAM_BOT_TOKENis missing instead of starting the bot with repeated ExGram token warnings. - Prevent
/similarphoto commands from crashing when Telegram delivers the command as a photo command update instead of a plain photo message. - Index Telegram photo captions delivered by ExGram as text updates so caption search can find directly uploaded photos.
- Preserve downloaded MP4 video display dimensions when sending to Telegram, and prepare uploads for streaming playback when possible.
- Simplify photo details to show only the source message URL, original URL, and saved timestamp.
- Upgrade Telegram and HTTP dependencies, and run Telegram, Google Drive, and Google OAuth requests through Req instead of Tesla.
- Keep HTTP logs at request-summary level instead of dumping full request and response bodies at debug level.
- Save Telegram video thumbnails as the preferred searchable cover for URL video downloads, falling back to webpage preview images only when Telegram does not provide a thumbnail.
- Add timezone-aware
created at YYYY-MM-DDcaptions to media downloaded from URLs, including every item in Telegram media groups. Caption dates usetzdatawith the standardTZenvironment variable, defaulting to Tokyo time. - Store Telegram source message links for indexed media and show them in photo details when a jump URL can be built.
- Save directly uploaded Telegram photos and videos to Typesense, and upload them to Google Drive when Drive is configured.
- Show Telegram media captions below photos and videos instead of above the media.
- Show only available fields in photo details instead of rendering empty
N/Arows. - Log original-file backup failures for directly uploaded Telegram videos without sending a user-facing message.
- Silently skip unavailable similar media results instead of sending user-facing error messages.
- Save directly uploaded Telegram photos and downloadable videos to local storage backups.
- Prevent
/similarresults from echoing the just uploaded Telegram media back into the chat. - Save Telegram-provided thumbnails without a user-facing failure message when a user-sent link cannot be downloaded.
- Prevent directly uploaded Telegram videos from crashing when Telegram refuses, fails, or times out while downloading the original file.
- Prevent oversized files from being uploaded to Telegram Bot API.
- Add
photo detailcommand to show detailed information about a saved photo. - Announce similar photo results so users can discover related media more easily.
- Rewrite Cobalt tunnel URLs to the configured API host to ensure requests are routed correctly.
- Add rollbackable Typesense migrations.
- Enable colored runtime logger output.
- Store original and download URLs for photos.
- Adopt the CalVer release workflow.
- Improve Elixir quality checks.
- Split test and quality workflows.
- Stop maintaining the repository changelog at this point in the project history.
- Refactor download flow data structures.
- Improve Telegram media uploads and Typesense search.
- Fix Telegram media handling.
- Add an ADR for the Docker packaging decision to document using an Elixir base image instead of
mix release. - Add a reusable
priv/typesense/migrate.exsscript so Typesense schema operations can be shared by mix tasks and manual maintenance scripts.
- Change the Docker and acceptance workflow to use a multi-stage Elixir-based image, compose-driven validation, and a named Typesense volume reused across local worktrees.
- Change Typesense photo indexing to keep both Telegram
file_idand the original downloadurl, while treatingurlas optional for uploads without an external source URL. - Change Typesense migration tasks to load only runtime config and HTTP dependencies instead of starting the Telegram bot application.
- Fix
mix ts.migratefalse failures when Typesense model initialization finishes after the client timeout but the collection was actually created. - Fix local media save failures caused by an outdated Typesense
photosschema that still requiredurland did not includefile_id. - Fix Sentry runtime configuration to use
config_env()so releases do not callMix.env()at boot.
- Publish the third release candidate for
0.4.1.
- Publish the second release candidate for
0.4.1.
- Publish the first release candidate for
0.4.1.
- Support sending Telegram media groups for multi-item media delivery.
- Add local Typesense setup guidance and migration utilities for development and operations.
- Improve bot resilience by degrading gracefully when Typesense calls fail.
- Refactor cobalt client error handling to return explicit error tuples instead of raising.
- Avoid crashes from downstream service errors by handling external failures consistently.
- Support
bad.newsvideo stream downloading via ffmpeg. - Auto-select the best video quality that fits within Telegram's 50 MB upload limit.
- Add a changelog agent skill.
- Add ffmpeg to the Dockerfile for HLS video support.
- Add end-to-end media search capability, including photo search and caption search.
- Improve media ingestion reliability with cobalt v10 upgrade and filename parsing fixes.
- Add operations and maintenance capabilities such as the
/deletecommand and Sentry integration.
- Upgrade cobalt integration from v7 to v10. Deployments using self-hosted or custom cobalt endpoints may need compatibility verification.
- Ensure runtime environment variables are complete for production deployment.
- Verify your cobalt endpoint is compatible with v10.
- Deploy
0.2.0. - Run regression checks for key flows: saving media from a direct URL, saving media from messages containing multiple URLs, searching photos and captions, and clearing saved messages with
/delete. - If Sentry is enabled, confirm events are reported correctly in your Sentry project.
- Support direct media URLs and multiple URLs in one message.
- Add photo search capability.
- Add caption search capability.
- Add capability to update photo captions.
- Add
/deletecommand for clearing messages. - Add Zeabur template for Typesense.
- Upgrade cobalt integration from v7 to v10.
- Integrate Sentry for error tracking and logging.
- General maintenance updates.
- Fix missing environment variable handling.
- Fix Typesense
filter_byformat forbelongs_to_id. - Fix cobalt v10 filename parsing issue.
- Add
/deletecommand for clearing messages.
- Fix cobalt v10 API filename parsing.
- Add capability to update photo captions.
- Upgrade cobalt integration from v7 to v10.
- Add photo search capability.
- Add Zeabur template for Typesense.
- Add caption search capability.
- Fix missing environment variable handling.
- Fix Typesense
filter_byformat forbelongs_to_id.
- Save photos from X.com, YouTube, Instagram, and similar sites.