Космо

Проверяю возможности устройства…

Не могу запуститься

Нужен код доступа

Этот сервер закрыт: пользоваться им могут только те, кому дали код.

Код должен дать тот, кто поднял сервер. Если тебя пригласили ссылкой — код в ней уже есть, и этот экран не появится: просто открой ссылку.

Сначала установи

Не создавай личность здесь

Safari и приложение с главного экрана на iPhone хранят данные раздельно — поделиться ими нельзя. Если завести личность в Safari, а потом ещё раз в приложении, получатся два разных аккаунта, и собеседник будет видеть не того.

  1. Нажми «Поделиться» внизу экрана Safari.
  2. Выбери «На экран «Домой»».
  3. Открой появившуюся иконку Космо.
  4. Вставь туда приглашение — кнопка ниже уже скопирует его.

Приглашение попадёт в буфер обмена. В установленном приложении открой «+» → «У меня есть приглашение» → «Вставить из буфера».

Всё равно продолжить в Safari

Так тоже работает, но данные Safari удаляет через 7 дней без использования — вместе с ключом, после чего переписку не расшифровать. И если позже установишь приложение, там будет отдельная личность.

Космо

Сообщения летят прямо между устройствами. Ключи не покидают телефон.

Ключи создаются здесь же, на устройстве, и никуда не отправляются.

Уже есть резервная копия

    Что происходило в последнем звонке и шёл ли звук на самом деле. Ни звука, ни адресов здесь нет — только события и счётчики. Если со звонком что-то не так, скопируй и пришли: по отчёту видно, где пропадает звук.

    
            
          

        Звонок

        Разговор шифруется от устройства до устройства. Описание соединения подписано ключом собеседника — подменить его по дороге нельзя.

        Пригласить собеседника

        Покажи этот код или отправь ссылку. Она одноразовая и действует сутки.

        Ключи лежат во фрагменте ссылки — той части, что идёт после решётки. Она не отправляется на сервер, поэтому в его журналы не попадает.

        Добавить по приглашению

        Контакт

        Код безопасности

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

        Номер телефона

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

        Канал по умолчанию

        Состояние

        Настройки

        Личность

        Версия

        Обычно приложение обновляется само при запуске. Кнопка нужна, если обновление почему-то не доехало: в установленной на главный экран PWA обновить страницу жестом нельзя — адресной строки там нет.

        Уведомления

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

        Звук и вибрация

        Звучит, пока приложение открыто. В фоне о сообщении говорит уведомление — его звук задаёт сам телефон.

        Мелодия звонка

        Всё спокойно

        Оценка риска0 %
        0100 %

        Выводы

        Проверка защиты

          Журнал

            Как работает Страж

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

            Чего он не может

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

            Статус в сети

            Выключишь — контакты перестанут видеть и «в сети», и время последнего входа. Чужие статусы при этом останутся видны.

            Микрофон

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

            Пока пишется голосовое, красная точка и время видны всё время. Микрофон гаснет сразу, как запись отправлена или выброшена, а если свернуть приложение посреди записи — в ту же секунду: записанное останется черновиком, и его можно будет отправить.

            Когда приложение закрыто, оно не выполняется вовсе — включать микрофон в это время нечему.

            С этим запретом не работают звонки — ни исходящие, ни входящие — и запись голосовых. Переписка и прослушивание голосовых не затрагиваются.

            Резервная копия

            Единственная защита от потери телефона и от того, что Safari вычистит хранилище. Копия зашифрована парольной фразой.

            Проверка

            Шифрование прогоняется на этом устройстве на известных примерах — видно, что оно работает именно здесь, а не вообще.

            Это устройство

            Где открыта эта личность

            Сервер пускает под твоим идентификатором только того, кто подпишет вход твоим ключом. Ниже — все, кто сейчас так вошёл.

            Кого пускать под этой личностью

            Перенести на другое устройство

            Ключи живут на одном устройстве и никуда сами не копируются. Переезд — через резервную копию: сохрани её здесь, восстанови на новом. После переезда старое устройство сотри — две копии одной личности мешают друг другу принимать сообщения. Если здесь оставлен вход только этому устройству, новое попросит вход — разреши его здесь, в «Устройствах».

            Отправка

            Выключишь — Enter будет переносить строку, а отправлять будет кнопка ➤. На телефоне так бывает удобнее.

            Что видит собеседник

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

            Отправляется только на хорошей связи и не чаще раза в несколько секунд.

            Экономия батареи

            Что она делает

            • Останавливает звёздное небо — единственную постоянную анимацию.
            • Выключает размытие стекла: его каждый кадр пересчитывает видеоядро.
            • Реже проверяет, живо ли соединение с сервером: раз в минуту вместо 15–30 секунд.

            Сообщения и звонки при этом работают как обычно.

            Режим передачи

            Внешний канал

            Спутник и радиомодем работают в обход интернета. Модем по USB — единственный способ отправить сообщение, когда сети нет совсем.

            Ретранслятор

            Адрес сервера. Пусто — тот же, откуда загружено приложение. Пригодится, чтобы установленная PWA подключилась к серверу в локальной сети, где интернета нет.

            Запасной адрес сервера

            Если основной адрес перестанут открывать, приложение само перейдёт на запасной — оболочка у тебя уже на устройстве, ей сеть не нужна. Это не обход блокировки туннелем: туннель в браузере построить нельзя. Это второй вход в то же здание, и он должен вести на тот же сервер.

            Хранилище

            Сколько хранить переписку

            Старые сообщения удаляются только на этом устройстве — у собеседника они остаются.

            Постоянное хранилище

            Цвет

            Размер текста

            Эффекты

            На слабом телефоне без них интерфейс отзывчивее.

            Связь без интернета

            Работает, когда оба устройства в одной сети Wi-Fi — в кафе, у знакомых, или один телефон раздал точку доступа, а второй к ней подключился. Интернет не нужен: сообщения идут напрямую между устройствами.

            Сеть выбираешь ты, не приложение

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

            С кем связаться

              Проверка связи

              Между приложением и сервером стоят DNS оператора, его прокси и оборудование фильтрации. Отказать может любое звено, и по-разному — проверим каждое отдельно.

              Один шаг обращается к двум посторонним адресам (Google и Cloudflare). Иначе не отличить «сети нет совсем» от «режут именно наш адрес» — снаружи оба случая выглядят одинаково. Уходит это только по нажатию кнопки и ничего о тебе не сообщает.

              Что работает, а что нет

              Шифрование

              Сообщения шифруются на устройстве (AES-256-GCM), ключи выводятся обменом X25519 или ECDH P-256 и проворачиваются на каждое сообщение. Приватные ключи не покидают телефон.

              Чего нет: провёртки Диффи-Хеллмана (полного Double Ratchet). Если злоумышленник получил состояние сессии, прошлые сообщения он не прочитает, а вот последующие — сможет, пока контакт не создан заново.

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

              Прямое соединение

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

              На случай, когда напрямую не выходит, поднят свой TURN: поток идёт через сервер. Он работает и по UDP, и по TCP, и поверх TLS — последнее выглядит снаружи обычным HTTPS и проходит там, где UDP режут. Содержимое ему недоступно: и переписка, и звук шифруются от устройства до устройства. Видит он только то же, что и ретранслятор, — что между двумя адресами идёт поток.

              Bluetooth и Wi-Fi Direct между телефонами из браузера недоступны нигде — и на Android тоже. Web Bluetooth не умеет работать в режиме периферии, поэтому два телефона просто не увидят друг друга. API для Wi-Fi Direct в вебе не существует вовсе.

              Спутник и радио

              Работает по-настоящему — двумя разными способами.

              Модем по USB. Браузер сам говорит с модемом Iridium (RockBLOCK 9602/9603 и подобные) через Web Serial и AT-команды, модем выходит на спутник. Ни интернета, ни сервера при этом не нужно вовсе — это и есть настоящая связь вне зоны покрытия. Кадр 340 байт, сеанс связи от минуты до пяти. Тем же путём работает обычный радиомодем (LoRa, APRS, мост на ESP32) — он дешевле и ближе.

              Шлюз провайдера. Железа не требует, но требует интернета: шлюз — это HTTP-сервис в сети. Запрос идёт через собственный сервер, потому что провайдер не отдаёт CORS-заголовки браузеру, а ключ API не должен лежать в клиентском коде.

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

              Почтовый мост. У части систем своего HTTP-API нет вовсе. У российского «Гонца» абонентский терминал работает по обычным почтовым протоколам, и адресатом сообщения может быть адрес электронной почты; у Iridium сообщение на модем тоже уходит письмом. Один и тот же мост закрывает обе системы, и ничьего API для этого не нужно. Конверт при этом уже зашифрован: почта и спутниковый оператор видят ровно столько же, сколько видел бы обычный ретранслятор.

              Чего всё же нельзя: отправить со смартфона прямо на спутник без отдельного модема — физически невозможно, тут никакой веб-API не поможет. И Web Serial есть только в Chromium (компьютер и Android); в Safari и на iOS его нет, там остаётся шлюз или почтовый мост.

              Про спутник на iPhone. Тот, что включается в экстренном вызове и в «Сообщениях», — закрытая система Apple. Доступа к ней нет ни у одного стороннего приложения, и веб-страница не получит его тем более. Apple разрабатывает такую возможность для обычных программ, но её пока нет, и когда появится — будет для нативных приложений, не для веба.

              Про связь смартфона со спутником без всякого модема в России. Частоты для испытаний выделены «Бюро 1440» и «Спутниксу», но коммерческие услуги разрешены только после 31 марта 2029 года. Когда это заработает, отдельная поддержка не понадобится: для телефона это будет обычная, очень медленная сотовая сеть, а к таким приложение уже приспособлено.

              И главное про спутник вообще: он выручает того, у кого устройство в руках. Если интернета нет у тебя — модем нужен тебе. Через сервер можно только доставить сообщение на чужой терминал, а это помогает, когда без связи остался собеседник, а не ты. Абонентские терминалы в России подлежат регистрации — это стоит уточнить у провайдера до покупки.

              Работа без интернета

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

              Важное различие: 2G — это тоже интернет. GPRS и EDGE передают данные, просто медленно, и там всё работает штатно — для этого и сделан эконом-режим. А сотовая сеть без данных даёт только голос и SMS.

              Совсем без данных отправить можно так: SMS — хватит одной палки сети; модем Iridium по USB — настоящий спутник; радиомодем по USB — то же самое, но дешевле и ближе. В одной Wi-Fi устройства к тому же соединяются напрямую, даже если у сети нет выхода наружу.

              Про SMS честно: браузер не может отправить её сам — такого API нет ни на Android, ни на iOS, иначе любая вкладка тратила бы деньги со счёта. Приложение откроет штатные сообщения с готовым шифротекстом, «отправить» нажимаешь ты. Принятую SMS нужно скопировать и вставить в настройках. Полуручной канал — но он работает там, где не работает ничего другого.

              Качество связи

              Значения «5G» в веб-API не существует: Network Information API различает только slow-2g, 2g, 3g и 4g — и есть лишь в Chromium, в Safari его нет совсем. Поэтому показывается полоса качества по собственному замеру задержки, а метка от браузера — как подсказка, если она есть.

              iOS

              Фоновой доставки нет. Push доступен с iOS 16.4 и только для приложения, добавленного на главный экран, причём каждое уведомление обязано быть показано. Данные приложения, открытого просто во вкладке, Safari удаляет через 7 дней без использования — вместе с ключом, после чего переписку не расшифровать. Сканера QR в приложении на iOS нет: нужного API в Safari не существует — используй штатную «Камеру» или вставь ссылку.

              Голосовые звонки

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

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

              Под слабую связь звук ужимается: в эконом-режиме это около 8 кбит/с и один пакет в 60 мс вместо 20. Тишина не передаётся вовсе, потерянный кусок восстанавливается из следующего. Замерено: 7,5 кбит/с самого звука и 17 пакетов в секунду — это влезает в EDGE.

              Куда звучит разговор. Обычная страница звучит через динамик — для музыки это верно, для разговора нет: телефон приходится держать перед собой. На iPhone звук уходит в разговорный наушник, как при обычном звонке, а громкая связь включается кнопкой на экране вызова.

              В Chrome на Android выбрать наушник вместо динамика нельзя: такой возможности у веб-страниц нет вовсе. Там разговор остаётся в динамике, и кнопка громкой связи не показывается — кнопка, которая ничего не делает, хуже её отсутствия.

              Звонок при закрытом приложении. Приложение в это время не выполняется вовсе, и разбудить его может только уведомление — другого способа у телефона нет. Поэтому приходит уведомление «звонит», а по нажатию приложение открывается сразу на экране вызова. Для этого нужны включённые уведомления; без них закрытое приложение о звонке не узнает.

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

              Чего звонки не умеют. Оба должны быть в сети одновременно: звук негде хранить и нечем переслать потом. Между двумя мобильными сетями звонок идёт через наш TURN — напрямую там пробивается не всегда. И сервер узнаёт, что это был звонок, а не сообщение: без такой пометки он не смог бы отличить вызов от обычного письма и разбудить телефон вовремя. Кто кому и когда — он знал и раньше, содержимое ему по-прежнему недоступно.

              Слабая связь и фильтрация

              До сервера ведут два пути. Основной — постоянное соединение: быстрое, но самое хрупкое, что можно придумать для мобильной сети. У операторов на пути стоят прозрачные прокси, ломающие такие соединения, а подвисший канал на EDGE выглядит как рабочий: отправка «удаётся», а на деле не уходит никуда.

              Поэтому есть второй путь — обычные короткие HTTPS-запросы. Приложение само проверяет, дошло ли сообщение до сервера, и при первом же сомнении переключается. Задержка вырастает на несколько секунд, доставка — нет. «Проверить связь» в настройках показывает, какой путь сейчас работает.

              Пределы ожидания приложение считает по этому же каналу, а не по круглым числам. На краю зоны измерено: простой запрос идёт 14 секунд, а ответ с накопившимися сообщениями — 33. С обычными таймаутами такая связь выглядит мёртвой, хотя работает: сообщения не уходят не из-за блокировки, а потому что приложение само бросает трубку. Теперь не бросает.

              Если основной адрес перестанут открывать, приложение перейдёт на запасной — он задаётся в настройках. Оболочка уже на устройстве, сеть ей не нужна, так что перестать работать может только сервер. Запасной адрес должен вести на тот же сервер: это второй вход в то же здание.

              Чего это не решает. Обхода блокировок туннелем здесь нет и быть не может: у браузера нет доступа к сокетам, поэтому ни VPN, ни маскировку трафика веб-приложение построить не в состоянии. И главное — глушилка подавляет радиосигнал физически. Когда она работает, канала нет вовсе, и обойти это не может никакая программа, включая любой VPN. То же самое, если оператор выключил мобильный интернет или оставил белый список из нескольких разрешённых сервисов.

              В этих случаях остаётся SMS: она идёт по голосовой сети и интернета не требует вовсе — номер собеседника задаётся на его карточке. Если подавлена и голосовая сеть, работает только внешний канал: спутниковый модем или радиомодем по USB.

              Связь без интернета, по местной сети

              Если оба устройства оказались в одной сети Wi-Fi — в кафе, у знакомых, или один телефон раздал точку доступа, — сообщения идут напрямую между ними. Ни интернет, ни сервер при этом не нужны вообще. Параметры соединения переносятся QR-кодом с экрана на экран или текстом.

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

              Чего приложение не умеет и не будет. Увидеть сети вокруг и подключиться к ним браузер не даёт — таких возможностей веб-страницам не предоставляют, ни в Chrome, ни в Safari. К сети подключается человек, руками. И точки доступа не передают сообщения между собой: это чужое оборудование, которое про нас ничего не знает. Работает это только внутри одной сети.

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

              Уведомления

              Приходят, только когда приложение закрыто и собеседник не смог достучаться напрямую. Внутри уведомления нет ни текста, ни имени — только идентификатор отправителя; имя подставляет уже само устройство, читая свою базу.

              Уведомление обязательно идёт через службу браузера: у Android это Google, у iPhone Apple, у Firefox Mozilla. Прочитать его содержимое служба не может — оно зашифровано ключами, которые браузер создал у себя. Но сам факт «на это устройство пришло уведомление в такое-то время» она видит. Обойти посредника нельзя: так устроены сами телефоны. Не нужны уведомления — выключи их в настройках, тогда посредника не будет вовсе.

              На iPhone это работает только в приложении с главного экрана и с iOS 16.4. Во вкладке Safari уведомлений не будет.

              Кто в сети

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

              Метаданные

              Ретранслятор не видит текст, но видит, кто с кем и когда переписывается и какого размера сообщения. Это цена за доставку офлайн-адресату. Теперь он вдобавок помнит, кто когда был на связи, — иначе показать «был в сети вчера» было бы неоткуда.

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