Repository files navigation

LicensePythonAbilitiesStarsForksContributorsIssues

OpenHome

OpenHome Abilities

Open-source voice-AI plugins that give your OpenHome Agent new powers.

Build, share, and remix.

PythonBuild an Agent plugin in Python · 🎙️ Test it with voice · 🛍️ Ship your Agent Skill to the Marketplace

OpenHome Web AppOfficial OpenHome DocsAbilities MarketplaceJoin our Discord Community


Official OpenHome Abilities
Team-maintained Abilities. Tested, stable, and supported.
🧰 Abilities Starter Templates
Minimal, working scaffolds to copy and build on.
🌍 Community Contributed Abilities
Voice Abilities built and shared by the community.
🤝 Contribution Guide
Build your own Ability and open a pull request.

🧩 What Are Abilities?

An Ability is a plugin that extends your OpenHome Agent to do something the language model cannot do from a prompt alone, such as fetching data from the web, controlling a smart device, playing audio, remembering things across sessions, or running a multi-step voice workflow.

The test: if the LLM can already answer it in conversation, it is not adding value as an Ability.

You speak a trigger word -> your Ability is triggered -> its flow runs -> the Agent responds

You write the logic. OpenHome handles speech-to-text, the LLM, text-to-speech, and routing. Most Abilities are a single file: main.py.


📖 Quick Reference

New to OpenHome? Here is the vocabulary in one place.

Key terms

TermWhat it means
Agent (Personality)The voice assistant itself: an LLM, a voice, and a prompt. Every OpenHome speaker runs one, and it adapts to you as you talk.
AbilityA Python plugin that gives an Agent a new power (this repo).
Trigger wordsThe spoken phrases that activate an Ability, set in the dashboard.
CapabilityWorkerThe SDK object an Ability uses for all input and output (speak, listen, call the LLM, store files).
MarketplaceWhere the community shares Agents and Abilities: build in the dashboard, request to publish, and others install and review.
DevKitOpenHome's hardware (a Raspberry Pi) that Local Abilities run on.

The four Ability types

TypeTriggered byLifecycleUsed forEntry file(s)
🟦 SkillA user trigger wordRuns once, then exitsHotword-triggered tasks (the original pattern)main.py
🟪 Agent ControlledThe Agent decidesRuns on demandData lookups, tool use, delegated actionsmain.py (In active development)
🟧 Background DaemonAuto-starts when a session beginsLoops until the session endsMonitoring, alarms, ambient intelligencebackground.py
🟩 LocalA user trigger wordRuns on DevKit hardwareGPIO, sensors, and other on-device hardwaremain.py + devkit_functions.py

🚀 Build Your First Ability

You only need to edit one file. Here is the whole loop.

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 (this is a complete, working Ability)

fromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None#{{register capability}} # required boilerplate, copy exactlydefcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! What's on your mind?")
user_input=awaitself.capability_worker.user_response()
reply=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(reply)
self.capability_worker.resume_normal_flow() # always call this on exit

Two rules that matter most: keep the #{{register capability}} tag exactly as written, and call resume_normal_flow() on every exit path or the speaker stays silent. OpenHome manages the platform-level config.json at runtime, so you never create or edit it.

3. Upload it

  • Zip your folder.
  • Go to app.openhome.com, then Abilities, then Add Custom Ability.
  • Upload the zip.

4. Set your trigger words in the dashboard (the phrases that activate your Ability).

5. Test it in the Live Editor, then say a trigger word in a conversation.

Prefer the terminal? Once you are comfortable, the OpenHome CLI does this whole loop (create, voice-test, push) without zipping or uploading by hand.

📖 Full walkthrough: docs/getting-started.md


🧰 Abilities Starter Templates

Do not start from a blank file. Each template is a minimal, working scaffold for one Ability type; together they cover all four types, so you can start from the pattern closest to what you are building. Copy one and build on top of it.

🟦 Skill (runs once on a trigger word)

TemplateTeachesEntry
Basic TemplateThe minimal Speak, Listen, Respond, Exit loopmain.py
API TemplateFetch from an external API and speak the resultmain.py
Loop TemplateMulti-turn conversation until an exit phrasemain.py
Slack AssistantSlack by voice: channels, messages, DMs, and people searchmain.py
Send EmailSend email with attachments via send_email()main.py
Read Write FilePersist data across sessions with file storagemain.py
OpenClawDrive a local computer through OpenClawmain.py
OpenHome Local LinkTurn speech into shell commands on a local machinemain.py
Smart HomeVoice-control MQTT smart-home devices, an LLM picks the device and commandmain.py
AlarmA Skill and a daemon working together via shared filesmain.py + background.py

🟪 Agent Controlled (the Agent decides when to run it, still in development)

TemplateTeachesEntry
WikipediaAnswer "what is" questions with a short Wikipedia summary, no key neededmain.py

🟧 Background Daemon (auto-runs and loops for the whole session)

TemplateTeachesEntry
Background DaemonA continuous monitor loopbackground.py

🟩 Local (runs on real DevKit hardware)

TemplateTeachesEntry
Philips Hue Light ControlControl a Hue bulb over Bluetooth, no bridge neededmain.py + devkit_functions.py
DevKit LED Lights ControlVoice-control the DevKit's onboard NeoPixel ringmain.py + devkit_functions.py
Camera FeedLook at the DevKit's live camera feed and answer questions about itmain.py + devkit_functions.py
DevKit StatsReport live DevKit telemetry by voice: CPU, memory, temperature, uptimemain.py + devkit_functions.py

More detail on each template: templates/README.md


⭐ Official OpenHome Abilities

Maintained by the OpenHome team. Tested, stable, and supported. Install any of these from the dashboard, or read the source to learn the patterns.

AbilityWhat it doesTry sayingAPI key
Audius Music DJStream and DJ music from Audius"play something on audius"Audius
Basic AdvisorDaily life advice"give me advice"None
Date and TimeCurrent date and time"what time is it"None
Music PlayerPlay music from a URL or file"play a song"None
Perplexity Web SearchAI-powered web search"search the web"Perplexity
Quiz GameAI-generated trivia"start a quiz"None
Sound GeneratorAI sound effects"make a sound"ElevenLabs
WeatherCurrent weather by location"what's the weather"None

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


🌍 Community Contributed Abilities

Built by the community and featured on the Marketplace. Each Ability is reviewed for security and SDK compliance before it is merged.

AbilityWhat it doesTry sayingAPI key
Daily Morning BriefWeather, today's calendar, and unread Gmail in one briefing"morning brief"Google
Gmail Voice AssistantList, read, compose, reply, and archive Gmail by voice"check my email"Google
Google Calendar AssistantCreate, list, update, and delete calendar events"what's on my calendar"Google
Google Tasks AssistantAdd, view, complete, and rename tasks across lists"add a task"Google
Events ExplorerFind concerts, comedy, sports, festivals, and meetups"find events this weekend"Ticketmaster, Serper, SeatGeek
Ambient SoundsStream rain, ocean, cafe, fire, and white-noise ambience"play rain"Freesound
Movie RecommenderRecommendations, trending, ratings, and where to watch"recommend a movie"TMDB
Podcast PlayerFind and play podcast episodes, trending picks, guest search"play a podcast"Listen Notes
Adventure PlannerPlan a trip: itinerary, events, weather, budget, Notion export"one week in Barcelona"Optional (Serper, Notion)
Hacker News DigestA voice digest of the HN front page plus topic deep-dives"what's on Hacker News"None
Spelling Bee CoachSpell words aloud, drill the misses, track accuracy over time"spelling bee"None

Browse all community Abilities →

Want yours featured here? See the Contribution Guide.


⌨️ OpenHome CLI

Once you are comfortable, the openhome CLI runs the whole build loop from your terminal: create, voice-test, push, and contribute, with no zipping or manual uploads.

Setup (from the repo root)

python3 -m venv cli/.venv &&source cli/.venv/bin/activate
pip install -e cli
cp .env.example .env # add your OPENHOME_API_KEY (Settings, then API Keys)

Your API key alone is enough (sent as X-API-KEY), and openhome then runs from anywhere. For openhome call you also need an audio player: on macOS brew install mpv portaudio, on Linux sudo apt install mpv portaudio19-dev.

The loop

openhome agents # list your agents
openhome create my-skill -t basic-template # scaffold into user/ and push to your account# ...edit user/my-skill/main.py...
openhome push user/my-skill --commit -m "v2"# update the ability in place, commit a version
openhome call # real mic and speaker voice test
openhome sync # pull your account's abilities back into user/
openhome delete my-skill # remove from account and local folder

Contribute from the CLI. Your personal Abilities live in user/ (gitignored). Promote a finished one into community/ and open a PR:

openhome push_to_community my-skill # copy user/my-skill into community/, then validate

Full command reference and the API contract: cli/README.md.


🤝 Contribution Guide

We welcome community Abilities. The short version:

  1. Fork this repo.
  2. Copy a template into community/your-ability-name/.
  3. Build your Ability (main.py plus README.md).
  4. Validate it: python3 validate_ability.py community/your-ability-name.
  5. Open a Pull Request against the dev branch.

First time? Look for good-first-issue. Full guide: CONTRIBUTING.md. Also: CODE_OF_CONDUCT.md, SECURITY.md.


🌟 Contributors

Built by an incredible community. Thank you to everyone who has shipped an Ability or improved the project.

Rizwan-095uzair401Husnain-Bhattihassan1731996chrisgbizmegz2020Kaushal-205abubakar4360samsonadmasuArturKozhushnyiyonaseth12RyanBhandalfiction17Ju-uscBhargavTeluammyyou112Akio9090-devzainirfan13harmsolo13engrumair842-archalimujtaba478BILLKISHOREfrancippipinstallshanFHLiang221melodyguiuchebuzz-codersterling-progjibzuscodeforstartupsSpkArtZensaifrehman100Rizwan-algorycrawqubitMmilessmahsumaktasMKmuneebkhalidKuberwastakenStressTestorcode-guru1chadnewbrycedarscarlettbrianchildersazazrashidcrunchdomou-faizanKDJ-MalikAsad-NCSShayanKhan183AhmedRaza-2Bilalkhan-celMMEHDI0606milliyinnida-akhtarmuj25Huzaifa-Abdurahmanmibrahim-khalilileana-pr

Want to contribute? Start here.


🏆 Community to Official

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

  • Stability, no critical bugs for 30 or more days.
  • Quality, clean code and great voice UX.
  • Maintenance, a responsive author.

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


📚 Official OpenHome Docs

Get started

SDK reference

Design and advanced


📜 License

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

Back to top

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

476 stars

Watchers

6 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

LicensePythonAbilitiesStarsForksContributorsIssues

OpenHome

OpenHome Abilities

Open-source voice-AI plugins that give your OpenHome Agent new powers.

Build, share, and remix.

PythonBuild an Agent plugin in Python · 🎙️ Test it with voice · 🛍️ Ship your Agent Skill to the Marketplace

OpenHome Web AppOfficial OpenHome DocsAbilities MarketplaceJoin our Discord Community


Official OpenHome Abilities
Team-maintained Abilities. Tested, stable, and supported.
🧰 Abilities Starter Templates
Minimal, working scaffolds to copy and build on.
🌍 Community Contributed Abilities
Voice Abilities built and shared by the community.
🤝 Contribution Guide
Build your own Ability and open a pull request.

🧩 What Are Abilities?

An Ability is a plugin that extends your OpenHome Agent to do something the language model cannot do from a prompt alone, such as fetching data from the web, controlling a smart device, playing audio, remembering things across sessions, or running a multi-step voice workflow.

The test: if the LLM can already answer it in conversation, it is not adding value as an Ability.

You speak a trigger word -> your Ability is triggered -> its flow runs -> the Agent responds

You write the logic. OpenHome handles speech-to-text, the LLM, text-to-speech, and routing. Most Abilities are a single file: main.py.


📖 Quick Reference

New to OpenHome? Here is the vocabulary in one place.

Key terms

TermWhat it means
Agent (Personality)The voice assistant itself: an LLM, a voice, and a prompt. Every OpenHome speaker runs one, and it adapts to you as you talk.
AbilityA Python plugin that gives an Agent a new power (this repo).
Trigger wordsThe spoken phrases that activate an Ability, set in the dashboard.
CapabilityWorkerThe SDK object an Ability uses for all input and output (speak, listen, call the LLM, store files).
MarketplaceWhere the community shares Agents and Abilities: build in the dashboard, request to publish, and others install and review.
DevKitOpenHome's hardware (a Raspberry Pi) that Local Abilities run on.

The four Ability types

TypeTriggered byLifecycleUsed forEntry file(s)
🟦 SkillA user trigger wordRuns once, then exitsHotword-triggered tasks (the original pattern)main.py
🟪 Agent ControlledThe Agent decidesRuns on demandData lookups, tool use, delegated actionsmain.py (In active development)
🟧 Background DaemonAuto-starts when a session beginsLoops until the session endsMonitoring, alarms, ambient intelligencebackground.py
🟩 LocalA user trigger wordRuns on DevKit hardwareGPIO, sensors, and other on-device hardwaremain.py + devkit_functions.py

🚀 Build Your First Ability

You only need to edit one file. Here is the whole loop.

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 (this is a complete, working Ability)

fromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None#{{register capability}} # required boilerplate, copy exactlydefcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! What's on your mind?")
user_input=awaitself.capability_worker.user_response()
reply=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(reply)
self.capability_worker.resume_normal_flow() # always call this on exit

Two rules that matter most: keep the #{{register capability}} tag exactly as written, and call resume_normal_flow() on every exit path or the speaker stays silent. OpenHome manages the platform-level config.json at runtime, so you never create or edit it.

3. Upload it

  • Zip your folder.
  • Go to app.openhome.com, then Abilities, then Add Custom Ability.
  • Upload the zip.

4. Set your trigger words in the dashboard (the phrases that activate your Ability).

5. Test it in the Live Editor, then say a trigger word in a conversation.

Prefer the terminal? Once you are comfortable, the OpenHome CLI does this whole loop (create, voice-test, push) without zipping or uploading by hand.

📖 Full walkthrough: docs/getting-started.md


🧰 Abilities Starter Templates

Do not start from a blank file. Each template is a minimal, working scaffold for one Ability type; together they cover all four types, so you can start from the pattern closest to what you are building. Copy one and build on top of it.

🟦 Skill (runs once on a trigger word)

TemplateTeachesEntry
Basic TemplateThe minimal Speak, Listen, Respond, Exit loopmain.py
API TemplateFetch from an external API and speak the resultmain.py
Loop TemplateMulti-turn conversation until an exit phrasemain.py
Slack AssistantSlack by voice: channels, messages, DMs, and people searchmain.py
Send EmailSend email with attachments via send_email()main.py
Read Write FilePersist data across sessions with file storagemain.py
OpenClawDrive a local computer through OpenClawmain.py
OpenHome Local LinkTurn speech into shell commands on a local machinemain.py
Smart HomeVoice-control MQTT smart-home devices, an LLM picks the device and commandmain.py
AlarmA Skill and a daemon working together via shared filesmain.py + background.py

🟪 Agent Controlled (the Agent decides when to run it, still in development)

TemplateTeachesEntry
WikipediaAnswer "what is" questions with a short Wikipedia summary, no key neededmain.py

🟧 Background Daemon (auto-runs and loops for the whole session)

TemplateTeachesEntry
Background DaemonA continuous monitor loopbackground.py

🟩 Local (runs on real DevKit hardware)

TemplateTeachesEntry
Philips Hue Light ControlControl a Hue bulb over Bluetooth, no bridge neededmain.py + devkit_functions.py
DevKit LED Lights ControlVoice-control the DevKit's onboard NeoPixel ringmain.py + devkit_functions.py
Camera FeedLook at the DevKit's live camera feed and answer questions about itmain.py + devkit_functions.py
DevKit StatsReport live DevKit telemetry by voice: CPU, memory, temperature, uptimemain.py + devkit_functions.py

More detail on each template: templates/README.md


⭐ Official OpenHome Abilities

Maintained by the OpenHome team. Tested, stable, and supported. Install any of these from the dashboard, or read the source to learn the patterns.

AbilityWhat it doesTry sayingAPI key
Audius Music DJStream and DJ music from Audius"play something on audius"Audius
Basic AdvisorDaily life advice"give me advice"None
Date and TimeCurrent date and time"what time is it"None
Music PlayerPlay music from a URL or file"play a song"None
Perplexity Web SearchAI-powered web search"search the web"Perplexity
Quiz GameAI-generated trivia"start a quiz"None
Sound GeneratorAI sound effects"make a sound"ElevenLabs
WeatherCurrent weather by location"what's the weather"None

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


🌍 Community Contributed Abilities

Built by the community and featured on the Marketplace. Each Ability is reviewed for security and SDK compliance before it is merged.

AbilityWhat it doesTry sayingAPI key
Daily Morning BriefWeather, today's calendar, and unread Gmail in one briefing"morning brief"Google
Gmail Voice AssistantList, read, compose, reply, and archive Gmail by voice"check my email"Google
Google Calendar AssistantCreate, list, update, and delete calendar events"what's on my calendar"Google
Google Tasks AssistantAdd, view, complete, and rename tasks across lists"add a task"Google
Events ExplorerFind concerts, comedy, sports, festivals, and meetups"find events this weekend"Ticketmaster, Serper, SeatGeek
Ambient SoundsStream rain, ocean, cafe, fire, and white-noise ambience"play rain"Freesound
Movie RecommenderRecommendations, trending, ratings, and where to watch"recommend a movie"TMDB
Podcast PlayerFind and play podcast episodes, trending picks, guest search"play a podcast"Listen Notes
Adventure PlannerPlan a trip: itinerary, events, weather, budget, Notion export"one week in Barcelona"Optional (Serper, Notion)
Hacker News DigestA voice digest of the HN front page plus topic deep-dives"what's on Hacker News"None
Spelling Bee CoachSpell words aloud, drill the misses, track accuracy over time"spelling bee"None

Browse all community Abilities →

Want yours featured here? See the Contribution Guide.


⌨️ OpenHome CLI

Once you are comfortable, the openhome CLI runs the whole build loop from your terminal: create, voice-test, push, and contribute, with no zipping or manual uploads.

Setup (from the repo root)

python3 -m venv cli/.venv &&source cli/.venv/bin/activate
pip install -e cli
cp .env.example .env # add your OPENHOME_API_KEY (Settings, then API Keys)

Your API key alone is enough (sent as X-API-KEY), and openhome then runs from anywhere. For openhome call you also need an audio player: on macOS brew install mpv portaudio, on Linux sudo apt install mpv portaudio19-dev.

The loop

openhome agents # list your agents
openhome create my-skill -t basic-template # scaffold into user/ and push to your account# ...edit user/my-skill/main.py...
openhome push user/my-skill --commit -m "v2"# update the ability in place, commit a version
openhome call # real mic and speaker voice test
openhome sync # pull your account's abilities back into user/
openhome delete my-skill # remove from account and local folder

Contribute from the CLI. Your personal Abilities live in user/ (gitignored). Promote a finished one into community/ and open a PR:

openhome push_to_community my-skill # copy user/my-skill into community/, then validate

Full command reference and the API contract: cli/README.md.


🤝 Contribution Guide

We welcome community Abilities. The short version:

  1. Fork this repo.
  2. Copy a template into community/your-ability-name/.
  3. Build your Ability (main.py plus README.md).
  4. Validate it: python3 validate_ability.py community/your-ability-name.
  5. Open a Pull Request against the dev branch.

First time? Look for good-first-issue. Full guide: CONTRIBUTING.md. Also: CODE_OF_CONDUCT.md, SECURITY.md.


🌟 Contributors

Built by an incredible community. Thank you to everyone who has shipped an Ability or improved the project.

Rizwan-095uzair401Husnain-Bhattihassan1731996chrisgbizmegz2020Kaushal-205abubakar4360samsonadmasuArturKozhushnyiyonaseth12RyanBhandalfiction17Ju-uscBhargavTeluammyyou112Akio9090-devzainirfan13harmsolo13engrumair842-archalimujtaba478BILLKISHOREfrancippipinstallshanFHLiang221melodyguiuchebuzz-codersterling-progjibzuscodeforstartupsSpkArtZensaifrehman100Rizwan-algorycrawqubitMmilessmahsumaktasMKmuneebkhalidKuberwastakenStressTestorcode-guru1chadnewbrycedarscarlettbrianchildersazazrashidcrunchdomou-faizanKDJ-MalikAsad-NCSShayanKhan183AhmedRaza-2Bilalkhan-celMMEHDI0606milliyinnida-akhtarmuj25Huzaifa-Abdurahmanmibrahim-khalilileana-pr

Want to contribute? Start here.


🏆 Community to Official

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

  • Stability, no critical bugs for 30 or more days.
  • Quality, clean code and great voice UX.
  • Maintenance, a responsive author.

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


📚 Official OpenHome Docs

Get started

SDK reference

Design and advanced


📜 License

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

Back to top

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

476 stars

Watchers

6 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

LicensePythonAbilitiesStarsForksContributorsIssues

OpenHome

OpenHome Abilities

Open-source voice-AI plugins that give your OpenHome Agent new powers.

Build, share, and remix.

PythonBuild an Agent plugin in Python · 🎙️ Test it with voice · 🛍️ Ship your Agent Skill to the Marketplace

OpenHome Web AppOfficial OpenHome DocsAbilities MarketplaceJoin our Discord Community


Official OpenHome Abilities
Team-maintained Abilities. Tested, stable, and supported.
🧰 Abilities Starter Templates
Minimal, working scaffolds to copy and build on.
🌍 Community Contributed Abilities
Voice Abilities built and shared by the community.
🤝 Contribution Guide
Build your own Ability and open a pull request.

🧩 What Are Abilities?

An Ability is a plugin that extends your OpenHome Agent to do something the language model cannot do from a prompt alone, such as fetching data from the web, controlling a smart device, playing audio, remembering things across sessions, or running a multi-step voice workflow.

The test: if the LLM can already answer it in conversation, it is not adding value as an Ability.

You speak a trigger word -> your Ability is triggered -> its flow runs -> the Agent responds

You write the logic. OpenHome handles speech-to-text, the LLM, text-to-speech, and routing. Most Abilities are a single file: main.py.


📖 Quick Reference

New to OpenHome? Here is the vocabulary in one place.

Key terms

TermWhat it means
Agent (Personality)The voice assistant itself: an LLM, a voice, and a prompt. Every OpenHome speaker runs one, and it adapts to you as you talk.
AbilityA Python plugin that gives an Agent a new power (this repo).
Trigger wordsThe spoken phrases that activate an Ability, set in the dashboard.
CapabilityWorkerThe SDK object an Ability uses for all input and output (speak, listen, call the LLM, store files).
MarketplaceWhere the community shares Agents and Abilities: build in the dashboard, request to publish, and others install and review.
DevKitOpenHome's hardware (a Raspberry Pi) that Local Abilities run on.

The four Ability types

TypeTriggered byLifecycleUsed forEntry file(s)
🟦 SkillA user trigger wordRuns once, then exitsHotword-triggered tasks (the original pattern)main.py
🟪 Agent ControlledThe Agent decidesRuns on demandData lookups, tool use, delegated actionsmain.py (In active development)
🟧 Background DaemonAuto-starts when a session beginsLoops until the session endsMonitoring, alarms, ambient intelligencebackground.py
🟩 LocalA user trigger wordRuns on DevKit hardwareGPIO, sensors, and other on-device hardwaremain.py + devkit_functions.py

🚀 Build Your First Ability

You only need to edit one file. Here is the whole loop.

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 (this is a complete, working Ability)

fromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None#{{register capability}} # required boilerplate, copy exactlydefcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! What's on your mind?")
user_input=awaitself.capability_worker.user_response()
reply=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(reply)
self.capability_worker.resume_normal_flow() # always call this on exit

Two rules that matter most: keep the #{{register capability}} tag exactly as written, and call resume_normal_flow() on every exit path or the speaker stays silent. OpenHome manages the platform-level config.json at runtime, so you never create or edit it.

3. Upload it

  • Zip your folder.
  • Go to app.openhome.com, then Abilities, then Add Custom Ability.
  • Upload the zip.

4. Set your trigger words in the dashboard (the phrases that activate your Ability).

5. Test it in the Live Editor, then say a trigger word in a conversation.

Prefer the terminal? Once you are comfortable, the OpenHome CLI does this whole loop (create, voice-test, push) without zipping or uploading by hand.

📖 Full walkthrough: docs/getting-started.md


🧰 Abilities Starter Templates

Do not start from a blank file. Each template is a minimal, working scaffold for one Ability type; together they cover all four types, so you can start from the pattern closest to what you are building. Copy one and build on top of it.

🟦 Skill (runs once on a trigger word)

TemplateTeachesEntry
Basic TemplateThe minimal Speak, Listen, Respond, Exit loopmain.py
API TemplateFetch from an external API and speak the resultmain.py
Loop TemplateMulti-turn conversation until an exit phrasemain.py
Slack AssistantSlack by voice: channels, messages, DMs, and people searchmain.py
Send EmailSend email with attachments via send_email()main.py
Read Write FilePersist data across sessions with file storagemain.py
OpenClawDrive a local computer through OpenClawmain.py
OpenHome Local LinkTurn speech into shell commands on a local machinemain.py
Smart HomeVoice-control MQTT smart-home devices, an LLM picks the device and commandmain.py
AlarmA Skill and a daemon working together via shared filesmain.py + background.py

🟪 Agent Controlled (the Agent decides when to run it, still in development)

TemplateTeachesEntry
WikipediaAnswer "what is" questions with a short Wikipedia summary, no key neededmain.py

🟧 Background Daemon (auto-runs and loops for the whole session)

TemplateTeachesEntry
Background DaemonA continuous monitor loopbackground.py

🟩 Local (runs on real DevKit hardware)

TemplateTeachesEntry
Philips Hue Light ControlControl a Hue bulb over Bluetooth, no bridge neededmain.py + devkit_functions.py
DevKit LED Lights ControlVoice-control the DevKit's onboard NeoPixel ringmain.py + devkit_functions.py
Camera FeedLook at the DevKit's live camera feed and answer questions about itmain.py + devkit_functions.py
DevKit StatsReport live DevKit telemetry by voice: CPU, memory, temperature, uptimemain.py + devkit_functions.py

More detail on each template: templates/README.md


⭐ Official OpenHome Abilities

Maintained by the OpenHome team. Tested, stable, and supported. Install any of these from the dashboard, or read the source to learn the patterns.

AbilityWhat it doesTry sayingAPI key
Audius Music DJStream and DJ music from Audius"play something on audius"Audius
Basic AdvisorDaily life advice"give me advice"None
Date and TimeCurrent date and time"what time is it"None
Music PlayerPlay music from a URL or file"play a song"None
Perplexity Web SearchAI-powered web search"search the web"Perplexity
Quiz GameAI-generated trivia"start a quiz"None
Sound GeneratorAI sound effects"make a sound"ElevenLabs
WeatherCurrent weather by location"what's the weather"None

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


🌍 Community Contributed Abilities

Built by the community and featured on the Marketplace. Each Ability is reviewed for security and SDK compliance before it is merged.

AbilityWhat it doesTry sayingAPI key
Daily Morning BriefWeather, today's calendar, and unread Gmail in one briefing"morning brief"Google
Gmail Voice AssistantList, read, compose, reply, and archive Gmail by voice"check my email"Google
Google Calendar AssistantCreate, list, update, and delete calendar events"what's on my calendar"Google
Google Tasks AssistantAdd, view, complete, and rename tasks across lists"add a task"Google
Events ExplorerFind concerts, comedy, sports, festivals, and meetups"find events this weekend"Ticketmaster, Serper, SeatGeek
Ambient SoundsStream rain, ocean, cafe, fire, and white-noise ambience"play rain"Freesound
Movie RecommenderRecommendations, trending, ratings, and where to watch"recommend a movie"TMDB
Podcast PlayerFind and play podcast episodes, trending picks, guest search"play a podcast"Listen Notes
Adventure PlannerPlan a trip: itinerary, events, weather, budget, Notion export"one week in Barcelona"Optional (Serper, Notion)
Hacker News DigestA voice digest of the HN front page plus topic deep-dives"what's on Hacker News"None
Spelling Bee CoachSpell words aloud, drill the misses, track accuracy over time"spelling bee"None

Browse all community Abilities →

Want yours featured here? See the Contribution Guide.


⌨️ OpenHome CLI

Once you are comfortable, the openhome CLI runs the whole build loop from your terminal: create, voice-test, push, and contribute, with no zipping or manual uploads.

Setup (from the repo root)

python3 -m venv cli/.venv &&source cli/.venv/bin/activate
pip install -e cli
cp .env.example .env # add your OPENHOME_API_KEY (Settings, then API Keys)

Your API key alone is enough (sent as X-API-KEY), and openhome then runs from anywhere. For openhome call you also need an audio player: on macOS brew install mpv portaudio, on Linux sudo apt install mpv portaudio19-dev.

The loop

openhome agents # list your agents
openhome create my-skill -t basic-template # scaffold into user/ and push to your account# ...edit user/my-skill/main.py...
openhome push user/my-skill --commit -m "v2"# update the ability in place, commit a version
openhome call # real mic and speaker voice test
openhome sync # pull your account's abilities back into user/
openhome delete my-skill # remove from account and local folder

Contribute from the CLI. Your personal Abilities live in user/ (gitignored). Promote a finished one into community/ and open a PR:

openhome push_to_community my-skill # copy user/my-skill into community/, then validate

Full command reference and the API contract: cli/README.md.


🤝 Contribution Guide

We welcome community Abilities. The short version:

  1. Fork this repo.
  2. Copy a template into community/your-ability-name/.
  3. Build your Ability (main.py plus README.md).
  4. Validate it: python3 validate_ability.py community/your-ability-name.
  5. Open a Pull Request against the dev branch.

First time? Look for good-first-issue. Full guide: CONTRIBUTING.md. Also: CODE_OF_CONDUCT.md, SECURITY.md.


🌟 Contributors

Built by an incredible community. Thank you to everyone who has shipped an Ability or improved the project.

Rizwan-095uzair401Husnain-Bhattihassan1731996chrisgbizmegz2020Kaushal-205abubakar4360samsonadmasuArturKozhushnyiyonaseth12RyanBhandalfiction17Ju-uscBhargavTeluammyyou112Akio9090-devzainirfan13harmsolo13engrumair842-archalimujtaba478BILLKISHOREfrancippipinstallshanFHLiang221melodyguiuchebuzz-codersterling-progjibzuscodeforstartupsSpkArtZensaifrehman100Rizwan-algorycrawqubitMmilessmahsumaktasMKmuneebkhalidKuberwastakenStressTestorcode-guru1chadnewbrycedarscarlettbrianchildersazazrashidcrunchdomou-faizanKDJ-MalikAsad-NCSShayanKhan183AhmedRaza-2Bilalkhan-celMMEHDI0606milliyinnida-akhtarmuj25Huzaifa-Abdurahmanmibrahim-khalilileana-pr

Want to contribute? Start here.


🏆 Community to Official

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

  • Stability, no critical bugs for 30 or more days.
  • Quality, clean code and great voice UX.
  • Maintenance, a responsive author.

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


📚 Official OpenHome Docs

Get started

SDK reference

Design and advanced


📜 License

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

Back to top

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

476 stars

Watchers

6 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

LicensePythonAbilitiesStarsForksContributorsIssues

OpenHome

OpenHome Abilities

Open-source voice-AI plugins that give your OpenHome Agent new powers.

Build, share, and remix.

PythonBuild an Agent plugin in Python · 🎙️ Test it with voice · 🛍️ Ship your Agent Skill to the Marketplace

OpenHome Web AppOfficial OpenHome DocsAbilities MarketplaceJoin our Discord Community


Official OpenHome Abilities
Team-maintained Abilities. Tested, stable, and supported.
🧰 Abilities Starter Templates
Minimal, working scaffolds to copy and build on.
🌍 Community Contributed Abilities
Voice Abilities built and shared by the community.
🤝 Contribution Guide
Build your own Ability and open a pull request.

🧩 What Are Abilities?

An Ability is a plugin that extends your OpenHome Agent to do something the language model cannot do from a prompt alone, such as fetching data from the web, controlling a smart device, playing audio, remembering things across sessions, or running a multi-step voice workflow.

The test: if the LLM can already answer it in conversation, it is not adding value as an Ability.

You speak a trigger word -> your Ability is triggered -> its flow runs -> the Agent responds

You write the logic. OpenHome handles speech-to-text, the LLM, text-to-speech, and routing. Most Abilities are a single file: main.py.


📖 Quick Reference

New to OpenHome? Here is the vocabulary in one place.

Key terms

TermWhat it means
Agent (Personality)The voice assistant itself: an LLM, a voice, and a prompt. Every OpenHome speaker runs one, and it adapts to you as you talk.
AbilityA Python plugin that gives an Agent a new power (this repo).
Trigger wordsThe spoken phrases that activate an Ability, set in the dashboard.
CapabilityWorkerThe SDK object an Ability uses for all input and output (speak, listen, call the LLM, store files).
MarketplaceWhere the community shares Agents and Abilities: build in the dashboard, request to publish, and others install and review.
DevKitOpenHome's hardware (a Raspberry Pi) that Local Abilities run on.

The four Ability types

TypeTriggered byLifecycleUsed forEntry file(s)
🟦 SkillA user trigger wordRuns once, then exitsHotword-triggered tasks (the original pattern)main.py
🟪 Agent ControlledThe Agent decidesRuns on demandData lookups, tool use, delegated actionsmain.py (In active development)
🟧 Background DaemonAuto-starts when a session beginsLoops until the session endsMonitoring, alarms, ambient intelligencebackground.py
🟩 LocalA user trigger wordRuns on DevKit hardwareGPIO, sensors, and other on-device hardwaremain.py + devkit_functions.py

🚀 Build Your First Ability

You only need to edit one file. Here is the whole loop.

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 (this is a complete, working Ability)

fromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None#{{register capability}} # required boilerplate, copy exactlydefcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! What's on your mind?")
user_input=awaitself.capability_worker.user_response()
reply=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(reply)
self.capability_worker.resume_normal_flow() # always call this on exit

Two rules that matter most: keep the #{{register capability}} tag exactly as written, and call resume_normal_flow() on every exit path or the speaker stays silent. OpenHome manages the platform-level config.json at runtime, so you never create or edit it.

3. Upload it

  • Zip your folder.
  • Go to app.openhome.com, then Abilities, then Add Custom Ability.
  • Upload the zip.

4. Set your trigger words in the dashboard (the phrases that activate your Ability).

5. Test it in the Live Editor, then say a trigger word in a conversation.

Prefer the terminal? Once you are comfortable, the OpenHome CLI does this whole loop (create, voice-test, push) without zipping or uploading by hand.

📖 Full walkthrough: docs/getting-started.md


🧰 Abilities Starter Templates

Do not start from a blank file. Each template is a minimal, working scaffold for one Ability type; together they cover all four types, so you can start from the pattern closest to what you are building. Copy one and build on top of it.

🟦 Skill (runs once on a trigger word)

TemplateTeachesEntry
Basic TemplateThe minimal Speak, Listen, Respond, Exit loopmain.py
API TemplateFetch from an external API and speak the resultmain.py
Loop TemplateMulti-turn conversation until an exit phrasemain.py
Slack AssistantSlack by voice: channels, messages, DMs, and people searchmain.py
Send EmailSend email with attachments via send_email()main.py
Read Write FilePersist data across sessions with file storagemain.py
OpenClawDrive a local computer through OpenClawmain.py
OpenHome Local LinkTurn speech into shell commands on a local machinemain.py
Smart HomeVoice-control MQTT smart-home devices, an LLM picks the device and commandmain.py
AlarmA Skill and a daemon working together via shared filesmain.py + background.py

🟪 Agent Controlled (the Agent decides when to run it, still in development)

TemplateTeachesEntry
WikipediaAnswer "what is" questions with a short Wikipedia summary, no key neededmain.py

🟧 Background Daemon (auto-runs and loops for the whole session)

TemplateTeachesEntry
Background DaemonA continuous monitor loopbackground.py

🟩 Local (runs on real DevKit hardware)

TemplateTeachesEntry
Philips Hue Light ControlControl a Hue bulb over Bluetooth, no bridge neededmain.py + devkit_functions.py
DevKit LED Lights ControlVoice-control the DevKit's onboard NeoPixel ringmain.py + devkit_functions.py
Camera FeedLook at the DevKit's live camera feed and answer questions about itmain.py + devkit_functions.py
DevKit StatsReport live DevKit telemetry by voice: CPU, memory, temperature, uptimemain.py + devkit_functions.py

More detail on each template: templates/README.md


⭐ Official OpenHome Abilities

Maintained by the OpenHome team. Tested, stable, and supported. Install any of these from the dashboard, or read the source to learn the patterns.

AbilityWhat it doesTry sayingAPI key
Audius Music DJStream and DJ music from Audius"play something on audius"Audius
Basic AdvisorDaily life advice"give me advice"None
Date and TimeCurrent date and time"what time is it"None
Music PlayerPlay music from a URL or file"play a song"None
Perplexity Web SearchAI-powered web search"search the web"Perplexity
Quiz GameAI-generated trivia"start a quiz"None
Sound GeneratorAI sound effects"make a sound"ElevenLabs
WeatherCurrent weather by location"what's the weather"None

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


🌍 Community Contributed Abilities

Built by the community and featured on the Marketplace. Each Ability is reviewed for security and SDK compliance before it is merged.

AbilityWhat it doesTry sayingAPI key
Daily Morning BriefWeather, today's calendar, and unread Gmail in one briefing"morning brief"Google
Gmail Voice AssistantList, read, compose, reply, and archive Gmail by voice"check my email"Google
Google Calendar AssistantCreate, list, update, and delete calendar events"what's on my calendar"Google
Google Tasks AssistantAdd, view, complete, and rename tasks across lists"add a task"Google
Events ExplorerFind concerts, comedy, sports, festivals, and meetups"find events this weekend"Ticketmaster, Serper, SeatGeek
Ambient SoundsStream rain, ocean, cafe, fire, and white-noise ambience"play rain"Freesound
Movie RecommenderRecommendations, trending, ratings, and where to watch"recommend a movie"TMDB
Podcast PlayerFind and play podcast episodes, trending picks, guest search"play a podcast"Listen Notes
Adventure PlannerPlan a trip: itinerary, events, weather, budget, Notion export"one week in Barcelona"Optional (Serper, Notion)
Hacker News DigestA voice digest of the HN front page plus topic deep-dives"what's on Hacker News"None
Spelling Bee CoachSpell words aloud, drill the misses, track accuracy over time"spelling bee"None

Browse all community Abilities →

Want yours featured here? See the Contribution Guide.


⌨️ OpenHome CLI

Once you are comfortable, the openhome CLI runs the whole build loop from your terminal: create, voice-test, push, and contribute, with no zipping or manual uploads.

Setup (from the repo root)

python3 -m venv cli/.venv &&source cli/.venv/bin/activate
pip install -e cli
cp .env.example .env # add your OPENHOME_API_KEY (Settings, then API Keys)

Your API key alone is enough (sent as X-API-KEY), and openhome then runs from anywhere. For openhome call you also need an audio player: on macOS brew install mpv portaudio, on Linux sudo apt install mpv portaudio19-dev.

The loop

openhome agents # list your agents
openhome create my-skill -t basic-template # scaffold into user/ and push to your account# ...edit user/my-skill/main.py...
openhome push user/my-skill --commit -m "v2"# update the ability in place, commit a version
openhome call # real mic and speaker voice test
openhome sync # pull your account's abilities back into user/
openhome delete my-skill # remove from account and local folder

Contribute from the CLI. Your personal Abilities live in user/ (gitignored). Promote a finished one into community/ and open a PR:

openhome push_to_community my-skill # copy user/my-skill into community/, then validate

Full command reference and the API contract: cli/README.md.


🤝 Contribution Guide

We welcome community Abilities. The short version:

  1. Fork this repo.
  2. Copy a template into community/your-ability-name/.
  3. Build your Ability (main.py plus README.md).
  4. Validate it: python3 validate_ability.py community/your-ability-name.
  5. Open a Pull Request against the dev branch.

First time? Look for good-first-issue. Full guide: CONTRIBUTING.md. Also: CODE_OF_CONDUCT.md, SECURITY.md.


🌟 Contributors

Built by an incredible community. Thank you to everyone who has shipped an Ability or improved the project.

Rizwan-095uzair401Husnain-Bhattihassan1731996chrisgbizmegz2020Kaushal-205abubakar4360samsonadmasuArturKozhushnyiyonaseth12RyanBhandalfiction17Ju-uscBhargavTeluammyyou112Akio9090-devzainirfan13harmsolo13engrumair842-archalimujtaba478BILLKISHOREfrancippipinstallshanFHLiang221melodyguiuchebuzz-codersterling-progjibzuscodeforstartupsSpkArtZensaifrehman100Rizwan-algorycrawqubitMmilessmahsumaktasMKmuneebkhalidKuberwastakenStressTestorcode-guru1chadnewbrycedarscarlettbrianchildersazazrashidcrunchdomou-faizanKDJ-MalikAsad-NCSShayanKhan183AhmedRaza-2Bilalkhan-celMMEHDI0606milliyinnida-akhtarmuj25Huzaifa-Abdurahmanmibrahim-khalilileana-pr

Want to contribute? Start here.


🏆 Community to Official

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

  • Stability, no critical bugs for 30 or more days.
  • Quality, clean code and great voice UX.
  • Maintenance, a responsive author.

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


📚 Official OpenHome Docs

Get started

SDK reference

Design and advanced


📜 License

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

Back to top

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

476 stars

Watchers

6 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

LicensePythonAbilitiesStarsForksContributorsIssues

OpenHome

OpenHome Abilities

Open-source voice-AI plugins that give your OpenHome Agent new powers.

Build, share, and remix.

PythonBuild an Agent plugin in Python · 🎙️ Test it with voice · 🛍️ Ship your Agent Skill to the Marketplace

OpenHome Web AppOfficial OpenHome DocsAbilities MarketplaceJoin our Discord Community


Official OpenHome Abilities
Team-maintained Abilities. Tested, stable, and supported.
🧰 Abilities Starter Templates
Minimal, working scaffolds to copy and build on.
🌍 Community Contributed Abilities
Voice Abilities built and shared by the community.
🤝 Contribution Guide
Build your own Ability and open a pull request.

🧩 What Are Abilities?

An Ability is a plugin that extends your OpenHome Agent to do something the language model cannot do from a prompt alone, such as fetching data from the web, controlling a smart device, playing audio, remembering things across sessions, or running a multi-step voice workflow.

The test: if the LLM can already answer it in conversation, it is not adding value as an Ability.

You speak a trigger word -> your Ability is triggered -> its flow runs -> the Agent responds

You write the logic. OpenHome handles speech-to-text, the LLM, text-to-speech, and routing. Most Abilities are a single file: main.py.


📖 Quick Reference

New to OpenHome? Here is the vocabulary in one place.

Key terms

TermWhat it means
Agent (Personality)The voice assistant itself: an LLM, a voice, and a prompt. Every OpenHome speaker runs one, and it adapts to you as you talk.
AbilityA Python plugin that gives an Agent a new power (this repo).
Trigger wordsThe spoken phrases that activate an Ability, set in the dashboard.
CapabilityWorkerThe SDK object an Ability uses for all input and output (speak, listen, call the LLM, store files).
MarketplaceWhere the community shares Agents and Abilities: build in the dashboard, request to publish, and others install and review.
DevKitOpenHome's hardware (a Raspberry Pi) that Local Abilities run on.

The four Ability types

TypeTriggered byLifecycleUsed forEntry file(s)
🟦 SkillA user trigger wordRuns once, then exitsHotword-triggered tasks (the original pattern)main.py
🟪 Agent ControlledThe Agent decidesRuns on demandData lookups, tool use, delegated actionsmain.py (In active development)
🟧 Background DaemonAuto-starts when a session beginsLoops until the session endsMonitoring, alarms, ambient intelligencebackground.py
🟩 LocalA user trigger wordRuns on DevKit hardwareGPIO, sensors, and other on-device hardwaremain.py + devkit_functions.py

🚀 Build Your First Ability

You only need to edit one file. Here is the whole loop.

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 (this is a complete, working Ability)

fromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None#{{register capability}} # required boilerplate, copy exactlydefcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! What's on your mind?")
user_input=awaitself.capability_worker.user_response()
reply=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(reply)
self.capability_worker.resume_normal_flow() # always call this on exit

Two rules that matter most: keep the #{{register capability}} tag exactly as written, and call resume_normal_flow() on every exit path or the speaker stays silent. OpenHome manages the platform-level config.json at runtime, so you never create or edit it.

3. Upload it

  • Zip your folder.
  • Go to app.openhome.com, then Abilities, then Add Custom Ability.
  • Upload the zip.

4. Set your trigger words in the dashboard (the phrases that activate your Ability).

5. Test it in the Live Editor, then say a trigger word in a conversation.

Prefer the terminal? Once you are comfortable, the OpenHome CLI does this whole loop (create, voice-test, push) without zipping or uploading by hand.

📖 Full walkthrough: docs/getting-started.md


🧰 Abilities Starter Templates

Do not start from a blank file. Each template is a minimal, working scaffold for one Ability type; together they cover all four types, so you can start from the pattern closest to what you are building. Copy one and build on top of it.

🟦 Skill (runs once on a trigger word)

TemplateTeachesEntry
Basic TemplateThe minimal Speak, Listen, Respond, Exit loopmain.py
API TemplateFetch from an external API and speak the resultmain.py
Loop TemplateMulti-turn conversation until an exit phrasemain.py
Slack AssistantSlack by voice: channels, messages, DMs, and people searchmain.py
Send EmailSend email with attachments via send_email()main.py
Read Write FilePersist data across sessions with file storagemain.py
OpenClawDrive a local computer through OpenClawmain.py
OpenHome Local LinkTurn speech into shell commands on a local machinemain.py
Smart HomeVoice-control MQTT smart-home devices, an LLM picks the device and commandmain.py
AlarmA Skill and a daemon working together via shared filesmain.py + background.py

🟪 Agent Controlled (the Agent decides when to run it, still in development)

TemplateTeachesEntry
WikipediaAnswer "what is" questions with a short Wikipedia summary, no key neededmain.py

🟧 Background Daemon (auto-runs and loops for the whole session)

TemplateTeachesEntry
Background DaemonA continuous monitor loopbackground.py

🟩 Local (runs on real DevKit hardware)

TemplateTeachesEntry
Philips Hue Light ControlControl a Hue bulb over Bluetooth, no bridge neededmain.py + devkit_functions.py
DevKit LED Lights ControlVoice-control the DevKit's onboard NeoPixel ringmain.py + devkit_functions.py
Camera FeedLook at the DevKit's live camera feed and answer questions about itmain.py + devkit_functions.py
DevKit StatsReport live DevKit telemetry by voice: CPU, memory, temperature, uptimemain.py + devkit_functions.py

More detail on each template: templates/README.md


⭐ Official OpenHome Abilities

Maintained by the OpenHome team. Tested, stable, and supported. Install any of these from the dashboard, or read the source to learn the patterns.

AbilityWhat it doesTry sayingAPI key
Audius Music DJStream and DJ music from Audius"play something on audius"Audius
Basic AdvisorDaily life advice"give me advice"None
Date and TimeCurrent date and time"what time is it"None
Music PlayerPlay music from a URL or file"play a song"None
Perplexity Web SearchAI-powered web search"search the web"Perplexity
Quiz GameAI-generated trivia"start a quiz"None
Sound GeneratorAI sound effects"make a sound"ElevenLabs
WeatherCurrent weather by location"what's the weather"None

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


🌍 Community Contributed Abilities

Built by the community and featured on the Marketplace. Each Ability is reviewed for security and SDK compliance before it is merged.

AbilityWhat it doesTry sayingAPI key
Daily Morning BriefWeather, today's calendar, and unread Gmail in one briefing"morning brief"Google
Gmail Voice AssistantList, read, compose, reply, and archive Gmail by voice"check my email"Google
Google Calendar AssistantCreate, list, update, and delete calendar events"what's on my calendar"Google
Google Tasks AssistantAdd, view, complete, and rename tasks across lists"add a task"Google
Events ExplorerFind concerts, comedy, sports, festivals, and meetups"find events this weekend"Ticketmaster, Serper, SeatGeek
Ambient SoundsStream rain, ocean, cafe, fire, and white-noise ambience"play rain"Freesound
Movie RecommenderRecommendations, trending, ratings, and where to watch"recommend a movie"TMDB
Podcast PlayerFind and play podcast episodes, trending picks, guest search"play a podcast"Listen Notes
Adventure PlannerPlan a trip: itinerary, events, weather, budget, Notion export"one week in Barcelona"Optional (Serper, Notion)
Hacker News DigestA voice digest of the HN front page plus topic deep-dives"what's on Hacker News"None
Spelling Bee CoachSpell words aloud, drill the misses, track accuracy over time"spelling bee"None

Browse all community Abilities →

Want yours featured here? See the Contribution Guide.


⌨️ OpenHome CLI

Once you are comfortable, the openhome CLI runs the whole build loop from your terminal: create, voice-test, push, and contribute, with no zipping or manual uploads.

Setup (from the repo root)

python3 -m venv cli/.venv &&source cli/.venv/bin/activate
pip install -e cli
cp .env.example .env # add your OPENHOME_API_KEY (Settings, then API Keys)

Your API key alone is enough (sent as X-API-KEY), and openhome then runs from anywhere. For openhome call you also need an audio player: on macOS brew install mpv portaudio, on Linux sudo apt install mpv portaudio19-dev.

The loop

openhome agents # list your agents
openhome create my-skill -t basic-template # scaffold into user/ and push to your account# ...edit user/my-skill/main.py...
openhome push user/my-skill --commit -m "v2"# update the ability in place, commit a version
openhome call # real mic and speaker voice test
openhome sync # pull your account's abilities back into user/
openhome delete my-skill # remove from account and local folder

Contribute from the CLI. Your personal Abilities live in user/ (gitignored). Promote a finished one into community/ and open a PR:

openhome push_to_community my-skill # copy user/my-skill into community/, then validate

Full command reference and the API contract: cli/README.md.


🤝 Contribution Guide

We welcome community Abilities. The short version:

  1. Fork this repo.
  2. Copy a template into community/your-ability-name/.
  3. Build your Ability (main.py plus README.md).
  4. Validate it: python3 validate_ability.py community/your-ability-name.
  5. Open a Pull Request against the dev branch.

First time? Look for good-first-issue. Full guide: CONTRIBUTING.md. Also: CODE_OF_CONDUCT.md, SECURITY.md.


🌟 Contributors

Built by an incredible community. Thank you to everyone who has shipped an Ability or improved the project.

Rizwan-095uzair401Husnain-Bhattihassan1731996chrisgbizmegz2020Kaushal-205abubakar4360samsonadmasuArturKozhushnyiyonaseth12RyanBhandalfiction17Ju-uscBhargavTeluammyyou112Akio9090-devzainirfan13harmsolo13engrumair842-archalimujtaba478BILLKISHOREfrancippipinstallshanFHLiang221melodyguiuchebuzz-codersterling-progjibzuscodeforstartupsSpkArtZensaifrehman100Rizwan-algorycrawqubitMmilessmahsumaktasMKmuneebkhalidKuberwastakenStressTestorcode-guru1chadnewbrycedarscarlettbrianchildersazazrashidcrunchdomou-faizanKDJ-MalikAsad-NCSShayanKhan183AhmedRaza-2Bilalkhan-celMMEHDI0606milliyinnida-akhtarmuj25Huzaifa-Abdurahmanmibrahim-khalilileana-pr

Want to contribute? Start here.


🏆 Community to Official

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

  • Stability, no critical bugs for 30 or more days.
  • Quality, clean code and great voice UX.
  • Maintenance, a responsive author.

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


📚 Official OpenHome Docs

Get started

SDK reference

Design and advanced


📜 License

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

Back to top

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

476 stars

Watchers

6 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

LicensePythonAbilitiesStarsForksContributorsIssues

OpenHome

OpenHome Abilities

Open-source voice-AI plugins that give your OpenHome Agent new powers.

Build, share, and remix.

PythonBuild an Agent plugin in Python · 🎙️ Test it with voice · 🛍️ Ship your Agent Skill to the Marketplace

OpenHome Web AppOfficial OpenHome DocsAbilities MarketplaceJoin our Discord Community


Official OpenHome Abilities
Team-maintained Abilities. Tested, stable, and supported.
🧰 Abilities Starter Templates
Minimal, working scaffolds to copy and build on.
🌍 Community Contributed Abilities
Voice Abilities built and shared by the community.
🤝 Contribution Guide
Build your own Ability and open a pull request.

🧩 What Are Abilities?

An Ability is a plugin that extends your OpenHome Agent to do something the language model cannot do from a prompt alone, such as fetching data from the web, controlling a smart device, playing audio, remembering things across sessions, or running a multi-step voice workflow.

The test: if the LLM can already answer it in conversation, it is not adding value as an Ability.

You speak a trigger word -> your Ability is triggered -> its flow runs -> the Agent responds

You write the logic. OpenHome handles speech-to-text, the LLM, text-to-speech, and routing. Most Abilities are a single file: main.py.


📖 Quick Reference

New to OpenHome? Here is the vocabulary in one place.

Key terms

TermWhat it means
Agent (Personality)The voice assistant itself: an LLM, a voice, and a prompt. Every OpenHome speaker runs one, and it adapts to you as you talk.
AbilityA Python plugin that gives an Agent a new power (this repo).
Trigger wordsThe spoken phrases that activate an Ability, set in the dashboard.
CapabilityWorkerThe SDK object an Ability uses for all input and output (speak, listen, call the LLM, store files).
MarketplaceWhere the community shares Agents and Abilities: build in the dashboard, request to publish, and others install and review.
DevKitOpenHome's hardware (a Raspberry Pi) that Local Abilities run on.

The four Ability types

TypeTriggered byLifecycleUsed forEntry file(s)
🟦 SkillA user trigger wordRuns once, then exitsHotword-triggered tasks (the original pattern)main.py
🟪 Agent ControlledThe Agent decidesRuns on demandData lookups, tool use, delegated actionsmain.py (In active development)
🟧 Background DaemonAuto-starts when a session beginsLoops until the session endsMonitoring, alarms, ambient intelligencebackground.py
🟩 LocalA user trigger wordRuns on DevKit hardwareGPIO, sensors, and other on-device hardwaremain.py + devkit_functions.py

🚀 Build Your First Ability

You only need to edit one file. Here is the whole loop.

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 (this is a complete, working Ability)

fromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None#{{register capability}} # required boilerplate, copy exactlydefcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! What's on your mind?")
user_input=awaitself.capability_worker.user_response()
reply=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(reply)
self.capability_worker.resume_normal_flow() # always call this on exit

Two rules that matter most: keep the #{{register capability}} tag exactly as written, and call resume_normal_flow() on every exit path or the speaker stays silent. OpenHome manages the platform-level config.json at runtime, so you never create or edit it.

3. Upload it

  • Zip your folder.
  • Go to app.openhome.com, then Abilities, then Add Custom Ability.
  • Upload the zip.

4. Set your trigger words in the dashboard (the phrases that activate your Ability).

5. Test it in the Live Editor, then say a trigger word in a conversation.

Prefer the terminal? Once you are comfortable, the OpenHome CLI does this whole loop (create, voice-test, push) without zipping or uploading by hand.

📖 Full walkthrough: docs/getting-started.md


🧰 Abilities Starter Templates

Do not start from a blank file. Each template is a minimal, working scaffold for one Ability type; together they cover all four types, so you can start from the pattern closest to what you are building. Copy one and build on top of it.

🟦 Skill (runs once on a trigger word)

TemplateTeachesEntry
Basic TemplateThe minimal Speak, Listen, Respond, Exit loopmain.py
API TemplateFetch from an external API and speak the resultmain.py
Loop TemplateMulti-turn conversation until an exit phrasemain.py
Slack AssistantSlack by voice: channels, messages, DMs, and people searchmain.py
Send EmailSend email with attachments via send_email()main.py
Read Write FilePersist data across sessions with file storagemain.py
OpenClawDrive a local computer through OpenClawmain.py
OpenHome Local LinkTurn speech into shell commands on a local machinemain.py
Smart HomeVoice-control MQTT smart-home devices, an LLM picks the device and commandmain.py
AlarmA Skill and a daemon working together via shared filesmain.py + background.py

🟪 Agent Controlled (the Agent decides when to run it, still in development)

TemplateTeachesEntry
WikipediaAnswer "what is" questions with a short Wikipedia summary, no key neededmain.py

🟧 Background Daemon (auto-runs and loops for the whole session)

TemplateTeachesEntry
Background DaemonA continuous monitor loopbackground.py

🟩 Local (runs on real DevKit hardware)

TemplateTeachesEntry
Philips Hue Light ControlControl a Hue bulb over Bluetooth, no bridge neededmain.py + devkit_functions.py
DevKit LED Lights ControlVoice-control the DevKit's onboard NeoPixel ringmain.py + devkit_functions.py
Camera FeedLook at the DevKit's live camera feed and answer questions about itmain.py + devkit_functions.py
DevKit StatsReport live DevKit telemetry by voice: CPU, memory, temperature, uptimemain.py + devkit_functions.py

More detail on each template: templates/README.md


⭐ Official OpenHome Abilities

Maintained by the OpenHome team. Tested, stable, and supported. Install any of these from the dashboard, or read the source to learn the patterns.

AbilityWhat it doesTry sayingAPI key
Audius Music DJStream and DJ music from Audius"play something on audius"Audius
Basic AdvisorDaily life advice"give me advice"None
Date and TimeCurrent date and time"what time is it"None
Music PlayerPlay music from a URL or file"play a song"None
Perplexity Web SearchAI-powered web search"search the web"Perplexity
Quiz GameAI-generated trivia"start a quiz"None
Sound GeneratorAI sound effects"make a sound"ElevenLabs
WeatherCurrent weather by location"what's the weather"None

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


🌍 Community Contributed Abilities

Built by the community and featured on the Marketplace. Each Ability is reviewed for security and SDK compliance before it is merged.

AbilityWhat it doesTry sayingAPI key
Daily Morning BriefWeather, today's calendar, and unread Gmail in one briefing"morning brief"Google
Gmail Voice AssistantList, read, compose, reply, and archive Gmail by voice"check my email"Google
Google Calendar AssistantCreate, list, update, and delete calendar events"what's on my calendar"Google
Google Tasks AssistantAdd, view, complete, and rename tasks across lists"add a task"Google
Events ExplorerFind concerts, comedy, sports, festivals, and meetups"find events this weekend"Ticketmaster, Serper, SeatGeek
Ambient SoundsStream rain, ocean, cafe, fire, and white-noise ambience"play rain"Freesound
Movie RecommenderRecommendations, trending, ratings, and where to watch"recommend a movie"TMDB
Podcast PlayerFind and play podcast episodes, trending picks, guest search"play a podcast"Listen Notes
Adventure PlannerPlan a trip: itinerary, events, weather, budget, Notion export"one week in Barcelona"Optional (Serper, Notion)
Hacker News DigestA voice digest of the HN front page plus topic deep-dives"what's on Hacker News"None
Spelling Bee CoachSpell words aloud, drill the misses, track accuracy over time"spelling bee"None

Browse all community Abilities →

Want yours featured here? See the Contribution Guide.


⌨️ OpenHome CLI

Once you are comfortable, the openhome CLI runs the whole build loop from your terminal: create, voice-test, push, and contribute, with no zipping or manual uploads.

Setup (from the repo root)

python3 -m venv cli/.venv &&source cli/.venv/bin/activate
pip install -e cli
cp .env.example .env # add your OPENHOME_API_KEY (Settings, then API Keys)

Your API key alone is enough (sent as X-API-KEY), and openhome then runs from anywhere. For openhome call you also need an audio player: on macOS brew install mpv portaudio, on Linux sudo apt install mpv portaudio19-dev.

The loop

openhome agents # list your agents
openhome create my-skill -t basic-template # scaffold into user/ and push to your account# ...edit user/my-skill/main.py...
openhome push user/my-skill --commit -m "v2"# update the ability in place, commit a version
openhome call # real mic and speaker voice test
openhome sync # pull your account's abilities back into user/
openhome delete my-skill # remove from account and local folder

Contribute from the CLI. Your personal Abilities live in user/ (gitignored). Promote a finished one into community/ and open a PR:

openhome push_to_community my-skill # copy user/my-skill into community/, then validate

Full command reference and the API contract: cli/README.md.


🤝 Contribution Guide

We welcome community Abilities. The short version:

  1. Fork this repo.
  2. Copy a template into community/your-ability-name/.
  3. Build your Ability (main.py plus README.md).
  4. Validate it: python3 validate_ability.py community/your-ability-name.
  5. Open a Pull Request against the dev branch.

First time? Look for good-first-issue. Full guide: CONTRIBUTING.md. Also: CODE_OF_CONDUCT.md, SECURITY.md.


🌟 Contributors

Built by an incredible community. Thank you to everyone who has shipped an Ability or improved the project.

Rizwan-095uzair401Husnain-Bhattihassan1731996chrisgbizmegz2020Kaushal-205abubakar4360samsonadmasuArturKozhushnyiyonaseth12RyanBhandalfiction17Ju-uscBhargavTeluammyyou112Akio9090-devzainirfan13harmsolo13engrumair842-archalimujtaba478BILLKISHOREfrancippipinstallshanFHLiang221melodyguiuchebuzz-codersterling-progjibzuscodeforstartupsSpkArtZensaifrehman100Rizwan-algorycrawqubitMmilessmahsumaktasMKmuneebkhalidKuberwastakenStressTestorcode-guru1chadnewbrycedarscarlettbrianchildersazazrashidcrunchdomou-faizanKDJ-MalikAsad-NCSShayanKhan183AhmedRaza-2Bilalkhan-celMMEHDI0606milliyinnida-akhtarmuj25Huzaifa-Abdurahmanmibrahim-khalilileana-pr

Want to contribute? Start here.


🏆 Community to Official

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

  • Stability, no critical bugs for 30 or more days.
  • Quality, clean code and great voice UX.
  • Maintenance, a responsive author.

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


📚 Official OpenHome Docs

Get started

SDK reference

Design and advanced


📜 License

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

Back to top

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

476 stars

Watchers

6 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

LicensePythonAbilitiesStarsForksContributorsIssues

OpenHome

OpenHome Abilities

Open-source voice-AI plugins that give your OpenHome Agent new powers.

Build, share, and remix.

PythonBuild an Agent plugin in Python · 🎙️ Test it with voice · 🛍️ Ship your Agent Skill to the Marketplace

OpenHome Web AppOfficial OpenHome DocsAbilities MarketplaceJoin our Discord Community


Official OpenHome Abilities
Team-maintained Abilities. Tested, stable, and supported.
🧰 Abilities Starter Templates
Minimal, working scaffolds to copy and build on.
🌍 Community Contributed Abilities
Voice Abilities built and shared by the community.
🤝 Contribution Guide
Build your own Ability and open a pull request.

🧩 What Are Abilities?

An Ability is a plugin that extends your OpenHome Agent to do something the language model cannot do from a prompt alone, such as fetching data from the web, controlling a smart device, playing audio, remembering things across sessions, or running a multi-step voice workflow.

The test: if the LLM can already answer it in conversation, it is not adding value as an Ability.

You speak a trigger word -> your Ability is triggered -> its flow runs -> the Agent responds

You write the logic. OpenHome handles speech-to-text, the LLM, text-to-speech, and routing. Most Abilities are a single file: main.py.


📖 Quick Reference

New to OpenHome? Here is the vocabulary in one place.

Key terms

TermWhat it means
Agent (Personality)The voice assistant itself: an LLM, a voice, and a prompt. Every OpenHome speaker runs one, and it adapts to you as you talk.
AbilityA Python plugin that gives an Agent a new power (this repo).
Trigger wordsThe spoken phrases that activate an Ability, set in the dashboard.
CapabilityWorkerThe SDK object an Ability uses for all input and output (speak, listen, call the LLM, store files).
MarketplaceWhere the community shares Agents and Abilities: build in the dashboard, request to publish, and others install and review.
DevKitOpenHome's hardware (a Raspberry Pi) that Local Abilities run on.

The four Ability types

TypeTriggered byLifecycleUsed forEntry file(s)
🟦 SkillA user trigger wordRuns once, then exitsHotword-triggered tasks (the original pattern)main.py
🟪 Agent ControlledThe Agent decidesRuns on demandData lookups, tool use, delegated actionsmain.py (In active development)
🟧 Background DaemonAuto-starts when a session beginsLoops until the session endsMonitoring, alarms, ambient intelligencebackground.py
🟩 LocalA user trigger wordRuns on DevKit hardwareGPIO, sensors, and other on-device hardwaremain.py + devkit_functions.py

🚀 Build Your First Ability

You only need to edit one file. Here is the whole loop.

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 (this is a complete, working Ability)

fromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None#{{register capability}} # required boilerplate, copy exactlydefcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! What's on your mind?")
user_input=awaitself.capability_worker.user_response()
reply=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(reply)
self.capability_worker.resume_normal_flow() # always call this on exit

Two rules that matter most: keep the #{{register capability}} tag exactly as written, and call resume_normal_flow() on every exit path or the speaker stays silent. OpenHome manages the platform-level config.json at runtime, so you never create or edit it.

3. Upload it

  • Zip your folder.
  • Go to app.openhome.com, then Abilities, then Add Custom Ability.
  • Upload the zip.

4. Set your trigger words in the dashboard (the phrases that activate your Ability).

5. Test it in the Live Editor, then say a trigger word in a conversation.

Prefer the terminal? Once you are comfortable, the OpenHome CLI does this whole loop (create, voice-test, push) without zipping or uploading by hand.

📖 Full walkthrough: docs/getting-started.md


🧰 Abilities Starter Templates

Do not start from a blank file. Each template is a minimal, working scaffold for one Ability type; together they cover all four types, so you can start from the pattern closest to what you are building. Copy one and build on top of it.

🟦 Skill (runs once on a trigger word)

TemplateTeachesEntry
Basic TemplateThe minimal Speak, Listen, Respond, Exit loopmain.py
API TemplateFetch from an external API and speak the resultmain.py
Loop TemplateMulti-turn conversation until an exit phrasemain.py
Slack AssistantSlack by voice: channels, messages, DMs, and people searchmain.py
Send EmailSend email with attachments via send_email()main.py
Read Write FilePersist data across sessions with file storagemain.py
OpenClawDrive a local computer through OpenClawmain.py
OpenHome Local LinkTurn speech into shell commands on a local machinemain.py
Smart HomeVoice-control MQTT smart-home devices, an LLM picks the device and commandmain.py
AlarmA Skill and a daemon working together via shared filesmain.py + background.py

🟪 Agent Controlled (the Agent decides when to run it, still in development)

TemplateTeachesEntry
WikipediaAnswer "what is" questions with a short Wikipedia summary, no key neededmain.py

🟧 Background Daemon (auto-runs and loops for the whole session)

TemplateTeachesEntry
Background DaemonA continuous monitor loopbackground.py

🟩 Local (runs on real DevKit hardware)

TemplateTeachesEntry
Philips Hue Light ControlControl a Hue bulb over Bluetooth, no bridge neededmain.py + devkit_functions.py
DevKit LED Lights ControlVoice-control the DevKit's onboard NeoPixel ringmain.py + devkit_functions.py
Camera FeedLook at the DevKit's live camera feed and answer questions about itmain.py + devkit_functions.py
DevKit StatsReport live DevKit telemetry by voice: CPU, memory, temperature, uptimemain.py + devkit_functions.py

More detail on each template: templates/README.md


⭐ Official OpenHome Abilities

Maintained by the OpenHome team. Tested, stable, and supported. Install any of these from the dashboard, or read the source to learn the patterns.

AbilityWhat it doesTry sayingAPI key
Audius Music DJStream and DJ music from Audius"play something on audius"Audius
Basic AdvisorDaily life advice"give me advice"None
Date and TimeCurrent date and time"what time is it"None
Music PlayerPlay music from a URL or file"play a song"None
Perplexity Web SearchAI-powered web search"search the web"Perplexity
Quiz GameAI-generated trivia"start a quiz"None
Sound GeneratorAI sound effects"make a sound"ElevenLabs
WeatherCurrent weather by location"what's the weather"None

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


🌍 Community Contributed Abilities

Built by the community and featured on the Marketplace. Each Ability is reviewed for security and SDK compliance before it is merged.

AbilityWhat it doesTry sayingAPI key
Daily Morning BriefWeather, today's calendar, and unread Gmail in one briefing"morning brief"Google
Gmail Voice AssistantList, read, compose, reply, and archive Gmail by voice"check my email"Google
Google Calendar AssistantCreate, list, update, and delete calendar events"what's on my calendar"Google
Google Tasks AssistantAdd, view, complete, and rename tasks across lists"add a task"Google
Events ExplorerFind concerts, comedy, sports, festivals, and meetups"find events this weekend"Ticketmaster, Serper, SeatGeek
Ambient SoundsStream rain, ocean, cafe, fire, and white-noise ambience"play rain"Freesound
Movie RecommenderRecommendations, trending, ratings, and where to watch"recommend a movie"TMDB
Podcast PlayerFind and play podcast episodes, trending picks, guest search"play a podcast"Listen Notes
Adventure PlannerPlan a trip: itinerary, events, weather, budget, Notion export"one week in Barcelona"Optional (Serper, Notion)
Hacker News DigestA voice digest of the HN front page plus topic deep-dives"what's on Hacker News"None
Spelling Bee CoachSpell words aloud, drill the misses, track accuracy over time"spelling bee"None

Browse all community Abilities →

Want yours featured here? See the Contribution Guide.


⌨️ OpenHome CLI

Once you are comfortable, the openhome CLI runs the whole build loop from your terminal: create, voice-test, push, and contribute, with no zipping or manual uploads.

Setup (from the repo root)

python3 -m venv cli/.venv &&source cli/.venv/bin/activate
pip install -e cli
cp .env.example .env # add your OPENHOME_API_KEY (Settings, then API Keys)

Your API key alone is enough (sent as X-API-KEY), and openhome then runs from anywhere. For openhome call you also need an audio player: on macOS brew install mpv portaudio, on Linux sudo apt install mpv portaudio19-dev.

The loop

openhome agents # list your agents
openhome create my-skill -t basic-template # scaffold into user/ and push to your account# ...edit user/my-skill/main.py...
openhome push user/my-skill --commit -m "v2"# update the ability in place, commit a version
openhome call # real mic and speaker voice test
openhome sync # pull your account's abilities back into user/
openhome delete my-skill # remove from account and local folder

Contribute from the CLI. Your personal Abilities live in user/ (gitignored). Promote a finished one into community/ and open a PR:

openhome push_to_community my-skill # copy user/my-skill into community/, then validate

Full command reference and the API contract: cli/README.md.


🤝 Contribution Guide

We welcome community Abilities. The short version:

  1. Fork this repo.
  2. Copy a template into community/your-ability-name/.
  3. Build your Ability (main.py plus README.md).
  4. Validate it: python3 validate_ability.py community/your-ability-name.
  5. Open a Pull Request against the dev branch.

First time? Look for good-first-issue. Full guide: CONTRIBUTING.md. Also: CODE_OF_CONDUCT.md, SECURITY.md.


🌟 Contributors

Built by an incredible community. Thank you to everyone who has shipped an Ability or improved the project.

Rizwan-095uzair401Husnain-Bhattihassan1731996chrisgbizmegz2020Kaushal-205abubakar4360samsonadmasuArturKozhushnyiyonaseth12RyanBhandalfiction17Ju-uscBhargavTeluammyyou112Akio9090-devzainirfan13harmsolo13engrumair842-archalimujtaba478BILLKISHOREfrancippipinstallshanFHLiang221melodyguiuchebuzz-codersterling-progjibzuscodeforstartupsSpkArtZensaifrehman100Rizwan-algorycrawqubitMmilessmahsumaktasMKmuneebkhalidKuberwastakenStressTestorcode-guru1chadnewbrycedarscarlettbrianchildersazazrashidcrunchdomou-faizanKDJ-MalikAsad-NCSShayanKhan183AhmedRaza-2Bilalkhan-celMMEHDI0606milliyinnida-akhtarmuj25Huzaifa-Abdurahmanmibrahim-khalilileana-pr

Want to contribute? Start here.


🏆 Community to Official

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

  • Stability, no critical bugs for 30 or more days.
  • Quality, clean code and great voice UX.
  • Maintenance, a responsive author.

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


📚 Official OpenHome Docs

Get started

SDK reference

Design and advanced


📜 License

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

Back to top

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

476 stars

Watchers

6 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

LicensePythonAbilitiesStarsForksContributorsIssues

OpenHome

OpenHome Abilities

Open-source voice-AI plugins that give your OpenHome Agent new powers.

Build, share, and remix.

PythonBuild an Agent plugin in Python · 🎙️ Test it with voice · 🛍️ Ship your Agent Skill to the Marketplace

OpenHome Web AppOfficial OpenHome DocsAbilities MarketplaceJoin our Discord Community


Official OpenHome Abilities
Team-maintained Abilities. Tested, stable, and supported.
🧰 Abilities Starter Templates
Minimal, working scaffolds to copy and build on.
🌍 Community Contributed Abilities
Voice Abilities built and shared by the community.
🤝 Contribution Guide
Build your own Ability and open a pull request.

🧩 What Are Abilities?

An Ability is a plugin that extends your OpenHome Agent to do something the language model cannot do from a prompt alone, such as fetching data from the web, controlling a smart device, playing audio, remembering things across sessions, or running a multi-step voice workflow.

The test: if the LLM can already answer it in conversation, it is not adding value as an Ability.

You speak a trigger word -> your Ability is triggered -> its flow runs -> the Agent responds

You write the logic. OpenHome handles speech-to-text, the LLM, text-to-speech, and routing. Most Abilities are a single file: main.py.


📖 Quick Reference

New to OpenHome? Here is the vocabulary in one place.

Key terms

TermWhat it means
Agent (Personality)The voice assistant itself: an LLM, a voice, and a prompt. Every OpenHome speaker runs one, and it adapts to you as you talk.
AbilityA Python plugin that gives an Agent a new power (this repo).
Trigger wordsThe spoken phrases that activate an Ability, set in the dashboard.
CapabilityWorkerThe SDK object an Ability uses for all input and output (speak, listen, call the LLM, store files).
MarketplaceWhere the community shares Agents and Abilities: build in the dashboard, request to publish, and others install and review.
DevKitOpenHome's hardware (a Raspberry Pi) that Local Abilities run on.

The four Ability types

TypeTriggered byLifecycleUsed forEntry file(s)
🟦 SkillA user trigger wordRuns once, then exitsHotword-triggered tasks (the original pattern)main.py
🟪 Agent ControlledThe Agent decidesRuns on demandData lookups, tool use, delegated actionsmain.py (In active development)
🟧 Background DaemonAuto-starts when a session beginsLoops until the session endsMonitoring, alarms, ambient intelligencebackground.py
🟩 LocalA user trigger wordRuns on DevKit hardwareGPIO, sensors, and other on-device hardwaremain.py + devkit_functions.py

🚀 Build Your First Ability

You only need to edit one file. Here is the whole loop.

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 (this is a complete, working Ability)

fromsrc.agent.capabilityimportMatchingCapabilityfromsrc.mainimportAgentWorkerfromsrc.agent.capability_workerimportCapabilityWorkerclassMyFirstCapability(MatchingCapability):
worker: AgentWorker=Nonecapability_worker: CapabilityWorker=None#{{register capability}} # required boilerplate, copy exactlydefcall(self, worker: AgentWorker):
self.worker=workerself.capability_worker=CapabilityWorker(self)
self.worker.session_tasks.create(self.run())
asyncdefrun(self):
awaitself.capability_worker.speak("Hi! What's on your mind?")
user_input=awaitself.capability_worker.user_response()
reply=self.capability_worker.text_to_text_response(
f"Give a short, helpful response to: {user_input}"
)
awaitself.capability_worker.speak(reply)
self.capability_worker.resume_normal_flow() # always call this on exit

Two rules that matter most: keep the #{{register capability}} tag exactly as written, and call resume_normal_flow() on every exit path or the speaker stays silent. OpenHome manages the platform-level config.json at runtime, so you never create or edit it.

3. Upload it

  • Zip your folder.
  • Go to app.openhome.com, then Abilities, then Add Custom Ability.
  • Upload the zip.

4. Set your trigger words in the dashboard (the phrases that activate your Ability).

5. Test it in the Live Editor, then say a trigger word in a conversation.

Prefer the terminal? Once you are comfortable, the OpenHome CLI does this whole loop (create, voice-test, push) without zipping or uploading by hand.

📖 Full walkthrough: docs/getting-started.md


🧰 Abilities Starter Templates

Do not start from a blank file. Each template is a minimal, working scaffold for one Ability type; together they cover all four types, so you can start from the pattern closest to what you are building. Copy one and build on top of it.

🟦 Skill (runs once on a trigger word)

TemplateTeachesEntry
Basic TemplateThe minimal Speak, Listen, Respond, Exit loopmain.py
API TemplateFetch from an external API and speak the resultmain.py
Loop TemplateMulti-turn conversation until an exit phrasemain.py
Slack AssistantSlack by voice: channels, messages, DMs, and people searchmain.py
Send EmailSend email with attachments via send_email()main.py
Read Write FilePersist data across sessions with file storagemain.py
OpenClawDrive a local computer through OpenClawmain.py
OpenHome Local LinkTurn speech into shell commands on a local machinemain.py
Smart HomeVoice-control MQTT smart-home devices, an LLM picks the device and commandmain.py
AlarmA Skill and a daemon working together via shared filesmain.py + background.py

🟪 Agent Controlled (the Agent decides when to run it, still in development)

TemplateTeachesEntry
WikipediaAnswer "what is" questions with a short Wikipedia summary, no key neededmain.py

🟧 Background Daemon (auto-runs and loops for the whole session)

TemplateTeachesEntry
Background DaemonA continuous monitor loopbackground.py

🟩 Local (runs on real DevKit hardware)

TemplateTeachesEntry
Philips Hue Light ControlControl a Hue bulb over Bluetooth, no bridge neededmain.py + devkit_functions.py
DevKit LED Lights ControlVoice-control the DevKit's onboard NeoPixel ringmain.py + devkit_functions.py
Camera FeedLook at the DevKit's live camera feed and answer questions about itmain.py + devkit_functions.py
DevKit StatsReport live DevKit telemetry by voice: CPU, memory, temperature, uptimemain.py + devkit_functions.py

More detail on each template: templates/README.md


⭐ Official OpenHome Abilities

Maintained by the OpenHome team. Tested, stable, and supported. Install any of these from the dashboard, or read the source to learn the patterns.

AbilityWhat it doesTry sayingAPI key
Audius Music DJStream and DJ music from Audius"play something on audius"Audius
Basic AdvisorDaily life advice"give me advice"None
Date and TimeCurrent date and time"what time is it"None
Music PlayerPlay music from a URL or file"play a song"None
Perplexity Web SearchAI-powered web search"search the web"Perplexity
Quiz GameAI-generated trivia"start a quiz"None
Sound GeneratorAI sound effects"make a sound"ElevenLabs
WeatherCurrent weather by location"what's the weather"None

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


🌍 Community Contributed Abilities

Built by the community and featured on the Marketplace. Each Ability is reviewed for security and SDK compliance before it is merged.

AbilityWhat it doesTry sayingAPI key
Daily Morning BriefWeather, today's calendar, and unread Gmail in one briefing"morning brief"Google
Gmail Voice AssistantList, read, compose, reply, and archive Gmail by voice"check my email"Google
Google Calendar AssistantCreate, list, update, and delete calendar events"what's on my calendar"Google
Google Tasks AssistantAdd, view, complete, and rename tasks across lists"add a task"Google
Events ExplorerFind concerts, comedy, sports, festivals, and meetups"find events this weekend"Ticketmaster, Serper, SeatGeek
Ambient SoundsStream rain, ocean, cafe, fire, and white-noise ambience"play rain"Freesound
Movie RecommenderRecommendations, trending, ratings, and where to watch"recommend a movie"TMDB
Podcast PlayerFind and play podcast episodes, trending picks, guest search"play a podcast"Listen Notes
Adventure PlannerPlan a trip: itinerary, events, weather, budget, Notion export"one week in Barcelona"Optional (Serper, Notion)
Hacker News DigestA voice digest of the HN front page plus topic deep-dives"what's on Hacker News"None
Spelling Bee CoachSpell words aloud, drill the misses, track accuracy over time"spelling bee"None

Browse all community Abilities →

Want yours featured here? See the Contribution Guide.


⌨️ OpenHome CLI

Once you are comfortable, the openhome CLI runs the whole build loop from your terminal: create, voice-test, push, and contribute, with no zipping or manual uploads.

Setup (from the repo root)

python3 -m venv cli/.venv &&source cli/.venv/bin/activate
pip install -e cli
cp .env.example .env # add your OPENHOME_API_KEY (Settings, then API Keys)

Your API key alone is enough (sent as X-API-KEY), and openhome then runs from anywhere. For openhome call you also need an audio player: on macOS brew install mpv portaudio, on Linux sudo apt install mpv portaudio19-dev.

The loop

openhome agents # list your agents
openhome create my-skill -t basic-template # scaffold into user/ and push to your account# ...edit user/my-skill/main.py...
openhome push user/my-skill --commit -m "v2"# update the ability in place, commit a version
openhome call # real mic and speaker voice test
openhome sync # pull your account's abilities back into user/
openhome delete my-skill # remove from account and local folder

Contribute from the CLI. Your personal Abilities live in user/ (gitignored). Promote a finished one into community/ and open a PR:

openhome push_to_community my-skill # copy user/my-skill into community/, then validate

Full command reference and the API contract: cli/README.md.


🤝 Contribution Guide

We welcome community Abilities. The short version:

  1. Fork this repo.
  2. Copy a template into community/your-ability-name/.
  3. Build your Ability (main.py plus README.md).
  4. Validate it: python3 validate_ability.py community/your-ability-name.
  5. Open a Pull Request against the dev branch.

First time? Look for good-first-issue. Full guide: CONTRIBUTING.md. Also: CODE_OF_CONDUCT.md, SECURITY.md.


🌟 Contributors

Built by an incredible community. Thank you to everyone who has shipped an Ability or improved the project.

Rizwan-095uzair401Husnain-Bhattihassan1731996chrisgbizmegz2020Kaushal-205abubakar4360samsonadmasuArturKozhushnyiyonaseth12RyanBhandalfiction17Ju-uscBhargavTeluammyyou112Akio9090-devzainirfan13harmsolo13engrumair842-archalimujtaba478BILLKISHOREfrancippipinstallshanFHLiang221melodyguiuchebuzz-codersterling-progjibzuscodeforstartupsSpkArtZensaifrehman100Rizwan-algorycrawqubitMmilessmahsumaktasMKmuneebkhalidKuberwastakenStressTestorcode-guru1chadnewbrycedarscarlettbrianchildersazazrashidcrunchdomou-faizanKDJ-MalikAsad-NCSShayanKhan183AhmedRaza-2Bilalkhan-celMMEHDI0606milliyinnida-akhtarmuj25Huzaifa-Abdurahmanmibrahim-khalilileana-pr

Want to contribute? Start here.


🏆 Community to Official

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

  • Stability, no critical bugs for 30 or more days.
  • Quality, clean code and great voice UX.
  • Maintenance, a responsive author.

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


📚 Official OpenHome Docs

Get started

SDK reference

Design and advanced


📜 License

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

Back to top

About

Open-source abilities for OpenHome agents.

Resources

Code of conduct

Contributing

Security policy

Stars

476 stars

Watchers

6 watching

Forks

Releases

Packages

Contributors

Languages