Component Showcase

Tabby Watch Sideload beta ยท v0.1.2

The most glanceable surface in the Tabatha family: your current focus and its countdown on the wrist, with the few actions you would otherwise pull your phone out for. A Wear OS 4 companion built for the Samsung Galaxy Watch 6, it reads and writes the same account data as the extension and Tabby Sidecar through Cloud Sync - a checkpoint quick-added on the watch shows up everywhere within a second. It runs today, but it is not a store release: there is no Play Store listing, and getting it onto a wrist means building the APK and sideloading it over Wi-Fi ADB.

๐Ÿ”ฌ This is a lab build, not a public release. Every card below is real, running Kotlin/Compose code in the tabatha-watch repo (currently v0.1.2) - not a mockup - but there is no Play Store listing and no signed APK to hand you. Getting it onto a Galaxy Watch 6 today means cloning the repo, building the debug APK with the bundled Gradle wrapper, and sideloading it over Wi-Fi ADB, as documented in the repo's README. Treat it as "in the lab": stable enough to wear, not yet packaged for anyone else.

Component library

8 surfaces & services ยท Wear OS 4 ยท Jetpack Compose

The watch adds almost no new data of its own - it is a window, not a fourth tracker: no shift, no window monitor, nothing it originates. Its whole job is showing the one thing you are doing right now and taking the four or five actions worth a tap on a screen this small, fast enough that pulling out the phone stops being worth it. A pure, unit-tested TimerEngine mirrors the Sidecar's own focus.ts math (freeze-on-pause, rebase-on-resume) so the countdown never disagrees with the phone it is reading from.

active
Q1 Report
18:42 left
paused
Q1 Report
18:42 left
overtime
Q1 Report
4:10 over
๐ŸŽฏ
Focus ring Sideload beta
The home screen: a progress ring around the focus label and remaining time, colour as state rather than a separate badge - green active, amber paused, red overtime, exactly the extension and Sidecar's own semantics. A realm line underneath when the focus carries one. Bezel-scroll below the ring reaches the action list.
tabatha-watch ยท ui/FocusScreen.kt ยท ui/components/RingIndicator.kt
โ–ถ Resume
๏ผ‹5 min
๏ผ‹ Checkpoint
๐Ÿ• Shift
โœ“ Done
โŒš
Action chips Sideload beta
Five one-tap actions, in a deliberate order: Pause/Resume and Extend +5 first because they are the common case, Done placed last precisely so a stray tap cannot end a focus by accident. Extending never restarts the timer - it rebases the same running countdown, matching the fix that shipped on the extension and Sidecar first.
tabatha-watch ยท ui/FocusScreen.kt ยท ActionChip()
๐Ÿ˜ None
๐Ÿ“ˆ Little
๐Ÿš€ A lot
๐Ÿ Almost
๐Ÿšง Stuck
โœ…
Checkpoint quick-add Sideload beta
The same five canned progress levels as Sidecar's checkpoints, one full-width chip per row for a clean bezel-scroll and a fat tap target. Tap a level and it writes a level-only checkpoint immediately - text is optional and reachable only through the watch's voice keyboard, because typing on a 1.5-inch screen is not the point.
tabatha-watch ยท ui/CheckpointScreen.kt ยท data/model/Models.kt (PROGRESS_LEVELS)
๐Ÿ• Your shift
Synced from Cloud Sync
Clock in/out lands in v0.2.0
๐Ÿ•
Shift glance Sideload beta ยท read-only
v0.1.x shows the shift you are already on - synced from Cloud Sync, or "preview" if the watch has not been paired yet - but does not let you clock in or out from the wrist. That write path is deliberately deferred: clocking in has extension-side orchestration (auto clock-in) that the watch would need to account for first.
tabatha-watch ยท ui/ClockScreen.kt
๐ŸŽฏ Q1 Report
18:42
swipe-left card ยท refreshes every 5 min
๐Ÿงฉ
Tile Sideload beta
A Wear OS Tile - the swipe-left card next to the watch face - showing the current focus label and remaining time straight from the on-device snapshot cache, no network round-trip on open. Falls back to "Open Tabby" when nothing is running. Refreshes on the system's five-minute cadence plus whenever the app itself updates the cache.
tabatha-watch ยท tile/FocusTileService.kt
12m
๐Ÿ”˜
Complication Sideload beta
Drop "focus remaining" onto any compatible watch face: SHORT_TEXT renders as e.g. "12m", RANGED_VALUE drives a face's own arc from the elapsed-versus-target fraction. Same cached-snapshot, no-network read as the Tile - a complication that phones home is a complication that lags.
tabatha-watch ยท complication/FocusComplicationService.kt
419 206
enter the code from Sidecar โ†’ Settings
๐Ÿ”—
Password-free pairing Sideload beta
The watch never asks for or stores your password. On the phone, Sidecar Settings โ†’ "Pair a watch" mints a 6-digit, single-use code, valid five minutes; entering it once on the watch exchanges it for its own session token, stored encrypted in the Android Keystore. From then on it refreshes silently.
tabatha-watch ยท data/auth/GoTrueClient.kt ยท data/auth/SessionStore.kt
๐ŸŽฏTimerEngine, CurrentFocus - pure Kotlin, mirrors Sidecar's focus.tsdomain/
โ†“
๐Ÿ’พFocusRepository (Fake + Supabase impl), SnapshotCachedata/
โ†“
๐Ÿ”ŒPostgrestClient - hand-rolled REST, no heavyweight SDKdata/net/
โ†“
๐Ÿ”SessionStore (Keystore-backed), GoTrueClientdata/auth/
โ†“
๐Ÿง FocusViewModel - StateFlow, 1 Hz tick, lifecycle-scopedvm/
๐Ÿ—
Architecture & fixture mode Sideload beta
Kotlin + Jetpack Compose for Wear OS, one :app module, manual DI rather than Hilt to stay small. Debug builds run in fixture mode until a real user pairs on-device, so a freshly sideloaded APK renders and is safe to inspect without touching anyone's real account. No Play Store, no signed release channel - this is the whole shape of what ships when it eventually does.
tabatha-watch ยท README.md ยท domain/TimerEngine.kt