Download sources
The app fetches from GitHub Gist primary URLs, with automatic fallback toprismic.net mirror URLs if a primary request fails.
| Database | Primary URL | Backup URL |
|---|---|---|
| PC (main) | gist.githubusercontent.com/Mwr247/.../pasavtrdb.txt | prismic.net/vrc/pasavtrdb.txt |
| Quest | gist.githubusercontent.com/Mwr247/.../pasavtrdb_qst.txt | prismic.net/vrc/pasavtrdb_qst.txt |
| iOS | gist.githubusercontent.com/Mwr247/.../pasavtrdb_ios.txt | prismic.net/vrc/pasavtrdb.txt |
Download steps
Downloading main database
Fetches
pasavtrdb.txt — the primary PC avatar database. This file contains all avatar metadata: IDs, names, descriptions, authors, and tags.Downloading Quest database
Fetches
pasavtrdb_qst.txt — a compact auxiliary file containing only the avatar IDs available on Quest. These IDs are cross-referenced against the main database to set the quest flag on matching entries.Downloading iOS database
Fetches
pasavtrdb_ios.txt — the same structure as the Quest auxiliary file, used to set the ios flag on matching entries.Binary format and decryption
All three database files share a custom binary format with aPAS magic header. The main database uses a Reader struct for sequential byte-level parsing.
Avatar IDs are stored as 16-byte encrypted blocks. Decryption works by XOR-combining 16 random bytes read from the file header with a compile-time constant:
avtr_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
The Reader struct exposes typed reads over the raw byte slice:
read_byte()— reads a single byteread_bytes(n)— readsnbytesread_int24()— reads a 3-byte big-endian integerread_int_array(n)— readsnlittle-endiani32values
\r characters inside a newline-delimited string block at the end of the file.
Data structures
After parsing, each avatar is represented as anAvatarEntry:
| Field | Type | Description |
|---|---|---|
name | String | Display name of the avatar |
author | String | VRChat display name of the creator |
description | String | Avatar description text |
avatar_id | String | Full VRChat avatar ID (avtr_...) |
tags | Vec<String> | Comma-separated tags extracted from the database |
quest | bool | Whether the avatar has a Quest-compatible build |
ios | bool | Whether the avatar has an iOS-compatible build |
AvatarData struct records database-level statistics:
| Field | Type | Description |
|---|---|---|
avatar_count | u32 | Total avatar count from the file header |
author_count | u32 | Unique author count, computed during processing |
last_update | String | Database date, decoded from a packed 2-byte field (YYYY-MM-DD) |
entries | Vec<AvatarEntry> | Avatar entries (empty in cached summary; full data is in the NDJSON stream) |
Output files
All output is written to thecache/ directory:
| File | Description |
|---|---|
cache/avatar_entries.ndjson | Streaming NDJSON file — one AvatarEntry JSON object per line. Read by the avatar browser. |
cache/cache_meta.json | Stores the gist commit version hash and a saved_at timestamp. |
Smart caching
Before downloading, the app queries the GitHub Gist API to retrieve the latest commit version for the main database gist:gist_version stored in cache/cache_meta.json. If they match, the download is skipped entirely and the existing avatar_entries.ndjson is used. If the version has changed or no cache exists, all three files are re-downloaded and processed.