Skip to content

Instantly share code, notes, and snippets.

View zuedev's full-sized avatar
👀
Looking for more projects!

Alex zuedev

👀
Looking for more projects!
View GitHub Profile
@zuedev
zuedev / Analysis of Access Control Mechanisms in VRChat Avatar Distribution.md
Last active December 18, 2025 08:47
Analysis of Access Control Mechanisms in VRChat Avatar Distribution

Analysis of Access Control Mechanisms in VRChat Avatar Distribution

Date: October 26, 2025

Subject: Feasibility of "Whitelisting" and DRM for User-Generated Avatars

Abstract

This paper examines the technical feasibility of implementing "Whitelisting" or Digital Rights Management (DRM) systems within VRChat avatars. Specifically, it analyzes the efficacy of external Open Sound Control (OSC) applications acting as authentication keys, internal PIN systems, and platform-native permissions. The findings indicate that due to the client-side nature of avatar rendering and the lack of logic scripting (Udon) on avatars, true "whitelisting" is technically impossible to secure. The paper concludes that Server-Side Access Control (Private Uploads) remains the only robust method for limiting avatar usage.

@zuedev
zuedev / Speeding Up VRChat Development: Unity Accelerator Guide.md
Last active December 17, 2025 22:15
Setting up a Unity Accelerator (the modern Cache Server) is recommended for VRChat developers to drastically reduce asset re-import and platform switching times by caching processed assets locally on a server.

Speeding Up VRChat Development: Unity Accelerator Guide

Baking lightmaps and switching platforms between PC and Android (Quest) are the two biggest time-sinks in VRChat creation. Setting up a Unity Accelerator (the modern version of the Cache Server) allows you to offload asset processing and store multiple versions of the same asset simultaneously.

1. Why use a Cache Server for VRChat?

  • Instant Platform Swapping: Stop waiting 20 minutes to switch from PC to Quest. The server stores the compressed textures for both.
  • Faster Re-imports: If you delete your Library folder to fix a bug, the Accelerator re-populates it in seconds over your local network.
  • Multi-PC Sync: If you work with a team or use a desktop and a laptop, you only "process" an asset once; every other machine just downloads the result.
@zuedev
zuedev / restic-backup-to-b2.bash
Last active December 6, 2025 16:27
Automated Restic Backup to Backblaze B2 via Docker: A single Bash script to initialize a Restic repository (if needed) and run a full, excluded, read-only backup of a Linux host's root filesystem (`/`) to Backblaze B2 using the official Docker image and S3-compatible API.
#!/bin/bash
# --- 1. CONFIGURATION ---
# Replace these placeholders with your actual values.
# Backblaze B2 S3 Credentials
export AWS_ACCESS_KEY_ID="YOUR_B2_KEY_ID"
export AWS_SECRET_ACCESS_KEY="YOUR_B2_APPLICATION_KEY"
# Restic Repository Details
@zuedev
zuedev / Dockerfile
Created November 10, 2025 01:59
For OneDev: This Dockerfile downloads the image from the URL during build time and replaces `/app/site/assets/avatars/project.png` in the container.
FROM ubuntu:24.04 AS build
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
RUN curl -fsSL https://get.docker.com | sh
FROM ubuntu:24.04
ARG TARGETPLATFORM
ARG AVATAR_IMAGE_URL
COPY server-product/app /app
COPY server-product/docker/entrypoint-server.sh /root/bin/entrypoint.sh
@zuedev
zuedev / caddy.docker-compose.yaml
Last active November 7, 2025 03:34
Caddy docker-compose.yaml that writes an inline Caddyfile from an environment variable at runtime.
# Use a modern compose version
version: '3.8'
services:
caddy:
image: caddy:latest
restart: unless-stopped
ports:
# Port 80 for HTTP and ACME (Let's Encrypt) challenges
- "80:80"
@zuedev
zuedev / 5etools-bulk-book-markdown-downloader.js
Created October 7, 2025 23:07
Bulk download all D&D 5e books as Markdown files from 5etools. Automatically fetches the book index, loads the Markdown renderer, converts all chapters to .md format, and downloads each book individually. Run in browser console on books.html page.
// Mass Book Markdown Downloader for 5etools
//
// This script automatically downloads all books from the 5etools data directory
// as Markdown files. It loads the necessary rendering library, fetches each book's
// data, converts all chapters to Markdown format, and triggers individual file
// downloads. Each book is saved with its original name as a .md file.
//
// Usage: Paste this script into the browser console on books.html
//
@zuedev
zuedev / swap.sh
Created October 5, 2025 00:01
Create and enable a swap file on Linux systems.
#!/bin/bash
set -euo pipefail
# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
@zuedev
zuedev / docker-compose.yml
Last active December 19, 2025 08:46 — forked from remusjones/docker-compose.yml
Plutonium patch script for the felddy/foundryvtt container.
services:
foundry:
image: felddy/foundryvtt:13
restart: unless-stopped
volumes:
- ./data:/data
ports:
- 30000:30000
environment:
- CONTAINER_CACHE=/data/container_cache
@zuedev
zuedev / gcp_unpreempter.js
Last active May 20, 2020 14:45
gcp_unpreempter.js
const Compute = require("@google-cloud/compute");
const compute = new Compute();
const state = {
msg: "",
};
exports.init = (req, res) => {
compute.getVMs().then((data) => {
data[0].forEach((vm) => {
["dedmen"] call {
missionNamespace setVariable [_this select 0,player, true];
[0, {
params ["_myName"];
private _curVarName = _myName+"Cur";
if (!isNil _curVarName) then {
[-1, compile format["if (player == %1) then {%1 sideChat 'deleting Curator';}", _myName]] call CBA_fnc_globalExecute;
deleteVehicle (missionNamespace getVariable [_curVarName, objNull]);
missionNamespace setVariable [_curVarName, nil, true];