Local Development
1. File Structure
Your ability should have at minimum:The platform automatically generates
config.json at runtime based on your trigger words. You never need to create or edit it manually.2. Code Validation
Before uploading, verify your code locally:Check imports
Make sure all imports are available in the OpenHome sandbox:The OpenHome sandbox has restricted package access for security.
Packaging and Upload
Creating the ZIP File
Uploading to OpenHome
Navigate to Abilities
Go to app.openhome.com and click Abilities in the sidebar.
Configure metadata
Fill in:
- Name: Display name for your ability
- Description: What it does
- Trigger words: Phrases that activate it (e.g., “send email”, “check weather”)
Testing in Live Editor
The Live Editor lets you test and debug abilities in real-time.Opening Live Editor
- Go to Abilities → find your ability
- Click Live Editor
- You’ll see your code and a test interface
Testing Workflow
Trigger the ability
Say one of your trigger words to activate it. The system will route to your ability.
Testing Trigger Words
How Trigger Words Work
OpenHome uses two routing mechanisms:- Exact hotword matching: User says exact trigger phrase → ability activates
- LLM routing: Brain analyzes intent and routes to best ability
Example: Trigger word matching
Example: Trigger word matching
If your trigger words are:
- “send email”
- “email someone”
- “Hey, send email” ✅
- “I need to email someone” ✅
- “Can you help me send an email?” ✅ (LLM routing)
- “Check my inbox” ❌ (unless LLM routes it)
- “Mail something” ❌ (no keyword match)
Best Practices for Trigger Words
Use natural phrases
Write how people actually speak:
- ✅ “set an alarm”, “wake me up at”
- ❌ “alarm.set”, “execute_alarm_capability”
Add variations
Include different ways to say the same thing:
- “play music”
- “start playing a song”
- “I want to listen to music”
Debugging Common Issues
Ability Never Activates
Check trigger words
Check trigger words
Make sure your trigger words are set correctly:
- Go to Abilities → Your Ability → Edit
- Check the “Trigger Words” field
- Try more explicit phrases
Check agent configuration
Check agent configuration
Make sure the ability is enabled for your agent:
- Go to Agents → Your Agent → Edit
- Check that your ability is in the enabled abilities list
Ability Activates but Fails Silently
Check logs
Check logs
Open Live Editor and check logs for errors:
Verify resume_normal_flow()
Verify resume_normal_flow()
If the agent stops responding after your ability runs, you likely forgot:
Check async/await
Check async/await
Make sure all SDK calls use
await:Audio Doesn’t Play
Check file paths
Check file paths
Audio files must be in your ZIP and referenced correctly:
Verify file format
Verify file format
Supported formats: MP3, WAV, OGG
API Calls Fail
Check network access
Check network access
Make sure the API is accessible from the cloud sandbox. Local APIs won’t work unless you use
exec_local_command().Add error handling
Add error handling
Daemon Never Starts
Check file name
Check file name
Background daemons must be in a file named
watcher.py.Check call() signature
Check call() signature
Check while loop
Check while loop
Daemons should run in an infinite loop:
Production Testing
Test with Real Users
Once you’ve validated in Live Editor:Performance Testing
Response Time
- Target: Abilities should respond within 2-3 seconds
- Test: Use logging to measure execution time:
Memory Usage
- Avoid loading large datasets into memory
- Stream large API responses
- Clean up resources in
finallyblocks
Testing Checklist
Code validation
- All SDK calls use
await -
resume_normal_flow()called in Skills - No
resume_normal_flow()in daemons - Proper error handling
- Logging added for debugging
Live Editor testing
- Ability activates on trigger words
- Logs show expected behavior
- No silent failures
- Audio plays correctly (if applicable)
Next Steps
Best Practices
Learn voice UX and security best practices
Common Patterns
Reusable patterns for common tasks
SDK Reference
Complete CapabilityWorker documentation
Best Practices
Voice UX, error handling, and security guidelines
