# Инструменты

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

## Установка

Нужен Node.js 20 или новее.

```sh
npm install -g https://dev.pairx.org/download/pairx-apps-cli.tgz
pairx help
```

Пакет без зависимостей; его код открыт и лежит в том же архиве.

## pairx create — начать {#pairx-create}

```sh
pairx create my-app
```

Создаёт `my-app/index.html` — рабочее голосование из одного файла: хранилище `slot`, нативная кнопка Pairx, светлая и тёмная тема. Быстрый режим Pairx принимает его как есть.

## pairx dev — эмулятор {#pairx-dev}

```sh
pairx dev my-app            # или pairx dev app.html
```

Откройте `http://127.0.0.1:5174/` в браузере. Эмулятор показывает приложение так, как его увидят участники чата:

- **Та же защита.** Страница получает ту же политику безопасности (CSP) и заголовки, что в Pairx, а мост — тот же скрипт, что на iPhone и Android. Что работает здесь, работает и там.
- **Ограничения iPhone включены.** Нет `WebAssembly`, `indexedDB`, WebAudio и WebGL — как на iPhone в защищённом режиме. Флаг `--no-iphone-limits` их снимает, но в Pairx на iPhone они всё равно не заработают.
- **Несколько участников.** От одного до четырёх участников одного чата рядом (`--participants 3`), общее хранилище с правилами сервиса: порядок `seq`, форма изменений, пределы, права `writers`. Участник 1 — автор приложения.
- **Интерфейс Pairx.** Шапка с пометкой «Код пользователя», нативная кнопка, «Назад», окна и подсказки.
- **Перезапуск при сохранении.** Данные остаются; новые хранилища начинаются пустыми. «Сбросить данные» начинает с чистого листа, «Удалить мои данные» в меню участника присылает остальным `storage.reset`.
- **Личный режим.** `--personal` — у каждого участника свой контекст, как при открытии по ссылке.
- **Тема.** `ui.theme` и `theme.changed` следуют переключателю эмулятора, а CSS `prefers-color-scheme` в рамке — теме браузера.

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

## pairx check — проверка до отправки {#pairx-check}

```sh
pairx check my-app
```

Те же проверки, что сервис делает при отправке:

- `✗` — сервис не примет приложение: ошибка в манифесте или превышен предел. Код выхода 1.
- `!` — примет, но версия уйдёт на ручную проверку: WebRTC, адреса STUN/TURN, обращение к окнам фреймов, нажатие ссылок из кода, обфускация, майнеры.
- `·` — в песочнице не заработает, только предупреждение: сеть, внешние адреса, WebGL, WebAudio, IndexedDB, WebAssembly.

Полный список проверок — в справочнике [манифеста](https://dev.pairx.org/reference/manifest#checks).

## SDK

`@pairx/apps-sdk` — типизированная обёртка моста для проектов со сборкой (Vite, esbuild): хранилище само применяет изменения по порядку и перечитывает снимок при `storage.reset`, документ сам повторяет запись при `conflict`, нативные кнопки и тема — в одну строку. Подробнее — в [справочнике SDK](https://dev.pairx.org/reference/sdk).

```sh
npm install https://dev.pairx.org/download/pairx-apps-sdk-0.1.0.tgz
```

Приложение со сборкой отправляется в Pairx так же — одним HTML-файлом: соберите проект в один файл (например, `vite-plugin-singlefile`), и быстрый режим примет его как есть.

## Скоро

- Вход разработчика и отправка версий из командной строки, без телефона.
- Пакеты в npm.

Что меняется в платформе — в разделе [Изменения](https://dev.pairx.org/changelog).
