Appearance
Publishing Guide
This guide covers how to publish your extension to the BluePLM Extension Store at extensions.blueplm.io.
Prerequisites
Before publishing:
- ✅ Extension is fully tested
- ✅ Package builds successfully
- ✅ README.md with clear documentation
- ✅ Open source license included
- ✅ Repository URL in manifest
- ✅ Icon (128×128 PNG) included
Publishing Flow
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 1. Register as │────▶│ 2. Submit │────▶│ 3. Review │
│ Publisher │ │ Extension │ │ Process │
└─────────────────┘ └─────────────────┘ └────────┬────────┘
│
┌─────────────────┐ │
│ 4. Published! │◀─────────────┘
│ (Community) │
└─────────────────┘
│
│ Optional
▼
┌─────────────────┐
│ 5. Verification │
│ (Verified) │
└─────────────────┘Step 1: Register as Publisher
Create Publisher Account
- Go to extensions.blueplm.io/submit
- Click "Register as Publisher"
- Fill in publisher details:
- Name: Your company or individual name
- Slug: Unique identifier (lowercase, hyphens allowed)
- Website: Your website URL
- Logo: Publisher logo (optional)
- Verify your email
- Accept the Publisher Agreement
Publisher Slug
Your publisher slug must:
- Be unique across all publishers
- Match the prefix of your extension IDs
- Be lowercase with letters, numbers, and hyphens
Example:
- Publisher slug:
mycompany - Extension ID:
mycompany.my-extension
Step 2: Submit Extension
Via Web Interface
- Log in to extensions.blueplm.io
- Go to Publisher Dashboard
- Click "Submit New Extension"
- Upload your
.bpxfile - Fill in additional details:
- Description (shown in store)
- Categories
- Screenshots (optional)
- Review and submit
Via CLI (if available)
bash
# Login
blueplm-ext login
# Publish
blueplm-ext publish my-extension-1.0.0.bpxSubmission Requirements
| Requirement | Description |
|---|---|
| Valid manifest | Must pass schema validation |
| License | OSI-approved open source license |
| Repository | Public repository URL |
| Unique ID | Not already taken |
| Size | Under 10 MB |
| Working code | Must not crash on load |
Step 3: Review Process
Community Extensions
Community extensions undergo basic automated checks:
- Schema validation — Manifest is valid
- Security scan — No obvious malware patterns
- Package integrity — Files are complete
- License check — Valid OSI license
Timeline: Usually published within 24 hours.
What's Checked
- Manifest validity
- Required files present
- License is open source
- No obvious security issues
- Package under size limit
Rejection Reasons
Your extension may be rejected if:
- ❌ Invalid or missing manifest
- ❌ No LICENSE file
- ❌ Non-open-source license
- ❌ Malicious code detected
- ❌ Publisher ID mismatch
- ❌ Duplicate extension ID
You'll receive an email with rejection details.
Step 4: After Publishing
Extension is Live
Once published:
- Extension appears in the store
- Badge shows "Community" (yellow warning icon)
- Users can install with one click
- Analytics tracking begins
Update Your Extension
To publish updates:
- Bump version in
extension.json - Build new
.bpxfile - Submit via dashboard or CLI
- Previous version remains available for rollback
json
// extension.json
{
"version": "1.1.0" // Bumped from 1.0.0
}Version Semantics
| Change Type | Version Bump | Example |
|---|---|---|
| Bug fix | Patch | 1.0.0 → 1.0.1 |
| New feature | Minor | 1.0.0 → 1.1.0 |
| Breaking change | Major | 1.0.0 → 2.0.0 |
Automated Releases with GitHub Actions
Automate your release process with GitHub Actions. When you push a tag, the workflow builds, packages, and creates a GitHub Release automatically.
Create .github/workflows/release.yml:
yaml
name: Build and Release
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Type check
run: npm run typecheck
- name: Build extension
run: npm run build
- name: Package extension (.bpx)
run: npm run package
- name: Get version from tag
id: get_version
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- name: Extract changelog for version
id: changelog
run: |
VERSION="${GITHUB_REF#refs/tags/v}"
CHANGELOG=$(awk "/^## \[${VERSION}\]/{flag=1; next} /^## \[/{flag=0} flag" CHANGELOG.md)
echo "CHANGELOG<<EOF" >> $GITHUB_OUTPUT
echo "$CHANGELOG" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Create Release
uses: softprops/action-gh-release@v2
with:
name: ${{ steps.get_version.outputs.VERSION }}
body: ${{ steps.changelog.outputs.CHANGELOG }}
draft: false
prerelease: ${{ contains(github.ref, '-beta') || contains(github.ref, '-alpha') || contains(github.ref, '-rc') }}
files: |
*.bpx
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Create .github/workflows/ci.yml for PRs:
yaml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run typecheck
- run: npm run build
- run: npm run package
- run: ls -la *.bpxRelease workflow:
- Update version in
package.jsonandextension.json - Update
CHANGELOG.mdwith release notes - Commit:
git commit -am "Release v1.0.0" - Tag and push:
git tag v1.0.0 && git push origin main --tags - GitHub Action creates the release automatically
Pre-releases: Tags containing -alpha, -beta, or -rc are marked as pre-releases.
Step 5: Verification (Optional)
Verified extensions have a blue checkmark and are trusted by Blue Robotics.
Benefits of Verification
| Benefit | Description |
|---|---|
| Trust badge | Blue checkmark in store |
| Featured eligibility | Can be featured on homepage |
| Native extensions | Required for native category |
| Priority support | Direct support channel |
Verification Requirements
- Code review — Full code audit by Blue Robotics
- Security audit — No vulnerabilities
- Quality standards — Best practices followed
- Documentation — Complete user documentation
- Maintenance — Commitment to ongoing updates
Request Verification
- Email [email protected]
- Include:
- Extension ID
- Repository URL
- Description of functionality
- Your contact information
- Wait for review (typically 1-2 weeks)
Verification Process
- Initial review — Blue Robotics reviews request
- Code audit — Security and quality review
- Testing — Full functionality testing
- Signing — Extension signed with Ed25519
- Published — Badge updated to Verified
Deprecating Extensions
If you need to deprecate an extension:
Mark as Deprecated
- Go to Publisher Dashboard
- Select extension
- Click "Deprecate"
- Provide:
- Reason for deprecation
- Replacement extension (if any)
- Sunset date (when it will be removed)
What Happens
- Warning badge shown in store
- Existing users notified
- New installs show warning
- After sunset date: removed from store
Deprecation Notice
json
{
"deprecated": true,
"deprecationReason": "Replaced by new-extension",
"replacementId": "mycompany.new-extension",
"sunsetDate": "2024-12-31"
}Analytics
Available Metrics
| Metric | Description |
|---|---|
| Installs | Total installation count |
| Active users | Users with extension enabled |
| Uninstalls | Removal count |
| Version distribution | Users per version |
Accessing Analytics
- Go to Publisher Dashboard
- Select extension
- View Analytics tab
Using Analytics
- Track adoption over time
- Identify popular versions
- Monitor uninstall rate
- Plan deprecation timing
Best Practices
Before Publishing
- Test thoroughly — Sideload and test all features
- Write documentation — Clear README with examples
- Add screenshots — Show your extension in action
- Check permissions — Only request what's needed
- Review manifest — Ensure all fields are complete
Maintaining Published Extensions
- Monitor issues — Watch GitHub issues
- Respond to reports — Handle abuse reports promptly
- Update regularly — Security and compatibility updates
- Communicate changes — Use CHANGELOG
Version Management
- Semantic versioning — Follow semver strictly
- Keep changelog — Document all changes
- Breaking changes — Major version + migration guide
- Rollback support — Previous versions available
Troubleshooting
Submission Rejected
"Invalid manifest"
- Run schema validation locally
- Check all required fields
- Ensure ID matches publisher
"License not valid"
- Use OSI-approved license
- Include full LICENSE file
- Match license field in manifest
"Repository required"
- Add public repository URL
- Ensure repository is accessible
Upload Fails
"Package too large"
- Maximum 10 MB
- Minify code
- Exclude unnecessary files
"Invalid package format"
- Must be valid ZIP
- extension.json at root
- Check file structure
Extension Not Showing
- Allow up to 24 hours for processing
- Check email for rejection notice
- Verify publisher account is active
Support
Getting Help
- Documentation: You're reading it!
- GitHub Issues: bluerobotics/bluePLM
- Email: [email protected]
Reporting Issues
For store/publishing issues:
- Check this guide first
- Search existing GitHub issues
- Create new issue with:
- Extension ID
- Error message
- Steps to reproduce