Alexa Custom Skill -> Forge Bots, Setup Handoff
URL: https://mkdocs.justinsforge.com/memory/handoffs/alexa-forge-skill-setup-2026-05-20/
What this does¶
Lets you say (to any Echo): - "Alexa, tell Forge send turn off the printer to coordinator" - "Alexa, ask Forge to ping remote with check the deploy"
Free-text after "send" or "ping ... with" is captured (AMAZON.SearchQuery slot) and POSTed to Home Assistant, which calls a local webhook on Console, which delivers the text to the bot's chat (visible) and runs the bot's brain on it.
What's already done on the server side¶
forge_alexa_to_bot.py+forge_alexa_webhook.pyon Console:7360 (systemdforge-alexa-webhook.service)- HA
alexa: intent:+intent_script: SendCoordinatorIntent / SendRemoteIntent+ tworest_commandentries - HA restarted, end-to-end smoke tested (HA -> webhook -> brain -> Telegram chat works)
The only thing left is the Amazon Developer Console skill, which has to be created interactively from a logged-in Amazon account.
Amazon Developer Console steps¶
1. Create the skill¶
- Go to https://developer.amazon.com/alexa/console/ask (log in with the same Amazon account your Echo uses)
- Click Create Skill
- Skill name:
Forge - Primary locale: English (US)
- Choose a model: Custom
- Choose hosting: Provision your own
- Click Create skill, then on the next screen pick Start from Scratch -> Continue
2. Set invocation name¶
- Left sidebar -> Invocation -> Skill Invocation Name
- Set to:
forge - Save
3. Add the two intents¶
In the left sidebar -> Interaction Model -> JSON Editor, paste this and click Save Model:
{
"interactionModel": {
"languageModel": {
"invocationName": "forge",
"intents": [
{ "name": "AMAZON.CancelIntent", "samples": [] },
{ "name": "AMAZON.HelpIntent", "samples": [] },
{ "name": "AMAZON.StopIntent", "samples": [] },
{
"name": "SendCoordinatorIntent",
"slots": [
{ "name": "Message", "type": "AMAZON.SearchQuery" }
],
"samples": [
"send {Message} to coordinator",
"tell coordinator {Message}",
"coordinator {Message}",
"to coordinator {Message}"
]
},
{
"name": "SendRemoteIntent",
"slots": [
{ "name": "Message", "type": "AMAZON.SearchQuery" }
],
"samples": [
"ping remote with {Message}",
"tell remote {Message}",
"remote {Message}",
"to remote {Message}"
]
}
],
"types": []
}
}
}
Then click Build Model (top of page). Wait ~30 sec for green checkmark.
4. Configure the endpoint¶
- Left sidebar -> Endpoint
- Service Endpoint Type: HTTPS
- Default Region URL:
https://homeassistant.justinkrystal.com/api/alexa - SSL certificate type for Default Region:
- Pick My development endpoint has a certificate from a trusted certificate authority (your Cloudflare tunnel cert is trusted)
- Click Save Endpoints
5. Account Linking (REQUIRED)¶
- Left sidebar -> Account Linking
- Toggle Do you allow users to create an account or link to an existing account with you? -> ON
- Allow users to enable skill without account linking: OFF (leave default)
- Security Provider Information -> Auth Code Grant
- Fill in exactly:
| Field | Value |
|---|---|
| Your Web Authorization URI | https://homeassistant.justinkrystal.com/auth/authorize |
| Access Token URI | https://homeassistant.justinkrystal.com/auth/token |
| Your Client ID | https://pitangui.amazon.com/ (this is literally Amazon's US redirect URL; HA accepts it as client id) |
| Your Secret | notused (HA ignores this) |
| Your Authentication Scheme | Credentials in request body |
| Scope | leave blank |
- Domain List (bottom): add
homeassistant.justinkrystal.com - Default Access Token Expiration Time -> leave blank
- At the very bottom note the three Redirect URLs Amazon shows (e.g.
https://pitangui.amazon.com/api/skill/link/...). You don't need to paste them anywhere, but verify they exist. - Click Save
6. Enable testing¶
- Left sidebar -> Test (top tab)
- Skill testing is enabled in: change to Development
- The web simulator now works for typed tests, but you want the real Echo.
7. Link from the Alexa app¶
- Open the Alexa app on your phone
- Settings -> Skills & Games -> Your Skills -> Dev tab
- Tap "Forge"
- Tap Enable to Use
- It opens HA's login page, log in
- Approve the link
- Done
8. Test¶
Say to your Echo: - "Alexa, tell forge to send turn off the printer to coordinator" - "Alexa, ask forge to ping remote with check on Plex"
Alexa replies "Sent to coordinator." / "Sent to remote." and ~1-3 sec later the message appears in your Telegram chat with the bot, with the brain's reply right after.
Troubleshooting¶
- Alexa says "Forge isn't responding right now" -> check
journalctl -u forge-alexa-webhook -n 50on Console - "Account not linked" voice error -> redo step 7
- Alexa transcribes but nothing happens -> check HA log at Settings -> System -> Logs for
intent_scripterrors - Brain reply never arrives -> the brain ran fine in smoke test; if voice path skips it, check
/home/justinwieb/forge/logs/forge-alexa-webhook.log
Files created/modified this session¶
| Path | Purpose |
|---|---|
/home/justinwieb/forge/scripts/forge_alexa_to_bot.py |
Coordinator/remote dispatcher (visible msg + brain) |
/home/justinwieb/forge/scripts/forge_alexa_webhook.py |
HTTP receiver on Console:7360 |
/home/justinwieb/.forge-secrets/forge-alexa-webhook.env |
WEBHOOK_SECRET |
/etc/systemd/system/forge-alexa-webhook.service |
Auto-start the webhook |
/config/configuration.yaml (HA) |
alexa: + intent_script: + two rest_command entries |
Webhook secret is also embedded in HA's rest_command payloads. Rotate by editing both files and restarting both services.