Repository files navigation

OpenHome Abilities

Open-source voice AI plugins for OpenHome — build, share, and remix.

DashboardDocsDiscord

LicensePython

StarsForksContributorsIssues

---

What Are Abilities?

Abilities are modular voice AI plugins that extend what OpenHome Agents can do. They're triggered by spoken phrases and can do anything — call APIs, play audio, run quizzes, control devices, have multi-turn conversations.

Each Ability is just one file: main.py — your Python logic.

Write your code, zip it, upload it to OpenHome, set your trigger words in the dashboard, and your Agent can do something new.


Quick Start — Your First Ability in 5 Minutes

1. Pick a template

git clone https://github.com/openhome-dev/abilities.git
cp -r abilities/templates/basic-template my-first-ability

2. Edit main.py — here's the simplest possible Ability:

importjsonfromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None# Do not change following tag of register capability#{{register capability}}defcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! Tell me what's on your mind.")
user_input=awaitself.capability_worker.user_response()
response=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(response)
self.capability_worker.resume_normal_flow()

Note: The #{{register_capability}} This line is required boilerplate — copy it exactly. The platform handles config.json automatically; you never need to create or edit it.

3. Upload to OpenHome

  • Zip your folder
  • Go to app.openhome.com → Abilities → Add Custom Ability
  • Upload the zip
  • Set your trigger words in the dashboard (the phrases that activate your Ability)
  • Test it in the Live Editor

4. Trigger it — Say one of your trigger words in a conversation and your Ability takes over.

📖 Full guide:docs/getting-started.md


🔷 Official Abilities

Maintained by the OpenHome team. Tested, stable, and supported.

AbilityDescriptionExample TriggersAPI RequiredDocs
Audius Music DJStream & DJ music from Audius"play something on audius", "dj mode"AudiusREADME
Basic AdvisorDaily life advice"give me advice", "help me"NoneREADME
Date and TimeCurrent date & time info"what time is it", "what's today's date"NoneREADME
Music PlayerPlay music from URL or file"play music", "play a song"NoneREADME
Perplexity Web SearchAI-powered web search"search the web", "look this up"PerplexityREADME
Quiz GameAI-generated trivia"start a quiz", "quiz me"NoneREADME
Sound GeneratorAI sound effects"make a sound", "create a sound"ElevenLabsREADME
WeatherCurrent weather by location"what's the weather"NoneREADME

Trigger words are configured in the OpenHome dashboard when you install an Ability, not in the code.


🔶 Community Abilities

Built by the community. Reviewed for security and SDK compliance before merging.

AbilityDescriptionAuthorAPI Required
Your Ability hereContribute one →

Note: Community Abilities are reviewed for security and SDK compliance. OpenHome does not guarantee ongoing maintenance. See Contributing for details.


📁 Starter Templates

Don't start from scratch — grab a template:

TemplateBest ForPattern
BasicFirst-timersSpeak → Listen → Respond → Exit
APIAPI integrationsSpeak → Call API → Speak result → Exit
LoopInteractive appsLoop with listen → process → respond → exit command
OpenclawOpenClaw integrationsOpenClaw-based ability scaffold
OpenHome LocalLocal developmentRun & test abilities locally
ReadWriteFileFile operationsRead from / write to files on device
SendEmailEmail notificationsCompose & send emails programmatically
AlarmTimers & alarmsBackground mode: continuous monitoring loop
BackgroundBackground monitoringAuto-start → Monitor → Act → Sleep → Repeat (endless)

🤝 Contributing

We welcome community Abilities! Here's the short version:

  1. Fork this repo
  2. Copy a template into community/your-ability-name/
  3. Build your Ability
  4. Open a Pull Request

Full guide:CONTRIBUTING.md

First time? Look for issues labeled good-first-issue.


🏆 Community → Official Promotion

Exceptional community Abilities can be promoted to Official status. We look for:

  • Stability — No critical bugs for 30+ days
  • Quality — Clean code, good voice UX
  • Maintenance — Author is responsive

When promoted, the Ability moves to official/, gets the blue badge on Marketplace, and the author is credited permanently. Learn more →


📖 Documentation

DocDescription
Getting StartedBuild your first Ability in 5 minutes
CapabilityWorkerFull SDK reference
Patterns CookbookCommon patterns with code examples
Publishing to MarketplaceHow to ship your Ability to users
Promotion PathHow community Abilities become official
OpenHome SDK ReferenceComplete guide to SDK
Building Great OpenHome AbilitiesGuide to buil great OpenHome abilities

📜 License

This project is licensed under the MIT License.

All contributions to community/ are licensed under the same terms. By submitting a PR, you agree to these terms. Original authorship is always credited.

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

OpenHome Abilities

Open-source voice AI plugins for OpenHome — build, share, and remix.

DashboardDocsDiscord

LicensePython

StarsForksContributorsIssues

---

What Are Abilities?

Abilities are modular voice AI plugins that extend what OpenHome Agents can do. They're triggered by spoken phrases and can do anything — call APIs, play audio, run quizzes, control devices, have multi-turn conversations.

Each Ability is just one file: main.py — your Python logic.

Write your code, zip it, upload it to OpenHome, set your trigger words in the dashboard, and your Agent can do something new.


Quick Start — Your First Ability in 5 Minutes

1. Pick a template

git clone https://github.com/openhome-dev/abilities.git
cp -r abilities/templates/basic-template my-first-ability

2. Edit main.py — here's the simplest possible Ability:

importjsonfromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None# Do not change following tag of register capability#{{register capability}}defcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! Tell me what's on your mind.")
user_input=awaitself.capability_worker.user_response()
response=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(response)
self.capability_worker.resume_normal_flow()

Note: The #{{register_capability}} This line is required boilerplate — copy it exactly. The platform handles config.json automatically; you never need to create or edit it.

3. Upload to OpenHome

  • Zip your folder
  • Go to app.openhome.com → Abilities → Add Custom Ability
  • Upload the zip
  • Set your trigger words in the dashboard (the phrases that activate your Ability)
  • Test it in the Live Editor

4. Trigger it — Say one of your trigger words in a conversation and your Ability takes over.

📖 Full guide:docs/getting-started.md


🔷 Official Abilities

Maintained by the OpenHome team. Tested, stable, and supported.

AbilityDescriptionExample TriggersAPI RequiredDocs
Audius Music DJStream & DJ music from Audius"play something on audius", "dj mode"AudiusREADME
Basic AdvisorDaily life advice"give me advice", "help me"NoneREADME
Date and TimeCurrent date & time info"what time is it", "what's today's date"NoneREADME
Music PlayerPlay music from URL or file"play music", "play a song"NoneREADME
Perplexity Web SearchAI-powered web search"search the web", "look this up"PerplexityREADME
Quiz GameAI-generated trivia"start a quiz", "quiz me"NoneREADME
Sound GeneratorAI sound effects"make a sound", "create a sound"ElevenLabsREADME
WeatherCurrent weather by location"what's the weather"NoneREADME

Trigger words are configured in the OpenHome dashboard when you install an Ability, not in the code.


🔶 Community Abilities

Built by the community. Reviewed for security and SDK compliance before merging.

AbilityDescriptionAuthorAPI Required
Your Ability hereContribute one →

Note: Community Abilities are reviewed for security and SDK compliance. OpenHome does not guarantee ongoing maintenance. See Contributing for details.


📁 Starter Templates

Don't start from scratch — grab a template:

TemplateBest ForPattern
BasicFirst-timersSpeak → Listen → Respond → Exit
APIAPI integrationsSpeak → Call API → Speak result → Exit
LoopInteractive appsLoop with listen → process → respond → exit command
OpenclawOpenClaw integrationsOpenClaw-based ability scaffold
OpenHome LocalLocal developmentRun & test abilities locally
ReadWriteFileFile operationsRead from / write to files on device
SendEmailEmail notificationsCompose & send emails programmatically
AlarmTimers & alarmsBackground mode: continuous monitoring loop
BackgroundBackground monitoringAuto-start → Monitor → Act → Sleep → Repeat (endless)

🤝 Contributing

We welcome community Abilities! Here's the short version:

  1. Fork this repo
  2. Copy a template into community/your-ability-name/
  3. Build your Ability
  4. Open a Pull Request

Full guide:CONTRIBUTING.md

First time? Look for issues labeled good-first-issue.


🏆 Community → Official Promotion

Exceptional community Abilities can be promoted to Official status. We look for:

  • Stability — No critical bugs for 30+ days
  • Quality — Clean code, good voice UX
  • Maintenance — Author is responsive

When promoted, the Ability moves to official/, gets the blue badge on Marketplace, and the author is credited permanently. Learn more →


📖 Documentation

DocDescription
Getting StartedBuild your first Ability in 5 minutes
CapabilityWorkerFull SDK reference
Patterns CookbookCommon patterns with code examples
Publishing to MarketplaceHow to ship your Ability to users
Promotion PathHow community Abilities become official
OpenHome SDK ReferenceComplete guide to SDK
Building Great OpenHome AbilitiesGuide to buil great OpenHome abilities

📜 License

This project is licensed under the MIT License.

All contributions to community/ are licensed under the same terms. By submitting a PR, you agree to these terms. Original authorship is always credited.

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenHome Abilities

Open-source voice AI plugins for OpenHome — build, share, and remix.

DashboardDocsDiscord

LicensePython

StarsForksContributorsIssues

---

What Are Abilities?

Abilities are modular voice AI plugins that extend what OpenHome Agents can do. They're triggered by spoken phrases and can do anything — call APIs, play audio, run quizzes, control devices, have multi-turn conversations.

Each Ability is just one file: main.py — your Python logic.

Write your code, zip it, upload it to OpenHome, set your trigger words in the dashboard, and your Agent can do something new.


Quick Start — Your First Ability in 5 Minutes

1. Pick a template

git clone https://github.com/openhome-dev/abilities.git
cp -r abilities/templates/basic-template my-first-ability

2. Edit main.py — here's the simplest possible Ability:

importjsonfromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None# Do not change following tag of register capability#{{register capability}}defcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! Tell me what's on your mind.")
user_input=awaitself.capability_worker.user_response()
response=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(response)
self.capability_worker.resume_normal_flow()

Note: The #{{register_capability}} This line is required boilerplate — copy it exactly. The platform handles config.json automatically; you never need to create or edit it.

3. Upload to OpenHome

  • Zip your folder
  • Go to app.openhome.com → Abilities → Add Custom Ability
  • Upload the zip
  • Set your trigger words in the dashboard (the phrases that activate your Ability)
  • Test it in the Live Editor

4. Trigger it — Say one of your trigger words in a conversation and your Ability takes over.

📖 Full guide:docs/getting-started.md


🔷 Official Abilities

Maintained by the OpenHome team. Tested, stable, and supported.

AbilityDescriptionExample TriggersAPI RequiredDocs
Audius Music DJStream & DJ music from Audius"play something on audius", "dj mode"AudiusREADME
Basic AdvisorDaily life advice"give me advice", "help me"NoneREADME
Date and TimeCurrent date & time info"what time is it", "what's today's date"NoneREADME
Music PlayerPlay music from URL or file"play music", "play a song"NoneREADME
Perplexity Web SearchAI-powered web search"search the web", "look this up"PerplexityREADME
Quiz GameAI-generated trivia"start a quiz", "quiz me"NoneREADME
Sound GeneratorAI sound effects"make a sound", "create a sound"ElevenLabsREADME
WeatherCurrent weather by location"what's the weather"NoneREADME

Trigger words are configured in the OpenHome dashboard when you install an Ability, not in the code.


🔶 Community Abilities

Built by the community. Reviewed for security and SDK compliance before merging.

AbilityDescriptionAuthorAPI Required
Your Ability hereContribute one →

Note: Community Abilities are reviewed for security and SDK compliance. OpenHome does not guarantee ongoing maintenance. See Contributing for details.


📁 Starter Templates

Don't start from scratch — grab a template:

TemplateBest ForPattern
BasicFirst-timersSpeak → Listen → Respond → Exit
APIAPI integrationsSpeak → Call API → Speak result → Exit
LoopInteractive appsLoop with listen → process → respond → exit command
OpenclawOpenClaw integrationsOpenClaw-based ability scaffold
OpenHome LocalLocal developmentRun & test abilities locally
ReadWriteFileFile operationsRead from / write to files on device
SendEmailEmail notificationsCompose & send emails programmatically
AlarmTimers & alarmsBackground mode: continuous monitoring loop
BackgroundBackground monitoringAuto-start → Monitor → Act → Sleep → Repeat (endless)

🤝 Contributing

We welcome community Abilities! Here's the short version:

  1. Fork this repo
  2. Copy a template into community/your-ability-name/
  3. Build your Ability
  4. Open a Pull Request

Full guide:CONTRIBUTING.md

First time? Look for issues labeled good-first-issue.


🏆 Community → Official Promotion

Exceptional community Abilities can be promoted to Official status. We look for:

  • Stability — No critical bugs for 30+ days
  • Quality — Clean code, good voice UX
  • Maintenance — Author is responsive

When promoted, the Ability moves to official/, gets the blue badge on Marketplace, and the author is credited permanently. Learn more →


📖 Documentation

DocDescription
Getting StartedBuild your first Ability in 5 minutes
CapabilityWorkerFull SDK reference
Patterns CookbookCommon patterns with code examples
Publishing to MarketplaceHow to ship your Ability to users
Promotion PathHow community Abilities become official
OpenHome SDK ReferenceComplete guide to SDK
Building Great OpenHome AbilitiesGuide to buil great OpenHome abilities

📜 License

This project is licensed under the MIT License.

All contributions to community/ are licensed under the same terms. By submitting a PR, you agree to these terms. Original authorship is always credited.

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenHome Abilities

Open-source voice AI plugins for OpenHome — build, share, and remix.

DashboardDocsDiscord

LicensePython

StarsForksContributorsIssues

---

What Are Abilities?

Abilities are modular voice AI plugins that extend what OpenHome Agents can do. They're triggered by spoken phrases and can do anything — call APIs, play audio, run quizzes, control devices, have multi-turn conversations.

Each Ability is just one file: main.py — your Python logic.

Write your code, zip it, upload it to OpenHome, set your trigger words in the dashboard, and your Agent can do something new.


Quick Start — Your First Ability in 5 Minutes

1. Pick a template

git clone https://github.com/openhome-dev/abilities.git
cp -r abilities/templates/basic-template my-first-ability

2. Edit main.py — here's the simplest possible Ability:

importjsonfromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None# Do not change following tag of register capability#{{register capability}}defcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! Tell me what's on your mind.")
user_input=awaitself.capability_worker.user_response()
response=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(response)
self.capability_worker.resume_normal_flow()

Note: The #{{register_capability}} This line is required boilerplate — copy it exactly. The platform handles config.json automatically; you never need to create or edit it.

3. Upload to OpenHome

  • Zip your folder
  • Go to app.openhome.com → Abilities → Add Custom Ability
  • Upload the zip
  • Set your trigger words in the dashboard (the phrases that activate your Ability)
  • Test it in the Live Editor

4. Trigger it — Say one of your trigger words in a conversation and your Ability takes over.

📖 Full guide:docs/getting-started.md


🔷 Official Abilities

Maintained by the OpenHome team. Tested, stable, and supported.

AbilityDescriptionExample TriggersAPI RequiredDocs
Audius Music DJStream & DJ music from Audius"play something on audius", "dj mode"AudiusREADME
Basic AdvisorDaily life advice"give me advice", "help me"NoneREADME
Date and TimeCurrent date & time info"what time is it", "what's today's date"NoneREADME
Music PlayerPlay music from URL or file"play music", "play a song"NoneREADME
Perplexity Web SearchAI-powered web search"search the web", "look this up"PerplexityREADME
Quiz GameAI-generated trivia"start a quiz", "quiz me"NoneREADME
Sound GeneratorAI sound effects"make a sound", "create a sound"ElevenLabsREADME
WeatherCurrent weather by location"what's the weather"NoneREADME

Trigger words are configured in the OpenHome dashboard when you install an Ability, not in the code.


🔶 Community Abilities

Built by the community. Reviewed for security and SDK compliance before merging.

AbilityDescriptionAuthorAPI Required
Your Ability hereContribute one →

Note: Community Abilities are reviewed for security and SDK compliance. OpenHome does not guarantee ongoing maintenance. See Contributing for details.


📁 Starter Templates

Don't start from scratch — grab a template:

TemplateBest ForPattern
BasicFirst-timersSpeak → Listen → Respond → Exit
APIAPI integrationsSpeak → Call API → Speak result → Exit
LoopInteractive appsLoop with listen → process → respond → exit command
OpenclawOpenClaw integrationsOpenClaw-based ability scaffold
OpenHome LocalLocal developmentRun & test abilities locally
ReadWriteFileFile operationsRead from / write to files on device
SendEmailEmail notificationsCompose & send emails programmatically
AlarmTimers & alarmsBackground mode: continuous monitoring loop
BackgroundBackground monitoringAuto-start → Monitor → Act → Sleep → Repeat (endless)

🤝 Contributing

We welcome community Abilities! Here's the short version:

  1. Fork this repo
  2. Copy a template into community/your-ability-name/
  3. Build your Ability
  4. Open a Pull Request

Full guide:CONTRIBUTING.md

First time? Look for issues labeled good-first-issue.


🏆 Community → Official Promotion

Exceptional community Abilities can be promoted to Official status. We look for:

  • Stability — No critical bugs for 30+ days
  • Quality — Clean code, good voice UX
  • Maintenance — Author is responsive

When promoted, the Ability moves to official/, gets the blue badge on Marketplace, and the author is credited permanently. Learn more →


📖 Documentation

DocDescription
Getting StartedBuild your first Ability in 5 minutes
CapabilityWorkerFull SDK reference
Patterns CookbookCommon patterns with code examples
Publishing to MarketplaceHow to ship your Ability to users
Promotion PathHow community Abilities become official
OpenHome SDK ReferenceComplete guide to SDK
Building Great OpenHome AbilitiesGuide to buil great OpenHome abilities

📜 License

This project is licensed under the MIT License.

All contributions to community/ are licensed under the same terms. By submitting a PR, you agree to these terms. Original authorship is always credited.

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

OpenHome Abilities

Open-source voice AI plugins for OpenHome — build, share, and remix.

DashboardDocsDiscord

LicensePython

StarsForksContributorsIssues

---

What Are Abilities?

Abilities are modular voice AI plugins that extend what OpenHome Agents can do. They're triggered by spoken phrases and can do anything — call APIs, play audio, run quizzes, control devices, have multi-turn conversations.

Each Ability is just one file: main.py — your Python logic.

Write your code, zip it, upload it to OpenHome, set your trigger words in the dashboard, and your Agent can do something new.


Quick Start — Your First Ability in 5 Minutes

1. Pick a template

git clone https://github.com/openhome-dev/abilities.git
cp -r abilities/templates/basic-template my-first-ability

2. Edit main.py — here's the simplest possible Ability:

importjsonfromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None# Do not change following tag of register capability#{{register capability}}defcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! Tell me what's on your mind.")
user_input=awaitself.capability_worker.user_response()
response=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(response)
self.capability_worker.resume_normal_flow()

Note: The #{{register_capability}} This line is required boilerplate — copy it exactly. The platform handles config.json automatically; you never need to create or edit it.

3. Upload to OpenHome

  • Zip your folder
  • Go to app.openhome.com → Abilities → Add Custom Ability
  • Upload the zip
  • Set your trigger words in the dashboard (the phrases that activate your Ability)
  • Test it in the Live Editor

4. Trigger it — Say one of your trigger words in a conversation and your Ability takes over.

📖 Full guide:docs/getting-started.md


🔷 Official Abilities

Maintained by the OpenHome team. Tested, stable, and supported.

AbilityDescriptionExample TriggersAPI RequiredDocs
Audius Music DJStream & DJ music from Audius"play something on audius", "dj mode"AudiusREADME
Basic AdvisorDaily life advice"give me advice", "help me"NoneREADME
Date and TimeCurrent date & time info"what time is it", "what's today's date"NoneREADME
Music PlayerPlay music from URL or file"play music", "play a song"NoneREADME
Perplexity Web SearchAI-powered web search"search the web", "look this up"PerplexityREADME
Quiz GameAI-generated trivia"start a quiz", "quiz me"NoneREADME
Sound GeneratorAI sound effects"make a sound", "create a sound"ElevenLabsREADME
WeatherCurrent weather by location"what's the weather"NoneREADME

Trigger words are configured in the OpenHome dashboard when you install an Ability, not in the code.


🔶 Community Abilities

Built by the community. Reviewed for security and SDK compliance before merging.

AbilityDescriptionAuthorAPI Required
Your Ability hereContribute one →

Note: Community Abilities are reviewed for security and SDK compliance. OpenHome does not guarantee ongoing maintenance. See Contributing for details.


📁 Starter Templates

Don't start from scratch — grab a template:

TemplateBest ForPattern
BasicFirst-timersSpeak → Listen → Respond → Exit
APIAPI integrationsSpeak → Call API → Speak result → Exit
LoopInteractive appsLoop with listen → process → respond → exit command
OpenclawOpenClaw integrationsOpenClaw-based ability scaffold
OpenHome LocalLocal developmentRun & test abilities locally
ReadWriteFileFile operationsRead from / write to files on device
SendEmailEmail notificationsCompose & send emails programmatically
AlarmTimers & alarmsBackground mode: continuous monitoring loop
BackgroundBackground monitoringAuto-start → Monitor → Act → Sleep → Repeat (endless)

🤝 Contributing

We welcome community Abilities! Here's the short version:

  1. Fork this repo
  2. Copy a template into community/your-ability-name/
  3. Build your Ability
  4. Open a Pull Request

Full guide:CONTRIBUTING.md

First time? Look for issues labeled good-first-issue.


🏆 Community → Official Promotion

Exceptional community Abilities can be promoted to Official status. We look for:

  • Stability — No critical bugs for 30+ days
  • Quality — Clean code, good voice UX
  • Maintenance — Author is responsive

When promoted, the Ability moves to official/, gets the blue badge on Marketplace, and the author is credited permanently. Learn more →


📖 Documentation

DocDescription
Getting StartedBuild your first Ability in 5 minutes
CapabilityWorkerFull SDK reference
Patterns CookbookCommon patterns with code examples
Publishing to MarketplaceHow to ship your Ability to users
Promotion PathHow community Abilities become official
OpenHome SDK ReferenceComplete guide to SDK
Building Great OpenHome AbilitiesGuide to buil great OpenHome abilities

📜 License

This project is licensed under the MIT License.

All contributions to community/ are licensed under the same terms. By submitting a PR, you agree to these terms. Original authorship is always credited.

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenHome Abilities

Open-source voice AI plugins for OpenHome — build, share, and remix.

DashboardDocsDiscord

LicensePython

StarsForksContributorsIssues

---

What Are Abilities?

Abilities are modular voice AI plugins that extend what OpenHome Agents can do. They're triggered by spoken phrases and can do anything — call APIs, play audio, run quizzes, control devices, have multi-turn conversations.

Each Ability is just one file: main.py — your Python logic.

Write your code, zip it, upload it to OpenHome, set your trigger words in the dashboard, and your Agent can do something new.


Quick Start — Your First Ability in 5 Minutes

1. Pick a template

git clone https://github.com/openhome-dev/abilities.git
cp -r abilities/templates/basic-template my-first-ability

2. Edit main.py — here's the simplest possible Ability:

importjsonfromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None# Do not change following tag of register capability#{{register capability}}defcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! Tell me what's on your mind.")
user_input=awaitself.capability_worker.user_response()
response=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(response)
self.capability_worker.resume_normal_flow()

Note: The #{{register_capability}} This line is required boilerplate — copy it exactly. The platform handles config.json automatically; you never need to create or edit it.

3. Upload to OpenHome

  • Zip your folder
  • Go to app.openhome.com → Abilities → Add Custom Ability
  • Upload the zip
  • Set your trigger words in the dashboard (the phrases that activate your Ability)
  • Test it in the Live Editor

4. Trigger it — Say one of your trigger words in a conversation and your Ability takes over.

📖 Full guide:docs/getting-started.md


🔷 Official Abilities

Maintained by the OpenHome team. Tested, stable, and supported.

AbilityDescriptionExample TriggersAPI RequiredDocs
Audius Music DJStream & DJ music from Audius"play something on audius", "dj mode"AudiusREADME
Basic AdvisorDaily life advice"give me advice", "help me"NoneREADME
Date and TimeCurrent date & time info"what time is it", "what's today's date"NoneREADME
Music PlayerPlay music from URL or file"play music", "play a song"NoneREADME
Perplexity Web SearchAI-powered web search"search the web", "look this up"PerplexityREADME
Quiz GameAI-generated trivia"start a quiz", "quiz me"NoneREADME
Sound GeneratorAI sound effects"make a sound", "create a sound"ElevenLabsREADME
WeatherCurrent weather by location"what's the weather"NoneREADME

Trigger words are configured in the OpenHome dashboard when you install an Ability, not in the code.


🔶 Community Abilities

Built by the community. Reviewed for security and SDK compliance before merging.

AbilityDescriptionAuthorAPI Required
Your Ability hereContribute one →

Note: Community Abilities are reviewed for security and SDK compliance. OpenHome does not guarantee ongoing maintenance. See Contributing for details.


📁 Starter Templates

Don't start from scratch — grab a template:

TemplateBest ForPattern
BasicFirst-timersSpeak → Listen → Respond → Exit
APIAPI integrationsSpeak → Call API → Speak result → Exit
LoopInteractive appsLoop with listen → process → respond → exit command
OpenclawOpenClaw integrationsOpenClaw-based ability scaffold
OpenHome LocalLocal developmentRun & test abilities locally
ReadWriteFileFile operationsRead from / write to files on device
SendEmailEmail notificationsCompose & send emails programmatically
AlarmTimers & alarmsBackground mode: continuous monitoring loop
BackgroundBackground monitoringAuto-start → Monitor → Act → Sleep → Repeat (endless)

🤝 Contributing

We welcome community Abilities! Here's the short version:

  1. Fork this repo
  2. Copy a template into community/your-ability-name/
  3. Build your Ability
  4. Open a Pull Request

Full guide:CONTRIBUTING.md

First time? Look for issues labeled good-first-issue.


🏆 Community → Official Promotion

Exceptional community Abilities can be promoted to Official status. We look for:

  • Stability — No critical bugs for 30+ days
  • Quality — Clean code, good voice UX
  • Maintenance — Author is responsive

When promoted, the Ability moves to official/, gets the blue badge on Marketplace, and the author is credited permanently. Learn more →


📖 Documentation

DocDescription
Getting StartedBuild your first Ability in 5 minutes
CapabilityWorkerFull SDK reference
Patterns CookbookCommon patterns with code examples
Publishing to MarketplaceHow to ship your Ability to users
Promotion PathHow community Abilities become official
OpenHome SDK ReferenceComplete guide to SDK
Building Great OpenHome AbilitiesGuide to buil great OpenHome abilities

📜 License

This project is licensed under the MIT License.

All contributions to community/ are licensed under the same terms. By submitting a PR, you agree to these terms. Original authorship is always credited.

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenHome Abilities

Open-source voice AI plugins for OpenHome — build, share, and remix.

DashboardDocsDiscord

LicensePython

StarsForksContributorsIssues

---

What Are Abilities?

Abilities are modular voice AI plugins that extend what OpenHome Agents can do. They're triggered by spoken phrases and can do anything — call APIs, play audio, run quizzes, control devices, have multi-turn conversations.

Each Ability is just one file: main.py — your Python logic.

Write your code, zip it, upload it to OpenHome, set your trigger words in the dashboard, and your Agent can do something new.


Quick Start — Your First Ability in 5 Minutes

1. Pick a template

git clone https://github.com/openhome-dev/abilities.git
cp -r abilities/templates/basic-template my-first-ability

2. Edit main.py — here's the simplest possible Ability:

importjsonfromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None# Do not change following tag of register capability#{{register capability}}defcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! Tell me what's on your mind.")
user_input=awaitself.capability_worker.user_response()
response=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(response)
self.capability_worker.resume_normal_flow()

Note: The #{{register_capability}} This line is required boilerplate — copy it exactly. The platform handles config.json automatically; you never need to create or edit it.

3. Upload to OpenHome

  • Zip your folder
  • Go to app.openhome.com → Abilities → Add Custom Ability
  • Upload the zip
  • Set your trigger words in the dashboard (the phrases that activate your Ability)
  • Test it in the Live Editor

4. Trigger it — Say one of your trigger words in a conversation and your Ability takes over.

📖 Full guide:docs/getting-started.md


🔷 Official Abilities

Maintained by the OpenHome team. Tested, stable, and supported.

AbilityDescriptionExample TriggersAPI RequiredDocs
Audius Music DJStream & DJ music from Audius"play something on audius", "dj mode"AudiusREADME
Basic AdvisorDaily life advice"give me advice", "help me"NoneREADME
Date and TimeCurrent date & time info"what time is it", "what's today's date"NoneREADME
Music PlayerPlay music from URL or file"play music", "play a song"NoneREADME
Perplexity Web SearchAI-powered web search"search the web", "look this up"PerplexityREADME
Quiz GameAI-generated trivia"start a quiz", "quiz me"NoneREADME
Sound GeneratorAI sound effects"make a sound", "create a sound"ElevenLabsREADME
WeatherCurrent weather by location"what's the weather"NoneREADME

Trigger words are configured in the OpenHome dashboard when you install an Ability, not in the code.


🔶 Community Abilities

Built by the community. Reviewed for security and SDK compliance before merging.

AbilityDescriptionAuthorAPI Required
Your Ability hereContribute one →

Note: Community Abilities are reviewed for security and SDK compliance. OpenHome does not guarantee ongoing maintenance. See Contributing for details.


📁 Starter Templates

Don't start from scratch — grab a template:

TemplateBest ForPattern
BasicFirst-timersSpeak → Listen → Respond → Exit
APIAPI integrationsSpeak → Call API → Speak result → Exit
LoopInteractive appsLoop with listen → process → respond → exit command
OpenclawOpenClaw integrationsOpenClaw-based ability scaffold
OpenHome LocalLocal developmentRun & test abilities locally
ReadWriteFileFile operationsRead from / write to files on device
SendEmailEmail notificationsCompose & send emails programmatically
AlarmTimers & alarmsBackground mode: continuous monitoring loop
BackgroundBackground monitoringAuto-start → Monitor → Act → Sleep → Repeat (endless)

🤝 Contributing

We welcome community Abilities! Here's the short version:

  1. Fork this repo
  2. Copy a template into community/your-ability-name/
  3. Build your Ability
  4. Open a Pull Request

Full guide:CONTRIBUTING.md

First time? Look for issues labeled good-first-issue.


🏆 Community → Official Promotion

Exceptional community Abilities can be promoted to Official status. We look for:

  • Stability — No critical bugs for 30+ days
  • Quality — Clean code, good voice UX
  • Maintenance — Author is responsive

When promoted, the Ability moves to official/, gets the blue badge on Marketplace, and the author is credited permanently. Learn more →


📖 Documentation

DocDescription
Getting StartedBuild your first Ability in 5 minutes
CapabilityWorkerFull SDK reference
Patterns CookbookCommon patterns with code examples
Publishing to MarketplaceHow to ship your Ability to users
Promotion PathHow community Abilities become official
OpenHome SDK ReferenceComplete guide to SDK
Building Great OpenHome AbilitiesGuide to buil great OpenHome abilities

📜 License

This project is licensed under the MIT License.

All contributions to community/ are licensed under the same terms. By submitting a PR, you agree to these terms. Original authorship is always credited.

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

OpenHome Abilities

Open-source voice AI plugins for OpenHome — build, share, and remix.

DashboardDocsDiscord

LicensePython

StarsForksContributorsIssues

---

What Are Abilities?

Abilities are modular voice AI plugins that extend what OpenHome Agents can do. They're triggered by spoken phrases and can do anything — call APIs, play audio, run quizzes, control devices, have multi-turn conversations.

Each Ability is just one file: main.py — your Python logic.

Write your code, zip it, upload it to OpenHome, set your trigger words in the dashboard, and your Agent can do something new.


Quick Start — Your First Ability in 5 Minutes

1. Pick a template

git clone https://github.com/openhome-dev/abilities.git
cp -r abilities/templates/basic-template my-first-ability

2. Edit main.py — here's the simplest possible Ability:

importjsonfromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None# Do not change following tag of register capability#{{register capability}}defcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! Tell me what's on your mind.")
user_input=awaitself.capability_worker.user_response()
response=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(response)
self.capability_worker.resume_normal_flow()

Note: The #{{register_capability}} This line is required boilerplate — copy it exactly. The platform handles config.json automatically; you never need to create or edit it.

3. Upload to OpenHome

  • Zip your folder
  • Go to app.openhome.com → Abilities → Add Custom Ability
  • Upload the zip
  • Set your trigger words in the dashboard (the phrases that activate your Ability)
  • Test it in the Live Editor

4. Trigger it — Say one of your trigger words in a conversation and your Ability takes over.

📖 Full guide:docs/getting-started.md


🔷 Official Abilities

Maintained by the OpenHome team. Tested, stable, and supported.

AbilityDescriptionExample TriggersAPI RequiredDocs
Audius Music DJStream & DJ music from Audius"play something on audius", "dj mode"AudiusREADME
Basic AdvisorDaily life advice"give me advice", "help me"NoneREADME
Date and TimeCurrent date & time info"what time is it", "what's today's date"NoneREADME
Music PlayerPlay music from URL or file"play music", "play a song"NoneREADME
Perplexity Web SearchAI-powered web search"search the web", "look this up"PerplexityREADME
Quiz GameAI-generated trivia"start a quiz", "quiz me"NoneREADME
Sound GeneratorAI sound effects"make a sound", "create a sound"ElevenLabsREADME
WeatherCurrent weather by location"what's the weather"NoneREADME

Trigger words are configured in the OpenHome dashboard when you install an Ability, not in the code.


🔶 Community Abilities

Built by the community. Reviewed for security and SDK compliance before merging.

AbilityDescriptionAuthorAPI Required
Your Ability hereContribute one →

Note: Community Abilities are reviewed for security and SDK compliance. OpenHome does not guarantee ongoing maintenance. See Contributing for details.


📁 Starter Templates

Don't start from scratch — grab a template:

TemplateBest ForPattern
BasicFirst-timersSpeak → Listen → Respond → Exit
APIAPI integrationsSpeak → Call API → Speak result → Exit
LoopInteractive appsLoop with listen → process → respond → exit command
OpenclawOpenClaw integrationsOpenClaw-based ability scaffold
OpenHome LocalLocal developmentRun & test abilities locally
ReadWriteFileFile operationsRead from / write to files on device
SendEmailEmail notificationsCompose & send emails programmatically
AlarmTimers & alarmsBackground mode: continuous monitoring loop
BackgroundBackground monitoringAuto-start → Monitor → Act → Sleep → Repeat (endless)

🤝 Contributing

We welcome community Abilities! Here's the short version:

  1. Fork this repo
  2. Copy a template into community/your-ability-name/
  3. Build your Ability
  4. Open a Pull Request

Full guide:CONTRIBUTING.md

First time? Look for issues labeled good-first-issue.


🏆 Community → Official Promotion

Exceptional community Abilities can be promoted to Official status. We look for:

  • Stability — No critical bugs for 30+ days
  • Quality — Clean code, good voice UX
  • Maintenance — Author is responsive

When promoted, the Ability moves to official/, gets the blue badge on Marketplace, and the author is credited permanently. Learn more →


📖 Documentation

DocDescription
Getting StartedBuild your first Ability in 5 minutes
CapabilityWorkerFull SDK reference
Patterns CookbookCommon patterns with code examples
Publishing to MarketplaceHow to ship your Ability to users
Promotion PathHow community Abilities become official
OpenHome SDK ReferenceComplete guide to SDK
Building Great OpenHome AbilitiesGuide to buil great OpenHome abilities

📜 License

This project is licensed under the MIT License.

All contributions to community/ are licensed under the same terms. By submitting a PR, you agree to these terms. Original authorship is always credited.

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages