- ποΈ Project Structure
- π Quick Start
- π Makefile Commands
- π§ Package Scripts
- π CI/CD Workflow
- ποΈ Architecture
- π§ͺ Testing
- π Development Workflow
- π¦ Publishing
- π§ Troubleshooting
- π€ Contributing
- π Additional Resources
- π License
This monorepo contains the Decentraland Creator Hub ecosystem, consisting of three main packages:
@dcl/asset-packs- Curated collections of 3D assets and Smart Items for Decentraland scenes@dcl/inspector- A web-based 3D scene inspector for Decentralandcreator-hub- An Electron-based desktop application for creating and managing Decentraland scenes
creator-hub/
βββ packages/
β βββ asset-packs/ # Asset packs and Smart Items
β β βββ packs/ # Asset pack definitions
β β βββ src/ # Runtime library
β β βββ scripts/ # Build and upload scripts
β β βββ bin/ # Built SDK7 runtime
β βββ inspector/ # Web-based 3D inspector
β β βββ src/ # Source code
β β βββ public/ # Built assets
β β βββ test/ # Tests
β βββ creator-hub/ # Electron desktop application
β βββ main/ # Main Electron process
β βββ preload/ # Preload scripts
β βββ renderer/ # React frontend
β βββ shared/ # Shared utilities
β βββ e2e/ # End-to-end tests
βββ .github/workflows/ # CI/CD workflows
βββ Makefile # Build and development commands
βββ package.json # Root package configuration
Before starting, ensure you have the following installed:
- Node.js 22.x or higher (Download)
- npm (comes with Node.js, preferred over yarn)
- Git (Download)
- Docker (optional, required for local asset-packs content server development)
-
Clone the repository:
git clone https://github.com/decentraland/creator-hub.git cd creator-hub -
Install dependencies and initialize the project:
make init
This command will:
- Install all dependencies for the monorepo and sub-packages
- Download and install Protocol Buffers compiler
- Generate TypeScript definitions from
.protofiles - Build all packages
The project uses a Makefile to manage common development tasks:
| Command | Description |
|---|---|
make install |
Install dependencies for all packages |
make install-protoc |
Download and install Protocol Buffers compiler |
make protoc |
Generate TypeScript definitions from .proto files |
make init |
Complete project initialization (clean + install + protoc + build) |
| Command | Description |
|---|---|
make build |
Build all packages (asset-packs, inspector, creator-hub) |
make build-asset-packs |
Build only the asset-packs package |
make build-inspector |
Build only the inspector package |
make build-creator-hub |
Build only the creator-hub package |
make validate-asset-packs |
Validate asset-packs assets |
make upload-asset-packs |
Upload asset-packs to content server |
| Command | Description |
|---|---|
make lint |
Run ESLint across all packages |
make lint-fix |
Fix ESLint issues automatically |
make format |
Format code with Prettier |
make typecheck |
Run TypeScript type checking |
make test |
Run unit tests for all packages |
make test-e2e |
Run end-to-end tests for all packages |
| Command | Description |
|---|---|
make sync-deps |
Synchronize dependencies across packages using syncpack |
make lint-packages |
Check for dependency mismatches |
| Command | Description |
|---|---|
make clean |
Remove build artifacts and dist folders |
make deep-clean |
Remove all node_modules and generated files |
cd packages/asset-packs
# Development
npm run start # Start SDK7 dev server (port 8001) and watch for changes
# Building
npm run build # Build all (SDK7 scene, library, catalog)
npm run build:js # Build SDK7 scene (bin/index.js)
npm run build:lib # Build TypeScript library
npm run build:catalog # Generate catalog.json
# Asset Management
npm run validate # Validate all assets
npm run upload # Upload assets to content server
npm run download # Download assets from content server
# Type checking
npm run typecheck # Type check the librarycd packages/inspector
# Development
npm run start # Start in watch mode
# Building
npm run build # Build the inspector
# Testing
npm run test # Run unit tests
npm run test:e2e # Run end-to-end tests
# Type checking
npm run typecheck # Type check the inspectorcd packages/creator-hub
# Development
npm run start # Start in watch mode
# Building
npm run build # Build all parts (main, preload, renderer)
npm run build:main # Build main process
npm run build:preload # Build preload scripts
npm run build:renderer # Build renderer (React app)
# Testing
npm run test # Run all tests
npm run test:e2e # Run end-to-end tests
npm run test:unit # Run unit tests
# Type checking
npm run typecheck # Type check all partsThe project uses GitHub Actions with a sophisticated CI/CD pipeline:
The main workflow orchestrates all CI processes and runs on:
- Push to
mainbranch - Pull requests
Workflow Steps:
- Lint - Code formatting and linting
- Typechecking - TypeScript type checking
- Tests - Unit and end-to-end tests
- Drop Pre-release - Create pre-release artifacts
- Asset Packs Build - Build, validate, and publish asset-packs package
- Inspector Build - Build and publish inspector package (depends on asset-packs)
- Creator Hub Build - Build and publish creator hub
Runs comprehensive testing:
- Unit Tests - Runs on Ubuntu with Node.js 22
- E2E Tests - Runs on macOS and Windows with Playwright
- Cross-platform Testing - Tests both packages
Handles asset-packs package deployment:
- Validates all assets
- Builds the asset-packs package
- Publishes to npm (main branch only)
- Uploads assets to S3 CDN (dev and prod environments)
- Creates GitHub releases with release notes
Handles inspector package deployment:
- Builds the inspector package (depends on asset-packs)
- Publishes to S3 for branch previews
- Deploys to GitHub Pages
- Publishes to npm (main branch only)
- Creates GitHub releases with release notes
Handles desktop application builds:
- Multi-platform Builds - macOS and Windows
- Code Signing - Automatic code signing for both platforms
- Notarization - macOS notarization
- Artifact Distribution - Uploads to S3 and GitHub releases
- PR Testing - Provides download links for PR testing
The project uses npm workspaces to manage the monorepo:
{
"workspaces": ["packages/*"]
}- syncpack is used to synchronize dependencies across packages
- Shared dependencies are defined in the root
package.json - Package-specific dependencies are in each package's
package.json - The
@dcl/inspectordependency is managed specially in.syncpackrc.json
The Inspector package uses Protocol Buffers for data layer communication:
.protofiles are inpackages/inspector/src/lib/data-layer/proto/- Generated TypeScript files are in
packages/inspector/src/lib/data-layer/proto/gen/ - Use
make protocto regenerate after.protochanges
- Creator Hub: Uses Vitest for main, preload, renderer, and shared tests
- Inspector: Uses Vitest for unit tests
- Run with
make testornpm run testin individual packages
- Creator Hub: Uses Playwright for Electron app testing
- Inspector: Uses Playwright for web app testing
- Run with
make test-e2e - Tests automatically build the applications before running
packages/creator-hub/e2e/ # Creator Hub E2E tests
packages/inspector/test/e2e/ # Inspector E2E tests
-
Start Development:
make init # Initial setup cd packages/creator-hub npm run start # Start creator hub in watch mode
-
In another terminal:
cd packages/inspector npm run start # Start inspector in watch mode
-
Before Committing:
- Lint, format & typecheck will be run automatically
To develop with local asset-packs integration (for testing new assets or Smart Items):
-
Initial setup:
make init # Sets up entire monorepo -
Start asset-packs SDK7 dev server:
cd packages/asset-packs npm run start # Starts SDK7 server on port 8001
-
In another terminal, start docker content server:
cd packages/asset-packs docker-compose up # Starts content server on port 9000
-
In another terminal, upload assets to local content server:
cd packages/asset-packs npm run upload # Uploads assets to http://localhost:9000
-
In another terminal, start inspector dev server:
cd packages/inspector npm start # Starts on port 8000
-
In another terminal, start Creator Hub:
cd packages/creator-hub cp .env.example .env # First time only # Edit .env and update VITE_ASSET_PACKS_JS_PATH with your absolute path npm start # Starts on default port
-
Configure environment variables in
packages/creator-hub/.env:VITE_INSPECTOR_PORT=8000 VITE_ASSET_PACKS_CONTENT_URL=http://localhost:9000/asset-packs VITE_ASSET_PACKS_JS_PORT=8001 VITE_ASSET_PACKS_JS_PATH=/absolute/path/to/creators-hub/packages/asset-packs/bin/index.js
Now Creator Hub will use:
- Local inspector on port 8000
- Local asset-packs SDK7 runtime on port 8001
- Local content server for assets on port 9000
For inspector-only development with local asset-packs, see Inspector README.
To launch build locally on macOS, you may need to remove quarantine attributes:
xattr -c /Applications/Decentraland\ Creator\ Hub.app/Note: This command is necessary on macOS to bypass Gatekeeper when running locally built versions. This issue doesn't occur with officially signed releases.
- ESLint - Code linting with custom rules
- Prettier - Code formatting
- TypeScript - Static type checking
- syncpack - Dependency synchronization
- Automatically published to npm on main branch
- Assets uploaded to prod S3 CDN on main branch
- PR builds available for testing (npm package only)
- Dev CDN uploads: Triggered manually by org members commenting
/upload-assetson PRs - GitHub Releases: Always marked as pre-releases to avoid confusion with electron-updater
- Automatically published to npm on main branch
- PR builds available for testing
- GitHub Pages deployment for web previews
- GitHub Releases: Always marked as pre-releases to avoid confusion with electron-updater
- Multi-platform builds (macOS, Windows)
- Code signed and notarized
- Distributed via GitHub releases and S3
- PR builds available for testing
- GitHub Releases: Always marked as pre-releases for later manual release when updated to "latest"
The project uses a specific release strategy to ensure electron-updater works correctly:
- Creator Hub releases are created as pre-release and when ready, they should be marked as "latest" on GitHub, allowing the Electron app to automatically detect and download updates
- Other packages (Asset Packs, Inspector) are ALWAYS marked as pre-releases to prevent electron-updater from accidentally downloading the wrong package type
- This separation ensures that users only get Creator Hub app updates through the auto-update mechanism
Asset Packs follows a controlled deployment model:
Production CDN:
- Every merge to
mainautomatically uploads assets to prod S3 CDN - Prod CDN:
https://builder-items.decentraland.org/contents/:hash - Assets are immediately available after merging, matching the npm package release cycle
Development CDN:
- Dev uploads are triggered manually by commenting
/upload-assetson a PR - Only organization members can trigger uploads
- Dev CDN:
https://builder-items.decentraland.zone/contents/:hash - This prevents conflicts between multiple PRs and reduces unnecessary CI runs
- Assets are content-addressed (hashed), ensuring immutability and cache correctness
If you encounter errors about ports already in use:
# Check what's using a port (macOS/Linux)
lsof -i :8000 # Inspector default port
lsof -i :8001 # Asset packs dev server
lsof -i :9000 # Content server
# On Windows (PowerShell)
netstat -ano | findstr :8000Solution: Either stop the conflicting process or configure different ports via environment variables.
macOS Gatekeeper Issues:
xattr -c /Applications/Decentraland\ Creator\ Hub.app/npm Permission Errors:
# Don't use sudo! Instead, fix npm permissions:
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
# Add to PATH: export PATH=~/.npm-global/bin:$PATHClean and Rebuild:
make deep-clean # Remove all node_modules and build artifacts
make init # Fresh install and buildProtocol Buffer Issues:
make install-protoc # Reinstall protoc
make protoc # Regenerate proto filesNode Version Mismatch:
node --version # Should be 22.x or higherUse nvm to manage Node.js versions:
nvm install 22
nvm use 22Docker Not Running:
# Ensure Docker Desktop is running
docker ps # Should list containers without errorPort 9000 Already in Use:
# Change the port in docker-compose.yml or stop the conflicting service
docker-compose downInspector Not Loading:
- Verify WebSocket URL is correct
- Check browser console for errors
- Ensure CLI server is running with
--data-layerflag
Asset Packs Not Showing:
- Verify
VITE_ASSET_PACKS_CONTENT_URLis set correctly - Check that assets were uploaded to the content server
- Clear browser cache
Hot Reload Not Working:
# Restart the development server
# If using multiple terminals, restart all dev serversType Errors After Update:
make typecheck # Check all packages
npm run typecheck --workspace=packages/inspector # Specific packageMissing Types:
npm install --save-dev @types/package-nameIf you're still experiencing issues:
- Search Existing Issues: GitHub Issues
- Ask the Community: Decentraland Discord
- Create a New Issue: Use our bug report template
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
For detailed contribution guidelines, see CONTRIBUTING.md.
The CI pipeline will automatically:
- Lint, format & typecheck
- Run all tests
- Build all packages
- Provide testing artifacts for review
- Deploy preview versions
- Asset Packs Documentation
- Inspector Documentation
- Creator Hub Documentation
- Contributing Guidelines
- Decentraland Documentation
This monorepo contains multiple packages with different licenses:
- Root & Creator Hub: MIT License
- @dcl/inspector: Apache License 2.0
- @dcl/asset-packs: ISC License
See individual package directories for specific license details.
Made with β€οΈ by the Decentraland community