@enfinitos/sdk-wearables
EnfinitOS reference SDK for the WEARABLES substrate. Four sibling implementations target the 2026 wrist-worn surface landscape: watchOS 11 (Apple Watch), Wear OS 5 (Pixel Watch 3, Galaxy Watch 7, Fossil — and the Fitbit successor line), Fitbit OS 5 (legacy / end-of-life), and Garmin Connect IQ 7.
Architecture
┌─────────────────────────────────────────┐
│ @enfinitos/sdk-renderer-core (TS) │
│ resolve / event-ingest / health │
└─────────────────────────────────────────┘
▲
│
┌──────────────────┴──────────────────┐
│ wearables ts-core (shared notif │
│ + content model + delivery rules) │
└──────────────────┬──────────────────┘
│
┌─────────────────┬──────┴──────┬────────────────┐
│ │ │ │
┌─────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│watchOS │ │Wear OS │ │ Fitbit │ │ Garmin │
│ 11+ │ │ 5 │ │ OS 5 │ │ CIQ7 │
│SwiftCon │ │Compose │ │ legacy │ │MonkeyC │
│WidgetKit│ │Tiles2.0│ │ EOL │ │ CIQ │
└─────────┘ └────────┘ └────────┘ └────────┘
Getting started
TypeScript core (shared model)
import { WearablesClient } from "@enfinitos/sdk-wearables";
const client = new WearablesClient({
apiBaseUrl: "https://api.enfinitos.com",
authToken: jwt,
deviceId: pairedWatchId,
watchKind: "apple-watch",
});
await client.start();
const tile = await client.fetchTile({ tileSlot: "main-tile" });
if (tile) {
myTileSurface.render(tile);
await client.reportTileImpression(tile);
}
watchOS 11+
import EnfinitOSWatchOS
let client = EnfinitOSWatchOSClient(
apiBaseUrl: URL(string: "https://api.enfinitos.com")!,
authToken: jwt,
pairedDeviceId: pairedWatchId,
)
try await client.start()
// Drive a WidgetKit complication directly from a resolved tile.
let snapshot = await client.fetchComplicationSnapshot(family: .modularSmall)
Wear OS 5
val client = EnfinitOSWearOSClient(
context = applicationContext,
apiBaseUrl = "https://api.enfinitos.com",
authToken = jwt,
pairedDeviceId = pairedWatchId,
)
client.start()
val tile = client.fetchTile(WearOSTileSlot.MAIN)
Garmin Connect IQ
```monkey-c using EnfinitOS;
class AcmeView extends WatchUi.View { function onUpdate(dc) { var directive = EnfinitOS.getCurrentDirective(); if (directive != null) { dc.drawText(0, 0, Graphics.FONT_SMALL, directive.headline, ...); } } }
## 2026 platform notes
### watchOS 11
- **Minimum target: watchOS 11** (Sept 2024). Buys us:
- Swift Concurrency 5.10 strict-Sendable diagnostics.
- **WidgetKit complications** as the **only** supported
complication surface; `ClockKit` is **deprecated** for new
development since watchOS 10. We do not implement against
`ClockKit`.
- Live Activities on watchOS 11 (background-running tiles).
- **Pair model:** the watchOS app pairs with the iPhone-side
EnfinitOS Mobile SDK via `WCSession`. The phone owns the auth
flow; the watch consumes resolved tiles via cached deliveries.
- **No video** on the watch surface — watchOS rejects long-form
media in glanceable surfaces.
### Wear OS 5
- **Wear OS 5** (Aug 2024) targets Pixel Watch 3, Galaxy Watch 7,
Fossil's new lineup, and the **Fitbit-line Wear OS devices** that
replaced Fitbit OS.
- **Jetpack Compose for Wear OS** is the UI framework. No
fragments, no XML.
- **Tiles 2.0** (released with Wear OS 5) — uses `TileService` +
`Layout Elements`. Replaces the old `TileBuilders` API.
- **Watch Face Format** (XML, replaces Watch Face Studio's binary
format since Wear OS 4) — the SDK exposes a watch-face module
helper that emits the XML.
- **Companion communication:** `MessageClient`/`DataClient` from
Google Play Services Wearable; mirrors the watchOS `WCSession`
pattern.
### Fitbit OS 5 (legacy)
- **Google fully absorbed Fitbit's developer platform in 2024.**
Fitbit OS development is now Wear OS development for new devices
(Sense 3, Versa 5, etc.).
- **Fitbit OS 5 still receives security patches** but **does not
accept new app submissions to the Fitbit Gallery as of Jan 2026**.
- The SDK under `fitbit/` is **legacy support only** — it documents
the migration path to Wear OS and ships a minimal companion+app
pair for households with existing Fitbit OS 5 devices that need
to be sunset.
### Garmin Connect IQ 7
- **Connect IQ 7** (Q3 2024) is the current major version. SDK 7.1+.
- **Monkey C 7+** is the language. Strict typing rolled out in
Monkey C 6; the SDK targets that level.
- **Surfaces:** watch faces, widgets, data fields, full-screen
apps, audio-content providers. The SDK's primary surface is
the **widget** (glanceable) — full-screen apps are out of scope
for the v0.0.x line.
- Still active and growing — the platform has its own developer
ecosystem distinct from Wear OS / watchOS.
## Endpoint surface
| SDK call | Platform endpoint | Status |
|---|---|---|
| `fetchTile` | `POST /runtime/resolve` | existing |
| `reportTileImpression` | `POST /runtime/event-ingest` | existing |
| `reportNotificationOpened` | `POST /runtime/event-ingest` | existing |
| Complication snapshot (watchOS) | OS-mediated; rendered locally | existing |
| Tile push (Wear OS) | OS-mediated; SDK supplies content | existing |
| Garmin widget refresh | OS-mediated (Connect IQ runtime) | existing |
| **Fitbit OS 5 new submissions** | **EOL — Fitbit Gallery rejects** | n/a |
## Test plan
- TS core: Vitest under `ts-core/src/__tests__/`.
- watchOS: XCTest under `watchos/Tests/EnfinitOSWatchOSTests/`.
- Wear OS: JUnit 4 under `wearos/src/test/`.
- Garmin: Manual + Connect IQ simulator (Garmin doesn't ship a
Monkey C unit-test framework that runs out-of-emulator).