I am going to try to use this page to keep track of arcane knowledge, tips and tricks, bugs, etc related to VRChat project development. It's both for my own reference and for anyone else who stumbles across it. The notes here aren't necessarily about advanced topics, and some are just things I wish I knew sooner. Hopefully it'll help you solve a problem or inspire you to create something.
Despite this being perfectly valid, of course. You can either strip these characters or escape them (\u005b \u005d \u007b \u007d). Ancient bug, unfixed since ~2023. Canny1 Canny2
In many cases you may find yourself making Update() loops that exit immediately if some bool isn't set. This of course still incurs the performance hit of entering Update() and checking the bool every frame. Instead, you can have a worker function that you enter once, and inside it use SendCustomEventDelayedFrames to call itself again on the next frame until the work is finished. This can help quite a bit if you'd otherwise be using Update() loops on a lot of objects in the scene.
Launching B&T clients (or not launching them!) is cumbersome in the SDK panel in the editor. VRC Quick Launcher lets you do this in a more customizable and repeatable fashion. I had to install Creator Companion to get this tool even though I use ALCOM, since I don't think VRChat distributes it any other way.
VRChat has its own TMP fallback font that is used even if you don't configure any fallbacks yourself. It includes at least CJK characters. This can be a blessing or a curse depending on what you're doing.
The virtual keyboard used for InputFields has degraded functionality on Quest despite looking very similar to the PC one. Canny. Also be aware that on Android (mobile) it tries to use the system keyboard instead.
The iOS client uses a different (and arguably better) user-agent format from all other platforms. Canny
Although I have only tested the color tag myself.
Animator.StringToHash() is faster than writing your own CRC32 in Udon.