wear os watchface codex
Scope
This skill is wff-first. Use it to build or debug watch faces, not generic wear os apps.
When the user says "widget" on a watch face, assume complication unless tiles are explicitly requested.
Load the relevant references before acting:
- use references/version-matrix.md when the target device or os floor is unclear or mixed
- use references/gw7-diagnosis.md when a face installs but does not show in the face list, picker, or customize flow
- use references/provider-menu-checklist.md when a custom provider does not appear in the complication chooser
- use references/svg-pipeline.md when converting one svg into a real face or complication layout
- use references/source-map.md when exact docs, official samples, or community repos are needed
Non-negotiable rules
- Treat gw7, gw ultra, and other watches launched with wear os 5+ as wff-only for fresh watch-face installs. Do not generate a jetpack
WatchFaceService or wearable support library face for those requests.
- Do not default to wff v4. Pick the lowest wff version that supports the requested features and the real minimum target os.
- Keep the watch-face bundle resource-only. Put provider logic and general app logic in a separate module or app.
- Do not try to solve "face not visible on gw7" by toggling random metadata first. Diagnose artifact type and wff/minSdk floor before touching
Editable, Category, or slot settings.
- Never invent wff xml. If tag or attribute syntax is uncertain, copy exact syntax from the official docs or the official sample.
- Never claim that svg typography becomes live complication typography. Live complication text uses the system font.
- Keep watch face, provider, and watch face push responsibilities separate. Watch Face Push is optional and is not the fix for ordinary picker visibility.
Workflow decision tree
- Classify the request:
- build or port a face -> follow build or port a face below
- debug gw or pw visibility -> follow diagnose invisible face below
- fix complication slot menu -> follow fix slots in editor below
- fix provider menu -> follow fix provider chooser below
- convert one svg -> follow svg pipeline below
- Choose the compatibility floor using references/version-matrix.md.
- Ship the smallest correct deliverable: face module only, or face plus separate provider app.
- Validate on the named device class before adding polish.
Build or port a face
- Start from the official wff project shape:
AndroidManifest.xml
res/raw/watchface.xml
res/xml/watch_face_info.xml
- preview asset
- For simple projects, keep the face definition in
res/raw/watchface.xml. Do not rename the default file unless you also manage shapes and file mapping intentionally.
- In
AndroidManifest.xml:
- include
uses-feature android.hardware.type.watch
- set
android:hasCode="false"
- set
android:label
- add
com.google.wear.watchface.format.version
- In
watch_face_info.xml:
- always set
Preview
- set
Editable=true only when the face actually has settings or non-fixed complications
- do not expect
Editable to make an invisible face appear
- Put all app logic outside the face bundle. If the request needs custom data, create a separate provider app.
- Add ambient and aod early. Remove the second hand and simplify lit pixels.
- Add complications only where geometry is real and readable.
Diagnose invisible face
Read references/gw7-diagnosis.md and follow this order exactly:
- Is this actually a wff bundle?
- Is the chosen wff version or minSdk too new for the minimum target device?
- Is the face packaged as a separate resource-only bundle?
- Are the core files present and named correctly?
- Only after 1 to 4 pass, inspect watch-face metadata and picker behavior.
Use this symptom map:
- installs as an app, never becomes a selectable face -> wrong artifact type or wrong compatibility floor
- selectable face exists but no Edit button ->
Editable problem, or no real settings or slots
- decorative slot frame exists but is not selectable -> not a real
ComplicationSlot, or missing bounds or types
- provider app is installed but absent in chooser -> provider manifest or service problem, not face metadata
Fix slots in editor
A slot must be a real ComplicationSlot, not painted art.
Minimum conditions:
Editable=true in watch_face_info.xml when slots are meant to be user-editable
- slot has
slotId
- slot has
supportedTypes
- slot has a bounding area
- slot has
displayName
- slot renders at least one
Complication per supported type
- total slots is at most 8
If the user used wfs, remember that complications are independent and cannot be grouped with other components.
Fix provider chooser
Use references/provider-menu-checklist.md.
Hard requirements:
- separate watch app or module
SuspendingComplicationDataSourceService
BIND_COMPLICATION_PROVIDER
- update-request intent filter
SUPPORTED_TYPES
UPDATE_PERIOD_SECONDS or explicit push strategy
- monochrome service icon
- useful
getPreviewData()
Match provider types to slot types. Do not blame the face first when the provider is missing.
Svg pipeline
Use one svg as source of truth only if you convert semantics, not just pixels.
- Preserve the original svg.
- Extract or infer:
- background art
- hour, minute, second layers if analog
- complication frames
- slot geometry
- ambient simplification
- If the svg is flat and unlabeled, infer at most 1, 2, or 4 slots unless the geometry is unmistakable.
- Prefer vector output for simple paths. Rasterize complex filters, masks, or blend-heavy art.
- Build live complications with real
ComplicationSlots. Do not bake fake live text into static svg art.
- If custom data is requested in the picker, build a separate provider app.
For the exact layer-id contract and fallback extraction rules, load references/svg-pipeline.md.
Animation and ambient
Animation is optional. Ambient is not.
Rules:
- make time and complications readable before adding motion
- prefer transform-driven motion over frame-heavy loops
- stop or simplify animation in ambient
- never keep the second hand in ambient
- keep lit pixels low and assets small
- if using wfs, do not use lottie in current workflows
Wfs guardrails
Use wfs only when the user wants a visual-first workflow or .wfs deliverables.
Keep these constraints in mind:
- wfs faces still need the correct wff floor for the target device
- keep fewer than 8 visible complications in both normal and ambient modes
- no second hand in ambient
- no lottie in current wfs workflow
- avoid edge-hugging art because burn-in shifting can move it
- complications cannot be grouped with other components
Watch Face Push
Only use Watch Face Push when the user explicitly needs app-driven or marketplace-style installation.
Do not use it as a workaround for a normal face not showing up in the picker.
When used, keep it behind a wear os 6 capability check and keep the pushed face itself in wff.
Output contract
When building:
- return a buildable wff face module
- return a separate provider app only if custom data is required
- state the chosen compatibility floor explicitly: target os, wff version, and minSdk
- keep notes short and actionable
When auditing:
- patch the minimum files required
- explain whether the root cause is artifact type, compatibility floor, metadata, slots, or provider
- do not rewrite a correct wff face into a code-based face
Resource map
- compatibility and versioning: references/version-matrix.md
- gw7 invisibility diagnosis: references/gw7-diagnosis.md
- provider chooser checklist: references/provider-menu-checklist.md
- svg conversion contract: references/svg-pipeline.md
- docs and repo references: references/source-map.md
Default stance
Prefer the officially documented wff path, the lowest compatible wff version, a separate provider app when needed, and conservative slot geometry. On gw7-class devices, "face never appears in downloaded faces" is usually not a cosmetic metadata bug; treat it as a format, version, or package-structure problem first.
1---2name: wearos-watchface-codex3description: create, port, audit, and debug wear os watch faces and complication providers for galaxy watch and pixel watch using watch face format, watch face studio, and complication data sources. use when coding agent must turn svg or design assets into a buildable watch face, make complication slots or providers appear in menus, add ambient or animation safely, or diagnose why a face installs but does not appear on gw7, galaxy watch, or pixel watch. especially use for wear os 5, 5.1, and 6 compatibility decisions, wff version selection, and resource-only packaging.4---56# wear os watchface codex78## Scope9This skill is wff-first. Use it to build or debug watch faces, not generic wear os apps.1011When the user says "widget" on a watch face, assume **complication** unless tiles are explicitly requested.1213Load the relevant references before acting:1415- use [references/version-matrix.md](references/version-matrix.md) when the target device or os floor is unclear or mixed16- use [references/gw7-diagnosis.md](references/gw7-diagnosis.md) when a face installs but does not show in the face list, picker, or customize flow17- use [references/provider-menu-checklist.md](references/provider-menu-checklist.md) when a custom provider does not appear in the complication chooser18- use [references/svg-pipeline.md](references/svg-pipeline.md) when converting one svg into a real face or complication layout19- use [references/source-map.md](references/source-map.md) when exact docs, official samples, or community repos are needed2021## Non-negotiable rules221. Treat gw7, gw ultra, and other watches launched with wear os 5+ as **wff-only for fresh watch-face installs**. Do not generate a jetpack `WatchFaceService` or wearable support library face for those requests.232. Do not default to wff v4. Pick the **lowest** wff version that supports the requested features and the real minimum target os.243. Keep the watch-face bundle **resource-only**. Put provider logic and general app logic in a **separate** module or app.254. Do not try to solve "face not visible on gw7" by toggling random metadata first. Diagnose **artifact type** and **wff/minSdk floor** before touching `Editable`, `Category`, or slot settings.265. Never invent wff xml. If tag or attribute syntax is uncertain, copy exact syntax from the official docs or the official sample.276. Never claim that svg typography becomes live complication typography. Live complication text uses the system font.287. Keep watch face, provider, and watch face push responsibilities separate. Watch Face Push is optional and is not the fix for ordinary picker visibility.2930## Workflow decision tree311. Classify the request:32 - **build or port a face** -> follow **build or port a face** below33 - **debug gw or pw visibility** -> follow **diagnose invisible face** below34 - **fix complication slot menu** -> follow **fix slots in editor** below35 - **fix provider menu** -> follow **fix provider chooser** below36 - **convert one svg** -> follow **svg pipeline** below372. Choose the compatibility floor using [references/version-matrix.md](references/version-matrix.md).383. Ship the smallest correct deliverable: face module only, or face plus separate provider app.394. Validate on the named device class before adding polish.4041## Build or port a face421. Start from the official wff project shape:43 - `AndroidManifest.xml`44 - `res/raw/watchface.xml`45 - `res/xml/watch_face_info.xml`46 - preview asset472. For simple projects, keep the face definition in `res/raw/watchface.xml`. Do not rename the default file unless you also manage shapes and file mapping intentionally.483. In `AndroidManifest.xml`:49 - include `uses-feature android.hardware.type.watch`50 - set `android:hasCode="false"`51 - set `android:label`52 - add `com.google.wear.watchface.format.version`534. In `watch_face_info.xml`:54 - always set `Preview`55 - set `Editable=true` only when the face actually has settings or non-fixed complications56 - do not expect `Editable` to make an invisible face appear575. Put all app logic outside the face bundle. If the request needs custom data, create a separate provider app.586. Add ambient and aod early. Remove the second hand and simplify lit pixels.597. Add complications only where geometry is real and readable.6061## Diagnose invisible face62Read [references/gw7-diagnosis.md](references/gw7-diagnosis.md) and follow this order exactly:63641. Is this actually a **wff bundle**?652. Is the chosen **wff version or minSdk too new** for the minimum target device?663. Is the face packaged as a **separate resource-only bundle**?674. Are the **core files present and named correctly**?685. Only after 1 to 4 pass, inspect watch-face metadata and picker behavior.6970Use this symptom map:7172- **installs as an app, never becomes a selectable face** -> wrong artifact type or wrong compatibility floor73- **selectable face exists but no Edit button** -> `Editable` problem, or no real settings or slots74- **decorative slot frame exists but is not selectable** -> not a real `ComplicationSlot`, or missing bounds or types75- **provider app is installed but absent in chooser** -> provider manifest or service problem, not face metadata7677## Fix slots in editor78A slot must be a real `ComplicationSlot`, not painted art.7980Minimum conditions:8182- `Editable=true` in `watch_face_info.xml` when slots are meant to be user-editable83- slot has `slotId`84- slot has `supportedTypes`85- slot has a bounding area86- slot has `displayName`87- slot renders at least one `Complication` per supported type88- total slots is at most 88990If the user used wfs, remember that complications are independent and cannot be grouped with other components.9192## Fix provider chooser93Use [references/provider-menu-checklist.md](references/provider-menu-checklist.md).9495Hard requirements:9697- separate watch app or module98- `SuspendingComplicationDataSourceService`99- `BIND_COMPLICATION_PROVIDER`100- update-request intent filter101- `SUPPORTED_TYPES`102- `UPDATE_PERIOD_SECONDS` or explicit push strategy103- monochrome service icon104- useful `getPreviewData()`105106Match provider types to slot types. Do not blame the face first when the provider is missing.107108## Svg pipeline109Use one svg as source of truth only if you convert **semantics**, not just pixels.1101111. Preserve the original svg.1122. Extract or infer:113 - background art114 - hour, minute, second layers if analog115 - complication frames116 - slot geometry117 - ambient simplification1183. If the svg is flat and unlabeled, infer at most 1, 2, or 4 slots unless the geometry is unmistakable.1194. Prefer vector output for simple paths. Rasterize complex filters, masks, or blend-heavy art.1205. Build live complications with real `ComplicationSlot`s. Do not bake fake live text into static svg art.1216. If custom data is requested in the picker, build a separate provider app.122123For the exact layer-id contract and fallback extraction rules, load [references/svg-pipeline.md](references/svg-pipeline.md).124125## Animation and ambient126Animation is optional. Ambient is not.127128Rules:129130- make time and complications readable before adding motion131- prefer transform-driven motion over frame-heavy loops132- stop or simplify animation in ambient133- never keep the second hand in ambient134- keep lit pixels low and assets small135- if using wfs, do not use lottie in current workflows136137## Wfs guardrails138Use wfs only when the user wants a visual-first workflow or `.wfs` deliverables.139140Keep these constraints in mind:141142- wfs faces still need the correct wff floor for the target device143- keep fewer than 8 visible complications in both normal and ambient modes144- no second hand in ambient145- no lottie in current wfs workflow146- avoid edge-hugging art because burn-in shifting can move it147- complications cannot be grouped with other components148149## Watch Face Push150Only use Watch Face Push when the user explicitly needs app-driven or marketplace-style installation.151152Do not use it as a workaround for a normal face not showing up in the picker.153154When used, keep it behind a wear os 6 capability check and keep the pushed face itself in wff.155156## Output contract157When building:158159- return a buildable wff face module160- return a separate provider app only if custom data is required161- state the chosen compatibility floor explicitly: target os, wff version, and minSdk162- keep notes short and actionable163164When auditing:165166- patch the minimum files required167- explain whether the root cause is artifact type, compatibility floor, metadata, slots, or provider168- do not rewrite a correct wff face into a code-based face169170## Resource map171- compatibility and versioning: [references/version-matrix.md](references/version-matrix.md)172- gw7 invisibility diagnosis: [references/gw7-diagnosis.md](references/gw7-diagnosis.md)173- provider chooser checklist: [references/provider-menu-checklist.md](references/provider-menu-checklist.md)174- svg conversion contract: [references/svg-pipeline.md](references/svg-pipeline.md)175- docs and repo references: [references/source-map.md](references/source-map.md)176177## Default stance178Prefer the officially documented wff path, the lowest compatible wff version, a separate provider app when needed, and conservative slot geometry. On gw7-class devices, "face never appears in downloaded faces" is usually **not** a cosmetic metadata bug; treat it as a format, version, or package-structure problem first.