Серия «Садик Добрых Дел: добрые дела и эмоции ребёнка»

7

Сделал общие сады без аккаунтов: сервер не знает ни кто с кем связан, ни что в конверте⁠⁠

Серия Садик Добрых Дел: добрые дела и эмоции ребёнка

Привет!

Я тут уже дважды был с «Садиком Добрых Дел» — это приложение, где ребёнок вечером записывает, что хорошего сегодня сделал, и от этого растёт цветок. Первый раз пришёл за критикой и получил её, второй — отчитался, что починил.

Сейчас третий заход. Я сделал самую большую фичу за всё время — общие сады — и переделал обмен целиком уже после того, как он «работал». Аккаунтов в приложении так и не появилось: сервер не знает ни кто с кем связан, ни что лежит в конверте.

Что за фича. Раньше сад был один и жил на телефоне: ни аккаунтов, ни регистрации, ни сервера вообще. Теперь сады можно связать. Папа видит сад ребёнка, ребёнок — сад папы. И главное: в чужом саду можно записать то, что ты за этим человеком заметил. Родитель пишет «сам заметил, что бабушке тяжело» — и у ребёнка растёт цветок. Прямо при нём, пока они сидят рядом. Ребёнок ничего не нажимал.

Ссылка, чтобы не искать: RuStore.

Сервер, который про людей ничего не знает

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

Получилось так. Ключ связи рождается на телефоне того, кто зовёт, и уходит в приглашении — во фрагменте ссылки, после решётки. Фрагмент по устройству сети на сервер не уходит вообще: даже если ссылку открыть в браузере, ключ никуда не отправится.

Из ключа обе стороны считают две разные производные:

идентификатор ящика = sha256(ключ + "sadik-box-id")
токен доступа = sha256(ключ + "sadik-box-token")

Сервер хранит идентификатор открыто, а от токена — только его хеш. То есть он может проверить право на ящик, не зная ни ключа, ни токена, и не может ни притвориться участником, ни прочитать содержимое: внутри лежит шифротекст AES-GCM, ключ от которого есть только у двоих.

Весь сервер — это PUT и GET в почтовый ящик. Он не знает, кто с кем связан, сколько у человека связей и что в конверте. Из этого потом вылезет неожиданное следствие, но об этом ниже.

Что передаётся между телефонами

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

Разрешать конфликты я не стал. Сначала пересчитал, сколько в системе мест, куда пишут двое, и оказалось, что такое место ровно одно: запись, сделанная про другого человека. Цветок, настроение, пересадки пишет только хозяин сада, и спорить там не с кем.

Поэтому передаются теперь не счётчики, а сами записи, и сливаются объединением: порядок доставки не важен, повтор безвреден, «оба написали одновременно» перестаёт быть особым случаем. Счётчики и стадия цветка пересчитываются из записей на месте — они не данные, а следствие.

Свои слова при этом наружу не передаются вовсе. Другой видит, что момент был, и цветок от него вырос, но текста не читает: в списке стоит строка «Момент, о котором можно спросить». Об этом и разговор — приложение задаёт вопрос и не отвечает на него.

Почему не пуши

Хотелось, чтобы сад обновлялся быстро: вся сцена ради того, чтобы цветок вырос при вас. Первая мысль — пуши. Посчитал и передумал.

Чтобы отправить пуш, сервер обязан знать: «в ящик X положили → разбудить устройство D». Это таблица «кто с кем связан» плюс пуш-токен — устойчивый идентификатор телефона. Прямо сейчас сервер не знает ничего подобного и не может сопоставить двух людей. Пуши это ломают, и шифрование содержимого тут не помогает: утечёт граф.

Сделал проще: пока приложение на экране, оно ходит за почтой раз в десять секунд, после минуты тишины — раз в тридцать. Арифметика: три связи, опрос раз в десять секунд — 18 запросов в минуту на человека; сто человек одновременно — 30 запросов в секунду. Для Postgres на маленькой машине это ничто.

Вопрос к вам

Как бы вы доставляли обновление на второй телефон, не заводя аккаунтов и не отдавая серверу граф связей?

Есть ли третий путь, который я не вижу?

Сделал общие сады без аккаунтов: сервер не знает ни кто с кем связан, ни что в конверте
Показать полностью 1
4

Неделю назад вы разнесли моё приложение. Вот что я починил⁠⁠

Серия Садик Добрых Дел: добрые дела и эмоции ребёнка

Привет!

Неделю назад я приносил сюда «Садик Добрых Дел» — приложение, где ребёнок вечером записывает,
что хорошего сегодня сделал, и от этого растёт цветок. Просил критику и получил её.

Пришёл отчитаться: несколько замечаний были по делу, и я их починил.

@OneClickStudio, про клавиатуру

Вы написали, что при вводе доброго дела клавиатура закрывает кнопку «Сохранить», и посоветовали добавить в манифест `android:windowSoftInputMode="adjustResize"`. Я ответил, что контент поднимается через `imePadding`, и «видимо, у вас не сработало».

Я был не прав дважды.

Во-первых, никакого `imePadding` в этой шторке не было вообще. Проверять надо было в коде, а не по памяти.

Во-вторых, совет с манифестом тоже не сработал бы. При `targetSdk 35+` приложение в режиме
edge-to-edge, и потому система не ресайзит окно под клавиатуру. Надо учитывать именно ime padding. То есть баг был настоящий, а чинить его надо было не там, где мы оба думала.

Как починил: шторке заданы инсеты `BottomSheetDefaults.windowInsets.union(WindowInsets.ime)`
— беру максимум, а не сумму, иначе над клавиатурой повисает пустая полоса
в высоту панели навигации. И содержимому добавлен скролл: одного отступа мало. Посчитал на
экране `360×640` — заголовок, готовые фразы, поле и ряд кнопок вместе просят около `416 dp`
при доступных `340`.

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

@TldM7 и @AnsyAgeeva, про графику

«Идея хорошая, графика — говно» и «но графику бы посимпатичнее». Пожалуй, про графику мне напихали больше всего.

Не стал менять подход к рисованию цветка т.к. мне крайне важно возможность взаимодействовать с садом. Для этого 3д хочу все таки оставить. Но попытался исправить мертвое окружение - добавить деталей, движения камеры.

Завёл зелень в дальний план — поле было песочным, а «садик» без зелени читается
пустырём. Архивным цветам дал нормальные контактные тени, а горшки у них убрал — типа в горшке вырастили и потом в землю посадили. У главного цветка стало шесть и пять
лепестков с округлым кончиком вместо восьми узких клиньев. И камера теперь тихо дышит и идёт за пальцем.

Что поменялось кроме этого

Главное: у взрослого теперь может быть свой сад.

При первом запуске приложение спрашивает, для кого этот сад. Если для взрослого — он получает точно такие же возможности как ребёнок. Доступа к саду своего ребёнка у него нет и не появится, бэкенда по-прежнему нет вообще. Предполагаю, что поводом для общения может быть желание показать сегодняшний цветок как ребёнком так и родителем.

Цифра, которой у меня в прошлый раз не было

За неделю карточку в RuStore открыли около 450 раз. Установок с них — 2. Это 0,44% при
магазинной норме 20-30%.

Причём по своим запросам приложение стоит первым: «дневник добрых дел», «добрые дела для
детей», «добрые поступки», «доброта для детей», «настроение ребёнка» — везде первое место. То
есть находят. Открывают. И уходят.

Моя рабочая версия — пустой рейтинг: 0,0 и «Нет оценок» на детском приложении выглядит как
приговор. Но я не уверен, что дело только в нём.

Ссылка: https://www.rustore.ru/catalog/app/com.sadikdobrihdel — в прошлый раз мне справедливо
написали, что зря её не дал.

Одна просьба

Откройте карточку и скажите, на чём вы бы ушли. Не «что улучшить вообще», а
буквально: что первое не понравилось и в какой момент вы решили уйти с карточки приложения в сторе, не устанавливая его.

Показать полностью 7
5

Приложение, где ребёнок растит цветок за добрые дела. Пришёл за критикой⁠⁠

Серия Садик Добрых Дел: добрые дела и эмоции ребёнка

Приветы!

Я андроидщик, давно пишу мобильные приложение и тут решил сделать прилу для общения с моими детьми, но с надеждой на что-то большее.

В конце июня сел делать маленькую штуку на вечер и не смог остановиться: 46 коммитов, 13 700 строк, два с половиной месяца вечеров.

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

Что внутри: Compose Multiplatform, всё хранится локально, без аккаунтов, без интернета, без рекламы и без единой кнопки «купить». Данные ребёнка никуда не утекают, потому что утекать им некуда — бэкенда нет вообще. Только крашлитику подключил, чтобы сбои ловить.

Теперь неприятная часть.

В магазине приложение с конца лета. Установок — кот наплакал (меньше сотни). Отзывов — ноль. Ни одного, даже злого.

Платная реклама дала ориентир около 1000 руб за одну установку. 10 тыс потратил для пробы и увидел как я просто потратил эти деньги без пользы. Значит, пора нести моё приложение на публичный суд.

Заработало приложение ровно 0 ₽: монетизации в нём нет никакой.

На выходных я сел и посчитал, что будет, если монетизацию всё-таки прикрутить — родительский донат, никаких покупок и цен в детском экране. При честных допущениях (1,5% платящих, 400 ₽ в год с платящего) одна установка приносит около 6 ₽. Против 1000 ₽ за платную установку это окупаемость в полпроцента. То есть реклама тут не «дороговата», она невозможна в принципе: чтобы сходилось, установка должна стоить дешевле пятёрки.

Раз рекламу закупать бессмысленно, остаётся идти к живым людям и получать по шапке. Вот, пришёл.

За чем конкретно — можно сразу по всем трём:

1. Не выращиваю ли я лицемерие. Самый честный аргумент против моего приложения: ребёнок начнёт делать добро ради цветка, а не потому что так надо. Я специально не даю ни баллов, ни рейтингов, ни соревнования с другими, и цветок растёт от любой мелочи - но осадок остается. Особенно интересно мнение тех, кто реально работает с детьми.

2. Кому это на самом деле нужно — ребёнку или родителю. Есть подозрение, что настоящий пользователь тут взрослый. Это ему нужен повод вечером поговорить о чём-то кроме «как дела в школе — нормально».

3. Идея, в которую я сейчас тыкаюсь: класс растит общий сад. Учитель, внеклассная работа, тридцать детей и один сад на всех. По деньгам это единственная схема, где хоть что-то сходится. Но я в школе не работал и не понимаю, живая это идея или кабинетная фантазия человека, который школу помнит по своему детству.

Ссылку не даю, чтобы пост не выглядел рекламой: приложение бесплатное, без рекламы и без покупок, называется «Садик Добрых Дел», лежит в RuStore. Скажете, что ссылка уместна — положу в комментарии.

Напихайте в панамку, за этим и пришёл. Два месяца я разговаривал в основном с компилятором, а он на любой вопрос отвечает «BUILD SUCCESSFUL».

Показать полностью 4
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества