原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [
"alpaca-markets",
"alpaca",
"alpaca-trading-api",
"alpaca-api",
"rust",
"rust-library",
"rust-crate"
],
"is_fork": false,
"size_kb": 1891,
"has_wiki": true,
"homepage": null,
"languages": {
"Rust": 326818
},
"pushed_at": "2026-07-27T15:13:31Z",
"created_at": "2020-04-21T04:09:01Z",
"owner_type": "User",
"updated_at": "2026-07-27T15:09:46Z",
"description": "A crate for interacting with the Alpaca API at alpaca.markets.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "GPL-3.0",
"default_branch": "main",
"license_spdx_raw": "GPL-3.0",
"primary_language": "Rust",
"significant_languages": [
"Rust"
]
},
"owner": {
"blog": "https://d-e-s-o.github.io/",
"name": "Daniel Müller",
"type": "User",
"login": "d-e-s-o",
"company": null,
"location": "Land of habitual overcorrection",
"followers": 71,
"avatar_url": "https://avatars.githubusercontent.com/u/6610056?v=4",
"created_at": "2014-02-06T22:15:50Z",
"is_verified": null,
"public_repos": 205,
"account_age_days": 4553
},
"license": {
"state": "standard",
"spdx_id": "GPL-3.0",
"raw_spdx": "GPL-3.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.31.0",
"kind": "minor",
"published_at": "2026-07-27T15:13:31Z"
},
{
"tag": "v0.30.0",
"kind": "minor",
"published_at": "2024-12-29T18:38:01Z"
},
{
"tag": "v0.29.0",
"kind": "minor",
"published_at": "2024-02-21T16:13:12Z"
},
{
"tag": "v0.28.0",
"kind": "minor",
"published_at": "2023-11-16T16:10:13Z"
},
{
"tag": "v0.27.2",
"kind": "patch",
"published_at": "2023-07-02T14:43:38Z"
},
{
"tag": "v0.27.1",
"kind": "patch",
"published_at": "2023-06-18T03:31:36Z"
},
{
"tag": "v0.27.0",
"kind": "minor",
"published_at": "2023-06-17T21:57:42Z"
},
{
"tag": "v0.26.2",
"kind": "patch",
"published_at": "2023-06-17T21:28:38Z"
},
{
"tag": "v0.26.1",
"kind": "patch",
"published_at": "2023-06-17T21:28:20Z"
},
{
"tag": "v0.26.0",
"kind": "minor",
"published_at": "2023-06-17T21:27:57Z"
},
{
"tag": "v0.25.1",
"kind": "patch",
"published_at": "2023-06-17T21:27:33Z"
},
{
"tag": "v0.25.0",
"kind": "minor",
"published_at": "2023-06-17T21:27:09Z"
},
{
"tag": "v0.24.0",
"kind": "minor",
"published_at": "2023-06-17T21:26:45Z"
},
{
"tag": "v0.23.0",
"kind": "minor",
"published_at": "2023-06-17T21:26:27Z"
},
{
"tag": "v0.22.5",
"kind": "patch",
"published_at": "2023-06-17T21:25:49Z"
},
{
"tag": "v0.22.4",
"kind": "patch",
"published_at": "2023-06-17T21:25:19Z"
},
{
"tag": "v0.22.3",
"kind": "patch",
"published_at": "2023-06-17T21:24:56Z"
},
{
"tag": "v0.22.0",
"kind": "minor",
"published_at": "2023-06-17T21:23:20Z"
},
{
"tag": "v0.22.2",
"kind": "patch",
"published_at": "2023-06-17T21:24:17Z"
},
{
"tag": "v0.22.1",
"kind": "patch",
"published_at": "2023-06-17T21:23:42Z"
},
{
"tag": "v0.21.1",
"kind": "patch",
"published_at": "2023-06-17T21:22:50Z"
},
{
"tag": "v0.21.0",
"kind": "minor",
"published_at": "2023-06-17T21:22:28Z"
},
{
"tag": "v0.20.0",
"kind": "minor",
"published_at": "2023-06-17T21:22:03Z"
},
{
"tag": "v0.19.0",
"kind": "minor",
"published_at": "2023-06-17T21:21:29Z"
},
{
"tag": "v0.18.0",
"kind": "minor",
"published_at": "2023-06-17T21:20:58Z"
},
{
"tag": "v0.17.0",
"kind": "minor",
"published_at": "2023-06-17T21:20:35Z"
},
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2023-06-17T21:20:14Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2023-06-17T21:19:52Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2023-06-17T21:19:30Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2023-06-17T21:19:11Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2023-06-17T21:18:49Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2023-06-17T21:18:18Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2023-06-17T21:17:49Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2023-06-17T21:17:23Z"
},
{
"tag": "v0.8.1",
"kind": "patch",
"published_at": "2023-06-17T21:16:59Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2023-06-17T21:16:39Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2023-06-17T21:16:18Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2023-06-17T21:15:59Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2023-06-17T21:15:38Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2023-06-17T21:15:15Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2023-06-17T21:14:55Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2023-06-17T21:14:34Z"
},
{
"tag": "v0.2.2",
"kind": "patch",
"published_at": "2023-06-17T21:14:08Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2023-06-17T21:13:38Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2023-06-17T21:13:16Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2023-06-17T21:12:55Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2023-06-17T21:12:23Z"
}
],
"recent_commits": [
{
"oid": "6d22d791b646b2be986d699f9d348d5eae881c0a",
"body": "This change bumps the crate to version 0.31.0. The following notable\nchanges have been made since 0.30.0:\n- Introduced Error::AuthenticationFailed variant\n - Moved Error::NotPermitted into individual endpoint errors\n- Removed api::v2::order::Account::{day_trader,daytrade_count} members",
"is_bot": false,
"headline": "Bump version to 0.31.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2026-09-03T04:07:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f6fbb8f04336c6827094490bcd41a9a1439bd8ec",
"body": "Make the URL to the documentation of the library crate known so that it\nwill be easier to click through to it from a crates.io search.",
"is_bot": false,
"headline": "Add direct link to documentation",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2026-09-01T14:07:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1ee43c0f9754152f271fa9d2a6efc6b402d13e23",
"body": "We use rustdoc style documentation for both public and private items.\nBy default, however, rustdoc only generates documentation for public\nones, completely ignoring anything private. As a result, a bunch of\nunresolved references and other issues can make it into the\ndocumentation of private bits.\nAdjust the CI job to actually document private items to catch such\ndigressions in the future and fix any issues already present.",
"is_bot": false,
"headline": "Document private items in documentation CI job",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2026-09-01T06:37:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19c13051d2b4cdc267cde745b7d2afe91dfa133b",
"body": "Upstream clowns decided to map authentication failures back to 401,\nafter previously switching to 403, which obviously was double booked\nwith various other error conditions.\nTo cope with this change, bring back the Error::AuthenticationFailed\nvariant. Also, move NotPermitted back to a per individual error thing,\nas opposed to being omnipresent.",
"is_bot": false,
"headline": "Bring back Error::AuthenticationFailed variant",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2026-08-31T01:06:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fc59d50f550a936255c8b82f42ac0edc2b8f65d6",
"body": "Apparently we no longer need (or can) cancel the legs of a bracket\norder individually once the \"parent\" has been canceled. Adjust the\nsubmit_bracket_order() test accordingly.",
"is_bot": false,
"headline": "Fix submit_bracket_order() test",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2026-08-30T01:49:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ef024f107ed271cc92d525017a089a932f2b6175",
"body": "Fix the request_with_dividend_adjustment() test, which -- once again --\ngot broken by Alpaca clowns messing with decades old data.",
"is_bot": false,
"headline": "Fix request_with_dividend_adjustment() test",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2026-08-29T06:44:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c48e69c77ce6f0022e46251c876263ba705a684b",
"body": "The SEC has effectively removed the previously used \"pattern day trader\"\ndesignation. Alpaca, in their endless wisdom and grasp of how software\nsystems interact, of course just nuked the field from their API\nresponse, without any versioning guard whatsoever, breaking everything\nand anything under the stars that doesn't just make up missing values on\nthe spot.\nRemove the corresponding fields from the api::v2::account::Account type,\ngiven that they are dead weight now.",
"is_bot": false,
"headline": "Remove pattern day trader related fields",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2026-08-27T14:14:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6eb7759f088da624edd5844ac660495a8fe102d6",
"body": "Address a few \"issues\" reported by Clippy in newer versions of Rust.",
"is_bot": false,
"headline": "Address Clippy reported issues",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2026-08-27T05:22:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "768d44b0bae670b02e28f84ba2aca246341e6ae3",
"body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 7.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\n[…]\npendency-name: codecov/codecov-action\n dependency-version: '7'\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump codecov/codecov-action from 5 to 7",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-27T07:53:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c8d546fcac6675c24ca70bdc29d7fd4a558be1b0",
"body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v7)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n dependency-version: '7'\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump actions/checkout from 4 to 7",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-19T07:52:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "82af07a76e6578444e327ea923cbd0ad77dbcbeb",
"body": "Updates the requirements on [serial_test](https://github.com/palfrey/serial_test) to permit the latest version.\n- [Release notes](https://github.com/palfrey/serial_test/releases)\n- [Commits](https://github.com/palfrey/serial_test/compare/v3.0.0...v4.0.1)\n\n---\nupdated-dependencies:\n- dependency-name: serial_test\n dependency-version: 4.0.1\n dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Update serial_test requirement from 3.0.0 to 4.0.1",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-08T07:53:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ecb5984c941e1396af3ddf77356ffe892e83de9",
"body": "The Airdrop project has been canceled. Remove the badge.\n\nThis reverts commit e0a2c32ff5879abf8cfddcf4d414a6466b776653.",
"is_bot": false,
"headline": "Revert \"Add GitHub Airdrop badge\"",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2025-03-23T17:46:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e6175601f9d1ec1f7a21201bb396322935a4da30",
"body": "Remove the http-body dev-dependency, which was necessary in the past to\nget our minimum supported Rust check working, but no longer is.",
"is_bot": false,
"headline": "Remove no longer needed http-body dev-dependency",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2025-03-23T17:44:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0a2c32ff5879abf8cfddcf4d414a6466b776653",
"body": "Add a GitHub Airdrop badge to the README. We shall have to see what\nvalue it adds longer term. Details can be found on GitHub's \"white\npaper\" [0]\n\n[0] https://docs.gitsponsors.com/guide/wp_en.html",
"is_bot": false,
"headline": "Add GitHub Airdrop badge",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2025-01-27T04:51:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "606ba2e0d334d189ee3a0c3e9e6d4143bfb9debf",
"body": "Suggestions made by Clippy in more recent versions of Rust.",
"is_bot": false,
"headline": "Incorporate Clippy suggestions",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2025-01-26T04:38:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ca6deeb39b5f2ce7f6a12cf6e45aef5dc7feaaea",
"body": "This change bumps the crate to version 0.30.0. The following notable\nchanges have been made since 0.29.0:\n- Added weighted_average member to data::v2::bars::Bar type\n- Bumped hyper dependency to 1.0\n- Bumped websocket-util dependency to 0.14\n- Bumped tokio-tungstenite dependency to 0.26",
"is_bot": false,
"headline": "Bump version to 0.30.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-12-29T18:35:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "395dda788ec1178da3f6bcba8505a604ed1f97f9",
"body": "Updates the requirements on [thiserror](https://github.com/dtolnay/thiserror) to permit the latest version.\n- [Release notes](https://github.com/dtolnay/thiserror/releases)\n- [Commits](https://github.com/dtolnay/thiserror/compare/1.0.30...2.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: thiserror\n dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": false,
"headline": "Update thiserror requirement from 1.0.30 to 2.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-12-29T18:26:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "07e2bda5cfe53e2309d14c6c2c7bd718e2a8e053",
"body": "This change updates the websocket-util dependency we rely on to version\n0.14. The main change over 0.13 is that its tokio-tungstenite\ndependency, to which we are exposed, is updated from 0.23 to 0.26. To\nthat end, we need to update our tokio-tungstenite dependency in\nlockstep.",
"is_bot": false,
"headline": "Update websocket-util dependency 0.14",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-12-29T18:21:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2626661bd3feb19dcdf827482367aa5749cac623",
"body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\n[…]\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump codecov/codecov-action from 4 to 5",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2024-12-29T18:21:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2169a660524962d0bf3a85f5b788186e48fe32ff",
"body": "Increase code coverage by adding \"tests\" for a few code paths that\notherwise will not be exercised.",
"is_bot": false,
"headline": "Increase code coverage",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-12-29T18:13:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d64a3211ee48b2cc250597c00e50bc53e41f60b",
"body": "Clippy suggests to elide lifetimes from various impls when they are not\nused. Follow the suggestions.",
"is_bot": false,
"headline": "Incorporate clippy suggestions",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-12-29T18:03:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5f1c30894db10be5ac08bb88e3a3a972d155fda8",
"body": "The where_clauses_object_safety lint has been removed with recent\nversions of Rust. Remove it from our list of lints to prevent any\nwarnings from popping up moving forward.",
"is_bot": false,
"headline": "Remove where_clauses_object_safety lint",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-12-29T17:39:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "098df626d048441eec765a94965bf35e7caf057d",
"body": "This change updates the hyper dependency to 1.0 and bumps other crates\nas necessary. Unfortunately, because more of the logic was moved out of\nhyper itself and into various utility crates, the number of dependencies\nincreases further.",
"is_bot": false,
"headline": "Update hyper dependency to 1.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-19T21:49:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "738203003ec554ddbf7811016f7c1292801e837c",
"body": "This change updates the websocket-util dependency we rely on to version\n0.13. The main change over 0.12 is that its tokio-tungstenite\ndependency, to which we are exposed, is updated from 0.20 to 0.23. To\nthat end, we need to update our tokio-tungstenite dependency in\nlockstep.",
"is_bot": false,
"headline": "Update websocket-util dependency 0.13",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-19T22:08:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f52ddb08d7cabe9921c2bd1b8f3f3f0ec61f7ef",
"body": "Recent versions of Rust and clippy flag a few more \"issues\" in the\ncrate. Address them.",
"is_bot": false,
"headline": "Address clippy reported issues",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-16T14:38:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f87fa33519100243c2de6d277335320fcd051449",
"body": "Rename our rustfmt configuration file from rustfmt.toml to\n.rustfmt.toml. This way it will be appear as hidden by default.",
"is_bot": false,
"headline": "Rename rustfmt.toml to .rustfmt.toml",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-16T14:31:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a09e109d0052d483ed35e3098c9c3cb43b8d88e",
"body": "Introduce the weighted_average member to data::v2::bars::Bar type,\nholding the volume weighted average price of the asset for the time\nframe that the bar represents.",
"is_bot": false,
"headline": "Add weighted_average member to data::v2::bars::Bar type",
"author_name": "BotezanTechnologic",
"author_login": "tudorbotezan",
"committed_at": "2024-04-14T16:20:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0432aafd82488a54ad84c3aaa50318356cbc17c0",
"body": "The clowns at Alpaca have managed to break yet another API. Ignore the\nnow failing tests.",
"is_bot": false,
"headline": "Ignore two more tests after another upstream breakage",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-03-21T15:17:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee6b1a299fd84db2dcd0e4fb99cfa8e6755b641e",
"body": "The chrono crate has deprecated more functions in recent versions.\nSwitch to the suggested alternatives to silence clippy.",
"is_bot": false,
"headline": "Address clippy reported issues",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-03-21T01:25:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2f704b3df73ed26f3023e2f0c9f88fb495876555",
"body": "This change bumps the crate to version 0.29.0. The following notable\nchanges have been made since 0.28.0:\n- Renamed various request related types to follow more uniform naming\n scheme\n- Added api::v2::{calendar::ListReqInit,watchlist::CreateReqInit} types\n- Removed api::v2::{order::ChangeReqInit,as\n[…]\npes in\n favor of Default impl for corresponding request types\n- Made various types non-exhaustive\n- Added name attribute to api::v2::watchlist::Watchlist type\n- Added support for updating a watchlist",
"is_bot": false,
"headline": "Bump version to 0.29.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-31T06:24:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "17a4b1b226a71ef0165e1f6a6428dbd465d0fabe",
"body": "We only have 'Unknown' variants in enums that are marked non-exhaustive.\nAs such, there really is no point in singling out and treating special\nsuch variants: it does not matter if something is formally unknown by\nthe apca crate itself or just unknown by the client application, both\ncases basically \n[…]\nlace.\nAs such, this change marks this variant as hidden. Its main purpose,\nthus, is to prevent potentially fatal (in a long running service)\ndeserialization failures in otherwise legitimate responses.",
"is_bot": false,
"headline": "Make all 'Unknown' variants hidden",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-30T03:13:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7ed4a844fdd82cd26f024ae3749af25bb1d6fe6e",
"body": "With the api::v2::asset::Status being declared as non-exhaustive by now,\nit seems logical to also support the deserialization of potentially\nunknown variants, otherwise a deserialization failure could have\ndisastrous consequences when listing tradeable assets.\nAs such, this change adds an Unknown variant to the enum, similar to\nwhat we have elsewhere.",
"is_bot": false,
"headline": "Add api::v2::asset::Status::Unknown variant",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-29T04:56:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "34ead1cceb712a021dba5427bb5e1effe17c79b5",
"body": "The creation of a watch list always requires a name (so does the\nupdating, at least according to the documentation). Hence, it makes the\nmost sense to follow the \"ReqInit\" pattern that we employ elsewhere.\nDoing so also allows us to make the CreateReq type non-exhaustive, which\nwill help with backwards compatibility.",
"is_bot": false,
"headline": "Introduce api::v2::watchlist::CreateReqInit",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-28T06:12:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4aa40fcc58aa64819d8d5d936454dfef9a5cca79",
"body": "A while back we removed the non-exhaustive markers from a bunch of\ntypes, to allow certain clients to construct objects of those types.\nHaving exhaustive struct types is a backwards compatibility hazard and\nat least for some it is reasonable to anticipate future member\nadditions.\nSince then we have \n[…]\nn an unknown variant is returned from\nupstream. That is useful to not make the parsing of an otherwise valid\nresponse fail prematurely and potentially cause mayhem, as we have seen\nhappen in the past.",
"is_bot": false,
"headline": "Declare various types as non-exhaustive (again)",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-26T15:23:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6e6e128d3322fb6bac96518723ff6b3252e580cc",
"body": "The api::v2::calendar::ListReq type doesn't have a logical default\nimplementation: the start and end date should always be provided. At the\nsame time, we would like to declare it as non-exhaustive to have some\nbetter backward compatibility story moving forward.\nTo somehow unite these two constraints, this change introduces the\nListReqInit type, which implements Default and requires the start and\nend date to be turned into the final ListReq.",
"is_bot": false,
"headline": "Introduce api::v2::calendar::ListReqInit",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-26T04:14:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab184f660f231b814ded3828fe8873c0397fa4ca",
"body": "The verb \"list\" is admittedly a tad more appropriate for the kind of\ndata that a GET request to the /v2/calendar endpoint returns. Rename the\nrequest type once again.",
"is_bot": false,
"headline": "Rename api::v2::calendar::GetReq type to ListReq",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-25T02:13:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0929302433d134086a8c021ca07a05877f7e76b7",
"body": "Similar to what we did earlier to api::v2::order::ChangeReqInit, this\nchange removes the api::v2::assets::ListReqInit and makes the ListReq\ntypes default-constructible instead.",
"is_bot": false,
"headline": "Remove api::v2::assets::ListReqInit",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-24T02:46:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "067bcf6525874db240445754e13561fa16b0c951",
"body": "The api::v2::order::ChangeReq type is defacto default constructible,\nbecause all attributes are optional. We introduced the ChangeReqInit\nhelper in anticipation of a potential addition of a\nnon-default-constructible member. However, such an addition would be\nbreaking the upstream API in a backwards \n[…]\n's track record of idiosyncrasies, we no\nlonger intend to cater to nonsense like that.\nRemove the ChangeReqInit type and implement the Default trait for\nChangeReq directly to simplify the API surface.",
"is_bot": false,
"headline": "Remove api::v2::order::ChangeReqInit type",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-23T06:47:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "01ef1d7b235726d26bd683eb00cf6ce341cc3f7f",
"body": "This change renames the data::v2::bars::Get type to List, following our\nearlier effort of using the \"list\" terminology for requests that return\na list of entities. The associated request types BarsReq and the\nBarsReqInit helper are renamed in unison.",
"is_bot": false,
"headline": "Rename data::v2::bars::Get type to List",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-08T00:20:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "65d6afe4d492b1004698096558ea774c95a9237d",
"body": "This change renames the data::v2::quotes::Get type to List, following\nour earlier effort of using the \"list\" terminology for requests that\nreturn a list of entities. The associated request types QuotesReq and\nthe QuotesReqInit helper are renamed in unison.",
"is_bot": false,
"headline": "Rename data::v2::quotes::Get type to List",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-06T22:40:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ccb220804c64e3a17016a84712a986faa56fbb8",
"body": "With recent changes we have moved more and more towards a world in which\nrequest types are named after the verb describing them best. The\ndata::v2::last_quotes::LastQuotesReq type violates this naming. Rename\nthe type to GetReq for the sake of consistency.",
"is_bot": false,
"headline": "Rename data::v2::last_quotes::LastQuotesReq type to GetReq",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-06T02:55:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "76e864a4faa3f933624091cd95d1295684c71242",
"body": "This change renames the data::v2::trades::Get type to List, following\nour earlier effort of using the \"list\" terminology for requests that\nreturn a list of entities. The associated request types TradesReq and\nthe TradesReqInit helper are renamed in unison.",
"is_bot": false,
"headline": "Rename data::v2::trades::Get type to List",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-04T15:40:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "07bfeb443afa2e00c3c659843d195428732c7fd8",
"body": "This change renames the api::v2::positions::Get type to List, following\nour earlier effort of using the \"list\" terminology for requests that\nreturn a list of entities.",
"is_bot": false,
"headline": "Rename api::v2::positions::Get type to List",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-04T04:07:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f4db654ea1a2171761dc5618acfb9b7d1a37614",
"body": "In continuing our effort of improving the consistency of our type names,\nthis change renames the api::v2::account_config::Patch type to Change.\nThis verb more precisely reflects the action being performed and\ndecouples the request type naming from that of the underlying HTTP verb\n(which users ultimately should not have to care about).",
"is_bot": false,
"headline": "Rename api::v2::account_config::Patch type to Change",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-02T15:20:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "61f507cdff64438abe806177635865749be79baf",
"body": "This change renames the api::v2::assets::Get type to List, following our\nearlier effort of using the \"list\" terminology for requests that return\na list of entities. The associated request types AssetsReq and the\nAssetsReqInit helper are renamed in unison.",
"is_bot": false,
"headline": "Rename api::v2::assets::Get type to List",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-07-02T02:04:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1cdf00e4fff546f12296afc57d9653e0b73303b8",
"body": "With recent changes we have moved more and more towards a world in which\nrequest types are named after the verb describing them best. The\napi::v2::calendar::CalendarReq type violates this naming. Rename the\ntype to GetReq for the sake of consistency.",
"is_bot": false,
"headline": "Rename api::v2::calendar::CalendarReq type to ListReq",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-30T21:57:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a263c34ab881273abdff9648586750327c7f71ef",
"body": "Continuing our effort of renaming the various request and supporting\ntypes, we have decided that \"listing\" is a more appropriate verb for\nmaking a request that returns a (potentially paged) list of elements. To\nthat end, this change renames the api::v2::orders::Get type to List.",
"is_bot": false,
"headline": "Rename api::v2::orders::Get type to List",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-30T06:36:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e0002b3f5e8c266da3d5534490a01526b5497eb",
"body": "Similar to what we did for the api::v2::order::Post type, this change\nrenames api::v2::order::Patch to Change to improve consistency of naming\nthroughout the crate.",
"is_bot": false,
"headline": "Rename api::v2::order::Patch type to Change",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-29T05:59:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "18d9f01f038f10b691425f2f162fe030910d06bb",
"body": "Similar to what we did earlier for the api::v2::watchlist::Post type,\nthis change renames api::v2::order::Post to Create, in an attempt to\nimprove consistency of naming throughout the crate. The associated\nrequest types OrderReq and the OrderReqInit helper are renamed in\nunison.",
"is_bot": false,
"headline": "Rename api::v2::order::Post type to Create",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-27T15:49:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "488e828e8f94cd0ff2a144e9b07308bc32aeb3d7",
"body": "Our API request (and supporting) types are not exactly named\nconsistently. Some of them are named after the HTTP verb being used in\nthe underlying request, others are not. Some reflect the containing\nmodule in their name, others don't.\nThis change is the first one in a series cleaning up this state of\naffairs. Specifically, it renames the api::v2::watchlist::Post request\ntype to Create, which more accurately reflects its intended purpose.",
"is_bot": false,
"headline": "Rename api::v2::watchlist::Post type to Create",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-26T14:26:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b6527e0fae40a39179225896d3c06e6cb1a07e2",
"body": "So far watchlists have been effectively immutable: one could only create\none, retrieve it, and delete it eventually.\nWith this change we add support for updating such a list, allowing for\nrenaming and/or changing of contained symbols.",
"is_bot": false,
"headline": "Add support for updating a watchlist",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-26T04:40:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "34f72929bbdef038ac3a4a177e6b6185a173024d",
"body": "Similar to what we did earlier for api::v2::watchlist::Watchlist, add\nthe name attribute to the api::v2::watchlists::WatchlistItem type.",
"is_bot": false,
"headline": "Add name attribute to api::v2::watchlists::WatchlistItem",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-25T02:37:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d4357e65eab0f0694957ae6a30431ca0b47f647c",
"body": "Apparently the Alpaca \"engineers\" have finally noticed that not\nreporting a name for a watchlist that was required to be created with\none is beyond braindead.\nAdd the necessary attribute to the api::v2::watchlist::Watchlist struct\nto reflect the upstream change.",
"is_bot": false,
"headline": "Add name attribute to api::v2::watchlist::Watchlist",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-23T23:57:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5ca0d1bfcca8223a61c5c7a311c17133b621da46",
"body": "Our CI is somewhat slow, mostly owing to the long time it takes to build\nthe slew of dependencies we have.\nTo mitigate this problem, cache build artifacts so that they can be\nreused between CI runs.",
"is_bot": false,
"headline": "Cache build artifacts in CI",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-23T03:53:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5ed312a444414f6eacbdf5ec201b381d416eecac",
"body": "The hyper::body::to_bytes function has been deprecated in favor of a\ndifferent construct. Switch over.",
"is_bot": false,
"headline": "Replace deprecatated hyper::body::to_bytes usage",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-22T06:49:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3da183b977adbc866487f28f861eed257e30dbbb",
"body": "When Dependabot creates a pull request we always end up with two CI runs\n-- one for the pull request and one for the push of the commit to a\nbranch.\nExclude pushes to branches for Dependabot created pull requests, to\nprevent this duplication of work.",
"is_bot": false,
"headline": "Exclude Dependabot created branches from CI testing on push",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-21T03:00:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c58dd5619df8659dec7bb5a01612fc43ea820ada",
"body": "Updates the requirements on [serial_test](https://github.com/palfrey/serial_test) to permit the latest version.\n- [Release notes](https://github.com/palfrey/serial_test/releases)\n- [Commits](https://github.com/palfrey/serial_test/compare/v2.0.0...v3.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: serial_test\n dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Update serial_test requirement from 2.0.0 to 3.0.0",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2024-02-11T23:36:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44fdb73f5ed0f240d9a4a9e613864282be2461a0",
"body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v3...v4)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump actions/checkout from 3 to 4",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2024-02-11T23:28:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "283fccfdbeb552899083954aa55fe86a7ae4a6a6",
"body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3 to 4.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v3...v4)",
"is_bot": false,
"headline": "Bump codecov/codecov-action from 3 to 4",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-19T14:36:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bcb34bb052154c3763a5f2e9761ef404f035ea84",
"body": "Add configuration for Dependabot to automatically update dependencies,\nif possible. Updates are currently managed to GitHub Actions as well as\nCargo.toml based Rust dependencies.",
"is_bot": false,
"headline": "Add Dependabot configuration",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-18T15:39:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "431231462772f37add032e92bd861b7f8a1383e2",
"body": "The actions-rs/toolchain GitHub action is no longer maintained. Switch\nover to using dtolnay/rust-toolchain in its stead.",
"is_bot": false,
"headline": "Replace deprecated actions-rs/toolchain usage",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-18T04:55:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8fb9a78f5ca34957c281e23aea64275ffe359fe5",
"body": "Our minimum dependency check started to fail because of some versioning\nissues in tokio's transitive dependencies. Adjust our minimal bounds of\nvarious dependencies to work around the issue.",
"is_bot": false,
"headline": "Update various minimal dependencies",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-06-16T16:11:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fec522cb1910e7ae925b35926bbbdaa37d6b2e8e",
"body": "This change updates the test-log dev-dependency we use to version\n0.2.14. In this version the crate no longer requires users to manually\ninclude dependencies, such as tracing-subscriber. Hence, remove it.",
"is_bot": false,
"headline": "Update test-log dev-dependency to 0.2.14",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-02-28T05:51:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b6a0c73ebfe35c62f340656f800f54c77272cc3f",
"body": "This change bumps the crate to version 0.28.0. The following notable\nchanges have been made since 0.27.2:\n- Removed ApiError::code member after endpoint reported errors stopped\n returning it\n- Renamed AuthenticationFailed variant of endpoint errors to\n NotPermitted\n - This variant is now used to \n[…]\nde of conditions,\n including certain order submission issues\n- Bumped minimum supported Rust version to 1.63\n- Bumped websocket-util dependency to 0.12\n- Bumped tokio-tungstenite dependency to 0.20",
"is_bot": false,
"headline": "Bump version to 0.28.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-01-12T05:27:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dd61af1c4d5f793b2a95ebebbd9b07bf429418d5",
"body": "Codecov coverage reporting is somewhat unstable, with numbers changing\nback and forth infrequently. This is causing failure indications on CI\nruns. To prevent that from happening moving forward, run it in\ninformational mode [0] instead.\n\n[0]: https://docs.codecov.com/docs/commit-status#informational",
"is_bot": false,
"headline": "Use codecov in informational mode",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-01-11T06:37:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c7987c48b3903fb66f1be8455f2f2c965157c9c",
"body": "This change updates the websocket-util dependency we rely on to version\n0.12. The main change over the early used 0.11 is that its\ntokio-tungstenite dependency, to which we are exposed, is updated from\n0.18 to 0.20. To that end, we need to update our tokio-tungstenite\ndependency in lockstep.",
"is_bot": false,
"headline": "Update websocket-util dependency 0.12",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-01-09T16:58:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "01ca51b13937e29311906e12c70623218256f1be",
"body": "This change updates the minimum supported Rust version to 1.63.0. We\nneed this version because it is the minimum supported one for\nwebsocket-util version 0.12, which we will update to subsequently.",
"is_bot": false,
"headline": "Update minimum supported Rust version to 1.63.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2024-01-09T03:18:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f42140c7d8ca1c588708d55a32d57e4cf845cb5",
"body": "This change updates the serial_test dev-dependency to version 2.0.",
"is_bot": false,
"headline": "Update serial_test dev-dependency to 2.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-12-30T05:23:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "80b8ceed909f5719cc9b652be619983677dea7fe",
"body": "After the fifty-trillionth adjustment of half a decade old historical\nbar data representing our golden values, enough is enough. Just check\nfor a freaking range, already providing a bit more slack on the low and\nhigh ends.",
"is_bot": false,
"headline": "Be yet more flexible with respect to golden values",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-12-29T03:56:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c56d784864d8d1a9e5baf4650ba64646a6d79bfb",
"body": "The omnipresent AuthenticationFailed error variant, which used to map to\nHTTP status 401 (Unauthorized) had not been hooked up for ages, after\nAlpaca in their endless wisdom decided to move everything to using HTTP\nstatus 403, causing ambiguity all over the place.\nWith this change we rename this variant to NotPermitted and map it to\nHTTP status 403. As part of this work, we effectively replace/overlay\nthe recently introduced NotPermitted variants for the various data::v2\nendpoint errors.",
"is_bot": false,
"headline": "Rename omnipresent AuthenticationFailed error to NotPermitted",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-12-17T04:58:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fcf858f6ed6aab4c0d9056a676845d3d1ddf81b6",
"body": "A recent version of clippy complains about a redundant guard in two of\nour tests. Fix these occurrences as per its suggestion.",
"is_bot": false,
"headline": "Address clippy reported issues",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-12-15T15:53:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce93d4d20a8a934a60742ed3cf253a0134c3956a",
"body": "It wouldn't be fun if the fucking documented API contract wouldn't be\nbroken every other month in some utterly braindead way. In this month's\nversion: HTTP status 403 is not used to convey the fact that data could\nnot be retrieved, possibly due to a missing data subscription.\nWith this change we introduce the new NotPermitted variant to the\nvarious data::v2 endpoint error types to expose this condition.",
"is_bot": false,
"headline": "Introduce NotPermitted variant to various data::v2 endpoint errors",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-12-15T04:18:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "92b91512a22c804fbb62f7cab2af30d86766bdf0",
"body": "One may not have guessed, but the first trade on 2018-12-03T21:47:01\njust started happening at a different millisecond! There must be\norder. Better change that now in case someone relied on it, now that we\nknow when it really happened four years ago!!1one\nAdjust our golden value check to ignore sub-second time stamp data\ncompletely to not have to deal with this idiosyncrasy in the future.",
"is_bot": false,
"headline": "Adjust time stamp checks for trade retrieval tests",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-12-14T03:02:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89ce5f4f93fb80aad02ab27899cc6919f8a2b1ca",
"body": "In another hush-hush operation the nimrods at Alpaca decided to remove\nthe error code from their returned API errors. After all, who needs to\nbe able to programmatically decode otherwise ambiguous errors when you\ncan just regex match on strings?!\nRemove the field from our error type accordingly.",
"is_bot": false,
"headline": "Remove error code from ApiError struct",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-12-12T16:20:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3fda4ce16277a5b1e85bd366af1a5c6b2db2823b",
"body": "This time it's volume of up to four year old past data that is being\nmessed with. Remove those checks altogether, as they add little value to\nthe core logic. #clowntown",
"is_bot": false,
"headline": "Remove volume checks from data::v2::bars tests",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-12-12T06:36:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ea9b2198580e0337ed5f5553d03c8e8e8309713",
"body": "Fix grammar issue",
"is_bot": false,
"headline": "Update lib.rs",
"author_name": "Gadersd",
"author_login": "Gadersd",
"committed_at": "2023-09-10T15:40:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "43bbb6e221a5ba798d5749937bf0571dc344bab7",
"body": "The chrono crate has deprecated yet another method. Switch to using the\nnew suggestion.",
"is_bot": false,
"headline": "Address clippy reported issue",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-09-10T14:12:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ff59f7aca8ad01a324b136170f446cd5e1bb1dd",
"body": "You know the drill. Clowns be clowns.",
"is_bot": false,
"headline": "Adjust historical golden bar data for the quadrillion-th^2+1 time",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-09-10T14:10:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9350a77caaddfbfda91194409dff7573676c987a",
"body": "When using the 'vendored-openssl' flag, we have so far only instructed\nhyper-tls to use a vendored copy of OpenSSL. As it turns out tungstenite\nalso has a feature that we may want to set to instruct it to vendor.",
"is_bot": false,
"headline": "Use native-tls-vendored flag on tungstenite when vendoring",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-07-14T04:37:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a081c4b3ef4db4431d4f71060aeeb416cac76ca6",
"body": "This change introduces the matrix.args variable to our job matrix in the\nCI test workflow. Having this variable available will allow us to\npopulate the job matrix with more feature configurations, for example.",
"is_bot": false,
"headline": "Factor out matrix.args variable in CI test workflow",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-07-12T15:21:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e54a3b4cd9c0e9fbe900c8873b88162ee48d59a1",
"body": "Instead of listing specific targets to build as part of the CI test\nworkflow, let's switch to using --all-targets.",
"is_bot": false,
"headline": "Use --all-targets switch in CI test workflow",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-07-12T05:48:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a023e42c46b0da1427957250789bdc2a612b3e47",
"body": "A recent version of clippy complains about a double reference in the\nsymbol normalization code. Fix it.",
"is_bot": false,
"headline": "Address clippy reported issue",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-07-11T05:42:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce340cdf29fed18022d89d62966a456fe75645d0",
"body": "This change bumps the crate to version 0.27.2. The following notable\nchanges have been made since 0.27.1:\n- Expanded crate documentation with a high level overview\n- Bumped async-compression dependency to 0.4",
"is_bot": false,
"headline": "Bump version to 0.27.2",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-28T02:15:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b978d82fe8e665dea66f60c866f50a565439ede",
"body": "This change updates our workflow file definitions by bringing them\ncloser to what we use in other projects.",
"is_bot": false,
"headline": "Sync up workflow file definitions",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-26T14:47:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5bfab48b250978eb3b590bfd9b2e70c6a8d5c40",
"body": "This change expands the crate documentation a bit, providing a better\noverview of high level concepts.",
"is_bot": false,
"headline": "Expand crate documentation",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-25T15:40:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e107aaa68b9036ca80c87d7e6d4de5016f73a4c1",
"body": "The type_length_limit setting that we needed in the past is no longer\nrequired as the rustc compiler has advanced. Remove it.",
"is_bot": false,
"headline": "Remove no longer necessary type_length_limit setting",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-25T06:40:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a43b5cb90a57454edf9bd90b25704baebe463f75",
"body": "This change updates the async-compression dependency to version 0.4.",
"is_bot": false,
"headline": "Update async-compression dependency to 0.4",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-24T02:23:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "773a1abe82e61e947f71943628a34d4ed6c6a947",
"body": "The submit_unsatisfiable_notional_order is failing due to recent\nunannounced changes on the Alpaca backend:\n\n> notional 3333333.33333333, increment does not fulfill minimum pricing criteria\n\nIt's unclear what this message is trying to convey, but we adjust the\ntest to use a non-fractional notional amount to achieve the desired\nbehavior while satisfying the new requirements.",
"is_bot": false,
"headline": "Fix notional order submission test",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-22T14:11:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8a71eb37f7bf1f92691044a83044be0ddb7cb129",
"body": "This change bumps the crate to version 0.27.1. The following notable\nchanges have been made since 0.27.0:\n- Exported api::v2::updates::{Authenticate,Listen} enums as part of\n unofficial unstable API",
"is_bot": false,
"headline": "Bump version to 0.27.1",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-21T02:03:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ef9491d4af4df423190308af9825dad59161d467",
"body": "Up until commit 9f937dd7070f (\"Switch to using new stream authentication\nrequest message format\") we were exporting the api::v2::updates::Request\nenum, which formed part of our undocumented, unofficial, and unstable\nAPI.\nWith said change, however, we missed to export the resulting two newly\nintroduced enum types. Do it now.",
"is_bot": false,
"headline": "Export api::v2::updates enums as part of unofficial unstable API",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-19T14:00:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47a7e1826190a4a100790e837a753dd430e07deb",
"body": "This change bumps the crate to version 0.27.0. The following notable\nchanges have been made since 0.26.2:\n- Added support for overwriting default realtime data bar, quote, and\n trade types\n- Added support for working with custom v2 realtime data streaming URLs\n- Added FillOrKill and ImmediateOrCanc\n[…]\nta::v2::stream::{Bar, Quote, Trade} members from\n u64 to Num\n- Switched to using new stream authentication request message format\n- Adjusted publish workflow to also create GitHub release and Git tag",
"is_bot": false,
"headline": "Bump version to 0.27.0",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-19T01:22:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "daaf6759a52b2136fc7b59bf030b25dc5740de90",
"body": "This change adjusts the publish workflow to create a proper GitHub\nrelease as part of publishing the crate to crates.io. As part of cutting\nsuch a release, a Git tag is created automatically as well. Having this\ninfrastructure in place reduces the number of manual steps that have to\nbe performed as part of the release process.",
"is_bot": false,
"headline": "Adjust publish workflow to create GitHub release",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-17T21:33:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "11c7c5bcea09862c47d147c5da2d039d61c04f0c",
"body": "This change adds a test checking that we format the Error::HttpStatus\nvariant as expected.",
"is_bot": false,
"headline": "Add test for Error::HttpStatus variant formatting",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-05T14:59:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e5cc225ba0bd224b2030c9e351fecdf45de1251",
"body": "Somehow the import of thiserror::Error in src/endpoint.rs has snuck into\nthe middle of the file for no good reason. Move it to the top as is more\ncommon.",
"is_bot": false,
"headline": "Move thiserror::Error import to top of src/endpoint.rs",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-06-05T14:43:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c5a8b9caf88eb00341dd2341f03ce948eab793ef",
"body": "This change adds support for the FillOrKill (fok) and ImmediateOrCancel\n(ioc) variants to the api::v2::order::TimeInForce enum.\n\nSigned-off-by: David Goulet <dgoulet@ev0ke.net>",
"is_bot": false,
"headline": "Add support for fok and ioc time in force",
"author_name": "David Goulet",
"author_login": "dgoulet",
"committed_at": "2023-06-05T14:43:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ec27efe532b402016e7766b072947bcbafac7de",
"body": "Our v2 realtime data streaming URLs currently support two sources, which\nindirectly influence the URL we connect to in the background: IEX and\nSIP.\nHaving two hard coded values like this is great for usability (users\ncan't do much wrong), but it admittedly is not particularly open to\nextension. Spec\n[…]\nout actually\nhard coding details about the not-yet-stabilized Alpaca APIs into the\ncrate.\nWith this change we introduce a the new data::v2::stream::CustomUrl type\nthat enables such usage.\n\nCloses: #56",
"is_bot": false,
"headline": "Enable support for custom v2 realtime data streaming URLs",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-05-30T00:56:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "64f0887c35b2b652c78b52fe818e323e16328710",
"body": "The Bar, Quote, and Trade types of the data::v2::stream module contain a\nbunch of integer members pertaining trade sizes, volumes, and similar.\nWith the introduction of fractional trading there no longer is any\nguarantee that reported values are indeed integers. That certainly is\nnot the case for Crypto streaming APIs.\nWith this change we adjust these members to be of the Num type instead,\nwhich provides a greater deal of flexibility.",
"is_bot": false,
"headline": "Use Num type for various data::v2::stream::{Bar,Quote,Trade} members",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-05-30T00:18:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6b1afa3b1d9c37399d9bbfb9c7494b583b2fefd2",
"body": "This change removes a bunch of .fuse() calls that are no longer needed.",
"is_bot": false,
"headline": "Remove no longer needed .fuse() calls",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-05-29T19:03:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f937dd7070f3ad80ecc836e98443d75658bb59f",
"body": "When subscribing to order updates, for example, we were seeing a message\ntelling us that the format used for the authentication request was being\ndeprecated.\nWith this change we switch to adhering to the new format. To make that\npossible, split the existing Request enumeration type in two, one using\na \"data\" container and the other not.\nWhile at it, also make these two types private to the module they are\ndefined in, as they are not meant to be exposed in any way.",
"is_bot": false,
"headline": "Switch to using new stream authentication request message format",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-05-29T18:34:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab6ce320d4590087eef74cfa2e46a1030f42f567",
"body": "The unaligned_references lint has been removed and converted into a hard\nerror in recent versions of Rust. Remove it from our list of lints to\ncheck accordingly.",
"is_bot": false,
"headline": "Remove unaligned_references lint",
"author_name": "Daniel Müller",
"author_login": "d-e-s-o",
"committed_at": "2023-04-30T17:32:14Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 47,
"commits_last_year": 2,
"latest_release_at": "2026-07-27T15:13:31Z",
"latest_release_tag": "v0.31.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 2,
"days_since_latest_release": 0,
"mean_days_between_releases": 126.2
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "apca",
"exists": true,
"license": "GPL-3.0-or-later",
"keywords": [
"async",
"finance",
"stocks",
"trading",
"asynchronous",
"network-programming",
"api-bindings",
"web-programming::websocket",
"web-programming::http-client"
],
"ecosystem": "crates",
"matches_repo": true,
"registry_url": "https://crates.io/crates/apca",
"is_deprecated": false,
"latest_version": "0.31.0",
"repository_url": "https://github.com/d-e-s-o/apca.git",
"versions_count": 59,
"total_downloads": 106908,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 2602,
"first_published_at": "2019-06-29T15:30:19.777612Z",
"latest_published_at": "2026-07-27T15:13:32.648727Z",
"latest_version_yanked": false,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 55,
"stars": 201,
"watchers": 6,
"fork_history": {
"days": [
{
"date": "2020-05-18",
"count": 1
},
{
"date": "2021-01-10",
"count": 1
},
{
"date": "2021-01-19",
"count": 1
},
{
"date": "2021-01-23",
"count": 1
},
{
"date": "2021-01-25",
"count": 2
},
{
"date": "2021-02-13",
"count": 1
},
{
"date": "2021-02-24",
"count": 1
},
{
"date": "2021-03-07",
"count": 1
},
{
"date": "2021-03-10",
"count": 1
},
{
"date": "2021-04-29",
"count": 1
},
{
"date": "2021-08-07",
"count": 1
},
{
"date": "2021-08-09",
"count": 1
},
{
"date": "2021-08-15",
"count": 1
},
{
"date": "2021-08-23",
"count": 1
},
{
"date": "2021-08-28",
"count": 1
},
{
"date": "2022-01-18",
"count": 1
},
{
"date": "2022-04-30",
"count": 1
},
{
"date": "2022-06-25",
"count": 1
},
{
"date": "2022-07-17",
"count": 1
},
{
"date": "2022-10-24",
"count": 1
},
{
"date": "2022-11-04",
"count": 1
},
{
"date": "2022-12-24",
"count": 1
},
{
"date": "2023-03-30",
"count": 1
},
{
"date": "2023-04-02",
"count": 1
},
{
"date": "2023-04-04",
"count": 1
},
{
"date": "2023-06-09",
"count": 1
},
{
"date": "2023-09-22",
"count": 1
},
{
"date": "2023-12-05",
"count": 1
},
{
"date": "2024-01-09",
"count": 1
},
{
"date": "2024-01-25",
"count": 1
},
{
"date": "2024-02-28",
"count": 1
},
{
"date": "2024-04-06",
"count": 1
},
{
"date": "2024-05-16",
"count": 1
},
{
"date": "2024-07-28",
"count": 1
},
{
"date": "2024-08-08",
"count": 1
},
{
"date": "2024-11-02",
"count": 1
},
{
"date": "2024-11-05",
"count": 1
},
{
"date": "2024-11-15",
"count": 1
},
{
"date": "2024-12-18",
"count": 1
},
{
"date": "2025-03-21",
"count": 1
},
{
"date": "2025-04-19",
"count": 1
},
{
"date": "2025-04-27",
"count": 1
},
{
"date": "2025-05-09",
"count": 1
},
{
"date": "2025-06-02",
"count": 1
},
{
"date": "2025-07-09",
"count": 1
},
{
"date": "2025-07-22",
"count": 1
},
{
"date": "2025-11-01",
"count": 1
},
{
"date": "2026-01-18",
"count": 1
},
{
"date": "2026-02-04",
"count": 1
},
{
"date": "2026-02-10",
"count": 1
},
{
"date": "2026-03-21",
"count": 1
},
{
"date": "2026-03-23",
"count": 1
},
{
"date": "2026-04-19",
"count": 1
},
{
"date": "2026-07-07",
"count": 1
}
],
"complete": true,
"collected": 55,
"total_forks": 55
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"Cargo.toml"
],
"largest_source_bytes": 48659,
"source_files_sampled": 37,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"Cargo.toml"
],
"advisories": {
"error": "No resolved dependencies carried a version and a supported ecosystem",
"scope": "repository_graph",
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 29,
"direct_affected_count": 0
},
"ecosystems": [
"crates"
],
"dependencies": [
{
"name": "async-compression",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.4"
},
{
"name": "async-trait",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.1.51"
},
{
"name": "chrono",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.4.19"
},
{
"name": "futures",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.3"
},
{
"name": "http",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.1"
},
{
"name": "http-body-util",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.1"
},
{
"name": "http-endpoint",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.6"
},
{
"name": "hyper",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.1"
},
{
"name": "hyper-util",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.1.3"
},
{
"name": "hyper-tls",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.6"
},
{
"name": "num-decimal",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.2.4"
},
{
"name": "serde",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.0.103"
},
{
"name": "serde_json",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.0"
},
{
"name": "serde_urlencoded",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.7"
},
{
"name": "serde_variant",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.1"
},
{
"name": "thiserror",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2.0"
},
{
"name": "tokio",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.13"
},
{
"name": "tracing",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.1"
},
{
"name": "tracing-futures",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.2"
},
{
"name": "tungstenite",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.26"
},
{
"name": "url",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2.0"
},
{
"name": "uuid",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.0"
},
{
"name": "websocket-util",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.14"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "async-compression",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "async-trait",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "chrono",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "futures",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "http",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "http-body-util",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "http-endpoint",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "hyper",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "hyper-tls",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "hyper-util",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "num-decimal",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "serde",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "serde_json",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "serde_urlencoded",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "serde_variant",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "thiserror",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "tokio",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "tracing",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "tracing-futures",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "url",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "uuid",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "websocket-util",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "num-bigint",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "openssl",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "proc-macro2",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "rustc_version",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "serial_test",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "test-log",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "tokio-tungstenite",
"direct": false,
"version": null,
"ecosystem": "crates"
}
],
"collected": true,
"truncated": false,
"total_count": 29,
"direct_count": 22,
"indirect_count": 7
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "d-e-s-o",
"commits": 545,
"avatar_url": "https://avatars.githubusercontent.com/u/6610056?v=4"
},
{
"type": "User",
"login": "zjijz",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/8097111?v=4"
},
{
"type": "User",
"login": "behos",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/1937750?v=4"
},
{
"type": "User",
"login": "cemlyn007",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/49565105?v=4"
},
{
"type": "User",
"login": "All8Up",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/130855?v=4"
},
{
"type": "User",
"login": "ajmwagar",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/25015651?v=4"
},
{
"type": "User",
"login": "tudorbotezan",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/132109894?v=4"
},
{
"type": "User",
"login": "dgoulet",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/1129030?v=4"
},
{
"type": "User",
"login": "Gadersd",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/20850534?v=4"
},
{
"type": "User",
"login": "jorelius",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/5904434?v=4"
}
],
"contributors_sampled": 14,
"top_contributor_share": 0.958
},
"quality_signals": {
"has_ci": true,
"has_tests": false,
"ci_workflows": [
"publish.yml",
"test.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 9,
"reason": "11 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 9",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "6d22d791b646b2be986d699f9d348d5eae881c0a",
"ran_at": "2026-07-27T20:40:15Z",
"aggregate_score": 5,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-27T15:13:36Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/d-e-s-o/apca",
"host": "github.com",
"name": "apca",
"owner": "d-e-s-o"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 51,
"inputs": {
"security": 50,
"vitality": 64,
"community": 54,
"governance": 43,
"engineering": 42
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 64,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 51,
"inputs": {
"commits_last_year": 2,
"human_commit_share": 0.94,
"days_since_last_push": 0,
"active_weeks_last_year": 2
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "2/52 weeks with commits",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 2
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "2 commits in the last year",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 2
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "11 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 9",
"points": 9,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 84,
"inputs": {
"releases_count": 47,
"latest_release_tag": "v0.31.0",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 126.2
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "47 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 47
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~126.2 days",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 126.2
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": -38,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit -38 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": -38
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 54,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"forks": 55,
"stars": 201,
"watchers": 6,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "201 stars",
"points": 37.3,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 201
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "55 forks",
"points": 14.4,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 55
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "6 watchers",
"points": 3.9,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 6
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (GPL-3.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "GPL-3.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 57,
"inputs": {
"packages": [
"apca"
],
"dependents": null,
"ecosystems": "crates",
"total_downloads": 106908,
"monthly_downloads": 2602
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,602 downloads/month across crates",
"points": 45.5,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2602,
"ecosystems": "crates"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 43,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 26,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 14,
"top_contributor_share": 0.958
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 96% of commits",
"points": 0.9,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 96
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "14 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 14
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"followers": 71,
"owner_type": "User",
"is_verified": null,
"owner_login": "d-e-s-o",
"public_repos": 205,
"account_age_days": 4553
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "71 followers of d-e-s-o",
"points": 13.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 71,
"login": "d-e-s-o"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "205 public repos, account ~12 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 205
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"apca"
],
"ecosystems": "crates",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on crates",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "crates"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "59 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 59
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "at_risk",
"name": "Engineering Quality",
"value": 42,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 30,
"inputs": {
"has_ci": true,
"has_tests": false,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"topics": [
"alpaca-markets",
"alpaca",
"alpaca-trading-api",
"alpaca-api",
"rust",
"rust-library",
"rust-crate"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "7 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 7
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 50,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 50,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 5
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "11 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 9",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 12
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "at_risk",
"name": "AI Readiness",
"value": 46,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.926,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "87 of 94 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 87,
"sampled": 94
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 32,
"inputs": {
"has_nix": false,
"has_tests": false,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"Cargo.toml"
],
"dependency_bot_commit_share": 0.06
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Cargo.toml (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "Cargo.toml"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Rust (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Rust"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "6 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 6,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Rust",
"largest_source_bytes": 48659,
"source_files_sampled": 37,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Rust (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Rust"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/37 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 37,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"deps.dev does not index crates:apca@0.31.0; advisories assessed against the repository dependency graph instead",
"No resolved dependencies carried a version and a supported ecosystem"
],
"report_type": "repository",
"generated_at": "2026-07-27T20:40:26.627731Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/d-e-s-o/apca.svg",
"full_name": "d-e-s-o/apca",
"license_state": "standard",
"license_spdx": "GPL-3.0"
}