Real-time capture is the default, animated and video stickers play, locations show their map picture, and files whose download stopped short are found and fetched again. Migration 039 runs on start and re-types old stickers; it touches nothing else. An install that set neither ENABLE_LISTENER nor SCHEDULE now runs the listener and one full pass a day. Update both images together: the viewer reads a listener heartbeat only the 9.2.0 backup writes. Run telegram-archive check-media once after upgrading. See Upgrading to 9.2.0.
Added
- Locations show their map, as in the Telegram apps. A location, a venue and a live location now show the small map picture Telegram's own servers render for the point, with the pin drawn over the centre and the sender's picture in the pin for a live location. The title, the address or coordinates and the copy button stay under it, and a click still opens OpenStreetMap. The backup asks Telegram for the picture once, when it first stores the location, and again when it reads a live location at a new position, and keeps it as that message's media file (
map_<16 hex>.jpgor.pngin the chat's media folder), so the viewer serves it from the archive and no map server or other third party ever sees the point. The listener does the same withLISTEN_NEW_MESSAGES_MEDIA=true, so a new location shows its map at once. Pictures followDOWNLOAD_MEDIAandSKIP_MEDIA_CHAT_IDS. A login without downloads, a location Telegram serves no picture for, and a picture that fails to load show the card as before. A later read of the message no longer resets the stored file of a location row.backfill-details --applyfetches the pictures of locations archived before this release, at most 500 per run, and reports them as saved, not served, with no point and deferred; it reads no message only to defer its picture, never asks again for a picture Telegram did not serve, and never clears a picture's path. No migration runs and no setting is added. See Locations and contacts. - Animated and video stickers play in the chat. An animated sticker (
.tgs) and a video sticker (.webm) loop while they are on screen and stop when you scroll away, as in the Telegram apps, where the viewer showed the text "Animated sticker". Every sticker sits in the same box, at most 200 px wide and 192 px tall. At most four animated stickers play at once, the newest to come into view first. A click, a tap, a hover or Enter plays one that holds still. Under reduced motion they hold their first frame and a click plays one once. The player is lottie-web 5.13.0, vendored and loaded only when the first animated sticker comes near the screen. The viewer serves.tgsfiles inline asapplication/x-tgsticker;?download=1still downloads them, and a login or share link without downloads still sees the Hidden placeholder. Safari and browsers on iPhone and iPad show the text "Video sticker" instead, since they cannot draw the clear background, and that text downloads the file for a login that may download. Lottie data is cleaned before it plays: an animated sticker cannot load fonts, pictures or scripts, which Telegram never puts in one. See Media.
Changed
- The real-time listener is on by default, and the full pass runs once a day.
ENABLE_LISTENER,LISTEN_NEW_MESSAGES_MEDIAandLISTEN_REACTIONSnow default totrue, so new messages, their media, edits, chat actions and reactions are saved as they happen.LISTEN_DELETIONSstaysfalse.SCHEDULEdefaults to0 3 * * *with the listener on and keeps0 */6 * * *with it off, where the pass is the only capture; an empty value now uses the default too. The stock compose file leavesSCHEDULEto that default and.env.exampleno longer sets it. Hourly and other frequent full passes are deprecated with the listener on: they still work, and startup logs a note whenSCHEDULEruns more than 4 passes a day. Startup logs oneCapture mode:line in place ofReal-time listener: ENABLED. TheENABLE_LISTENER enabledandLISTEN_*lines, and theEVENT_WEBHOOKlines, are now logged only byscheduleand the standalone listener, the processes that run a listener; the viewer, the one-shotbackupand the other commands no longer print them. An install that copied the old.env.exampleor compose file keepsENABLE_LISTENER=falseand the 6-hour schedule. See Upgrading to 9.2.0 and Schedule and backup tuning. - A listener that restarts after a disconnect catches up on what it missed. The listener now attaches its handlers before the shared connection is revived, then asks Telegram for the updates it missed, the request the official apps send on every new session. Updates from an outage longer than the Telegram library's own reconnect budget were dropped before, because the library replayed them while no handler was attached. A process restart still replays nothing; the startup backup covers new messages. See Catching up after a disconnect.
telegram-archive statusreports a listener that is not running. WithENABLE_LISTENERon, the command exits 1 and names the account when fewer listeners run than accounts are configured. A running listener now stamps a heartbeat in the database every 30 seconds, and a listener counts as running only while that stamp is under three minutes old, in the command, the viewer's Live line and Archive status alike. Before, a container that was killed, ran out of memory or lost power left the listener marked as running until a clean start cleared it. Archive status names such a listener with "A listener is not running". With a daily pass, the schedule check alone would take about two days to notice a stopped backup. See status.- The sidebar says Live while the full pass runs. With a listener active the status line under the archive's name reads Live with the start of the last full pass, for example
Live · full pass today at 03:00, and stays Live during a full pass; the tooltip says when one is running. Last backup did not finish still shows first for the master login. See Chat list. - The listener downloads at most 3 media files at once per account. Every live update runs on its own, so a catch-up that replayed an outage started a download for every replayed photo or file together on the one Telegram connection, and they ran into rate limits together. The message is still saved at once; only its file waits for a free slot.
- A backup without a viewer logs one warning for live updates, not one per message. On SQLite the listener pushes each live update to the viewer over HTTP. When the viewer is not running, the first failed push logs a warning and the next ones are logged at debug level until a push succeeds.
Fixed
- A video or audio file whose download stopped early is found, refused and downloaded again. A release from late 2025 stored some short downloads as complete files: an MP4 with no index, which no player opens and the transcription drain failed three times.
check-medianow counts such a file as cut short (nomoovbox, or a box that runs past the end, at a size that is a multiple of 128 KiB), a dry run exits 1 on it, and--repairmarks it to download again. The backup and the listener refuse a download shorter than the size Telegram declares for a document or a photo, and replace an existing short file only when its bytes are the start of the new download, so every link to it reads the complete file. When they are not, the short file stays and the complete download is kept beside it. A transcription failure about the earlier bytes no longer counts toward the three. The viewer shows a file marked to download again as not downloaded yet instead of missing from the archive disk, without loading its old bytes, and each message'smediain/api/chats/{ref}/messagesgainsdownloaded. See A file cut short. - Video stickers were archived as videos. Telegram lists a video sticker's video details before its sticker details, and the backup stopped at the first. Both the scheduled backup and the listener now archive it as a
sticker, the way the Telegram apps decide it. Migration 039 files the video stickers and animated stickers older releases stored asvideoordocumentas stickers. See Upgrading to 9.2. - Files with stickers drawn on them were archived as stickers. A video, GIF or picture someone decorated with stickers carries a mark Telegram names "has stickers", which the backup took for a sticker. It is now archived as the video, GIF or file it is. A row already archived this way is corrected when a backup reads its message again.
📋 Full changelog: docs/CHANGELOG.md