Skip to content

feat(stream-android): add design-matching skill#37

Open
aleksandar-apostolov wants to merge 2 commits into
mainfrom
feature/android-design-matching-skill
Open

feat(stream-android): add design-matching skill#37
aleksandar-apostolov wants to merge 2 commits into
mainfrom
feature/android-design-matching-skill

Conversation

@aleksandar-apostolov

@aleksandar-apostolov aleksandar-apostolov commented Jul 3, 2026

Copy link
Copy Markdown

Adds a design-matching skill for Android (Compose) — a repeatable method for reproducing a reference design (screenshot / Figma / "make it look like WhatsApp / Slack / Telegram / ") with the pre-built Compose components. This brings Android to parity with iOS on design-matching, but it is its own skill: built from the Android SDK's actual customization model and hardened empirically, not a translation of the iOS doc.

What's here

  • skills/stream-android/design-matching.md — the skill: classify each screen (Step 0), decompose every region, route each difference to one of the two Android axes (theming token vs ChatComponentFactory slot), build, and verify region-by-region on the real navigation path (Step 5).
  • SKILL.md — a styling-depth flag routes target-appearance requests to the skill (orthogonal to the A/B/C/D tracks).
  • RULES.md — a "Matching a reference design" section (two axes, derived bubble-color tokens, composite-slot drop, the three most-missed regions, verify-or-it-doesn't-count).

Built for Android's customization model

Every mechanism is grounded in the Compose SDK, not carried over from another platform:

  • Two axes, not three — Android has no Styles axis, so padding / corner-radius / bubble-shape / composer layout are structure (slot override), not a token.
  • Bubble colors are derived internal vals — recolor via the brand ColorScale or a MessageBubble override, never a constructor param.
  • ChatComponentFactory (~196 slots) is the structural surface; the doc routes each region to its slot and shows how to read the pinned version's source.
  • Step 0 multi-screen classification (channel list vs message vs thread) and a "derive, do not clone" method so the skill generalizes to any reference instead of encoding specific apps.

How it was validated

Dogfooded one-shot from screenshots across three maximally-different archetypes, each built + verified on a live emulator against the reference, iterating region-by-region until it matched:

  • WhatsApp — bubble messenger (in-bubble metadata, wallpaper, tail).
  • Slack — flat workplace, channel-list + message screens, DM/channel split, multi-row composer.
  • Telegram — bubble messenger with gradient wallpaper, per-user colored author names, in-bubble metadata, flat composer.

The composer, header, and channel-list-row guidance were hardened directly from visual grading of those runs (row-count / alignment / field-shape traps, the header trailing-avatar default, DM-vs-#, reactions placement, and "data-limited != verified").

Port the iOS design-matching skill to Android (Compose). A repeatable
method for reproducing a reference design (screenshot / Figma / "make it
look like X") with the pre-built Compose components: classify each screen,
decompose every region, route each difference to one of the two Android
axes (theming token vs ChatComponentFactory slot), build, and verify
region-by-region on the real navigation path.

Adds design-matching.md and wires it into SKILL.md (styling-depth flag)
and RULES.md. Android-specific vs iOS: two axes not three (no Styles
axis - padding/radius/shape are structure), derived bubble-color tokens,
ChatComponentFactory slots, plus Step 0 multi-screen classification and a
"derive, do not clone" method section.
@aleksandar-apostolov aleksandar-apostolov marked this pull request as ready for review July 3, 2026 13:10
…gn-matching

The SDK's MessageInput bakes in a border stroke; call it out as a check
separate from shape/fill (a field can have a fill but no stroke), and note
it is easiest to miss in dark mode. Adds a dark-mode border check to the
Step 5 verify gate. Surfaced by an external Slack dark-mode dogfood run.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant