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 Owner
Current Issue Owner: @mallenexpensify
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
View+Textcomponent that draws the initials locally from the name + colour in Onyx, so it works offline and instantly.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.avatarfield 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
firstName/lastName; no usable name → today's default illustration.accountID % paletteSize(always available; FE + backend identical), or a storedavatarStyle.coloronce the user picks one.Assets
<CLOUDFLARE CDN>/images/avatars/generated/letter/v1/<color>/<initials>.pngPhases
letterAvatarsbeta (App).Issue Owner
Current Issue Owner: @mallenexpensify