Rustem Tukhbetov

MotiVane

2026

An idea with no deadline. It carries conditions instead, and the app watches the world until they are met.

Format
React Native app: runs in a browser, on iOS and on Android
My part
Everything: idea, engine, interface, code
Tools
TypeScript · React Native · Expo · Reanimated · Open-Meteo · Vitest

A note here carries conditions instead of a date: rain, daylight, a weekend, being within three kilometres of home. You write the idea down, tap what it needs, and stop thinking about it. The app reads the clock and the weather and lights the note up when everything it was waiting for has happened.

The engine answers each condition with one of three values: yes, no, and nothing to ask. The third is what the rest of the design rests on. Refuse the app your location and a two-valued engine has to either treat the condition as met, so the note claims to be ready when it is not, or treat it as unmet, so the note goes silent for good and never says why. A note is ripe when everything answers yes, waiting when anything answers no, and unsure when nothing says no but something cannot be checked.

Open a note and it lists every condition with its own verdict, so the app shows its reasoning instead of announcing a result. Nothing in the core touches the network, storage or React: permissions, geolocation and fetch all live in one hook that hands the engine a finished snapshot of the world, where an unknown fact is simply an absent field. That is why the engine is covered by tests that run in under a second with no device attached.

Two things changed from the first plan. Weather comes from Open-Meteo rather than OpenWeatherMap, because any API key in this app ends up inside the browser bundle where anyone can read it, and Open-Meteo needs none. Notes live in AsyncStorage rather than SQLite: a person keeps tens of notes, the whole list is read on every recalculation anyway, and one call covers both the phone and the browser.

On a phone the app should push a notification the moment a note ripens. A browser tab cannot do that reliably, so the web build answers the question when you open it instead. The notification belongs in the native build, and the same code reaches it without a rewrite.

← All work