Search
Filter by avatar name, author, and description simultaneously with case-insensitive matching.
Platform filtering
Toggle PC, Quest, and iOS filters independently to find cross-platform avatars.
Async image loading
Thumbnail images are fetched concurrently by 4 worker threads with a 256-texture LRU cache.
Equip avatars
Wear any avatar directly from the browser without opening the VRChat website.
Loading flow
On startup, the browser openscache/avatar_entries.ndjson and streams it line by line. Each line is a single JSON-serialized AvatarEntry object (newline-delimited JSON). The file is produced by the database downloader.
The file path is hardcoded as cache/avatar_entries.ndjson relative to the working directory. If the file does not exist, the browser displays an error prompting you to run the downloader first.
Avatar entry fields
| Field | Type | Description |
|---|---|---|
name | String | Avatar display name |
author | String | Creator’s VRChat display name |
description | String | Avatar description |
avatar_id | String | Full VRChat avatar ID (avtr_...) |
platforms | Vec<String> | Normalized platform list: ["PC"], ["PC", "Quest"], etc. |
quest | bool | Raw Quest flag from the database |
ios | bool | Raw iOS flag from the database |
platforms field is derived from quest and ios at load time: all avatars include "PC" by default, with "Quest" and "iOS" appended as appropriate.
Search
The browser provides three independent search fields — avatar name, author name, and description — all evaluated simultaneously. Matching is case-insensitive substring search. An avatar must satisfy every non-empty search field to appear in results.Tag search is not currently implemented. The
tags field is stored in each entry but is not included in the search filter. Tag-based filtering is planned for a future release.Platform filtering
Three checkboxes — PC, Quest, and iOS — act as inclusion filters. When a platform checkbox is enabled, only avatars with that platform in theirplatforms list are shown. Multiple platform filters can be active at the same time, requiring an avatar to match all of them.
Grid layout and pagination
Avatars are arranged in a responsive grid that fills the available window width. Column count is calculated dynamically based on the card width:| Constant | Value | Description |
|---|---|---|
CARD_WIDTH | 240.0 px | Fixed width of each avatar card |
CARD_GAP | 12.0 px | Spacing between cards |
CARD_IMAGE_WIDTH | 140.0 px | Thumbnail image width |
CARD_IMAGE_HEIGHT | 105.0 px | Thumbnail image height (4:3 ratio) |
PAGE_SIZE | 200 | Avatars loaded per page |
Each page shows up to 200 avatars. Use the Previous and Next buttons in the toolbar to navigate between pages. The current page and total page count are displayed in the status bar.
Image loading
Thumbnail images are fetched asynchronously from the VRChat API by a pool of background threads:| Constant | Value | Description |
|---|---|---|
WORKER_COUNT | 4 | Number of concurrent image-fetching threads |
MAX_PENDING | 48 | Maximum number of in-flight image requests at once |
MAX_TEXTURE_CACHE | 256 | Maximum number of decoded textures kept in memory |
GET /avatars/{id} to retrieve the imageUrl or thumbnailImageUrl, then downloaded and decoded to RGBA8 before being uploaded as egui textures.
Avatars that have been deleted, set to private, or removed from the VRChat platform are shown with a red (Removed) overlay instead of a thumbnail.
Avatar details panel
Each avatar card displays:- Thumbnail image (140×105 px, 4:3)
- Platform badge(s): PC (green), Quest (orange), iOS (blue)
- Avatar name (bold)
- Author name
- Description (italic, small)
AvatarEntry but are not currently shown in the card view.
Actions
Each card exposes two action buttons: Open Web — openshttps://vrchat.com/home/avatar/{avatar_id} in the system browser. Disabled for removed avatars.
Wear — equips the avatar on your VRChat account by calling PUT /avatars/{id}/select. Requires an active login session. After equipping, the current avatar panel in the toolbar is refreshed automatically. Disabled for removed avatars.
VRChat API calls
| Method | Endpoint | Purpose |
|---|---|---|
GET | /auth/user | Retrieve the currently equipped avatar ID on startup and after equipping |
GET | /avatars/{id} | Fetch avatar metadata and thumbnail URL for image loading |
PUT | /avatars/{id}/select | Equip an avatar |