Saved Messages++

Личные заметки, логины и небольшие файлы в Telegram Mini App с шифрованием на устройстве и восстановлением по отдельной фразе.

На этой странице

Saved Messages++ — личное хранилище внутри Telegram. В нём можно вести заметки, хранить карточки логинов и паролей, добавлять небольшие файлы и возвращаться к предыдущим версиям записей. Содержимое шифруется на устройстве до передачи серверу, а открывается после разблокировки хранилища.

Бот служит точкой входа в Mini App. Веб-приложение доступно и по отдельному адресу; для настоящего хранилища нужен подтверждённый контекст Telegram. В обычном браузере предусмотрен временный деморежим, который не сохраняет данные как личный аккаунт. Интерфейс приложения сейчас на английском языке.

Записи, которые удобно держать отдельно

В приложении есть три типа содержимого: заметка, пароль и файл. Заметка хранит заголовок и текст, поддерживает Markdown и предварительный просмотр. Карточка пароля отделяет логин, секрет и адрес сайта от обычного текста. Для файла сохраняются его имя и байты; небольшое вложение можно добавить и к записи.

Теги и поиск помогают найти нужное без ручного просмотра всей коллекции. Поиск выполняется локально по уже расшифрованным данным: заголовку, тексту, логину, адресу и тегам. Значение поля пароля в поисковую строку не включается. Серверу не требуется открытый индекс пользовательского содержимого.

Нужную запись можно закрепить, ненужную — убрать в архив и позже вернуть. Постоянное удаление остаётся отдельным действием с подтверждением. Это разные состояния: архив помогает организовать список, а не обещает уничтожить данные. Основные экраны — Notes и Settings; один мобильный интерфейс используется и в широком окне Telegram на компьютере.

Вход и восстановление — разные задачи

Telegram подтверждает, к какому аккаунту относится запрос. Для расшифровки записей нужны собственные ключи приложения. Наличие Telegram ID или действующей серверной сессии само по себе не открывает содержимое хранилища.

При создании формируется отдельная фраза восстановления из 24 слов. Она связана с идентичностью хранилища и позволяет восстановить доступ в предусмотренном приложением сценарии. Это не пароль от Telegram и не фраза от существующего криптокошелька. Хранить её нужно отдельно от единственного устройства, на котором открыты заметки.

Повторный вход зависит от возможностей клиента. Реализован вход по PIN с подключением к серверу; там, где Telegram предоставляет подходящий защищённый механизм, доступны сохранение доступа на устройстве и биометрическая разблокировка. Приложение проверяет реальные возможности среды, а не обещает одинаковое поведение каждого браузера и каждой версии Telegram.

У основного устройства есть отдельный поток резервного копирования фразы. Настройки позволяют вернуться к нему позже. Скрытие напоминания о резервной копии не превращается в подтверждение, что копия действительно сохранена. Если защищённое хранение недоступно и работа идёт только в текущей сессии, закрытие приложения без внешней копии фразы может привести к потере доступа.

В Settings также доступен список доверенных устройств и их отзыв. Отзыв прекращает соответствующий дальнейший серверный доступ, но не стирает уже полученные офлайн-копии и не заменяет защиту самой фразы восстановления.

Работа при нестабильной сети

Сохранение записи сначала создаёт зашифрованную локальную копию и операцию в очереди отправки. Поэтому краткий обрыв сети не должен заставлять заново набирать уже сохранённый текст. Когда соединение возвращается, клиент отправляет накопленные операции. Состояние локального сохранения и завершённая синхронизация с сервером при этом различаются.

Повторная отправка использует ту же операцию, чтобы сетевой сбой не создавал дополнительную запись. При конфликте версий приложение не должно молча заменять чужую более новую правку своей локальной копией. Ошибки доступа, сети, квоты и конфликта обрабатываются отдельно.

Несохранённый редактор имеет собственные зашифрованные локальные черновики. После разрешённой разблокировки их можно восстановить или отбросить. Если исходная запись уже изменилась, восстановление отдельной копией помогает сохранить оба варианта. Это не обещание пережить любое мгновенное завершение процесса: операционная система может остановить приложение раньше, чем последние введённые символы попадут в локальное хранилище.

Для повторного открытия без сети предусмотрена заранее подготовленная публичная оболочка приложения и локальные зашифрованные данные. Первый запуск без подготовленного кеша всё равно требует соединения; доступность офлайн-режима также зависит от сохранности браузерного хранилища и способа разблокировки. PIN-входу нужен интернет.

История без открытых копий

У записи доступны текущая версия и до 32 предыдущих серверных версий. Историческое содержимое приходит зашифрованным и открывается на устройстве. Восстановление выбранного варианта создаёт новую версию, а не переписывает историю старым набором байтов.

Это позволяет исправить неудачное изменение текста, сохраняя понятную последовательность правок. Если запись успела измениться на сервере или для неё ещё есть локальные операции, клиент проверяет это перед восстановлением. История версий не подменяет резервную копию ключей: без доступа к расшифровке старые версии тоже останутся недоступными.

Что хранит сервер

Клиент построен на Next.js, React и TypeScript; API и доступ к MongoDB реализованы на Go. Контракты описаны через Protobuf и Connect. Серверная отрисовка даёт публичную оболочку, но не получает расшифрованные заметки, фразу восстановления или приватные ключи через свойства страницы.

Текст, названия, теги, поля карточек, имена и содержимое поддерживаемых вложений входят в зашифрованную запись. Для шифрования используется AES-256-GCM. Серверу остаются технические данные, необходимые для работы: идентификаторы, версии, размеры, права и состояния синхронизации. Поэтому «содержимое зашифровано» не означает «сервер не видит никакой информации».

Защита также зависит от самого клиента и устройства. Вредоносный JavaScript в открытом приложении или скомпрометированная операционная система могут получить доступ к уже расшифрованным данным. Независимый аудит безопасности не заявлен.

Границы текущего выпуска

Бот сейчас открывает Mini App и отвечает на служебные команды. Пересылка сообщения боту пока не сохраняет его как заметку. Приём сообщений, inline-сценарии и совместная работа не перечисляются здесь как готовые возможности.

У аккаунта действует общий бюджет 10 МБ. Вложения ограничены примерно 500 КБ на запись — точный предел составляет 512 000 байт суммарно; загрузка аудио и видео этим интерфейсом пока не поддерживается. Это хранилище коротких личных записей и небольших файлов, а не безлимитный медиадиск.