Imsel - Utility

Документация: https://gitlab-docs.imsel.dev · Privacy Policy: https://gitlab-docs.imsel.dev/privacy-policy.html · Terms of Service: https://gitlab-docs.imsel.dev/terms-of-service.html

iOSAndroidDesktop
[App Store-Global] in development()[Google Play] in development()[Windows]in development()
[App Store-Only RU]in development()[Download APK]in development()/[mirror]in development()[macOS(arm64/intel)]in development()
[Testflight-Global]in development()[Download Beta APK]in development()[Linux-x64(.deb)]in development()
[Testflight-Only RU]in development())[Linux-arm64(.deb)]in development()
[Linux-x64(.rpm)]in development()
[Linux-arm64(.rpm)]in development()
[ArchLinux-x64(.pkg)]in development()
[ArchLinux-arm64(.pkg)]in development()

Imsel is a mobile application designed for convenient proxy server management, powered by the robust Xray core. The app features an intuitive interface and a range of useful functions, making it an essential tool for managing connections.

The key features of IMSEL include:

  • Configuration of proxy servers based on flexible routing rules.
  • Support for multiple modern protocols, including:
    • VLESS (Reality)
    • VMess
    • Trojan
    • Shadowsocks
    • Socks

Imsel ensures your network activity remains private by not collecting any data; your information remains solely on your device without being sent to external servers.

It's important to highlight that IMSEL does not provide VPN services for purchase. Users are responsible for acquiring or setting up their own servers. Users should also comply with applicable laws in their jurisdiction when utilizing the app.

To report a problem, use our

Управление приложением

Полная спецификация управления приложением IMSEL VPN через подписку — по схеме, совместимой с документацией Incy/Happ. Клиент читает HTTP-заголовки ответа подписки и fallback-строки #param в теле и применяет их к настройкам и поведению.

Реализация: приём метаданных — lib/config/header_receive_config.dart; команды управления — lib/config/subscription_commands.dart; применение — Subscription.applyMeta/applyCommands + SubscriptionService; фоновое применение — WorkManager-воркер.

Как отправляет запросы клиент

Заголовок запросаЗначение
User-AgentIMSEL/<версия>/<ОС>/<hwid> — например, IMSEL/1.0.0/Android/17839452147361875676 (может быть подменён командой change-user-agent; до инициализации — fallback v2rayNG/1.8.5 для совместимости с панелями)
X-HWIDидентификатор устройства — отправляется всегда, отключения нет
Cookieтот же идентификатор устройства (HWID), что и в X-HWID — дублирование, как у Happ (cookie: <hwid>)
x-device-localeязык устройства (ru, en, …)
x-device-osплатформа (Android, Windows)
x-ver-osверсия ОС (14, 10.0.22631, …)
x-device-modelмодель устройства (23117RA68G, имя ПК на Windows; пустая — заголовок не отправляется)
Accept / Connection*/* / close

change-user-agent заменяет только User-Agent — заголовки x-device-* и X-HWID продолжают отправляться. При включённом VPN запросы идут через локальный HTTP-прокси ядра; Domain Fronting подписочных URL — см. Подписка через домен-фронтинг.

Способы передачи параметров

1. HTTP-заголовок ответа (приоритетный):

HTTP/1.1 200 OK
profile-title: Мой VPN
profile-update-interval: 6

2. Строка в теле подписки (fallback):

#profile-title: Мой VPN
#profile-update-interval: 6
vless://...

Правила:

  • Приоритет: заголовок > #param-строка. Немаркированные строки тела игнорируются.
  • Boolean (тринарная семантика): true/1 → включить; любое другое непустое значение (0, false) → выключить; отсутствие параметра → сервер не управляет, локальное значение не трогается.
  • Кодирование: текстовые значения поддерживают префикс base64: (UTF-8).
  • Имена телесных строк принимаются в вариантах with-dash и withoutdash (#profile-title: и #profiletitle:).
  • Применение — молчаливое, без подтверждения пользователя, при каждом успешном обновлении подписки (в UI и в фоне).
  • URL-значения принимаются только со схемой http:///https:// (включая фронтинг-URL); невалидные значения молча отбрасываются.

Данные подписки

Имя подписки

profile-title: Мой VPN
profile-title: base64:0JzQvtC5INCy0YHQsNC5

До 25 символов (обрезается). В base64-варианте первая строка — имя, остальные — описание. Альтернативные заголовки: subscription-name, content-disposition (также распознаётся из заголовка-строки).

Описание подписки

profile-description: Быстрые серверы в Европе
profile-description: base64:0JHRgtC40L/QsNGG0LjRjw==

Показывается мелким текстом в шапке карточки. Имеет приоритет над описанием из base64-profile-title.

Статус (трафик и срок)

subscription-userinfo: upload=1073741824;download=10737418240;total=107374182400;expire=1700000000

Трафик в байтах. expire — unix-время в секундах; значения больше 32 000 000 000 трактуются как миллисекунды и конвертируются. total=0 — безлимит (∞). Прогресс-бар: зелёный → оранжевый (≥70%) → красный (≥90%).

Интервал автообновления

profile-update-interval: 6

Часы. > 0 — включить автообновление с этим интервалом (ограничивается диапазоном 1–168 ч); 0 — выключить; отсутствие — не управлять. Управляет и фоновыми WorkManager-задачами.

Ссылки

support-url: https://t.me/your_support_bot
profile-web-page-url: https://your-site.com
premium-url: https://example.com/pricing

Кнопки в карточке подписки: поддержка (✈), веб-страница (ℹ), «Премиум» (★, только при наличии premium-url).

Объявление

announce: [текст | base64:...]
announce-url: https://example.com/news.txt

Текст объявления (до 200 символов, обрезается с «…») в рамке в карточке. announce (текст напрямую) имеет приоритет над announce-url: клиент скачивает текст по ссылке (тело — plain или base64:..., тот же таймаут и User-Agent, ошибки молча игнорируются). Устаревший sub-info (текст) работает как alias announce.

Сортировка серверов

subscriptions-sort-type: [without | ping | alphabet]

Собственное расширение IMSEL: сортировка серверов внутри подписки.


Зеркала подписки

Первый URL — без метки, каждый следующий — с меткой url:N=, в конце может стоять fallback-url=:

https://gmail.com/sub/token#m1?resolve-address=gmail.com&host=storage.googleapis.com
  |url:1=https://www.google.com/sub/token#m2?resolve-address=www.google.com&host=storage.googleapis.com
  |url:2=https://fcm.googleapis.com/sub/token#m3?resolve-address=fcm.googleapis.com&host=storage.googleapis.com
  |fallback-url=https://backup.example.com/token
  • Позиции: первый URL = позиция 0, url:1 = второй URL (позиция 1), url:N = позиция N. Диапазон меток: 0–99.
  • Разделители: | или перевод строки.
  • Каждый URL — обычный или фронтинг-URL.
  • Немаркированный список (просто URL через |/\n) тоже принимается — зеркала по порядку.
  • Зеркала пробуются по порядку до первого успешного ответа; во время загрузки top-баннер показывает позицию (2/4) и секунды до таймаута.

Управление подпиской

Смена URL (new-url)

Три режима работы по значению:

new-url: https://new-first.com/token

Одиночный URL — замена только первого зеркала (позиция 0), остальные не трогаются.

new-url: https://a.com/token|https://b.com/token|https://c.com/token

Несколько plain URL без меток — полная замена списка (легаси-режим).

new-url: https://first.com/t|url:1=https://second.com/t|fallback-url=https://fb.com/t

Помеченная структура — точечно по позициям: упомянутые позиции заменяются, fallback-url= записывается в поле запасного адреса, неупомянутые зеркала не меняются. Все URL проходят валидацию схемы; невалидные части отбрасываются.

Применяется начиная со следующего обновления; фоновая задача WorkManager автоматически привязывается к новому URL.

Точечные операции с зеркалами (new-url-N)

Заголовок new-url-N (N — позиция: 0 — первый URL, 1url:1, …) или телесная строка #new-url:N=значение (колон-форма; при нескольких командах используйте каноническую форму с дефисом — одноимённые #new-url: строки перекрывают друг друга):

КомандаДействие
new-url-1: https://drive.google.com/tok#m?resolve-address=drive.google.com&host=storage.googleapis.comзаменить зеркало url:1 целиком
new-url-3: https://append.com/tokenN = количество зеркал → добавить в конец
new-url-1: 0 (или false)удалить зеркало url:1
new-url-1: resolve-address=142.251.41.165точечно заменить только resolve-address — домен или IP-адрес
new-url-0: host=storage.googleapis.comточечно заменить только host (Host-заголовок фронтинга)

Правила:

  • Патч параметра: существующее значение заменяется, отсутствующее — дописывается в фрагмент URL.
  • N > количества зеркал («дыра») игнорируется.
  • Операция, после которой список опустел бы полностью, отклоняется целиком.
  • Порядок применения в одном ответе: new-url → точечные замены/удаления → патчи параметров → домены.

Смена домена (new-domain)

new-domain: new-domain.com
new-domain-1: drive.google.com
new-domain: 1=drive.google.com

new-domain — домен (host) во всех зеркалах; new-domain-N / колон-форма — только у зеркала на позиции N. Путь, query и фрагмент сохраняются.

Синхронизация фронтинга: если у зеркала resolve-address совпадает со старым доменом — заменяется вместе с host (фронт и резолв согласованы). host= не трогается никогда; resolve-address, не равный старому домену (например, IP), — тоже.

Запасные адреса (fallback-url)

fallback-url: https://backup-domain.com/token
fallback-url: https://f1.com/token#m?resolve-address=f1.com&host=storage.googleapis.com|https://f2.com/token

Пробуются по очереди после отказа всех зеркал (HTTP 300–599 или таймаут; таймаут — персональный настройки подписки либо глобальная, 5–15 с). Несколько URL через |/\n; фронтинг-URL разрешены. Встроенный fallback-url= в конце помеченного списка имеет тот же эффект и пробуется первым. Fallback не заменяет список зеркал.

User-Agent (change-user-agent)

change-user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)

Подменяет User-Agent для всех запросов этой подписки: зеркала, fallback и скачивание announce-url. Применяется начиная со следующего обновления.

Блокировка настроек (hide-settings)

hide-settings: 1
hide-settings: 0

1 — настройки подписки становятся только для чтения (аналог локальной блокировки); 0 — снимает блокировку (в т. ч. выставленную пользователем вручную).

Уведомления о загрузке

Клиент детально сообщает о попытках:

  • Всё упало — красное уведомление с полной сводкой: Ошибка: не удалось загрузить подписку. Попытки: зеркало 1 (gmail.com): HTTP 502; зеркало 2 (www.google.com): таймаут 15 с; запасной URL (backup.com): HTTP 404. Для тотального таймаута добавляется подсказка увеличить таймаут.
  • Успех через отказоустойчивость — предупреждение: Подписка обновлена через запасной URL. Недоступны: зеркало 1 (gmail.com): таймаут 15 с или Подписка обновлена (не все зеркала доступны: …).
  • Чистый успех — без уведомлений (только top-баннер прогресса).

Расширенные объявления

Инфо-блок sub-info

sub-info-color: red
sub-info-text: Продлите подписку со скидкой
sub-info-button-text: Купить
sub-info-button-link: https://example.com/buy

Цветной баннер в карточке. Цвет: red / blue / green (default blue; неизвестные значения → blue). Текст — до 200 символов (обрезается с «…»), кнопка — до 25. Кнопка не показывается без ссылки. Отключение: sub-info-text: 0. Блок скрывается, пока активен баннер истечения (см. ниже).

Баннер истечения sub-expire

sub-expire: 1
sub-expire-button-link: https://example.com/renew

Системный баннер по expireDate из subscription-userinfo: за ≤ 3 дней — «Ваша подписка заканчивается через N д.» (или «…сегодня»), после истечения — «Подписка закончилась!». Кнопка «Продлить» открывает ссылку. Имеет приоритет над sub-info-блоком.

Локальные уведомления об истечении (notification-subs-expire)

notification-subs-expire: 1

Локальное уведомление раз в день в течение 3 дней до истечения: «У вашей подписки [имя] скоро истечёт срок действия (через N д.), не забудьте продлить её».


Настройки подключения (серверные)

Перезаписывают соответствующие настройки карточки подписки; действуют на серверы этой подписки при генерации конфига Xray. Область действия — только эта подписка (см. ниже «Эко-система подписок»).

Фрагментация TLS

fragmentation-enable: 1
fragmentation-packets: tlshello
fragmentation-length: 10-30
fragmentation-interval: 10-30

packets: tlshello / 1 / 1-3 / all; length/interval: диапазон min-max (положительные целые, min ≤ max). Некорректные значения молча отбрасываются (параметр не применяется).

Шумовые пакеты

noises-enable: 1
noises-type: rand
noises-packet: 10-20
noises-delay: 10-50

Тип шума: rand / str / hex / base64. Принимаются оба написания — noises-type (Incy) и noises-packet-type (Happ); значение array трактуется как rand. delay — диапазон min-max мс.

DoH-резолв адреса сервера

server-address-resolve-enable: 1
server-address-resolve-dns-domain: https://common.dot.dns.yandex.net/dns-query
server-address-resolve-dns-ip: 77.88.8.8

Перед подключением домен сервера резолвится через DNS-over-HTTPS (JSON API, A-записи):

  • при нескольких A-записях выбирается IP с минимальным временем TCP-подключения (до 5 кандидатов);
  • домен в адресе outbound заменяется на IP, оригинальный домен сохраняется в SNI (sni=/host=; для vmess — поля sni/host);
  • dns-ip — bootstrap: прямое подключение к IP DoH-сервера с подменённым Host, если домен DoH не резолвится;
  • по умолчанию (без dns-domain) используется https://common.dot.dns.yandex.net/dns-query;
  • результат кэшируется на 5 минут;
  • работает для share-ссылок (включая vmess-base64); готовые JSON-конфиги не переписываются;
  • ошибка резолва не блокирует подключение — используется исходный домен.

Эко-система подписок: область действия команд

Каждая подписка в IMSEL — изолированный контейнер: свои зеркала URL + fallback, свои настройки подключения (фрагментация/шум/MUX/allowInsecure/DoH), свои метаданные (трафик/срок/объявление/баннеры), своё состояние команд (locked, autoconnect, кастомный User-Agent). Серверы каждой подписки помечены именем группы (subName) и живут в своём списке.

Цепочка применения при подключении

Подключение идёт к конкретному серверу → по его subName находится его подписка → в конфиг Xray идут настройки этой подписки:

сервер (subName: "Провайдер A")
  → findRealSubscription("Провайдер A")
  → fragment/noise/mux/allowInsecure/DoH из карточки «Провайдер A»
  → конфиг Xray этого сервера

Команда fragmentation-*/noises-*/server-address-resolve-* от панели A перезаписывает поля только подписки A — серверы подписок B и C подключаются со своими (локальными или серверными) значениями.

Цепочка эффективных настроек (ЭКО)

При генерации конфига значения выбираются по убыванию специфичности:

  1. JSON-конфиг подписки (не share-ссылки) — настройки карточки не применяются вовсе (JSON не модифицируется; кнопка «Ещё» заблокирована).
  2. Сервер без карточки подписки (группы «ручные серверы»/«импорт из буфера» без записи) — берутся глобальные настройки приложения, а не чужой подписки.
  3. Share-ссылка + подписка — настройки карточки этой подписки (именно их перезаписывают серверные команды) с учётом:
    • overrideLinkFragment («перекрывать параметры из ссылки») — форсировать fragment-параметры подписки поверх per-link значений;
    • allowInsecure — объединение флага подписки и флага самого сервера.
  4. DoH-резолв — срабатывает при подключении к серверу только если у его подписки включён server-address-resolve-enable.

Что per-subscription, а что глобально

ОбластьПараметры
Только эта подпискаfragmentation-*, noises-*, server-address-resolve-*, change-user-agent, new-url(-N), new-domain(-N), fallback-url, hide-settings, sub-info-*, sub-expire(-button-link), notification-subs-expire, subscription-autoconnect(-type), subscription-ping-onopen-enabled, subscription-always-hwid-enable, no-limit-enabled, sniffing-enable, subscription-auto-update-enable, subscription-auto-update-open-enable, а также метаданные (title/описание/трафик/срок/ссылки/объявление/интервал)
Всё приложениеping-type, check-url-via-proxy

Глобальных команд всего две — обе про пинг; UI-настроек для них нет, управляются только заголовками (последняя приславшая панель задаёт значение). Всё остальное, включая sniffing и автообновление, живёт в контейнере подписки: команда панели и кнопки UI («Ещё», кнопка Sniffing на карточке) пишут одни и те же поля. Тринарность (0 для снятия) работает одинаково в обеих областях.


Поведение приложения

Автоподключение

subscription-autoconnect: 1
subscription-autoconnect-type: lastused

Автоматическое подключение при запуске приложения (один раз за холодный старт, если VPN не активен). Критерий выбора сервера: lastused (по умолчанию; ранее выбранный сервер), lowestdelay (после завершения автопинга — минимальная задержка), random.

Автопинг при открытии

subscription-ping-onopen-enabled: 1

Автоматический пинг серверов подписки при открытии приложения. Способ — ping-type.

Способ пинга

ping-type: proxy
check-url-via-proxy: https://cp.cloudflare.com/generate_204

ping-type: proxy (GET через ядро; default) / proxy-head / tcp / icmp (без root недоступен — выполняется как TCP-пинг). check-url-via-proxy — URL проверки для proxy-режимов (по умолчанию — стандартный URL проверки приложения, тот же что в диалоге пинга).

Обе команды применяются глобально и UI-настроек в приложении не имеют — единственный способ управления: заголовок ответа подписки (снятие — ping-type с другим значением; check-url-via-proxy перезаписывает пользовательский URL пинга).

Sniffing (per-subscription)

sniffing-enable: 1

Анализ трафика (sniffing) для серверов этой подписки — перезаписывает значение профиля маршрутизации только для неё (эко-система). В UI есть кнопка на карточке подписки (иконка «подзорная труба», рядом с пингом и меню): цикл «наследовать профиль → выключен → включён»; команда пишет то же поле. Тринарность: 0 — выключить, 1 — включить, отсутствие — не менять.

Автообновление (per-subscription)

subscription-auto-update-enable: 0
subscription-auto-update-open-enable: 1

Управляют тумблерами карточки этой подписки (эко-система):

  • subscription-auto-update-enable — «Автообновление» (интервальное, 1–168 ч; интервал сохраняется, profile-update-interval может задать свой). 0 — выключить, 1 — включить;
  • subscription-auto-update-open-enable — «Обновление при открытии»: обновлять эту подписку при каждом открытии приложения.

Оба тумблера доступны пользователю в окне управления подпиской («Ещё»); команда и UI пишут одни и те же поля.

Неотключаемый HWID

subscription-always-hwid-enable: 1

Принимается и сохраняется. В IMSEL X-HWID отправляется всегда (выключателя в приложении нет), поэтому команда фактически закрепляет существующее поведение.

Лимиты памяти ядра

no-limit-enabled: 1

Принимается и сохраняется, но пока не применяется: требуется нативная поддержка memory-limit в Go-ядре (GOMEMLIMIT).


Описание сервера (serverDescription)

Подпись под именем сервера (вместо технического тега «VLESS / WS / TLS»). Добавляется в фрагмент share-ссылки после имени:

vless://uuid@server:443#Сервер1?serverDescription=0J/RgNC40LzQtdGA

Значение — base64 (при невозможности декодирования принимается как plain text). Рекомендуемая длина — до 30 символов. Поддерживается во всех форматах ссылок (vless/vmess/trojan/ss/socks/wireguard/hysteria2) и в JSON-подписках через поле meta.serverDescription.


Приложение: порядок применения

Обработка ответа подписки (UI-обновление и фоновый воркер одинаковы):

  1. Разбор метаданных (SubscriptionMeta) и команд (SubscriptionCommands) — заголовки поверх #param.
  2. applyMeta — данные (трафик/срок/ссылки/объявление/интервал).
  3. applyCommands — порядок для URL: вынос встроенного fallback-url=new-url → точечные замены/удаления → патчи resolve-address/hostnew-domain (глобальный) → new-domain-N.
  4. Глобальные команды (ping-type, check-url-via-proxy) — в настройках приложения. Sniffing и автообновление применяются per-subscription вместе с остальными полями подписки.
  5. Планирование уведомлений об истечении.
  6. Сохранение; пересинхронизация фоновой задачи при смене URL/интервала.

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

Сводная таблица параметров

ПараметрТипВалидация/лимит
profile-titleтекст / base64:≤ 25 симв. (обрезается)
profile-descriptionтекст / base64:
profile-web-page-url, support-url, premium-urlURLhttp/https
subscription-userinfok=v;…байты; expire сек (или мс > 32e9)
profile-update-intervalintчасы; clamped 1–168; 0 = выкл
announceтекст / base64:≤ 200 симв.
announce-urlURLтело ответа ≤ 200 симв.
subscriptions-sort-typeenumwithout / ping / alphabet
new-urlURL / список / структураhttp/https; метки url:0–99
new-url-NURL / 0 / патчN = 0–99; патч: resolve-address=<домен|IP>, host=<домен>
new-domain, new-domain-NдоменN = 0–99
fallback-urlURL / списокhttp/https
change-user-agentтекст
hide-settingstri-booltrue/1, 0/false
sub-info-colorenumred / blue / green
sub-info-textтекст≤ 200 симв.; 0 = отключить
sub-info-button-textтекст≤ 25 симв.
sub-info-button-link, sub-expire-button-linkURLhttp/https
sub-expiretri-bool
notification-subs-expiretri-bool
subscription-always-hwid-enabletri-bool
no-limit-enabledtri-boolсохраняется, не применяется
fragmentation-enabletri-bool
fragmentation-packetsenum/диапазонtlshello / 1 / min-max / all
fragmentation-length, fragmentation-intervalдиапазонmin-max, min ≥ 1
noises-enabletri-bool
noises-type / noises-packet-typeenumrand / str / hex / base64 (array→rand)
noises-packetтекст/диапазон
noises-delayдиапазонmin-max
server-address-resolve-enabletri-bool
server-address-resolve-dns-domainURLhttp/https
server-address-resolve-dns-ipIPv44 октета 0–255
subscription-autoconnecttri-bool
subscription-autoconnect-typeenumlastused / lowestdelay / random
subscription-ping-onopen-enabledtri-bool
ping-typeenumproxy / proxy-head / tcp / icmp (→tcp)
check-url-via-proxyURLhttp/https
sniffing-enabletri-boolper-sub; null = наследовать профиль
subscription-auto-update-enable, subscription-auto-update-open-enabletri-boolper-sub (тумблеры карточки)

Не поддерживается

  • routing, autorouting, routing-enable — управление маршрутизацией из подписки (профили Happ применяются отдельным импортом imsel://routing/... с подтверждением пользователя);
  • per-app-proxy-enable/-mode/-list, app-auto-start — платформо-зависимые (Android) параметры;
  • socks-auth-*, http-auth-*, tun-type, custom-tunnel-config — desktop-параметры;
  • no-limit-enabled — сохраняется, применение ожидает нативной поддержки ядра;
  • Provider ID / Premium API (Lite Mode, кастомные темы, баннеры, push) — не реализовано.

Подписка через домен-фронтинг

Домен-фронтинг (Domain Fronting) позволяет обращаться к серверу подписки через «фронт» — крупный CDN/облачный домен, который не блокируется. Соединение устанавливается с IP-адресом фронта, но HTTP-запрос идёт с Host-заголовком настоящего сервера. Провайдер видит подключение к «белому» домену, а не к домену VPN-панели.

Формат ссылки

Фронтинг-параметры передаются в фрагменте ссылки подписки (после #имя?):

https://<front-domain>/<path>/<token>#<name>?resolve-address=<front-domain>&host=<real-host>
ЧастьЗначениеПример
<front-domain>Домен-фронт в самой ссылке (authority) — виден провайдеру как цель подключенияgmail.com
resolve-addressДомен, который клиент резолвит и подключается по IP напрямую (обычно тот же фронт)gmail.com
hostНастоящий Host-заголовок — домен, на который CDN маршрутизирует запросstorage.googleapis.com

resolve-address и host можно комбинировать с любым front-domain: адрес подключения определяется фронт-доменом (resolve-address), а маршрутизация на сервер — заголовком host.

Пример: три зеркала

Первый URL без метки, последующие — с метками url:N=, в конце fallback-url=:

https://gmail.com/runrun1/token#rahima?resolve-address=gmail.com&host=storage.googleapis.com|url:1=https://www.google.com/runrun1/token#rahima?resolve-address=www.google.com&host=storage.googleapis.com|url:2=https://fcm.googleapis.com/runrun1/token#rahima?resolve-address=fcm.googleapis.com&host=storage.googleapis.com|fallback-url=https://backup.example.com/token

Клиент пробует зеркала по порядку: gmail.comwww.google.comfcm.googleapis.com. Каждый резолвится отдельно, соединение идёт на IP соответствующего фронта, Host-заголовок всегда storage.googleapis.com. Если все три недоступны — используется fallback-url. Тот же список без меток (просто через |) тоже работает.

Управление фронтинг-зеркалами из подписки

Команды управления (app-management.md) работают с фронтинг-зеркалами через помеченные позиции: первый URL — позиция 0, url:1 — второй, url:N — позиция N:

new-url: https://drive.google.com/runrun1/token#rahima?resolve-address=drive.google.com&host=storage.googleapis.com
new-url-1: https://www.google.com/runrun1/token#rahima?resolve-address=www.google.com&host=storage.googleapis.com
new-url-1: resolve-address=142.251.41.165
new-url-1: host=storage.googleapis.com
new-domain: drive.google.com
new-url-2: 0
fallback-url: https://fcm.googleapis.com/runrun1/token#rahima?resolve-address=fcm.googleapis.com&host=storage.googleapis.com
  • new-url — заменить только первый URL (позиция 0);
  • new-url-N: <url> — заменить зеркало на позиции N целиком (обычный или фронтинг-URL); N = количество — добавить в конец; 0 — удалить;
  • new-url-N: resolve-address=<домен|IP> — точечно заменить только resolve-address (IP-адрес разрешён: фронт резолвится заранее и подключение идёт на указанный IP);
  • new-url-N: host=<домен> — точечно заменить только host (Host-заголовок фронтинга);
  • new-domain / new-domain-N — заменить фронт-домен: меняется host ссылки и resolve-address (если совпадал со старим фронтом); host= не трогается — CDN-маршрутизация сохраняется;
  • fallback-url — запасной фронтинг-URL на случай, когда все зеркала недоступны.

Ограничения

  • Резолв resolve-address выполняется системным DNS: если домен фронта резолвится на «заглушку», соединение не состоится — выбирайте живые фронты.
  • Фронт должен поддерживать маршрутизацию по Host-заголовку на ваш сервер (типично для Google/Cloudflare/AWS-инфраструктур); иначе CDN вернёт ошибку.
  • HTTP/2-мультиплексирование на некоторых CDN игнорирует Host-заголовок после установления соединения — при странном поведении попробуйте другой фронт.

Сетевые настройки (Routing)

Раздел будет дополнен позже.

Offline-раздача подписок

Раздавайте добавленную подписку другим устройствам без сервера: вся раздача упаковывается в самодостаточную ссылку или файл. Работает одинаково на Android и iOS.

ℹ️ Примечание Раздача полностью offline: конфиги не проходят через облачное хранилище и сторонние сервисы. Всё шифрование и все проверки выполняются на устройствах отправителя и получателя.


Обзор

Функция решает задачу «передать подписку другому человеку с ограничениями»:

ВозможностьОписание
Формат раздачиСсылка imsel://sub/..., QR-код или файл .imsel
СодержимоеСнапшот серверов (share-ссылки vless:///vmess:///... или Xray-JSON конфиги) либо URL подписки панели
ШифрованиеAES-256-GCM (зашифрованная раздача) или без шифрования (открытая)
ПривязкаПо HWID устройства, «первое устройство» или без привязки
ТаймерСрок с момента активации (1/3/7/30 дней) и/или абсолютный дедлайн
PINКод активации: без PIN ссылка криптостойко не расшифровывается
Ограничения получателяЗапрет активации на руте, блок настроек, скрытие конфигов, запрет повторной раздачи
Защита файлаПароль файла: AES-256-GCM + PBKDF2-HMAC-SHA256 (100 000 итераций)

Создание раздачи

Окно «Подписки» → карточка подписки → «Поделиться».

Что передать

  • Серверы (снапшот) — конфиги зашиты внутрь раздачи; получатель не видит URL панели и не может вынести конфиги в другой клиент по ссылке. Поддерживаются и share-ссылки, и JSON-конфиги (каждый парсится отдельно).
  • Ссылка — URL панели внутри раздачи; получатель сможет обновлять подписку напрямую с панели.

Защита

  • Шифрование AES-256 — полезная нагрузка шифруется AES-256-GCM; заголовок (привязка/таймер) защищён от подмены привязкой аутентификационных данных (AAD).
  • Привязка:
    • Без привязки — работает на любом устройстве;
    • 1-е устройство — закрепляется за первым активировавшим устройством;
    • По HWID — ключ раздачи обёрнут ключом, выведенным из HWID получателя функцией растяжения: на чужом устройстве раздача не расшифровывается вовсе. HWID получатель копирует кнопкой в боковом меню приложения.
  • PIN активации — при включении генерируется случайный PIN (можно перегенерировать кнопкой-спиннером; поле открыто — цифры нужно сообщить получателю). Ключ payload дополнительно оборачивается ключом, выведенным из PIN (PBKDF2 с растяжением — офлайн-перебор по ссылке вычислительно дорог). Работает только в зашифрованном режиме.

Срок действия

  • С активации — 1 / 3 / 7 / 30 дней с момента, когда получатель активировал раздачу (ссылка не «сгорает» до активации);
  • Дедлайн — абсолютная дата («до 31.12»).

Если заданы оба — действует то, что наступит раньше.

Ограничения получателя

ПараметрЭффект у получателя
Запрет на рутАктивация отклоняется на рутованных/jailbreak устройствах (эвристическая проверка)
Блок настроекНастройки подписки только для чтения; сетевой фильтр и блокировка не переключаются; авторская блокировка не снимается
Скрыть конфигиСкрываются кнопки QR и просмотра конфигурации на карточках серверов (остаётся только пинг), URL панели маскируется
Запрет re-shareВключён всегда: получатель не может передать подписку дальше (кнопка «Поделиться» неактивна)

Результат

После нажатия «Создать раздачу»:

  • QR-код — для раздач до ~2,5 КБ;
  • Ссылка — текст с копированием в буфер (для больших раздач показывается начало — копирование и файл используют полную ссылку);
  • В файл — сохранение через системный диалог проводника в файл .imsel; можно задать пароль файла.

Файл раздачи .imsel

Бинарный контейнер с бинарной магией-подписью формата и флагами. Внутри — ссылка раздачи:

  • Без пароля — контейнер без шифрования;
  • С паролем — содержимое шифруется AES-256-GCM, ключ выводится из пароля функцией растяжения (PBKDF2-HMAC-SHA256) со случайной солью. Подмена заголовка или содержимого ломает тег аутентификации — файл нельзя «пересобрать» незаметно.

Открытие файла

  • Android — тап по файлу в проводнике → «Открыть в IMSEL» (зарегистрированы intent-фильтры для расширения .imsel: content/file URI, октет-стрим);
  • iOS — тап в «Файлах» → открытие в IMSEL (зарегистрирован тип документа com.imsel.vpn.share);
  • Внутри приложения — меню «+» → «Импорт из файла».

Если файл защищён паролем — откроется диалог ввода пароля.


Активация у получателя

Входы: открытие ссылки imsel://sub/... (мессенджер/браузер), сканирование QR, вставка из буфера обмена, файл (см. выше).

Порядок:

  1. Диалог подтверждения «Активировать»;
  2. Если задан PIN — диалог ввода PIN (без верного PIN расшифровка невозможна);
  3. Проверки: срок, привязка (HWID/первое устройство), запрет рута;
  4. Создаётся локальная подписка (снапшот — с серверами внутри; ссылка — с последующим обновлением с панели) с ограничениями автора.

Результаты, которые может увидеть получатель: активирована / обновлена / срок истёк / закреплена за другим устройством / неверный HWID / неверный PIN / активация на руте запрещена / данные повреждены.

Ограничители после активации

  • Подключение к серверам истёкшей раздачи блокируется (включая «Переподключиться»);
  • Истёкшие раздачи пропускаются автообновлением;
  • Карточка подписки показывает бейдж: запас срока («7 дн.», «5 ч.») или красная «истекла».

Идемпотентность

Повторная активация той же ссылки на том же устройстве обновляет серверы, не создавая дубль и не продлевая срок. На другом устройстве ссылка с привязкой отклоняется.


Технические детали

Ссылки

ФорматНазначение
imsel://sub/e1/<base64url(envelope)>Зашифрованная раздача (AES-256-GCM)
imsel://sub/p1/<base64url(payload)>Открытая раздача (без шифрования)

Криптография (общее описание)

  • Полезная нагрузка шифруется AES-256-GCM со случайным 256-битным ключом; метаданные ограничений защищены от подмены привязкой аутентификационных данных (AAD).
  • Обёртки ключа (по HWID и по PIN) выводятся функциями растяжения ключа на основе PBKDF2-HMAC-SHA256 с рандомизированной солью; текущая версия формата (KDF v2) использует усиленные параметры, старые раздачи (KDF v1) остаются совместимыми.
  • PIN-обёртка делает офлайн-перебор PIN по ссылке вычислительно дорогим; тем не менее рекомендуется использовать длинные PIN и не передавать ссылку по открытым каналам.
  • Файл .imsel с паролем шифруется тем же стеком (AES-256-GCM + PBKDF2); подмена заголовка или содержимого ломает тег аутентификации.

Защита на устройстве получателя

  • Реестр активаций хранится в зашифрованном виде и подписывается ключом, привязанным к установке приложения, — подмена записей детектируется;
  • Предусмотрена защита от отката системных часов назад (перевод времени не продлевает срок раздачи).

ℹ️ Примечание Точные параметры ключевых функций, структура контейнеров и внутренние механизмы проверок в публичной документации не раскрываются (принцип Керкгоффса: стойкость не зависит от секретности формата, но и лишних подсказок публика не получает).

Честные ограничения offline-модели

  • Привязка по HWID и PIN криптостойки к передаче ссылки/файла другим лицам; однако владелец рутованного устройства-получателя может снять расшифрованные конфиги из памяти (без сервера это неотразимо);
  • Открытый формат p1 и режим «первое устройство» защищены только клиентскими проверками — патчированный клиент их обходит;
  • Ссылка в режимах без привязки — bearer-секрет: кто первым активировал, тот и владеет;
  • Отозвать offline-раздачу после отправки нельзя — только выпустить новую;
  • Clear Data у получателя неотличим от первого запуска.

Terms of Service

Last updated: August 28, 2026

These Terms of Service ("Terms") govern your access to and use of the IMSEL VPN mobile application ("App", "Service") provided by the IMSEL VPN developer ("We", "Us", "Developer"). By downloading, installing, or using the App, you agree to be bound by these Terms. If you do not agree, do not use the App.

1. Description of the Service

IMSEL VPN is a client application for connecting to servers that use V2Ray/Xray-compatible network protocols. The App allows you to:

  • add and manage your own VPN server configurations and subscription links;
  • connect to servers of your choice and route device traffic through them;
  • configure routing rules, split tunneling and related connection options.

Important: We do not provide, operate, or control VPN servers. All servers and subscriptions used through the App are supplied by you or by third parties. We are not responsible for the availability, performance, security, or legality of any third-party server or subscription service.

The App does not require an account or registration. There are no paid features or in-app purchases; the Service is provided free of charge and supported by advertising (see Section 5).

2. Eligibility

You must be at least 13 years old (or the higher minimum age required by the law of your jurisdiction) to use the App. By using the App, you represent that you meet this requirement.

3. Acceptable Use

You agree to use the App only for lawful purposes and in accordance with these Terms. You must not:

  • use the App in any way that violates applicable local, national, or international law or regulation;
  • use the App to infringe the rights of any third party, to distribute malware, or to engage in fraudulent, abusive, or harmful activity;
  • attempt to interfere with, reverse engineer for malicious purposes, or disrupt the operation of the App or its telemetry and advertising components;
  • resell, sublicense, or commercially exploit the App without our prior written consent.

You are solely responsible for your use of the App and for compliance with the laws of your jurisdiction, including any restrictions on the use of VPN services.

4. Third-Party Servers, Subscriptions and Content

Server configurations, subscription links, and routing profiles may be provided by you or by third parties. We do not screen, control, or endorse such third-party resources. Your use of any third-party server or subscription is at your own risk and may also be subject to separate terms and policies of the provider. We are not liable for any loss or damage arising from your use of third-party services.

5. Advertisements

The App displays advertisements delivered by Yandex Mobile Ads (interstitial ads shown upon VPN disconnection and rewarded ads in the "Support the developer" section). By using the App you acknowledge that advertising identifiers may be processed to deliver ads, as described in our Privacy Policy.

The App is provided free of charge. There are no premium tiers and no in-app purchases.

6. Intellectual Property

The App, including its code, design, and assets (excluding third-party open-source components licensed under their own terms), is the property of the Developer and is protected by applicable intellectual property laws. These Terms do not grant you any rights to the App other than a limited, revocable, non-exclusive, non-transferable license to install and use it on your devices.

7. Disclaimer of Warranties

The Service is provided on an "AS IS" and "AS AVAILABLE" basis, without warranties of any kind, whether express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, uninterrupted operation, or that the Service will be error-free or secure. We do not warrant that VPN connections will remain undetectable, unblocked, or effective in any particular network environment.

8. Limitation of Liability

To the maximum extent permitted by law, the Developer shall not be liable for any indirect, incidental, special, consequential, or punitive damages, or for any loss of data, profits, or connectivity arising out of or in connection with your use of the App. Under no circumstances shall the Developer's total liability exceed zero (0), as the App is provided free of charge.

9. Termination

We may, at our sole discretion and without notice, modify, suspend, or discontinue the App at any time. You may stop using the App at any time by uninstalling it. Sections 7, 8, and 10 survive termination.

10. Changes to These Terms

We may update these Terms from time to time. The current version is always available within the App ("About" dialog) and in the App's documentation. Continued use of the App after changes take effect constitutes acceptance of the updated Terms.

11. Governing Law

These Terms shall be governed by and construed in accordance with the laws of the Developer's place of residence, without regard to conflict-of-law rules, unless mandatory consumer protection law of your country of residence provides otherwise.

12. Contact

Questions about these Terms: imsel.vpn@gmail.com

See also: Privacy Policy

Privacy Policy

Last updated: August 28, 2026

This Privacy Policy describes how the IMSEL VPN mobile application ("App") handles information when you use it. The App is provided free of charge by the IMSEL VPN developer ("We", "Us", "Developer"). Contact: imsel.vpn@gmail.com.

1. Summary

  • The App has no accounts or registration and does not require your name, email, or phone number.
  • Your VPN traffic is not logged and cannot be read by the App: it is encrypted end-to-end between your device and your VPN server.
  • We collect a limited set of technical data: a device identifier sent with subscription update requests, crash reports and anonymized usage events (AppMetrica), and advertising identifiers (Yandex Mobile Ads).
  • You can disable analytics at any time with the "Send analytics" switch in the App's side menu.

2. Data We Collect

2.1 Device identifier (HWID)

  • What: a device identifier — the Android ID (or a random UUID generated on the device when Android ID is unavailable; on iOS, the vendor identifier). Along with the identifier, subscription update requests include technical device headers: app version and User-Agent, device language, platform and OS version, and device model (Happ-compatible headers x-device-locale, x-device-os, x-ver-os, x-device-model).
  • Why: the App sends this identifier in the X-HWID header with every subscription update request to the subscription server you configured. It is used to bind your device to your subscription service and to keep the advertising frequency counter fair (so that ad capping works per device). Device headers allow the provider to serve compatible subscription formats.
  • Where it goes: to your subscription server over an encrypted (HTTPS) connection. It is not linked to your name or other personal identity.
  • On device: the identifier is stored locally to keep it stable between app restarts.

2.2 Crash reports and usage statistics (Yandex AppMetrica)

  • What: crash reports and non-fatal error reports (error type and stack trace), anonymized product events (e.g., VPN connect/disconnect result, subscription update success/failure — without server addresses, subscription names, or your HWID), and standard technical metadata (device model, OS version, app version, language, timezone).
  • Why: to detect and fix failures and to understand which features are used.
  • Where it goes: processed by Yandex AppMetrica according to the AppMetrica terms and privacy documents.
  • Your control: the "Send analytics" switch in the App's side menu disables sending crash reports and events. It is enabled by default and can be turned off at any time.

2.3 Advertising data (Yandex Mobile Ads)

  • What: advertising identifiers and technical device data required to deliver ads.
  • Why: the App shows interstitial ads (after VPN disconnection) and rewarded ads ("Support the developer"). This keeps the App free.
  • Where it goes: processed by Yandex advertising services according to the Yandex privacy policy.

2.4 Local data

Settings, server configurations, subscription links, VPN credentials (usernames/passwords/keys of your servers), routing profiles, and log files are stored only on your device. They are never sent to the Developer. VPN credentials are passed only to the local V2Ray/Xray core to establish your connection.

3. What We Do NOT Collect

  • The content of your VPN traffic, browsing history, or DNS queries made through the tunnel. The App functions as a client: traffic is encrypted end-to-end and is not readable by the App.
  • Your name, email address, phone number, or contacts.
  • Precise location.

4. Permissions

  • Camera — used only for scanning QR codes when you add a server or subscription. The camera is never used in the background.
  • Notifications — used to inform you about background subscription update results.
  • Storage access — used to import/export configuration files and geo database files used by the V2Ray/Xray core.

5. Data Sharing

We do not sell your data. Data is shared only with the processors described above:

ProcessorPurposeData
Your subscription server (chosen by you)Subscription updatesHWID (X-HWID header)
Yandex AppMetricaCrash reports, anonymized analyticsDevice/app metadata, events, crash data
Yandex Mobile AdsAd deliveryAdvertising identifiers, device data

All network communication uses encrypted (TLS) connections.

6. Data Retention and Deletion

  • Local data: deleted when you uninstall the App.
  • Analytics: retained according to AppMetrica's standard retention terms; you can stop collection at any time via the "Send analytics" switch.
  • HWID on your subscription server: managed by the operator of that server. To request deletion, contact your subscription provider; for subscriptions operated by the Developer, email imsel.vpn@gmail.com.

7. Children

The App is not directed at children under 13, and we do not knowingly collect data from children under 13.

8. International Transfers

Your data may be processed in countries where the processors described above operate (including Russia). Applicable safeguards are described in the processors' privacy documents.

9. Changes to This Policy

We may update this Privacy Policy. The current version is always available within the App ("About" dialog) and in the App's documentation. Continued use of the App after changes take effect constitutes acceptance of the updated policy.

10. Contact

Questions or data-related requests: imsel.vpn@gmail.com

See also: Terms of Service