Skip to content

Profile customization: animated avatars, name styles, decorations, statuses - #5

Open
squeeeezy wants to merge 1 commit into
AbsoluteMode:mainfrom
squeeeezy:profile-customization
Open

squeeeezy wants to merge 1 commit into
AbsoluteMode:mainfrom
squeeeezy:profile-customization

Conversation

@squeeeezy

@squeeeezy squeeeezy commented Sep 25, 2026 •

Copy link
Copy Markdown

Discord-style profile customization: a member's look now travels with them to every server they are on.

What's in it

  • Animated avatars. GIF, animated WebP and APNG stay animated after cropping. Frames are decoded with WebCodecs and re-encoded as a GIF (gifenc) that always fits the existing 512 KB limit, so this part works on old servers too. In lists an animated avatar shows its first frame and moves while its owner talks or on hover.
  • Name styles. 18 shipped fonts with Cyrillic (OFL, @fontsource, WOFF2 only, loaded lazily), any Google Fonts family by name, or an uploaded font file (TTF/OTF/WOFF/WOFF2, up to 512 KB). Effects: plain, gradient, neon, toon, pop, in one or two colors. The name color also colors the speaking ring.
  • Avatar decorations. 17 decorations drawn for voicy in one sticker style. They live as .deco files (SVG plus a few macros) in client/src/decorations/, parsed by client/src/lib/deco.ts; the format is documented in client/src/decorations/README.md. Some react to the voice (headphones, equalizer, the mana bar in "Мид"). Members can also upload their own decoration in Discord's layout (PNG/APNG/GIF/WebP up to 1 MB).
  • Custom status under the name, with quick picks and an optional expiry.
  • Profile dialog in the self menu ("Оформление профиля"), next to "Изменить ник", with a live preview on the room's dot grid.

Server

  • New tables profiles, decorations, fonts (created on start, nothing to migrate).
  • PUT /api/me/profile, PUT/DELETE /api/me/decoration, PUT/DELETE /api/me/font; public GET /api/decorations/{id} and GET /api/fonts/{id} like avatars (fonts need Access-Control-Allow-Origin: * for FontFace).
  • The profile rides in the LiveKit participant metadata next to role, so people in a room see changes at once. push_metadata updates only the rooms the member is actually in.
  • Profile fields are validated in server/src/profile.rs; font, effect and decoration are just ids, so new styles need no server release.

Compatibility

  • Old servers with a new app: animated avatars work; name style, status and decorations appear once the server is updated (the app retries quietly).
  • New server with an old app: extra fields in members and metadata are ignored.

Worth knowing

  • Picking a Google Fonts family makes every client that shows that name load the font from Google.
  • client/DESIGN.md is a draft design book written for this work; it will likely change.
  • Version numbers are untouched.

Checked

  • cargo test (21 tests, 4 new) and tsc/vite build pass after rebasing onto 0.1.26; the online dot from presence sits above decorations.
  • The UI was checked in a browser with Tauri and the server stubbed. It has not yet been run against a live server with a real LiveKit call.

…atuses

- Animated avatars: GIF, animated WebP and APNG keep moving after cropping,
  re-encoded as a GIF that fits the existing 512 KB limit
- Name styles like Discord's: 18 shipped fonts with Cyrillic, any Google
  Fonts family, or an uploaded font file; plain, gradient, neon, toon and
  pop effects in one or two colors
- Avatar decorations drawn for voicy in .deco files (SVG with macros, see
  client/src/decorations/README.md), plus uploaded ones in Discord's layout
- Custom status with an optional expiry
- Server: profiles, decoration and font uploads, profile in LiveKit
  metadata so rooms update live
@squeeeezy
squeeeezy force-pushed the profile-customization branch from edfc744 to 80879d2 Compare September 25, 2026 09:59
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