Three watch faces, one engineering approach. Codex is a gold and blue mother-of-pearl dress watch; Steampunk Mechanica is an ornate brass analog with four live complication sub-dials; Steampunk Digital swaps the hands for a brass info-board with five slots. None of them contains a single line of Java or Kotlin: each ships as a declarative Watch Face Format document that the Wear OS renderer executes directly.
Why it exists
I wanted watch faces that look like objects rather than widgets, and I wanted them to survive. The old code-based WatchFaceService path means an app process on the watch, a watch-face library dependency, and a battery cost the system holds against you. Watch Face Format inverts that: you describe the scene, the platform draws it. So I rebuilt these as pure resources. The constraint is real (no magnetometer, no arbitrary logic), but what you get back is a face that costs nothing to run and doesn’t rot when the library moves.
Highlights
- Codex is a jeweler’s dress watch, not a UI. Yellow-gold case, a bezel of alternating diamonds and blue sapphires, deep blue mother-of-pearl dial, polished gold dauphine hands, and a live date aperture at three o’clock. It has no complication slots and no style settings on purpose, so its picker metadata declares the face non-editable.
- Steampunk Mechanica is the mechanical one. A 480px ornate brass dial with filigree hands and a 15 Hz sweep second hand, four fully user-configurable complication slots seated in brass sub-dials, and optional time-driven gear animation and amber glow accents as boolean style settings.
- Steampunk Digital is the same brass, read differently. A digital info-board layout with five configurable slots (two rectangular in the middle band, three round below), plus device-synchronized 12/24-hour time and seconds, and a decorative compass rose at the bottom.
- Zero runtime code, verified. All three declare
android:hasCode="false"and contain no Java or Kotlin source files at all. The entire face is onewatchface.xml(73 lines for Codex, 395 for Mechanica, 488 for Digital) rendered by the platform. - Art is generated, not hand-exported. Codex and Mechanica each carry a deterministic Python and Pillow pipeline that rebuilds the runtime 480px drawables, the dim ambient variants, and the picker preview from committed 1024px source art, so every asset in the repo can be reproduced from the original rather than recovered from a lost layer file.
Technical approach
Codex is a WFF v1 package targeting Wear OS 4 / API 33; both Steampunk faces are WFF v2 targeting API 34 and newer, which is where native complication slots and user configuration live. Every Mechanica slot renders SHORT_TEXT, RANGED_VALUE, GOAL_PROGRESS, MONOCHROMATIC_IMAGE, SMALL_IMAGE, and EMPTY; Digital’s rectangular slots add LONG_TEXT. First-install suggestions (battery, weather, heart rate, steps) are only suggestions, and every slot can be replaced or cleared in the system editor.
Ambient mode is a separate scene rather than a dimmed copy: black field, dim monochrome hands or text, and everything expensive (seconds, gears, glow, complications, compass) dropped entirely. All three shift the ambient group on a nine-position grid driven by [MINUTE] % 3 to spread burn-in across the panel. The interactive scenes use a slight centered overscan (1.02x on Mechanica, 1.0125x on Digital) so the artwork fills the round canvas without clipping its visible edge, with complication hit targets kept aligned to their wells. tools/process_assets.py regenerates the processed drawables, and both Steampunk face documents are checked against Google’s official WFF validator before packaging.


