> For the complete documentation index, see [llms.txt](https://docs.imsel.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.imsel.dev/tekhnicheskaya-dokumentaciya/app-management.md).

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

Управляйте настройками приложения IMSEL VPN через подписку. Функционал включает стандартные параметры (работают для большинства панелей) и расширенные параметры (схема Incy/Happ) — все они применяются без дополнительной регистрации провайдера.

## Способы передачи

Все параметры передаются двумя способами:

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

```http
HTTP/2 200
profile-title: Мой VPN
support-url: https://t.me/support
profile-update-interval: 6
```

**2. Строка в теле подписки (комментарий с `#`, fallback):**

```
#profile-title: Мой VPN
#support-url: https://t.me/support
#profile-update-interval: 6
vless://...
```

> **Приоритет:** HTTP-заголовки имеют приоритет. Строки в теле используются, когда соответствующий заголовок отсутствует. Это полезно при раздаче подписок статическими файлами (nginx), где нельзя задать кастомные заголовки.

**Семантика boolean-параметров:**

* значение `true` или `1` — включить;
* любое другое непустое значение (`0`, `false`, …) — выключить;
* **отсутствие параметра** — приложение не меняет текущее состояние (сервер не управляет параметром).

**Кодирование:** значения текстовых параметров (`profile-title`, `profile-description`, `announce`, `sub-info-text`) поддерживают префикс `base64:` для передачи UTF-8.

***

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

### Имя подписки

`profile-title: [string | base64:...]`

Максимум 25 символов. В base64-варианте первая строка — имя, остальные строки — описание. Альтернативные заголовки: `subscription-name`, `content-disposition`.

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

`profile-description: [string | base64:...]`

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

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

`profile-update-interval: [int]`

Интервал в часах (кратен одному часу). `0` — выключить автообновление.

### Статус подписки

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

Трафик в байтах; `expire` — unix-время (секунды; значения больше 32 000 000 000 трактуются как миллисекунды).

### Ссылки

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

`premium-url` — кнопка «Премиум» в карточке подписки (страница покупки/личный кабинет). Если не задан — кнопка скрыта.

### Объявление

```http
announce: [string | base64:...]
announce-url: https://example.com/news.txt
```

Текст объявления (до 200 символов) в рамке в карточке. `announce` (текст) имеет приоритет над `announce-url` (клиент скачивает текст по ссылке; тело может быть plain text или `base64:...`; ошибки скачивания игнорируются молча).

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

`subscriptions-sort-type: [without | ping | alphabet]` (собственное расширение IMSEL).

***

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

### Зеркала подписки (помеченный формат)

Первый URL идёт без метки, каждый следующий — с меткой `url:N=`, в конце может идти `fallback-url=`. Метки делают список самодокументированным: видно, какую позицию занимает каждый 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`. Каждый URL может быть обычным или [фронтинг-URL](/tekhnicheskaya-dokumentaciya/domain-fronting.md). Немаркированный список через `|`/`\n` (без меток) тоже принимается — это просто зеркала по порядку.

### Смена первого URL (new-url)

```http
new-url: https://new-first-domain.com/token
```

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

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

Или помеченной структурой — точечно по позициям, включая fallback (позиции, не упомянутые в структуре, не меняются):

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

### Точечная замена зеркал (new-url-N)

Заголовок `new-url-N` (N — позиция: 0 — первый URL, 1 — `url:1` и т. д.) или строка тела `#new-url:N=…`:

| Команда                                                                                                  | Действие                                                   |
| -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| `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`                                                                                           | удалить зеркало `url:1`                                    |
| `new-url-1: resolve-address=142.251.41.165`                                                              | заменить только `resolve-address` (домен **или IP-адрес**) |
| `new-url-0: host=storage.googleapis.com`                                                                 | заменить только `host` (Host-заголовок фронтинга)          |

Правила: патч `resolve-address`/`host` меняет одно значение в зеркале (существующее — заменяется, отсутствующее — дописывается); N > количества зеркал («дыра») игнорируется; операция, опустошающая весь список, отклоняется. Несколько индексных команд в одном ответе допустимы (для тела подписки используйте форму с дефисом `#new-url-1: …` — одноимённые `#new-url:` строки перекрывают друг друга).

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

```http
new-domain: new-domain.com
new-domain-1: drive.google.com
```

`new-domain` заменяет домен (host) во **всех** зеркалах, `new-domain-N` — только у зеркала на позиции N (в теле: `#new-domain:1=drive.google.com`). Путь, query и фрагмент сохраняются.

**Фронтинг-зеркала:** если у зеркала параметр `resolve-address` совпадает со старым доменом, он заменяется вместе с host — фронт и резолв остаются согласованы. Параметр `host=` (настоящий Host-заголовок) не трогается; если `resolve-address` не совпадает со старым доменом (например, IP-адрес) — тоже не трогается. Для точечной замены только `resolve-address` используйте патч `new-url-N: resolve-address=…`.

### Fallback URL

```http
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
```

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

### Кастомный User-Agent

`change-user-agent: Mozilla/5.0 ...`

Подменяет User-Agent при запросах этой подписки (полезно, если провайдер режет нестандартные UA).

### Блокировка настроек

`hide-settings: [true/1 | 0/false]`

Блокирует изменение настроек подписки (аналог локальной блокировки): до отправки `0` настройки карточки доступны только для чтения.

### Уведомления об истечении

`notification-subs-expire: [true/1 | 0/false]`

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

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

`subscription-always-hwid-enable: [true/1 | 0/false]`

IMSEL всегда отправляет заголовок `X-HWID` при запросах подписки — параметр принят и сохраняется.

***

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

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

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

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

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

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

Системный баннер об истечении (приоритет над sub-info-блоком): за ≤ 3 дней — «Ваша подписка заканчивается через N д.», после истечения — «Подписка закончилась!». Кнопка «Продлить» открывает `sub-expire-button-link`.

***

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

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

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

Перезаписывает настройки фрагментации карточки подписки. Значения: `packets` — `tlshello` / `1` / `1-3` / `all`; `length`/`interval` — диапазон `min-max`. Некорректные значения игнорируются.

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

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

Тип шума: `rand` / `str` / `hex` / `base64` (принимается также Happ-написание `noises-packet-type`; значение `array` трактуется как `rand`).

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

```http
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 до установки туннеля: домен в адресе outbound заменяется на IP (при нескольких A-записях выбирается IP с минимальным временем подключения), оригинальный домен сохраняется в SNI. Работает для share-ссылок (включая vmess-base64); готовые JSON-конфиги не переписываются. Ошибка резолва не блокирует подключение — используется исходный домен. Результат кэшируется на 5 минут.

### Описание сервера (per-link)

Добавляется в фрагмент ссылки после имени через `?`:

```
vless://uuid@server:443#Сервер1?serverDescription=base64-text
```

Подпись (до 30 символов, base64) отображается под именем сервера вместо технического тега. Поддерживается во всех форматах ссылок (vless/vmess/trojan/ss/socks/wireguard) и в JSON-подписках через `meta.serverDescription`.

***

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

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

```http
subscription-autoconnect: 1
subscription-autoconnect-type: lastused
```

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

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

`subscription-ping-onopen-enabled: [true/1 | 0/false]`

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

### Способ пинга

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

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

### Sniffing

`sniffing-enable: [true/1 | 0/false]`

Включение/выключение анализа пакетов (sniffing) ядра.

### Глобальное автообновление

```http
subscription-auto-update-enable: [true/1 | 0/false]
subscription-auto-update-open-enable: [true/1 | 0/false]
```

`...-enable: 0` — полное выключение автообновления всех подписок (включая фоновые задачи). `...-open-enable: 1` — обновление всех подписок при каждом открытии приложения.

***

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

Следующие параметры схемы Incy/Happ в IMSEL VPN **не поддерживаются**:

* `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` — требует нативной поддержки memory-limit ядра;
* Provider ID / Premium API (Lite Mode, кастомные темы, баннеры, push) — не реализовано.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.imsel.dev/tekhnicheskaya-dokumentaciya/app-management.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
