MotiVane
2026
Идея без срока. Вместо срока у неё условия, и приложение следит за миром, пока они не сойдутся.
- Формат
- Приложение на React Native: браузер, iOS и андроид
- Моя роль
- Всё: замысел, движок, интерфейс, код
- Инструменты
- TypeScript · React Native · Expo · Reanimated · Open-Meteo · Vitest
Заметка здесь несёт не срок, а условия: дождь, светло на улице, выходной, я в трёх километрах от дома. Записал идею, отметил, что ей нужно, и забыл. Приложение смотрит на часы и на погоду и зажигает заметку, когда всё, чего она ждала, сошлось.
Движок отвечает на каждое условие одним из трёх значений: да, нет и спросить не у кого. На третьем всё и держится. Откажи приложению в геопозиции — двузначный движок обязан либо счесть условие выполненным, и заметка объявит, что пора, когда не пора, либо счесть невыполненным, и заметка замолчит навсегда, не объяснив почему. Заметка созрела, когда все условия ответили «да», ждёт, когда хоть одно ответило «нет», и не уверена, когда «нет» не сказал никто, но что-то проверить нечем.
Открой заметку — и увидишь каждое условие со своим вердиктом: приложение показывает рассуждение, а не объявляет итог. Ядро не трогает ни сеть, ни хранилище, ни React: разрешения, геопозиция и запросы собраны в одном хуке, который отдаёт движку готовый снимок мира, где неизвестное — просто отсутствующее поле. Поэтому весь движок покрыт тестами, идущими меньше секунды и без устройства.
Два решения изменились против первого плана. Погода берётся у Open-Meteo, а не у OpenWeatherMap: любой ключ в этом приложении уезжает в браузерный бандл, откуда его видно всем, а Open-Meteo ключа не требует. Заметки живут в AsyncStorage, а не в SQLite: заметок у человека десятки, весь список всё равно читается на каждый пересчёт, и один вызов покрывает и телефон, и браузер.
На телефоне приложение должно будить уведомлением в ту минуту, когда заметка созрела. Вкладка браузера так не умеет, поэтому веб-версия отвечает на вопрос в момент, когда её открыли. Уведомление — дело нативной сборки, и тот же код доходит до неё без переписывания.