v2 companion

Wear OS, on the wrist

Hearth's hero is a timer that must not die. The watch is a remote and a glance, never a second clock. This preview is wired to the same cook session the phone already runs.

Hearth

No cook yet

Start a recipe on the phone. The wrist follows.

Next, pause, and the current step on a 45 mm face.

Drive it

Start a cook, then use the watch. Next and pause land on the phone the same way a MessageClient RPC would.

Open cook mode
Path
/hearth/cook
Urgent
setUrgent()
Version
0
Capability
hearth_cook_wear

The contract

Phone owns the clock

A 10-minute simmer is one deadline on the phone. The watch renders remaining locally. If the wrist goes out of range, the foreground service and alarm still fire.

Snapshots, not ticks

DataClient writes /hearth/cook only when the FSM changes — start, next, pause, resume, done. A 1 Hz remaining update would drain the watch and is forbidden by I1/R2.

Commands are RPCs

Next, back, pause, resume, and done travel on MessageClient. There is no retry, so the next snapshot is the ack. Pause is rejected if nothing is running.

Four surfaces, one session

App for control, tile for a swipe-away glance, complication for the watch face, ongoing activity so the system itself counts down with TimerPart.

Native build (when Hearth ships on Play)

  1. 1. Wear module — a companion APK, same signing cert, capability hearth_cook_wear. Horologist DataLayer helpers for install and tile prompts.
  2. 2. Bridge on the phone — from CookSessionController, putDataItem(/hearth/cook) with setUrgent(), carrying title, step, deadlineElapsedRealtime, duration.
  3. 3. Watch listener — WearableListenerService caches the snapshot. Compose app, TileService timeline, ComplicationDataSource SHORT_TEXT + RANGED_VALUE.
  4. 4. Ongoing activity — Status.TimerPart using the same elapsedRealtime deadline. A few updates per minute is the cap; the system draws the digits.
  5. 5. Commands /hearth/cmd/next, /hearth/cmd/pause and siblings. Phone applies the existing FSM. Watch never starts its own timer.

Limits that stay honest

  • Data Layer does not work on a Wear watch paired to iPhone. v1 is Android-phone only.
  • Tiles must not refresh every second. The deadline goes in the timeline; the system advances the layout.
  • Wear OS 5 ambient is a dim screenshot. Wear OS 6 keeps the app visible and may paint as little as once a minute — another reason the countdown belongs in TimerPart, not in app code.
  • This preview is the protocol and the wrist UX. It is not a Wear APK. Greasy-hand targets on a 45 mm face are 44–48 dp circles, not the 72 dp phone buttons.