Step 1: Fork and Clone
Start by forking the repository on GitHub, then clone your fork:Set Up Upstream Remote
Set up the upstream remote to stay in sync with the original repo:dev branch locally and start from it:
Why upstream? This ensures you’re always branching from the latest
dev on the original repo, not a potentially stale dev on your fork.Step 2: Create Your Ability Branch
Branch offdev (not main):
add-dad-jokesadd-pomodoro-timerfix-weather-error-handling
Step 3: Pick a Template
Choose the template closest to what you’re building:| Template | Use When |
|---|---|
templates/basic-template/ | Simple ask → respond → done |
templates/api-template/ | You’re calling an external API |
templates/loop-template/ | Interactive / multi-turn conversation |
Step 4: Build Your Ability
Editmain.py in your new folder. Every ability must:
Implement register_capability()
Copy the boilerplate exactly from the template - this reads the platform-managed
config.jsonTrigger words are configured in the OpenHome dashboard, not in code. The
register_capability boilerplate reads a platform-managed config.json at runtime - you never create or edit that file.Key Resources
- CapabilityWorker Reference - All available functions (
speak,user_response,run_io_loop, file helpers, audio helpers, etc.) - Building Great Abilities - Best practices and patterns
Step 5: Write Your README
Createcommunity/your-ability-name/README.md with this structure:
Step 6: Test It
Before submitting, thoroughly test your ability:Upload to Live Editor
Go to app.openhome.com → Abilities → Add Custom Ability
Step 7: Sync with Dev Before Submitting
Before you push, make sure your branch is current with the latestdev from upstream:
Step 8: Submit Your PR
Commit and push your changes:- Base branch:
dev(notmain) - Compare branch:
add-your-ability-name - Fill out the PR template completely
What Happens After You Submit
Feedback round
You may be asked to make changes. Push additional commits to the same branch - the PR updates automatically
You don’t need to do anything after step 4. The
dev → main promotion is handled by maintainers.PR Requirements Summary
Your PR must include:- All files in
community/your-ability-name/(not inofficial/) -
main.pyfollowing the SDK pattern -
README.mdwith complete documentation - PR targeting
devbranch - All automated checks passing
Common Issues and Fixes
PR checks failing
PR checks failing
Check the automated check output for specific errors. Common issues:
- Blocked imports detected
- Missing
resume_normal_flow()calls - Using
print()instead ofeditor_logging_handler - Files in wrong directory
Merge conflicts with dev
Merge conflicts with dev
Sync your branch with upstream dev:
Accidentally targeted main
Accidentally targeted main
Close the PR and create a new one targeting
dev. Or change the base branch in the PR settings (top of the PR page).Test uploads not working
Test uploads not working
- Ensure your zip includes the root folder
- Check that
main.pyhas no syntax errors - Verify trigger words are configured in dashboard
- Check logs in the Live Editor for errors
Need Help?
If you get stuck at any point:- Ask in Discord for quick help
- Check the SDK Reference
- Look at existing abilities in
community/for examples - Open an issue if you think you’ve found a bug
