Flame Tree Pick started from a small annoyance: every dinner-time we’d ask each other what to eat, and every night we’d land on the same three places. We wanted a tool that could break the deadlock — light and tactile, not algorithmic pressure in disguise.
The pebble metaphor
We didn’t want to design a “random picker” app. The category is full of slot-machine UIs and aggressive onboarding. Instead we asked: what does a warm version of randomness look like? The answer was a pebble — something you hold, weigh, give a little shake, and watch settle.
Give fate a shake. The decision wasn’t yours; you just helped it land.
Why local-first
Pick has no account, no analytics, no cloud sync. Your option lists live in a local SQLite file. We chose this because the product makes a promise — “this is your tool, not ours” — and that promise breaks the moment you have to log in to choose between ramen and pizza.
- Zero network calls in the core loop — the app works on a plane, in a basement, forever.
- SQLite means your decisions outlive the app: you can crack open the file in any tool.
- If we shut the studio down tomorrow, your data stays where it’s always been — on your device.
Building the physics
The shake interaction uses the device accelerometer, but the feel came from a lot of small tuning. We landed on a softened spring with a tiny over-shoot — the pebble nudges past its target by ~6% then settles, which reads as “weight” to the body even though the eye barely registers it.
final spring = SpringDescription(
mass: 1.2,
stiffness: 180,
damping: 14, // just under critical → 6% overshoot
);
What we learned
Most decision tools optimize for correctness — giving you the “right” answer based on history, weights, ML. We optimized for closure: the small relief of having decided. Turns out the warmest tool is the one that gets out of the way.