{"id":26548671,"url":"https://github.com/twirapp/twir","last_synced_at":"2026-06-13T00:01:54.974Z","repository":{"id":62131757,"uuid":"498770377","full_name":"twirapp/twir","owner":"twirapp","description":"Twitch chat bot written on Golang and TypeScript.","archived":false,"fork":false,"pushed_at":"2026-06-09T00:28:00.000Z","size":76999,"stargazers_count":211,"open_issues_count":66,"forks_count":15,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-06-09T01:12:24.892Z","etag":null,"topics":["bot","chat","cloud","golang","streamers","streaming","twitch","typescript"],"latest_commit_sha":null,"homepage":"https://twir.app","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twirapp.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":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2022-06-01T14:28:31.000Z","updated_at":"2026-06-08T23:10:52.000Z","dependencies_parsed_at":"2025-02-09T09:18:40.522Z","dependency_job_id":"3ee50803-d4d1-43b0-a887-642f62a00246","html_url":"https://github.com/twirapp/twir","commit_stats":{"total_commits":2701,"total_committers":17,"mean_commits":"158.88235294117646","dds":"0.11366160681229176","last_synced_commit":"efea4de889d652a150664a3be0dc4396e3820888"},"previous_names":["satont/twir","satont/tsuwari","twirapp/twir"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/twirapp/twir","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twirapp%2Ftwir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twirapp%2Ftwir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twirapp%2Ftwir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twirapp%2Ftwir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twirapp","download_url":"https://codeload.github.com/twirapp/twir/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twirapp%2Ftwir/sbom","scorecard":{"id":283088,"data":{"date":"2025-08-04","repo":{"name":"github.com/twirapp/twir","commit":"20afd75cafeb7af92c66b8dbcfcfc0992e6c5516"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":4.6,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 3 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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build-and-lint.yml:1","Warn: no topLevel permission defined: .github/workflows/dockerv3.yml:1","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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/dockerv3.yml:168"],"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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}},{"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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/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/build-and-lint.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/build-and-lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-lint.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/build-and-lint.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-and-lint.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/build-and-lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:137: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:140: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:148: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:151: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:158: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:171: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:174: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:186: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:189: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:196: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:79: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:104: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:113: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:116: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerv3.yml:124: update your workflow using https://app.stepsecurity.io/secureworkflow/twirapp/twir/dockerv3.yml/main?enable=pin","Warn: containerImage not pinned by hash: apps/api-gql/Dockerfile:1","Warn: containerImage not pinned by hash: apps/api-gql/Dockerfile:12","Warn: containerImage not pinned by hash: apps/api/Dockerfile:1","Warn: containerImage not pinned by hash: apps/api/Dockerfile:12","Warn: containerImage not pinned by hash: apps/bots/Dockerfile:1","Warn: containerImage not pinned by hash: apps/bots/Dockerfile:12","Warn: containerImage not pinned by hash: apps/chat-translator/Dockerfile:1","Warn: containerImage not pinned by hash: apps/chat-translator/Dockerfile:12","Warn: containerImage not pinned by hash: apps/discord/Dockerfile:1","Warn: containerImage not pinned by hash: apps/discord/Dockerfile:12","Warn: containerImage not pinned by hash: apps/emotes-cacher/Dockerfile:1","Warn: containerImage not pinned by hash: apps/emotes-cacher/Dockerfile:12","Warn: containerImage not pinned by hash: apps/events/Dockerfile:1","Warn: containerImage not pinned by hash: apps/events/Dockerfile:12","Warn: containerImage not pinned by hash: apps/eventsub/Dockerfile:1","Warn: containerImage not pinned by hash: apps/eventsub/Dockerfile:12","Warn: containerImage not pinned by hash: apps/giveaways/Dockerfile:1","Warn: containerImage not pinned by hash: apps/giveaways/Dockerfile:12","Warn: containerImage not pinned by hash: apps/integrations/Dockerfile:1","Warn: containerImage not pinned by hash: apps/integrations/Dockerfile:12","Warn: containerImage not pinned by hash: apps/parser/Dockerfile:1","Warn: containerImage not pinned by hash: apps/parser/Dockerfile:12","Warn: containerImage not pinned by hash: apps/scheduler/Dockerfile:1","Warn: containerImage not pinned by hash: apps/scheduler/Dockerfile:12","Warn: containerImage not pinned by hash: apps/timers/Dockerfile:1","Warn: containerImage not pinned by hash: apps/timers/Dockerfile:12","Warn: containerImage not pinned by hash: apps/tokens/Dockerfile:1","Warn: containerImage not pinned by hash: apps/tokens/Dockerfile:12","Warn: containerImage not pinned by hash: apps/websockets/Dockerfile:1","Warn: containerImage not pinned by hash: apps/websockets/Dockerfile:12","Warn: containerImage not pinned by hash: apps/ytsr/Dockerfile:1","Warn: containerImage not pinned by hash: apps/ytsr/Dockerfile:12","Warn: containerImage not pinned by hash: frontend/dashboard/Dockerfile:1: pin your Docker image by updating devforth/spa-to-http:latest to devforth/spa-to-http:latest@sha256:dbbe7e2576d107628a99999fcfd4abd8785e7274f3ef5637a7d5179941043545","Warn: containerImage not pinned by hash: frontend/overlays/Dockerfile:1: pin your Docker image by updating devforth/spa-to-http:latest to devforth/spa-to-http:latest@sha256:dbbe7e2576d107628a99999fcfd4abd8785e7274f3ef5637a7d5179941043545","Warn: containerImage not pinned by hash: libs/migrations/Dockerfile:1","Warn: containerImage not pinned by hash: libs/migrations/Dockerfile:12","Warn: containerImage not pinned by hash: libs/migrations/Dockerfile:17","Warn: containerImage not pinned by hash: web/Dockerfile:1","Warn: containerImage not pinned by hash: web/Dockerfile:4","Warn: containerImage not pinned by hash: web/Dockerfile:12","Warn: containerImage not pinned by hash: web/Dockerfile:24","Warn: containerImage not pinned by hash: web/Dockerfile:34","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  15 third-party GitHubAction dependencies pinned","Info:   0 out of  42 containerImage 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/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-x4rx-4gw3-53p4","Warn: Project is vulnerable to: GO-2025-3540"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T16:27:03.491Z","repository_id":62131757,"created_at":"2025-08-17T16:27:03.491Z","updated_at":"2025-08-17T16:27:03.491Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34266916,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"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":["bot","chat","cloud","golang","streamers","streaming","twitch","typescript"],"created_at":"2025-03-22T06:22:08.105Z","updated_at":"2026-06-13T00:01:54.931Z","avatar_url":"https://github.com/twirapp.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Development\n\n## Requirements\n\n- [Bun (1.3.5+)](https://bun.sh)\n- [Go (1.24+)](https://go.dev/)\n\n- [Docker](https://docs.docker.com/engine/)\n\n### Development\n\n\u003e [!NOTE]\n\u003e For MOST of project management tasks we use own written cli. You can use `bun cli help` for print\n\u003e cli usage\n\n- Create twitch application https://dev.twitch.tv/console/apps\n- Set `http://localhost:3005/login` and `https://tokens-generator.twir.app` as your redirect url's\n  for twitch application\n- Go to https://tokens-generator.twir.app, set clientID and clientSecret from your app and generate\n  initial token WITH\n  ALL SCOPES\n- `cp .env.example .env` and fill required envs\n\n- Run needed services (Postgres, Adminer, Redis, Minio, e.t.c)\n\n```bash\ndocker compose -f docker-compose.dev.yml up -d\n```\n\n- Start project\n\n```bash\nbun dev\n```\n\n- Visit https://localhost:3005\n\n## Writing migrations\n\n- Use command for create new migration\n\n```bash\nbun cli migrations create\n```\n\n- Navigate to folder and edit new migration file\n\n```bash\ncd libs/migrations/migrations\n```\n\n- Run new created migrations (optional, because it's running when you execute `bun dev`)\n\n```bash\nbun cli migrations run\n```\n\n## Https on localhost (optional)\n\nWe'll use `twir.localhost` domain, which is enables ability to grant ssl out of the box, but you can\nuse any other domain and deal with ssl yourself.\n\n- Add `https://twir.localhost/login` to your twitch application redirect url's\n\n- Edit `.env`, change site base url:\n\n```ini\nSITE_BASE_URL=https://twir.localhost\n```\n\n- Start application as usual:\n\n```bash\nbun dev\n```\n\n- Open https://twir.localhost\n\n## Debugging with IDE\n\nFor JetBrains IDEs (WebStorm, GoLand e.t.c) we have prepared run configurations, if you started\nproject with `bun dev`, you can attach debugger to the running process via `Attach debugers`\nconfiguration.\n\nOtherwise, there is configuration to run each one app separately, which mostly makes no sense,\nbecause apps depending on each other and cannot work separately. So start them all via\nconfigurations (there is compound configuration for that) or use `bun dev` command.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwirapp%2Ftwir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwirapp%2Ftwir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwirapp%2Ftwir/lists"}