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
| iOS | Android | Desktop |
|---|---|---|
| [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-Agent | IMSEL/<версия>/<ОС>/<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, 1 — url: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/token | N = количество зеркал → добавить в конец |
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 подключаются со своими (локальными или серверными) значениями.
Цепочка эффективных настроек (ЭКО)
При генерации конфига значения выбираются по убыванию специфичности:
- JSON-конфиг подписки (не share-ссылки) — настройки карточки не применяются вовсе (JSON не модифицируется; кнопка «Ещё» заблокирована).
- Сервер без карточки подписки (группы «ручные серверы»/«импорт из буфера» без записи) — берутся глобальные настройки приложения, а не чужой подписки.
- Share-ссылка + подписка — настройки карточки этой подписки (именно их перезаписывают серверные команды) с учётом:
overrideLinkFragment(«перекрывать параметры из ссылки») — форсировать fragment-параметры подписки поверх per-link значений;allowInsecure— объединение флага подписки и флага самого сервера.
- 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-обновление и фоновый воркер одинаковы):
- Разбор метаданных (
SubscriptionMeta) и команд (SubscriptionCommands) — заголовки поверх#param. applyMeta— данные (трафик/срок/ссылки/объявление/интервал).applyCommands— порядок для URL: вынос встроенногоfallback-url=→new-url→ точечные замены/удаления → патчиresolve-address/host→new-domain(глобальный) →new-domain-N.- Глобальные команды (ping-type, check-url-via-proxy) — в настройках приложения. Sniffing и автообновление применяются per-subscription вместе с остальными полями подписки.
- Планирование уведомлений об истечении.
- Сохранение; пересинхронизация фоновой задачи при смене URL/интервала.
Защита от регресса: подписка без новых заголовков ведёт себя идентично — все команды тринарны, отсутствующий параметр ничего не меняет.
Сводная таблица параметров
| Параметр | Тип | Валидация/лимит |
|---|---|---|
profile-title | текст / base64: | ≤ 25 симв. (обрезается) |
profile-description | текст / base64: | — |
profile-web-page-url, support-url, premium-url | URL | http/https |
subscription-userinfo | k=v;… | байты; expire сек (или мс > 32e9) |
profile-update-interval | int | часы; clamped 1–168; 0 = выкл |
announce | текст / base64: | ≤ 200 симв. |
announce-url | URL | тело ответа ≤ 200 симв. |
subscriptions-sort-type | enum | without / ping / alphabet |
new-url | URL / список / структура | http/https; метки url:0–99 |
new-url-N | URL / 0 / патч | N = 0–99; патч: resolve-address=<домен|IP>, host=<домен> |
new-domain, new-domain-N | домен | N = 0–99 |
fallback-url | URL / список | http/https |
change-user-agent | текст | — |
hide-settings | tri-bool | true/1, 0/false |
sub-info-color | enum | red / blue / green |
sub-info-text | текст | ≤ 200 симв.; 0 = отключить |
sub-info-button-text | текст | ≤ 25 симв. |
sub-info-button-link, sub-expire-button-link | URL | http/https |
sub-expire | tri-bool | — |
notification-subs-expire | tri-bool | — |
subscription-always-hwid-enable | tri-bool | — |
no-limit-enabled | tri-bool | сохраняется, не применяется |
fragmentation-enable | tri-bool | — |
fragmentation-packets | enum/диапазон | tlshello / 1 / min-max / all |
fragmentation-length, fragmentation-interval | диапазон | min-max, min ≥ 1 |
noises-enable | tri-bool | — |
noises-type / noises-packet-type | enum | rand / str / hex / base64 (array→rand) |
noises-packet | текст/диапазон | — |
noises-delay | диапазон | min-max |
server-address-resolve-enable | tri-bool | — |
server-address-resolve-dns-domain | URL | http/https |
server-address-resolve-dns-ip | IPv4 | 4 октета 0–255 |
subscription-autoconnect | tri-bool | — |
subscription-autoconnect-type | enum | lastused / lowestdelay / random |
subscription-ping-onopen-enabled | tri-bool | — |
ping-type | enum | proxy / proxy-head / tcp / icmp (→tcp) |
check-url-via-proxy | URL | http/https |
sniffing-enable | tri-bool | per-sub; null = наследовать профиль |
subscription-auto-update-enable, subscription-auto-update-open-enable | tri-bool | per-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.com → www.google.com → fcm.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, вставка из буфера обмена, файл (см. выше).
Порядок:
- Диалог подтверждения «Активировать»;
- Если задан PIN — диалог ввода PIN (без верного PIN расшифровка невозможна);
- Проверки: срок, привязка (HWID/первое устройство), запрет рута;
- Создаётся локальная подписка (снапшот — с серверами внутри; ссылка — с последующим обновлением с панели) с ограничениями автора.
Результаты, которые может увидеть получатель: активирована / обновлена / срок истёк / закреплена за другим устройством / неверный 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-HWIDheader 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:
| Processor | Purpose | Data |
|---|---|---|
| Your subscription server (chosen by you) | Subscription updates | HWID (X-HWID header) |
| Yandex AppMetrica | Crash reports, anonymized analytics | Device/app metadata, events, crash data |
| Yandex Mobile Ads | Ad delivery | Advertising 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