Join us on the BonnieBots Discord at https://discord.gg/RRCUytaDH6
An experimental Second Life / OpenSim viewer that replaces the traditional monolithic C++ viewer architecture with a multi-process stack: Electron for account management and UI, Godot for 3D rendering, and an experimental Unreal Engine renderer as an alternative. Also includes an MCP server so AI coding agents can log in and interact with the virtual world directly.
Grab a release, unzip with something like 7-Zip, and run.
Grab a release, extract into a directory, run the PyroKitty.sh script. The script will identify missing dependencies and offer to install (currently only for Ubuntu/Debian/derivatives, Fedora/derivatives, and Arch/derivatives).
An example process:
# Adjust as needed
pyrodir="/opt/pyrokitty"
sudo mkdir -p "$pyrodir"
sudo chown -R $USER "$pyrodir"
# Optional; use only when upgrading
cd "$pyrodir"
rm -rf *
cd -
# Replace/set $pyrotar to the actual tarball name
tar xvf ~/Downloads/"$pyrotar" -C "$pyrodir" --strip-components=1
# IF AND ONLY IF (1) you have multiple users, and (2) all your users are members of the same $USER_GROUP
sudo chown -R :$USER_GROUP "$pyrodir"
sudo chmod -R g+wX "$pyrodir"
sudo find "$pyrodir" -type d -exec chmod g+s '{}' ';'
# Run -- this will also check for requirements
cd "$pyrodir"
./PyroKitty.sh
There's no one-click build yet. The project has several independent pieces that each need to be built. See electron-ui/scripts/package.sh for how the release packaging works, or read on for the individual components.
- Node.js 18+
- Godot 4.7-dev2 Mono (version pinned in
godot-viewer/godot-version.txt) - .NET 8 SDK (for the voice sidecar)
cd electron-ui
npm install
npm run build
npm start # builds and launchesSet AUTO_LOGIN=1 to skip the login screen during development.
Open godot-viewer/ in Godot. The engine version must match godot-viewer/godot-version.txt.
Place the Godot executable inside godot-viewer/ in a subdirectory matching the version name. For example:
godot-viewer/
Godot_v4.7-dev2_mono_win64/
Godot_v4.7-dev2_mono_win64.exe
Godot_v4.7-dev2_mono_win64_console.exe
GodotSharp/
Run headless tests:
cd godot-viewer
GODOT=$(cat godot-version.txt | tr -d '[:space:]')
./$GODOT/${GODOT}_console.exe --headless --quit-after 5 --scene tests/test_prim_mesh.tscncd electron-ui/voice
dotnet buildWebRTC voice chat using SIPSorcery + Concentus Opus. See docs/architecture/voice-system.md.
cd sl-mcp
npm run buildNo separate launch needed — Claude Code starts it automatically via .mcp.json.
Both Electron and Godot use tag-based debug logging controlled by the PK_DEBUG environment variable. Set it to a comma-separated list of tags, or all to enable everything:
# Enable specific tags
PK_DEBUG=alpha,camera,flexi npm start
# Enable all debug output
PK_DEBUG=all npm startAvailable tags:
| Tag | Area |
|---|---|
alpha |
Alpha/transparency sorting and material decisions |
animation |
Animation fetching, decoding, and batching |
animesh |
Animesh skeleton creation and rigged mesh binding |
attach |
Attachment point positioning |
avatar |
Avatar appearance, bake-on-mesh, shape data |
avatarshape |
Avatar shape deformation and body offsets |
avatarsit |
Avatar sitting and seat resolution |
bctex |
BC-compressed texture loading |
camera |
Camera movement, running, double-tap |
chat |
Chat message forwarding |
env |
Environment/EEP settings |
flexi |
Flexi prim simulation |
input |
Movement, sit, touch input handling |
ipc |
IPC message routing |
jointoverride |
Joint position override priority |
light |
Light and projector textures |
mesh |
Mesh readiness and delivery |
object |
Object creation and parenting |
selfavatar |
Self-avatar skeleton and animation eval |
terrain |
Terrain tile loading |
texture |
Texture decode pool scaling |
voice |
Voice PTT and sidecar |
water |
Water plane and wave parameters |
In Electron code, use pkDebug(tag, msg) from pk-debug.ts. In GDScript, use DebugLog.debug(tag, msg) (an autoload). Use pkDebugEnabled(tag) / DebugLog.enabled(tag) to guard expensive string formatting.
| Directory | What it does |
|---|---|
electron-ui/ |
Electron app — account management, login, UI shell, and the client-side protocol backend (node-metaverse). The brains of the operation. |
godot-viewer/ |
Godot 4.7 project — 3D rendering, avatar animation, prim meshing. Communicates with Electron over a local bridge. |
unreal-viewer/ |
Unreal Engine renderer as an alternative to Godot. Very experimental. |
sl-mcp/ |
MCP server that gives AI agents (like Claude) direct control of a Second Life bot — chat, navigation, object manipulation, and more. |
docs/ |
Architecture docs, rendering notes, and research. |
icons/ |
App icons. |
┌──────────────┐ WebSocket ┌──────────────┐ WebSocket ┌──────────────┐
│ Unreal │ <────────────────> │ Electron UI │ <────────────────> │ Godot Viewer │
│ (3D render) │ (alt renderer, │ (node-meta- │ (textures, │ (3D render) │
│ │ experimental) │ verse) │ meshes, anims) │ │
└──────────────┘ └──────┬───────┘ └──────────────┘
│
┌─────┴──────┐
│ Voice Side-│
│ car (.NET) │
└────────────┘
Electron handles the SL protocol via node-metaverse (a TypeScript SL client library, bundled with heavy modification). It decodes textures, builds mesh data, manages animations, and streams everything to Godot for rendering. An experimental Unreal Engine renderer is available as an alternative to Godot.
The sl-mcp/ server exposes 36 tools across session management, chat, navigation, social, object manipulation, and even a minesweeper solver. Configure it in .mcp.json and any MCP-compatible agent can walk around, chat, rez prims, and interact with the world.
See LICENSE. (It's chill.)