# Где открывается приложение

Одно и то же приложение может работать в трёх местах. Данные у каждого свои; узнать, где оно открыто, можно вызовом `context.get`:

```js
const { kind } = await pairx.call("context.get");   // "chat" | "personal" | "preview"
```

## В чате

Приложение, отправленное в чат, — это **экземпляр**: сообщение-карточка, которую открывают все участники. У экземпляра общие [хранилища](https://dev.pairx.org/guides/storage): очередь одна на всех, голоса видны всем.

- Писать могут участники чата — с учётом прав хранилища (`writers`) и прав в самом чате: где писать нельзя, запись отклоняется с `forbidden`.
- Автор экземпляра — тот, кто отправил приложение в этот чат. Для хранилищ с `writers: "admins"` к нему добавляются администраторы чата.
- Каждая отправка — новый экземпляр с чистыми данными. Одно приложение в двух чатах или дважды в одном чате — разные экземпляры.
- Подходит для личного диалога, группы и «Избранного».

## Лично

Ссылка `https://pairx.org/app/<id>` открывает приложение для одного человека — у него свой **личный контекст**. По той же ссылке человек возвращается к своим данным. Так открываются и приложения из «Профиль → Приложения».

- Хранилища работают так же, но пишет в них только сам человек; другие их не видят.
- Подходит для тренажёров, заметок, калькуляторов — всего, чем не нужно делиться.

Приложение из одного файла открывается и в чате, и лично. Пакет из нескольких файлов может ограничить это полем `contexts` в `pairx.app.json` — например, очередь имеет смысл только в чате:

```json
{"contexts": ["chat"]}
```

В странице этого поля нет: если приложению нужен чат, проверьте `context.get` и объясните человеку, что его стоит отправить в чат.

## Предпросмотр

Автор открывает приложение перед отправкой. Данные предпросмотра отдельные и не сохраняются: следующий предпросмотр начинается с чистого листа. `context.get` отдаёт `kind: "preview"` и `preview: true` — например, чтобы показать подсказку «Это предпросмотр, участники пока ничего не видят».

## Одно приложение для всех мест

```js
const { kind } = await pairx.call("context.get");
if (kind === "personal") {
  document.body.classList.add("solo");        // без списка участников
}
```

Ни в каком месте приложение не узнаёт, в каком именно чате оно открыто и кто в нём состоит: только вид контекста и ID человека внутри приложения.
