Skip to content

Case Study

CarmaClouds: Multi-Platform VTT Character Sync Suite

Role: Solo DeveloperDuration: 2024-PresentLive: MIT (open source)Status: Active - used in live campaign sessions
TypeScriptJavaScriptSupabaseChrome Ext. (MV3)Firefox Ext. (MV2)Discord.jsMeteor DDPESBuild

Scale

175,000+

Total lines of code

3

VTT platforms

Chrome + Firefox

Browser targets

20+

Discord commands

50+

D&D 5e edge cases

The Problem

Players who build D&D 5e characters in DiceCloud V2 face a painful workflow: the platform provides rich character management, but when it is time to play in Roll20, Foundry VTT, or Owlbear Rodeo, every stat, spell, and feature has to be re-entered manually. 100+ data points, transcribed by hand, with transcription errors accumulating over sessions.

No tool existed to bridge DiceCloud to any VTT platform. The ecosystem had no interoperability.

Key Features

RollCloud

DiceCloud to Roll20 browser extension (Chrome + Firefox)

85-90% complete

Parses DiceCloud character data and populates Roll20 character sheets via the Roll20 DOM. Uses Manifest V3 (Chrome) and Manifest V2 (Firefox) compiled from shared source via ESBuild.

OwlCloud

DiceCloud to Owlbear Rodeo native extension

95% complete

Translates DiceCloud data to Owlbear Rodeo's native extension API. The most complete integration - Owlbear's extension model is well-documented and stable.

FoundCloud

DiceCloud to Foundry VTT module

70% complete

Foundry requires embedded Items rather than flat attributes, making the translation more complex than Roll20. D&D 5e class items mapped via the system's item compendium.

CoyoteCloud

Two-way DiceCloud sync in the Coyotes and Candles VTT

Active

The most production-deployed component. CoyoteCloud adds DiceCloud write-back to the Coyotes and Candles VTT - character changes made in the VTT push back to DiceCloud in real time, and vice versa. Used in live campaign sessions every week.

Pip2 Discord Bot

Character data via Discord slash commands

Operational standalone

20+ slash commands for querying character data, rolling dice with full modifier context, and managing campaign state from Discord.

Technical Highlights

DiceCloud uses Meteor DDP, not REST

DiceCloud's API is built on the Meteor DDP protocol - a WebSocket-based pub/sub system with no REST interface. I implemented a custom DDP client with request queueing to prevent API rate abuse.

Platform data models are fundamentally incompatible

Roll20 uses flat character attributes. Foundry requires embedded Items with specific schema. Owlbear has its own model. The adapter pattern - a shared parsing stage feeding platform-specific adapters - made adding new platforms incrementally cheap after the first two.

D&D 5e rule engine with 50+ edge cases

Generic stat copying is easy. Accurate math - special abilities, weapon detection, expanded crit ranges, multiclass spell slot calculations - is the actual product. Each edge case is a modular pattern-matcher in the rule engine.

Chrome and Firefox extension APIs diverge fundamentally

Solved by writing to a shared source and running an ESBuild pipeline that outputs both targets. Automated ZIP generation at build time prevents deployment confusion.

Monorepo consolidation

RollCloud, OwlCloud, and FoundCloud were originally separate repos. Consolidating into a single monorepo with shared core logic eliminated drift and made the DiceCloud parsing changes apply everywhere at once.

Screenshots

DiceCloud character sheet - sync source
Browser extension popup
Roll20 - synced character sheet
Owlbear Rodeo - synced character

Links