Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [
"aho-corasick",
"substring-matching",
"finite-state-machine",
"text-processing",
"search"
],
"is_fork": false,
"size_kb": 4959,
"has_wiki": false,
"homepage": null,
"languages": {
"Rust": 816302
},
"pushed_at": "2026-04-21T20:54:23Z",
"created_at": "2015-06-11T23:02:10Z",
"owner_type": "User",
"updated_at": "2026-07-21T04:31:52Z",
"description": "A fast implementation of Aho-Corasick in Rust.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Unlicense",
"default_branch": "master",
"license_spdx_raw": "Unlicense",
"primary_language": "Rust",
"significant_languages": [
"Rust"
]
},
"owner": {
"blog": "https://burntsushi.net",
"name": "Andrew Gallant",
"type": "User",
"login": "BurntSushi",
"company": "@openai",
"location": "Marlborough, MA",
"followers": 12664,
"avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
"created_at": "2010-10-27T16:54:30Z",
"is_verified": null,
"public_repos": 182,
"account_age_days": 5747
},
"license": {
"state": "standard",
"spdx_id": "Unlicense",
"raw_spdx": "Unlicense",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "1.1.4",
"kind": "patch",
"published_at": "2025-10-28T21:09:41Z"
},
{
"tag": "1.1.3",
"kind": "patch",
"published_at": "2024-03-20T00:06:09Z"
},
{
"tag": "1.1.2",
"kind": "patch",
"published_at": "2023-10-09T14:20:19Z"
},
{
"tag": "1.1.1",
"kind": "patch",
"published_at": "2023-09-20T13:35:35Z"
},
{
"tag": "1.1.0",
"kind": "minor",
"published_at": "2023-09-18T13:33:02Z"
},
{
"tag": "1.0.5",
"kind": "patch",
"published_at": "2023-08-29T18:01:54Z"
},
{
"tag": "1.0.4",
"kind": "patch",
"published_at": "2023-08-14T16:13:10Z"
},
{
"tag": "1.0.3",
"kind": "patch",
"published_at": "2023-08-10T02:37:44Z"
},
{
"tag": "1.0.2",
"kind": "patch",
"published_at": "2023-06-04T13:44:12Z"
},
{
"tag": "1.0.1",
"kind": "patch",
"published_at": "2023-04-21T00:26:29Z"
},
{
"tag": "1.0.0",
"kind": "major",
"published_at": "2023-04-17T18:20:32Z"
},
{
"tag": "0.7.20",
"kind": "patch",
"published_at": "2022-11-22T03:35:53Z"
},
{
"tag": "0.7.19",
"kind": "patch",
"published_at": "2022-09-03T17:30:50Z"
},
{
"tag": "0.7.18",
"kind": "patch",
"published_at": "2021-04-30T23:53:19Z"
},
{
"tag": "0.7.17",
"kind": "patch",
"published_at": "2021-04-30T23:38:02Z"
},
{
"tag": "0.7.15",
"kind": "patch",
"published_at": "2020-11-03T17:20:49Z"
},
{
"tag": "0.7.14",
"kind": "patch",
"published_at": "2020-10-12T23:34:57Z"
},
{
"tag": "0.7.13",
"kind": "patch",
"published_at": "2020-06-23T12:27:48Z"
},
{
"tag": "0.7.12",
"kind": "patch",
"published_at": "2020-06-22T17:33:20Z"
},
{
"tag": "0.7.11",
"kind": "patch",
"published_at": "2020-06-22T16:58:37Z"
},
{
"tag": "0.7.10",
"kind": "patch",
"published_at": "2020-03-08T23:56:29Z"
},
{
"tag": "0.7.9",
"kind": "patch",
"published_at": "2020-02-27T01:25:46Z"
},
{
"tag": "0.7.8",
"kind": "patch",
"published_at": "2020-02-04T14:02:13Z"
},
{
"tag": "0.7.7",
"kind": "patch",
"published_at": "2020-01-29T14:12:12Z"
},
{
"tag": "0.7.6",
"kind": "patch",
"published_at": "2019-08-03T15:31:28Z"
},
{
"tag": "0.7.5",
"kind": "patch",
"published_at": "2019-08-03T13:48:17Z"
},
{
"tag": "0.7.4",
"kind": "patch",
"published_at": "2019-07-02T14:05:10Z"
},
{
"tag": "0.7.3",
"kind": "patch",
"published_at": "2019-03-31T11:41:19Z"
},
{
"tag": "0.7.2",
"kind": "patch",
"published_at": "2019-03-31T11:35:53Z"
},
{
"tag": "0.7.1",
"kind": "patch",
"published_at": "2019-03-28T23:40:35Z"
},
{
"tag": "0.7.0",
"kind": "minor",
"published_at": "2019-03-28T02:17:59Z"
},
{
"tag": "0.6.10",
"kind": "patch",
"published_at": "2019-02-16T16:38:28Z"
},
{
"tag": "0.6.9",
"kind": "patch",
"published_at": "2018-10-29T11:00:50Z"
},
{
"tag": "0.6.8",
"kind": "patch",
"published_at": "2018-08-27T00:03:35Z"
},
{
"tag": "0.6.7",
"kind": "patch",
"published_at": "2018-08-25T15:10:27Z"
},
{
"tag": "0.6.6",
"kind": "patch",
"published_at": "2018-07-12T20:42:56Z"
},
{
"tag": "0.6.5",
"kind": "patch",
"published_at": "2018-06-27T18:52:56Z"
},
{
"tag": "0.6.4",
"kind": "patch",
"published_at": "2017-11-30T14:39:42Z"
},
{
"tag": "0.6.3",
"kind": "patch",
"published_at": "2017-03-17T00:43:22Z"
},
{
"tag": "0.6.2",
"kind": "patch",
"published_at": "2017-02-08T17:33:49Z"
},
{
"tag": "0.6.1",
"kind": "patch",
"published_at": "2017-01-03T01:11:41Z"
},
{
"tag": "0.6.0",
"kind": "minor",
"published_at": "2017-01-02T22:13:44Z"
},
{
"tag": "0.5.3",
"kind": "patch",
"published_at": "2016-09-11T18:33:02Z"
},
{
"tag": "0.5.2",
"kind": "patch",
"published_at": "2016-05-01T03:49:06Z"
},
{
"tag": "0.5.1",
"kind": "patch",
"published_at": "2016-02-16T12:03:32Z"
},
{
"tag": "0.5.0",
"kind": "minor",
"published_at": "2016-02-14T22:11:58Z"
},
{
"tag": "0.4.1",
"kind": "patch",
"published_at": "2016-01-31T15:18:11Z"
},
{
"tag": "0.4.0",
"kind": "minor",
"published_at": "2015-10-21T20:57:41Z"
},
{
"tag": "0.3.4",
"kind": "patch",
"published_at": "2015-10-17T03:58:22Z"
},
{
"tag": "0.3.3",
"kind": "patch",
"published_at": "2015-10-17T03:58:13Z"
},
{
"tag": "0.3.2",
"kind": "patch",
"published_at": "2015-08-30T15:02:04Z"
},
{
"tag": "0.3.1",
"kind": "patch",
"published_at": "2015-08-30T15:01:11Z"
},
{
"tag": "0.3.0",
"kind": "minor",
"published_at": "2015-07-14T22:03:46Z"
},
{
"tag": "0.2.2",
"kind": "patch",
"published_at": "2015-07-03T14:10:40Z"
},
{
"tag": "0.2.1",
"kind": "patch",
"published_at": "2015-06-20T04:53:51Z"
},
{
"tag": "0.2.0",
"kind": "minor",
"published_at": "2015-06-20T04:42:23Z"
},
{
"tag": "0.1.5",
"kind": "patch",
"published_at": "2015-06-18T10:48:32Z"
},
{
"tag": "0.1.4",
"kind": "patch",
"published_at": "2015-06-17T23:33:54Z"
},
{
"tag": "0.1.3",
"kind": "patch",
"published_at": "2015-06-16T23:06:38Z"
},
{
"tag": "0.1.2",
"kind": "patch",
"published_at": "2015-06-14T22:42:17Z"
},
{
"tag": "0.1.1",
"kind": "patch",
"published_at": "2015-06-14T06:30:10Z"
}
],
"recent_commits": [
{
"oid": "c82178696b9ddc18b56c3c74853529e7926ff329",
"body": "Bumps the actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\n\nUpdates `actions/checkout` from 3.6.0 to 6.0.2\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https\n[…]\npe: version-update:semver-major\n dependency-group: actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "build(deps): bump actions/checkout in the actions group (#171)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-04-21T20:54:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8209bb9d614ccdddec1c5e60f4b4d683a4c7788a",
"body": "* Hash-pin all actions with `pinact run -v`\n\nSigned-off-by: William Woodruff <william@yossarian.net>\n\n* Avoid credential persistence in actions/checkout\n\nSigned-off-by: William Woodruff <william@yossarian.net>\n\n* Add a Dependabot config\n\nSigned-off-by: William Woodruff <william@yossarian.net>\n\n---------\n\nSigned-off-by: William Woodruff <william@yossarian.net>",
"is_bot": false,
"headline": "Hash-pin all actions, drop persisted credentials (#170)",
"author_name": "William Woodruff",
"author_login": "woodruffw",
"committed_at": "2026-04-21T19:36:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f3f5da9bdec0d811f9a344e3cb9c033b15df20b",
"body": "This brings the API documentation for `Span::offset` and\n`packed::Searcher::find_in` into consistency with `Input::span`. That\nis, if you try to set offsets that are incorrect for the provided\nhaystack (or are pathologically invalid), then you get a panic. This\nmimics how, e.g., `&slice[range]` work\n[…]\noffsets are usually _trusted_ information, which is why\nit's reasonable to establish their correctness as a precondition.\n\n[RUSTSEC advisory proposal]: https://github.com/rustsec/advisory-db/pull/2684",
"is_bot": false,
"headline": "api: document a couple panicking preconditions",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2026-02-27T14:52:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e88e1fce8f7c2073488842cf8cd3d322329e012b",
"body": null,
"is_bot": false,
"headline": "benchmarks: bump dependencies",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2026-02-11T17:04:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "88e4966516aa4427d717578671353bb8969a048f",
"body": null,
"is_bot": false,
"headline": "ci: use older version of `log` on pinned build",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2025-10-28T21:24:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "17f8b32e3b7c845ef3c5429b823804f552f14ec9",
"body": null,
"is_bot": false,
"headline": "1.1.4",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2025-10-28T21:09:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b58556ea5aac5a61a6094f93c3a2398198cb907e",
"body": "The feature was renamed.\n\nPR #165",
"is_bot": false,
"headline": "doc: switch from `doc_auto_cfg` to `doc_cfg`",
"author_name": "Joshua Barretto",
"author_login": "zesterer",
"committed_at": "2025-10-28T21:09:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "948d2e1f8e4b6b0aff13075176922e158c8bed46",
"body": null,
"is_bot": false,
"headline": "github: add FUNDING",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2024-09-25T20:44:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1adf588b6aa778dcd97faa4e3752d569ebf5b4f7",
"body": null,
"is_bot": false,
"headline": "benchmarks: update deps",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2024-09-25T20:44:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cd400ad792d6888cc8fa4c1f9e2493b519961b3c",
"body": "These changes only reflect a subset that I agreed with.\r\n\r\nPR #135",
"is_bot": false,
"headline": "lint: resolve a few Clippy warnings",
"author_name": "Akmal",
"author_login": "allaboutevemirolive",
"committed_at": "2024-03-27T20:37:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56256dca1bcd2365fd1dc987c1c06195429a2e2c",
"body": null,
"is_bot": false,
"headline": "1.1.3",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2024-03-20T00:06:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b64b2251c684ebf37d1dfffe61440d98ff048d5",
"body": "If I've understood correctly, the \"neon\" feature is not available\r\nin big-endian mode on aarch64. Despite this, I need to test for\r\nboth \"neon\" feature and endian-ness to make this build.\r\n\r\nThis overall feels like a suspicious change to me. It would also\r\nbe better if we could test this in CI, but for now I'm fine relying\r\non users of these niche targets submitting patches to fix\r\nbreakages as they arise.",
"is_bot": false,
"headline": "simd: fix big-endian aarch64 build",
"author_name": "he32",
"author_login": "he32",
"committed_at": "2024-03-20T00:05:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59b365543d01409959bb93a20a28fb34ff532c03",
"body": null,
"is_bot": false,
"headline": "style: clean up lint violations",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2024-02-26T01:39:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f227162f7c56b3f28e9dd69a655316af0107b29b",
"body": "There was some discussion about how to compare jetscii with Teddy and\nsome interesting benchmark results[1]. I decided to import the\nbenchmarks and see what things look like here.\n\n[1]: https://github.com/shepmaster/jetscii/pull/57",
"is_bot": false,
"headline": "benchmarks: import jetscii's benchmarks",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-10-20T16:26:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "964a2d5431d099d70e770fd4c19e51dfbb389252",
"body": null,
"is_bot": false,
"headline": "benchmarks: update aho-corasick engine lock file",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-10-09T14:21:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d84a5073d5108fce1774b375105dfdb13fe4e81c",
"body": null,
"is_bot": false,
"headline": "1.1.2",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-10-09T14:20:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c3802f2c8164bb77be216cd8dcd316ec9e1a331",
"body": "This bug has existed since the 1.0 release (I believe), but was\nexacerbated when I changed the non-contiguous NFA to use a linked list\nfor its sparse transitions. In that change, I made it so the special\nsentinel DEAD and FAIL states didn't get densified to save on memory. I\ndid this because you gen\n[…]\non of the DEAD state: once you\nenter it, you can never leave.)\n\nI discovered this through some ad hoc benchmarking with rebar. I noticed\nthat one of the DFA compilation benchmarks had slowed way down.",
"is_bot": false,
"headline": "dfa: fix performance bug when building a DFA",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-10-09T14:16:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "12025c561af747fd74c7a745e03d7e21c15f5584",
"body": "I noticed this when running the rebar benchmarks. Some of the DFA\ncompilation benchmarks seem to have regressed.",
"is_bot": false,
"headline": "doc: add a FIXME about a perf problem",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-10-09T02:01:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3c475c593c114229cc79512d43221c896a6fd3a6",
"body": null,
"is_bot": false,
"headline": "1.1.1",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-20T13:35:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3c811c294e09880ded4edc4e35bf9f923e8979af",
"body": "It turns out that _mm_extract_epi64 requires SSE 4.1. While it would be\nfine to just require that (virtually all CPUs have it available), the\nrest of Teddy only requires SSSE3. I don't love bumping the mininum\nrequired just to get the lanes out of a vector. So just replace it with\na transmute.\n\nThe AVX2 variant isn't impacted by this since AVX2 came with\n_mm256_extract_epi64.\n\nKudos to https://github.com/llogiq/bytecount/issues/85 for making me\ncheck this.",
"is_bot": false,
"headline": "teddy: replace _mm_extract_epi64 with transmute",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-20T13:35:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ed2c389908163c7e253f59dfb15a155db219e8c",
"body": "This is a WIP for now.",
"is_bot": false,
"headline": "benchmarks: start work on a more curated set of benchmarks",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T14:56:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd84b6d85041f47364a439567ced6bc67e03cbb7",
"body": "This reflects the fact that these come from rebar's primary regex\nbenchmark and aren't necessarily curated with respect to Aho-Corasick\nspecifically.",
"is_bot": false,
"headline": "benchmarks: rename 'curated' to 'regexcurated'",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T14:30:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "081a22f5d0c4845e56c324dd4f6088f23cfb7ebc",
"body": null,
"is_bot": false,
"headline": "1.1.0",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:33:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "483b8a5ba4b1303a69834a8d7d2b0f3dbc670059",
"body": "Now that we have support for aarch64, we should be a little more\ncareful.\n\nWe also add a check for target endianness and bail out if it isn't\nlittle endian. I'm pretty sure Teddy can be very easily adapted for\nbig-endian, but I don't know how to test it. That is, I don't know how\nto run Teddy on aarch64 with big-endian.",
"is_bot": false,
"headline": "doc: fix wording that used to only refer to x86-64",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:29:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f9d633f970bbb3dcf038919023fbc6b559753092",
"body": null,
"is_bot": false,
"headline": "benchmarks: add x86_64 measurements",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:22:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0820667dade1a58a066354054d371df24f13c9d",
"body": null,
"is_bot": false,
"headline": "benchmarks: add aarch64 measurements",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:21:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0be6fe43822aeb193d8894fd1400c8b843320ef0",
"body": "While this does technically rewrite Teddy, we don't really do any core\nchanges to how it previously worked. We mostly just shuffle and\nre-organize code so that it's written to use a generic vector type\ninstead of explicitly specialized to __m128i and __m256i. We also use\nthis opportunity to introduc\n[…]\nan\nimplementation of the Vector trait for `u8x16_t` on `aarch64`. Kudos to\nthe sse2neon[1] project for making that port much faster than it would\nhave been.\n\n[1]: https://github.com/DLTcollab/sse2neon",
"is_bot": false,
"headline": "packed: rewrite Teddy to use generic Vector interface",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:20:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9c2d30aa2010cbe58a5b9ae1179a8174a54820f6",
"body": "We're going to replace it with a Vector trait that can be implemented\nfor multiple vector types. Similar to what was done with memchr[1].\n\nBefore doing that, we move the old stuff aside.\n\n[1]: https://github.com/BurntSushi/memchr/blob/f6188dbbca2b529100852e4509d48d2d002a674a/src/vector.rs",
"is_bot": false,
"headline": "packed: move old vector helpers aside",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:20:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e34ae00eca25e61a8e26fb0cf8280edb33eb3d26",
"body": null,
"is_bot": false,
"headline": "benchmarks: add initial x86_64 measurements",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:20:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2747579200a90d4e2b852552423738d6c1d147cb",
"body": null,
"is_bot": false,
"headline": "benchmarks: add initial aarch64 measurements",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:20:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a9cac2c3e2ae7f399bcb2e9a8cf9994e01ca326",
"body": "We have switched to rebar.",
"is_bot": false,
"headline": "bench: remove Criterion benchmarks",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:20:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "55dd2fc525f3dd6d09ff84dc5ccaf67a05036ba3",
"body": "A subsequent commit will remove the Criterion benchmarks.\n\nThis essentially makes benchmarking homogenous now between the regex,\naho-corasick and memchr crates.\n\nFor now, we start with the benchmarks that were defined for Criterion.\nWill refine these over time. We also start with a naive multi-substring\nalgorithm and the daachorse crate too.",
"is_bot": false,
"headline": "benchmarks: switch to rebar",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:20:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a081ab459a696043c512c7b1154dedd0895dd8b",
"body": "I botched the memchr 2.6 MSRV because it actually requires Rust 1.61\nand not Rust 1.60. This crate's MSRV is Rust 1.60, so pin memchr to a\nversion that works on Rust 1.60 (for x86-64 at least).\n\nRef https://github.com/rust-lang/regex/pull/1081",
"is_bot": false,
"headline": "ci: pin to memchr 2.6.2 for MSRV CI job",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-09-18T13:20:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "865932205d5d78a3c7e7e1a7033bc63a52a320ba",
"body": "Closes #125 \r\n\r\nPR #127",
"is_bot": false,
"headline": "doc: add link to tmikus/ahocorasick_rs",
"author_name": "Tomasz Mikuś",
"author_login": null,
"committed_at": "2023-08-30T15:53:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea0e5589794557e87661d2c8be5eb058d8ca1afc",
"body": null,
"is_bot": false,
"headline": "1.0.5",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-29T18:01:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ae537cd1ca7de6897984cb7b666935c19c8c0fb",
"body": "I added this while hacking around in the non-contiguous NFA for the\n1.0.4 release and forgot to remove it. So we do a little clean-up.",
"is_bot": false,
"headline": "lint: get rid of 'allow(warnings)' and fix fallout",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-29T18:01:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ed6e2ffef7c1c51004dbc3f5c0a20d17d0028aa6",
"body": "This mirrors the same change made for the regex crate.[1]\n\n[1]: https://github.com/rust-lang/regex/commit/c788378d6fe407f4774df98a78436cea5d98525b",
"is_bot": false,
"headline": "ci: replace mips with powerpc64 and s390x",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-29T18:01:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "776b0910a5061213815b0c18c08a173b909c744a",
"body": "It turns out that #121 introduced a relatively sizeable performance\nregression when building very small automatons. Namely, several of the\nsteps in the construction process took worst case `O(n^2)` time, where\n`n` corresponds to the alphabet size (255 in this case). This ends up\nnot being too awful \n[…]\nead. This makes\nthings a little more complicated, and perhaps there is a better\nabstraction to make this simpler.\n\nThis was found by Ruff's benchmark suite:\nhttps://github.com/astral-sh/ruff/pull/6964",
"is_bot": false,
"headline": "nfa: improve construction times for small automatons",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-29T18:01:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "feda22857e1d0dd069b9c8941f0caf47a19ad078",
"body": null,
"is_bot": false,
"headline": "1.0.4",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-14T16:13:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31bb1fc30da69ab8575483c55e15384d09f4c88d",
"body": "This completely re-works how transitions are represented in a\nnon-contiguous NFA. As a result, we improve search times, decrease heap\nrequirements for an NFA by about half and decrease peak memory usage by\nabout two thirds.\n\nThe essential difference here is to move `State::trans` and\n`State::matches\n[…]\nmore games and leave that to the domain of the contiguous NFA.\n\nSee also [1] as a kick-in-the-ass to follow this thread and improve\nthings.\n\n[1]: https://github.com/G-Research/ahocorasick_rs/issues/62",
"is_bot": false,
"headline": "nfa/noncontiguous: use a linked list to represent transitions",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-14T16:12:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ba085aa97980750456700c84443304c119f9e783",
"body": "The issue here is that now both the non-contiguous and contiguous NFAs\nsupport a dense depth option, but they want different default values. I\nended up increasing this by 1 to match the default value for the\nnon-contiguous NFA because it can imporve search times quite a bit. This\ndoes modestly increase memory usage of a contiguous NFA (its default\nvalue is 2), but of course, CLI users can always tweak this explicitly\nwith --dense-depth.",
"is_bot": false,
"headline": "aho-corasick-debug: tweak default dense depth value",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-14T16:12:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b5481576432884df09a54ec23469c69ef1f8582",
"body": "This winds up being a modest savings in heap memory usage. If we fail in\nour experiment to change how transitions are represented, we can at\nleast bank this more modest win.\n\nInterestingly, the 'repr(packed)' attribute could be applied without any\nchanges. We just never happened to try and take a reference to any of\nthe fields on 'Transition'. (Which isn't allowed because the fields on a\npacked struct need to do unaligned loads and references must be\naligned.)",
"is_bot": false,
"headline": "nfa/noncontiguous: use 'repr(packed)' on 'Transition'",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-14T16:12:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "25327243d2e597b79eaf927189ce7546c2a1d45d",
"body": "This commit refactors the non-contiguous NFA such that its state\ntransitions must be computed by using the NFA itself and not by using a\n`State` directly.\n\nConstruction and search time remain roughly the same here. No obvious\ndifference could be seen in ad hoc benchmarking.\n\nThe main idea here is to\n[…]\nthon\npackage. (The contiguous NFA uses far less memory, but you still need to\nbuild a non-contiguous NFA in order to get a contiguous NFA.)\n\n[1]: https://github.com/G-Research/ahocorasick_rs/issues/62",
"is_bot": false,
"headline": "nfa/noncontiguous: refactor to encapsulate state transitions",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-14T16:12:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "651484deb82fe0ba029e963fd62e420550726d8d",
"body": null,
"is_bot": false,
"headline": "1.0.3",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-10T02:37:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "474393be8d6be7418699e0a9ef8e00fe2fd9cd75",
"body": "This commit reduces the *actual* heap memory used by noncontiguous\nNFAs, contiguous NFAs and DFAs. Previously, all three would report\nmemory usage that only included what was actually being used within\neach Vec. But each Vec might actually have a lot more heap memory\ninside of it in the form of unus\n[…]\nnested Vecs. It turns out that they end up\npenalizing us quite a bit.\n\nThis commit was inspired by the investigation I did as part of this\nissue: https://github.com/G-Research/ahocorasick_rs/issues/62",
"is_bot": false,
"headline": "nfa,dfa: call shrink_to_vec in places",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-10T02:37:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e27da6435c629c502fda8c5099aff6e6ce7c9b72",
"body": "Previously the heap usage required for storing the lengths of each\npattern was not included in the memory usage reported.",
"is_bot": false,
"headline": "nfa/noncontiguous: fix memory usage reporting",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-10T02:37:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fcfef4114681b09ecc1d187ecfc0b96c9bdc27c1",
"body": "I think I started with a contiguous representation but switched to\nnested allocs. Which is kind of unfortunate, and I'd like to fix that,\nbut for now we should document reality.",
"is_bot": false,
"headline": "dfa: fix docs for memory representation",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-08-10T02:37:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8d735471fc12f0ca570cead8e17342274fae6331",
"body": "This enables \"jump to definition\" functionality in the\r\nsource code view of rustdoc.\r\n\r\nPR #119",
"is_bot": false,
"headline": "docs.rs: add --generate-link-to-definition flag",
"author_name": "Guillaume Gomez",
"author_login": "GuillaumeGomez",
"committed_at": "2023-07-14T18:37:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97e48b6dbdf9ebd50168540276fa3f14f403d42b",
"body": null,
"is_bot": false,
"headline": "1.0.2",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-06-04T13:44:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7fa9083dd1f0ce94b8608bd52bbd6bce2991a9f2",
"body": "The specific values can change depending on pointer size, so we just\nskip them for non-64-bit targets.\n\nFixes #116",
"is_bot": false,
"headline": "test: fix memory usage tests",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-06-04T13:43:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "844b7742a1b064b251596db09a67c36e85dcdf18",
"body": "OK, so it wasn't cross' fault. It was just me being dumb. Sigh.",
"is_bot": false,
"headline": "ci: add $TARGET to cargo commands",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-06-04T13:43:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be1d02522da72dad96f0d78c79aa7b1a1a271d5d",
"body": "It looks like cross 0.2.1 might not be running tests correctly. Ug.",
"is_bot": false,
"headline": "ci: update to cross 0.2.5",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-06-04T13:43:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "21389ff40e5a76167432ac807547de3188161aec",
"body": null,
"is_bot": false,
"headline": "ci: move to 'actions/checkout@v3'",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-06-04T13:43:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b91b78560d4f271426e9ce5c26681ef3b32aec76",
"body": "The 'swar' test is apparently sensitive to endianness. The test is just\nabout demonstrating a technique I had tried but didn't work out for perf\nreasons. It's good to keep it, but let's just gate it on little-endian\ntargets.\n\nFixes #117",
"is_bot": false,
"headline": "nfa/contiguous: gate 'swar' test",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-06-04T13:43:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "88e6bd90740e9fea6b2124778dddb8bded88e0f4",
"body": "It looks like rustc didn't detect this before.",
"is_bot": false,
"headline": "lint: remove unnecessary 'mut' binding",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-05-25T14:48:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fc69ed642b4d340d5db234a49cb4609e731f18cc",
"body": null,
"is_bot": false,
"headline": "1.0.1",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-21T00:26:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "301fc372baaab038109260afbe1b47fa36b4bd55",
"body": "And also replace specific instructions to edit the `Cargo.toml` with\nrunning the `cargo add` command.",
"is_bot": false,
"headline": "doc: remove note about 1.0 being unpublished",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-17T18:54:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8eb6f5a3e8348ad80f16d2174c3d387064a1cc2e",
"body": "Brief changelog from the `0.7.x` version:\n\n* A new crate feature, `std`, has been added and is enabled by\ndefault. This makes the standard library optional and permits using\n`aho-corasick` in core/alloc-only contexts. But you do need `alloc`.\n* The top-level `AhoCorasick` will mostly behave the same\n[…]\nite your own search routines. This might unlock more interesting\nstreaming use cases.\n* The `packed` submodule remains largely unchanged.\n* Increases the MSRV to Rust 1.60.0.\n\nCloses #101, Closes #108",
"is_bot": false,
"headline": "1.0.0",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-17T18:20:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "beb163a62eaa5a4d1cf71054451371668e1e7654",
"body": null,
"is_bot": false,
"headline": "cargo: add note about plans for 'fst' integration",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-17T15:43:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7edd3498722231f5c601ef5ae77e57233b071947",
"body": "I originally didn't intend to do this, but the Automaton trait has grown\nquite large. It seems unlikely/impractical for others to meaningfully\nimplement it. In exchange, sealing the trait means we can add new\nrequired methods while retaining backwards compatibility.\n\nFor the most part, this is an exercise in conservatism. We can always\nunseal it if it turns out people really want to implement it themselves.",
"is_bot": false,
"headline": "api: seal the Automaton trait",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-15T13:03:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72e0f659c59e5388899f9eb2ae15854193bef71b",
"body": "I think this is what was preventing CI from running? Terrible failure\nmodes. Just fails due to an \"internal error.\"",
"is_bot": false,
"headline": "ci: update OS versions",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-05T13:18:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f59744598b8cef44d38053750700990ba30f0828",
"body": "Ref https://github.com/BurntSushi/aho-corasick/issues/108#issuecomment-1492823546",
"is_bot": false,
"headline": "doc: tweak docs for perf-literal crate feature",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-05T13:18:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b99c36e2f39431f54c557f36a04111bebb769d58",
"body": "Ref https://github.com/BurntSushi/aho-corasick/issues/108#issuecomment-1489239160",
"is_bot": false,
"headline": "doc: a variety of improvements",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-05T13:18:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1004246d56a1c6354d0267a99cff7d0915c81d8f",
"body": "Ref https://github.com/BurntSushi/aho-corasick/issues/108#issuecomment-1489239160",
"is_bot": false,
"headline": "doc: 'std' also enables the stream search APIs",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-05T13:18:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8ffc20336e4169f58c3d686c06c679ae43ca0371",
"body": "Basically, we now make AhoCorasickBuilder::kind ask for an\nOption<AhoCorasickKind>. When None (the default), it will behave the\nsame as the old AhoCorasickKind::Auto variant.\n\nThis change then opens the door to adding a AhoCorasick::kind method\nwhich reports what kind of automaton is actually used. \n[…]\nlated into some\nother specific variant and would never be returned by AhoCorasick::kind.\n\nThis suggestion was taken from the feedback given here:\nhttps://github.com/G-Research/ahocorasick_rs/issues/50",
"is_bot": false,
"headline": "api: drop AhoCorasickKind::auto and add AhoCorasick::kind",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-04-05T13:18:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "070de2a99c2dfd666dc8a071588ca3579d9ef7ee",
"body": null,
"is_bot": false,
"headline": "ci: add a test run with the 'logging' feature",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-03-28T11:38:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "74afa893e1f0723cbda9774d2fd135a93d9130bf",
"body": null,
"is_bot": false,
"headline": "impl: clean up some of the 'allow' directives",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-03-28T11:36:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c88cf359f9c853986d7c182b013f5c6d81af10c3",
"body": "This commit does some surgery on the in memory representation of\nthe contiguous NFA. Previously, we had been packing both the next\ntransition ID and the byte corresponding to that transition into a\nsingle u32. In order to achieve that, we placed a restriction on the\nallowable state IDs: they must be\n[…]\nGB of memory, but it\ncan now actually be done. (The non-contiguous NFA is about 10GB of\nmemory, which does still need to be built first, but then it can be\ndiscarded once the contiguous NFA is built.)",
"is_bot": false,
"headline": "nfa/contiguous: expand utility of contiguous NFA at cost of memory",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-03-23T01:58:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "05d8b0ebbc89be6dad297503ba7c6dd0e5607d45",
"body": null,
"is_bot": false,
"headline": "vim: cause rust-analyzer to see aho-corasick-debug",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-03-23T01:58:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b26ce9054485ec5ad28f6ced10d3303335bcf274",
"body": "I never meant to export this. Thank goodness I caught it before 1.0.\nSheesh.",
"is_bot": false,
"headline": "api: un-export StreamChunkIter",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-03-21T01:20:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f91b5011ff08e243fa7e523998a65c81ee98c92",
"body": "Basically, we:\n\n1. Add 'min_pattern_len' to complement 'max_pattern_len'.\n2. Rewrite stream search to be less convuleted by just walking the\n automaton ourselves.\n3. Ban stream searching when the automaton contains an empty pattern.\n\nI did (3) because it greatly simplifies the implementation and it\nhonestly seems like a footgun to support it anyway.",
"is_bot": false,
"headline": "impl: rework stream searching",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-03-10T16:44:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "86fdfecaf66330b2cebb4ad6b47d0ff7ece60674",
"body": "I think it was probably a little silly to try and use 'Input'\nhere. I think I was trying to copy regex-automata too much. In\naho-corasick, all we need is the anchor mode since we don't care\nabout look-around here.\n\nThis also makes a lot of the calls more sensible, since we were\njust materializing dummy 'Input' values just to get the start\nstate.",
"is_bot": false,
"headline": "api: use 'Anchored' instead of 'Input' for 'start_state'",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-03-10T16:44:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0317ac8a366106608acc76c3aa73ae3b72039ab3",
"body": "I'm expecting that I'll move this stuff to the 'fst' crate and make\n'aho-corasick' an optional dependency there. And do the same for\n'regex-automata'. Basically, I'd just prefer not to depend on 'fst' from\nthese core crates.\n\nI think the reason why I did this historically was on the off chance\nthat I used 'fst' from aho-corasick (or more likely, regex-syntax) for\nparsing Unicode character names. But I think that's very unlikely to\never happen.",
"is_bot": false,
"headline": "fst: fix docs in transducer impls",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-03-10T16:44:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a6e61c4119652e2117286578aead7d6d19da1be6",
"body": "This was fixed in aho-corasick 0.7.x, but I re-introduced it in my\nrefactoring. Essentially, stream searching and prefilters do not mix\nwell. I believe it's possible to do, but it requires a fair bit more\nsophistication to ensure that the results of a prefilter are correctly\nsynchronized with the current state of the Aho-Corasick automaton. If\nthey get out of sync, then \"resuming\" a search at a non-contiguous point\nin the stream will likely give incorrect results.",
"is_bot": false,
"headline": "stream: fix a bug in our stream handling",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-27T16:22:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e943403a922839c0b1f62fa0e96779c37fdb4681",
"body": null,
"is_bot": false,
"headline": "ci: add tests for 'std' and 'std,perf-literal'",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-27T16:22:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2df0983e7ef76bf50e6213fee35cda87af191292",
"body": "The packed prefilters determine their own pattern IDs, so when\nwe build prefilters, we should make sure that their pattern IDs\nare in sync with the pattern IDs for the Aho-Corasick automaton.",
"is_bot": false,
"headline": "prefilter: fix a prefilter bug",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-27T16:22:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee4c05e07ae2e12c9aea4763ec0e6426f358ff7f",
"body": "This lets us use \"weak dependency\" features. Namely, we permit folks to\nenable 'std' without necessarily bringing in 'memchr'. We also get to\navoid exposing features named 'memchr' and 'log'.",
"is_bot": false,
"headline": "msrv: bump to Rust 1.60",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-27T16:22:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d58908d7ee892193ebd3d7ff13b46812e06cf117",
"body": "This fixes typos and generally polishes things up. The biggest change\nhere is making 'Input' panic eagerly if the bounds given to it are\ninvalid for its haystack. I'm still not quite sure about doing things\nthis way, but it seems sensible. Otherwise, it's kind of just left up to\nthe search implementation to panic or not. Which may or may not happen\ndepending on whether the haystack is actually accessed.",
"is_bot": false,
"headline": "doc: polish",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-27T16:22:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "11db9750f447cf0085fa9dce11326bd705aa43fa",
"body": "While we don't currently utilize the safety property here, we might in\nthe future want to eliminate bounds checks (or other things) that depend\non the correctness of implementations of `Automaton`.\n\nSince I don't expect people to be implementing the `Automaton` trait\ncommonly, this doesn't seem like a big burden. And in general, the\nsafety property here is quite sensible. Any implementation of\n`Automaton` that wouldn't satisfy it is likely badly broken.",
"is_bot": false,
"headline": "api: make the 'Automaton' trait unsafe to implement",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-27T16:22:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04ded231f5cdcec12aeb0bf829fa324caccb689c",
"body": "We leave the code commented out and in the tree for now, but I think\nI'm going to either move it to a new crate ('fst-aho-corasick'\nperhaps?) or make it an optional feature on 'fst' itself.",
"is_bot": false,
"headline": "deps: drop 'fst' completely",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-27T16:22:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e7fa3b85dd3a3ce882896f1d4ee22b1f271f0b4",
"body": "It turns out that 4 byte needles can really make a difference in\nsome cases. In one particular case, 3 byte Teddy was being used on\nCyrillic text. The first 2 bytes of most needles corresponded to one\ncodepoint, while the last byte corresponding to the leading byte of\nthe next codepoint. But since m\n[…]\ncation routine because of a very high false\npositive rate.\n\nHaving the ability to use 4 bytes helps a lot here, because (at least\nin the case of Cyrillic text), it lets us capture two full codepoints.",
"is_bot": false,
"headline": "packed/teddy: add support for searching 4 byte needles",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-18T13:55:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ee6432c0a7a1c29c2db66bb514c0e8412978375f",
"body": "In some cases, Teddy can spend a lot of time in verification, and\nthis seems to slightly improve codegen leading to a small perf\nboost.",
"is_bot": false,
"headline": "packed/teddy: inline a loop",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-18T13:50:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3a949b34adc0ee2d32d7e771f53ea56e9e1cb7fe",
"body": "This seems to help in some cases where Teddy spends a lot of time\nin verification. This also matches what we do in 'memchr::memmem'.\nThe idea here is that we tend to search a lot of short needles,\nso when we use a slower 'zip' loop for everything less than 8\nbytes, we wind up doing the slower loop in most cases.",
"is_bot": false,
"headline": "packed: switch 'memcmp' to use 4 bytes",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-18T13:47:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f01480bcb4a988701fb03eb7ff7fdef7c934f0a7",
"body": "This makes it a bit clearer which packed searcher is being\nselected.",
"is_bot": false,
"headline": "packed: add some log messages",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-02-18T13:45:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e74ed25054d65aae4bd6d648e163c5635e0ce6ab",
"body": "Thanks @ahxxm for noticing this!\n\nSee: https://github.com/BurntSushi/aho-corasick/commit/28b679dc217aca49f92190867b7d88e574fd8e02#r95649653",
"is_bot": false,
"headline": "readme: change 2022 to 2023, derp",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-10T13:43:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "14b41aa00c68e0d8fe883a2d40465433fb8f5e25",
"body": "Since it's no longer part of the workspace (because of annoying MSRV\nissues), this setting is no longer inherited.",
"is_bot": false,
"headline": "aho-corasick-debug: set debug=true",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-10T13:41:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "28b679dc217aca49f92190867b7d88e574fd8e02",
"body": null,
"is_bot": false,
"headline": "readme: note that 1.0 isn't released yet",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T12:33:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6b6b6c4165cf5e2d3dc6b092356b9b383250dd0c",
"body": "PR #100",
"is_bot": false,
"headline": "msrv: set rust-version to 1.56.1",
"author_name": "Alex Touchet",
"author_login": "atouchet",
"committed_at": "2023-01-05T12:30:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf495271f48309654b0afeefa06516aa425f7fd0",
"body": "I dunno why builds are choking on not being able to find env_logger\n0.10.0 or bstr 1.0 and then not being able to do anything else. So for\nnow, just drop bstr (sigh) and kick aho-corasick-debug and bench out of\nthe workspace.",
"is_bot": false,
"headline": "msrv: drop bstr and kick aho-corasick-debug out of workspace",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e453f6062651f338ca3a7fb217f7590a2f89f9ab",
"body": "I'm not sure why this wasn't caught in the old API, as I think the same\nbug existed.",
"is_bot": false,
"headline": "fuzz: fix a bug caught by the fuzzer",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "730ecbd911fa1dd7fcfd36d9e4cd2e113bcf4514",
"body": "... and also clean up the code.",
"is_bot": false,
"headline": "fuzz: update the fuzzer to work with API changes",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f32d32e549f906c4f2910802ee4903d5d35f7fba",
"body": "This commit nearly wipes the slate clean with respect to the\nAho-Corasick implementations and rebuilds things from scratch. The main\nthing that motivated this was actually to make it possible for\nAho-Corasick automata to support both unanchored and anchored searches,\nwithout having to build two dist\n[…]\natterns is very small.\n\nOther than that, the central type of this crate remains 'AhoCorasick',\nand its most common use cases will work almost unchanged from\n'aho-corasick 0.7'.\n\nCloses #57, Closes #83",
"is_bot": false,
"headline": "api: rewrite most of the crate and give an API refresh",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5b9b090fdcef9882cff92ba7c65cbe6befe68ac9",
"body": "Now that we've greatly simplified leftmost NFA construction, we no\nlonger need to record the depth of a state. (We do still use it to\ndetermine whether to build a sparse or a dense state, though, that\ndoesn't require storing the depth.)",
"is_bot": false,
"headline": "impl: get rid of 'depth' on 'State'",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6210098131a611c58815b390d47a60da7c681c4a",
"body": null,
"is_bot": false,
"headline": "rust: move to the 2021 edition",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3b7afdf41e636cf02fc3bcd32360c268417ef34f",
"body": "Now that byte classes and premultiplication are no longer meaningfully\nconfigurable, we fix the benchmarks.",
"is_bot": false,
"headline": "bench: fix benchmarks",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac1fe99a47a7b13741596d4fd98bb72cd950cf58",
"body": "I probably could have removed this a long time ago, but I think it just\nslipped through the cracks. 0..=255 is much nicer.",
"is_bot": false,
"headline": "impl: remove 'AllBytesIter'",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c35edc7c53dda5b1297b1be2db525cade3525ed",
"body": "'slice::copy_within' was stabilized in Rust 1.37, which is now way under\nour MSRV.",
"is_bot": false,
"headline": "impl: remove 'unsafe' by using 'copy_within'",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3aa87d3a62508ecca6d36252cabbc5a6491972e8",
"body": "This gets rid of 'Premultiplied'. All that's left now is a DFA with\npremultiplied state IDs and equivalence classes.\n\nThis let's us also get rid of the 'Repr' vs 'DFA' split, since the\nformer was only used to represent the common bits between the different\ntypes of DFAs. But now that we only have one, everything can get\nflattened down.",
"is_bot": false,
"headline": "dfa: shrink down to a single variant",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15efdab0af1777a65e29ec1d8c7ced6764ea6c5a",
"body": "This was deprecated some time ago. We will always enable\npremultiplication.\n\nThe next step will be to always enable byte classes, albeit, with the\noption to still disable them so that transitions are easier to debug.\nNote though, than even when disabled, the byte class map will still be\nused such th\n[…]\nwell.\n\nEventually, we'll also remove the generic 'S: StateID' parameter as well\nand force the use of 'u32' everywhere. This makes every a lot more\nconcrete and strikes a good middle ground everywhere.",
"is_bot": false,
"headline": "api: remove 'premultiply' option",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "54da4b04dfb1550f545788b9e1815725c35c5899",
"body": "It turns out that we weren't using the \"leftmost with state\" code at\nall. I believe I had originally added this in an attempt to make the\nleftmost searching work with streams, but I wasn't able to tie it\ntogether and forgot to get rid of part of the aborted attempt.",
"is_bot": false,
"headline": "cleanup: remove some dead code",
"author_name": "Andrew Gallant",
"author_login": "BurntSushi",
"committed_at": "2023-01-05T04:15:58Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 61,
"commits_last_year": 7,
"latest_release_at": "2025-10-28T21:09:41Z",
"latest_release_tag": "1.1.4",
"releases_from_tags": true,
"days_since_last_push": 92,
"active_weeks_last_year": 4,
"days_since_latest_release": 267,
"mean_days_between_releases": 102.4
},
"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": "aho-corasick",
"exists": true,
"license": "Unlicense OR MIT",
"keywords": [
"text",
"search",
"string",
"multi",
"pattern",
"text-processing"
],
"ecosystem": "crates",
"matches_repo": true,
"registry_url": "https://crates.io/crates/aho-corasick",
"is_deprecated": false,
"latest_version": "1.1.4",
"repository_url": "https://github.com/BurntSushi/aho-corasick",
"versions_count": 62,
"total_downloads": 975017109,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 67322380,
"first_published_at": "2015-06-12T01:15:54.846782Z",
"latest_published_at": "2025-10-28T21:09:48.086878Z",
"latest_version_yanked": false,
"days_since_latest_publish": 267
}
]
},
"popularity": {
"forks": 116,
"stars": 1269,
"watchers": 15,
"fork_history": {
"days": [
{
"date": "2015-07-09",
"count": 1
},
{
"date": "2015-10-04",
"count": 1
},
{
"date": "2015-10-15",
"count": 1
},
{
"date": "2015-12-25",
"count": 1
},
{
"date": "2016-02-16",
"count": 2
},
{
"date": "2016-05-11",
"count": 1
},
{
"date": "2017-02-02",
"count": 1
},
{
"date": "2017-02-04",
"count": 1
},
{
"date": "2017-07-24",
"count": 1
},
{
"date": "2017-07-25",
"count": 1
},
{
"date": "2017-08-29",
"count": 1
},
{
"date": "2017-10-29",
"count": 1
},
{
"date": "2017-11-08",
"count": 1
},
{
"date": "2017-11-29",
"count": 1
},
{
"date": "2017-12-13",
"count": 1
},
{
"date": "2018-02-15",
"count": 1
},
{
"date": "2018-05-02",
"count": 1
},
{
"date": "2018-05-13",
"count": 2
},
{
"date": "2018-05-24",
"count": 1
},
{
"date": "2018-06-05",
"count": 1
},
{
"date": "2018-10-18",
"count": 1
},
{
"date": "2019-01-05",
"count": 1
},
{
"date": "2019-01-18",
"count": 1
},
{
"date": "2019-02-16",
"count": 1
},
{
"date": "2019-04-02",
"count": 1
},
{
"date": "2019-04-04",
"count": 1
},
{
"date": "2019-04-28",
"count": 1
},
{
"date": "2019-05-14",
"count": 1
},
{
"date": "2019-09-17",
"count": 1
},
{
"date": "2019-11-18",
"count": 1
},
{
"date": "2019-12-03",
"count": 1
},
{
"date": "2020-01-01",
"count": 1
},
{
"date": "2020-02-21",
"count": 1
},
{
"date": "2020-07-01",
"count": 1
},
{
"date": "2020-09-15",
"count": 1
},
{
"date": "2020-10-14",
"count": 1
},
{
"date": "2020-10-25",
"count": 1
},
{
"date": "2020-10-27",
"count": 1
},
{
"date": "2020-12-15",
"count": 1
},
{
"date": "2021-03-24",
"count": 1
},
{
"date": "2021-03-28",
"count": 2
},
{
"date": "2021-04-03",
"count": 1
},
{
"date": "2021-04-16",
"count": 1
},
{
"date": "2021-05-12",
"count": 1
},
{
"date": "2021-06-19",
"count": 1
},
{
"date": "2021-07-03",
"count": 1
},
{
"date": "2021-07-15",
"count": 1
},
{
"date": "2021-09-14",
"count": 1
},
{
"date": "2021-09-17",
"count": 1
},
{
"date": "2021-10-15",
"count": 1
},
{
"date": "2021-11-02",
"count": 1
},
{
"date": "2022-02-02",
"count": 1
},
{
"date": "2022-02-28",
"count": 1
},
{
"date": "2022-03-23",
"count": 1
},
{
"date": "2022-05-11",
"count": 1
},
{
"date": "2022-05-15",
"count": 1
},
{
"date": "2022-05-17",
"count": 1
},
{
"date": "2022-06-01",
"count": 1
},
{
"date": "2022-06-14",
"count": 1
},
{
"date": "2022-07-17",
"count": 1
},
{
"date": "2022-08-08",
"count": 1
},
{
"date": "2022-08-13",
"count": 1
},
{
"date": "2022-08-15",
"count": 1
},
{
"date": "2022-09-13",
"count": 1
},
{
"date": "2022-12-14",
"count": 1
},
{
"date": "2023-01-05",
"count": 1
},
{
"date": "2023-02-22",
"count": 1
},
{
"date": "2023-04-04",
"count": 1
},
{
"date": "2023-08-07",
"count": 1
},
{
"date": "2023-08-18",
"count": 1
},
{
"date": "2023-08-29",
"count": 1
},
{
"date": "2023-10-07",
"count": 1
},
{
"date": "2023-10-16",
"count": 1
},
{
"date": "2023-10-26",
"count": 1
},
{
"date": "2023-11-13",
"count": 1
},
{
"date": "2023-11-20",
"count": 1
},
{
"date": "2024-01-07",
"count": 1
},
{
"date": "2024-02-13",
"count": 1
},
{
"date": "2024-02-18",
"count": 1
},
{
"date": "2024-02-25",
"count": 1
},
{
"date": "2024-05-04",
"count": 1
},
{
"date": "2024-10-23",
"count": 1
},
{
"date": "2024-11-08",
"count": 1
},
{
"date": "2024-11-09",
"count": 1
},
{
"date": "2024-11-16",
"count": 1
},
{
"date": "2024-11-21",
"count": 1
},
{
"date": "2025-01-01",
"count": 1
},
{
"date": "2025-01-24",
"count": 1
},
{
"date": "2025-02-04",
"count": 1
},
{
"date": "2025-06-23",
"count": 1
},
{
"date": "2025-07-04",
"count": 1
},
{
"date": "2025-10-01",
"count": 1
},
{
"date": "2025-10-15",
"count": 1
},
{
"date": "2025-10-26",
"count": 1
},
{
"date": "2025-11-15",
"count": 1
},
{
"date": "2025-11-17",
"count": 1
},
{
"date": "2025-12-04",
"count": 1
},
{
"date": "2025-12-16",
"count": 1
},
{
"date": "2026-01-27",
"count": 1
},
{
"date": "2026-02-16",
"count": 1
},
{
"date": "2026-03-10",
"count": 1
},
{
"date": "2026-03-19",
"count": 1
},
{
"date": "2026-04-06",
"count": 1
},
{
"date": "2026-04-12",
"count": 1
},
{
"date": "2026-05-03",
"count": 1
},
{
"date": "2026-05-19",
"count": 1
},
{
"date": "2026-06-18",
"count": 1
},
{
"date": "2026-07-10",
"count": 1
}
],
"complete": true,
"collected": 111,
"total_forks": 116
},
"star_history": null,
"open_issues_and_prs": 16
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"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",
"aho-corasick-debug/Cargo.toml",
"benchmarks/engines/naive/Cargo.toml",
"benchmarks/engines/rust-aho-corasick/Cargo.toml",
"benchmarks/engines/rust-daachorse/Cargo.toml",
"benchmarks/engines/rust-jetscii/Cargo.toml",
"benchmarks/engines/rust-old-aho-corasick/Cargo.toml",
"benchmarks/shared/Cargo.toml",
"fuzz/Cargo.toml"
],
"largest_source_bytes": 107521,
"source_files_sampled": 40,
"oversized_source_files": 3,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"Cargo.toml",
"aho-corasick-debug/Cargo.toml",
"fuzz/Cargo.toml"
],
"advisories": {
"error": null,
"scope": "published_package",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 3,
"malicious_count": 0,
"assessed_package": "crates:aho-corasick@1.1.4",
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"crates"
],
"dependencies": [
{
"name": "log",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.4.17"
},
{
"name": "memchr",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2.4.0"
},
{
"name": "aho-corasick",
"manifest": "aho-corasick-debug/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "*"
},
{
"name": "anyhow",
"manifest": "aho-corasick-debug/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.0.68"
},
{
"name": "memmap2",
"manifest": "aho-corasick-debug/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.5.8"
},
{
"name": "env_logger",
"manifest": "aho-corasick-debug/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.9.3"
},
{
"name": "clap",
"manifest": "aho-corasick-debug/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2.34.0"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "aho-corasick",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "aho-corasick",
"direct": true,
"version": "1.0.5",
"ecosystem": "crates"
},
{
"name": "anyhow",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "anyhow",
"direct": true,
"version": "1.0.69",
"ecosystem": "crates"
},
{
"name": "anyhow",
"direct": true,
"version": "1.0.72",
"ecosystem": "crates"
},
{
"name": "anyhow",
"direct": true,
"version": "1.0.75",
"ecosystem": "crates"
},
{
"name": "clap",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "env_logger",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "env_logger",
"direct": true,
"version": "0.9.3",
"ecosystem": "crates"
},
{
"name": "log",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "log",
"direct": true,
"version": "0.4.20",
"ecosystem": "crates"
},
{
"name": "memchr",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "memchr",
"direct": true,
"version": "2.5.0",
"ecosystem": "crates"
},
{
"name": "memchr",
"direct": true,
"version": "2.6.3",
"ecosystem": "crates"
},
{
"name": "memmap2",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "atty",
"direct": false,
"version": "0.2.14",
"ecosystem": "crates"
},
{
"name": "bstr",
"direct": false,
"version": "1.6.0",
"ecosystem": "crates"
},
{
"name": "bstr",
"direct": false,
"version": "1.6.2",
"ecosystem": "crates"
},
{
"name": "daachorse",
"direct": false,
"version": "1.0.0",
"ecosystem": "crates"
},
{
"name": "doc-comment",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "hermit-abi",
"direct": false,
"version": "0.1.19",
"ecosystem": "crates"
},
{
"name": "humantime",
"direct": false,
"version": "2.1.0",
"ecosystem": "crates"
},
{
"name": "jetscii",
"direct": false,
"version": "0.5.3",
"ecosystem": "crates"
},
{
"name": "lexopt",
"direct": false,
"version": "0.3.0",
"ecosystem": "crates"
},
{
"name": "libc",
"direct": false,
"version": "0.2.148",
"ecosystem": "crates"
},
{
"name": "libfuzzer-sys",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "proc-macro2",
"direct": false,
"version": "1.0.66",
"ecosystem": "crates"
},
{
"name": "quote",
"direct": false,
"version": "1.0.33",
"ecosystem": "crates"
},
{
"name": "regex",
"direct": false,
"version": "1.9.5",
"ecosystem": "crates"
},
{
"name": "regex-automata",
"direct": false,
"version": "0.3.8",
"ecosystem": "crates"
},
{
"name": "regex-syntax",
"direct": false,
"version": "0.7.5",
"ecosystem": "crates"
},
{
"name": "serde",
"direct": false,
"version": "1.0.152",
"ecosystem": "crates"
},
{
"name": "serde",
"direct": false,
"version": "1.0.177",
"ecosystem": "crates"
},
{
"name": "serde",
"direct": false,
"version": "1.0.178",
"ecosystem": "crates"
},
{
"name": "serde",
"direct": false,
"version": "1.0.188",
"ecosystem": "crates"
},
{
"name": "serde_derive",
"direct": false,
"version": "1.0.188",
"ecosystem": "crates"
},
{
"name": "syn",
"direct": false,
"version": "2.0.31",
"ecosystem": "crates"
},
{
"name": "termcolor",
"direct": false,
"version": "1.2.0",
"ecosystem": "crates"
},
{
"name": "unicode-ident",
"direct": false,
"version": "1.0.11",
"ecosystem": "crates"
},
{
"name": "winapi",
"direct": false,
"version": "0.3.9",
"ecosystem": "crates"
},
{
"name": "winapi-i686-pc-windows-gnu",
"direct": false,
"version": "0.4.0",
"ecosystem": "crates"
},
{
"name": "winapi-util",
"direct": false,
"version": "0.1.5",
"ecosystem": "crates"
},
{
"name": "winapi-x86_64-pc-windows-gnu",
"direct": false,
"version": "0.4.0",
"ecosystem": "crates"
}
],
"collected": true,
"truncated": false,
"total_count": 43,
"direct_count": 15,
"indirect_count": 28
}
},
"maintainership": {
"issues": {
"open_prs": 9,
"merged_prs": 63,
"open_issues": 7,
"closed_ratio": 0.914,
"closed_issues": 74,
"closed_unmerged_prs": 13
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "BurntSushi",
"commits": 242,
"avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4"
},
{
"type": "User",
"login": "andrew-d",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/1079173?v=4"
},
{
"type": "User",
"login": "Marwes",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/957312?v=4"
},
{
"type": "User",
"login": "atouchet",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/26315797?v=4"
},
{
"type": "User",
"login": "GuillaumeGomez",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/3050060?v=4"
},
{
"type": "User",
"login": "jneem",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/1448113?v=4"
},
{
"type": "User",
"login": "ruuda",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/506953?v=4"
},
{
"type": "User",
"login": "Ten0",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/9094255?v=4"
},
{
"type": "User",
"login": "adetaylor",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/145740?v=4"
},
{
"type": "User",
"login": "allaboutevemirolive",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/112833599?v=4"
}
],
"contributors_sampled": 31,
"top_contributor_share": 0.837
},
"quality_signals": {
"has_ci": true,
"has_tests": false,
"ci_workflows": [
"ci.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"Cargo.lock"
],
"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": 3,
"reason": "3 out of 9 merged PRs checked by a CI test -- score normalized to 3",
"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": 1,
"reason": "Found 4/26 approved changesets -- score normalized to 1",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 6 contributing companies or organizations",
"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": 10,
"reason": "project is 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": 1,
"reason": "0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 10,
"reason": "all dependencies are pinned",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"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": 10,
"reason": "GitHub workflow tokens follow principle of least privilege",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 7,
"reason": "3 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "c82178696b9ddc18b56c3c74853529e7926ff329",
"ran_at": "2026-07-22T23:51:51Z",
"aggregate_score": 5.9,
"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-22T01:39:02Z",
"oldest_open_prs": [
{
"number": 148,
"created_at": "2024-10-23T17:12:34Z",
"last_comment_at": "2024-12-01T22:48:20Z",
"last_comment_author": "hirehamir"
},
{
"number": 153,
"created_at": "2025-02-05T09:24:10Z",
"last_comment_at": "2025-02-17T07:31:58Z",
"last_comment_author": "bobozaur"
},
{
"number": 167,
"created_at": "2026-02-16T07:10:40Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 172,
"created_at": "2026-05-03T13:58:57Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 174,
"created_at": "2026-05-19T20:51:14Z",
"last_comment_at": "2026-07-08T15:18:05Z",
"last_comment_author": "xtqqczze"
},
{
"number": 177,
"created_at": "2026-07-10T15:24:25Z",
"last_comment_at": "2026-07-10T22:14:35Z",
"last_comment_author": "BurntSushi"
},
{
"number": 178,
"created_at": "2026-07-11T08:34:01Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 179,
"created_at": "2026-07-11T08:46:02Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 180,
"created_at": "2026-07-11T09:06:53Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-04-21T20:54:15Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 137,
"created_at": "2023-12-06T12:25:45Z",
"last_comment_at": "2023-12-06T12:41:45Z",
"last_comment_author": "BurntSushi"
},
{
"number": 138,
"created_at": "2023-12-26T10:25:06Z",
"last_comment_at": "2026-02-22T22:59:17Z",
"last_comment_author": "hsqStephenZhang"
},
{
"number": 140,
"created_at": "2024-03-25T12:09:35Z",
"last_comment_at": "2024-03-25T14:03:01Z",
"last_comment_author": "BurntSushi"
},
{
"number": 146,
"created_at": "2024-10-15T03:24:22Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 173,
"created_at": "2026-05-04T08:06:19Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 175,
"created_at": "2026-06-03T09:19:32Z",
"last_comment_at": "2026-06-03T12:06:02Z",
"last_comment_author": "BurntSushi"
},
{
"number": 176,
"created_at": "2026-06-03T09:31:12Z",
"last_comment_at": "2026-06-03T12:04:23Z",
"last_comment_author": "BurntSushi"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/BurntSushi/aho-corasick",
"host": "github.com",
"name": "aho-corasick",
"owner": "BurntSushi"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"security": 68,
"vitality": 36,
"community": 72,
"governance": 67,
"engineering": 38
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 36,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "critical",
"name": "Development activity",
"note": null,
"notes": [],
"value": 22,
"inputs": {
"commits_last_year": 7,
"human_commit_share": 0.99,
"days_since_last_push": 92,
"active_weeks_last_year": 4
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 92 days ago",
"points": 9.9,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 92
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "4/52 weeks with commits",
"points": 2.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 4
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "7 commits in the last year",
"points": 8.1,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 7
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1",
"points": 1,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "moderate",
"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": 58,
"inputs": {
"releases_count": 61,
"latest_release_tag": "1.1.4",
"releases_from_tags": true,
"days_since_latest_release": 267,
"mean_days_between_releases": 102.4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "61 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 61
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 267 days ago",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "release_recency",
"params": {
"days": 267
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~102.4 days",
"points": 19.8,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 102.4
}
}
],
"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": 92,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 92 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 92
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "good",
"name": "Community & Adoption",
"value": 72,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "good",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 74,
"inputs": {
"forks": 116,
"stars": 1269,
"watchers": 15,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1,269 stars",
"points": 50.3,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 1269
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "116 forks",
"points": 17.2,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 116
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "15 watchers",
"points": 6.4,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 15
}
}
],
"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 (Unlicense)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Unlicense"
}
}
],
"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": "excellent",
"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": 100,
"inputs": {
"packages": [
"aho-corasick"
],
"dependents": null,
"ecosystems": "crates",
"total_downloads": 975017109,
"monthly_downloads": 67322380
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "67,322,380 downloads/month across crates",
"points": 80,
"status": "met",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 67322380,
"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": "moderate",
"name": "Sustainability & Governance",
"value": 67,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 36,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 31,
"top_contributor_share": 0.837
},
"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 84% of commits",
"points": 3.7,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 84
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "31 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 31
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 6 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"merged_prs": 63,
"open_issues": 7,
"closed_issues": 74,
"issue_closed_ratio": 0.914,
"closed_unmerged_prs": 13
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "91% of issues closed",
"points": 42.7,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 91
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "63/76 decided PRs merged",
"points": 31.7,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 63,
"decided": 76
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 4/26 approved changesets -- score normalized to 1",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "good",
"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": 75,
"inputs": {
"followers": 12664,
"owner_type": "User",
"is_verified": null,
"owner_login": "BurntSushi",
"public_repos": 182,
"account_age_days": 5747
},
"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": "12,664 followers of BurntSushi",
"points": 25,
"status": "met",
"details": [
{
"code": "owner_followers",
"params": {
"count": 12664,
"login": "BurntSushi"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "182 public repos, account ~15 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 182
}
},
{
"code": "account_age_years",
"params": {
"years": 15
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 91,
"inputs": {
"packages": [
"aho-corasick"
],
"ecosystems": "crates",
"any_deprecated": false,
"min_days_since_publish": 267
},
"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 267 days ago",
"points": 26,
"status": "partial",
"details": [
{
"code": "publish_recency",
"params": {
"days": 267
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "62 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 62
}
}
],
"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": 38,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": null,
"notes": [],
"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": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"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": "3 out of 9 merged PRs checked by a CI test -- score normalized to 3",
"points": 6,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"topics": [
"aho-corasick",
"substring-matching",
"finite-state-machine",
"text-processing",
"search"
],
"has_wiki": false,
"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": "5 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 5
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 68,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 5.9
},
"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": "3 out of 9 merged PRs checked by a CI test -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"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 4/26 approved changesets -- score normalized to 1",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 6 contributing companies or organizations",
"points": 2.5,
"status": "met",
"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 fuzzed",
"points": 5,
"status": "met",
"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": "0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "all dependencies are pinned",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"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": "GitHub workflow tokens follow principle of least privilege",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "3 existing vulnerabilities detected",
"points": 5.2,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the crates:aho-corasick@1.1.4 runtime dependency closure — what installing the published package pulls in — 3 packages. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_published",
"params": {
"package": "crates:aho-corasick@1.1.4",
"assessed": 3
}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 3,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "no indirect dependency carries a known advisory",
"points": 25,
"status": "met",
"details": [
{
"code": "no_indirect_advisories",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 3,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"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": 13
},
"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": "moderate",
"name": "AI Readiness",
"value": 56,
"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.899,
"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": "89 of 99 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 89,
"sampled": 99
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 52,
"inputs": {
"has_nix": false,
"has_tests": false,
"lockfiles": [
"Cargo.lock"
],
"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",
"aho-corasick-debug/Cargo.toml",
"benchmarks/engines/naive/Cargo.toml",
"benchmarks/engines/rust-aho-corasick/Cargo.toml",
"benchmarks/engines/rust-daachorse/Cargo.toml",
"benchmarks/engines/rust-jetscii/Cargo.toml",
"benchmarks/engines/rust-old-aho-corasick/Cargo.toml",
"benchmarks/shared/Cargo.toml",
"fuzz/Cargo.toml"
],
"dependency_bot_commit_share": 0.01
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Cargo.toml, aho-corasick-debug/Cargo.toml, benchmarks/engines/naive/Cargo.toml (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "Cargo.toml, aho-corasick-debug/Cargo.toml, benchmarks/engines/naive/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": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"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": "1 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 1,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "all dependencies are pinned",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 96,
"inputs": {
"primary_language": "Rust",
"largest_source_bytes": 107521,
"source_files_sampled": 40,
"oversized_source_files": 3
},
"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": "3/40 source files over 60KB",
"points": 50.9,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 40,
"oversized": 3
}
}
],
"max_points": 55
}
]
}
],
"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",
"Could not fetch crates package 'aho-corasick-debug' from its registry"
],
"report_type": "repository",
"generated_at": "2026-07-22T23:52:12.731432Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/BurntSushi/aho-corasick.svg",
"full_name": "BurntSushi/aho-corasick",
"license_state": "standard",
"license_spdx": "Unlicense"
}