Показать другу
Пять чужих жизней, которые можно дать поклацать кому угодно. Ваши приоритеты при этом не видит никто.

Зачем этот экран
Приложение показывают. «Смотри, что я нашёл» — и дальше выбор: либо открыть человеку список того, на что вы тратите жизнь, либо не показывать вовсе.
Список приоритетов — это довольно личное. «Терапия» на четвёртой строке или «Семья» с двумя блоками за месяц говорят о вас больше, чем хочется говорить случайному собеседнику. Поэтому у приложения есть чужие данные, заполненные так, чтобы на них было видно всё, что оно умеет.
Экран открывается из настроек.
Кто внутри
| Профиль | Что на нём видно |
|---|---|
| Артём | Обычная жизнь под наблюдением: перекос в работу, серия, три навыка на разных ступенях лестницы |
| Марина | Ровный баланс без перекоса, восемь месяцев истории, пять навыков |
| Максимум | Тринадцать месяцев, десять приоритетов, двенадцать навыков и весь реестр достижений |
| Выгорание | Заряд внизу, и «Что сажает батарею» во весь экран |
| Первая неделя | Как приложение выглядит в начале: пустые графики и первые достижения |

«Максимум» — тестовый аккаунт. На нём заполнено всё, до чего можно дотянуться: десять приоритетов при пределе в десять, непустой архив, навыки от «обучение не начато» до пятнадцати тысяч часов и открытые достижения всех девяти групп. Смотреть на него приятно, но он не про жизнь — он про полноту.
На нём же снят кадр набранного реестра достижений: на обычном профиле большая часть карточек заперта, и по ним не понять, что там вообще бывает.
Как этим пользоваться
Войти
Нажмите на карточку. Приложение перезагрузится с чужими данными.
Перезагрузка здесь не техническая деталь, а обещание: своих данных на экране не мелькнёт даже кадром. То, что вы отметили за секунду до входа, дописывается до перезагрузки и не теряется.
Показать

Сверху висит плашка с именем профиля. Внутри демо работает всё: клики, заряд, навыки, достижения — они даже выдаются по-настоящему, на чужой истории.
Из настроек при этом убрано всё, что трогает ваш аккаунт: вход и выход, копия данных, импорт и сброс.

Вернуться
Кнопка «Выйти» на плашке, с подтверждением. Подтверждение здесь не формальность: без него друг, промахнувшись мимо вкладки, открыл бы ровно то, что вы прятали.
Что происходит с накликанным
Ничего не сохраняется. Демо-данные живут в памяти и исчезают при выходе или перезагрузке. Ваша история при этом не меняется вообще: в демо приложение не пишет ни в облако Telegram, ни на устройство, ни на сервер.
Это не проверка флага в паре мест, а подменённое хранилище: писать физически некуда. Подробности — в «Демо-режиме» для разработчика.
Отправить ссылкой
Демо открывается и по ссылке — другу можно вообще ничего не показывать со своего телефона:
t.me/<ваш бот>/app?startapp=demo_fХвост после demo_ — идентификатор профиля: m, f, max, burnout, start.
Пределы и предупреждения
- Демо не переживает закрытие приложения: следующий запуск открывает ваши данные.
- Достижения, открытые внутри демо, ваших не касаются — это чужая карта выдач.
- В демо не показывается строка «Аккаунт»: в нём нет ни входа, ни сессии.
- Строка «Где лежит» честно отвечает «нигде: это демо».
Чего здесь нельзя
- Сохранить то, что накликано в демо. Это не аккаунт, а картинка; переносить из неё нечего.
- Отредактировать профиль. Списки и цвета внутри демо правятся, но до первой перезагрузки.
- Показать другу свои данные, но «только часть». Выборочного показа нет и не планируется: половинчатая приватность хуже честного «вот чужое».
Рядом
Настройки · Данные и синхронизация · Демо-режим для разработчика
Как это работает внутри
- Экран —
src/screens/DemoScreen.tsx, профили —src/demo/profiles.ts, генератор историй —src/demo/generate.ts, плашка —src/components/DemoBar.tsx. - Признак живёт в адресе (
src/demo/mode.ts), а не в хранилище: отметку негде было бы записать в приватном режиме, а адрес работает везде и отправляется другу как есть. - Различаются два состояния:
DEMO_MODE— загружена синтетика,GUEST_MODE— интерфейс подстрижен.?mock=включает первое без второго, потому что кадры настроек надо снимать полными. - Запись гасится на границе хранилища, а не в сторе:
resolveBackend()вsrc/store/local/db.tsотдаёт память,storeвtelegram/cloudStorage.tsне подмешивает облако, аsync/transport.tsобъявляет себя ненастроенным. Сессия и идентификатор устройства попадают под тот же предохранитель — они ходят черезmetaтого же хранилища. - Профили детерминированы: сид фиксирован, идентификаторы литеральные. Тест
src/demo/profiles.test.tsсверяет два прогона между собой и проверяет пределы, привязки навыков и полноту реестра достижений у «Максимума».