{"id":27292925,"url":"https://github.com/amatsagu/tempest","last_synced_at":"2025-12-26T19:16:35.564Z","repository":{"id":38996560,"uuid":"498871614","full_name":"amatsagu/tempest","owner":"amatsagu","description":"Fast and secure functions to build scalable Discord Applications.","archived":false,"fork":false,"pushed_at":"2025-12-11T16:21:52.000Z","size":6020,"stargazers_count":73,"open_issues_count":0,"forks_count":13,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-12-12T18:20:33.201Z","etag":null,"topics":["app","application","bot","discord","discord-api","go","golang","library","tempest"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amatsagu.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":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-06-01T19:26:52.000Z","updated_at":"2025-12-11T16:21:55.000Z","dependencies_parsed_at":"2024-01-22T16:17:32.766Z","dependency_job_id":"63dd8e98-3db1-4454-b110-1a9d30b988ba","html_url":"https://github.com/amatsagu/tempest","commit_stats":null,"previous_names":[],"tags_count":40,"template":false,"template_full_name":null,"purl":"pkg:github/amatsagu/tempest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amatsagu%2Ftempest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amatsagu%2Ftempest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amatsagu%2Ftempest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amatsagu%2Ftempest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amatsagu","download_url":"https://codeload.github.com/amatsagu/tempest/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amatsagu%2Ftempest/sbom","scorecard":{"id":188499,"data":{"date":"2025-08-11","repo":{"name":"github.com/amatsagu/tempest","commit":"7b950071e5ee85d74cd564176d837aab2506189a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.9,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/go.yml:7","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/amatsagu/tempest/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/amatsagu/tempest/go.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T20:12:43.118Z","repository_id":38996560,"created_at":"2025-08-16T20:12:43.118Z","updated_at":"2025-08-16T20:12:43.118Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28058787,"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-12-26T02:00:06.189Z","response_time":55,"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":["app","application","bot","discord","discord-api","go","golang","library","tempest"],"created_at":"2025-04-11T22:40:11.273Z","updated_at":"2025-12-26T19:16:35.559Z","avatar_url":"https://github.com/amatsagu.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg align=\"center\" src=\"/.github/tempest-banner.png\" height=\"165\" alt=\"Tempest library banner\"\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ci align=\"center\"\u003eCreate lightning fast Discord Applications\u003c/i\u003e\n\u003c/p\u003e\n\n\u003ch4 align=\"center\"\u003e\n    \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e - \u003ca href=\"#http-vs-gateway\"\u003eHTTP vs Gateway\u003c/a\u003e - \u003ca href=\"#getting-started\"\u003eGetting started\u003c/a\u003e - \u003ca href=\"#troubleshooting\"\u003eTroubleshooting\u003c/a\u003e - \u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\n\u003c/h4\u003e\n\n\u003ch4 align=\"center\"\u003e\n    \u003ca href=\"https://pkg.go.dev/github.com/amatsagu/tempest\"\u003e\n        \u003cimg src=\"https://pkg.go.dev/badge/github.com/amatsagu/tempest.svg\" alt=\"Go Reference\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://goreportcard.com/report/github.com/amatsagu/tempest\"\u003e\n        \u003cimg src=\"https://goreportcard.com/badge/github.com/amatsagu/tempest\" alt=\"Go Report\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://golang.org/doc/devel/release.html\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/go-mod/go-version/amatsagu/tempest\" alt=\"Go Version\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/amatsagu/tempest/blob/development/LICENSE\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/license/Amatsagu/tempest\" alt=\"License\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/amatsagu/tempest\"\u003e\n        \u003cimg src=\"https://img.shields.io/maintenance/yes/2026\" alt=\"Maintenance Status\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/amatsagu/tempest/actions/workflows/github-code-scanning/codeql\"\u003e\n        \u003cimg src=\"https://github.com/amatsagu/tempest/actions/workflows/github-code-scanning/codeql/badge.svg?branch=master\" alt=\"CodeQL\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://conventionalcommits.org\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/Conventional%20Commits-1.0.0-%23FE5196?logo=conventionalcommits\u0026logoColor=white\" alt=\"Conventional Commits\"\u003e\n    \u003c/a\u003e\n\u003c/h4\u003e\n\n**Project: Tempest** is a modern, minimal [Discord](https://discord.com) library for building Discord Apps, written in [Go](https://golang.org/). It aims to be extremely fast, stay very close to the Discord API, and include little to no caching - making it an excellent choice for small VPS or serverless architecture. In real-world projects using this lib, your bottlenecks will 9/10 cases be in the database or network bandwidth, not in app/bot itself.\n\nIt was created as a better alternative to [discord-interactions-go](https://github.com/bsdlp/discord-interactions-go), which is too low-level and outdated.\n\n### Features\n\n- [x] Secure HTTPS-based communication with the Discord API using `crypto/ed25519`\n- [x] Automatic dispatching of:\n    - [x] Application commands\n    - [x] Message components (buttons, select menu, text input)\n    - [x] Autocomplete interactions\n    - [x] Modal interactions  \n- [x] Built-in basic rate limit management that respects Discord’s HTTP limits\n- [x] Full file upload support (message attachments) as stream (over x4 times faster than regular multipart creation)\n- [x] Lightweight, fast command manager for auto handling slash commands, their auto complete and subcommands\n- [x] Performance focused approach:\n    - Structs only contain fields usable without a Gateway session\n    - Essentially no caching for very low resource usage \u0026 easier hosting\n- [x] Built-in helpers for component \u0026 modal interaction flow:\n  - [Supports buttons, select menus, text inputs, and modals](https://pkg.go.dev/github.com/amatsagu/tempest#Client.AwaitComponent)\n  - Includes timeout support and flexible interaction flows\n  - Works with both [static](https://pkg.go.dev/github.com/amatsagu/tempest#Client.RegisterComponent) and [dynamic](https://pkg.go.dev/github.com/amatsagu/tempest#Client.AwaitModal) handlers\n- [x] Helper structs and methods to manage:\n  - [x] Simple messages\n  - [x] Embeds\n  - [x] Components (buttons, string selects, sections, etc.)\n  - [x] Modals\n  - [x] Bitfields (flags, permissions, etc.)\n  - [x] [Message Components v2](https://discord.com/developers/docs/components/overview)\n- [x] Exposed Rest client and all API structs which allows to easily extend library capabilities if needed\n- [x] **__Basic__** support for Discord Monetization API *(enough to get started)*\n\n\n\n### HTTP vs Gateway\n**TL;DR**: you probably should be using libraries like [DiscordGo](https://github.com/bwmarrin/discordgo) unless you know why you're here.\n\nThere are two ways for bots to receive events from Discord. Most API wrappers such as **DiscordGo** use a WebSocket connection called a \"gateway\" to receive events, but **Tempest** receives interaction events over HTTPS\\**. Using http hooks lets you scale code more easily \u0026 reduce resource usage at cost of greatly reduced number of events you can use. You can easily create bots for roles, minigames, custom messages or admin utils but it'll be very difficult / impossible to create music or moderation bots.\n\n\u003e \\** Since v1.4 - Tempest can also run same code over gateway, simply swap `HTTPClient` to `GatewayClient`. Your existing bot/app code should be backward compatible. This option exists for large Discord Applications that outgrow initial plans and now require more reliable connection / lower latency for its users. Check usage at `example/cmd/example-bot/main.go`.\n\n\n\n### Getting started\n1. Install with: `go get -u github.com/amatsagu/tempest`\n2. Check [example](https://github.com/amatsagu/tempest/blob/master/example) with few simple commands.\n\n\n\n## Troubleshooting\nFor help feel free to open an issue on github.\nYou can also inivite to contact me on [discord](https://discord.com/users/390394829789593601).\n\n## Contributing\nAll contributions are welcomed.\nFew rules before making a pull request:\n* Use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/),\n* Add link to document for new structs,\n* Check [extra code notes](https://github.com/amatsagu/tempest/blob/master/CODE_NOTES.md) to get familiar with few rules I use when writing writing this lib\n\n\n\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FAmatsagu%2FTempest.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FAmatsagu%2FTempest?ref=badge_large)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famatsagu%2Ftempest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famatsagu%2Ftempest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famatsagu%2Ftempest/lists"}