{"id":21659878,"url":"https://github.com/wvlet/airframe","last_synced_at":"2026-02-25T02:14:56.481Z","repository":{"id":37451079,"uuid":"65654242","full_name":"wvlet/airframe","owner":"wvlet","description":"Essential Building Blocks for Scala","archived":false,"fork":false,"pushed_at":"2026-01-12T20:06:55.000Z","size":161561,"stargazers_count":665,"open_issues_count":104,"forks_count":69,"subscribers_count":16,"default_branch":"main","last_synced_at":"2026-01-12T21:58:11.400Z","etag":null,"topics":["airframe","airspec","command-line-parser","config","dependency-injection","grpc","guice","jmx","json","logger","metrics","msgpack","rpc","scala","scalajs","serialization","sql","testing-framework"],"latest_commit_sha":null,"homepage":"https://wvlet.org/airframe","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wvlet.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":null,"dco":null,"cla":null}},"created_at":"2016-08-14T07:00:12.000Z","updated_at":"2026-01-12T18:59:12.000Z","dependencies_parsed_at":"2024-05-06T05:26:58.144Z","dependency_job_id":"d85e63f9-a55a-4b35-a4a5-0c6c4ce521f5","html_url":"https://github.com/wvlet/airframe","commit_stats":null,"previous_names":[],"tags_count":354,"template":false,"template_full_name":null,"purl":"pkg:github/wvlet/airframe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wvlet%2Fairframe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wvlet%2Fairframe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wvlet%2Fairframe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wvlet%2Fairframe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wvlet","download_url":"https://codeload.github.com/wvlet/airframe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wvlet%2Fairframe/sbom","scorecard":{"id":926016,"data":{"date":"2025-07-07","repo":{"name":"github.com/wvlet/airframe","commit":"1a7db847e9c005de3d11c89f2283e7604197cc31"},"scorecard":{"version":"v5.2.1-18-gbb9c347d","commit":"bb9c347dff6349d986baab6578a46d68a5524c62"},"score":5.7,"checks":[{"name":"Code-Review","score":8,"reason":"Found 18/22 approved changesets -- score normalized to 8","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/bb9c347dff6349d986baab6578a46d68a5524c62/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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#packaging"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#maintained"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#dangerous-workflow"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/release-drafter.yml:18","Warn: no topLevel permission defined: .github/workflows/codecov.yml:1","Warn: no topLevel permission defined: .github/workflows/doc.yml:1","Warn: no topLevel permission defined: .github/workflows/package-test.yml:1","Warn: no topLevel permission defined: .github/workflows/release-airspec.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/release-drafter.yml:13","Warn: no topLevel permission defined: .github/workflows/release-js.yml:1","Warn: no topLevel permission defined: .github/workflows/release-native.yml:1","Warn: no topLevel permission defined: .github/workflows/release-note.yml:1","Warn: no topLevel permission defined: .github/workflows/release-sbt-plugin.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/sbt-integration.yml:1","Warn: no topLevel permission defined: .github/workflows/snapshot.yml:1","Warn: no topLevel permission defined: .github/workflows/test.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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#token-permissions"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#fuzzing"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#binary-artifacts"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/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: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#license"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#vulnerabilities"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#branch-protection"}},{"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/codecov.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/codecov.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codecov.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/codecov.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/codecov.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/codecov.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codecov.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/codecov.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/doc.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/doc.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package-test.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/package-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package-test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/package-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-airspec.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-airspec.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-airspec.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-airspec.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-drafter.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-drafter.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-js.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-js.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-js.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-js.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-native.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-native.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-native.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-native.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-sbt-plugin.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-sbt-plugin.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-sbt-plugin.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release-sbt-plugin.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sbt-integration.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/sbt-integration.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/sbt-integration.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/sbt-integration.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/snapshot.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/snapshot.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/snapshot.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/snapshot.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/snapshot.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/snapshot.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/snapshot.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:143: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:144: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:148: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:156: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:215: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:216: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:220: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:228: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:239: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:240: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:247: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:83: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:84: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:92: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:167: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:168: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:172: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:180: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:191: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:192: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:196: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:204: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:258: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:259: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:270: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:103: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:104: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:112: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:123: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:124: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:132: update your workflow using https://app.stepsecurity.io/secureworkflow/wvlet/airframe/test.yml/main?enable=pin","Warn: npmCommand not pinned by hash: scripts/setup-scalajs.sh:3","Info:   0 out of  47 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  15 third-party GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand 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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#pinned-dependencies"}},{"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/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/bb9c347dff6349d986baab6578a46d68a5524c62/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-25T20:24:56.765Z","repository_id":37451079,"created_at":"2025-08-25T20:24:56.766Z","updated_at":"2025-08-25T20:24:56.766Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29096329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-04T21:00:18.276Z","status":"ssl_error","status_checked_at":"2026-02-04T20:59:11.235Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["airframe","airspec","command-line-parser","config","dependency-injection","grpc","guice","jmx","json","logger","metrics","msgpack","rpc","scala","scalajs","serialization","sql","testing-framework"],"created_at":"2024-11-25T09:31:49.437Z","updated_at":"2026-02-04T21:01:24.602Z","avatar_url":"https://github.com/wvlet.png","language":"Scala","readme":"[![Gitter Chat][gitter-badge]][gitter-link] [![CI Status][gha-badge]][gha-link] [![codecov](https://codecov.io/gh/wvlet/airframe/branch/main/graph/badge.svg)](https://codecov.io/gh/wvlet/airframe) [![scala-index][sindex-badge]][sindex-link] [![maven central][central-badge]][central-link] [![Scala.js](https://www.scala-js.org/assets/badges/scalajs-1.0.0.svg)](https://www.scala-js.org)\n\n[circleci-badge]: https://circleci.com/gh/wvlet/airframe.svg?style=svg\n[circleci-link]: https://circleci.com/gh/wvlet/airframe\n[gha-badge]: https://github.com/wvlet/airframe/workflows/CI/badge.svg\n[gha-link]: https://github.com/wvlet/airframe/actions?workflow=CI\n[gitter-badge]: https://badges.gitter.im/Join%20Chat.svg\n[gitter-link]: https://gitter.im/wvlet/airframe?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge\n[coverall-badge]: https://coveralls.io/repos/github/wvlet/airframe/badge.svg?branch=main\n[coverall-link]: https://coveralls.io/github/wvlet/airframe?branch=main\n[sindex-badge]: https://index.scala-lang.org/wvlet/airframe/airframe/latest.svg?color=orange\n[sindex-link]: https://index.scala-lang.org/wvlet/airframe\n[central-badge]: https://img.shields.io/maven-central/v/org.wvlet.airframe/airframe_2.12.svg?label=maven%20central\n[central-link]: https://search.maven.org/search?q=g:%22org.wvlet.airframe%22%20AND%20a:%22airframe_2.12%22\n\n\n\u003cp\u003e\u003cimg src=\"https://github.com/wvlet/airframe/raw/main/logos/airframe-badge-light.png\" alt=\"logo\" width=\"300px\"\u003e\u003c/p\u003e\n\nAirframe https://wvlet.org/airframe is essential building blocks for developing applications in Scala, including logging, object serialization using JSON or MessagePack, dependency injection, http server/client with RPC support, functional testing with AirSpec, etc. \n\n## Resources\n\n- [Airframe Home](https://wvlet.org/airframe/)\n- [Documentation](https://wvlet.org/airframe/docs)\n- [Release Notes](https://wvlet.org/airframe/docs/release-notes.html)\n\n### Framework\n\n- [Airframe DI: A Dependency Injection Library Tailored to Scala](https://wvlet.org/airframe/docs/airframe-di.html)\n- [AirSpec: A Functional Testing Library](https://wvlet.org/airframe/docs/airspec.html)\n\n- [Airframe RPC: A Framework for Using Scala Both for Frontend and Backend Programming](https://wvlet.org/airframe/docs/airframe-rpc.html)\n\u003cp\u003e\u003cimg src=\"https://github.com/wvlet/airframe/raw/main/website/static/img/airframe-rpc/rpc-overview.png\" alt=\"rpc\" width=\"800px\"\u003e\u003c/p\u003e\n\n- [Airframe Modules](https://wvlet.org/airframe/docs/index.html)\n\u003cp\u003e\u003cimg src=\"https://github.com/wvlet/airframe/raw/main/logos/airframe-overview.png\" alt=\"logo\" width=\"800px\"\u003e\u003c/p\u003e\n\n\n## For Developers\n\nAirframe uses Scala 3 as the default Scala version. To use Scala 2.x versions, run `++ 2.12` or `++ 2.13` in the sbt console.\n\n### Releasing\n\nFor every PR, [release-drafter](https://github.com/release-drafter/release-drafter) will automatically label PRs using the rules defined in [.github/release-drafter.yml](https://github.com/wvlet/airframe/blob/main/.github/release-drafter.yml). \n\nTo publish a new version, first, create a new release tag as follows:\n\n```sh\n$ git switch main\n$ git pull\n$ ruby ./scripts/release.rb\n```\nThis step will update docs/release-noteds.md, push a new git tag to the GitHub, and\ncreate a new [GitHub relese note](https://github.com/wvlet/airframe/releases).\nAfter that, the artifacts will be published to Sonatype (a.k.a. Maven Central). It usually takes 10-30 minutes. \n\nNote: Do not create a new tag from GitHub release pages, because it will not trigger the GitHub Actions for the release.\n\n### Binary Compatibility\n\nWhen changing some interfaces, binary compatibility should be checked so as not to break applications using older versions of Airframe. In build.sbt, set AIRFRAME_BINARY_COMPAT_VERSION to the previous version of Airframe as a comparison target. Then run `sbt mimaReportBinaryIssues` to check the binary compatibility.\n\n## LICENSE\n\n[Apache v2](https://github.com/wvlet/airframe/blob/main/LICENSE)\n\n## Contributors\n\nMany thanks to everyone who has contributed to our progress:\n\n[![Contributors](https://contrib.rocks/image?repo=wvlet/airframe)](https://github.com/wvlet/airframe/graphs/contributors)\n","funding_links":[],"categories":["Scala","Table of Contents","Modularization and Dependency Injection","开发框架"],"sub_categories":["Modularization and Dependency Injection","Web框架"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwvlet%2Fairframe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwvlet%2Fairframe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwvlet%2Fairframe/lists"}