{"id":13799015,"url":"https://github.com/timheuer/alexa-skills-dotnet","last_synced_at":"2025-05-14T04:07:46.400Z","repository":{"id":14357931,"uuid":"76400640","full_name":"timheuer/alexa-skills-dotnet","owner":"timheuer","description":"An Amazon Alexa Skills SDK for .NET","archived":false,"fork":false,"pushed_at":"2025-01-31T22:17:34.000Z","size":611,"stargazers_count":548,"open_issues_count":2,"forks_count":108,"subscribers_count":36,"default_branch":"master","last_synced_at":"2025-04-12T23:29:35.199Z","etag":null,"topics":["alexa","alexa-skills-sdk","aws-lambda","dotnet","dotnet-core","dotnet-library","dotnet-standard","dotnetcore","intent","skills","sml"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timheuer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-12-13T21:38:55.000Z","updated_at":"2025-04-03T08:52:11.000Z","dependencies_parsed_at":"2023-01-13T20:30:19.078Z","dependency_job_id":"b2b155ae-4429-4da5-a618-1000cfc5e8e4","html_url":"https://github.com/timheuer/alexa-skills-dotnet","commit_stats":{"total_commits":411,"total_committers":26,"mean_commits":"15.807692307692308","dds":0.6058394160583942,"last_synced_commit":"1c69846869e06159c137d7435d32a8334a9d00fc"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timheuer%2Falexa-skills-dotnet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timheuer%2Falexa-skills-dotnet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timheuer%2Falexa-skills-dotnet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timheuer%2Falexa-skills-dotnet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timheuer","download_url":"https://codeload.github.com/timheuer/alexa-skills-dotnet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254069381,"owners_count":22009538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alexa","alexa-skills-sdk","aws-lambda","dotnet","dotnet-core","dotnet-library","dotnet-standard","dotnetcore","intent","skills","sml"],"created_at":"2024-08-04T00:00:57.840Z","updated_at":"2025-05-14T04:07:46.354Z","avatar_url":"https://github.com/timheuer.png","language":"C#","funding_links":["https://github.com/sponsors/timheuer"],"categories":["SDKs/Tools"],"sub_categories":[],"readme":"# Alexa Skills SDK for .NET\n\n\nRead this document in [Español](/docs/README_es.md)\n\n[![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://github.dev/timheuer/alexa-skills-dotnet)\n\n![.NET Core Build and Deploy](https://github.com/timheuer/alexa-skills-dotnet/workflows/.NET%20Core%20Build%20and%20Deploy/badge.svg?branch=master)\n[![All Contributors](https://img.shields.io/badge/all_contributors-16-orange.svg?style=flat-square)](#contributors)\n[![Sponsor Me](https://img.shields.io/badge/Sponsor%20Me%20and%20My%20Projects!--lightgre?style=social\u0026logo=github)](https://github.com/sponsors/timheuer)\n\nAlexa.NET is a helper library for working with Alexa skill requests/responses in C#.  Whether you are using the AWS Lambda service or hosting your own service on your server, this library aims just to make working with the Alexa API more natural for a C# developer using a strongly-typed object model.\n\nAlexa.NET also serves as a base foundation for a set of further Alexa skill development extensions from [Steven Pears](https://github.com/stoiveyp):\n\n* Management [GitHub](https://github.com/stoiveyp/Alexa.NET.Management) / [NuGet](https://www.nuget.org/packages/Alexa.NET.Management)\n* In-skill Pricing [GitHub](https://github.com/stoiveyp/Alexa.NET.InSkillPricing) / [NuGet](https://www.nuget.org/packages/Alexa.NET.InSkillPricing)\n* Messaging [GitHub](https://github.com/stoiveyp/Alexa.NET.SkillMessaging) / [NuGet](https://www.nuget.org/packages/Alexa.NET.SkillMessaging)\n* Gadgets [GitHub](https://github.com/stoiveyp/Alexa.NET.Gadgets) / [NuGet](https://www.nuget.org/packages/Alexa.NET.Gadgets)\n* Customer and Person Profile API [GitHub](https://github.com/stoiveyp/Alexa.NET.Profile) / [NuGet](https://www.nuget.org/packages/Alexa.NET.Profile)\n* Settings API [GitHub](https://github.com/stoiveyp/Alexa.NET.Settings) / [NuGet](https://www.nuget.org/packages/Alexa.NET.Settings)\n* APL Support [GitHub](https://github.com/stoiveyp/Alexa.NET.APL) / [NuGet](https://www.nuget.org/packages/Alexa.NET.APL)\n* Reminders API [GitHub](https://github.com/stoiveyp/Alexa.NET.Reminders) / [NuGet](https://www.nuget.org/packages/Alexa.NET.Reminders)\n* Proactive Events API [GitHub](https://github.com/stoiveyp/Alexa.NET.ProactiveEvents) / [NuGet](https://www.nuget.org/packages/Alexa.NET.ProactiveEvents)\n* CanFulfillIntent Request Support [GitHub](https://github.com/stoiveyp/Alexa.NET.CanFulfillIntentRequest) / [NuGet](https://www.nuget.org/packages/Alexa.NET.CanFulfillIntentRequest)\n* Response Assertions [GitHub](https://github.com/stoiveyp/Alexa.NET.TestUtility/tree/master/Alexa.NET.Assertions) / [NuGet](https://www.nuget.org/packages/Alexa.NET.Assertions)\n* SkillFlow support (experimental)\n    * Object Model [GitHub](https://github.com/stoiveyp/Alexa.NET.SkillFlow) / [NuGet](https://www.nuget.org/packages/Alexa.NET.SkillFlow)\n    * Interpreter [GitHub](https://github.com/stoiveyp/Alexa.NET.SkillFlow.Interpreter) / [NuGet](https://www.nuget.org/packages/Alexa.NET.SkillFlow.Interpreter)\n    * Text Generator [GitHub](https://github.com/stoiveyp/Alexa.NET.SkillFlow.TextGenerator) / [NuGet](https://www.nuget.org/packages/Alexa.NET.SkillFlow.TextGenerator)\n    * Alexa.NET Code Generation Tool [GitHub](https://github.com/stoiveyp/Alexa.NET.SkillFlow.CodeGenerator) / [NuGet](https://www.nuget.org/packages/Alexa.NET.SkillFlow.Tool)\n* Timers API [GitHub](https://github.com/stoiveyp/Alexa.NET.Timers) / [NuGet](https://www.nuget.org/packages/Alexa.NET.Timers)\n* Web API for Games [GitHub](https://github.com/stoiveyp/Alexa.NET.WebApiGames) / [NuGet](https://www.nuget.org/packages/Alexa.NET.WebApiGames)\n* Shopping Kit [GitHub](https://github.com/stoiveyp/Alexa.NET.ShoppingActions) / [NuGet](https://www.nuget.org/packages/Alexa.NET.ShoppingActions)\n* Conversations API (Beta) [GitHub](https://github.com/stoiveyp/Alexa.NET.Conversations) / [NuGet](https://www.nuget.org/packages/Alexa.NET.Conversations)\n* Pin Confirmation (Beta) [GitHub](https://github.com/stoiveyp/Alexa.NET.PinConfirmation) / [NuGet](https://www.nuget.org/packages/Alexa.NET.PinConfirmation)\n\n# Setup\nRegardless of your architecture, your function for Alexa will be accepting a SkillRequest and returning a SkillResponse. The deserialization of the incoming request into a SkillRequest object will depend on your framework.\n```csharp\npublic SkillResponse FunctionHandler(SkillRequest input, ILambdaContext context)\n{\n    // your function logic goes here\n    return new SkillResponse(\"OK\");\n}\n```\n\n## Serialization\nUse the `Amazon.Lambda.Serialization.Json` package. The default may be different depending on how you created your project.\n\nIn your project file:\n```csproj\n\u003cProject Sdk=\"Microsoft.NET.Sdk\"\u003e\n  \u003c!-- ... --\u003e\n  \u003cItemGroup\u003e\n    \u003cPackageReference Include=\"Alexa.NET\" Version=\"1.15.0\" /\u003e\n    \u003cPackageReference Include=\"Amazon.Lambda.Core\" Version=\"1.2.0\" /\u003e\n    \u003cPackageReference Include=\"Amazon.Lambda.Serialization.Json\" Version=\"1.8.0\" /\u003e\n  \u003c/ItemGroup\u003e\n\u003c/Project\u003e\n```\n\nIn any .cs file:\n```csharp\n// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.\n[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]\n```\n\n# Table of Contents\n- [Contributors](#contributors)\n- [Request Types](#request-types)    \n   * [AccountLinkSkillEventRequest](#handling-the-accountlinkskilleventrequest)\n   * [AudioPlayerRequest](#handling-the-audioplayerrequest)\n   * [DisplayElementSelectedRequest](#handling-the-displayelementselectedrequest)\n   * [IntentRequest](#handling-the-intentrequest)\n   * [LaunchRequest](#handling-the-launchrequest)\n   * [PermissionSkillEventRequest](#handling-the-permissionskilleventrequest)\n   * [PlaybackControllerRequest](#handling-the-playbackcontrollerrequest)\n   * [SessionEndedRequest](#handling-the-sessionendedrequest)\n   * [SkillEventRequest](#handling-the-skilleventrequest)\n   * [SystemExceptionRequest](#handling-the-systemexceptionrequest)\n- [Responses](#responses)\n    * [Ask vs. Tell](#ask-vs-tell)\n    * [SSML Response](#ssml-response)\n    * [SSML Response With Card](#ssml-response-with-card)\n    * [SSML Response With Reprompt](#ssml-response-with-reprompt)\n- [Session Variables](#session-variables)\n- [Responses Without Helpers](#responses-without-helpers)\n- [Progressive Responses](#progressive-responses)\n\n\n# Request Types\nAlexa will send different types of requests depending on the events you should respond to. Below are all of the types of requests:\n\n- ```AccountLinkSkillEventRequest```\n- ```AudioPlayerRequest```\n- ```DisplayElementSelectedRequest```\n- ```IntentRequest```\n- ```LaunchRequest```\n- ```PermissionSkillEventRequest```\n- ```PlaybackControllerRequest```\n- ```SessionEndedRequest```\n- ```SkillEventRequest```\n- ```SystemExceptionRequest```\n\n## Handling the AccountLinkSkillEventRequest\nThis request is used for linking Alexa to another account. The request will come with the access token needed to interact with the connected service. These events are only sent if they have been subscribed to.\n```csharp\nvar accountLinkReq = input.Request as AccountLinkSkillEventRequest;\nvar accessToken = accountLinkReq.AccessToken;\n```\n\n## Handling the AudioPlayerRequest\nAudio Player Requests will be sent when a skill is supposed to play audio, or if an audio state change has occured on the device.\n```csharp\n// do some audio response stuff\nvar audioRequest = input.Request as AudioPlayerRequest;\n\nif (audioRequest.AudioRequestType == AudioRequestType.PlaybackNearlyFinished)\n{\n    // queue up another audio file\n}\n```\n\n### AudioRequestType\nEach ```AudioPlayerRequest``` will also come with a request type to describe the state change:\n- ```PlaybackStarted```\n- ```PlaybackFinished```\n- ```PlaybackStopped```\n- ```PlaybackNearlyFinished```\n- ```PlaybackFailed```\n\n## Handling the DisplayElementSelectedRequest\nDisplay Element Selected Requests will be sent when a skill has a GUI, and one of the buttons were selected by the user. This request comes with a token that will tell you which GUI element was selected.\n```csharp\nvar elemSelReq = input.Request as DisplayElementSelectedRequest;\nvar buttonID = elemSelReq.Token;\n```\n\n## Handling the IntentRequest\nThis is the type that will likely be used most often. IntentRequest will also come with an ```Intent``` object and a ```DialogState``` of either ```STARTED```, ```IN_PROGRESS``` or ```COMPLETED```\n\n### Intent\nEach intent is defined by the name configured in the Alexa Developer Console. If you have included slots in your intent, they will be included in this object, along with a confirmation status.\n```csharp\nvar intentRequest = input.Request as IntentRequest;\n\n// check the name to determine what you should do\nif (intentRequest.Intent.Name.Equals(\"MyIntentName\"))\n{\n   if(intentRequest.DialogState.Equals(\"COMPLETED\"))\n   {\n       // get the slots\n       var firstValue = intentRequest.Intent.Slots[\"FirstSlot\"].Value;\n    }\n}\n```\n\n## Handling the LaunchRequest\nThis type of request is sent when your skill is opened with no intents triggered. You should respond and expect an ```IntentRequest``` to follow.\n```csharp\nif(input.Request is LaunchRequest)\n{\n   return ResponseBuilder.Ask(\"How can I help you today?\");\n}\n\n```\n\n## Handling the PermissionSkillEventRequest\nThis event is sent when a customer grants or revokes permissions. This request will include a ```SkillEventPermissions``` object with the included permission changes. These events are only sent if they have been subscribed to.\n```csharp\nvar permissionReq = input.Request as PermissionSkillEventRequest;\nvar firstPermission = permissionReq.Body.AcceptedPermissions[0];\n```\n\n## Handling the PlaybackControllerRequest\nThis event is sent to control playback for an audio player skill.\n```csharp\nvar playbackReq = input.Request as PlaybackControllerRequest;\nswitch(playbackReq.PlaybackRequestType)\n{\n   case PlaybackControllerRequestType.Next:\n      break;\n   case PlaybackControllerRequestType.Pause:\n      break;\n   case PlaybackControllerRequestType.Play:\n      break;\n   case PlaybackControllerRequestType.Previous:\n      break;\n}\n```\n\n## Handling the SessionEndedRequest\nThis event is sent if the user requests to exit, their response takes too long or an error has occured on the device.\n```csharp\nvar sessEndReq = input.Request as SessionEndedRequest;\nswitch(sessEndReq.Reason)\n{\n   case Reason.UserInitiated:\n      break;\n   case Reason.Error:\n      break;\n   case Reason.ExceededMaxReprompts:\n      break;\n}\n```\n\n## Handling the SkillEventRequest\nThis event is sent when a user enables or disables the skill. These events are only sent if they have been subscribed to.\n\n## Handling the SystemExceptionRequest\nWhen an error occurs, whether as the result of a malformed event or too many requests, AVS will return a message to your client that includes an exception code and a description.\n```csharp\nvar sysException = input.Request as SystemExceptionRequest;\nstring message = sysException.Error.Message;\nstring reqID = sysException.ErrorCause.requestId;\nswitch(sysException.Error.Type)\n{\n   case ErrorType.InvalidResponse:\n      break;\n   case ErrorType.DeviceCommunicationError:\n      break;\n   case ErrorType.InternalError:\n      break;\n   case ErrorType.MediaErrorUnknown:\n      break;\n   case ErrorType.InvalidMediaRequest:\n      break;\n   case ErrorType.MediaServiceUnavailable:\n      break;\n   case ErrorType.InternalServerError:\n      break;\n   case ErrorType.InternalDeviceError:\n      break;\n}\n```\n\n# Responses\n\n## Ask Vs Tell\nThere are two helper methods for forming a speech response with ```ResponseBuilder```:\n```csharp\nvar finalResponse = ResponseBuilder.Tell(\"We are done here.\");\nvar openEndedResponse = ResponseBuilder.Ask(\"Are we done here?\");\n```\nUsing Tell sets ```ShouldEndSession``` to ```true```. Using Ask sets ```ShouldEndSession``` to ```false```. Use the appropriate function depending on whether you expect to continue dialog or not.\n\n## SSML Response\nSSML can be used to customize the way Alexa speaks. Below is an example of using SSML with the helper functions:\n```csharp\n// build the speech response \nvar speech = new SsmlOutputSpeech();\nspeech.Ssml = \"\u003cspeak\u003eToday is \u003csay-as interpret-as=\\\"date\\\"\u003e????0922\u003c/say-as\u003e.\u003cbreak strength=\\\"x-strong\\\"/\u003eI hope you have a good day.\u003c/speak\u003e\";\n\n// create the response using the ResponseBuilder\nvar finalResponse = ResponseBuilder.Tell(speech);\nreturn finalResponse;\n```\n\n## SSML Response With Card\nIn your response you can also have a 'Card' response, which presents UI elements to Alexa. ```ResponseBuilder``` presently builds Simple cards only, which contain titles and plain text.\n```csharp\n// create the speech response - cards still need a voice response\nvar speech = new SsmlOutputSpeech();\nspeech.Ssml = \"\u003cspeak\u003eToday is \u003csay-as interpret-as=\\\"date\\\"\u003e????0922\u003c/say-as\u003e.\u003c/speak\u003e\";\n\n// create the card response\nvar finalResponse = ResponseBuilder.TellWithCard(speech, \"Your Card Title\", \"Your card content text goes here, no HTML formatting honored\");\nreturn finalResponse;\n\n```\n\n## SSML Response With Reprompt\nIf you want to reprompt the user, use the Ask helpers. A reprompt can be useful if you would like to continue the conversation, or if you would like to remind the user to answer the question.\n```csharp\n// create the speech response\nvar speech = new SsmlOutputSpeech();\nspeech.Ssml = \"\u003cspeak\u003eToday is \u003csay-as interpret-as=\\\"date\\\"\u003e????0922\u003c/say-as\u003e.\u003c/speak\u003e\";\n\n// create the speech reprompt\nvar repromptMessage = new PlainTextOutputSpeech();\nrepromptMessage.Text = \"Would you like to know what tomorrow is?\";\n\n// create the reprompt\nvar repromptBody = new Reprompt();\nrepromptBody.OutputSpeech = repromptMessage;\n\n// create the response\nvar finalResponse = ResponseBuilder.Ask(speech, repromptBody);\nreturn finalResponse;\n```\n\n## Play Audio File\nIf your skill is registered as an audio player, you can send directives (instructions to play, enqueue, or stop an audio stream). \n\n```csharp\n// create the speech response - you most likely will still have this\nstring audioUrl = \"http://mydomain.com/myaudiofile.mp3\";\nstring audioToken = \"a token to describe the audio file\"; \n\nvar audioResponse = ResponseBuilder.AudioPlayerPlay(PlayBehavior.ReplaceAll, audioUrl, audioToken);\n\nreturn audioResponse\n```\n\n# Session Variables\nSession variables can be saved into a response, and will be sent back and forth as long as the session remains open.\n\n## Response with session variable\n```csharp\nstring speech = \"The time is twelve twenty three.\";\nSession session = input.Session;\n\nif(session.Attributes == null)\n    session.Attributes = new Dictionary\u003cstring, object\u003e();\nsession.Attributes[\"real_time\"] = DateTime.Now;\n\nreturn ResponseBuilder.Tell(speech, session);\n```\n\n## Retrieving session variable from request\n```csharp\nSession session = input.Session;\nDateTime lastTime = session.Attributes[\"real_time\"] as DateTime;\n\nreturn ResponseBuilder.Tell(\"The last day you asked was at \" + lastTime.DayOfWeek.ToString());\n```\n\n# Responses Without Helpers\nIf you do not want to use the helper Tell/Ask functions, you can build up the response manually using the ```Response``` and ```IOutputSpeech``` objects. If you would like to include a ```StandardCard``` or ```LinkAccountCard``` in your response, you could add it like this onto the response body:\n```csharp\n// create the speech response\nvar speech = new SsmlOutputSpeech();\nspeech.Ssml = \"\u003cspeak\u003eToday is \u003csay-as interpret-as=\\\"date\\\"\u003e????0922\u003c/say-as\u003e.\u003c/speak\u003e\";\n\n// create the reprompt speech\nvar repromptMessage = new PlainTextOutputSpeech();\nrepromptMessage.Text = \"Would you like to know what tomorrow is?\";\n\n// create the reprompt object\nvar repromptBody = new Reprompt();\nrepromptBody.OutputSpeech = repromptMessage;\n\n// create the response\nvar responseBody = new ResponseBody();\nresponseBody.OutputSpeech = speech;\nresponseBody.ShouldEndSession = false; // this triggers the reprompt\nresponseBody.Reprompt = repromptBody;\nresponseBody.Card = new SimpleCard {Title = \"Test\", Content = \"Testing Alexa\"};\n\nvar skillResponse = new SkillResponse();\nskillResponse.Response = responseBody;\nskillResponse.Version = \"1.0\";\n\nreturn skillResponse;\n```\n# Progressive Responses\nYour skill can send progressive responses to keep the user engaged while your skill prepares a full response to the user's request. Below is an example of sending a progressive response:\n```csharp\nvar progressiveResponse = new ProgressiveResponse(skillRequest);\nprogressiveResponse.SendSpeech(\"Please wait while I gather your data.\");\n```\n\n## Contributors\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.imacode.ninja\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/147125?v=4?s=100\" width=\"100px;\" alt=\"Steven Pears\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSteven Pears\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=stoiveyp\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=stoiveyp\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#tutorial-stoiveyp\" title=\"Tutorials\"\u003e✅\u003c/a\u003e \u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=stoiveyp\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"http://vineetyadav.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/7949851?v=4?s=100\" width=\"100px;\" alt=\"yadavvineet\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eyadavvineet\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=yadavvineet\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.linkedin.com/in/soc-sieng-b45a9473/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/2647062?v=4?s=100\" width=\"100px;\" alt=\"Soc Sieng\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSoc Sieng\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=socsieng\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.stuartbuchanan.co.uk\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/16162689?v=4?s=100\" width=\"100px;\" alt=\"Stuart Buchanan\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eStuart Buchanan\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=fuzzysb\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/rdlaitila\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/1124388?v=4?s=100\" width=\"100px;\" alt=\"Regan Laitila\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRegan Laitila\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=rdlaitila\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/IcanBENCHurCAT\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/4152550?v=4?s=100\" width=\"100px;\" alt=\"IcanBENCHurCAT\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eIcanBENCHurCAT\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=IcanBENCHurCAT\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.ydeho.com/\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/29730840?v=4?s=100\" width=\"100px;\" alt=\"VinceGusmini\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eVinceGusmini\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=VinceGusmini\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.yasoon.com\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/2111803?v=4?s=100\" width=\"100px;\" alt=\"Tobias Viehweger\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTobias Viehweger\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=tobiasviehweger\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"http://matthiasshapiro.com\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/235365?v=4?s=100\" width=\"100px;\" alt=\"Matthias Shapiro\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMatthias Shapiro\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=matthiasxc\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=matthiasxc\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"http://techpreacher.corti.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/841949?v=4?s=100\" width=\"100px;\" alt=\"Sascha Corti\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSascha Corti\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=TechPreacher\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/StenmannsAr\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/27204921?v=4?s=100\" width=\"100px;\" alt=\"StenmannsAr\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eStenmannsAr\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=StenmannsAr\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://adriangodong.com\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/1140137?v=4?s=100\" width=\"100px;\" alt=\"Adrian Godong\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAdrian Godong\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=adriangodong\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"http://jad.codes\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/68933?v=4?s=100\" width=\"100px;\" alt=\"Jaddie\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJaddie\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/issues?q=author%3Ajaddie\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/evgeni-nabokov\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/3168823?v=4?s=100\" width=\"100px;\" alt=\"Evgeni Nabokov\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEvgeni Nabokov\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=evgeni-nabokov\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://dev.to/mteheran\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/3578356?v=4?s=100\" width=\"100px;\" alt=\"Miguel Teheran\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMiguel Teheran\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=Mteheran\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://martincostello.com/\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/1439341?v=4?s=100\" width=\"100px;\" alt=\"Martin Costello\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMartin Costello\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=martincostello\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/shinya-terasaki\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/16497603?v=4?s=100\" width=\"100px;\" alt=\"Shinya Terasaki\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eShinya Terasaki\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=shinya-terasaki\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/bcuff\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/504266?v=4?s=100\" width=\"100px;\" alt=\"Brandon\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBrandon\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=bcuff\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/aadupirn\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/16725484?v=4?s=100\" width=\"100px;\" alt=\"Aadu Pirn\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAadu Pirn\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=aadupirn\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://peterfoot.net\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/3985053?v=4?s=100\" width=\"100px;\" alt=\"Peter Foot\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePeter Foot\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=peterfoot\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://twitter.com/bnachawati\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/34027178?v=4?s=100\" width=\"100px;\" alt=\"Benoit\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBenoit\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=nachawat\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/commits?author=nachawat\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/FelipeBergmann\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/17437966?v=4?s=100\" width=\"100px;\" alt=\"Felipe Bergmann\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFelipe Bergmann\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/issues?q=author%3AFelipeBergmann\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/thanks\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1121545?v=4?s=100\" width=\"100px;\" alt=\"Thanks\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eThanks\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/timheuer/alexa-skills-dotnet/issues?q=author%3AThanks\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n## Code of Conduct\nThis project has adopted the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). For more information see the Code of Conduct itself or contact project maintainers with any additional questions or comments or to report a violation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimheuer%2Falexa-skills-dotnet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimheuer%2Falexa-skills-dotnet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimheuer%2Falexa-skills-dotnet/lists"}