JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"openpgp",
"gpg",
"crypto",
"decrypt",
"encrypt",
"security",
"security-tools",
"signature-verification",
"digital-signature",
"rust",
"signature",
"cpp"
],
"is_fork": false,
"size_kb": 18037,
"has_wiki": false,
"homepage": "https://gpgfrontend.bktus.com",
"languages": {
"C": 49714,
"C++": 3244524,
"Rust": 386291,
"CMake": 283616,
"Shell": 35256,
"Python": 25921,
"Dockerfile": 946,
"Objective-C++": 2363
},
"pushed_at": "2026-07-21T20:25:55Z",
"created_at": "2021-06-19T11:31:35Z",
"owner_type": "User",
"updated_at": "2026-07-21T20:26:24Z",
"description": "A modern, cross-platform OpenPGP tool with a unique dual-engine core: switch freely between the battle-tested GnuPG and a modern, memory-safe Rust rPGP backend. It makes encryption, signing, and key management easier and more trustworthy in everyday privacy workflows.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "GPL-3.0",
"default_branch": "main",
"license_spdx_raw": "GPL-3.0",
"primary_language": "C++",
"significant_languages": [
"C++"
]
},
"owner": {
"blog": "https://blog.bktus.com",
"name": "Saturn&Eric",
"type": "User",
"login": "saturneric",
"company": null,
"location": "BW, Deutschland",
"followers": 46,
"avatar_url": "https://avatars.githubusercontent.com/u/20257134?v=4",
"created_at": "2016-07-02T14:38:10Z",
"is_verified": null,
"public_repos": 18,
"account_age_days": 3671
},
"license": {
"state": "standard",
"spdx_id": "GPL-3.0",
"raw_spdx": "GPL-3.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "nightly",
"kind": "other",
"published_at": "2026-07-20T21:43:02Z"
},
{
"tag": "v2.2.1",
"kind": "patch",
"published_at": "2026-06-29T20:21:50Z"
},
{
"tag": "v2.1.12",
"kind": "patch",
"published_at": "2026-05-25T16:52:28Z"
},
{
"tag": "v2.2.0-beta.1",
"kind": "prerelease",
"published_at": "2026-05-09T22:53:21Z"
},
{
"tag": "v2.1.11",
"kind": "patch",
"published_at": "2026-04-10T16:02:12Z"
},
{
"tag": "v2.1.10",
"kind": "patch",
"published_at": "2025-10-25T16:01:00Z"
},
{
"tag": "v2.1.9",
"kind": "patch",
"published_at": "2025-06-19T01:38:40Z"
},
{
"tag": "v2.1.8",
"kind": "patch",
"published_at": "2025-04-19T04:07:55Z"
},
{
"tag": "v2.1.7",
"kind": "patch",
"published_at": "2025-02-04T16:27:13Z"
},
{
"tag": "v2.1.6",
"kind": "patch",
"published_at": "2024-12-03T14:22:34Z"
},
{
"tag": "v2.1.5",
"kind": "patch",
"published_at": "2024-10-04T05:48:00Z"
},
{
"tag": "v2.1.4",
"kind": "patch",
"published_at": "2024-08-05T18:11:17Z"
},
{
"tag": "v2.1.3",
"kind": "patch",
"published_at": "2024-07-27T09:05:06Z"
},
{
"tag": "v2.1.2",
"kind": "patch",
"published_at": "2024-02-01T15:49:39Z"
},
{
"tag": "v2.1.1",
"kind": "patch",
"published_at": "2023-09-19T03:31:26Z"
},
{
"tag": "v2.1.0",
"kind": "minor",
"published_at": "2023-04-01T13:11:23Z"
},
{
"tag": "v2.0.10",
"kind": "patch",
"published_at": "2023-01-05T18:40:21Z"
},
{
"tag": "v2.0.9",
"kind": "patch",
"published_at": "2022-07-23T15:50:23Z"
},
{
"tag": "v2.0.8",
"kind": "patch",
"published_at": "2022-05-13T19:32:08Z"
},
{
"tag": "v2.0.7",
"kind": "patch",
"published_at": "2022-05-09T17:14:03Z"
},
{
"tag": "v2.0.6",
"kind": "patch",
"published_at": "2022-05-08T13:37:49Z"
},
{
"tag": "v2.0.5",
"kind": "patch",
"published_at": "2022-03-19T17:50:13Z"
},
{
"tag": "v2.0.4",
"kind": "patch",
"published_at": "2022-01-05T22:34:17Z"
},
{
"tag": "v2.0.3",
"kind": "patch",
"published_at": "2021-12-17T08:15:18Z"
},
{
"tag": "v2.0.2",
"kind": "patch",
"published_at": "2021-12-13T19:16:44Z"
},
{
"tag": "v2.0.1",
"kind": "patch",
"published_at": "2021-12-08T17:26:22Z"
},
{
"tag": "v1.2.2",
"kind": "patch",
"published_at": "2021-07-19T20:38:13Z"
},
{
"tag": "v1.2.1",
"kind": "patch",
"published_at": "2021-07-16T11:15:26Z"
},
{
"tag": "v1.1.3",
"kind": "patch",
"published_at": "2021-07-12T09:54:06Z"
},
{
"tag": "v1.1.1",
"kind": "patch",
"published_at": "2021-07-06T16:47:45Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2021-07-05T02:08:34Z"
},
{
"tag": "v1.0.8",
"kind": "patch",
"published_at": "2021-07-01T18:47:22Z"
},
{
"tag": "v1.0.7",
"kind": "patch",
"published_at": "2021-06-26T22:02:51Z"
},
{
"tag": "v1.0.6",
"kind": "patch",
"published_at": "2021-06-26T00:53:54Z"
},
{
"tag": "v1.0.5",
"kind": "patch",
"published_at": "2021-06-24T16:01:54Z"
},
{
"tag": "v1.0.4",
"kind": "patch",
"published_at": "2021-06-23T10:25:34Z"
},
{
"tag": "v1.0.3",
"kind": "patch",
"published_at": "2021-06-22T15:04:32Z"
},
{
"tag": "v1.0.2",
"kind": "patch",
"published_at": "2021-06-21T13:04:47Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2021-06-19T12:16:54Z"
}
],
"recent_commits": [
{
"oid": "314582b330c8974a5b85aaae7ec7182664de717e",
"body": "- add WrappedFileOpensThroughTheLoadersOwnPath to guard derivation mismatch bug\n- add SealAndUnsealAgreeForBothSecretKinds to verify pin/wrap/plain flows\n- add GpgCoreTestSignatureModel.cpp covering default verify result behavior\n- include tests for signature accessors, validity, status, and copied defaults",
"is_bot": false,
"headline": "test(core): add signature model and key wrap tests",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T20:13:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3d1fe8cb8794f2f086960de6d3e4a1467de60b5f",
"body": "- add SealKey and UnsealKey helpers to centralize derivation choices\n- replace direct GFBufferFactory Encrypt/Decrypt calls with helpers\n- change new_legacy_key to accept pin and wrap, use SealKey for storage\n- update legacy init to UnsealKey(pin, wrap, stored) and handle errors\n- adjust GpgFrontend comment and invert secure_level branch logic\n- document PIN vs store secret derivations and rationale",
"is_bot": false,
"headline": "refactor(appsecurekey): unify seal/unseal helpers",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T20:12:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d2c8443e1f9b62fbaa714215feddb5b7fafc11a",
"body": "- add category_item_size_hint() to compute per-row size hints\n- add apply_category_item_metrics() to apply size to all rows\n- call apply_category_item_metrics() after stylesheet updates\n- setSizeHint when creating category items to keep rows correct\n- handle compact rail vs text list sizing using font metrics",
"is_bot": false,
"headline": "fix(keylist): ensure consistent category item sizing",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T20:11:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c7444bfd12b889f0a1d2f8ea586d24bef88e2710",
"body": "- implement MapRandomBytesToAlphanum() performing rejection sampling\n- add rejection threshold and static_asserts for correctness\n- add DrawRandomBytes() with Qt fallback for short/missing entropy\n- rewrite PassphraseGenerator::Generate() to top up via rounds\n- add comprehensive unit tests for mapping and generator behavior\n- improve header docs and formatting; fallback messaging updated",
"is_bot": false,
"headline": "feat(passphrase): unbiased byte->alphanum mapping",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:58:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "62cbf2d7ba8e29b03a6ff587402631f94ddae324",
"body": "- implement RemoveDataObj to remove backing file for a logical key\n- return true if object absent, false on I/O failure and log error\n- add header declaration and docs explaining on-disk removal need\n- add tests rejecting non-hex and wrong-length refs\n- add test for corrupted embedded non-hex nibble rejection\n- add test that secure object ref round-trips successfully",
"is_bot": false,
"headline": "feat(dataobject): add RemoveDataObj to delete stored object",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:56:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "87fa5911dbcdbc7a74a7a6870d39af00131aae51",
"body": "- remove durable cache entry from in-memory storage and return result\n- erase cache key from registry to avoid being reloaded on startup\n- remove encrypted backing data object from disk via opera_.RemoveDataObj\n- set durable_cache_modified_ and flush storage to persist changes\n- reason: slot_flush_c\n[…]\nstorage skips empty values so disk copy survived\n- add unit tests verifying disk, registry, memory clearing and missing key\n- include DataObjectOperator header and test helpers to inspect disk objects",
"is_bot": false,
"headline": "fix(cache): fully clear durable cache on reset",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:55:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3fcc6170562a83f7685fe8976dd990c9c6836ead",
"body": "- implement copy-on-write using std::shared_ptr and detach() before writes\n- switch constructors to SecureCreateUniqueObject for fresh allocations\n- Data() now detaches before returning writable pointer; cloned_impl added\n- Resize/Append/Combine build into fresh storage to avoid self-overlap\n- Appen\n[…]\nignores null/<=0 and merges safely instead of resize\n- Zeroize documented to wipe through all shares and not detach first\n- add unit tests for self-append, copy independence, resize/append and zeroize",
"is_bot": false,
"headline": "fix(gfbuffer): add copy-on-write semantics",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:52:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "706e76e20bef4e8c082f8de645f1becfa58dc3d2",
"body": "* Added checks for null `signature_ref_` in `GpgSignature` methods to prevent\n dereferencing null pointers.\n* Updated `GetSignature` in `GpgVerifyResult` to return an empty\n container when `result_ref_` is null, ensuring safe access.",
"is_bot": false,
"headline": "fix(GpgSignature, GpgVerifyResult): handle null signature references",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:25:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b4d7e4b8caa1ad5d53ec88bc87fef66f4e665069",
"body": "* Update reference validation to check for valid hex format\n* Ensures that only properly formatted references are processed",
"is_bot": false,
"headline": "fix(DataObjectOperator): validate reference hex format",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:25:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0b4468874dcef2eef4250113f771b9c43fb1924f",
"body": "* Corrected a syntax error by adding a semicolon\n at the end of the return statement in the\n HasRustSupport function.",
"is_bot": false,
"headline": "fix(BuildInfoUtils): add missing semicolon in HasRustSupport",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:24:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "347de800781674573b368c6b0a44528643a947da",
"body": "* Rename `lib` to `kLib` for consistency with naming conventions\n* Rename `available` to `kAvailable` to improve readability",
"is_bot": false,
"headline": "refactor(LinuxSecretStore): rename variables for clarity",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:17:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0b31ec1ad90fb30655dfcbd4b80e324f49d30f0e",
"body": "- add SystemSecretStore interface, registration and probe helpers\n- add platform backends: macOS Keychain, Windows Credential Manager\n- add Linux libsecret backend and a cross-platform stub\n- provide InstallPlatformSecretStore platform entry point\n- implement AppSecureKeyManager::ResolveWrapSecret a\n[…]\nure\n- update CMake to include platform sources and frameworks/libs\n- add UI control, tooltips and opt-in probing in Advanced settings\n- add extensive unit tests for wrap state machine and live backend",
"is_bot": false,
"headline": "feat(security): wrap app key with system keychain",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T19:08:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "01f0619260935eefac52a991ac1b8ce49be24c67",
"body": "- move app secure-key logic from Security.{h,cpp} into AppSecureKeyManager\n- introduce AppSecureKeyManager API: Initialize, GetKey, GetActiveKey, ids\n- remove Security.h/cpp and migrate legacy and rotating-key behavior\n- report init failures in UI via ReportAppSecureKeyFailure at startup\n- update Da\n[…]\nemory key store responsibilities from GlobalSettingStation\n- add AESCryptoHelper::IsEncryptedBuffer and DeriveKeyArgon2 helpers\n- add unit tests for AppSecureKeyManager and Argon2/key container checks",
"is_bot": false,
"headline": "refactor(core): extract app secure key management",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T18:28:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2c718d3bc49a9500da323a29e75eb9f59d36cd37",
"body": "* Clear tab order for empty input to avoid residue from previous runs\n* Update documentation to reflect behavior change for empty orders\n* Enhance tests to verify clearing functionality persists across reloads",
"is_bot": false,
"headline": "refactor(KeyCategoryRepository): improve tab order handling",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T17:51:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3341fbf6f0258a95b31a967dfa1b4baa72fe9420",
"body": "- implement constexpr Base58 reverse table and IsBase58Char for O(1)\n- add Normalize pre-filter rejecting non-Base58 or overlong inputs\n- introduce kMaxTokenChars, kMaxWireBytes, kMaxPayloadBytes and asserts\n- have Encode/Decode check payload and wire sizes and log on failure\n- expose MaxPayloadByte\n[…]\n\n- add exec_im_decode_helper and exec_im_encode_helper (off GUI thread)\n- add confirm_default_im_book prompt and integrate in encrypt flow\n- run IM encode/decode via RunOperaAsync to avoid blocking UI",
"is_bot": false,
"headline": "feat(im): add Base58 prefilter and payload limits",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T17:49:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2cc02485c8d0f42e7ba84aa9ffffc09b47bde96",
"body": "- use std::string_view for Base58 alphabet and speed up lookup\n- add headers <algorithm> and <string_view> for utilities\n- add randomized padding fraction constants (30%–50%)\n- implement SnapFrameBytes ladder and classic frame rungs\n- pad content then snap total wire size before Base58 encode\n- remove kBucket and RoundUp; jitter folded into padding\n- clarify comments about padding, ladder and token length leak\n- add tests: PaddingIsAtLeastThirtyPercent and ladder quantization",
"is_bot": false,
"headline": "feat(im): add padding and length snapping",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-21T16:20:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f5e806d8340d561d87b16bb91ed98150267dcbde",
"body": "- store the message-book phrase in the encrypted durable cache\n- migrate any legacy plaintext settings key on first read and erase it\n- derive 256-bit seed with Argon2id; build book with ChaCha20 Fisher-Yates\n- ship a pinned default seed and bump IM format version to 3\n- add APIs: BookPhrase, SetBoo\n[…]\nultiline editor, reveal/copy/paste/generate actions\n- debounce and compute fingerprints off the UI thread in a background task\n- add tests for storage, default book, generation, migration, and preview",
"is_bot": false,
"headline": "feat(im): secure message book phrase storage",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T21:21:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "50b42bd1f6d28edf1f11ff0eb1c1d435e1ff7266",
"body": "- remove .ui and generated Ui class; build dialog widgets in code\n- add validity presets combo box and custom/never options\n- introduce chosen_date_time_ and non_expired_ as single source of truth\n- add humanize_remaining, FormatDateTime, SubdueLabel helpers\n- enforce minimum validity and display co\n[…]\nn toggling \"Never Expires\"\n- handle subkey vs primary key expiration separately\n- rework layout, summary label, and enabled/validation logic\n- keep SetExpire call and preserve success/failure behavior",
"is_bot": false,
"headline": "refactor(expire_dialog): replace UI file with programmatic widgets",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T21:16:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "45434fc1fa111ca1b36b628ed8621250ade16cd5",
"body": "- add ConfirmShortUserIdName to warn on names shorter than five chars\n- trim name/comment/email inputs and reject empty names early\n- forbid '(', ')', '<', '>' and control chars in name/comment\n- anchor email regex so whole string must match an address\n- update key generation, smartcard and UID dialogs to use checks\n- add unit tests for user-id assembly and email validation\n- improve log messages and adjust lambda capture formatting",
"is_bot": false,
"headline": "feat(uid): add short-name confirmation, stricter UID checks",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:58:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4d1755bd8a5ffab37401a2b8deb266a36da1c593",
"body": "- implement BookFingerprint() producing 4-4 hex id from SHA-256\n- add header doc and warn not to expose on the wire\n- add unit test verifying format, stability, uniqueness\n- display fingerprint in IM card when a phrase is set",
"is_bot": false,
"headline": "feat(instantmessage): add book fingerprint",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:58:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "63aaf8e8551e0db534c744193274710867a786ba",
"body": "- implement instant-messaging encrypt-and-sign flow in UI and logic\n- add exec_im_encrypt_helper to handle encrypt vs encrypt+sign\n- add slot_im_encrypt_sign_message and im_encrypt_sign_act_ action\n- update menus, toolbar, and action enable/disable logic\n- adapt GpgOperaHelper to build encrypt+sign operas and status text\n- add unit test InstantMessageEncryptSignDecryptVerify for token flow\n- include InstantMessageOperator header and wrap a long comment line",
"is_bot": false,
"headline": "feat(im): add instant-messaging encrypt-and-sign action",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:52:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c251f6c4f5a636bbb36c70d79ccae0509a7549d",
"body": "* Introduced named constants for tab titles to improve clarity.\n* Updated connections to use these constants for better maintainability.\n* Ensured that the restart confirmation dialog accurately reflects which tabs require a restart.",
"is_bot": false,
"headline": "feat(settings): enhance tab titles for restart confirmation",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:45:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2906965bfb5484d2d414cd86d2b7f38347fdf9a1",
"body": "- add tests for layered resolution: ENV > user > fallback\n- verify false and zero are treated as explicit values\n- ensure empty ENV string still overrides other layers\n- test INI string conversions for booleans and integers\n- check EarlySettings uses same file and sees singleton writes\n- add coverage to prevent regressions in settings handling",
"is_bot": false,
"headline": "test(core): add settings layering unit tests",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:44:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15163c3d2a35ee9b52d60422de7f97fcfd4ab39f",
"body": "- add InstantMessageOperator::BookConfigured() to report phrase set\n- show book status in a new BuildInstantMessageCard() UI card\n- use the card in encrypt/decrypt flows and warn when default book\n- add unit test for blank, whitespace, and set phrases\n- minor whitespace/formatting tweaks in core files",
"is_bot": false,
"headline": "feat(im): indicate if shared book phrase is set",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:43:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3db4f25d836522ff5ea2527dec0e2a5b8286cd36",
"body": "- add GetEarlySettings to open QSettings before InitAppSecureKey\n- implement ResolvePortableDataPath to compute portable data dir\n- add ResolveAppImageDir (Linux) to support AppImage portable mode\n- use ResolveAppImageDir in Impl to set app_path_ for AppImage builds\n- GetEarlySettings returns INI in portable mode or platform default\n- add header docs describing constraints and intended use",
"is_bot": false,
"headline": "feat(settings): add GetEarlySettings for early startup",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:42:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "682fd98b6f1209d8de6077fb7cb09ba19cde45c4",
"body": "- implement ResolveLayeredValue in CommonUtils.cpp to select a value\n- add declaration and detailed doc comment in CommonUtils.h\n- treat invalid QVariant as \"no value\" so a missing layer falls through\n- precedence: ENV.ini override, then user value, then built-in default",
"is_bot": false,
"headline": "feat(utils): add ResolveLayeredValue helper",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:40:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2c65f04c54bcb6db1dfd43f4dbd40d8479ec91a5",
"body": "- add AdvancedTab UI (SettingsAdvanced.{h,cpp}) for startup knobs\n- wire tab into SettingsDialog and hook apply/accept/notifications\n- layered settings resolution in GpgFrontendContext (ENV, user, def)\n- ENV.ini now acts as deployment override and records locked keys\n- resolve() consults GetEarlySet\n[…]\nnobs\n- default GFLogLevel to kCRITICAL to avoid accidental debug logging\n- AdvancedTab disables controls pinned by ENV.ini and shows notice\n- startup log now annotates which keys are pinned by ENV.ini",
"is_bot": false,
"headline": "feat(settings): add advanced settings tab",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:39:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "feaeacab70d2725ad0e8624a17fb28bdde5d1862",
"body": "- implement StatusIndicatorToolTip(...) with meaning and legend\n- use StatusIndicatorToolTip for the indicator tooltip instead of title\n- scope stylesheet to QLabel#statusIndicatorLabel to avoid repainting\n- render idle indicator with fixed grey color so it reads as off\n- add StatusIndicatorToolTip declaration to header",
"is_bot": false,
"headline": "feat(info_board): add status indicator tooltip",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T20:36:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "95daf8cf83eb084bb1a5430fc7f8eba9bdba0197",
"body": "- add Generate button in Message Book settings to create 48-char CSPRNG\n- integrate PassphraseGenerator and wire button to fill the phrase field\n- place phrase edit and generate button in a single row; update note\n- let IM encrypt fall back to symmetric passphrase when no keys\n- create contexts earlier, validate, and simplify encryption flow\n- enable im_encrypt menu only for text tabs and when encrypt is enabled",
"is_bot": false,
"headline": "feat(im): add passphrase generator to message book",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T19:03:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7f6c784ebde0da309d096fd3bfd62425a85d1c04",
"body": "- implement new whitened IM token format v2 using per-message seed\n- derive per-message master via Argon2id (memory-hard KDF) from book\n- produce keystream + permutation, XOR inner frame and permute bytes\n- inner frame: tag(16)|version(1)|type(1)|len(u32)|payload|pad\n- secret tag and padding hide ma\n[…]\nop PFS paths, session store, related UI signing-key controls\n- simplify MainWindow IM flow to un-whiten then hand inner PGP to GPG\n- update tests to reflect whitening, padding, and wrong-book behavior",
"is_bot": false,
"headline": "feat(im): whiten instant-message tokens (book-based)",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-20T18:46:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "930fb8e8110e64d27da5f3c8a3bf20c6dd7a117b",
"body": "- make Identity and Message Book QGroupBox instances members\n- add update_fs_dependent_state to enable/disable those groups\n- connect forward_secrecy_check_ toggled to call the updater\n- initialize group states in SetSettings so UI reflects settings\n- add QGroupBox forward declaration and member comments for clarity",
"is_bot": false,
"headline": "feat(im): enable identity and book groups when PFS enabled",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T21:25:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf14bd4fa8d836725ae92b047f02bcd6ced33a1f",
"body": "- stop tabs from forcing dialog width; show scroll buttons\n- never elide tab labels; use scroll buttons when needed\n- wrap pages in QScrollArea so content scrolls when narrowed\n- add add_tab lambda to centralize adding scroll areas\n- set scroll areas widget resizable and frameless\n- replace direct addTab calls across tabs, keep sandbox check",
"is_bot": false,
"headline": "refactor(dialog): stop tabs forcing dialog width",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T21:22:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1da534381cc9f7a1e1df0717fa212f22ac85caa5",
"body": "- implement DoubleRatchet (X25519 DH, chain/root KDFs, AEAD)\n- add X25519 wrapper for raw Curve25519 operations and keypair gen\n- implement X3DH-style ImHandshake and ImContactBundle formats\n- add ImSessionStore for persisting identities, sessions, bundles\n- extend InstantMessageOperator with Base58 envelope, NORMAL/PFS\n- add UI Instant Messaging settings tab and settings integration\n- add tests for X25519, DoubleRatchet, bundles, and IM roundtrips",
"is_bot": false,
"headline": "feat(im): add forward-secret instant messaging support",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T21:21:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad9dc9b0b335d4597f3d892b85f534f78314a45e",
"body": "* Eliminated the image of GpgFrontend for a cleaner layout.\n* This change enhances the readability of the introduction section.",
"is_bot": false,
"headline": "docs: remove image from README.md",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T16:20:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3b09da2a020a31e5c828b28cbda0c8e9a5b105ef",
"body": "* Reduced padding from 5px to 3px for a more compact layout\n* Aims to improve visual consistency in the UI",
"is_bot": false,
"headline": "style(ui): adjust padding in key table items",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T16:09:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e2509545932032f02fa5a9cba595f33008ecd01",
"body": "- add SetColumnFilterSettingsKey to KeyList to persist visible columns\n- load default column set from per-list QSettings key when provided\n- default toolbox dock to compact identity-focused column set\n- use column_filter_settings_key_ instead of global hardcoded key\n- add SourceColumnForVisibleColum\n[…]\n apply_column_sizing in KeyTable to stretch name/email/comment\n- reapply sizing on column changes and model refresh instead of resize\n- adjust header stretch/resize modes and init column chooser state",
"is_bot": false,
"headline": "feat(keylist): persist columns per list and apply sizing",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T16:09:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "58205a61add257d8276bae30d745438ccc2144ff",
"body": "- introduce StartupWaitingDialog subclass of QDialog\n- paint faint GF logo centered and scaled as a watermark\n- lazy-load logo pixmap and use smooth scaling and low opacity\n- replace temporary QDialog in WaitEnvCheckingProcess with it\n- keep dialog modal and delete-on-close semantics",
"is_bot": false,
"headline": "feat(ui): add startup waiting dialog with watermark",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T16:00:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f5c51eedafe6658ca94640b4afa94d72e19ec6a",
"body": "- replace SHA256-based derivation with libsodium argon2id KDF\n- add fixed salt and Argon2id params (memory-hard KDF)\n- call EnsureSodiumInit() and return false on derivation fail\n- ensure fallback to DefaultBook() if KDF unavailable\n- change DeriveBookConstants() signature to return bool\n- compute o\n[…]\nrn success when overall >= 0 and update summary text\n- add Ctrl+M shortcut for IM encrypt action\n- include sodium.h and core/utils/CommonUtils.h\n- fix comment token/enum names (kNOT_TOKEN, kMALFORMED)",
"is_bot": false,
"headline": "feat(im): derive book constants with argon2id",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T15:58:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bcb7f388b3862dbd8b2c2dda8f8f8be9ad48ca99",
"body": "* Introduce `Inspect` method to classify instant messaging tokens\n* Update `Detect` method to utilize `Inspect` for better error handling\n* Add UI elements for configuring instant messaging book phrase\n* Implement error reporting for decryption failures based on token status\n* Refactor related tests to accommodate new functionality",
"is_bot": false,
"headline": "feat(im): enhance instant messaging token handling",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T15:50:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b9f229577b62ea9d72e43a493b5d3582918eeb90",
"body": "- implement InstantMessageOperator with Base58 encode/decode\n- add versioned envelope, default password book and keystream\n- use Base58 alphabet to avoid ambiguous or markup chars\n- add unit tests exercising round-trip and edge cases\n- integrate IM encode into UI: menu action and encrypt slot\n- dete\n[…]\n show IM info card\n- add exec_im_decrypt_helper to run operas and show IM info\n- remove old add/cut PGP header actions and related slots\n- tweak InfoBoardWidget layout to allow slight key column slack",
"is_bot": false,
"headline": "feat(im): add compact instant-messaging tokens",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T15:31:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "66df9b2806f263cd447d375449ccbf80d44898e7",
"body": "- store per-tab colours and per-scope tab orders in KeyCategories cache\n- add KeyCategoryRepository APIs: GetTabColor/SetTabColor\n- add KeyCategoryRepository APIs: GetTabOrder/SetTabOrder\n- persist tab_colors and tab_orders when saving categories\n- move tab order persistence from QSettings into repo\n[…]\nO files\n- remove IsFavorite/SetFavorite and favourite-specific UI/actions\n- remove favorite display mode flags from key models\n- add unit tests for tab colour and tab order; remove old favourite tests",
"is_bot": false,
"headline": "feat(keycategory): persist tab colors and orders",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T14:06:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aabe697e4b02267a1ee8f10e7deab2ac1b075f2c",
"body": "- add compact colour rail mode for category strip and API to toggle\n- render colour swatches, derive or store colours per category\n- persist per-window integrated order and shared custom order\n- reapply shared custom order across windows via UISignalStation\n- pin primary category to top when applyin\n[…]\n from context menu\n- adjust KeyList layout, margins, icon sizes and splitter sizing\n- main window dock uses compact rail; keymgmt keeps text list\n- default GFLogLevel to kCRITICAL when ENV.ini missing",
"is_bot": false,
"headline": "feat(keylist): add compact category rail and colours",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T13:35:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8f498e0955ca1858d52b4bb6d249e406a350da6d",
"body": "- introduce KeyCategoryRepository and use it for categories\n- migrate favorite handling from cache to KeyCategoryRepository\n- add category sidebar, stacked key tables, and splitter layout\n- add \"Add To Category\" submenu with per-key toggles\n- allow creating new categories from the menu and deleting \n[…]\n MainWindow and KeyMgmt to populate category menu and tabs\n- UI tweaks: wider dock, toolbar layout, button styles, search placement\n- remove legacy cache-based favorite structures and related includes",
"is_bot": false,
"headline": "feat(keylist): add key categories UI and migrate favorites",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T12:43:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5d5186d8ea0817203f74428e603e59f18b3cab89",
"body": "- implement KeyCategoryRepository to manage per-db categories\n- add KeyCategoryCO and KeyCategoriesCO cache object types\n- persist categories in durable cache under kcats:<db>\n- include built-in favourite category and migrate legacy list\n- provide API for add/remove/rename categories and membership\n- add unit tests for lifecycle, favourites and persistence",
"is_bot": false,
"headline": "feat(openpgp): add key category repository",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T11:21:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5127b046fa077ad119988934c594662092f68def",
"body": "- support single-branch trunk+tags model for CI workflows\n- trigger builds on main pushes and v* tags, drop develop branch\n- add workflow_dispatch handling to allow selecting build_mode\n- set BUILD_MODE=release for tags, nightly for main pushes\n- introduce GPGFRONTEND_BUILD_STABLE and export to env\n\n[…]\nBUILD_STABLE to cmake and xcode builds\n- update release job to publish only on push to main branch\n- mas-sandbox stops watching the develop branch\n- legacy Qt5 release workflow now triggers on v* tags",
"is_bot": false,
"headline": "ci(workflows): support trunk+tags model",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T10:59:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c5a165fdbeecf91e8ae52c8d744165ee07e6f88b",
"body": "- add RpgpTab to expose rPGP password cache settings in a new tab\n- add SettingsRpgp.h/.cpp and ui/RpgpSettings.ui to implement tab\n- integrate rpgp tab in SettingsDialog and apply settings when used\n- remove rPGP controls and related logic from GeneralTab to avoid dup\n- update GeneralSettings.ui to move module policy and clear-cache box\n- remove unused RustUtils include from SettingsGeneral.cpp",
"is_bot": false,
"headline": "feat(settings): add rPGP settings tab",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T10:58:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67495343f78663a8aa738f88142d80ee009e4ecd",
"body": "- defer frame adjustment until after native map to get frame margins\n- add slot_ensure_frame_on_screen to clamp title bar on screen\n- refresh screen rect before clamping so correct screen is used\n- save position from geometry() instead of frameGeometry()\n- compute move() target from frameGeometry() to preserve top-left",
"is_bot": false,
"headline": "fix(dialog): ensure dialog frame stays on screen",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T10:32:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3093a2a37438d6e357d7bed39b3bad20065dd13a",
"body": "- add GPGFRONTEND_BUILD_STABLE option to control stable releases\n- mark non-stable builds with Testing suffix for user clarity\n- decouple stability from git branch name and remove branch check\n- add explanatory comments about release vs nightly builds",
"is_bot": false,
"headline": "feat(build): add GPGFRONTEND_BUILD_STABLE option",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-12T10:29:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "808b113672ecbf679abf4333b53f319ca4ec953b",
"body": "* Add `rust` to the CodeQL job matrix and convert matrix to per-language entries so\n each entry can carry its own `build-mode`.\n* Use `matrix.build-mode` in the CodeQL init step to allow `none` for Rust while\n keeping `manual` for C++.\n* Guard platform- and C++-specific steps (dependency installs,\n[…]\nrix.language == 'cpp'` to avoid running them for Rust runs.\n* Prevent unnecessary Linux/C++ installs and builds during Rust analysis and\n enable CodeQL scanning for Rust without a C++ build pipeline.",
"is_bot": false,
"headline": "chore(ci): updates `codeql` workflow matrix",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-05T19:32:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d0211f42ff31fe06da2426404f50941127886c2e",
"body": "* Add concurrency group and cancel-in-progress to avoid duplicate runs\n* Increase job timeout to 120 minutes to accommodate long analyses\n* Fix cache keys to use `runner.os` and remove redundant matrix var so\n caches are shared correctly across runners\n* Set CodeQL `build-mode` to `manual` and enab\n[…]\nuild steps: use `mkdir -p` for idempotent dir creation and\n correct the `cmake` build invocation by removing an invalid config\n flag\n* Add language `category` to the analyze step for clearer scoping",
"is_bot": false,
"headline": "chore(ci): improve `codeql` workflow",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-05T19:30:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1ea4a7f1de3fb72e58cb1a8c0348eaf937034f2e",
"body": "* Use `mkdir -p` to make creating the build directory idempotent and avoid\n failures when the directory already exists.\n* Replace in-source `cd`/`cmake ..` flow on Windows with out-of-source\n `cmake -S . -B build` and `cmake --build build` for clearer, more\n modern CMake usage and better compatibility with Ninja/multi-config\n builds.\n* Improve CI robustness and repeatability by preventing directory-exists\n errors and removing reliance on changing working directories.",
"is_bot": false,
"headline": "chore(ci): update `build.yml` build directory handling",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-05T19:23:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "711eada38928cfae24f55290b1ab1d53890f2abf",
"body": "* Update GnuPG patch version from `2.5.18` to `2.5.20` used in CI.\n* Pick up upstream fixes/security patches and improve signing/tooling\n compatibility during release builds.\n* No other workflow logic changes; this is a minor, low-risk upgrade.",
"is_bot": false,
"headline": "chore(ci): bump `GNUPG_VERSION` to 2.5.20",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-05T19:12:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5fb3d96c429cb957d40f78257f3c8131c47fa8bc",
"body": "* Add a nullptr guard in `GFBuffer::operator==(const char*)` to avoid calling\n `strnlen` on null pointers and prevent crashes when comparing against\n `nullptr`.\n* Simplify `operator!=` to delegate to `operator==`, removing duplicated logic.\n* Remove a redundant null-check and early error return in\n[…]\npty or null secret blocks are handled by buffer semantics instead\n of being treated as an immediate error.\n* Add unit tests covering comparisons with C-strings and `nullptr` to prevent\n regressions.",
"is_bot": false,
"headline": "fix(gfbuffer): handle `nullptr` in C-string comparisons",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-07-05T19:05:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e062533a895c93e18b8c1aa5aae477fa2e931501",
"body": "* Reduce timeout for ASan tests from 120 to 60 minutes\n* Add filter for stress tests related to RPGP\n* Improve efficiency by targeting specific tests to avoid deadlocks",
"is_bot": false,
"headline": "chore(ci): adjust ASan test timeout and filter",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T22:50:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b47c8843d1f4e9f9b10bff609c7752f98818295",
"body": "* Add a cache for the ASan build tree so only the first run performs a\n cold instrumented rebuild; subsequent runs restore the build and use\n incremental relinks to speed CI.\n* Increase sanitized job timeouts (workflow and script) to accommodate\n longer initial builds and extended stress iterations.\n* Switch sanitizer CMake build type to `RelWithDebInfo` to retain debug\n symbols while improving build/link performance.",
"is_bot": false,
"headline": "test(ci): cache `ASan` build and extend timeouts",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T21:04:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e1171cb476a27cbbf7d93e32ee5328b128fcb9f4",
"body": "* Remove ad-hoc `ccache` wrapper scripts, related ccache config and\n cache initialization.\n* Stop passing wrapped compiler paths via `CMAKE_C_COMPILER`,\n `CMAKE_CXX_COMPILER` and `CMAKE_XCODE_ATTRIBUTE_*`; rely on\n `CMAKE_OSX_DEPLOYMENT_TARGET` / SDK flags to control deployment target.\n* Simplifi\n[…]\nkaround for conflicting\n *_DEPLOYMENT_TARGET environment variables and the brittle `ccache`\n wiring. If compiler caching is still required for Xcode builds, adopt a\n different integration approach.",
"is_bot": false,
"headline": "chore(ci): remove `ccache` compiler wrappers",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T19:03:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f6ca33b224598e5e935fcc85b0e5bdfdaddda79d",
"body": "* Update ccache configuration to avoid deployment target conflicts\n* Clear conflicting environment variables before invoking clang\n* Enhance build process stability on macOS",
"is_bot": false,
"headline": "fix(ci): improve macOS deployment target handling",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:52:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a61783a02c2b59d6570ba262700f1c10843c6517",
"body": "* Drop `GPGME_SHA` env and remove `actions/cache` steps for macOS and Windows.\n* Simplify macOS/Windows jobs to always run `./autogen.sh`, create a fresh\n `build` dir, configure, and `make`/install instead of attempting to reuse a\n cached build.\n* Rationale: caching/reuse logic proved fragile and produced inconsistent or\n stale artifacts. Always rebuilding simplifies CI, reduces cache-key\n complexity, and yields more deterministic builds.",
"is_bot": false,
"headline": "chore(ci): remove `GpgME` cache and always rebuild",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:46:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "41a2f12929c01cc68125fdd65f71da7916d4a867",
"body": "* Change log level from `info` to `warn` for the ASAN CI test run.\n* Reduce noisy output to make CI logs more concise and improve\n failure signal-to-noise; avoids excessive log flooding while keeping\n warnings and errors visible.\n* No change to test behavior or coverage; only adjusts logging verbosity.",
"is_bot": false,
"headline": "chore(ci): reduce log level for `run_tests_asan.sh`",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:41:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "441a1fbb3ac7445504b6642073a138d41839d71a",
"body": "* Propagate the application's chosen log level to the Rust logger so both\n C++ and Rust backends honour a single `--log-level` value.\n* Have the C++ log-parsing path set `RUST_LOG` (unless the user already set\n it) to keep the Rust crate's env_logger in sync with the app's log level.\n* Make the Ru\n[…]\nt env), allowing a\n user-provided `RUST_LOG` to take precedence.\n* Preserve existing behavior: do not override an explicit `RUST_LOG`, and\n logger initialization remains safe to call multiple times.",
"is_bot": false,
"headline": "feat(logging): align Rust logs with app log-level",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:40:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6d5a40a9be023f7e34ecae9dd36c93f4b07e27a8",
"body": "* Add a Windows-specific Cargo cache to preserve the Cargo registry and the\n project's Cargo target dir because the rust-cache approach cannot locate\n msys2/mingw Cargo on Windows. This improves cache hits and speeds up\n Windows CI builds.\n* Unset multiple `*_DEPLOYMENT_TARGET` environment variab\n[…]\non macOS\n runners to avoid clang aborts caused by conflicting deployment targets\n exported by newer runner images. Let CMake's `CMAKE_OSX_DEPLOYMENT_TARGET`\n control the deployment version instead.",
"is_bot": false,
"headline": "fix(ci): cache Windows Cargo and clear macOS envs",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:39:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1686066750b21a9b0cb62a4c7e5f0d8fd182a330",
"body": "* Add a GPGME commit SHA to the environment to key caches and enable stable\n cache keys for third-party builds.\n* Cache GpgME builds on macOS and Windows and googletest on Linux to avoid\n rebuilding unchanged dependencies across runs.\n* Reuse cached builds by detecting existing build outputs (Make\n[…]\nenefit\n from caching (including relaxed PCH handling).\n* Reduce CI time and resource usage by preventing redundant compile work while\n preserving the full-build behavior when caches are unavailable.",
"is_bot": false,
"headline": "perf(ci): improve `build.yml` caching",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:22:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "edc9502cf3634a7977cbbf30ee31e455ee35ccdf",
"body": "* Introduce `-l` / `--log-level` to control application log verbosity\n (debug|info|warn|error); default is `warn`.\n* Echo the chosen log level in each test phase for clarity.\n* Forward the value to the tested binary so test runs produce the\n requested verbosity, making it easier to debug failing tests.\n* No additional validation is performed; the binary is expected to\n interpret the provided level.",
"is_bot": false,
"headline": "feat(scripts): add `--log-level` option",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:12:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "340f0453520c8aff8a8e0d031580f644d8c0904e",
"body": "* Add a dedicated ASan/UBSan stress job to CI to exercise a separate\n sanitized build (`build-asan`) that hunts for memory corruption across\n the C++/Rust FFI boundary. The job runs the instrumented stress suite\n with a longer timeout and uses an offscreen Qt platform to avoid UI\n requirements.\n\n[…]\nruns can produce more useful logs.\n* Use a moderate stress iteration count and explicit `--log-level info`\n in CI to balance runtime and diagnostic output while retaining strong\n detection coverage.",
"is_bot": false,
"headline": "test(ci): add ASan stress job and log-level flag",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:08:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5ac98876e53235d35b8a11f8f4b8175ac1d8d634",
"body": "* Add a stress test that repeatedly runs passphrase-only symmetric\n encrypt->decrypt cycles to exercise the host passphrase-fetch path.\n* Vary payload sizes across the 4KB secure-buffer boundary to hit the\n realloc/append code path in the buffer reader and catch boundary issues.\n* Run without key \n[…]\nis exercised repeatedly; useful under ASan to signal\n memory problems.\n* Validate successful encrypt/decrypt roundtrips, empty recipients, and\n non-empty ciphertext to ensure correctness under load.",
"is_bot": false,
"headline": "test(core): add `EncryptSymmetricDecryptStress` test",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T18:08:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "32f8460b3f8b518973fef1d205d962e8a4419bdc",
"body": "* Add a helper to launch the GUI binary built with AddressSanitizer/UBSan,\n reusing the existing instrumented build tree and optionally forcing a\n rebuild.\n* Configure sanitizer options to stop at the first error, produce\n symbolized stacks and write per-PID reports to the build directory so\n in\n[…]\nlows; note the instrumented GUI is slower and uses more memory.\n* Intended for debugging memory errors (e.g. realloc corruptions) in the\n GUI by making sanitizer output easy to reproduce and inspect.",
"is_bot": false,
"headline": "test(scripts): add `run_gui_asan.sh` script",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T17:52:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5b5785da51b276f9eb34c189e4853a8909beb790",
"body": "* Decrease delay before showing the waiting dialog from 1000ms to 200ms\n to make short crypto operations feel more responsive and avoid\n unnecessary flash of a waiting indicator.\n* Reduce focus recheck interval from 250ms to 150ms so the dialog is\n presented sooner once the application regains focus.\n* Preserve modal-exclusion checks to avoid stacking modal dialogs; also\n apply a minor formatting adjustment to improve readability.",
"is_bot": false,
"headline": "fix(ui): reduce waiting dialog delays",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T17:50:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ac802bcaae1f2fac66e09614adef4be7c77e235",
"body": "* Introduce a stress test that repeatedly runs `EncryptSignSync` /\n `DecryptVerifySync` while varying payload sizes to cross the 4KB secure-\n buffer boundary. This exercises the realloc/append path in the buffer\n reader to surface heap corruption or overflow regressions (intend to run\n under ASa\n[…]\nng / refactor cleanup in test setup for readability.\n\n* Purpose: make test coverage hit the exact crash paths reported so regressions\n in buffer allocation and passphrase handling are detected early.",
"is_bot": false,
"headline": "test(core): add encrypt+sign/decrypt+verify stress tests",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T17:50:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b0d86913cf87c11fc9df31a1a59398506276ea95",
"body": "* Initialize primitive members in `GFSubKeyMetadata` and `GFKeyMetadata`.\n* Set explicit defaults for numeric and boolean fields (e.g. algo,\n key_length, created_at, update_time, has_secret, is_revoked,\n is_disabled, capability flags, marked).\n* Avoids uninitialized memory and potential undefined behavior when\n objects are default-constructed or copied, improving safety and\n predictability.\n* No functional API changes; only adds explicit member initializers.",
"is_bot": false,
"headline": "refactor(typedef): initialize metadata fields",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T17:44:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2cc01ecced726a3f958c50c7f0f89a946458d11a",
"body": "* Introduce a length-delimited secure free API `gfc_secure_free_buffer(uint8_t*, size_t)`\n for FFI to wipe and free byte buffers without relying on a NUL terminator.\n* Implement the new function in C++ using `sodium_memzero` to reliably wipe the\n exact allocation and then free via the secure alloc\n[…]\nfers and add\n test stubs for the new symbol.\n* Prevents potential over-read/UB from `strlen`-based wiping on non-C-string\n buffers (e.g. passphrase bytes), improving safety when freeing binary data.",
"is_bot": false,
"headline": "feat(ffi): add `gfc_secure_free_buffer`",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T17:43:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d0a7e98db7a1bb71b50d6c085032374e0a6a5759",
"body": "* Advance the `modules` git submodule to a newer commit to pull in upstream\n fixes and updates.\n* Keep repository submodule state in sync; there are no other source changes\n in this tree.\n* Consumers should update submodules after pulling to get the updated code.",
"is_bot": false,
"headline": "chore(submodules): update `modules` pointer",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T16:42:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f69751b5829d4f48e4d1bca123376d305920c963",
"body": "* Advance the `modules` submodule pointer to include upstream fixes and\n updates.\n* Keep repository dependency state in sync; no project source changes\n beyond the submodule reference.",
"is_bot": false,
"headline": "chore(deps): update `modules` submodule",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T16:39:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "911e25038d67848569dfbca8cd53b80896a7ebcd",
"body": "* Introduce engine-neutral, capsule-based analysis APIs so result analysers\n can recover full `Gpg*Result` models from UI capsules when the rPGP engine\n does not produce native gpgme_*_result handles.\n* Make SDK tolerant of null native gpgme handles by only referencing them when\n present, and doc\n[…]\nts (preventing false failures).\n* Ensures consistent analysis and status codes across native (GnuPG) and\n rPGP engines and avoids null-dereference/assertion crashes when no raw\n gpgme handle exists.",
"is_bot": false,
"headline": "feat(sdk): add capsule-based result analysis",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-29T16:37:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "52c7ca33c2ae85c9ecb817bdee3d4470b62ef458",
"body": "* Set the default engine for placeholder `OpenPGPContext` instances to\n `rPGP` so they never masquerade as GnuPG. This prevents placeholder\n contexts from routing into live gpg-agent queries and unsafe casts that\n could throw and crash during deep restarts (e.g. macOS sandbox / rPGP\n fallback).\n\n[…]\nted as supported, preventing recurrence of the\n crash.\n\n* Prevents live gpg-agent queries for contexts that cannot satisfy engine\n requirements and improves robustness during restart/relaunch flows.",
"is_bot": false,
"headline": "fix(openpgp): use `rPGP` as placeholder engine",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T22:30:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1b7e65c248c27ca8fcb6b6c5aab2a793f04dd643",
"body": "* Remove macOS-specific exclusion so dark-mode detection runs on all\n platforms during UI initialization.\n* Unify theming behavior: continue to set the `Fusion` style, but allow\n the app's dark palette to be applied on macOS when the system colors\n indicate a dark theme.\n* Ensures consistent dark-mode handling across platforms; note this may\n override the native macOS palette and could affect platform-native\n visuals.",
"is_bot": false,
"headline": "fix(ui): detect and apply dark palette on macOS",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T21:42:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df15a362ea3109a7c4a523959a0d6573cd649be7",
"body": "fix(ui): preserve macOS native palette\n\n* Avoid applying the hand-rolled dark palette on macOS; `Fusion` already\n picks up the system light/dark palette and the custom palette looked\n out of place.\n* Add platform guards (Q_OS_MACOS) so macOS only switches the style, while\n other platforms continu\n[…]\nlt treatment that also\n installs the dark palette for consistent appearance across launches.\n* Prevents visual regressions on macOS and keeps previous dark-theme\n consistency on non-macOS platforms.",
"is_bot": false,
"headline": "fix(ui): preserve macOS native palette",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T21:42:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2579767d5224fc20672448360cc02f2d74a06f6b",
"body": "* Normalize saved theme and available styles to lowercase to reliably match\n user settings.\n* Determine an effective style: honor a valid saved style; otherwise fall back\n to `Fusion` on macOS and when running as an AppImage.\n* Always apply `Fusion` via the dedicated default function (which also s\n[…]\nit setting; otherwise apply the chosen style normally.\n* Prevents a previous regresssion where a persisted `Fusion` setting could\n result in the dark palette not being applied on subsequent launches.",
"is_bot": false,
"headline": "fix(ui): resolve and apply effective style",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T21:03:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3bb603467f5f09ab811a594e5a4263640208cc06",
"body": "* Add an authoritative re-check of `core` terminal state immediately after\n showing the environment-check dialog and before entering the blocking\n event loop.\n* Prevents a macOS-specific deadlock where `dialog->show()` may pump the\n event loop and deliver a queued quit before `looper.exec()` star\n[…]\n\n before emitting signals) and close the dialog / skip the event loop if\n a terminal state is already reached; preserves existing signal handling\n so later transitions still reach the running loop.",
"is_bot": false,
"headline": "fix(ui): skip dialog wait when `core` already reached terminal state",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T20:35:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b4a118d41601f5517fd1d8231af1afc5cb9b5139",
"body": "* Add rotating file logging support to `GFLogManager` via `InitFileLogger`\n and `StopFileLogger`.\n* Flush the in-memory ring backlog into the active file on enable and write\n each subsequent entry with an immediate flush so stalled or crashed startups\n leave useful diagnostics on disk.\n* Implemen\n[…]\nrtup failures that hang the UI are persisted for later diagnosis.\n* Add unit tests covering backlog flush, rotation behavior, and no-op init to\n validate the new logging sink and lifecycle semantics.",
"is_bot": false,
"headline": "feat(core): add rotating file logging",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T20:01:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "79356688abd289ab8cd2ed53129af383282efd1c",
"body": "* Bump submodule pointer to a newer upstream commit to incorporate\n recent fixes and updates.\n* No other repository files modified; only the subproject reference was\n advanced.\n* Keeps the submodule aligned with upstream to simplify future merges and\n dependency management.",
"is_bot": false,
"headline": "chore(modules): update `modules` submodule commit",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T17:34:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d1c9e8f7492bb387a05d44652c9c52a9361fc50b",
"body": "* Rephrase feature list to improve clarity and usability, add emphasis on\n one-click encryption, isolated key databases, memory-safe handling, and\n local-only privacy with no telemetry.\n* Introduce future-proof messaging: highlight `rPGP` support for OpenPGP\n v6 (RFC 9580) and post-quantum algori\n[…]\nmend the v2.2.x stable\n series with the dual-engine core; label v2.1.x as Legacy for users who\n need a pure `GnuPG` build.\n* Split Chinese language entry into Simplified and Traditional for clarity.",
"is_bot": false,
"headline": "docs(readme): clarify features and releases",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T17:26:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3c9b9625ddfdcd92f1f1107531e2b604c776a19e",
"body": "* Compute and size the card key column based on actual key text using font\n metrics instead of a fixed clipped width, while clamping to a new maximum\n to avoid crowding the value column.\n* Introduce a max key-column width constant and enable word-wrap on key\n labels so long keys (e.g. \"Primary Ke\n[…]\null-card rendering to ensure consistent sizing and visual improvements.\n\nBenefits:\n* Prevents label clipping and improves readability of long key names without\n harming layout for typical short keys.",
"is_bot": false,
"headline": "fix(ui): avoid key label clipping in `InfoBoardWidget`",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T17:23:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2cb6b99f0b91051be8e88df215d277e7c154c06c",
"body": "* Prefer structured `InfoBoard` card payload when present.\n* Decode payload and compute status early; keep existing behavior for\n valid card payloads.\n* When an operation fails but no structured cards are provided, render a\n minimal card document (operation, failure message and module report)\n so the Status view explains the failure instead of appearing empty.\n* Prevents loss of error context for failures that don't include\n `result_cards`, improving UX and diagnostics.",
"is_bot": false,
"headline": "fix(info_board): render report when no cards",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T17:22:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f58d0954cbe7f1777ab93ad43436aae0e836ae9d",
"body": "* Synchronize translation source locations across locale files after source\n refactoring so translations map to the correct lines and remain usable by\n tooling and translators.\n* Introduce localized text for email operation failures (title, explanation\n and \"Report\") to support a new UI report pa\n[…]\nID.\" entry as vanished to\n avoid stale translations.\n* Refresh InfoBoard/InfoBoardCardConverter and various MainWindow/KeyPair UID\n translation references to keep message catalogs aligned with code.",
"is_bot": false,
"headline": "docs(i18n): update i18n locations and add email error strings",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T17:22:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "697d631147b8803d2d664180792c0b6712e774e6",
"body": "* Remove the modal success message that appeared after setting the primary UID.\n* Rely on the existing update signal to refresh UI state, reducing blocking\n dialogs and unnecessary user interruptions.\n* Keeps functionality intact while streamlining the user experience.",
"is_bot": false,
"headline": "refactor(ui): remove redundant success dialog",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T17:03:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47705d5bc1c06a2f4e67b9863eaed3ca36f7d597",
"body": "* Add `GF_UI_EXPORT` to `convert_op_info_to_cards` and\n `encode_info_board_cards` declarations to ensure symbols are exported\n from the UI library.\n* Make these helpers available to SDK/modules that consume encoded/decoded\n Info Board card data without changing their signatures or behavior.\n* Fixes symbol visibility issues when linking across shared-library/module\n boundaries; no runtime logic changes introduced.",
"is_bot": false,
"headline": "refactor(ui): export `InfoBoardCard` APIs",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T16:57:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dddc79a94c5bf07521f0aaacab387161ac615982",
"body": "* Introduce a new slot that decodes structured `result_cards` payloads and\n renders rich info-board cards, falling back to the plain `result` /\n `result_status` path when the payload is absent or malformed.\n* Centralize and replace duplicated plain-text info-board calls in multiple\n module operat\n[…]\nad is provided, preserving previous\n behavior for legacy/plain responses.\n\n* Simplifies callers, reduces duplication, and enables richer module-driven\n UI feedback without breaking existing modules.",
"is_bot": false,
"headline": "feat(ui): add module-aware info-board slot",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T16:42:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "15d761e6e2521c39e78b6e6560f8975e6134c048",
"body": "* Add JSON encode/decode for `InfoBoard` cards and a payload structure to\n serialize card arrays for modules that can only exchange string params.\n* Extend SDK analysis APIs to optionally return a JSON string of result\n cards, reusing the same converter so module-provided results render\n identica\n[…]\ng (e.g. external pinentry) and avoiding blocking module or\n passphrase input. Replace signal-based suppression with an active-modal\n check.\n* Minor formatting/cleanup of struct layouts and includes.",
"is_bot": false,
"headline": "feat(ui): export `InfoBoard` cards as JSON",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T16:40:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "343ebcaffd0aad2d9bb762a84c1dca8c72e452f0",
"body": "* Add `GpgPassphraseContext` include so the type is available to the UI\n helper.\n* Prevents potential compilation errors and prepares the file for\n upcoming use of passphrase-context functionality",
"is_bot": false,
"headline": "fix(ui): include `GpgPassphraseContext` header",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T15:32:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cebd8350a0bd1966e2a7e9801f9c69e99a6ab46",
"body": "* Extract GNUPG distribution into a dedicated `gnupg` artifacts\n subdirectory and list its contents.\n* Use `unzip -o` to overwrite existing files to avoid stale files on\n repeated runs.\n* Prevents GNUPG files from polluting the top-level artifacts folder\n and reduces risk of packaging/CI step conflicts.",
"is_bot": false,
"headline": "chore(ci): isolates `gnupg` artifacts",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T15:27:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "134471caf70b0b71d69b4bfe03e1b20d19caabee",
"body": "* Ensure archive extraction completes before reporting operation success.\n - Introduce a completion callback and a promise/future pair so the\n extractor (which drains the decrypted plaintext from the exchanger and\n writes files to disk) can signal when all files are written.\n - Wait on the s\n[…]\nsing files on archive decrypt (avoids committing/renaming an\n output directory before extraction finishes).\n - Provides deterministic behavior across different task runners and gpgme\n versions.",
"is_bot": false,
"headline": "fix(gpg): wait for archive extractor before completing op",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:56:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "615e59d2d790b4e65cb489c1bafc705ecb1afaa4",
"body": "* Align translation catalogs with recent source changes by updating source\n location references across multiple locale files.\n* Increase `TextEdit` / `TextEditTabWidget` open-file threshold message from\n 1 MB to 4 MB so translations reflect the new allowed file size.\n* Mark obsolete UI strings as vanished to reflect removed or relocated text.\n* Keeps translations in sync with code, avoiding stale message references and\n ensuring user-facing text matches current behavior.",
"is_bot": false,
"headline": "docs(locale): bump `TextEdit` size",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:52:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d94bf7dd9c4fb122f2d813e7941711ffb6ce8a5d",
"body": "* Remove duplicated open-time validation from `TextEdit` and delegate it to\n `TextEditTabWidget` so a single implementation (via `can_open_as_text_file()`\n / `SlotOpenFile`) handles file checks and user-facing error messages.\n* Increase the text-editor file-size threshold from 1 MB to 4 MB and upd\n[…]\n very large files from opening in the editor.\n\n* Implications:\n - Behavior is unchanged except for the larger file-size allowance and the\n - All open-time user messages now come from the tab widget.",
"is_bot": false,
"headline": "refactor(textedit): delegate validation; raise limit",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:49:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "97f8ffa2a950aa5091e18b159e7a5d7a82216df4",
"body": "* Introduce `CalculateFileHashInfo` to produce an ordered list of\n (key, value) pairs for file metadata and hashes, and `FormatFileHashInfo`\n to render that structured data into human-readable text. This ensures the\n file is read and hashed exactly once and avoids parsing localized report\n text \n[…]\nunreadable.\n* Add unit tests to validate the produced fields, rendering, and error\n behavior.\n* Misc: small formatting and style fixes (signal emit spacing, layout of\n multi-line append statements).",
"is_bot": false,
"headline": "refactor(io): produce structured file-hash fields",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:46:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9528555344ea7b24037f8869d8ee1bc67ebf377a",
"body": "* Update CI `GNUPG_VERSION` from 2.5.18 to 2.5.20.\n* Pick up upstream bug fixes, security patches, and compatibility\n improvements in the newer GnuPG release.\n* Only affects the GitHub Actions build environment; no runtime code\n changes.",
"is_bot": false,
"headline": "chore(ci): bump `GNUPG_VERSION` to 2.5.20",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:25:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac545ad2a558f1fd6afdfe8327acc324a0b9da2a",
"body": "* Parse supported locales from `cmake/Translations.cmake` (or\n `GPGFRONTEND_LOCALES`) so the build and tooling share a single source of\n truth.\n* Update `scripts/update_translations.sh` to derive each target's desired\n `.ts` set from that list, create any missing `<base>.<locale>.ts` files,\n the\n[…]\n about `.ts` files using\n unsupported locales, and surface supported locales / created files when\n listing — improving ergonomics and preventing locale drift.\n* Add `ru_RU` to the supported locales.",
"is_bot": false,
"headline": "feat(i18n): centralize locales and refresh script",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:15:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "efd7c08d78abd5796c87c879ccbe6cc9e4436a87",
"body": "* Sync translation source locations with updated UI source line numbers to\n keep TS mappings accurate.\n* Add and propagate new translatable messages (e.g. \"Add New Key Database\",\n \"Closing in %1:%2\") across multiple locales.\n* Complete and update many locale entries (notably `zh_CN`) by replacing\n unfinished placeholders with finalized translations.\n* No functional code changes; purely localization and translation file upkeep.",
"is_bot": false,
"headline": "chore(i18n): update `ts` translations",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:13:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b150ad4c7c945f5bf8a38f33c06755a63d6d028",
"body": "* Add a shared `Translations.cmake` that declares the supported UI locales\n and provides `gpgfrontend_collect_ts_files` to expand those locales into\n .ts file paths.\n* Include the shared file from the top-level build so the application and\n all modules reference a single source of truth for translations.\n* Replace the app's hard-coded TS file list with the helper call, reducing\n duplication and making it easier to add/remove locales consistently.",
"is_bot": false,
"headline": "feat(build): centralize UI locales in `Translations.cmake`",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:03:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "275553628ab06450b82f97d28745985952860f3e",
"body": "* Introduce a unified `update_translations` script and remove the older\n module-only script to handle both the application and module translation\n targets with a single tool.\n* Provide finer control via flags (`--no-app`, `--app-only`, `--no-obsolete`,\n `--list`, `--modules-dir`) and allow filter\n[…]\ning.\n* Result: simplifies and consolidates translation updates, enabling updating\n the application translations alongside modules and offering clearer,\n safer control over which sources are scanned.",
"is_bot": false,
"headline": "feat(scripts): add `update_translations` script",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T14:01:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ccbc95aa6a43d9b16e898d16c0ae88f5a6d69645",
"body": "* Adds explicit handling for `ErrorFetchPasswordFailed` in\n encrypt, decrypt, sign, and verify result handlers.\n* Maps the passphrase-fetch failure to `GPG_ERR_NO_PASSPHRASE`\n and emits clear log messages so callers receive accurate\n diagnostics instead of being misclassified as other errors.\n* Improves user feedback and error propagation for operations\n that require a passphrase.",
"is_bot": false,
"headline": "fix(rpgp): handle passphrase fetch failure",
"author_name": "saturneric",
"author_login": "saturneric",
"committed_at": "2026-06-28T13:53:56Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 39,
"commits_last_year": 956,
"latest_release_at": "2026-07-20T21:43:02Z",
"latest_release_tag": "nightly",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 26,
"days_since_latest_release": 1,
"mean_days_between_releases": 66
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 57,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 62,
"stars": 730,
"watchers": 8,
"fork_history": {
"days": [
{
"date": "2021-06-19",
"count": 1
},
{
"date": "2021-07-03",
"count": 1
},
{
"date": "2021-07-17",
"count": 1
},
{
"date": "2021-07-28",
"count": 1
},
{
"date": "2021-08-07",
"count": 1
},
{
"date": "2021-08-08",
"count": 2
},
{
"date": "2021-08-09",
"count": 1
},
{
"date": "2021-08-10",
"count": 1
},
{
"date": "2021-08-15",
"count": 2
},
{
"date": "2022-01-08",
"count": 1
},
{
"date": "2022-01-15",
"count": 1
},
{
"date": "2022-02-05",
"count": 1
},
{
"date": "2022-06-19",
"count": 1
},
{
"date": "2022-09-23",
"count": 1
},
{
"date": "2022-11-25",
"count": 2
},
{
"date": "2022-12-09",
"count": 1
},
{
"date": "2022-12-12",
"count": 1
},
{
"date": "2022-12-20",
"count": 1
},
{
"date": "2023-01-14",
"count": 1
},
{
"date": "2023-02-21",
"count": 1
},
{
"date": "2023-06-22",
"count": 1
},
{
"date": "2023-06-29",
"count": 1
},
{
"date": "2023-06-30",
"count": 1
},
{
"date": "2023-07-01",
"count": 1
},
{
"date": "2023-07-15",
"count": 1
},
{
"date": "2023-11-18",
"count": 1
},
{
"date": "2023-12-13",
"count": 1
},
{
"date": "2023-12-24",
"count": 1
},
{
"date": "2024-02-02",
"count": 1
},
{
"date": "2024-02-22",
"count": 1
},
{
"date": "2024-03-18",
"count": 1
},
{
"date": "2024-04-07",
"count": 1
},
{
"date": "2024-04-21",
"count": 1
},
{
"date": "2024-05-05",
"count": 1
},
{
"date": "2024-08-07",
"count": 2
},
{
"date": "2024-08-12",
"count": 1
},
{
"date": "2024-09-20",
"count": 1
},
{
"date": "2024-10-03",
"count": 1
},
{
"date": "2024-10-21",
"count": 1
},
{
"date": "2024-10-26",
"count": 1
},
{
"date": "2024-12-13",
"count": 1
},
{
"date": "2024-12-21",
"count": 1
},
{
"date": "2025-02-06",
"count": 1
},
{
"date": "2025-02-14",
"count": 1
},
{
"date": "2025-02-19",
"count": 1
},
{
"date": "2025-04-30",
"count": 1
},
{
"date": "2025-06-07",
"count": 1
},
{
"date": "2025-07-06",
"count": 1
},
{
"date": "2025-08-09",
"count": 1
},
{
"date": "2025-09-02",
"count": 1
},
{
"date": "2026-03-23",
"count": 1
},
{
"date": "2026-04-14",
"count": 2
},
{
"date": "2026-06-13",
"count": 1
},
{
"date": "2026-06-22",
"count": 1
},
{
"date": "2026-06-23",
"count": 1
},
{
"date": "2026-07-03",
"count": 1
},
{
"date": "2026-07-10",
"count": 1
}
],
"complete": true,
"collected": 62,
"total_forks": 62
},
"star_history": {
"days": [
{
"date": "2021-06-19",
"count": 4
},
{
"date": "2021-06-20",
"count": 2
},
{
"date": "2021-06-21",
"count": 1
},
{
"date": "2021-06-22",
"count": 1
},
{
"date": "2021-06-24",
"count": 3
},
{
"date": "2021-06-25",
"count": 1
},
{
"date": "2021-06-26",
"count": 1
},
{
"date": "2021-06-30",
"count": 1
},
{
"date": "2021-07-03",
"count": 1
},
{
"date": "2021-07-06",
"count": 1
},
{
"date": "2021-07-10",
"count": 1
},
{
"date": "2021-07-11",
"count": 1
},
{
"date": "2021-07-13",
"count": 2
},
{
"date": "2021-07-20",
"count": 1
},
{
"date": "2021-07-22",
"count": 1
},
{
"date": "2021-07-30",
"count": 1
},
{
"date": "2021-07-31",
"count": 1
},
{
"date": "2021-08-03",
"count": 1
},
{
"date": "2021-08-07",
"count": 3
},
{
"date": "2021-08-08",
"count": 9
},
{
"date": "2021-08-10",
"count": 1
},
{
"date": "2021-08-12",
"count": 1
},
{
"date": "2021-08-13",
"count": 1
},
{
"date": "2021-08-14",
"count": 1
},
{
"date": "2021-08-17",
"count": 1
},
{
"date": "2021-08-25",
"count": 1
},
{
"date": "2021-08-27",
"count": 1
},
{
"date": "2021-09-02",
"count": 1
},
{
"date": "2021-09-03",
"count": 2
},
{
"date": "2021-09-08",
"count": 1
},
{
"date": "2021-09-09",
"count": 1
},
{
"date": "2021-09-10",
"count": 1
},
{
"date": "2021-09-14",
"count": 2
},
{
"date": "2021-09-17",
"count": 1
},
{
"date": "2021-09-18",
"count": 1
},
{
"date": "2021-09-28",
"count": 1
},
{
"date": "2021-10-08",
"count": 1
},
{
"date": "2021-10-11",
"count": 1
},
{
"date": "2021-10-14",
"count": 2
},
{
"date": "2021-10-15",
"count": 1
},
{
"date": "2021-10-20",
"count": 1
},
{
"date": "2021-10-21",
"count": 1
},
{
"date": "2021-10-26",
"count": 1
},
{
"date": "2021-11-02",
"count": 1
},
{
"date": "2021-12-02",
"count": 1
},
{
"date": "2021-12-08",
"count": 1
},
{
"date": "2021-12-10",
"count": 1
},
{
"date": "2021-12-12",
"count": 2
},
{
"date": "2021-12-13",
"count": 3
},
{
"date": "2021-12-14",
"count": 1
},
{
"date": "2021-12-15",
"count": 2
},
{
"date": "2021-12-28",
"count": 1
},
{
"date": "2021-12-30",
"count": 1
},
{
"date": "2022-01-09",
"count": 2
},
{
"date": "2022-01-14",
"count": 1
},
{
"date": "2022-01-16",
"count": 1
},
{
"date": "2022-01-17",
"count": 2
},
{
"date": "2022-01-21",
"count": 1
},
{
"date": "2022-01-23",
"count": 1
},
{
"date": "2022-01-30",
"count": 1
},
{
"date": "2022-01-31",
"count": 1
},
{
"date": "2022-02-01",
"count": 3
},
{
"date": "2022-02-05",
"count": 1
},
{
"date": "2022-02-06",
"count": 2
},
{
"date": "2022-02-07",
"count": 1
},
{
"date": "2022-02-13",
"count": 1
},
{
"date": "2022-02-16",
"count": 1
},
{
"date": "2022-02-23",
"count": 1
},
{
"date": "2022-02-25",
"count": 1
},
{
"date": "2022-03-01",
"count": 2
},
{
"date": "2022-03-12",
"count": 2
},
{
"date": "2022-03-18",
"count": 1
},
{
"date": "2022-03-23",
"count": 1
},
{
"date": "2022-03-24",
"count": 1
},
{
"date": "2022-03-31",
"count": 1
},
{
"date": "2022-04-03",
"count": 1
},
{
"date": "2022-04-04",
"count": 1
},
{
"date": "2022-04-09",
"count": 3
},
{
"date": "2022-04-11",
"count": 1
},
{
"date": "2022-05-05",
"count": 1
},
{
"date": "2022-05-09",
"count": 1
},
{
"date": "2022-05-11",
"count": 1
},
{
"date": "2022-05-13",
"count": 1
},
{
"date": "2022-05-15",
"count": 2
},
{
"date": "2022-05-26",
"count": 1
},
{
"date": "2022-06-02",
"count": 1
},
{
"date": "2022-06-03",
"count": 1
},
{
"date": "2022-06-06",
"count": 1
},
{
"date": "2022-06-11",
"count": 2
},
{
"date": "2022-06-12",
"count": 1
},
{
"date": "2022-06-13",
"count": 1
},
{
"date": "2022-06-16",
"count": 1
},
{
"date": "2022-06-21",
"count": 1
},
{
"date": "2022-06-24",
"count": 3
},
{
"date": "2022-06-27",
"count": 1
},
{
"date": "2022-06-28",
"count": 2
},
{
"date": "2022-07-12",
"count": 1
},
{
"date": "2022-07-14",
"count": 1
},
{
"date": "2022-07-16",
"count": 2
},
{
"date": "2022-07-26",
"count": 1
},
{
"date": "2022-08-03",
"count": 1
},
{
"date": "2022-08-04",
"count": 1
},
{
"date": "2022-08-06",
"count": 1
},
{
"date": "2022-08-10",
"count": 1
},
{
"date": "2022-08-11",
"count": 1
},
{
"date": "2022-08-14",
"count": 1
},
{
"date": "2022-08-21",
"count": 1
},
{
"date": "2022-08-25",
"count": 1
},
{
"date": "2022-09-01",
"count": 1
},
{
"date": "2022-09-05",
"count": 1
},
{
"date": "2022-09-07",
"count": 1
},
{
"date": "2022-09-18",
"count": 1
},
{
"date": "2022-09-26",
"count": 1
},
{
"date": "2022-10-02",
"count": 1
},
{
"date": "2022-10-08",
"count": 1
},
{
"date": "2022-10-11",
"count": 1
},
{
"date": "2022-10-14",
"count": 1
},
{
"date": "2022-10-17",
"count": 4
},
{
"date": "2022-10-18",
"count": 1
},
{
"date": "2022-10-19",
"count": 1
},
{
"date": "2022-10-22",
"count": 1
},
{
"date": "2022-10-24",
"count": 1
},
{
"date": "2022-10-25",
"count": 1
},
{
"date": "2022-10-28",
"count": 1
},
{
"date": "2022-11-07",
"count": 1
},
{
"date": "2022-11-08",
"count": 1
},
{
"date": "2022-11-13",
"count": 1
},
{
"date": "2022-11-16",
"count": 1
},
{
"date": "2022-11-24",
"count": 2
},
{
"date": "2022-11-25",
"count": 1
},
{
"date": "2022-11-27",
"count": 1
},
{
"date": "2022-11-29",
"count": 1
},
{
"date": "2022-11-30",
"count": 1
},
{
"date": "2022-12-04",
"count": 1
},
{
"date": "2022-12-09",
"count": 1
},
{
"date": "2022-12-17",
"count": 1
},
{
"date": "2022-12-20",
"count": 1
},
{
"date": "2022-12-21",
"count": 1
},
{
"date": "2022-12-25",
"count": 1
},
{
"date": "2022-12-26",
"count": 1
},
{
"date": "2022-12-28",
"count": 1
},
{
"date": "2023-01-04",
"count": 1
},
{
"date": "2023-01-07",
"count": 2
},
{
"date": "2023-01-10",
"count": 1
},
{
"date": "2023-01-25",
"count": 1
},
{
"date": "2023-01-27",
"count": 1
},
{
"date": "2023-02-01",
"count": 1
},
{
"date": "2023-02-04",
"count": 2
},
{
"date": "2023-02-06",
"count": 1
},
{
"date": "2023-02-07",
"count": 1
},
{
"date": "2023-02-08",
"count": 1
},
{
"date": "2023-02-09",
"count": 1
},
{
"date": "2023-02-10",
"count": 2
},
{
"date": "2023-02-12",
"count": 1
},
{
"date": "2023-02-16",
"count": 1
},
{
"date": "2023-02-17",
"count": 1
},
{
"date": "2023-02-27",
"count": 1
},
{
"date": "2023-03-09",
"count": 1
},
{
"date": "2023-03-11",
"count": 1
},
{
"date": "2023-03-12",
"count": 1
},
{
"date": "2023-03-15",
"count": 1
},
{
"date": "2023-03-16",
"count": 1
},
{
"date": "2023-03-18",
"count": 1
},
{
"date": "2023-03-19",
"count": 1
},
{
"date": "2023-03-20",
"count": 1
},
{
"date": "2023-03-23",
"count": 2
},
{
"date": "2023-03-24",
"count": 2
},
{
"date": "2023-03-26",
"count": 1
},
{
"date": "2023-03-29",
"count": 1
},
{
"date": "2023-03-30",
"count": 2
},
{
"date": "2023-04-01",
"count": 2
},
{
"date": "2023-04-04",
"count": 1
},
{
"date": "2023-04-08",
"count": 1
},
{
"date": "2023-04-09",
"count": 1
},
{
"date": "2023-04-10",
"count": 3
},
{
"date": "2023-04-12",
"count": 1
},
{
"date": "2023-04-15",
"count": 1
},
{
"date": "2023-04-17",
"count": 1
},
{
"date": "2023-04-19",
"count": 1
},
{
"date": "2023-04-23",
"count": 1
},
{
"date": "2023-04-24",
"count": 1
},
{
"date": "2023-04-27",
"count": 1
},
{
"date": "2023-04-29",
"count": 1
},
{
"date": "2023-05-01",
"count": 1
},
{
"date": "2023-05-02",
"count": 2
},
{
"date": "2023-05-04",
"count": 1
},
{
"date": "2023-05-07",
"count": 2
},
{
"date": "2023-05-09",
"count": 1
},
{
"date": "2023-05-17",
"count": 1
},
{
"date": "2023-05-20",
"count": 1
},
{
"date": "2023-05-21",
"count": 1
},
{
"date": "2023-05-30",
"count": 1
},
{
"date": "2023-06-04",
"count": 1
},
{
"date": "2023-06-06",
"count": 1
},
{
"date": "2023-06-13",
"count": 1
},
{
"date": "2023-06-16",
"count": 1
},
{
"date": "2023-06-18",
"count": 1
},
{
"date": "2023-06-20",
"count": 1
},
{
"date": "2023-06-22",
"count": 3
},
{
"date": "2023-06-25",
"count": 2
},
{
"date": "2023-07-01",
"count": 1
},
{
"date": "2023-07-05",
"count": 1
},
{
"date": "2023-07-08",
"count": 2
},
{
"date": "2023-07-11",
"count": 1
},
{
"date": "2023-07-17",
"count": 1
},
{
"date": "2023-07-18",
"count": 1
},
{
"date": "2023-07-19",
"count": 2
},
{
"date": "2023-07-20",
"count": 1
},
{
"date": "2023-07-22",
"count": 1
},
{
"date": "2023-07-26",
"count": 2
},
{
"date": "2023-07-28",
"count": 1
},
{
"date": "2023-07-30",
"count": 2
},
{
"date": "2023-07-31",
"count": 1
},
{
"date": "2023-08-03",
"count": 1
},
{
"date": "2023-08-04",
"count": 1
},
{
"date": "2023-08-10",
"count": 1
},
{
"date": "2023-08-12",
"count": 1
},
{
"date": "2023-08-13",
"count": 1
},
{
"date": "2023-08-15",
"count": 2
},
{
"date": "2023-08-19",
"count": 1
},
{
"date": "2023-08-21",
"count": 1
},
{
"date": "2023-08-23",
"count": 1
},
{
"date": "2023-08-26",
"count": 1
},
{
"date": "2023-08-28",
"count": 1
},
{
"date": "2023-09-03",
"count": 1
},
{
"date": "2023-09-05",
"count": 1
},
{
"date": "2023-09-06",
"count": 1
},
{
"date": "2023-09-12",
"count": 1
},
{
"date": "2023-09-24",
"count": 2
},
{
"date": "2023-10-04",
"count": 1
},
{
"date": "2023-10-05",
"count": 2
},
{
"date": "2023-10-06",
"count": 1
},
{
"date": "2023-10-14",
"count": 1
},
{
"date": "2023-10-15",
"count": 2
},
{
"date": "2023-10-16",
"count": 1
},
{
"date": "2023-10-17",
"count": 1
},
{
"date": "2023-10-23",
"count": 2
},
{
"date": "2023-10-25",
"count": 1
},
{
"date": "2023-10-29",
"count": 1
},
{
"date": "2023-10-30",
"count": 1
},
{
"date": "2023-10-31",
"count": 1
},
{
"date": "2023-11-05",
"count": 1
},
{
"date": "2023-11-07",
"count": 1
},
{
"date": "2023-11-08",
"count": 1
},
{
"date": "2023-11-09",
"count": 1
},
{
"date": "2023-11-11",
"count": 3
},
{
"date": "2023-11-12",
"count": 2
},
{
"date": "2023-11-18",
"count": 2
},
{
"date": "2023-11-21",
"count": 1
},
{
"date": "2023-11-23",
"count": 1
},
{
"date": "2023-11-27",
"count": 1
},
{
"date": "2023-12-04",
"count": 1
},
{
"date": "2023-12-09",
"count": 1
},
{
"date": "2023-12-13",
"count": 1
},
{
"date": "2023-12-15",
"count": 1
},
{
"date": "2023-12-16",
"count": 1
},
{
"date": "2023-12-19",
"count": 1
},
{
"date": "2023-12-20",
"count": 4
},
{
"date": "2023-12-21",
"count": 1
},
{
"date": "2023-12-25",
"count": 1
},
{
"date": "2023-12-28",
"count": 1
},
{
"date": "2023-12-31",
"count": 1
},
{
"date": "2024-01-02",
"count": 1
},
{
"date": "2024-01-03",
"count": 1
},
{
"date": "2024-01-06",
"count": 1
},
{
"date": "2024-01-07",
"count": 1
},
{
"date": "2024-01-10",
"count": 1
},
{
"date": "2024-01-14",
"count": 1
},
{
"date": "2024-01-19",
"count": 1
},
{
"date": "2024-01-20",
"count": 1
},
{
"date": "2024-01-22",
"count": 1
},
{
"date": "2024-01-27",
"count": 1
},
{
"date": "2024-01-30",
"count": 1
},
{
"date": "2024-02-03",
"count": 1
},
{
"date": "2024-02-04",
"count": 1
},
{
"date": "2024-02-05",
"count": 2
},
{
"date": "2024-02-17",
"count": 1
},
{
"date": "2024-02-20",
"count": 3
},
{
"date": "2024-02-22",
"count": 1
},
{
"date": "2024-02-23",
"count": 1
},
{
"date": "2024-02-24",
"count": 1
},
{
"date": "2024-02-25",
"count": 1
},
{
"date": "2024-02-26",
"count": 1
},
{
"date": "2024-02-27",
"count": 4
},
{
"date": "2024-02-28",
"count": 1
},
{
"date": "2024-03-01",
"count": 1
},
{
"date": "2024-03-05",
"count": 2
},
{
"date": "2024-03-06",
"count": 1
},
{
"date": "2024-03-07",
"count": 2
},
{
"date": "2024-03-09",
"count": 1
},
{
"date": "2024-03-10",
"count": 2
},
{
"date": "2024-03-12",
"count": 2
},
{
"date": "2024-03-14",
"count": 1
},
{
"date": "2024-03-17",
"count": 1
},
{
"date": "2024-03-18",
"count": 2
},
{
"date": "2024-03-19",
"count": 1
},
{
"date": "2024-03-21",
"count": 1
},
{
"date": "2024-03-23",
"count": 1
},
{
"date": "2024-03-25",
"count": 2
},
{
"date": "2024-03-26",
"count": 3
},
{
"date": "2024-03-31",
"count": 1
},
{
"date": "2024-04-01",
"count": 1
},
{
"date": "2024-04-03",
"count": 4
},
{
"date": "2024-04-05",
"count": 1
},
{
"date": "2024-04-08",
"count": 1
},
{
"date": "2024-04-14",
"count": 1
},
{
"date": "2024-04-18",
"count": 1
},
{
"date": "2024-04-21",
"count": 1
},
{
"date": "2024-04-27",
"count": 1
},
{
"date": "2024-05-03",
"count": 1
},
{
"date": "2024-05-05",
"count": 1
},
{
"date": "2024-05-06",
"count": 2
},
{
"date": "2024-05-11",
"count": 2
},
{
"date": "2024-05-22",
"count": 1
},
{
"date": "2024-05-24",
"count": 1
},
{
"date": "2024-05-25",
"count": 1
},
{
"date": "2024-05-29",
"count": 1
},
{
"date": "2024-06-03",
"count": 2
},
{
"date": "2024-06-05",
"count": 2
},
{
"date": "2024-06-06",
"count": 1
},
{
"date": "2024-06-07",
"count": 1
},
{
"date": "2024-06-08",
"count": 1
},
{
"date": "2024-06-12",
"count": 2
},
{
"date": "2024-06-14",
"count": 1
},
{
"date": "2024-06-19",
"count": 1
},
{
"date": "2024-06-21",
"count": 1
},
{
"date": "2024-06-25",
"count": 1
},
{
"date": "2024-06-27",
"count": 1
},
{
"date": "2024-06-28",
"count": 2
},
{
"date": "2024-06-30",
"count": 1
},
{
"date": "2024-07-02",
"count": 1
},
{
"date": "2024-07-05",
"count": 2
},
{
"date": "2024-07-06",
"count": 1
},
{
"date": "2024-07-07",
"count": 1
},
{
"date": "2024-07-08",
"count": 2
},
{
"date": "2024-07-10",
"count": 1
},
{
"date": "2024-07-15",
"count": 1
},
{
"date": "2024-07-16",
"count": 1
},
{
"date": "2024-07-25",
"count": 1
},
{
"date": "2024-07-26",
"count": 2
},
{
"date": "2024-07-28",
"count": 1
},
{
"date": "2024-07-30",
"count": 2
},
{
"date": "2024-08-01",
"count": 1
},
{
"date": "2024-08-08",
"count": 1
},
{
"date": "2024-08-09",
"count": 1
},
{
"date": "2024-08-11",
"count": 1
},
{
"date": "2024-08-16",
"count": 2
},
{
"date": "2024-08-17",
"count": 1
},
{
"date": "2024-08-21",
"count": 2
},
{
"date": "2024-08-23",
"count": 1
},
{
"date": "2024-08-25",
"count": 1
},
{
"date": "2024-08-28",
"count": 2
},
{
"date": "2024-08-30",
"count": 1
},
{
"date": "2024-08-31",
"count": 1
},
{
"date": "2024-09-03",
"count": 2
},
{
"date": "2024-09-04",
"count": 1
},
{
"date": "2024-09-06",
"count": 2
},
{
"date": "2024-09-08",
"count": 1
},
{
"date": "2024-09-09",
"count": 1
},
{
"date": "2024-09-11",
"count": 2
},
{
"date": "2024-09-12",
"count": 1
},
{
"date": "2024-09-20",
"count": 2
},
{
"date": "2024-09-21",
"count": 2
},
{
"date": "2024-09-23",
"count": 2
},
{
"date": "2024-09-30",
"count": 1
},
{
"date": "2024-10-01",
"count": 1
},
{
"date": "2024-10-02",
"count": 1
},
{
"date": "2024-10-03",
"count": 1
},
{
"date": "2024-10-12",
"count": 1
},
{
"date": "2024-10-13",
"count": 1
},
{
"date": "2024-10-14",
"count": 1
},
{
"date": "2024-10-15",
"count": 1
},
{
"date": "2024-10-16",
"count": 1
},
{
"date": "2024-10-18",
"count": 1
},
{
"date": "2024-10-21",
"count": 2
},
{
"date": "2024-10-22",
"count": 1
},
{
"date": "2024-10-26",
"count": 1
},
{
"date": "2024-10-31",
"count": 1
},
{
"date": "2024-11-02",
"count": 1
},
{
"date": "2024-11-03",
"count": 1
},
{
"date": "2024-11-11",
"count": 2
},
{
"date": "2024-11-15",
"count": 1
},
{
"date": "2024-11-17",
"count": 2
},
{
"date": "2024-11-19",
"count": 1
},
{
"date": "2024-11-20",
"count": 1
},
{
"date": "2024-11-23",
"count": 1
},
{
"date": "2024-11-28",
"count": 2
},
{
"date": "2024-11-29",
"count": 2
},
{
"date": "2024-12-03",
"count": 1
},
{
"date": "2024-12-05",
"count": 1
},
{
"date": "2024-12-07",
"count": 1
},
{
"date": "2024-12-09",
"count": 1
},
{
"date": "2024-12-11",
"count": 1
},
{
"date": "2024-12-18",
"count": 1
},
{
"date": "2024-12-21",
"count": 1
},
{
"date": "2024-12-23",
"count": 1
},
{
"date": "2024-12-24",
"count": 2
},
{
"date": "2024-12-26",
"count": 1
},
{
"date": "2024-12-31",
"count": 1
},
{
"date": "2025-01-01",
"count": 1
},
{
"date": "2025-01-03",
"count": 1
},
{
"date": "2025-01-06",
"count": 1
},
{
"date": "2025-01-07",
"count": 1
},
{
"date": "2025-01-08",
"count": 1
},
{
"date": "2025-01-11",
"count": 3
},
{
"date": "2025-01-12",
"count": 1
},
{
"date": "2025-01-19",
"count": 1
},
{
"date": "2025-01-21",
"count": 3
},
{
"date": "2025-01-24",
"count": 1
},
{
"date": "2025-01-31",
"count": 1
},
{
"date": "2025-02-01",
"count": 1
},
{
"date": "2025-02-03",
"count": 1
},
{
"date": "2025-02-04",
"count": 1
},
{
"date": "2025-02-05",
"count": 1
},
{
"date": "2025-02-06",
"count": 1
},
{
"date": "2025-02-12",
"count": 1
},
{
"date": "2025-02-14",
"count": 1
},
{
"date": "2025-02-15",
"count": 2
},
{
"date": "2025-02-19",
"count": 2
},
{
"date": "2025-02-22",
"count": 1
},
{
"date": "2025-02-24",
"count": 2
},
{
"date": "2025-02-27",
"count": 2
},
{
"date": "2025-03-05",
"count": 2
},
{
"date": "2025-03-10",
"count": 1
},
{
"date": "2025-03-16",
"count": 1
},
{
"date": "2025-03-17",
"count": 1
},
{
"date": "2025-03-23",
"count": 1
},
{
"date": "2025-03-25",
"count": 1
},
{
"date": "2025-03-26",
"count": 1
},
{
"date": "2025-04-02",
"count": 1
},
{
"date": "2025-04-07",
"count": 1
},
{
"date": "2025-04-09",
"count": 1
},
{
"date": "2025-04-11",
"count": 2
},
{
"date": "2025-04-12",
"count": 1
},
{
"date": "2025-04-13",
"count": 1
},
{
"date": "2025-04-17",
"count": 1
},
{
"date": "2025-04-19",
"count": 1
},
{
"date": "2025-04-21",
"count": 1
},
{
"date": "2025-04-23",
"count": 1
},
{
"date": "2025-04-29",
"count": 1
},
{
"date": "2025-04-30",
"count": 1
},
{
"date": "2025-05-02",
"count": 15
},
{
"date": "2025-05-03",
"count": 3
},
{
"date": "2025-05-04",
"count": 4
},
{
"date": "2025-05-05",
"count": 2
},
{
"date": "2025-05-06",
"count": 2
},
{
"date": "2025-05-07",
"count": 1
},
{
"date": "2025-05-08",
"count": 1
},
{
"date": "2025-05-09",
"count": 1
},
{
"date": "2025-05-11",
"count": 1
},
{
"date": "2025-05-12",
"count": 1
},
{
"date": "2025-05-15",
"count": 1
},
{
"date": "2025-05-18",
"count": 1
},
{
"date": "2025-05-20",
"count": 1
},
{
"date": "2025-05-21",
"count": 2
},
{
"date": "2025-05-23",
"count": 2
},
{
"date": "2025-05-25",
"count": 1
},
{
"date": "2025-05-26",
"count": 1
},
{
"date": "2025-05-27",
"count": 1
},
{
"date": "2025-05-30",
"count": 3
},
{
"date": "2025-06-01",
"count": 1
},
{
"date": "2025-06-02",
"count": 1
},
{
"date": "2025-06-03",
"count": 1
},
{
"date": "2025-06-04",
"count": 1
},
{
"date": "2025-06-07",
"count": 1
},
{
"date": "2025-06-08",
"count": 1
},
{
"date": "2025-06-09",
"count": 1
},
{
"date": "2025-06-20",
"count": 1
},
{
"date": "2025-06-21",
"count": 1
},
{
"date": "2025-06-23",
"count": 3
},
{
"date": "2025-06-24",
"count": 4
},
{
"date": "2025-06-25",
"count": 2
},
{
"date": "2025-06-26",
"count": 1
},
{
"date": "2025-06-29",
"count": 1
},
{
"date": "2025-06-30",
"count": 1
},
{
"date": "2025-07-01",
"count": 1
},
{
"date": "2025-07-04",
"count": 1
},
{
"date": "2025-07-05",
"count": 1
},
{
"date": "2025-07-06",
"count": 2
},
{
"date": "2025-07-15",
"count": 1
},
{
"date": "2025-07-20",
"count": 2
},
{
"date": "2025-07-21",
"count": 1
},
{
"date": "2025-07-24",
"count": 1
},
{
"date": "2025-07-27",
"count": 1
},
{
"date": "2025-07-31",
"count": 1
},
{
"date": "2025-08-02",
"count": 1
},
{
"date": "2025-08-04",
"count": 1
},
{
"date": "2025-08-08",
"count": 1
},
{
"date": "2025-08-27",
"count": 1
},
{
"date": "2025-08-28",
"count": 1
},
{
"date": "2025-08-30",
"count": 1
},
{
"date": "2025-08-31",
"count": 2
},
{
"date": "2025-09-01",
"count": 1
},
{
"date": "2025-09-09",
"count": 1
},
{
"date": "2025-09-21",
"count": 1
},
{
"date": "2025-09-22",
"count": 1
},
{
"date": "2025-09-26",
"count": 1
},
{
"date": "2025-10-07",
"count": 1
},
{
"date": "2025-10-13",
"count": 1
},
{
"date": "2025-10-14",
"count": 2
},
{
"date": "2025-10-16",
"count": 1
},
{
"date": "2025-10-18",
"count": 2
},
{
"date": "2025-10-19",
"count": 1
},
{
"date": "2025-10-21",
"count": 1
},
{
"date": "2025-10-24",
"count": 1
},
{
"date": "2025-10-26",
"count": 1
},
{
"date": "2025-10-27",
"count": 1
},
{
"date": "2025-11-08",
"count": 1
},
{
"date": "2025-11-12",
"count": 2
},
{
"date": "2025-11-17",
"count": 1
},
{
"date": "2025-11-25",
"count": 1
},
{
"date": "2025-12-05",
"count": 2
},
{
"date": "2025-12-07",
"count": 1
},
{
"date": "2025-12-11",
"count": 1
},
{
"date": "2025-12-14",
"count": 1
},
{
"date": "2026-01-05",
"count": 1
},
{
"date": "2026-01-06",
"count": 1
},
{
"date": "2026-01-20",
"count": 1
},
{
"date": "2026-01-21",
"count": 1
},
{
"date": "2026-01-22",
"count": 1
},
{
"date": "2026-02-07",
"count": 1
},
{
"date": "2026-02-15",
"count": 1
},
{
"date": "2026-02-16",
"count": 1
},
{
"date": "2026-02-18",
"count": 2
},
{
"date": "2026-03-01",
"count": 1
},
{
"date": "2026-03-02",
"count": 1
},
{
"date": "2026-03-04",
"count": 1
},
{
"date": "2026-03-05",
"count": 2
},
{
"date": "2026-03-12",
"count": 1
},
{
"date": "2026-03-17",
"count": 2
},
{
"date": "2026-03-18",
"count": 1
},
{
"date": "2026-03-23",
"count": 1
},
{
"date": "2026-04-03",
"count": 1
},
{
"date": "2026-04-04",
"count": 1
},
{
"date": "2026-04-09",
"count": 1
},
{
"date": "2026-04-24",
"count": 1
},
{
"date": "2026-04-27",
"count": 1
},
{
"date": "2026-05-10",
"count": 1
},
{
"date": "2026-05-23",
"count": 1
},
{
"date": "2026-05-24",
"count": 1
},
{
"date": "2026-06-08",
"count": 1
},
{
"date": "2026-06-11",
"count": 1
},
{
"date": "2026-06-13",
"count": 2
},
{
"date": "2026-06-17",
"count": 1
},
{
"date": "2026-06-18",
"count": 1
},
{
"date": "2026-06-28",
"count": 2
},
{
"date": "2026-06-29",
"count": 1
},
{
"date": "2026-06-30",
"count": 1
},
{
"date": "2026-07-02",
"count": 2
},
{
"date": "2026-07-03",
"count": 1
},
{
"date": "2026-07-05",
"count": 1
},
{
"date": "2026-07-06",
"count": 2
},
{
"date": "2026-07-07",
"count": 3
},
{
"date": "2026-07-10",
"count": 1
},
{
"date": "2026-07-15",
"count": 2
},
{
"date": "2026-07-16",
"count": 1
},
{
"date": "2026-07-18",
"count": 1
}
],
"complete": true,
"collected": 730,
"total_stars": 730
},
"open_issues_and_prs": 10
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": true,
"typecheck_configs": [],
"toolchain_manifests": [
"rust/Cargo.toml"
],
"largest_source_bytes": 466911,
"source_files_sampled": 539,
"oversized_source_files": 9,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"rust/Cargo.toml",
"scripts/requirements.txt"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [
{
"name": "aiohttp",
"direct": false,
"version": "3.13.5",
"severity": "high",
"ecosystem": "pypi",
"cvss_score": 7.5,
"advisory_ids": [
"GHSA-2fqr-mr3j-6wp8",
"GHSA-4fvr-rgm6-gqmc",
"GHSA-4m7w-qmgq-4wj5",
"GHSA-63hw-fmq6-xxg2",
"GHSA-9x8q-7h8h-wcw9",
"GHSA-g3cq-j2xw-wf74",
"GHSA-hg6j-4rv6-33pg",
"GHSA-hpj7-wq8m-9hgp",
"GHSA-jg22-mg44-37j8",
"GHSA-m6qw-4cw2-hm4m"
],
"fixed_version": "3.14.1",
"advisory_count": 22,
"oldest_advisory_days": 49
},
{
"name": "rsa",
"direct": true,
"version": "0.9.10",
"severity": "moderate",
"ecosystem": "crates",
"cvss_score": 5.9,
"advisory_ids": [
"RUSTSEC-2023-0071"
],
"fixed_version": null,
"advisory_count": 1,
"oldest_advisory_days": 972
},
{
"name": "tar",
"direct": true,
"version": "0.4.45",
"severity": "moderate",
"ecosystem": "crates",
"cvss_score": null,
"advisory_ids": [
"GHSA-3pv8-6f4r-ffg2"
],
"fixed_version": "0.4.46",
"advisory_count": 1,
"oldest_advisory_days": 53
},
{
"name": "ml-dsa",
"direct": false,
"version": "0.0.4",
"severity": "moderate",
"ecosystem": "crates",
"cvss_score": 6.4,
"advisory_ids": [
"GHSA-5x2r-hc65-25f9",
"GHSA-h37v-hp6w-2pp8",
"GHSA-hcp2-x6j4-29j7",
"RUSTSEC-2025-0144"
],
"fixed_version": "0.1.0-rc.5",
"advisory_count": 4,
"oldest_advisory_days": 221
},
{
"name": "anyhow",
"direct": true,
"version": "1.0.102",
"severity": "unknown",
"ecosystem": "crates",
"cvss_score": null,
"advisory_ids": [
"RUSTSEC-2026-0190"
],
"fixed_version": "1.0.103",
"advisory_count": 1,
"oldest_advisory_days": 26
}
],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {
"high": 1,
"unknown": 1,
"moderate": 3
},
"advisory_count": 29,
"affected_count": 5,
"assessed_count": 231,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 3
},
"ecosystems": [
"crates",
"pypi"
],
"dependencies": [
{
"name": "anyhow",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.0.102"
},
{
"name": "env_logger",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.11.10"
},
{
"name": "log",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.4.29"
},
{
"name": "once_cell",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.21.4"
},
{
"name": "pgp",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.20.0"
},
{
"name": "rand",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.8"
},
{
"name": "rsa",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.9.10"
},
{
"name": "tar",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.4.45"
},
{
"name": "tempfile",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "3.27.0"
},
{
"name": "zeroize",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1.8.2"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "anyhow",
"direct": true,
"version": "1.0.102",
"ecosystem": "crates"
},
{
"name": "env_logger",
"direct": true,
"version": "0.11.10",
"ecosystem": "crates"
},
{
"name": "log",
"direct": true,
"version": "0.4.29",
"ecosystem": "crates"
},
{
"name": "once_cell",
"direct": true,
"version": "1.21.4",
"ecosystem": "crates"
},
{
"name": "pgp",
"direct": true,
"version": "0.20.0",
"ecosystem": "crates"
},
{
"name": "rand",
"direct": true,
"version": "0.8.6",
"ecosystem": "crates"
},
{
"name": "rsa",
"direct": true,
"version": "0.9.10",
"ecosystem": "crates"
},
{
"name": "tar",
"direct": true,
"version": "0.4.45",
"ecosystem": "crates"
},
{
"name": "tempfile",
"direct": true,
"version": "3.27.0",
"ecosystem": "crates"
},
{
"name": "zeroize",
"direct": true,
"version": "1.8.2",
"ecosystem": "crates"
},
{
"name": "adler2",
"direct": false,
"version": "2.0.1",
"ecosystem": "crates"
},
{
"name": "aead",
"direct": false,
"version": "0.5.2",
"ecosystem": "crates"
},
{
"name": "aes",
"direct": false,
"version": "0.8.4",
"ecosystem": "crates"
},
{
"name": "aes-gcm",
"direct": false,
"version": "0.10.3",
"ecosystem": "crates"
},
{
"name": "aes-kw",
"direct": false,
"version": "0.2.1",
"ecosystem": "crates"
},
{
"name": "aho-corasick",
"direct": false,
"version": "1.1.4",
"ecosystem": "crates"
},
{
"name": "anstream",
"direct": false,
"version": "1.0.0",
"ecosystem": "crates"
},
{
"name": "anstyle",
"direct": false,
"version": "1.0.14",
"ecosystem": "crates"
},
{
"name": "anstyle-parse",
"direct": false,
"version": "1.0.0",
"ecosystem": "crates"
},
{
"name": "anstyle-query",
"direct": false,
"version": "1.1.5",
"ecosystem": "crates"
},
{
"name": "anstyle-wincon",
"direct": false,
"version": "3.0.11",
"ecosystem": "crates"
},
{
"name": "argon2",
"direct": false,
"version": "0.5.3",
"ecosystem": "crates"
},
{
"name": "autocfg",
"direct": false,
"version": "1.5.0",
"ecosystem": "crates"
},
{
"name": "base16ct",
"direct": false,
"version": "0.2.0",
"ecosystem": "crates"
},
{
"name": "base64",
"direct": false,
"version": "0.22.1",
"ecosystem": "crates"
},
{
"name": "base64ct",
"direct": false,
"version": "1.8.3",
"ecosystem": "crates"
},
{
"name": "bitfields",
"direct": false,
"version": "1.0.3",
"ecosystem": "crates"
},
{
"name": "bitfields-impl",
"direct": false,
"version": "1.0.3",
"ecosystem": "crates"
},
{
"name": "bitflags",
"direct": false,
"version": "2.11.1",
"ecosystem": "crates"
},
{
"name": "bitvec",
"direct": false,
"version": "1.0.1",
"ecosystem": "crates"
},
{
"name": "blake2",
"direct": false,
"version": "0.10.6",
"ecosystem": "crates"
},
{
"name": "block-buffer",
"direct": false,
"version": "0.10.4",
"ecosystem": "crates"
},
{
"name": "block-padding",
"direct": false,
"version": "0.3.3",
"ecosystem": "crates"
},
{
"name": "blowfish",
"direct": false,
"version": "0.9.1",
"ecosystem": "crates"
},
{
"name": "buffer-redux",
"direct": false,
"version": "1.1.0",
"ecosystem": "crates"
},
{
"name": "byteorder",
"direct": false,
"version": "1.5.0",
"ecosystem": "crates"
},
{
"name": "bytes",
"direct": false,
"version": "1.11.1",
"ecosystem": "crates"
},
{
"name": "bzip2",
"direct": false,
"version": "0.6.1",
"ecosystem": "crates"
},
{
"name": "camellia",
"direct": false,
"version": "0.1.0",
"ecosystem": "crates"
},
{
"name": "cast5",
"direct": false,
"version": "0.11.1",
"ecosystem": "crates"
},
{
"name": "cbindgen",
"direct": false,
"version": "0.29.2",
"ecosystem": "crates"
},
{
"name": "cfb-mode",
"direct": false,
"version": "0.8.2",
"ecosystem": "crates"
},
{
"name": "cfg-if",
"direct": false,
"version": "1.0.4",
"ecosystem": "crates"
},
{
"name": "cipher",
"direct": false,
"version": "0.4.4",
"ecosystem": "crates"
},
{
"name": "clap",
"direct": false,
"version": "4.6.1",
"ecosystem": "crates"
},
{
"name": "clap_builder",
"direct": false,
"version": "4.6.0",
"ecosystem": "crates"
},
{
"name": "clap_lex",
"direct": false,
"version": "1.1.0",
"ecosystem": "crates"
},
{
"name": "cmac",
"direct": false,
"version": "0.7.2",
"ecosystem": "crates"
},
{
"name": "colorchoice",
"direct": false,
"version": "1.0.5",
"ecosystem": "crates"
},
{
"name": "const-oid",
"direct": false,
"version": "0.9.6",
"ecosystem": "crates"
},
{
"name": "convert_case",
"direct": false,
"version": "0.10.0",
"ecosystem": "crates"
},
{
"name": "cpufeatures",
"direct": false,
"version": "0.2.17",
"ecosystem": "crates"
},
{
"name": "crc24",
"direct": false,
"version": "0.1.6",
"ecosystem": "crates"
},
{
"name": "crypto-bigint",
"direct": false,
"version": "0.5.5",
"ecosystem": "crates"
},
{
"name": "crypto-common",
"direct": false,
"version": "0.1.7",
"ecosystem": "crates"
},
{
"name": "ctr",
"direct": false,
"version": "0.9.2",
"ecosystem": "crates"
},
{
"name": "curve25519-dalek",
"direct": false,
"version": "4.1.3",
"ecosystem": "crates"
},
{
"name": "curve25519-dalek-derive",
"direct": false,
"version": "0.1.1",
"ecosystem": "crates"
},
{
"name": "cx448",
"direct": false,
"version": "0.1.1",
"ecosystem": "crates"
},
{
"name": "darling",
"direct": false,
"version": "0.20.11",
"ecosystem": "crates"
},
{
"name": "darling_core",
"direct": false,
"version": "0.20.11",
"ecosystem": "crates"
},
{
"name": "darling_macro",
"direct": false,
"version": "0.20.11",
"ecosystem": "crates"
},
{
"name": "dbl",
"direct": false,
"version": "0.3.2",
"ecosystem": "crates"
},
{
"name": "der",
"direct": false,
"version": "0.7.10",
"ecosystem": "crates"
},
{
"name": "derive_builder",
"direct": false,
"version": "0.20.2",
"ecosystem": "crates"
},
{
"name": "derive_builder_core",
"direct": false,
"version": "0.20.2",
"ecosystem": "crates"
},
{
"name": "derive_builder_macro",
"direct": false,
"version": "0.20.2",
"ecosystem": "crates"
},
{
"name": "derive_more",
"direct": false,
"version": "2.1.1",
"ecosystem": "crates"
},
{
"name": "derive_more-impl",
"direct": false,
"version": "2.1.1",
"ecosystem": "crates"
},
{
"name": "des",
"direct": false,
"version": "0.8.1",
"ecosystem": "crates"
},
{
"name": "digest",
"direct": false,
"version": "0.10.7",
"ecosystem": "crates"
},
{
"name": "dsa",
"direct": false,
"version": "0.6.3",
"ecosystem": "crates"
},
{
"name": "eax",
"direct": false,
"version": "0.5.0",
"ecosystem": "crates"
},
{
"name": "ecdsa",
"direct": false,
"version": "0.16.9",
"ecosystem": "crates"
},
{
"name": "ed25519",
"direct": false,
"version": "2.2.3",
"ecosystem": "crates"
},
{
"name": "ed25519-dalek",
"direct": false,
"version": "2.2.0",
"ecosystem": "crates"
},
{
"name": "elliptic-curve",
"direct": false,
"version": "0.13.8",
"ecosystem": "crates"
},
{
"name": "env_filter",
"direct": false,
"version": "1.0.1",
"ecosystem": "crates"
},
{
"name": "equivalent",
"direct": false,
"version": "1.0.2",
"ecosystem": "crates"
},
{
"name": "errno",
"direct": false,
"version": "0.3.14",
"ecosystem": "crates"
},
{
"name": "fastrand",
"direct": false,
"version": "2.4.1",
"ecosystem": "crates"
},
{
"name": "ff",
"direct": false,
"version": "0.13.1",
"ecosystem": "crates"
},
{
"name": "fiat-crypto",
"direct": false,
"version": "0.2.9",
"ecosystem": "crates"
},
{
"name": "filetime",
"direct": false,
"version": "0.2.28",
"ecosystem": "crates"
},
{
"name": "flate2",
"direct": false,
"version": "1.1.9",
"ecosystem": "crates"
},
{
"name": "fnv",
"direct": false,
"version": "1.0.7",
"ecosystem": "crates"
},
{
"name": "foldhash",
"direct": false,
"version": "0.1.5",
"ecosystem": "crates"
},
{
"name": "funty",
"direct": false,
"version": "2.0.0",
"ecosystem": "crates"
},
{
"name": "generic-array",
"direct": false,
"version": "0.14.7",
"ecosystem": "crates"
},
{
"name": "getrandom",
"direct": false,
"version": "0.2.17",
"ecosystem": "crates"
},
{
"name": "getrandom",
"direct": false,
"version": "0.4.2",
"ecosystem": "crates"
},
{
"name": "ghash",
"direct": false,
"version": "0.5.1",
"ecosystem": "crates"
},
{
"name": "group",
"direct": false,
"version": "0.13.0",
"ecosystem": "crates"
},
{
"name": "hashbrown",
"direct": false,
"version": "0.15.5",
"ecosystem": "crates"
},
{
"name": "hashbrown",
"direct": false,
"version": "0.17.1",
"ecosystem": "crates"
},
{
"name": "heck",
"direct": false,
"version": "0.5.0",
"ecosystem": "crates"
},
{
"name": "hex",
"direct": false,
"version": "0.4.3",
"ecosystem": "crates"
},
{
"name": "hkdf",
"direct": false,
"version": "0.12.4",
"ecosystem": "crates"
},
{
"name": "hmac",
"direct": false,
"version": "0.12.1",
"ecosystem": "crates"
},
{
"name": "hybrid-array",
"direct": false,
"version": "0.2.3",
"ecosystem": "crates"
},
{
"name": "hybrid-array",
"direct": false,
"version": "0.3.1",
"ecosystem": "crates"
},
{
"name": "id-arena",
"direct": false,
"version": "2.3.0",
"ecosystem": "crates"
},
{
"name": "idea",
"direct": false,
"version": "0.5.1",
"ecosystem": "crates"
},
{
"name": "ident_case",
"direct": false,
"version": "1.0.1",
"ecosystem": "crates"
},
{
"name": "indexmap",
"direct": false,
"version": "2.14.0",
"ecosystem": "crates"
},
{
"name": "inout",
"direct": false,
"version": "0.1.4",
"ecosystem": "crates"
},
{
"name": "is_terminal_polyfill",
"direct": false,
"version": "1.70.2",
"ecosystem": "crates"
},
{
"name": "itoa",
"direct": false,
"version": "1.0.18",
"ecosystem": "crates"
},
{
"name": "jiff",
"direct": false,
"version": "0.2.24",
"ecosystem": "crates"
},
{
"name": "jiff-static",
"direct": false,
"version": "0.2.24",
"ecosystem": "crates"
},
{
"name": "k256",
"direct": false,
"version": "0.13.4",
"ecosystem": "crates"
},
{
"name": "keccak",
"direct": false,
"version": "0.1.6",
"ecosystem": "crates"
},
{
"name": "kem",
"direct": false,
"version": "0.3.0-pre.0",
"ecosystem": "crates"
},
{
"name": "lazy_static",
"direct": false,
"version": "1.5.0",
"ecosystem": "crates"
},
{
"name": "leb128fmt",
"direct": false,
"version": "0.1.0",
"ecosystem": "crates"
},
{
"name": "libbz2-rs-sys",
"direct": false,
"version": "0.2.3",
"ecosystem": "crates"
},
{
"name": "libc",
"direct": false,
"version": "0.2.186",
"ecosystem": "crates"
},
{
"name": "libm",
"direct": false,
"version": "0.2.16",
"ecosystem": "crates"
},
{
"name": "linux-raw-sys",
"direct": false,
"version": "0.12.1",
"ecosystem": "crates"
},
{
"name": "md-5",
"direct": false,
"version": "0.10.6",
"ecosystem": "crates"
},
{
"name": "memchr",
"direct": false,
"version": "2.8.0",
"ecosystem": "crates"
},
{
"name": "miniz_oxide",
"direct": false,
"version": "0.8.9",
"ecosystem": "crates"
},
{
"name": "ml-dsa",
"direct": false,
"version": "0.0.4",
"ecosystem": "crates"
},
{
"name": "ml-kem",
"direct": false,
"version": "0.2.3",
"ecosystem": "crates"
},
{
"name": "nom",
"direct": false,
"version": "8.0.0",
"ecosystem": "crates"
},
{
"name": "num-bigint-dig",
"direct": false,
"version": "0.8.6",
"ecosystem": "crates"
},
{
"name": "num-integer",
"direct": false,
"version": "0.1.46",
"ecosystem": "crates"
},
{
"name": "num-iter",
"direct": false,
"version": "0.1.45",
"ecosystem": "crates"
},
{
"name": "num-traits",
"direct": false,
"version": "0.2.19",
"ecosystem": "crates"
},
{
"name": "num_enum",
"direct": false,
"version": "0.7.6",
"ecosystem": "crates"
},
{
"name": "num_enum_derive",
"direct": false,
"version": "0.7.6",
"ecosystem": "crates"
},
{
"name": "ocb3",
"direct": false,
"version": "0.1.0",
"ecosystem": "crates"
},
{
"name": "once_cell_polyfill",
"direct": false,
"version": "1.70.2",
"ecosystem": "crates"
},
{
"name": "opaque-debug",
"direct": false,
"version": "0.3.1",
"ecosystem": "crates"
},
{
"name": "p256",
"direct": false,
"version": "0.13.2",
"ecosystem": "crates"
},
{
"name": "p384",
"direct": false,
"version": "0.13.1",
"ecosystem": "crates"
},
{
"name": "p521",
"direct": false,
"version": "0.13.3",
"ecosystem": "crates"
},
{
"name": "password-hash",
"direct": false,
"version": "0.5.0",
"ecosystem": "crates"
},
{
"name": "pem-rfc7468",
"direct": false,
"version": "0.7.0",
"ecosystem": "crates"
},
{
"name": "pkcs1",
"direct": false,
"version": "0.7.5",
"ecosystem": "crates"
},
{
"name": "pkcs8",
"direct": false,
"version": "0.10.2",
"ecosystem": "crates"
},
{
"name": "polyval",
"direct": false,
"version": "0.6.2",
"ecosystem": "crates"
},
{
"name": "portable-atomic",
"direct": false,
"version": "1.13.1",
"ecosystem": "crates"
},
{
"name": "portable-atomic-util",
"direct": false,
"version": "0.2.7",
"ecosystem": "crates"
},
{
"name": "ppv-lite86",
"direct": false,
"version": "0.2.21",
"ecosystem": "crates"
},
{
"name": "prettyplease",
"direct": false,
"version": "0.2.37",
"ecosystem": "crates"
},
{
"name": "primeorder",
"direct": false,
"version": "0.13.6",
"ecosystem": "crates"
},
{
"name": "proc-macro2",
"direct": false,
"version": "1.0.106",
"ecosystem": "crates"
},
{
"name": "quote",
"direct": false,
"version": "1.0.45",
"ecosystem": "crates"
},
{
"name": "r-efi",
"direct": false,
"version": "6.0.0",
"ecosystem": "crates"
},
{
"name": "radium",
"direct": false,
"version": "0.7.0",
"ecosystem": "crates"
},
{
"name": "rand_chacha",
"direct": false,
"version": "0.3.1",
"ecosystem": "crates"
},
{
"name": "rand_core",
"direct": false,
"version": "0.6.4",
"ecosystem": "crates"
},
{
"name": "regex",
"direct": false,
"version": "1.12.3",
"ecosystem": "crates"
},
{
"name": "regex-automata",
"direct": false,
"version": "0.4.14",
"ecosystem": "crates"
},
{
"name": "regex-syntax",
"direct": false,
"version": "0.8.10",
"ecosystem": "crates"
},
{
"name": "replace_with",
"direct": false,
"version": "0.1.8",
"ecosystem": "crates"
},
{
"name": "rfc6979",
"direct": false,
"version": "0.4.0",
"ecosystem": "crates"
},
{
"name": "ripemd",
"direct": false,
"version": "0.1.3",
"ecosystem": "crates"
},
{
"name": "rustc_version",
"direct": false,
"version": "0.4.1",
"ecosystem": "crates"
},
{
"name": "rustix",
"direct": false,
"version": "1.1.4",
"ecosystem": "crates"
},
{
"name": "rustversion",
"direct": false,
"version": "1.0.22",
"ecosystem": "crates"
},
{
"name": "sec1",
"direct": false,
"version": "0.7.3",
"ecosystem": "crates"
},
{
"name": "semver",
"direct": false,
"version": "1.0.28",
"ecosystem": "crates"
},
{
"name": "serde",
"direct": false,
"version": "1.0.228",
"ecosystem": "crates"
},
{
"name": "serde_core",
"direct": false,
"version": "1.0.228",
"ecosystem": "crates"
},
{
"name": "serde_derive",
"direct": false,
"version": "1.0.228",
"ecosystem": "crates"
},
{
"name": "serde_json",
"direct": false,
"version": "1.0.149",
"ecosystem": "crates"
},
{
"name": "serde_spanned",
"direct": false,
"version": "1.1.1",
"ecosystem": "crates"
},
{
"name": "serdect",
"direct": false,
"version": "0.2.0",
"ecosystem": "crates"
},
{
"name": "serdect",
"direct": false,
"version": "0.3.0",
"ecosystem": "crates"
},
{
"name": "sha1",
"direct": false,
"version": "0.10.6",
"ecosystem": "crates"
},
{
"name": "sha1-checked",
"direct": false,
"version": "0.10.0",
"ecosystem": "crates"
},
{
"name": "sha2",
"direct": false,
"version": "0.10.9",
"ecosystem": "crates"
},
{
"name": "sha3",
"direct": false,
"version": "0.10.9",
"ecosystem": "crates"
},
{
"name": "signature",
"direct": false,
"version": "2.2.0",
"ecosystem": "crates"
},
{
"name": "simd-adler32",
"direct": false,
"version": "0.3.9",
"ecosystem": "crates"
},
{
"name": "slh-dsa",
"direct": false,
"version": "0.0.3",
"ecosystem": "crates"
},
{
"name": "smallvec",
"direct": false,
"version": "1.15.1",
"ecosystem": "crates"
},
{
"name": "snafu",
"direct": false,
"version": "0.9.1",
"ecosystem": "crates"
},
{
"name": "snafu-derive",
"direct": false,
"version": "0.9.1",
"ecosystem": "crates"
},
{
"name": "spin",
"direct": false,
"version": "0.9.8",
"ecosystem": "crates"
},
{
"name": "spki",
"direct": false,
"version": "0.7.3",
"ecosystem": "crates"
},
{
"name": "strsim",
"direct": false,
"version": "0.11.1",
"ecosystem": "crates"
},
{
"name": "subtle",
"direct": false,
"version": "2.6.1",
"ecosystem": "crates"
},
{
"name": "syn",
"direct": false,
"version": "2.0.117",
"ecosystem": "crates"
},
{
"name": "tap",
"direct": false,
"version": "1.0.1",
"ecosystem": "crates"
},
{
"name": "thiserror",
"direct": false,
"version": "2.0.18",
"ecosystem": "crates"
},
{
"name": "thiserror-impl",
"direct": false,
"version": "2.0.18",
"ecosystem": "crates"
},
{
"name": "toml",
"direct": false,
"version": "0.9.12+spec-1.1.0",
"ecosystem": "crates"
},
{
"name": "toml_datetime",
"direct": false,
"version": "0.7.5+spec-1.1.0",
"ecosystem": "crates"
},
{
"name": "toml_parser",
"direct": false,
"version": "1.1.2+spec-1.1.0",
"ecosystem": "crates"
},
{
"name": "toml_writer",
"direct": false,
"version": "1.1.1+spec-1.1.0",
"ecosystem": "crates"
},
{
"name": "twofish",
"direct": false,
"version": "0.7.1",
"ecosystem": "crates"
},
{
"name": "typenum",
"direct": false,
"version": "1.20.0",
"ecosystem": "crates"
},
{
"name": "unicode-ident",
"direct": false,
"version": "1.0.24",
"ecosystem": "crates"
},
{
"name": "unicode-segmentation",
"direct": false,
"version": "1.13.2",
"ecosystem": "crates"
},
{
"name": "unicode-xid",
"direct": false,
"version": "0.2.6",
"ecosystem": "crates"
},
{
"name": "universal-hash",
"direct": false,
"version": "0.5.1",
"ecosystem": "crates"
},
{
"name": "utf8parse",
"direct": false,
"version": "0.2.2",
"ecosystem": "crates"
},
{
"name": "version_check",
"direct": false,
"version": "0.9.5",
"ecosystem": "crates"
},
{
"name": "wasi",
"direct": false,
"version": "0.11.1+wasi-snapshot-preview1",
"ecosystem": "crates"
},
{
"name": "wasip2",
"direct": false,
"version": "1.0.3+wasi-0.2.9",
"ecosystem": "crates"
},
{
"name": "wasip3",
"direct": false,
"version": "0.4.0+wasi-0.3.0-rc-2026-01-06",
"ecosystem": "crates"
},
{
"name": "wasm-encoder",
"direct": false,
"version": "0.244.0",
"ecosystem": "crates"
},
{
"name": "wasm-metadata",
"direct": false,
"version": "0.244.0",
"ecosystem": "crates"
},
{
"name": "wasmparser",
"direct": false,
"version": "0.244.0",
"ecosystem": "crates"
},
{
"name": "windows-link",
"direct": false,
"version": "0.2.1",
"ecosystem": "crates"
},
{
"name": "windows-sys",
"direct": false,
"version": "0.61.2",
"ecosystem": "crates"
},
{
"name": "winnow",
"direct": false,
"version": "0.7.15",
"ecosystem": "crates"
},
{
"name": "winnow",
"direct": false,
"version": "1.0.2",
"ecosystem": "crates"
},
{
"name": "wit-bindgen",
"direct": false,
"version": "0.51.0",
"ecosystem": "crates"
},
{
"name": "wit-bindgen",
"direct": false,
"version": "0.57.1",
"ecosystem": "crates"
},
{
"name": "wit-bindgen-core",
"direct": false,
"version": "0.51.0",
"ecosystem": "crates"
},
{
"name": "wit-bindgen-rust",
"direct": false,
"version": "0.51.0",
"ecosystem": "crates"
},
{
"name": "wit-bindgen-rust-macro",
"direct": false,
"version": "0.51.0",
"ecosystem": "crates"
},
{
"name": "wit-component",
"direct": false,
"version": "0.244.0",
"ecosystem": "crates"
},
{
"name": "wit-parser",
"direct": false,
"version": "0.244.0",
"ecosystem": "crates"
},
{
"name": "wyz",
"direct": false,
"version": "0.5.1",
"ecosystem": "crates"
},
{
"name": "x25519-dalek",
"direct": false,
"version": "2.0.1",
"ecosystem": "crates"
},
{
"name": "xattr",
"direct": false,
"version": "1.6.1",
"ecosystem": "crates"
},
{
"name": "zerocopy",
"direct": false,
"version": "0.7.35",
"ecosystem": "crates"
},
{
"name": "zerocopy",
"direct": false,
"version": "0.8.48",
"ecosystem": "crates"
},
{
"name": "zerocopy-derive",
"direct": false,
"version": "0.7.35",
"ecosystem": "crates"
},
{
"name": "zerocopy-derive",
"direct": false,
"version": "0.8.48",
"ecosystem": "crates"
},
{
"name": "zeroize_derive",
"direct": false,
"version": "1.4.3",
"ecosystem": "crates"
},
{
"name": "zlib-rs",
"direct": false,
"version": "0.6.3",
"ecosystem": "crates"
},
{
"name": "zmij",
"direct": false,
"version": "1.0.21",
"ecosystem": "crates"
},
{
"name": "aiohttp",
"direct": false,
"version": "3.13.5",
"ecosystem": "pypi"
},
{
"name": "pyyaml",
"direct": false,
"version": "6.0.3",
"ecosystem": "pypi"
},
{
"name": "tomlkit",
"direct": false,
"version": "0.14.0",
"ecosystem": "pypi"
}
],
"collected": true,
"truncated": false,
"total_count": 231,
"direct_count": 10,
"indirect_count": 221
}
},
"maintainership": {
"issues": {
"open_prs": 2,
"merged_prs": 66,
"open_issues": 8,
"closed_ratio": 0.953,
"closed_issues": 163,
"closed_unmerged_prs": 10
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "saturneric",
"commits": 2941,
"avatar_url": "https://avatars.githubusercontent.com/u/20257134?v=4"
},
{
"type": "User",
"login": "AnthonyLloydDotNet",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/95452531?v=4"
},
{
"type": "User",
"login": "jermanuts",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/109705802?v=4"
},
{
"type": "User",
"login": "CDmking",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/95959972?v=4"
},
{
"type": "User",
"login": "MusingZone",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/62183386?v=4"
},
{
"type": "User",
"login": "strannick-ru",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/18719896?v=4"
},
{
"type": "User",
"login": "razzeee",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/5943908?v=4"
},
{
"type": "User",
"login": "x86txt",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/34278354?v=4"
}
],
"contributors_sampled": 8,
"top_contributor_share": 0.994
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"build.yml",
"codeql-analysis.yml",
"mas-sandbox.yml",
"release-qt5.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": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10",
"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": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 10,
"reason": "SAST tool detected: CodeQL",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 6,
"reason": "4 out of the last 5 releases have a total of 4 signed artifacts.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "17 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "314582b330c8974a5b85aaae7ec7182664de717e",
"ran_at": "2026-07-22T02:55:06Z",
"aggregate_score": 5.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": true,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-21T20:34:31Z",
"oldest_open_prs": [
{
"number": 253,
"created_at": "2026-05-29T21:44:01Z",
"last_comment_at": "2026-05-29T21:47:46Z",
"last_comment_author": "codacy-production"
},
{
"number": 257,
"created_at": "2026-06-17T12:30:24Z",
"last_comment_at": "2026-06-17T12:31:29Z",
"last_comment_author": "codacy-production"
}
],
"last_merged_pr_at": "2026-04-14T17:03:11Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 204,
"created_at": "2025-03-08T20:02:03Z",
"last_comment_at": "2025-06-09T12:26:46Z",
"last_comment_author": "dnsppv"
},
{
"number": 224,
"created_at": "2025-06-20T17:54:43Z",
"last_comment_at": "2025-06-21T21:12:04Z",
"last_comment_author": "saturneric"
},
{
"number": 225,
"created_at": "2025-06-20T22:17:30Z",
"last_comment_at": "2025-10-09T13:31:03Z",
"last_comment_author": "jbar"
},
{
"number": 232,
"created_at": "2025-08-25T21:38:12Z",
"last_comment_at": "2026-04-10T16:37:41Z",
"last_comment_author": "saturneric"
},
{
"number": 259,
"created_at": "2026-06-29T12:55:30Z",
"last_comment_at": "2026-07-21T19:45:26Z",
"last_comment_author": "marcos-morar"
},
{
"number": 260,
"created_at": "2026-07-01T08:44:31Z",
"last_comment_at": "2026-07-13T14:53:21Z",
"last_comment_author": "saturneric"
},
{
"number": 261,
"created_at": "2026-07-08T01:22:29Z",
"last_comment_at": "2026-07-08T06:48:17Z",
"last_comment_author": "saturneric"
},
{
"number": 263,
"created_at": "2026-07-15T19:16:38Z",
"last_comment_at": "2026-07-19T18:56:42Z",
"last_comment_author": "saturneric"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/saturneric/GpgFrontend",
"host": "github.com",
"name": "GpgFrontend",
"owner": "saturneric"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": "High-Risk Jurisdiction Policy applies a 50% multiplier to weighted overall health and gives it an At risk ceiling of 49.",
"notes": [
{
"code": "jurisdiction_overall_adjustment",
"params": {
"cap": 49,
"pct": 50
}
}
],
"value": 30,
"inputs": {
"security": 34,
"vitality": 85,
"community": 59,
"governance": 49,
"engineering": 62,
"high_risk_jurisdiction_cap": 49,
"high_risk_jurisdiction_multiplier": 50,
"weighted_overall_before_jurisdiction": 59,
"overall_after_jurisdiction_multiplier": 30
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 85,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 82,
"inputs": {
"commits_last_year": 956,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 26
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "26/52 weeks with commits",
"points": 18,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 26
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "956 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 956
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 89,
"inputs": {
"releases_count": 39,
"latest_release_tag": "nightly",
"releases_from_tags": false,
"days_since_latest_release": 1,
"mean_days_between_releases": 66
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "39 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 39
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 1 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 1
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~66 days",
"points": 19.8,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 66
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "4 out of the last 5 releases have a total of 4 signed artifacts.",
"points": 6,
"status": "partial",
"details": [],
"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": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 59,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"forks": 62,
"stars": 730,
"watchers": 8,
"growth_state": "organic",
"growth_factor_pct": 100
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "730 stars",
"points": 46.4,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 730
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "62 forks",
"points": 14.9,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 62
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "8 watchers",
"points": 4.7,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 8
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (GPL-3.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "GPL-3.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 49,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 8,
"top_contributor_share": 0.994
},
"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 99% of commits",
"points": 0.1,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 99
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "8 contributors",
"points": 10.8,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 8
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"merged_prs": 66,
"open_issues": 8,
"closed_issues": 163,
"issue_closed_ratio": 0.953,
"closed_unmerged_prs": 10
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "95% of issues closed",
"points": 44.6,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 95
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "66/76 decided PRs merged",
"points": 33.2,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 66,
"decided": 76
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 54,
"inputs": {
"followers": 46,
"owner_type": "User",
"is_verified": null,
"owner_login": "saturneric",
"public_repos": 18,
"account_age_days": 3671
},
"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": "46 followers of saturneric",
"points": 12,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 46,
"login": "saturneric"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "18 public repos, account ~10 yr old",
"points": 21.3,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 18
}
},
{
"code": "account_age_years",
"params": {
"years": 10
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 62,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "4 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 4
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"topics": [
"openpgp",
"gpg",
"crypto",
"decrypt",
"encrypt",
"security",
"security-tools",
"signature-verification",
"digital-signature",
"rust",
"signature",
"cpp"
],
"has_wiki": false,
"homepage": "https://gpgfrontend.bktus.com",
"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": "https://gpgfrontend.bktus.com",
"points": 15,
"status": "met",
"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": "12 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 12
}
}
],
"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": "at_risk",
"name": "Security",
"value": 34,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized. High-Risk Jurisdiction Policy applies a 50% multiplier to Security posture and gives it an At risk ceiling of 49.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "jurisdiction_posture_adjustment",
"params": {
"cap": 49,
"pct": 50
}
}
],
"value": 26,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 5.1,
"high_risk_jurisdiction_cap": 49,
"high_risk_jurisdiction_multiplier": 50,
"security_posture_after_multiplier": 26,
"security_posture_before_jurisdiction": 51
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"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": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool detected: CodeQL",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "4 out of the last 5 releases have a total of 4 signed artifacts.",
"points": 4.5,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "17 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "moderate",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 231 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 231
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 68,
"inputs": {
"source": "osv",
"advisories": 29,
"affected_packages": 5,
"assessed_packages": 231,
"unassessed_packages": 0,
"affected_by_severity": "high 1, moderate 3, unknown 1",
"direct_affected_packages": 3
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "3 affected: rsa 0.9.10 (moderate 5.9), tar 0.4.45 (moderate), anyhow 1.0.102 (unknown)",
"points": 16.1,
"status": "partial",
"details": [
{
"code": "advisories_affected",
"params": {
"count": 3,
"packages": "rsa 0.9.10 (moderate 5.9), tar 0.4.45 (moderate), anyhow 1.0.102 (unknown)"
}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "1 advisory-carrying package(s) unaddressed past 90 days; oldest published 972 days ago",
"points": 34.9,
"status": "partial",
"details": [
{
"code": "advisories_stale",
"params": {
"days": 90,
"count": 1,
"oldest": 972
}
}
],
"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": 231,
"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": "moderate",
"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": 50,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": true,
"exposures": [
{
"role": "top_contributor",
"count": 1,
"country": "Russia"
}
],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 9
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "Russia: top_contributor (1)",
"points": 50,
"status": "partial",
"details": [
{
"code": "jurisdiction_exposure",
"params": {
"role": "top_contributor",
"count": 1,
"country": "Russia"
}
}
],
"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": 60,
"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": 1,
"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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"Cargo.lock"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": true,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"rust/Cargo.toml"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "rust/Cargo.toml (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "rust/Cargo.toml"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"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": "C++ (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C++"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "devcontainer, Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "devcontainer, Dockerfile, 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": "dependency automation configured, none observed in the sampled commits",
"points": 5,
"status": "partial",
"details": [
{
"code": "dependency_bot_config_only",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"primary_language": "C++",
"largest_source_bytes": 466911,
"source_files_sampled": 539,
"oversized_source_files": 9
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "C++ (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C++"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "9/539 source files over 60KB",
"points": 54.1,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 539,
"oversized": 9
}
}
],
"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": [
"Could not fetch crates package 'gf-rust' from its registry"
],
"report_type": "repository",
"generated_at": "2026-07-22T02:55:14.146863Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/saturneric/GpgFrontend.svg",
"full_name": "saturneric/GpgFrontend",
"license_state": "standard",
"license_spdx": "GPL-3.0"
}