Данные должны уметь уходить

Сервис, из которого нельзя уйти, — ловушка, а не сервис. Но выгрузка, сделанная небрежно, превращается в способ прочитать то, что читать нельзя.

Когда команда выбирает, где хранить рабочую переписку, один из первых вопросов — «а что, если мы захотим уйти?». Ответ «напишите в поддержку, посмотрим» означает привязанность. Поэтому выгрузка в Kontext появилась не «когда попросят», а как часть продукта.

Что выгружается

  • Канал — в Markdown, чтобы читать, или в JSON, чтобы обработать программой. Из информации о канале, в любой момент.
  • Пространство целиком — каналы, переписка, задачи и участники одним файлом JSON, по запросу администратора.

Выгрузка не должна открывать закрытое

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

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

Самый большой канал — тот, который и захотят выгрузить

Наивная выгрузка собирает весь канал в память и отдаёт одним куском. На небольшом канале это работает. На канале с десятками тысяч сообщений процесс сервера падает — и это ровно тот канал, ради которого выгрузку и затевали.

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

Русское имя канала, ронявшее ответ

Самая неожиданная поломка ждала первого же русского названия. Файл выгрузки получает имя из названия канала: «kontext-общий-2026-09-16.md». Имя передаётся в HTTP-заголовке, а заголовки HTTP исторически кодируются в latin-1. Кириллица в заголовке роняла ответ ещё до отправки — человек видел ошибку сервера без единого байта файла.

Решение описано в стандарте давно: имя отдаётся дважды — безопасной ASCII-версией для старых клиентов и настоящим именем в UTF-8 по RFC 5987, которое понимают все современные браузеры.

После окончания подписки

Уйти можно и после того, как перестали платить: данные пространства остаются доступными для выгрузки ещё 30 дней, и перед удалением мы предупреждаем письмом. Это записано не только здесь, но и в условиях оплаты.

Как выгрузить данные — в документации.