Skip to content

Repository files navigation

speech bubble logo with D-like lettering vrcd

A little companion suite for VRChat to help you track friend activity, inject metadata into photos, and receive VR/desktop notifications.

It features a server-client architecture, to avoid having multiple connections to VRC APIs.

Warning

Status: Most features present. Stable for daily use; Under active development.

Otherwise, get ready to frequently pull, upgrade dependencies, and build!

Warning

The client requires an active running vrcd server and packages do not come with the server.

There are plans to fix this.

Client features:

  • Relatively light client using software rendering; Hardware option available.
  • VR friendly UI.
  • Embed world and player metadata into VRChat photos automatically.
  • Strip VRChat and other metadata from VRChat photos.
  • VR overlay notifications (XSOverlay/WayVR, OVR Toolkit) and desktop notifications.
  • Drop a Portal integration.

Server features:

  • Record incoming VRChat events.
  • Event-stream API with 'catch-up' and 'back-fill' actions to know what you missed.

Feel free to join the official VRCD VRChat group (VRCD.7796)!

Related projects:

Client Screenshots

Feed Page

Feed with event's date, type, user, and detail columns

Online Page

List of instances (current and capacity) and friends in each of them with color indicators

Inbox

Notification inbox

Inventory

Inventory showing gallery

Tools

Tools: screenshot folder, etc.

Profile

My profile with bio, links, langs

Web Screenshots

Online list

Installing

See Compiling.

After connecting to the server, the authentication will be forward to the first connected client. After connecting, you should be good to go!

Linux: pipehelper

The pipehelper subpackage is used to make "Open in VRChat" button work.

You'll need to make a Windows build of pipehelper with dub build :pipehelper in Windows, and place vrcd-pipehelper.exe next to the vrcd_client executable or in ~/.config/vrcd. No Steam launch options are needed: the client runs the helper with the Proton build VRChat itself is running under, against the game's prefix, which attaches it to the wineserver holding the launch pipe.

If the helper is missing, or the IPC attempt fails, the client falls back to a server-side self-invite.

For Developers

Architecture

             + ~ ~ ~ ~ ~ ~ ~ ~+
             | VRChat servers |
             +~ ~ ~ ~ ~ ~ ~ ~ +
                      ^
          HTTP requests / WS events
                      v
             +----------------+
             | vrcd-server    |
             | - VRC API sync |
             | - Friend state |
             +----------------+
                      ^
                    JSON-L
                      v
          +-----------+-----------+
          v                       v
+-----------------+      +----------------+                +----------+
| vrcd-client(s)  |      | vrcd-web       | <- HTTP/WS ->  | Browser  |
| - Picture meta  |      | - Serves HTML  |                | - Notifs |
| - Notifications |      | - Same link    |                | - etc. ! |
+-----------------+      +----------------+                +----------+

Targets:

  • Server: Stays connected to VRChat's WebSocket 24/7, records events to SQLite, and serves them over TCP.
  • Client: Connects to the server, watches local VRChat logs, and injects metadata into photos.
  • Web: Connects to the server, and allows you to browse vrcd using a Web browser.

Targets Windows and Linux.

Compiling

Needs a D compiler with front-end version 2.104 (DMD >=2.104, GDC >=14, LDC >=1.34).

See each component's README for dependencies, configuration, and architecture details.

In short:

  • Client needs SDL3 libraries (SDL3, SDL3_ttf, SDL3_image), and optionally OpenSSL. They are loaded at run time by default, and only needed at build time with dub build :client -c static.
  • Server needs the sqlite library, and optionally OpenSSL. libcurl is loaded at run time by default, and only needed at build time with dub build :server -c static.
# Upgrade dependencies for server and client
dub upgrade -s

# Build, test, and run server (might be best to setup config first)
# For more info, see server/README.md
dub test :server
dub build :server
# Will live at ./server/vrcd_server

# Build, test, and run client
# For more info, see client/README.md
dub test :client
dub build :client
# Lives at ./client/vrcd_client

# Ditto
dub test :web
dub build :web
# Lives at ./web/vrcd_web

See API.md for server-client API details.

Packaging

./packaging/package-appimage.sh   # client AppImage (builds with -c static)
./packaging/package-deb.sh all    # client and server .deb
./packaging/package-deb.sh --static server # Package server as static build

On Windows, in PowerShell (no MSYS2 or Git Bash needed):

powershell -executionpolicy bypass packaging/fetch-deps-windows.ps1   # Fetches SDL3, libcurl, builds sqlite3
powershell -executionpolicy bypass packaging/package-windows.ps1      # Zips client and server

The first script downloads the DLLs the two binaries load at run time, since Windows ships none of them, and compiles the sqlite3 amalgamation into sqlite3.lib for the server to link against. That last step is the only one needing Visual Studio Build Tools with the C++ workload; it finds them itself through vswhere, so a plain PowerShell prompt is enough.

sqlite3.lib is dropped in the repository root, not under packaging/deps/, because that is where the linker looks: pragma(lib, "sqlite3") becomes /DEFAULTLIB:sqlite3, and after /LIBPATH and LIB the linker falls back to the working directory, which is wherever dub was invoked. Having run the fetch script once, a plain dub build :server from the root works too.

The zips are self-contained: the client carries SDL3, SDL3_ttf and SDL3_image, and the server carries libcurl (sqlite3 is linked in). libcurl comes from curl.se and is built against the Windows certificate store, so no CA bundle is shipped with it. The pipe helper is not in the client zip, because talking to VRChat's launch pipe is in-process on Windows.

Issues

  • Using LDC 1.41 on Windows will lead to compiling issues: undefined PAGESIZE in core.thread.fiber

Contributing

I'm unsure how I want to handle contributions at this moment, sorry.

However, feel free to submit bugs in Issues and feature suggestions in Discussions, thanks.

Disclaimer

This software is provided as-is without any warranty and is not affiliated with VRChat.

VRCD does not modify the game client in any shape, nor does it reflect the views or opinions of VRChat. It is only an external tool using the VRChat API.

Users are still responsible for complying with VRChat's Terms of Service.

VRChat is copyrighted work of VRChat Inc.

License

Both the server and client components are licensed BSD-3-Clause-Clear.

About

VRChat companion app using server-client architecture

Topics

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages