{"id":26700430,"url":"https://github.com/pulsarblow/usain","last_synced_at":"2025-10-06T00:44:11.820Z","repository":{"id":67909760,"uuid":"270140111","full_name":"PulsarBlow/Usain","owner":"PulsarBlow","description":"🏃🏾‍♂️ A simple, fast and scalable Slack events server for .NET","archived":false,"fork":false,"pushed_at":"2024-09-03T21:07:49.000Z","size":556,"stargazers_count":3,"open_issues_count":5,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-19T14:01:03.253Z","etag":null,"topics":["dotnet","dotnet-core","fast","hacktoberfest","scalable","simple","slack","slack-events","slack-events-api"],"latest_commit_sha":null,"homepage":"","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/PulsarBlow.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":null,"security":null,"support":"docs/supported_events.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-07T00:02:21.000Z","updated_at":"2022-02-12T11:28:29.000Z","dependencies_parsed_at":"2025-03-27T00:39:41.198Z","dependency_job_id":null,"html_url":"https://github.com/PulsarBlow/Usain","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/PulsarBlow/Usain","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PulsarBlow%2FUsain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PulsarBlow%2FUsain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PulsarBlow%2FUsain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PulsarBlow%2FUsain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PulsarBlow","download_url":"https://codeload.github.com/PulsarBlow/Usain/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PulsarBlow%2FUsain/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278542680,"owners_count":26004060,"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","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["dotnet","dotnet-core","fast","hacktoberfest","scalable","simple","slack","slack-events","slack-events-api"],"created_at":"2025-03-27T00:28:13.647Z","updated_at":"2025-10-06T00:44:11.786Z","avatar_url":"https://github.com/PulsarBlow.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Usain logo\" src=\"assets/icons/icon.svg\" width=\"90\" /\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003e\n  Usain\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003eA simple, fast and scalable Slack events server for .NET\u003c/h4\u003e\n\n\n# What is Usain ?\n\nThere are plenty of existing Slack integration frameworks. Slack engineering team even provide its own implementation with Bolt (JS, Java).\\\nHowever, while trying to integrate Slack using a .NET Core stack, i didn't find any project that was simple to use, while being fast and scalable...\n\nUsain is simple, fast and scalable.\n\nIt provides the event ingesting and processing infrastructure you need to create an reactive (interactive) Slack App.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Usain logo\" src=\"assets/doc/arch_overview.png\" width=\"768\" /\u003e\n\u003c/p\u003e\n\n## Simple\n\nUsain addresses only two concerns:\n\n- Ingesting your slack event as fast as possible.\n- Processing each and every ingested event in a customizable and reliable way.\n\nThis limitation of concerns enforce simplicity.\n\nAdding an _Event Reaction_ (how to react to a Slack event) is as simple as providing an implementation of the `IEventReaction\u003c\u003e` to the Dependency Injection container. This _Event Reaction_ will be automatically used by the _Event Processor_ pipeline.\n\nHead down to the [Getting started](#Getting-started) section to learn how to implement an EventReaction.\n\n## Fast\n\n### ASP.NET Core\n\nASP.NET Core is fast, really fast.\n\nAccording to [Tech Empower Benchmarks] ìt is one of the fastest web stack on the market as of today (jun 2020). Surprisingly it is even faster than a pure Rust or C++ web server. This is probably due to a lack of maturity in these implementations. That said, in term of pure raw performance, ASP.NET Core is at light years from a Node or Java web stack, which would probably be your choice if you had to use the genuine Slack SDK (Bolt).\n\n### MVC free\n\nUsain is built upon raw ASP.NET Core.\n\nIt does not use ASP.NET Core MVC. This saves us from the extra overhead of the MVC pipeline.\n\n### System.Text.Json\n\nUsain uses [System.Text.Json] for Json serialization operations.\n\n`System.Text.Json` design emphasizes high performance and low memory allocation over an extensive feature set. Built-in UTF-8 support optimizes the process of reading and writing JSON text encoded as UTF-8, which is the most prevalent encoding for data on the web and files on disk.\n\n ### LoggerMessage\n\n Usain uses [LoggerMessage](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/loggermessage?view=aspnetcore-3.1) for logging operations.\n\n LoggerMessage creates cacheable delegates that require fewer object allocations and reduced computational overhead compared to logger extension methods, such as LogInformation and LogDebug. It is the recommended pattern for high-performance logging scenarios.\n\n## Scalable\n\n### De-coupled events ingestion and reaction\nAs recommended by Slack, event ingestion and processing should de-coupled. Slack server expects your event ingestion to be fast and error free otherwise it will block your endpoint and stop sending events. You don't want that to happen in a production scenario.\n\nUsain has been designed to follow that recommendation from the ground up. It uses an intermediate Event Bus abstraction to de-couple event ingestion from event reaction.\n\nWe provide a default in-memory implementation for basic scenarios, but swapping this default for something more scalable is a matter of a single line of configuration.\n\nFor example, in the [02.Advanced.AzureQueue] sample app, we use an [Azure Queue Storage] for the queue infrastructure.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Usain Scalability\" src=\"assets/doc/arch_scalability.png\" width=\"768\" /\u003e\n\u003c/p\u003e\n\n\n### Extensible and flexible\n\nUsain is extensible in almost every area of the Event ingestion and processing pipeline.\n\nThere again, we provide a substitutable default implementations you can swap for whatever your consider a better fit for your use cases or infrastructure requirements.\n\nInternally, Event handlings use a mediated event design. This gives you a lot more flexibility when implementing your business workflows.\n\n## Usain ? 🏃\n\nIn reference to Bolt, the Slack integration framework ([Bolt JS], [Bolt Java]).\n\nYes, you got it, Usain vs Bolt. Uhm... 🙄\n\n# Getting started\n\nTo be completed.\n\nMeanwhile, jump to the sample sources:\n\n- [01.Simple]: demonstrates how to use Usain's Event Listener and Event Processor inside a unique web app. It uses an in-memory shared event queue. For demo purpose only.\n- [02.Advanced.AzureQueue]: demonstrates how to use Usain's Event Listener and the Event Process in distinct hosting processes. It uses an [Azure Queue Storage], providing a better scalability and good fault tolerance.\n\n# Others resources\n\n- [Supported events]: list of Slack events currently supported by Usain\n\n\n# Attributions\n\nUsain icons made by [Pixel perfect] from [FlatIcon]\n\n[Tech Empower Benchmarks]: \u003chttps://www.techempower.com/benchmarks/#section=data-r19\u0026hw=ph\u0026test=plaintext\u003e\n[System.Text.Json]: \u003chttps://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-overview\u003e\n[LoggerMessage]: \u003chttps://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/loggermessage?view=aspnetcore-3.1\u003e\n[Bolt JS]: \u003chttps://slack.dev/bolt-js/tutorial/getting-started\u003e\n[Bolt Java]: \u003chttps://slack.dev/java-slack-sdk/guides/getting-started-with-bolt\u003e\n[01.Simple]: \u003c./samples/01.simple\u003e\n[02.Advanced.AzureQueue]: \u003c./samples/02.advanced.azurequeue\u003e\n[Azure Queue Storage]: \u003chttps://azure.microsoft.com/en-us/services/storage/queues/\u003e\n[Supported events]: \u003c./docs/supported_events.md\u003e\n[FlatIcon]: \u003chttp://www.flaticon.com/\u003e\n[Pixel perfect]: \u003chttps://www.flaticon.com/authors/pixel-perfect\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpulsarblow%2Fusain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpulsarblow%2Fusain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpulsarblow%2Fusain/lists"}