Skip to content

[Letter Avatars] Implementation Tracking #93784

Description

@grgia

NOT LOOKING FOR PROPOSALS

https://expensify.enterprise.slack.com/docs/T03SC9DTT/F0BB7EWJU0N

Solution

When a user has no uploaded photo, their default avatar becomes their initials (1–2 letters) in Expensify Neue on a coloured circle. Applies on NewDot + the NewDot-styled emails + push. Classic unchanged.

What we're building

  • A NewDot renderer — a View+Text component that draws the initials locally from the name + colour in Onyx, so it works offline and instantly.
  • A generation script — produces the full set of letter-avatar PNGs (every initials × colour) in Expensify Neue and uploads them to S3 under a fixed pattern: avatars/letter/{version}/{color}/{initials}.png. This is what makes them work in email and push, which can't render and can only point at a pre-made image.
  • A backend change — emit that pattern's URL on the avatar field in place of today's 24-bucket default. NewDot recognises the pattern and draws locally; email/push just fetch the matching image. One shared spec (palette + Expensify Neue + layout) keeps the client and the generated images identical.

Data

  • Initials from firstName/lastName; no usable name → today's default illustration.
  • Colour = accountID % paletteSize (always available; FE + backend identical), or a stored avatarStyle.color once the user picks one.
  • No per-user image storage — the bounded set (~24k PNGs) is generated by the script per design version and re-run on a restyle.

Assets

<CLOUDFLARE CDN>/images/avatars/generated/letter/v1/<color>/<initials>.png

Phases

  • Phase 0 — standalone renderer + design sandbox
  • Phase 1 — wire it into NewDot behind the letterAvatars beta (App).
  • Phase 2 — backend emits letter URLs + batch-generate the set (Web-Expensify + Auth).
  • Phase 3 — colour picking (App + Auth)
Issue OwnerCurrent Issue Owner: @mallenexpensify

Metadata

Metadata

Labels

Awaiting PaymentAuto-added when associated PR is deployed to productionDailyKSv2Skip PaymentSkips all the payment process steps for an issue. Use it for fixed-price projects.

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions