JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"vnote",
"vim",
"markdown",
"note-taking",
"note",
"editor",
"uml",
"mathjax"
],
"is_fork": false,
"size_kb": 73378,
"has_wiki": true,
"homepage": "https://app.vnote.fun",
"languages": {
"C": 5591,
"C++": 5204406,
"CSS": 221682,
"HTML": 29963,
"CMake": 135474,
"Shell": 4892,
"Python": 2369,
"Batchfile": 1674,
"JavaScript": 1547201,
"PowerShell": 18588,
"Rich Text Format": 18666
},
"pushed_at": "2026-07-21T14:48:00Z",
"created_at": "2016-10-05T07:24:54Z",
"owner_type": "Organization",
"updated_at": "2026-07-21T14:38:10Z",
"description": "A pleasant note-taking platform in native C++.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "LGPL-3.0",
"default_branch": "master",
"license_spdx_raw": "LGPL-3.0",
"primary_language": "C++",
"significant_languages": [
"C++",
"JavaScript"
]
},
"owner": {
"blog": null,
"name": "VNoteX",
"type": "Organization",
"login": "vnotex",
"company": null,
"location": "Beijing, China",
"followers": 98,
"avatar_url": "https://avatars.githubusercontent.com/u/48284031?v=4",
"created_at": "2019-03-06T12:37:13Z",
"is_verified": null,
"public_repos": 21,
"account_age_days": 2694
},
"license": {
"state": "standard",
"spdx_id": "LGPL-3.0",
"raw_spdx": "LGPL-3.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "continuous-build",
"kind": "other",
"published_at": "2020-12-05T05:19:49Z"
},
{
"tag": "v4.2.0",
"kind": "minor",
"published_at": "2026-07-16T01:48:45Z"
},
{
"tag": "v4.1.1",
"kind": "patch",
"published_at": "2026-07-08T11:48:08Z"
},
{
"tag": "v4.1.0",
"kind": "minor",
"published_at": "2026-06-29T10:28:59Z"
},
{
"tag": "v3.20.1",
"kind": "patch",
"published_at": "2025-11-26T13:41:18Z"
},
{
"tag": "v3.20.0",
"kind": "minor",
"published_at": "2025-10-23T15:27:39Z"
},
{
"tag": "v3.19.2",
"kind": "patch",
"published_at": "2025-05-16T07:39:54Z"
},
{
"tag": "v3.19.1",
"kind": "patch",
"published_at": "2025-04-18T02:39:53Z"
},
{
"tag": "v3.19.0",
"kind": "minor",
"published_at": "2025-04-15T03:06:05Z"
},
{
"tag": "v3.18.2",
"kind": "patch",
"published_at": "2024-08-06T14:48:07Z"
},
{
"tag": "v3.18.1",
"kind": "patch",
"published_at": "2024-07-10T14:58:58Z"
},
{
"tag": "v3.18.0",
"kind": "minor",
"published_at": "2024-07-01T15:54:08Z"
},
{
"tag": "v3.17.0",
"kind": "minor",
"published_at": "2023-08-27T15:52:34Z"
},
{
"tag": "v3.16.0",
"kind": "minor",
"published_at": "2022-12-30T13:34:29Z"
},
{
"tag": "v3.15.1",
"kind": "patch",
"published_at": "2022-10-04T14:10:38Z"
},
{
"tag": "v3.15.0",
"kind": "minor",
"published_at": "2022-08-27T01:26:15Z"
},
{
"tag": "v3.14.0",
"kind": "minor",
"published_at": "2022-08-02T13:48:52Z"
},
{
"tag": "v3.13.1",
"kind": "patch",
"published_at": "2022-06-19T09:06:50Z"
},
{
"tag": "v3.13.0",
"kind": "minor",
"published_at": "2022-04-03T12:25:36Z"
},
{
"tag": "v3.12.888",
"kind": "patch",
"published_at": "2022-01-31T01:57:32Z"
},
{
"tag": "v3.12.0",
"kind": "minor",
"published_at": "2022-01-19T09:37:35Z"
},
{
"tag": "v3.11.0",
"kind": "minor",
"published_at": "2021-12-25T02:26:38Z"
},
{
"tag": "v3.10.1",
"kind": "patch",
"published_at": "2021-11-17T13:22:17Z"
},
{
"tag": "v3.10.0",
"kind": "minor",
"published_at": "2021-11-13T10:08:57Z"
},
{
"tag": "v3.9.0",
"kind": "minor",
"published_at": "2021-11-06T13:42:58Z"
},
{
"tag": "v3.8.1",
"kind": "patch",
"published_at": "2021-10-24T23:52:52Z"
},
{
"tag": "v3.8.0",
"kind": "minor",
"published_at": "2021-10-24T08:43:35Z"
},
{
"tag": "v3.7.0",
"kind": "minor",
"published_at": "2021-08-28T04:39:52Z"
},
{
"tag": "v3.6.0",
"kind": "minor",
"published_at": "2021-08-14T00:25:42Z"
},
{
"tag": "v3.5.1",
"kind": "patch",
"published_at": "2021-07-28T13:40:38Z"
},
{
"tag": "v3.5.0",
"kind": "minor",
"published_at": "2021-07-25T03:58:40Z"
},
{
"tag": "v3.4.0",
"kind": "minor",
"published_at": "2021-07-09T13:17:54Z"
},
{
"tag": "v3.3.0",
"kind": "minor",
"published_at": "2021-06-19T07:14:49Z"
},
{
"tag": "v3.2.0",
"kind": "minor",
"published_at": "2021-06-05T11:34:29Z"
},
{
"tag": "v3.1.0",
"kind": "minor",
"published_at": "2021-05-21T13:42:11Z"
},
{
"tag": "v3.0.1",
"kind": "patch",
"published_at": "2021-05-09T04:02:33Z"
},
{
"tag": "v3.0.0-beta.11",
"kind": "prerelease",
"published_at": "2021-04-15T13:28:28Z"
},
{
"tag": "v3.0.0-beta.10",
"kind": "prerelease",
"published_at": "2021-03-19T12:58:43Z"
},
{
"tag": "v3.0.0-beta.9",
"kind": "prerelease",
"published_at": "2021-03-14T02:30:57Z"
},
{
"tag": "v3.0.0-beta.8",
"kind": "prerelease",
"published_at": "2021-02-26T13:03:20Z"
},
{
"tag": "v3.0.0-beta.7",
"kind": "prerelease",
"published_at": "2021-02-23T13:41:37Z"
},
{
"tag": "v3.0.0-beta.6",
"kind": "prerelease",
"published_at": "2021-01-11T13:33:30Z"
},
{
"tag": "v3.0.0-beta.5",
"kind": "prerelease",
"published_at": "2021-01-10T06:47:10Z"
},
{
"tag": "v3.0.0-beta.4",
"kind": "prerelease",
"published_at": "2021-01-02T04:04:08Z"
},
{
"tag": "v3.0.0-beta.3",
"kind": "prerelease",
"published_at": "2020-12-21T14:17:11Z"
},
{
"tag": "v3.0.0-beta.2",
"kind": "prerelease",
"published_at": "2020-12-14T14:30:05Z"
},
{
"tag": "v3.0.0-beta.1",
"kind": "prerelease",
"published_at": "2020-12-13T13:21:10Z"
},
{
"tag": "v2.10",
"kind": "other",
"published_at": "2020-09-05T03:22:15Z"
},
{
"tag": "v2.9.1",
"kind": "patch",
"published_at": "2020-04-12T08:33:57Z"
},
{
"tag": "v2.9",
"kind": "other",
"published_at": "2020-03-28T01:41:15Z"
},
{
"tag": "v2.8.2",
"kind": "patch",
"published_at": "2019-12-20T12:38:08Z"
},
{
"tag": "v2.8.1",
"kind": "patch",
"published_at": "2019-12-14T07:03:00Z"
},
{
"tag": "v2.8",
"kind": "other",
"published_at": "2019-11-29T13:10:59Z"
},
{
"tag": "v2.7.2",
"kind": "patch",
"published_at": "2019-08-01T11:59:00Z"
},
{
"tag": "v2.7.1",
"kind": "patch",
"published_at": "2019-06-25T13:01:36Z"
},
{
"tag": "v2.7",
"kind": "other",
"published_at": "2019-06-22T01:54:22Z"
},
{
"tag": "v2.6",
"kind": "other",
"published_at": "2019-05-31T13:07:25Z"
},
{
"tag": "v2.5",
"kind": "other",
"published_at": "2019-05-11T07:40:57Z"
},
{
"tag": "v2.4",
"kind": "other",
"published_at": "2019-04-05T03:58:01Z"
},
{
"tag": "v2.3",
"kind": "other",
"published_at": "2019-03-04T13:29:02Z"
},
{
"tag": "v2.2",
"kind": "other",
"published_at": "2018-12-15T04:11:14Z"
},
{
"tag": "v2.1",
"kind": "other",
"published_at": "2018-10-27T09:28:36Z"
},
{
"tag": "v2.0",
"kind": "other",
"published_at": "2018-09-22T05:52:59Z"
},
{
"tag": "v1.22",
"kind": "other",
"published_at": "2018-08-23T12:50:00Z"
},
{
"tag": "v1.21",
"kind": "other",
"published_at": "2018-08-10T15:33:15Z"
},
{
"tag": "v1.20",
"kind": "other",
"published_at": "2018-07-23T14:03:27Z"
},
{
"tag": "v1.19",
"kind": "other",
"published_at": "2018-07-03T13:40:24Z"
},
{
"tag": "v1.18",
"kind": "other",
"published_at": "2018-06-09T02:22:33Z"
},
{
"tag": "v1.17",
"kind": "other",
"published_at": "2018-06-01T13:08:56Z"
},
{
"tag": "v1.16",
"kind": "other",
"published_at": "2018-05-11T12:26:32Z"
},
{
"tag": "v1.15",
"kind": "other",
"published_at": "2018-04-29T01:37:27Z"
},
{
"tag": "v1.14",
"kind": "other",
"published_at": "2018-04-03T13:05:50Z"
},
{
"tag": "v1.13",
"kind": "other",
"published_at": "2018-03-22T11:34:49Z"
},
{
"tag": "v1.12",
"kind": "other",
"published_at": "2018-02-26T13:46:32Z"
},
{
"tag": "v1.11.1",
"kind": "patch",
"published_at": "2018-01-02T14:14:28Z"
},
{
"tag": "v1.11",
"kind": "other",
"published_at": "2017-12-17T07:53:27Z"
},
{
"tag": "v1.10",
"kind": "other",
"published_at": "2017-11-19T08:23:42Z"
},
{
"tag": "v1.9",
"kind": "other",
"published_at": "2017-10-02T03:31:47Z"
},
{
"tag": "v1.8",
"kind": "other",
"published_at": "2017-08-17T13:26:30Z"
},
{
"tag": "v1.7",
"kind": "other",
"published_at": "2017-07-14T13:57:26Z"
},
{
"tag": "v1.6",
"kind": "other",
"published_at": "2017-06-24T01:54:33Z"
},
{
"tag": "v1.5",
"kind": "other",
"published_at": "2017-05-25T14:41:46Z"
},
{
"tag": "v1.4",
"kind": "other",
"published_at": "2017-05-06T13:47:17Z"
},
{
"tag": "v1.3",
"kind": "other",
"published_at": "2017-04-23T03:11:26Z"
},
{
"tag": "v1.2",
"kind": "other",
"published_at": "2017-04-08T14:54:00Z"
},
{
"tag": "v1.1",
"kind": "other",
"published_at": "2017-03-22T14:23:00Z"
},
{
"tag": "v1.0",
"kind": "other",
"published_at": "2017-01-26T11:01:55Z"
}
],
"recent_commits": [
{
"oid": "368366061196f00be12b847a52fe1111dec1bb16",
"body": "Note templates now expand %name% snippets and built-in dynamic variables and\nhonor a @@ cursor mark, placing the caret at the exact offset when the new note\nopens. SnippetCoreService::expandContent wraps the new vxcore_snippet_expand\nand maps the UTF-8 byte offset to a QTextDocument position (UTF-16\n[…]\nteQuickNote (MVC), fixing raw-write CRLF/encoding and\nderiving %note%/%no% overrides from the final sequenced filename. The caret\nplacement is shared via WidgetUtils::applyCursorOffset.\n\nCloses #2548.",
"is_bot": false,
"headline": "feat: expand snippets and honor @@ cursor mark in note templates",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T18:53:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "808586b4c5c042838c411ea61b603fc9eaa898bb",
"body": "The Global_WakeUp shortcut (Ctrl+Alt+U) was defined in config and shown as tray-menu text, but no QHotkey was ever registered, so it never worked globally. Wire it up in MainWindow2::setupGlobalHotkey(), parented to the window and connected to showMainWindow().",
"is_bot": false,
"headline": "Register global wake-up hotkey to show main window",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-20T18:41:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f0cae0bf31c3cdbd5fe6c16afcba1fe21a47cee",
"body": "markdown-it's default validateLink only whitelists gif/png/jpeg/webp data image URIs, so data:image/svg+xml sources were stripped in preview. Extend the existing validateLink override to allow SVG data URIs, consistent with the XSS sanitizer which already permits data:image/ src values.",
"is_bot": false,
"headline": "Fix SVG data URI images not displaying in markdown preview",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-20T17:37:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bd0c31c53c927817cd972d11af71ba8f8eab17d7",
"body": "…n and popup\n\nAdd NotificationService (in-memory, Qt-Widgets-free) plus NotificationButton2 and NotificationPopup2 on the settings toolbar right after the Theme button. The button shows an active-count badge and auto-shows a popup on new messages; the popup lists messages newest-first with per-message actions and Dismiss, reusing the shared dock-panel TitleBar for its header and Clear All. Includes bell/severity icons, service registration, a GUILESS unit test, and AGENTS.md docs.",
"is_bot": false,
"headline": "feat(notification): add in-app notification system with toolbar butto…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T18:43:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d13c130682d10041c61b9345bdb7c2ab51b927ce",
"body": "…folder (#2673)",
"is_bot": false,
"headline": "Expand snippet magic words in Quick Note folder path and auto-create …",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-20T15:52:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "76b12a1051ade18dfddd9ab228ffed71c55739dd",
"body": "A malformed dot/graphviz code block threw inside viz.js, leaving its shared WASM instance corrupted so every later render read garbage (bogus 'syntax error near import'). Recreate the Viz instance on each error path, call finishRenderingOne() in the render-failure catch to avoid a hung render batch, and null-guard the dot/graphviz preview callback to prevent an uncaught null outerHTML crash.",
"is_bot": false,
"headline": "Fix Graphviz render error cascading and breaking all graph rendering",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-20T15:47:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "534e8fc7c619d1860ad72c7430c1f6eb2006d329",
"body": "…th the theme",
"is_bot": false,
"headline": "Redraw image host editor icon as monochrome strokes so it recolors wi…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T18:37:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2e5334d583c337dfb0871ec3d5548294394b1fba",
"body": "…2585)\n\nResolves the lack of an off-switch for console logs in debug/unstripped builds.\n\n- Add a translatable --quiet CLI option that drops all but Critical/Fatal\n messages (Fatal still aborts).\n- Rework Logger into two phases: installEarly() buffers messages from the very\n start of main() so earl\n[…]\nfigure buffer and summarize any dropped messages at flush.\n- Print --version via stdout directly and surface vxcore-init failure to stderr\n since the logger is unconfigured on those early-exit paths.",
"is_bot": false,
"headline": "feat(logger): add --quiet flag and suppress early startup log spam (#…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-20T15:41:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0aa4508e6a6de29c266203d2c571b92b282f3956",
"body": "typeLink read the off-by-one visible QTextCursor selection, capturing one char short (e.g. 'ver' for a visual 'very'). Read VTextEdit::getSelection() so the inclusive Vi overridden selection is used. Also bumps vtextedit for the matching context-menu copy fix.\n\nRef: https://github.com/vnotex/vnote/issues/2651",
"is_bot": false,
"headline": "fix(markdowneditor): honor Vi visual selection for Insert Link text",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T19:24:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c923cc0e25d709a1ef5b1b509d1251b6098088d",
"body": "Double-clicking a Mermaid/PlantUML graph in read mode built the preview image from p_svgNode.outerHTML. In an HTML document outerHTML leaves void elements (e.g. <br> inside a foreignObject label) un-self-closed, producing invalid XML that cannot load as an image/svg+xml data URI, so the popup was bl\n[…]\ne XMLSerializer in GraphPreviewer.processSvgAsPng, render PlantUML previews as PNG to bypass QSvgRenderer's lack of foreignObject support, and guard fixSvgRelativeWidth against a null width attribute.",
"is_bot": false,
"headline": "Fix graph popup preview failing for nodes with line breaks (#2655)",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-18T17:47:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4281d56d4c5215a03243472073c7ee447f232062",
"body": "…#2658)\n\nWire the editor's display math source highlighting to the web-side Prism highlighter, reusing the existing external code block styling pipeline.\n\n- Add MarkdownViewerAdapter highlightMath/setMathHighlightHtml plus request/ready signals; expose highlightMath over the web channel.\n- highlight\n[…]\ns a newline.\n- MarkdownViewWindow2 connects the math pipeline and shares Prism .token style init via ensureExternalHighlightStyles().\n- Bump libs/vtextedit for the MathBlockHighlighter implementation.",
"is_bot": false,
"headline": "feat(markdown): syntax highlight display math ($$) source in editor (…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-18T17:52:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ab08dfb9e608e02aff9010e9b7e1f4056a42c1c4",
"body": "Clicking Cancel on the \"File Changed\" dialog now suppresses all further FileChanged prompts regardless of mtime, until an explicit reload or save. Previously the mtime-based dismiss token re-prompted on every external write, so a frequently-changing file (e.g. the VNote log) repeatedly re-raised the\n[…]\nce change still re-prompts and cross-state transitions (FileChanged<->FileMissing) are not wrongly suppressed. save(), reload(), and discardChangesAndRead()'s Discard branch all clear the sticky flag.",
"is_bot": false,
"headline": "fix(viewwindow2): make Cancel on external-change dialog a sticky ignore",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:52:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c7cdc8a0d4665238521323976445dfbae904126c",
"body": "Activating a row in the potential-entries popup (double-click or Enter on a keyboard-highlighted row) fills the input with '<name> ' and runs that entry. Wire QTreeWidget::itemActivated once at list creation, and route Enter/Return to the highlighted row when no entry is active.",
"is_bot": false,
"headline": "feat(unitedentry): trigger entry on list row activation",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:12:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0d2aef6182a99c300343cc042581d01675ab859",
"body": "Replace the deprecated johnwbyrd/update-release@v1.0.0 action and the\ngit push --force --tags steps with a single idempotent gh-CLI bash step\nin each workflow. Each step ensures the continuous-build release/tag\nexist, copies the built artifact to a stable non-versioned name, prunes\nonly its own asset family, and uploads with --clobber, so the four\nconcurrent publishers never collide and stale 4.x assets are pruned.",
"is_bot": false,
"headline": "ci: publish continuous-build assets via gh CLI with per-asset prune",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:47:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ebd1fd1e58cd4e592e365c37e1aac2aef38aabf7",
"body": "The linuxdeploy Qt plugin bundles its own libfontconfig plus a fonts.conf that only scans system font dirs (/usr/share/fonts) and drops the XDG user dir (~/.local/share/fonts). This hides user-installed fonts from QFontDatabase, so an interface.qss font-family silently fails to resolve unless the font is copied to a system dir. Fixes #2712 by removing libfontconfig.so* in the existing Fix Package step so the host's libfontconfig + /etc/fonts config is used at runtime.",
"is_bot": false,
"headline": "fix(packaging): drop bundled libfontconfig from AppImage (#2712)",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:47:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e57c94ad51ea03173b1b0338076b9f003323bbae",
"body": "Wire up MainConfig::doVersionSpecificOverride() and invoke it from ConfigMgr2::upgradeMainConfigOnVersionChange() so a stale persisted dashboard layout no longer masks newly added default stickers (Activity sticker in 4.2.0).\n\nThe override is version-gated on the previously-persisted version: it cle\n[…]\ns once for the intended upgrade and no-ops on downgrades, later hotfixes, and VX_DEBUG_REFRESH (previous == current). Cleared layout makes DashboardController::load() fall back to seedDefaultLayout().",
"is_bot": false,
"headline": "Force-clear dashboard layout on upgrade to 4.2.0",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:47:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78fc7ed5600a5b27bd5af5ad801fa5a48f696e95",
"body": "Delete 19 unreferenced core icons and their core.qrc declarations, plus 3\norphaned vx-idea theme overrides. Resource-only change; RCC build clean.",
"is_bot": false,
"headline": "Remove unused SVG icon resources",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:47:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0b6cf7f083b251762421cb0ff067f9f78497cf69",
"body": null,
"is_bot": false,
"headline": "fix(findreplace): shorten title label to Find and Replace ampersand form",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:52:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5f0383ac2db19edaf19b92ce8b8d155016d268ec",
"body": "Render UnitedEntry as a compact toolbar QToolButton (master/accent color, lucide package-search icon) placed right after the file toolbar. Clicking the button or Ctrl+G,G expands it into the editable combo box; focus loss/Esc collapses it back. Use show/hide in a QHBoxLayout so width tracks the visible widget, reserve the combo height on the container for a stable toolbar height, and pass the toolbar icon size into UnitedEntry.",
"is_bot": false,
"headline": "feat(unitedentry): collapse to accent toolbar icon, expand to input",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:41:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "889d4008652a73963541e527701666b0d0d5dc7c",
"body": "sessionconfig.cpp (in core_configs) references ProcessUtils::parseCombinedArgString via SessionConfig::ExternalProgram::fetchCommandArgs (added in 4abaacdb), but processutils.cpp was not part of the library, leaving 10 test targets with unresolved-symbol link errors. Static-library on-demand linking makes this safe for tests that already list processutils.cpp directly.",
"is_bot": false,
"headline": "fix(tests): add processutils.cpp to core_configs to fix test link errors",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:31:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f61b66f4dd7464cd8afcca686e7a10ab087a1714",
"body": "Replace the exception-based vnotex::FileUtils with the Error-returning FileUtils2 across all call sites, then delete fileutils.{h,cpp}. Image reads (imageFromFile/pixmapFromFile) route through ImageUtils. Error sites log via qWarning and degrade gracefully; export write/copy failures return failure paths. Drop now-dead exception.h includes left by removed try/catch blocks.",
"is_bot": false,
"headline": "refactor(utils): migrate FileUtils to return-code FileUtils2",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-19T15:14:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4abaacdb8dd110d279f3290ad7e69f20b2604602",
"body": "Replace ExternalProgram::fetchCommand (which wrapped %1 in bare double quotes and returned a re-tokenizable string) with fetchCommandArgs, which tokenizes the command template once via ProcessUtils::parseCombinedArgString and substitutes the filename per-token. Launch through a new ProcessUtils::startDetached(program, args) argv overload so filename contents are never re-parsed, neutralizing injection via a quote-bearing path in an untrusted notebook.",
"is_bot": false,
"headline": "fix(security): prevent external-program argument injection (CWE-88)",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-18T18:38:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7371efde531312eb24beb982fb5fdd73469cb171",
"body": "Render frontmatter body with textContent instead of innerHTML so raw YAML is treated as plaintext and cannot inject executable DOM, closing the bypass of the protectFromXss sanitizer.",
"is_bot": false,
"headline": "Fix stored XSS via YAML frontmatter (GHSA-vfhj-c636-h59x)",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-18T17:47:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "18a2faf5c3ea496278435ab8eda3c17b0b6c8091",
"body": "Move the sticker remove button to the themed close.svg icon (matching the sibling Move button) and shorten its tooltip to 'Remove'.\n\nReposition the default Activity sticker to the top of the right column, directly above History.\n\nFix vertical gaps/centering by reserving kRowUnitHeight per occupied grid row so a frame fills its spanned cell exactly, pin frames with Qt::AlignTop, and re-pin frame height on resize.",
"is_bot": false,
"headline": "fix(dashboard): align sticker grid and reposition Activity to top-right",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-18T15:52:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e02e7df92b44d0c379eb135269d03715955d8999",
"body": "…hart\n\nAdd a read-only ActivityStatsService wrapping vxcore's activity.db range API, and an ActivitySticker showing colorful metric badges (Active/Created/Read/Edited) plus a custom 30-day trailing active-time bar chart with per-bar hover tooltips. The sticker mirrors HistorySticker's calendar-date \n[…]\nrvice). Register the ''activity'' creator in StickerFactory, seed it into the default dashboard layout, and wire ActivityStatsService in main.cpp. Includes GUILESS service tests and GUI sticker tests.",
"is_bot": false,
"headline": "feat(dashboard): add Activity sticker with metric badges and 30-day c…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-18T15:41:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "74c0194b333b53785f71a91fc9503071e21e5939",
"body": "Exported HTML/PDF code blocks lost their Prism .token colors because the export resolved its syntax stylesheet to a web.css: ThemeService::getWebStyles() interleaved each theme's web.css and highlight.css and fed BOTH the rendering and syntax combos, with default index 0 landing on a web.css.\n\nSplit\n[…]\nighlightFile() that honors an option only when its basename is highlight.css, else the current theme highlight, wired into WebViewExporter::prepare(). Add unit tests for both getters and the resolver.",
"is_bot": false,
"headline": "fix(export): resolve real highlight.css for exported syntax colors",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-17T18:47:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4b4c8f0b3480787c8efb8bf4dc810a8044edcff9",
"body": "Delete the legacy ConfigMgr singleton and the entire legacy widget/manager/\nnotebook-model cluster (~249 files), completing the migration to the new\nServiceLocator architecture.\n\nDecouple the remaining new-arch consumers from the legacy code:\n- snippet call sites -> SnippetCoreService (overrides-awa\n[…]\ngetUtils no longer\nreferences MainWindow::tr. iconfigmgr.h is retained (still used by ConfigMgr2).\n\nApp and full test suite build green; ctest passes (2 load-related timeouts\npass on isolated re-run).",
"is_bot": false,
"headline": "refactor: remove legacy ConfigMgr and pre-ServiceLocator code tree",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-17T18:37:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6e54d1617a3dee82f8a0f582ca9c5ff995d44f39",
"body": "Preparatory un-entanglement before removing the legacy pre-ServiceLocator\narchitecture. No legacy code is deleted yet.\n\n- Re-home FileType value type to core/services/filetype.{h,cpp} (single\n definition, owned by core_services); legacy filetypehelper.h now includes it\n and keeps only the FileType\n[…]\non the legacy SearchPanel widget.\n- tests/controllers/test_exportcontroller.cpp: use core/services/filetype.h and\n drop the test-local FileType::isMarkdown definition (resolves from\n core_services).",
"is_bot": false,
"headline": "refactor: decouple new-arch code from legacy pre-ServiceLocator cluster",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-17T15:18:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d7b7abf31e36e4869e216add34c71c2d792b738f",
"body": null,
"is_bot": false,
"headline": "Scroll log viewer into view on export start",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-15T17:23:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49654b8bd9df1cf4265ce482631aa07ee4e697f0",
"body": null,
"is_bot": false,
"headline": "Disable Readable Width layout mode by default",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-16T15:47:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2c3ea514a02d96e94512b406dd994a4cab19b586",
"body": null,
"is_bot": false,
"headline": "Update bundled mermaid to v11.16.0",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-16T15:47:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b1a0d4313b496b04644e6f24ea07735f966314cd",
"body": "Mirror the Tags dock search: insert a TreeFilterProxyModel between each source model and its view, wire TitleBar::searchTextChanged to setFilterText, and expand the task tree on filterActiveChanged. Map proxy indexes to source before snippetAt/taskForIndex/isTopLevelTask so Run/Apply/Delete/context-menu act on the correct row while a filter is active.",
"is_bot": false,
"headline": "feat(docks): add search titlebar filter to Snippets and Tasks docks",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-16T15:51:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69f0ff998f2fafce2745106353885d135981bc40",
"body": "Rename the Tasks context-menu actions to Edit/Delete and route Edit (and newly created tasks) through the generic external-file open flow so task .json files open in the built-in editor instead of the OS handler. Swap the Tasks dock icon to the lucide workflow glyph, add a reload icon, and give both the Tasks and Snippets docks a Reload button. Bump vxcore for the Text file-type suffix associations.",
"is_bot": false,
"headline": "feat(task): edit task files in-app, refine dock icons and actions",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-16T18:43:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d278bcfdb698090923cde1418468206cdc0e879",
"body": "Add a left-side Tasks dock (TaskPanel2 + TaskTreeModel + TaskController) to list, run, and file-manage tasks, and wire the bottom ConsoleDock to a new ConsoleViewer that streams task output. Inject a production ITaskContext (MainWindowTaskContext) into TaskService so notebook/buffer/input variables resolve against the active view. Running tasks are retained per-process across reloads to avoid killing in-flight processes.",
"is_bot": false,
"headline": "Add Tasks dock and Console log viewer",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-15T18:18:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7fc239785c182fc67424b1e5f1f59b279c27495c",
"body": "ConsoleViewer existed only to display legacy TaskMgr output via the now-deleted VNoteX::showOutputRequested signal. With that feed gone after the TaskService migration, the widget was dead code. Delete consoleviewer.{h,cpp} and strip all wiring from legacy MainWindow (include, forward decl, setupConsoleViewer, setupDocks call, m_consoleViewer member).",
"is_bot": false,
"headline": "refactor(task): remove legacy task-output console (ConsoleViewer)",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-15T15:14:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5d59a75b5c5e7df165ffb214ea10a98ae7550cce",
"body": "Move src/task/* into src/core/services/ as TaskService, replacing legacy singleton lookups (VNoteX/ConfigMgr/NotebookMgr/SnippetMgr) with injected ConfigMgr2/NotebookCoreService/SnippetCoreService and an ITaskContext interface for live UI context. TaskService is a plain QObject registered in main.cp\n[…]\n legacy task wiring (VNoteX initTaskMgr/getTaskMgr/showOutputRequested, toolbarhelper include, mainwindow console connection) and add tests/core/test_taskservice.cpp (16 cases) with a MockTaskContext.",
"is_bot": false,
"headline": "refactor(task): migrate task subsystem to ServiceLocator/DI",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T18:47:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b4f60a5b9a9f11fa2086d660edade17f9f76fdb7",
"body": "windeployqt previously removed winqt/styles/, dropping qwindows11style.dll; without it Qt 6 falls back to the legacy windowsvista style on Windows 11 (beveled QFrame::StyledPanel borders instead of modern rounded panels).",
"is_bot": false,
"headline": "build(windows): keep winqt/styles/ so Qt 6 uses the Windows 11 style",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-15T18:41:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49ea2aec7905720d6a31def66839d45ec6d7e837",
"body": "PlantUmlHelper/GraphvizHelper lazy-init from the legacy ConfigMgr singleton, whose MainConfig is never loaded from disk, so they always saw an empty JAR/exe path and ran a broken 'java -jar <dir>' command (exit 1, no output, blank graphs). Settings save to ConfigMgr2 instead. Feed the helpers from t\n[…]\nig in MarkdownViewWindow2::updatePreviewHelperFromConfig, guarded so the shared render cache is only cleared when paths change. Add tracing across the JS+C++ graph render path to aid future diagnosis.",
"is_bot": false,
"headline": "fix(markdown): render local PlantUml/Graphviz from ConfigMgr2 config",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-15T18:26:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c9f6119e3fa079fb05aab933765bd5a0e82d7843",
"body": "On Windows, extra resource files (themes, tasks, web, dicts,\nsyntax-highlighting) are dumped from a read-only .rcc resource, so\nQFile::copy leaves them read-only. On the next upgrade, QFile::remove\nfails on those files, copyFile returns FailToRemoveFile, and copyDir\naborts the rest of the directory \n[…]\nopyDir failures instead of\n discarding the Error.\n- Add regression tests covering read-only destination overwrite, read-only\n source producing a writable dest, and read-only nested files in copyDir.",
"is_bot": false,
"headline": "Overwrite read-only resource files on version upgrade",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-15T15:47:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "afb8161adf69e4089f01e2bbdab959a950300ae2",
"body": null,
"is_bot": false,
"headline": "Release v4.2.0",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T18:03:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3ff95ea648bf05888b923960470dbbc67d195ca",
"body": "Fill in Simplified Chinese and Japanese translations for the 186 previously-unfinished entries in each catalog (dashboard/stickers, notebook open/clone, sync info and errors, export dialog, editor/sync preference pages, read-only notebook strings). Verified: valid XML, lrelease reports 1867 finished / 0 unfinished per file, placeholders preserved.",
"is_bot": false,
"headline": "Translate new zh_CN and ja UI strings",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T18:41:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3c576451e04784e0646e27899d817a31a93ef10",
"body": "QUrl::toLocalFile() strips the fragment, so relative links inserted via\nthe paste dialog lost their #Heading anchor and only pointed at the file.\nCapture the fragment up front and re-append it for the relative-link flow\n(skipping the Attach flow, whose target is a fresh copy).\n\nExtract the anchor-append logic into a dependency-free LinkInsertUtils\nhelper and cover it with test_linkinsertutils.\n\nFixes #2656",
"is_bot": false,
"headline": "Preserve heading anchors in Insert As Relative Link",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T18:43:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59b5f421e8b0a282eee813d518e40526a0560724",
"body": "A second instance forwarded raw command-line paths (e.g. './vnotex.json') to the primary instance, which then resolved them against its own unrelated working directory, opening the wrong file or none.\n\nResolve paths to absolute in SingleInstanceGuard::requestOpenFiles (the sending process, whose CWD is correct) before crossing the socket, and drop the now-redundant absolutization loop in main.cpp. The primary's own command-line files remain absolutized in MainWindow2::doOpenFiles.\n\nRefs #2710",
"is_bot": false,
"headline": "Absolutize forwarded open-file paths at the IPC socket boundary",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T18:14:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "23b15b2b6424eafa360434002543801f13f67510",
"body": "MainWindow2::kickOffPostInit received the command-line paths but never opened them (the legacy MainWindow::openFiles call was dropped during the VNote 4 migration), so 'Open with VNote' and CLI path arguments launched the app but discarded the file.\n\n- Add MainWindow2::openFiles/doOpenFiles that ope\n[…]\nhs in the originating process so relative CLI paths forwarded over IPC resolve against the caller's CWD.\n- Print --help to stdout verbatim instead of via qInfo() (which escaped newlines).\n\nFixes #2710",
"is_bot": false,
"headline": "Fix opening files from command line / 'Open with VNote'",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T17:52:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4b0b161502867d8e36f213217759ba30313ed35b",
"body": "Seed greeting/calendar/history with a fixed-size grid layout (each grid row pinned to a fixed height so tall stickers scroll instead of inflating rows). Center and enlarge the greeting text and hide its chrome title via Sticker::shouldShowTitle(). Add a Reset toolbar action (reusing reset_editor.svg) that restores the default stickers/layout behind a confirmation.",
"is_bot": false,
"headline": "Refine dashboard default layout and add Reset button",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:56:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6921d3a68c94f2523a1e8ff921168bb9c34cf5b5",
"body": "Add a time-of-day greeting sticker (Good morning/afternoon/evening) computed on showEvent. Register it in StickerFactory and wire build/test targets. greetingForHour() is a static pure helper for clock-free unit testing.",
"is_bot": false,
"headline": "Add GreetingSticker dashboard sticker",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:41:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d3ce2fdb08a6d447f4019a3d0a81bbad33b19354",
"body": "Show a thin filter bar (localized 'Opened on <date>' label + clear button) at the top of the History sticker only in day-filter mode. Clicking the button clears the active date and returns to recent mode. Bar visibility is centralized in reloadCurrentMode via updateFilterBar so it always tracks m_activeDate. View-only change; no service/model API changes.",
"is_bot": false,
"headline": "feat(dashboard): add clear-date-filter affordance to History sticker",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:41:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e4a9666162cce6f9fe7ba214f0c7b2c18f2ee49",
"body": "vxcore history exposes only an open/access time (openedUtc). Previously\nHistoryService stuffed it into NodeInfo::modifiedTimeUtc, overloading a field\nthat tree/sort/properties paths treat as file-modification time.\n\nAdd a dedicated NodeInfo::accessedTimeUtc and have buildAllHistory() write and\nsort on it, and getHistoryForDate() filter on it. modifiedTimeUtc is left\nuntouched for history rows, so it consistently means file-modification time\neverywhere. History behavior is unchanged.",
"is_bot": false,
"headline": "refactor(history): store file open time in NodeInfo::accessedTimeUtc",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:58:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d680f198f7b4260f7926d3240af6dd795c2adcc",
"body": "…enu labels\n\n- Seed a History sticker to the right of the Calendar in the default layout,\n with a taller default span (rowSpan 6) so several recent files are visible.\n- Show capitalized, human-friendly labels in the Add Sticker dropdown while\n still dispatching on the raw lower-cased type id.",
"is_bot": false,
"headline": "feat(dashboard): seed History sticker by default and capitalize Add m…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:53:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a9642f14461b0f44098255f462acd6b71e6b15ca",
"body": "Add a HistorySticker that lists recently opened files on the home dashboard.\nIt shows recent-N by default and switches to files opened on a given local\ncalendar day when the Calendar sticker broadcasts DashboardCalendarDateChanged.\n\n- HistoryService: extract buildAllHistory() helper; add getRecentHi\n[…]\nth parse/validate + hook-id lifecycle; reloads active mode on show.\n- Register the 'history' sticker creator; wire CMake sources.\n- Tests: model loadRecent/loadForDate cases + GUI HistorySticker test.",
"is_bot": false,
"headline": "feat(dashboard): add History sticker with recent + calendar-day modes",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:41:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1f14ababc9a5ae7a8dd947c7289750cfb8305d16",
"body": null,
"is_bot": false,
"headline": "remove the plans folder",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-15T05:31:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69e9a1cc8e62ed3371d7d09ccd3e0240009f6d09",
"body": "…tebook history option\n\nDelete the legacy HistoryMgr aggregate manager and its HistoryPanel UI, and drop the 'Per-notebook access history' setting from CoreConfig and the Note Management settings page. Decouple the remaining legacy callers (viewarea, notebooknodeexplorer, mainwindow) and inline the two history-list helpers into BundleNotebook so per-notebook history storage is unaffected.",
"is_bot": false,
"headline": "refactor(history): remove legacy HistoryMgr, HistoryPanel, and per-no…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:52:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f1d2ee8e4b9685dacfed87e161266c2691da335e",
"body": "Move history aggregation, sorting, and preview access out of HistoryListModel into a new HistoryService registered in ServiceLocator, restoring MVC separation. The model now depends only on HistoryService; behavior is byte-identical.",
"is_bot": false,
"headline": "refactor(history): extract HistoryService for cross-notebook history",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:41:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1768b42548cabc4c31bcddb260e6545665a1dee9",
"body": "WidgetViewWindow2 did not forward theme changes to its hosted IViewWindowContent, so the Dashboard's custom Add Sticker / Lock toolbar icons kept their old tint after a theme switch (unlike MarkdownViewWindow2, which overrides handleThemeChanged).\n\nAdd a handleThemeChanged() hook to IViewWindowConte\n[…]\n no-op), override it in WidgetViewWindow2 to call the base refresh then forward to the content, and implement it in DashboardContent to re-tint the Add Sticker and Lock actions from the current theme.",
"is_bot": false,
"headline": "Refresh dashboard toolbar icons on theme change",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-14T15:31:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "36c11e9ca4fcaa1a7a8f4bd77a1f8e82e60a94db",
"body": null,
"is_bot": false,
"headline": "Add Locked/Unlocked mode toggle to dashboard toolbar",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-13T17:37:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97ab53f3458aa4ab34fd8d4e9e5992197d09e969",
"body": "Replace the four-step QInputDialog Set Position/Size flow with a dedicated ResizeStickerDialog that only edits row/column span, leaving the sticker position unchanged (moving is handled by the Move menu actions). Rename the menu item to Resize and cap the column span to the space available from the sticker's current column so the controller never clamps and shifts position. Promote kMaxRowSpan to a public DashboardController constant as the single source of truth.",
"is_bot": false,
"headline": "Add dedicated resize dialog for dashboard stickers",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-13T18:47:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d66b354d2fd81d702001b5317771d62510a774ec",
"body": "The grid gave columns stretch and a minimum width but left rows unsized, so an empty row collapsed to zero height under Qt::AlignTop and a vertical move was invisible even though the model updated. Add applyRowSizing() to reserve a minimum height for rows up to the highest occupied one, invoked after every layout-mutating handler.",
"is_bot": false,
"headline": "Fix dashboard sticker Move Up/Down having no visible effect",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-13T15:41:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "92d9651105b445fa2117cc5617a5aa0e305538b2",
"body": "…hide home tab bar\n\n- Sticker header Move button is now icon-only (new move.svg + tooltip), matching the Add Sticker toolbar style.\n- Style the calendar sticker's month-selector dropdown arrow to match the Quick Access chevron (arrow_dropdown.svg, 16px) across all non-native themes.\n- Hide the ViewSplit2 tab bar when the only open tab is the vx://home dashboard for a cleaner home surface.",
"is_bot": false,
"headline": "feat(dashboard): icon-only Move button, themed calendar month arrow, …",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-13T15:19:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf9a4a38d0d24358a86c01a275042d9547d539ba",
"body": "Move the dashboard's layout model, occupancy math, seed/default, and WidgetConfig persistence out of the DashboardBoard widget into a new QObject DashboardController in src/controllers/, per the repo MVC rules (controllers must not inherit QWidget; views must not modify data directly).\n\n- Board beco\n[…]\ns and rolls back cleanly if the view cannot realize a sticker widget.\n- Initial sticker settings are captured before the single add/seed persist, matching the legacy live-saveSettings() serialization.",
"is_bot": false,
"headline": "refactor(dashboard): extract DashboardController from DashboardBoard",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-12T18:14:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "149f285b3636c384dfbf1c67568ad99a85c07648",
"body": null,
"is_bot": false,
"headline": "Make Home Add Sticker button icon-only like the Theme toolbar button",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-12T15:41:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aca1bbf9ddc5b03cd28e404dbadf2b8c67226e4e",
"body": "loadLayout() built the saved splitter tree while its splits were still empty (buffers are reopened later by restoreSession from MainWindowAfterStart). Its trailing updateScreenVisibility() therefore saw no windows and armed maybeOpenHome(), whose deferred singleShot raced session restore and could surface an unwanted Home dashboard tab alongside restored files. Remove the premature call; the empty-session Home decision is still made post-restore in setupController's MainWindowAfterStart handler.",
"is_bot": false,
"headline": "fix(viewarea2): don't open Home tab prematurely during layout load",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-12T15:41:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8061285222af38a41a28fd123f1417d3568bc1f1",
"body": "Replace the ViewAreaHomeWidget placeholder with a real vx://home dashboard:\na grid-based board of extensible stickers opened via the fileless\nvirtual-buffer path (like Settings).\n\n- Sticker abstraction + StickerFactory registry (mirrors ViewWindowFactory)\n- CalendarSticker: broadcasts date changes o\n[…]\ncursion-safe auto-open on empty/startup; virtual buffers excluded from\n workspace/session persistence and pruned from serialized splitter layout\n- Dedup vx://home across visible and hidden workspaces",
"is_bot": false,
"headline": "feat(dashboard): add PKM home dashboard with stickers",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-11T17:53:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "99911465def1ae940e12407c6dff6f9bc16a83e3",
"body": "Add ActivityService that computes app-focus duration (batched, ~60s\ncadence plus focus-lost/close flush) and forwards note reads on\nFileAfterOpen into vxcore's activity.db. Recording is in-memory and\ncheap; the periodic flush is the only disk write, keeping I/O off the\nUI hot path. Bump the vxcore s\n[…]\nlose vxcore_activity_flush\n- main.cpp: construct/register ActivityService before MainWindow2 so it\n catches MainWindowAfterStart; flush on aboutToQuit\n- libs/vxcore: activity tracking storage and API",
"is_bot": false,
"headline": "feat(activity): track focus time and note activity via vxcore",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-09T17:41:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aeab7642a4e2f66fc4ef54aa91c6637650deaee8",
"body": null,
"is_bot": false,
"headline": "Remove markdown editor OverrideFont option and its settings UI",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-09T15:41:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "697bc862d2cfd720a507834d12b351997f1d9fa3",
"body": "Add a two-level \"windows\" united entry listing known workspaces (visible and hidden) with their open view windows; activating a window focuses it, surfacing a hidden workspace if needed. Enumeration and focus go through an injected IViewWindowNavigator implemented by ViewAreaController and set on UnitedEntryMgr by MainWindow2.",
"is_bot": false,
"headline": "feat(unitedentry): add \"windows\" entry for open view windows",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-09T15:52:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "385840c8767cd3aa88b92ab2b9224b77b931517b",
"body": null,
"is_bot": false,
"headline": "Show ImageHost toolbar button only in edit mode",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-09T15:47:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "869198f1ee6c68487c366e53a74dbe9e99b68a35",
"body": "Introduce a dedicated Sync settings page (slug \"sync\") placed above the File Associations page, and relocate the Auto-sync interval spin box from the General page onto it. Update the settings slug test (index + unique count) and CMake wiring accordingly.",
"is_bot": false,
"headline": "feat(settings): add Sync page and move auto-sync interval to it",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T15:47:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "82fb0f8427234fd7cc22812e40e75942b45c07d9",
"body": "Raise the default autoSyncDebounceSeconds from 60 to 120. Update the ConfigCoreService getter fallback to match the vxcore ctor default and bump the vxcore submodule pointer to the corresponding change.",
"is_bot": false,
"headline": "feat(sync): default auto-sync interval to 120s",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T15:11:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d38bc5eba0741951f5eddec5d1a2d883e00a5e16",
"body": "Re-add the runtime In-Place Preview toggle button (default on, edit-mode only) to MarkdownViewWindow2's toolbar, migrated from the legacy MarkdownViewWindow. The toggle drives MarkdownEditor::setInplacePreviewEnabled and stays in sync via a runtime member re-applied on lazy editor creation.\n\nRefs #2709",
"is_bot": false,
"headline": "feat(editor): re-add In-Place Preview toggle to Markdown toolbar",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T15:41:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ac510d0daba10d482065a63e5b71ccbef3433ec",
"body": "The popup is a parentless Qt::Tool window that Windows hides natively on app deactivation while United Entry stays activated, so clicking back into the input left it hidden until focus cycled through another widget.\n\nRestore the existing popup on QGuiApplication::applicationStateChanged and on an in\n[…]\nn in-flight async entry (e.g. find) is not cancelled. Gate the re-map on a real deactivation (m_popupNeedsRestore) so repeated clicks while the app stays active do not flash the already-visible popup.",
"is_bot": false,
"headline": "fix(unitedentry): reshow popup when app regains focus",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T17:52:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "810d496d9f6f662c68333a2f677dff96ab626328",
"body": "Once an entry name is completed with a space, resolve it by unique prefix: exact match wins, an unambiguous prefix dispatches its entry, and an ambiguous prefix or no match keeps the existing Unknown entry popup. Resolution is internal only; the visible input is never rewritten and the alias real-target lookup stays exact.",
"is_bot": false,
"headline": "feat(unitedentry): resolve completed entry name by unique prefix",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T14:53:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "125bd550262376451231c491a62d43c1a2fe0300",
"body": "When the system title bar is in use, MainWindow2 sets the OS window title to \"<current note name> - VNote\", tracking tab switches, live renames, and tab close (falling back to \"VNote\" when no note is open). Frameless custom-title-bar mode keeps the static title. Restores the v3-style window title behavior.\n\nRefs #2708",
"is_bot": false,
"headline": "feat(mainwindow): show current note name in system title bar",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T14:53:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d99de53ffc32699b73d336268d23a1ccef8a8002",
"body": null,
"is_bot": false,
"headline": "update translations",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-09T04:36:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1837008f13cd056b89e044da40b9fb637f5e31ba",
"body": "…-QApplication QEventLoop warning\n\nSearchService and ImageHostService started their worker QThread in their constructors, which run before the QApplication is created in main(). The default QThread::run() calls exec(), constructing a QEventLoop while QCoreApplication::instance() is still null, emitt\n[…]\nice so a session that never searches/uploads still reclaims it via QObject child deletion; unparent before moveToThread on first start so the existing finished->deleteLater cleanup owns it thereafter.",
"is_bot": false,
"headline": "fix(startup): lazy-start search/imagehost worker threads to avoid pre…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T15:19:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b9ff3d8842454d43bb889079b463508f425efc28",
"body": null,
"is_bot": false,
"headline": "fix(unitedentry): select first history result by default like Find",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T15:41:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04a48a16433f7e927888ef29c8489ceaeced3b2c",
"body": "Pulls in vtextedit fix correcting inline code/strong highlight positions on block quote continuation lines (cmark block_offset over/under-reporting).",
"is_bot": false,
"headline": "fix(editor): bump vtextedit for block quote inline highlight offset fix",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-08T15:41:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b28a326d3c7e676aa1b7293711111329edb2dc3",
"body": null,
"is_bot": false,
"headline": "chore(release): bump version to 4.1.1",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-07T15:47:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "06cf671e7df6aad599d5941ce19e7da657ff4959",
"body": null,
"is_bot": false,
"headline": "docs: add v4.1.1 changelog entry",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-07T15:31:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f094815cfb5641b1b78890ccd6f66cc51e4f79d3",
"body": "Pulls in vtextedit cd01941: the cmark AST walker was converting cmark's inclusive byte-based end_column with a blind +1, splitting a trailing/adjacent emoji's surrogate pair in styled spans (e.g. headings) into tofu boxes in the markdown editor. Adds a width-aware conversion and regression tests; no golden-master output changes.",
"is_bot": false,
"headline": "fix(editor): bump vtextedit to fix cmark emoji surrogate split",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-07T15:19:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5bead02bd47044ae68f64f1fdaba1deef9b209d3",
"body": "Follow-up to c3e72cfd. That commit plumbed a MathJax `minScale` option\nto floor the auto font-match at 1.0 for the wkhtmltopdf export, based on\na wrong premise: MathJax v3's SVG output has no matchFontHeight, so\n`minScale` never takes effect there.\n\nMeasuring rendered equation height across scale/mi\n[…]\nthe old 2.5x excess.\n Preview and Qt WebEngine printToPdf stay at the MathJax default (-1).\n- Document in-code that scale is the only effective lever for SVG output\n so minScale is not reintroduced.",
"is_bot": false,
"headline": "fix(export): size wkhtmltopdf MathJax via scale, not the no-op minScale",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-07T15:56:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c3e72cfdfb154e082466a1936d410f04f5717de7",
"body": "wkhtmltopdf's old headless Qt-4 WebKit mis-measures the surrounding\ntext's ex-height, so MathJax shrinks each equation to its minScale\nfloor (0.5). The previous fix blindly multiplied by a magic scale of\n2.5, which combined with that floor over-enlarged math to ~1.25x the\nsurrounding text.\n\nReplace \n[…]\nMinScale, defaulting to\n MathJax's documented 0.5 when absent (sentinel -1).\n- webviewexporter: set mathJaxMinScale = 1.0 for wkhtmltopdf and -1\n otherwise; set mathJaxScale = -1 (removing the 2.5).",
"is_bot": false,
"headline": "fix(export): correct wkhtmltopdf MathJax sizing with minScale floor",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-07T15:41:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "11ad2ccf1f1985e6460d5596261aa956bc47e505",
"body": null,
"is_bot": false,
"headline": "chore: gitignore .kilo/ and .superpowers/ agent tooling dirs",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-06T17:47:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97ecc3e7064b6443285ab74b6f0015d8d02aac31",
"body": "capEnforcement, coalesceWithSameKey and coalescePrecedenceOverCap raced the\npool worker: each enqueued a first item then synchronously enqueued more,\nassuming the first stayed pending. Under CI load the worker dequeued it\nfirst, so a later same-key enqueue saw an empty queue and returned Accepted\nin\n[…]\nm is actually AT cap, and assert a distinct key returns QueueFull, so the\ntest genuinely proves coalescing short-circuits the cap only for a matching\nkey. Drop the now-unused QThread include / msleep.",
"is_bot": false,
"headline": "test(sync): de-flake SyncWorkQueueManager cap/coalesce tests",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-06T15:52:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "faeb8b0ec72a41fc917897d772a20cbd748ec257",
"body": "Follow-up to #2701 and 48e77d36.\n\nDisplay equations whose MathJax root <svg> is sized in page-relative\nunits (width=\"100%\", height in ex) and wrap a nested <svg data-table>\n(matrices/aligned equations) rendered squeezed in exported PDFs: loaded\nas a standalone image the relative units have no contai\n[…]\n clone\n with width/height pinned to the measured CSS pixels (the export body is\n sized to the print page), recreating the exact on-page viewport. The\n live DOM is left untouched until replaceChild.",
"is_bot": false,
"headline": "fix(export): pin MathJax SVG viewport to stop squeezed PDF equations",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-06T15:14:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3eb331a97d1e48b8c2eca5026cb0540fe9126bbe",
"body": "…2707)\n\nFollow-up to #2701.\n\n- Scope convertAllSvgToPng to 'mjx-container svg' so only MathJax output is\n rasterized. Other inline SVGs (Mermaid/Graphviz/Flowchart/WaveDrom) stay\n vector and avoid the Mermaid foreignObject canvas taint that made\n toDataURL() throw and hang the export.\n- Harden th\n[…]\na missing callback falls\n through to printToPdf instead of freezing the export; bind the connection to\n a context object.\n- Strip accidental UTF-8 BOM from webviewexporter.cpp and exportdialog2.cpp.",
"is_bot": false,
"headline": "fix(export): scope MathJax PNG rasterization and harden PDF export (#…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-07T03:32:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5718c522ed4780a648e1a3d59d293749497e3851",
"body": "…ing (#2701)\n\nCloses #2681\n\nCo-authored-by: meNmae <me>",
"is_bot": false,
"headline": "fix: PDF export MathJax SVG-to-PNG conversion and render-ready signal…",
"author_name": "llccde",
"author_login": "llccde",
"committed_at": "2026-07-07T02:23:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "076031b7c1cc7507eeee488ad2d9e46b23274401",
"body": "… (#2705)\n\nTwo qputenv() calls each overwrote QTWEBENGINE_CHROMIUM_FLAGS: --disable-logging was lost on Linux, and both erased any user-set value, removing the only env-var way to pass Chromium workaround flags (e.g. --single-process / --disable-gpu) that mitigate distro-specific QtWebEngine crashes\n[…]\nlogging everywhere, --no-sandbox on Linux) into the user value, appending each flag only if absent (whole-token match incl. --flag=value); --enable-logging opts out of --disable-logging. Docs updated.",
"is_bot": false,
"headline": "fix(startup): merge QTWEBENGINE_CHROMIUM_FLAGS instead of overwriting…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-06T15:37:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9cbc9fb9c9ca550ebb4e5d52ca64665644ad3b07",
"body": "…esystem",
"is_bot": false,
"headline": "feat(vxcore): bump submodule to read raw node timestamps from the fil…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-05T17:56:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c6f80ee6a6362eccb6f5516a470d2bbe2f4d141",
"body": "Pulls in vxcore b133376: RawFolderManager rename no longer wipes a raw node's per-node metadata (Mark textColor/backgroundColor) to \"{}\".",
"is_bot": false,
"headline": "fix(vxcore): bump submodule to preserve raw node metadata across rename",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-05T15:17:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e33d508279cf99c36884eaa83ce6df1ee233945",
"body": "Doc-only submodule change: CreateBufferProvider header comment now reflects that raw notebooks receive a StandardBufferProvider. vxcore 01dab55..3ca39ec.",
"is_bot": false,
"headline": "chore(vxcore): bump submodule to fix stale buffer-provider comment",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-05T15:21:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ce3fdf13e1ad3fee36e788d6cf4de863dee4478",
"body": "Attach StandardBufferProvider to raw-notebook buffers so asset writes (image paste, drag-drop) succeed; attachments stay unsupported for raw. vxcore 0342b5e..01dab55.\n\nRefs vnotex/vnote#2703",
"is_bot": false,
"headline": "fix(vxcore): bump submodule to enable image paste in raw notebooks",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-05T14:43:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e40ea4a7670f463434c4f50afc59e29b6f88c5be",
"body": null,
"is_bot": false,
"headline": "chore(vxcore): bump submodule to add search-validate diagnostic tool",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-02T18:52:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "87a89be84d1bf8e4291bc78c3df23f22ed826993",
"body": "Consume the new vxcore streaming primitive so search results appear progressively instead of all at once.\n\n- SearchCoreService::searchContentStreaming wraps vxcore_search_content_streaming with a thread-safe batch trampoline.\n- SearchWorker drives the streaming scan on a worker thread, emitting a se\n[…]\nds preview batches incrementally and supersedes them with the capped result on finish; SearchResultModel gains appendSearchResult.\n- Update the search threading contract docs for per-chunk scheduling.",
"is_bot": false,
"headline": "feat(search): render content-search results incrementally via streaming",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-02T15:34:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d6c1b8eb6bf3d85cad7c4d5ef87d3f95eb53b548",
"body": "Replace the three hardcoded 500 search-result caps (content/filename/tag) with a single user-configurable CoreConfig::searchMaxResults value (default 1000, clamped to [1, 100000]). Surface it as a spinbox on the Note Management settings page and read it at query-build time so changes take effect without restart.",
"is_bot": false,
"headline": "feat(search): make search result cap configurable",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-07-02T15:47:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "130dd4d7972555d4af3c448f94a87735416f5b06",
"body": "… rows\n\nContent search rendered one result row per match occurrence, so a source line containing N matches appeared N times. vxcore correctly emits one SearchMatch fact per occurrence (facts layer, unchanged); the Qt-side stack now groups occurrences by line into a single row carrying multiple highl\n[…]\nndunitedentry: rebuild highlight segments from SegmentsRole.\n\nTests lock grouping (2 rows / m_matchCount==5), MatchCountRole (3 occurrences on 1 line -> 3), the segment API, and non-adjacent grouping.",
"is_bot": false,
"headline": "fix(search): group content-search matches by line to remove duplicate…",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-06-30T17:52:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ab7f65563cdda88091c025fd5fb5b053b6eeefaf",
"body": "SearchService now owns a pool of drain threads that loop\nvxcore_work_queue_process_next on the \"vxcore.search\" queue, powering vxcore's\ncaller-helps-drain content search (vxcore no longer owns a search thread pool).\nPool size is min(hardware_concurrency, 8), substituting 2 when the count is\nunknown.\n[…]\nch Threading Contract (root AGENTS.md) + SearchService drain pool\n (src/core/services/AGENTS.md) + vxcore Search backends note.\n- Bumps libs/vxcore to the caller-owned vxcore.search WorkQueue commit.",
"is_bot": false,
"headline": "feat(search): caller-owned content-search drain pool in SearchService",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-06-30T23:41:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "650eb0e66018e5326d9dacc83e564fc0db568beb",
"body": null,
"is_bot": false,
"headline": "update gitignore",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-06-29T10:34:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b4fbd072524845eaff0aafd90ecaf1d7b7b8ddd5",
"body": "Bump vtextedit pointer to re-theme MarkdownHighlighter on config change so\nthe markdown editor refreshes its colors after a theme switch. Add\nlocal_run.sh to build and run the Debug app with the right runtime env.",
"is_bot": false,
"headline": "fix(markdown): refresh editor style on theme switch",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-06-29T07:53:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "435dae56af1d45c30a9798fdbc8be46b2db3a652",
"body": "Update pinned Qt 6.8.3 -> 6.9.3 (latest 6.9.x) on Windows/Linux/macOS/TSan CI, refresh Qt cache keys, and return macOS runner to macos-latest (6.9.3 carries the QTBUG-137687 AGL fix). Docs and pack-win.ps1 updated to match.",
"is_bot": false,
"headline": "ci: bump Qt to 6.9.3 across all platforms",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-06-27T18:17:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47e67279fa95e04d36736ce9b845208b66e39634",
"body": "Hide the System title bar checkbox on macOS and force the option on, since a frameless window is unusual on that platform.",
"is_bot": false,
"headline": "fix(appearance): always use system title bar on macOS",
"author_name": "Le Tan",
"author_login": "tamlok",
"committed_at": "2026-06-28T17:47:33Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 87,
"commits_last_year": 577,
"latest_release_at": "2020-12-05T05:19:49Z",
"latest_release_tag": "continuous-build",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 11,
"days_since_latest_release": 2054,
"mean_days_between_releases": -148.9
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 62,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 1298,
"stars": 12869,
"watchers": 236,
"fork_history": {
"days": [
{
"date": "2019-03-03",
"count": 1
},
{
"date": "2019-03-05",
"count": 1
},
{
"date": "2019-03-06",
"count": 1
},
{
"date": "2019-03-07",
"count": 1
},
{
"date": "2019-03-12",
"count": 1
},
{
"date": "2019-03-13",
"count": 1
},
{
"date": "2019-03-15",
"count": 1
},
{
"date": "2019-03-16",
"count": 1
},
{
"date": "2019-03-18",
"count": 1
},
{
"date": "2019-03-19",
"count": 1
},
{
"date": "2019-03-20",
"count": 1
},
{
"date": "2019-03-21",
"count": 2
},
{
"date": "2019-03-22",
"count": 1
},
{
"date": "2019-03-29",
"count": 2
},
{
"date": "2019-03-30",
"count": 1
},
{
"date": "2019-03-31",
"count": 3
},
{
"date": "2019-04-01",
"count": 4
},
{
"date": "2019-04-02",
"count": 2
},
{
"date": "2019-04-03",
"count": 2
},
{
"date": "2019-04-08",
"count": 1
},
{
"date": "2019-04-09",
"count": 1
},
{
"date": "2019-04-10",
"count": 2
},
{
"date": "2019-04-11",
"count": 2
},
{
"date": "2019-04-12",
"count": 1
},
{
"date": "2019-04-15",
"count": 1
},
{
"date": "2019-04-17",
"count": 2
},
{
"date": "2019-04-19",
"count": 2
},
{
"date": "2019-04-21",
"count": 1
},
{
"date": "2019-04-24",
"count": 1
},
{
"date": "2019-04-25",
"count": 1
},
{
"date": "2019-04-27",
"count": 1
},
{
"date": "2019-04-28",
"count": 1
},
{
"date": "2019-05-05",
"count": 1
},
{
"date": "2019-05-07",
"count": 1
},
{
"date": "2019-05-08",
"count": 1
},
{
"date": "2019-05-09",
"count": 1
},
{
"date": "2019-05-12",
"count": 1
},
{
"date": "2019-05-13",
"count": 1
},
{
"date": "2019-05-14",
"count": 4
},
{
"date": "2019-05-15",
"count": 1
},
{
"date": "2019-05-17",
"count": 2
},
{
"date": "2019-05-19",
"count": 3
},
{
"date": "2019-05-21",
"count": 1
},
{
"date": "2019-05-25",
"count": 1
},
{
"date": "2019-05-26",
"count": 1
},
{
"date": "2019-05-31",
"count": 2
},
{
"date": "2019-06-02",
"count": 10
},
{
"date": "2019-06-03",
"count": 4
},
{
"date": "2019-06-04",
"count": 4
},
{
"date": "2019-06-05",
"count": 2
},
{
"date": "2019-06-06",
"count": 3
},
{
"date": "2019-06-07",
"count": 2
},
{
"date": "2019-06-10",
"count": 1
},
{
"date": "2019-06-11",
"count": 2
},
{
"date": "2019-06-12",
"count": 5
},
{
"date": "2019-06-13",
"count": 1
},
{
"date": "2019-06-17",
"count": 1
},
{
"date": "2019-06-18",
"count": 1
},
{
"date": "2019-06-19",
"count": 2
},
{
"date": "2019-06-20",
"count": 4
},
{
"date": "2019-06-21",
"count": 2
},
{
"date": "2019-06-23",
"count": 1
},
{
"date": "2019-06-24",
"count": 1
},
{
"date": "2019-06-26",
"count": 3
},
{
"date": "2019-06-27",
"count": 1
},
{
"date": "2019-06-28",
"count": 1
},
{
"date": "2019-06-30",
"count": 2
},
{
"date": "2019-07-01",
"count": 3
},
{
"date": "2019-07-03",
"count": 2
},
{
"date": "2019-07-05",
"count": 1
},
{
"date": "2019-07-06",
"count": 1
},
{
"date": "2019-07-11",
"count": 1
},
{
"date": "2019-07-12",
"count": 1
},
{
"date": "2019-07-15",
"count": 2
},
{
"date": "2019-07-18",
"count": 1
},
{
"date": "2019-07-20",
"count": 1
},
{
"date": "2019-07-22",
"count": 1
},
{
"date": "2019-07-23",
"count": 1
},
{
"date": "2019-07-26",
"count": 4
},
{
"date": "2019-07-30",
"count": 1
},
{
"date": "2019-07-31",
"count": 2
},
{
"date": "2019-08-01",
"count": 1
},
{
"date": "2019-08-05",
"count": 1
},
{
"date": "2019-08-07",
"count": 2
},
{
"date": "2019-08-08",
"count": 1
},
{
"date": "2019-08-14",
"count": 2
},
{
"date": "2019-08-15",
"count": 1
},
{
"date": "2019-08-16",
"count": 3
},
{
"date": "2019-08-19",
"count": 1
},
{
"date": "2019-08-23",
"count": 2
},
{
"date": "2019-08-24",
"count": 1
},
{
"date": "2019-08-26",
"count": 2
},
{
"date": "2019-08-30",
"count": 1
},
{
"date": "2019-08-31",
"count": 1
},
{
"date": "2019-09-03",
"count": 1
},
{
"date": "2019-09-04",
"count": 1
},
{
"date": "2019-09-06",
"count": 1
},
{
"date": "2019-09-09",
"count": 1
},
{
"date": "2019-09-13",
"count": 1
},
{
"date": "2019-09-15",
"count": 1
},
{
"date": "2019-09-16",
"count": 1
},
{
"date": "2019-09-17",
"count": 3
},
{
"date": "2019-09-18",
"count": 2
},
{
"date": "2019-09-19",
"count": 3
},
{
"date": "2019-09-21",
"count": 1
},
{
"date": "2019-09-24",
"count": 2
},
{
"date": "2019-09-25",
"count": 1
},
{
"date": "2019-09-26",
"count": 1
},
{
"date": "2019-09-29",
"count": 1
},
{
"date": "2019-10-04",
"count": 1
},
{
"date": "2019-10-05",
"count": 2
},
{
"date": "2019-10-06",
"count": 1
},
{
"date": "2019-10-07",
"count": 1
},
{
"date": "2019-10-08",
"count": 2
},
{
"date": "2019-10-09",
"count": 1
},
{
"date": "2019-10-16",
"count": 1
},
{
"date": "2019-10-19",
"count": 1
},
{
"date": "2019-10-20",
"count": 1
},
{
"date": "2019-10-22",
"count": 2
},
{
"date": "2019-10-23",
"count": 1
},
{
"date": "2019-10-24",
"count": 1
},
{
"date": "2019-10-26",
"count": 1
},
{
"date": "2019-10-31",
"count": 1
},
{
"date": "2019-11-01",
"count": 1
},
{
"date": "2019-11-04",
"count": 3
},
{
"date": "2019-11-08",
"count": 1
},
{
"date": "2019-11-12",
"count": 1
},
{
"date": "2019-11-13",
"count": 2
},
{
"date": "2019-11-18",
"count": 1
},
{
"date": "2019-11-19",
"count": 3
},
{
"date": "2019-11-22",
"count": 2
},
{
"date": "2019-11-25",
"count": 2
},
{
"date": "2019-11-27",
"count": 1
},
{
"date": "2019-11-28",
"count": 2
},
{
"date": "2019-11-29",
"count": 1
},
{
"date": "2019-11-30",
"count": 1
},
{
"date": "2019-12-02",
"count": 1
},
{
"date": "2019-12-03",
"count": 4
},
{
"date": "2019-12-04",
"count": 2
},
{
"date": "2019-12-06",
"count": 4
},
{
"date": "2019-12-08",
"count": 3
},
{
"date": "2019-12-10",
"count": 1
},
{
"date": "2019-12-11",
"count": 1
},
{
"date": "2019-12-26",
"count": 1
},
{
"date": "2020-01-01",
"count": 1
},
{
"date": "2020-01-02",
"count": 1
},
{
"date": "2020-01-04",
"count": 1
},
{
"date": "2020-01-05",
"count": 1
},
{
"date": "2020-01-06",
"count": 2
},
{
"date": "2020-01-07",
"count": 2
},
{
"date": "2020-01-08",
"count": 1
},
{
"date": "2020-01-11",
"count": 1
},
{
"date": "2020-01-16",
"count": 1
},
{
"date": "2020-01-17",
"count": 1
},
{
"date": "2020-01-21",
"count": 1
},
{
"date": "2020-02-03",
"count": 2
},
{
"date": "2020-02-04",
"count": 1
},
{
"date": "2020-02-06",
"count": 2
},
{
"date": "2020-02-10",
"count": 1
},
{
"date": "2020-02-13",
"count": 1
},
{
"date": "2020-02-16",
"count": 1
},
{
"date": "2020-02-17",
"count": 1
},
{
"date": "2020-02-19",
"count": 1
},
{
"date": "2020-02-24",
"count": 1
},
{
"date": "2020-02-25",
"count": 1
},
{
"date": "2020-03-04",
"count": 1
},
{
"date": "2020-03-05",
"count": 1
},
{
"date": "2020-03-06",
"count": 1
},
{
"date": "2020-03-09",
"count": 1
},
{
"date": "2020-03-11",
"count": 1
},
{
"date": "2020-03-12",
"count": 1
},
{
"date": "2020-03-13",
"count": 1
},
{
"date": "2020-03-15",
"count": 1
},
{
"date": "2020-03-20",
"count": 1
},
{
"date": "2020-03-24",
"count": 3
},
{
"date": "2020-03-25",
"count": 1
},
{
"date": "2020-03-26",
"count": 1
},
{
"date": "2020-03-27",
"count": 1
},
{
"date": "2020-03-31",
"count": 2
},
{
"date": "2020-04-02",
"count": 4
},
{
"date": "2020-04-03",
"count": 2
},
{
"date": "2020-04-06",
"count": 1
},
{
"date": "2020-04-08",
"count": 1
},
{
"date": "2020-04-10",
"count": 2
},
{
"date": "2020-04-11",
"count": 1
},
{
"date": "2020-04-14",
"count": 1
},
{
"date": "2020-04-15",
"count": 1
},
{
"date": "2020-04-16",
"count": 3
},
{
"date": "2020-04-18",
"count": 1
},
{
"date": "2020-04-20",
"count": 1
},
{
"date": "2020-04-21",
"count": 1
},
{
"date": "2020-04-22",
"count": 2
},
{
"date": "2020-04-24",
"count": 1
},
{
"date": "2020-04-26",
"count": 1
},
{
"date": "2020-04-28",
"count": 2
},
{
"date": "2020-04-30",
"count": 2
},
{
"date": "2020-05-01",
"count": 1
},
{
"date": "2020-05-06",
"count": 3
},
{
"date": "2020-05-07",
"count": 2
},
{
"date": "2020-05-08",
"count": 4
},
{
"date": "2020-05-19",
"count": 1
},
{
"date": "2020-05-20",
"count": 1
},
{
"date": "2020-05-21",
"count": 1
},
{
"date": "2020-05-24",
"count": 1
},
{
"date": "2020-05-28",
"count": 1
},
{
"date": "2020-05-29",
"count": 2
},
{
"date": "2020-06-01",
"count": 1
},
{
"date": "2020-06-04",
"count": 1
},
{
"date": "2020-06-05",
"count": 1
},
{
"date": "2020-06-06",
"count": 1
},
{
"date": "2020-06-09",
"count": 2
},
{
"date": "2020-06-10",
"count": 3
},
{
"date": "2020-06-15",
"count": 2
},
{
"date": "2020-06-18",
"count": 1
},
{
"date": "2020-06-22",
"count": 2
},
{
"date": "2020-06-24",
"count": 1
},
{
"date": "2020-06-26",
"count": 1
},
{
"date": "2020-06-27",
"count": 1
},
{
"date": "2020-06-29",
"count": 1
},
{
"date": "2020-07-04",
"count": 2
},
{
"date": "2020-07-06",
"count": 2
},
{
"date": "2020-07-09",
"count": 1
},
{
"date": "2020-07-10",
"count": 1
},
{
"date": "2020-07-14",
"count": 1
},
{
"date": "2020-07-15",
"count": 1
},
{
"date": "2020-07-16",
"count": 1
},
{
"date": "2020-07-22",
"count": 1
},
{
"date": "2020-07-23",
"count": 1
},
{
"date": "2020-07-24",
"count": 1
},
{
"date": "2020-08-02",
"count": 1
},
{
"date": "2020-08-11",
"count": 1
},
{
"date": "2020-08-19",
"count": 1
},
{
"date": "2020-08-21",
"count": 1
},
{
"date": "2020-08-23",
"count": 1
},
{
"date": "2020-08-28",
"count": 1
},
{
"date": "2020-08-29",
"count": 1
},
{
"date": "2020-09-08",
"count": 1
},
{
"date": "2020-09-09",
"count": 1
},
{
"date": "2020-09-11",
"count": 1
},
{
"date": "2020-09-14",
"count": 1
},
{
"date": "2020-09-22",
"count": 1
},
{
"date": "2020-09-25",
"count": 1
},
{
"date": "2020-09-29",
"count": 2
},
{
"date": "2020-10-02",
"count": 1
},
{
"date": "2020-10-04",
"count": 1
},
{
"date": "2020-10-10",
"count": 1
},
{
"date": "2020-10-13",
"count": 1
},
{
"date": "2020-10-15",
"count": 1
},
{
"date": "2020-10-19",
"count": 1
},
{
"date": "2020-10-20",
"count": 1
},
{
"date": "2020-10-23",
"count": 1
},
{
"date": "2020-10-25",
"count": 1
},
{
"date": "2020-10-31",
"count": 1
},
{
"date": "2020-11-03",
"count": 1
},
{
"date": "2020-11-10",
"count": 2
},
{
"date": "2020-11-14",
"count": 1
},
{
"date": "2020-11-15",
"count": 1
},
{
"date": "2020-11-17",
"count": 2
},
{
"date": "2020-11-20",
"count": 1
},
{
"date": "2020-11-22",
"count": 1
},
{
"date": "2020-11-25",
"count": 1
},
{
"date": "2020-12-03",
"count": 1
},
{
"date": "2020-12-04",
"count": 1
},
{
"date": "2020-12-05",
"count": 1
},
{
"date": "2020-12-09",
"count": 1
},
{
"date": "2020-12-13",
"count": 1
},
{
"date": "2020-12-15",
"count": 1
},
{
"date": "2020-12-16",
"count": 1
},
{
"date": "2020-12-20",
"count": 1
},
{
"date": "2020-12-21",
"count": 2
},
{
"date": "2020-12-26",
"count": 1
},
{
"date": "2020-12-28",
"count": 1
},
{
"date": "2020-12-31",
"count": 2
},
{
"date": "2021-01-04",
"count": 1
},
{
"date": "2021-01-07",
"count": 1
},
{
"date": "2021-01-09",
"count": 2
},
{
"date": "2021-01-11",
"count": 3
},
{
"date": "2021-01-12",
"count": 2
},
{
"date": "2021-01-16",
"count": 1
},
{
"date": "2021-01-18",
"count": 2
},
{
"date": "2021-01-19",
"count": 2
},
{
"date": "2021-01-20",
"count": 1
},
{
"date": "2021-01-21",
"count": 1
},
{
"date": "2021-01-23",
"count": 1
},
{
"date": "2021-01-25",
"count": 1
},
{
"date": "2021-01-27",
"count": 1
},
{
"date": "2021-01-30",
"count": 1
},
{
"date": "2021-02-03",
"count": 1
},
{
"date": "2021-02-05",
"count": 1
},
{
"date": "2021-02-07",
"count": 1
},
{
"date": "2021-02-09",
"count": 1
},
{
"date": "2021-02-16",
"count": 2
},
{
"date": "2021-02-19",
"count": 1
},
{
"date": "2021-02-20",
"count": 1
},
{
"date": "2021-02-22",
"count": 1
},
{
"date": "2021-02-25",
"count": 1
},
{
"date": "2021-02-26",
"count": 1
},
{
"date": "2021-02-27",
"count": 1
},
{
"date": "2021-03-03",
"count": 1
},
{
"date": "2021-03-07",
"count": 1
},
{
"date": "2021-03-12",
"count": 1
},
{
"date": "2021-03-15",
"count": 1
},
{
"date": "2021-03-16",
"count": 2
},
{
"date": "2021-03-21",
"count": 2
},
{
"date": "2021-03-26",
"count": 1
},
{
"date": "2021-03-31",
"count": 1
},
{
"date": "2021-04-12",
"count": 1
},
{
"date": "2021-04-14",
"count": 1
},
{
"date": "2021-04-24",
"count": 1
},
{
"date": "2021-04-25",
"count": 1
},
{
"date": "2021-04-26",
"count": 1
},
{
"date": "2021-04-27",
"count": 2
},
{
"date": "2021-04-28",
"count": 1
},
{
"date": "2021-05-08",
"count": 1
},
{
"date": "2021-05-14",
"count": 1
},
{
"date": "2021-05-15",
"count": 1
},
{
"date": "2021-05-16",
"count": 1
},
{
"date": "2021-05-18",
"count": 2
},
{
"date": "2021-05-20",
"count": 1
},
{
"date": "2021-05-24",
"count": 1
},
{
"date": "2021-05-25",
"count": 2
},
{
"date": "2021-05-27",
"count": 2
},
{
"date": "2021-06-01",
"count": 2
},
{
"date": "2021-06-06",
"count": 1
},
{
"date": "2021-06-07",
"count": 1
},
{
"date": "2021-06-08",
"count": 1
},
{
"date": "2021-06-12",
"count": 1
},
{
"date": "2021-06-14",
"count": 1
},
{
"date": "2021-06-22",
"count": 1
},
{
"date": "2021-06-23",
"count": 1
},
{
"date": "2021-06-30",
"count": 2
},
{
"date": "2021-07-04",
"count": 1
},
{
"date": "2021-07-07",
"count": 1
},
{
"date": "2021-07-08",
"count": 1
},
{
"date": "2021-07-11",
"count": 1
},
{
"date": "2021-07-16",
"count": 1
},
{
"date": "2021-07-20",
"count": 1
},
{
"date": "2021-07-22",
"count": 1
},
{
"date": "2021-07-27",
"count": 1
},
{
"date": "2021-08-10",
"count": 1
},
{
"date": "2021-08-16",
"count": 1
},
{
"date": "2021-08-17",
"count": 1
},
{
"date": "2021-08-20",
"count": 1
},
{
"date": "2021-08-22",
"count": 1
},
{
"date": "2021-09-02",
"count": 1
},
{
"date": "2021-09-06",
"count": 1
},
{
"date": "2021-09-08",
"count": 1
},
{
"date": "2021-09-10",
"count": 1
},
{
"date": "2021-09-12",
"count": 1
},
{
"date": "2021-09-15",
"count": 1
},
{
"date": "2021-09-18",
"count": 1
},
{
"date": "2021-09-23",
"count": 1
},
{
"date": "2021-09-29",
"count": 1
},
{
"date": "2021-10-04",
"count": 1
},
{
"date": "2021-10-10",
"count": 1
},
{
"date": "2021-10-13",
"count": 1
},
{
"date": "2021-10-18",
"count": 2
},
{
"date": "2021-10-20",
"count": 1
},
{
"date": "2021-10-23",
"count": 1
},
{
"date": "2021-10-28",
"count": 1
},
{
"date": "2021-10-29",
"count": 1
},
{
"date": "2021-11-05",
"count": 1
},
{
"date": "2021-11-06",
"count": 1
},
{
"date": "2021-11-11",
"count": 1
},
{
"date": "2021-11-14",
"count": 1
},
{
"date": "2021-11-22",
"count": 1
},
{
"date": "2021-11-24",
"count": 1
},
{
"date": "2021-11-28",
"count": 1
},
{
"date": "2021-11-29",
"count": 2
},
{
"date": "2021-11-30",
"count": 1
},
{
"date": "2021-12-04",
"count": 1
},
{
"date": "2021-12-07",
"count": 1
},
{
"date": "2021-12-14",
"count": 1
},
{
"date": "2021-12-15",
"count": 1
},
{
"date": "2021-12-17",
"count": 1
},
{
"date": "2021-12-19",
"count": 1
},
{
"date": "2021-12-20",
"count": 1
},
{
"date": "2021-12-21",
"count": 1
},
{
"date": "2021-12-22",
"count": 1
},
{
"date": "2021-12-23",
"count": 1
},
{
"date": "2021-12-24",
"count": 1
},
{
"date": "2021-12-25",
"count": 2
},
{
"date": "2021-12-26",
"count": 1
},
{
"date": "2021-12-27",
"count": 1
},
{
"date": "2021-12-28",
"count": 3
},
{
"date": "2021-12-30",
"count": 1
},
{
"date": "2022-01-02",
"count": 2
},
{
"date": "2022-01-03",
"count": 1
},
{
"date": "2022-01-05",
"count": 2
},
{
"date": "2022-01-09",
"count": 1
},
{
"date": "2022-01-10",
"count": 1
},
{
"date": "2022-01-13",
"count": 2
},
{
"date": "2022-01-19",
"count": 1
},
{
"date": "2022-01-20",
"count": 1
},
{
"date": "2022-01-22",
"count": 1
},
{
"date": "2022-01-25",
"count": 1
},
{
"date": "2022-01-26",
"count": 2
},
{
"date": "2022-01-29",
"count": 1
},
{
"date": "2022-02-05",
"count": 1
},
{
"date": "2022-02-07",
"count": 1
},
{
"date": "2022-02-08",
"count": 2
},
{
"date": "2022-02-09",
"count": 1
},
{
"date": "2022-02-11",
"count": 1
},
{
"date": "2022-02-13",
"count": 1
},
{
"date": "2022-02-14",
"count": 1
},
{
"date": "2022-02-16",
"count": 1
},
{
"date": "2022-02-28",
"count": 2
},
{
"date": "2022-03-01",
"count": 1
},
{
"date": "2022-03-06",
"count": 1
},
{
"date": "2022-03-08",
"count": 1
},
{
"date": "2022-03-11",
"count": 2
},
{
"date": "2022-03-14",
"count": 2
},
{
"date": "2022-03-17",
"count": 1
},
{
"date": "2022-03-19",
"count": 2
},
{
"date": "2022-03-21",
"count": 1
},
{
"date": "2022-03-22",
"count": 1
},
{
"date": "2022-03-28",
"count": 1
},
{
"date": "2022-03-29",
"count": 2
},
{
"date": "2022-04-02",
"count": 1
},
{
"date": "2022-04-03",
"count": 1
},
{
"date": "2022-04-08",
"count": 1
},
{
"date": "2022-04-14",
"count": 1
},
{
"date": "2022-04-16",
"count": 1
},
{
"date": "2022-04-22",
"count": 1
},
{
"date": "2022-04-29",
"count": 1
},
{
"date": "2022-05-02",
"count": 2
},
{
"date": "2022-05-07",
"count": 1
},
{
"date": "2022-05-12",
"count": 1
},
{
"date": "2022-05-16",
"count": 1
},
{
"date": "2022-05-17",
"count": 2
},
{
"date": "2022-05-19",
"count": 1
},
{
"date": "2022-05-23",
"count": 1
},
{
"date": "2022-05-26",
"count": 1
},
{
"date": "2022-05-29",
"count": 3
},
{
"date": "2022-05-31",
"count": 2
},
{
"date": "2022-06-03",
"count": 1
},
{
"date": "2022-06-14",
"count": 1
},
{
"date": "2022-06-16",
"count": 1
},
{
"date": "2022-06-20",
"count": 1
},
{
"date": "2022-06-21",
"count": 2
},
{
"date": "2022-06-25",
"count": 1
},
{
"date": "2022-06-29",
"count": 1
},
{
"date": "2022-07-03",
"count": 3
},
{
"date": "2022-07-13",
"count": 1
},
{
"date": "2022-07-18",
"count": 1
},
{
"date": "2022-07-21",
"count": 1
},
{
"date": "2022-07-27",
"count": 2
},
{
"date": "2022-08-01",
"count": 1
},
{
"date": "2022-08-04",
"count": 2
},
{
"date": "2022-08-09",
"count": 1
},
{
"date": "2022-08-11",
"count": 1
},
{
"date": "2022-08-14",
"count": 1
},
{
"date": "2022-08-18",
"count": 1
},
{
"date": "2022-08-22",
"count": 1
},
{
"date": "2022-08-25",
"count": 2
},
{
"date": "2022-08-26",
"count": 1
},
{
"date": "2022-09-04",
"count": 2
},
{
"date": "2022-09-05",
"count": 1
},
{
"date": "2022-09-11",
"count": 2
},
{
"date": "2022-09-13",
"count": 1
},
{
"date": "2022-09-14",
"count": 1
},
{
"date": "2022-09-16",
"count": 1
},
{
"date": "2022-09-19",
"count": 1
},
{
"date": "2022-09-29",
"count": 1
},
{
"date": "2022-10-05",
"count": 1
},
{
"date": "2022-10-06",
"count": 1
},
{
"date": "2022-10-08",
"count": 1
},
{
"date": "2022-10-17",
"count": 1
},
{
"date": "2022-10-20",
"count": 1
},
{
"date": "2022-10-30",
"count": 2
},
{
"date": "2022-11-01",
"count": 2
},
{
"date": "2022-11-10",
"count": 1
},
{
"date": "2022-11-11",
"count": 1
},
{
"date": "2022-11-17",
"count": 1
},
{
"date": "2022-11-20",
"count": 1
},
{
"date": "2022-11-22",
"count": 1
},
{
"date": "2022-11-23",
"count": 1
},
{
"date": "2022-11-24",
"count": 1
},
{
"date": "2022-11-26",
"count": 1
},
{
"date": "2022-11-28",
"count": 1
},
{
"date": "2022-12-02",
"count": 1
},
{
"date": "2022-12-03",
"count": 2
},
{
"date": "2022-12-05",
"count": 2
},
{
"date": "2022-12-11",
"count": 1
},
{
"date": "2022-12-13",
"count": 1
},
{
"date": "2022-12-14",
"count": 1
},
{
"date": "2022-12-15",
"count": 1
},
{
"date": "2022-12-20",
"count": 1
},
{
"date": "2023-01-10",
"count": 1
},
{
"date": "2023-01-13",
"count": 1
},
{
"date": "2023-01-21",
"count": 1
},
{
"date": "2023-02-09",
"count": 1
},
{
"date": "2023-02-11",
"count": 1
},
{
"date": "2023-02-15",
"count": 1
},
{
"date": "2023-02-16",
"count": 1
},
{
"date": "2023-02-18",
"count": 1
},
{
"date": "2023-02-26",
"count": 1
},
{
"date": "2023-03-02",
"count": 1
},
{
"date": "2023-03-03",
"count": 1
},
{
"date": "2023-03-06",
"count": 2
},
{
"date": "2023-03-11",
"count": 1
},
{
"date": "2023-03-12",
"count": 1
},
{
"date": "2023-03-21",
"count": 1
},
{
"date": "2023-03-23",
"count": 1
},
{
"date": "2023-03-25",
"count": 1
},
{
"date": "2023-03-26",
"count": 1
},
{
"date": "2023-03-27",
"count": 1
},
{
"date": "2023-03-31",
"count": 2
},
{
"date": "2023-04-01",
"count": 1
},
{
"date": "2023-04-02",
"count": 1
},
{
"date": "2023-04-04",
"count": 1
},
{
"date": "2023-04-08",
"count": 1
},
{
"date": "2023-04-11",
"count": 1
},
{
"date": "2023-04-17",
"count": 1
},
{
"date": "2023-04-18",
"count": 1
},
{
"date": "2023-04-23",
"count": 2
},
{
"date": "2023-04-25",
"count": 1
},
{
"date": "2023-04-26",
"count": 1
},
{
"date": "2023-04-27",
"count": 1
},
{
"date": "2023-05-03",
"count": 1
},
{
"date": "2023-05-06",
"count": 1
},
{
"date": "2023-05-07",
"count": 1
},
{
"date": "2023-05-10",
"count": 2
},
{
"date": "2023-05-23",
"count": 1
},
{
"date": "2023-05-29",
"count": 1
},
{
"date": "2023-06-05",
"count": 1
},
{
"date": "2023-06-09",
"count": 2
},
{
"date": "2023-06-21",
"count": 1
},
{
"date": "2023-06-29",
"count": 1
},
{
"date": "2023-07-01",
"count": 1
},
{
"date": "2023-07-05",
"count": 2
},
{
"date": "2023-07-06",
"count": 1
},
{
"date": "2023-07-11",
"count": 3
},
{
"date": "2023-07-12",
"count": 1
},
{
"date": "2023-07-14",
"count": 2
},
{
"date": "2023-07-18",
"count": 1
},
{
"date": "2023-07-26",
"count": 1
},
{
"date": "2023-07-29",
"count": 1
},
{
"date": "2023-07-31",
"count": 1
},
{
"date": "2023-08-07",
"count": 1
},
{
"date": "2023-08-08",
"count": 1
},
{
"date": "2023-08-10",
"count": 2
},
{
"date": "2023-08-12",
"count": 2
},
{
"date": "2023-08-14",
"count": 3
},
{
"date": "2023-08-15",
"count": 4
},
{
"date": "2023-08-16",
"count": 3
},
{
"date": "2023-08-17",
"count": 1
},
{
"date": "2023-08-19",
"count": 1
},
{
"date": "2023-08-21",
"count": 1
},
{
"date": "2023-08-22",
"count": 4
},
{
"date": "2023-08-24",
"count": 1
},
{
"date": "2023-08-28",
"count": 1
},
{
"date": "2023-08-31",
"count": 1
},
{
"date": "2023-09-03",
"count": 1
},
{
"date": "2023-09-04",
"count": 1
},
{
"date": "2023-09-08",
"count": 1
},
{
"date": "2023-09-09",
"count": 1
},
{
"date": "2023-09-13",
"count": 1
},
{
"date": "2023-09-14",
"count": 1
},
{
"date": "2023-09-15",
"count": 1
},
{
"date": "2023-09-17",
"count": 1
},
{
"date": "2023-09-18",
"count": 1
},
{
"date": "2023-09-19",
"count": 1
},
{
"date": "2023-09-20",
"count": 1
},
{
"date": "2023-09-22",
"count": 1
},
{
"date": "2023-09-27",
"count": 2
},
{
"date": "2023-10-03",
"count": 1
},
{
"date": "2023-10-09",
"count": 1
},
{
"date": "2023-10-10",
"count": 1
},
{
"date": "2023-10-15",
"count": 1
},
{
"date": "2023-10-16",
"count": 3
},
{
"date": "2023-10-18",
"count": 1
},
{
"date": "2023-10-19",
"count": 3
},
{
"date": "2023-10-20",
"count": 1
},
{
"date": "2023-10-21",
"count": 2
},
{
"date": "2023-10-23",
"count": 2
},
{
"date": "2023-10-25",
"count": 1
},
{
"date": "2023-10-29",
"count": 1
},
{
"date": "2023-10-30",
"count": 2
},
{
"date": "2023-11-01",
"count": 1
},
{
"date": "2023-11-11",
"count": 1
},
{
"date": "2023-11-15",
"count": 1
},
{
"date": "2023-11-18",
"count": 1
},
{
"date": "2023-11-21",
"count": 1
},
{
"date": "2023-11-24",
"count": 1
},
{
"date": "2023-11-27",
"count": 1
},
{
"date": "2023-11-30",
"count": 1
},
{
"date": "2023-12-08",
"count": 1
},
{
"date": "2023-12-13",
"count": 2
},
{
"date": "2023-12-15",
"count": 1
},
{
"date": "2023-12-18",
"count": 1
},
{
"date": "2023-12-20",
"count": 1
},
{
"date": "2023-12-21",
"count": 1
},
{
"date": "2023-12-22",
"count": 1
},
{
"date": "2024-01-02",
"count": 1
},
{
"date": "2024-01-04",
"count": 1
},
{
"date": "2024-01-07",
"count": 1
},
{
"date": "2024-01-08",
"count": 1
},
{
"date": "2024-01-10",
"count": 1
},
{
"date": "2024-01-15",
"count": 1
},
{
"date": "2024-01-17",
"count": 1
},
{
"date": "2024-01-20",
"count": 1
},
{
"date": "2024-01-25",
"count": 1
},
{
"date": "2024-01-31",
"count": 2
},
{
"date": "2024-02-06",
"count": 1
},
{
"date": "2024-02-13",
"count": 1
},
{
"date": "2024-02-18",
"count": 1
},
{
"date": "2024-02-21",
"count": 1
},
{
"date": "2024-02-22",
"count": 1
},
{
"date": "2024-02-24",
"count": 1
},
{
"date": "2024-02-26",
"count": 2
},
{
"date": "2024-02-28",
"count": 2
},
{
"date": "2024-02-29",
"count": 1
},
{
"date": "2024-03-08",
"count": 1
},
{
"date": "2024-03-13",
"count": 1
},
{
"date": "2024-03-14",
"count": 1
},
{
"date": "2024-04-07",
"count": 1
},
{
"date": "2024-04-09",
"count": 1
},
{
"date": "2024-04-10",
"count": 1
},
{
"date": "2024-04-26",
"count": 1
},
{
"date": "2024-04-27",
"count": 1
},
{
"date": "2024-05-02",
"count": 1
},
{
"date": "2024-05-06",
"count": 1
},
{
"date": "2024-05-11",
"count": 1
},
{
"date": "2024-05-17",
"count": 1
},
{
"date": "2024-06-02",
"count": 1
},
{
"date": "2024-06-06",
"count": 1
},
{
"date": "2024-06-16",
"count": 1
},
{
"date": "2024-06-18",
"count": 1
},
{
"date": "2024-06-19",
"count": 1
},
{
"date": "2024-06-21",
"count": 2
},
{
"date": "2024-06-22",
"count": 1
},
{
"date": "2024-06-29",
"count": 1
},
{
"date": "2024-06-30",
"count": 1
},
{
"date": "2024-07-02",
"count": 4
},
{
"date": "2024-07-03",
"count": 2
},
{
"date": "2024-07-06",
"count": 1
},
{
"date": "2024-07-08",
"count": 1
},
{
"date": "2024-07-09",
"count": 1
},
{
"date": "2024-07-10",
"count": 2
},
{
"date": "2024-07-11",
"count": 1
},
{
"date": "2024-07-17",
"count": 2
},
{
"date": "2024-07-18",
"count": 1
},
{
"date": "2024-07-22",
"count": 1
},
{
"date": "2024-08-14",
"count": 1
},
{
"date": "2024-08-21",
"count": 1
},
{
"date": "2024-08-27",
"count": 1
},
{
"date": "2024-08-29",
"count": 1
},
{
"date": "2024-09-05",
"count": 1
},
{
"date": "2024-09-15",
"count": 1
},
{
"date": "2024-09-25",
"count": 1
},
{
"date": "2024-10-04",
"count": 1
},
{
"date": "2024-10-23",
"count": 1
},
{
"date": "2024-10-24",
"count": 1
},
{
"date": "2024-10-29",
"count": 1
},
{
"date": "2024-11-02",
"count": 1
},
{
"date": "2024-11-09",
"count": 1
},
{
"date": "2024-11-23",
"count": 1
},
{
"date": "2024-11-25",
"count": 2
},
{
"date": "2024-11-26",
"count": 1
},
{
"date": "2024-11-29",
"count": 1
},
{
"date": "2024-12-07",
"count": 1
},
{
"date": "2024-12-10",
"count": 1
},
{
"date": "2024-12-16",
"count": 2
},
{
"date": "2024-12-18",
"count": 1
},
{
"date": "2024-12-21",
"count": 1
},
{
"date": "2024-12-22",
"count": 3
},
{
"date": "2024-12-23",
"count": 2
},
{
"date": "2024-12-27",
"count": 2
},
{
"date": "2024-12-28",
"count": 1
},
{
"date": "2024-12-29",
"count": 1
},
{
"date": "2024-12-30",
"count": 1
},
{
"date": "2024-12-31",
"count": 1
},
{
"date": "2025-01-02",
"count": 1
},
{
"date": "2025-01-07",
"count": 1
},
{
"date": "2025-01-11",
"count": 1
},
{
"date": "2025-02-01",
"count": 1
},
{
"date": "2025-02-02",
"count": 1
},
{
"date": "2025-02-08",
"count": 1
},
{
"date": "2025-02-15",
"count": 1
},
{
"date": "2025-02-26",
"count": 1
},
{
"date": "2025-03-05",
"count": 1
},
{
"date": "2025-03-13",
"count": 3
},
{
"date": "2025-03-26",
"count": 1
},
{
"date": "2025-04-02",
"count": 1
},
{
"date": "2025-04-10",
"count": 2
},
{
"date": "2025-04-16",
"count": 1
},
{
"date": "2025-04-26",
"count": 1
},
{
"date": "2025-05-13",
"count": 1
},
{
"date": "2025-05-27",
"count": 2
},
{
"date": "2025-05-28",
"count": 1
},
{
"date": "2025-05-29",
"count": 2
},
{
"date": "2025-06-05",
"count": 2
},
{
"date": "2025-06-09",
"count": 1
},
{
"date": "2025-06-10",
"count": 1
},
{
"date": "2025-06-11",
"count": 1
},
{
"date": "2025-06-14",
"count": 1
},
{
"date": "2025-06-25",
"count": 1
},
{
"date": "2025-06-30",
"count": 2
},
{
"date": "2025-07-04",
"count": 1
},
{
"date": "2025-07-19",
"count": 1
},
{
"date": "2025-07-21",
"count": 1
},
{
"date": "2025-07-26",
"count": 1
},
{
"date": "2025-08-15",
"count": 1
},
{
"date": "2025-08-19",
"count": 2
},
{
"date": "2025-08-21",
"count": 1
},
{
"date": "2025-08-26",
"count": 1
},
{
"date": "2025-08-27",
"count": 1
},
{
"date": "2025-09-01",
"count": 1
},
{
"date": "2025-09-05",
"count": 1
},
{
"date": "2025-09-12",
"count": 1
},
{
"date": "2025-09-16",
"count": 1
},
{
"date": "2025-09-17",
"count": 1
},
{
"date": "2025-09-25",
"count": 2
},
{
"date": "2025-09-28",
"count": 1
},
{
"date": "2025-09-30",
"count": 1
},
{
"date": "2025-10-11",
"count": 1
},
{
"date": "2025-10-14",
"count": 1
},
{
"date": "2025-10-15",
"count": 1
},
{
"date": "2025-10-22",
"count": 1
},
{
"date": "2025-11-08",
"count": 1
},
{
"date": "2025-11-10",
"count": 1
},
{
"date": "2025-11-14",
"count": 1
},
{
"date": "2025-11-17",
"count": 2
},
{
"date": "2025-11-19",
"count": 1
},
{
"date": "2025-12-01",
"count": 1
},
{
"date": "2025-12-18",
"count": 1
},
{
"date": "2025-12-22",
"count": 1
},
{
"date": "2025-12-28",
"count": 1
},
{
"date": "2026-01-05",
"count": 1
},
{
"date": "2026-01-09",
"count": 1
},
{
"date": "2026-01-10",
"count": 1
},
{
"date": "2026-01-11",
"count": 1
},
{
"date": "2026-01-18",
"count": 1
},
{
"date": "2026-01-22",
"count": 2
},
{
"date": "2026-01-30",
"count": 2
},
{
"date": "2026-02-24",
"count": 1
},
{
"date": "2026-03-06",
"count": 1
},
{
"date": "2026-03-08",
"count": 1
},
{
"date": "2026-03-23",
"count": 1
},
{
"date": "2026-03-30",
"count": 1
},
{
"date": "2026-04-03",
"count": 1
},
{
"date": "2026-04-09",
"count": 1
},
{
"date": "2026-04-13",
"count": 1
},
{
"date": "2026-04-15",
"count": 1
},
{
"date": "2026-04-21",
"count": 1
},
{
"date": "2026-04-23",
"count": 1
},
{
"date": "2026-04-25",
"count": 1
},
{
"date": "2026-04-26",
"count": 2
},
{
"date": "2026-04-28",
"count": 1
},
{
"date": "2026-05-10",
"count": 1
},
{
"date": "2026-05-20",
"count": 1
},
{
"date": "2026-05-27",
"count": 1
},
{
"date": "2026-05-28",
"count": 2
},
{
"date": "2026-06-01",
"count": 1
},
{
"date": "2026-06-02",
"count": 1
},
{
"date": "2026-06-13",
"count": 1
},
{
"date": "2026-06-25",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-06-27",
"count": 1
},
{
"date": "2026-06-29",
"count": 1
},
{
"date": "2026-06-30",
"count": 1
},
{
"date": "2026-07-02",
"count": 1
},
{
"date": "2026-07-09",
"count": 1
},
{
"date": "2026-07-11",
"count": 1
}
],
"complete": false,
"collected": 1000,
"total_forks": 1298
},
"star_history": {
"days": [
{
"date": "2025-02-14",
"count": 1
},
{
"date": "2025-02-15",
"count": 2
},
{
"date": "2025-02-16",
"count": 1
},
{
"date": "2025-02-17",
"count": 4
},
{
"date": "2025-02-18",
"count": 3
},
{
"date": "2025-02-19",
"count": 1
},
{
"date": "2025-02-20",
"count": 1
},
{
"date": "2025-02-21",
"count": 2
},
{
"date": "2025-02-22",
"count": 3
},
{
"date": "2025-02-23",
"count": 4
},
{
"date": "2025-02-24",
"count": 3
},
{
"date": "2025-02-25",
"count": 3
},
{
"date": "2025-02-26",
"count": 3
},
{
"date": "2025-02-28",
"count": 3
},
{
"date": "2025-03-01",
"count": 1
},
{
"date": "2025-03-02",
"count": 2
},
{
"date": "2025-03-03",
"count": 5
},
{
"date": "2025-03-04",
"count": 2
},
{
"date": "2025-03-05",
"count": 6
},
{
"date": "2025-03-06",
"count": 2
},
{
"date": "2025-03-07",
"count": 4
},
{
"date": "2025-03-08",
"count": 1
},
{
"date": "2025-03-09",
"count": 1
},
{
"date": "2025-03-10",
"count": 3
},
{
"date": "2025-03-11",
"count": 7
},
{
"date": "2025-03-13",
"count": 5
},
{
"date": "2025-03-14",
"count": 3
},
{
"date": "2025-03-15",
"count": 2
},
{
"date": "2025-03-16",
"count": 1
},
{
"date": "2025-03-17",
"count": 4
},
{
"date": "2025-03-18",
"count": 3
},
{
"date": "2025-03-19",
"count": 1
},
{
"date": "2025-03-20",
"count": 3
},
{
"date": "2025-03-21",
"count": 3
},
{
"date": "2025-03-22",
"count": 2
},
{
"date": "2025-03-23",
"count": 1
},
{
"date": "2025-03-24",
"count": 3
},
{
"date": "2025-03-25",
"count": 1
},
{
"date": "2025-03-26",
"count": 5
},
{
"date": "2025-03-27",
"count": 1
},
{
"date": "2025-03-28",
"count": 4
},
{
"date": "2025-03-29",
"count": 1
},
{
"date": "2025-03-30",
"count": 2
},
{
"date": "2025-03-31",
"count": 2
},
{
"date": "2025-04-01",
"count": 5
},
{
"date": "2025-04-03",
"count": 2
},
{
"date": "2025-04-04",
"count": 1
},
{
"date": "2025-04-06",
"count": 2
},
{
"date": "2025-04-08",
"count": 5
},
{
"date": "2025-04-09",
"count": 3
},
{
"date": "2025-04-10",
"count": 8
},
{
"date": "2025-04-11",
"count": 1
},
{
"date": "2025-04-13",
"count": 1
},
{
"date": "2025-04-14",
"count": 4
},
{
"date": "2025-04-15",
"count": 4
},
{
"date": "2025-04-16",
"count": 4
},
{
"date": "2025-04-17",
"count": 2
},
{
"date": "2025-04-18",
"count": 6
},
{
"date": "2025-04-20",
"count": 2
},
{
"date": "2025-04-21",
"count": 2
},
{
"date": "2025-04-22",
"count": 2
},
{
"date": "2025-04-24",
"count": 1
},
{
"date": "2025-04-25",
"count": 1
},
{
"date": "2025-04-26",
"count": 2
},
{
"date": "2025-04-28",
"count": 2
},
{
"date": "2025-04-29",
"count": 4
},
{
"date": "2025-05-02",
"count": 2
},
{
"date": "2025-05-03",
"count": 2
},
{
"date": "2025-05-05",
"count": 2
},
{
"date": "2025-05-06",
"count": 1
},
{
"date": "2025-05-07",
"count": 3
},
{
"date": "2025-05-08",
"count": 4
},
{
"date": "2025-05-09",
"count": 2
},
{
"date": "2025-05-11",
"count": 2
},
{
"date": "2025-05-12",
"count": 4
},
{
"date": "2025-05-13",
"count": 3
},
{
"date": "2025-05-14",
"count": 2
},
{
"date": "2025-05-16",
"count": 1
},
{
"date": "2025-05-17",
"count": 1
},
{
"date": "2025-05-18",
"count": 3
},
{
"date": "2025-05-19",
"count": 4
},
{
"date": "2025-05-20",
"count": 2
},
{
"date": "2025-05-21",
"count": 3
},
{
"date": "2025-05-22",
"count": 4
},
{
"date": "2025-05-24",
"count": 2
},
{
"date": "2025-05-27",
"count": 22
},
{
"date": "2025-05-28",
"count": 50
},
{
"date": "2025-05-29",
"count": 26
},
{
"date": "2025-05-30",
"count": 14
},
{
"date": "2025-05-31",
"count": 5
},
{
"date": "2025-06-01",
"count": 1
},
{
"date": "2025-06-02",
"count": 2
},
{
"date": "2025-06-03",
"count": 3
},
{
"date": "2025-06-04",
"count": 3
},
{
"date": "2025-06-05",
"count": 3
},
{
"date": "2025-06-06",
"count": 2
},
{
"date": "2025-06-07",
"count": 4
},
{
"date": "2025-06-08",
"count": 1
},
{
"date": "2025-06-09",
"count": 3
},
{
"date": "2025-06-10",
"count": 5
},
{
"date": "2025-06-11",
"count": 4
},
{
"date": "2025-06-12",
"count": 1
},
{
"date": "2025-06-13",
"count": 3
},
{
"date": "2025-06-14",
"count": 2
},
{
"date": "2025-06-15",
"count": 3
},
{
"date": "2025-06-16",
"count": 3
},
{
"date": "2025-06-17",
"count": 2
},
{
"date": "2025-06-18",
"count": 3
},
{
"date": "2025-06-19",
"count": 1
},
{
"date": "2025-06-21",
"count": 4
},
{
"date": "2025-06-22",
"count": 3
},
{
"date": "2025-06-23",
"count": 3
},
{
"date": "2025-06-24",
"count": 5
},
{
"date": "2025-06-25",
"count": 6
},
{
"date": "2025-06-26",
"count": 1
},
{
"date": "2025-06-27",
"count": 1
},
{
"date": "2025-06-28",
"count": 2
},
{
"date": "2025-06-29",
"count": 1
},
{
"date": "2025-07-01",
"count": 1
},
{
"date": "2025-07-02",
"count": 2
},
{
"date": "2025-07-03",
"count": 5
},
{
"date": "2025-07-04",
"count": 1
},
{
"date": "2025-07-05",
"count": 1
},
{
"date": "2025-07-06",
"count": 2
},
{
"date": "2025-07-07",
"count": 1
},
{
"date": "2025-07-08",
"count": 1
},
{
"date": "2025-07-09",
"count": 2
},
{
"date": "2025-07-10",
"count": 2
},
{
"date": "2025-07-11",
"count": 4
},
{
"date": "2025-07-12",
"count": 2
},
{
"date": "2025-07-13",
"count": 1
},
{
"date": "2025-07-14",
"count": 1
},
{
"date": "2025-07-17",
"count": 6
},
{
"date": "2025-07-18",
"count": 1
},
{
"date": "2025-07-19",
"count": 2
},
{
"date": "2025-07-20",
"count": 3
},
{
"date": "2025-07-21",
"count": 3
},
{
"date": "2025-07-23",
"count": 3
},
{
"date": "2025-07-24",
"count": 1
},
{
"date": "2025-07-25",
"count": 1
},
{
"date": "2025-07-26",
"count": 2
},
{
"date": "2025-07-27",
"count": 2
},
{
"date": "2025-07-28",
"count": 1
},
{
"date": "2025-07-31",
"count": 3
},
{
"date": "2025-08-01",
"count": 5
},
{
"date": "2025-08-03",
"count": 2
},
{
"date": "2025-08-05",
"count": 4
},
{
"date": "2025-08-06",
"count": 1
},
{
"date": "2025-08-07",
"count": 2
},
{
"date": "2025-08-08",
"count": 3
},
{
"date": "2025-08-09",
"count": 1
},
{
"date": "2025-08-10",
"count": 3
},
{
"date": "2025-08-11",
"count": 1
},
{
"date": "2025-08-12",
"count": 1
},
{
"date": "2025-08-13",
"count": 1
},
{
"date": "2025-08-14",
"count": 2
},
{
"date": "2025-08-15",
"count": 3
},
{
"date": "2025-08-16",
"count": 1
},
{
"date": "2025-08-18",
"count": 3
},
{
"date": "2025-08-19",
"count": 1
},
{
"date": "2025-08-21",
"count": 2
},
{
"date": "2025-08-22",
"count": 4
},
{
"date": "2025-08-23",
"count": 1
},
{
"date": "2025-08-24",
"count": 7
},
{
"date": "2025-08-25",
"count": 2
},
{
"date": "2025-08-26",
"count": 2
},
{
"date": "2025-08-27",
"count": 2
},
{
"date": "2025-08-28",
"count": 1
},
{
"date": "2025-08-29",
"count": 2
},
{
"date": "2025-08-30",
"count": 1
},
{
"date": "2025-09-01",
"count": 4
},
{
"date": "2025-09-02",
"count": 2
},
{
"date": "2025-09-04",
"count": 1
},
{
"date": "2025-09-07",
"count": 1
},
{
"date": "2025-09-08",
"count": 3
},
{
"date": "2025-09-09",
"count": 2
},
{
"date": "2025-09-10",
"count": 1
},
{
"date": "2025-09-11",
"count": 3
},
{
"date": "2025-09-12",
"count": 1
},
{
"date": "2025-09-13",
"count": 3
},
{
"date": "2025-09-15",
"count": 3
},
{
"date": "2025-09-16",
"count": 2
},
{
"date": "2025-09-17",
"count": 3
},
{
"date": "2025-09-19",
"count": 2
},
{
"date": "2025-09-20",
"count": 2
},
{
"date": "2025-09-21",
"count": 1
},
{
"date": "2025-09-22",
"count": 4
},
{
"date": "2025-09-23",
"count": 2
},
{
"date": "2025-09-25",
"count": 1
},
{
"date": "2025-09-27",
"count": 1
},
{
"date": "2025-09-28",
"count": 1
},
{
"date": "2025-09-29",
"count": 3
},
{
"date": "2025-10-02",
"count": 2
},
{
"date": "2025-10-03",
"count": 2
},
{
"date": "2025-10-04",
"count": 1
},
{
"date": "2025-10-05",
"count": 2
},
{
"date": "2025-10-06",
"count": 1
},
{
"date": "2025-10-07",
"count": 1
},
{
"date": "2025-10-08",
"count": 2
},
{
"date": "2025-10-09",
"count": 3
},
{
"date": "2025-10-10",
"count": 1
},
{
"date": "2025-10-11",
"count": 3
},
{
"date": "2025-10-12",
"count": 1
},
{
"date": "2025-10-13",
"count": 1
},
{
"date": "2025-10-14",
"count": 2
},
{
"date": "2025-10-15",
"count": 3
},
{
"date": "2025-10-16",
"count": 1
},
{
"date": "2025-10-17",
"count": 3
},
{
"date": "2025-10-18",
"count": 2
},
{
"date": "2025-10-20",
"count": 4
},
{
"date": "2025-10-21",
"count": 1
},
{
"date": "2025-10-22",
"count": 2
},
{
"date": "2025-10-23",
"count": 1
},
{
"date": "2025-10-24",
"count": 1
},
{
"date": "2025-10-25",
"count": 1
},
{
"date": "2025-10-26",
"count": 1
},
{
"date": "2025-10-28",
"count": 2
},
{
"date": "2025-10-29",
"count": 1
},
{
"date": "2025-10-30",
"count": 1
},
{
"date": "2025-11-01",
"count": 1
},
{
"date": "2025-11-02",
"count": 1
},
{
"date": "2025-11-03",
"count": 2
},
{
"date": "2025-11-04",
"count": 1
},
{
"date": "2025-11-05",
"count": 2
},
{
"date": "2025-11-07",
"count": 1
},
{
"date": "2025-11-08",
"count": 1
},
{
"date": "2025-11-10",
"count": 1
},
{
"date": "2025-11-11",
"count": 2
},
{
"date": "2025-11-12",
"count": 2
},
{
"date": "2025-11-14",
"count": 4
},
{
"date": "2025-11-16",
"count": 1
},
{
"date": "2025-11-17",
"count": 2
},
{
"date": "2025-11-18",
"count": 3
},
{
"date": "2025-11-19",
"count": 1
},
{
"date": "2025-11-20",
"count": 2
},
{
"date": "2025-11-21",
"count": 1
},
{
"date": "2025-11-24",
"count": 5
},
{
"date": "2025-11-25",
"count": 1
},
{
"date": "2025-11-26",
"count": 1
},
{
"date": "2025-11-29",
"count": 1
},
{
"date": "2025-11-30",
"count": 1
},
{
"date": "2025-12-03",
"count": 1
},
{
"date": "2025-12-05",
"count": 2
},
{
"date": "2025-12-06",
"count": 3
},
{
"date": "2025-12-09",
"count": 3
},
{
"date": "2025-12-10",
"count": 1
},
{
"date": "2025-12-14",
"count": 1
},
{
"date": "2025-12-15",
"count": 2
},
{
"date": "2025-12-16",
"count": 4
},
{
"date": "2025-12-17",
"count": 1
},
{
"date": "2025-12-18",
"count": 4
},
{
"date": "2025-12-19",
"count": 3
},
{
"date": "2025-12-20",
"count": 1
},
{
"date": "2025-12-21",
"count": 1
},
{
"date": "2025-12-22",
"count": 1
},
{
"date": "2025-12-23",
"count": 2
},
{
"date": "2025-12-25",
"count": 1
},
{
"date": "2025-12-26",
"count": 1
},
{
"date": "2025-12-27",
"count": 2
},
{
"date": "2025-12-28",
"count": 1
},
{
"date": "2025-12-30",
"count": 3
},
{
"date": "2025-12-31",
"count": 1
},
{
"date": "2026-01-01",
"count": 1
},
{
"date": "2026-01-02",
"count": 1
},
{
"date": "2026-01-05",
"count": 1
},
{
"date": "2026-01-06",
"count": 2
},
{
"date": "2026-01-07",
"count": 2
},
{
"date": "2026-01-12",
"count": 1
},
{
"date": "2026-01-13",
"count": 1
},
{
"date": "2026-01-14",
"count": 3
},
{
"date": "2026-01-15",
"count": 4
},
{
"date": "2026-01-16",
"count": 2
},
{
"date": "2026-01-18",
"count": 4
},
{
"date": "2026-01-19",
"count": 1
},
{
"date": "2026-01-20",
"count": 2
},
{
"date": "2026-01-21",
"count": 3
},
{
"date": "2026-01-22",
"count": 2
},
{
"date": "2026-01-23",
"count": 1
},
{
"date": "2026-01-24",
"count": 1
},
{
"date": "2026-01-27",
"count": 1
},
{
"date": "2026-01-28",
"count": 5
},
{
"date": "2026-01-29",
"count": 1
},
{
"date": "2026-01-30",
"count": 3
},
{
"date": "2026-01-31",
"count": 2
},
{
"date": "2026-02-02",
"count": 2
},
{
"date": "2026-02-06",
"count": 1
},
{
"date": "2026-02-07",
"count": 1
},
{
"date": "2026-02-08",
"count": 2
},
{
"date": "2026-02-09",
"count": 2
},
{
"date": "2026-02-12",
"count": 3
},
{
"date": "2026-02-14",
"count": 1
},
{
"date": "2026-02-15",
"count": 1
},
{
"date": "2026-02-16",
"count": 1
},
{
"date": "2026-02-18",
"count": 1
},
{
"date": "2026-02-19",
"count": 1
},
{
"date": "2026-02-20",
"count": 3
},
{
"date": "2026-02-22",
"count": 3
},
{
"date": "2026-02-25",
"count": 3
},
{
"date": "2026-02-26",
"count": 2
},
{
"date": "2026-02-27",
"count": 1
},
{
"date": "2026-02-28",
"count": 2
},
{
"date": "2026-03-01",
"count": 1
},
{
"date": "2026-03-02",
"count": 1
},
{
"date": "2026-03-04",
"count": 1
},
{
"date": "2026-03-06",
"count": 2
},
{
"date": "2026-03-07",
"count": 2
},
{
"date": "2026-03-08",
"count": 2
},
{
"date": "2026-03-10",
"count": 1
},
{
"date": "2026-03-11",
"count": 2
},
{
"date": "2026-03-12",
"count": 4
},
{
"date": "2026-03-13",
"count": 1
},
{
"date": "2026-03-15",
"count": 1
},
{
"date": "2026-03-16",
"count": 1
},
{
"date": "2026-03-17",
"count": 2
},
{
"date": "2026-03-18",
"count": 2
},
{
"date": "2026-03-21",
"count": 1
},
{
"date": "2026-03-22",
"count": 1
},
{
"date": "2026-03-23",
"count": 1
},
{
"date": "2026-03-24",
"count": 1
},
{
"date": "2026-03-26",
"count": 2
},
{
"date": "2026-03-27",
"count": 1
},
{
"date": "2026-03-29",
"count": 1
},
{
"date": "2026-03-30",
"count": 2
},
{
"date": "2026-03-31",
"count": 3
},
{
"date": "2026-04-01",
"count": 1
},
{
"date": "2026-04-02",
"count": 3
},
{
"date": "2026-04-03",
"count": 2
},
{
"date": "2026-04-04",
"count": 1
},
{
"date": "2026-04-05",
"count": 2
},
{
"date": "2026-04-06",
"count": 2
},
{
"date": "2026-04-08",
"count": 3
},
{
"date": "2026-04-10",
"count": 3
},
{
"date": "2026-04-11",
"count": 1
},
{
"date": "2026-04-12",
"count": 1
},
{
"date": "2026-04-14",
"count": 2
},
{
"date": "2026-04-15",
"count": 2
},
{
"date": "2026-04-16",
"count": 2
},
{
"date": "2026-04-17",
"count": 2
},
{
"date": "2026-04-18",
"count": 3
},
{
"date": "2026-04-19",
"count": 1
},
{
"date": "2026-04-20",
"count": 2
},
{
"date": "2026-04-21",
"count": 1
},
{
"date": "2026-04-22",
"count": 3
},
{
"date": "2026-04-23",
"count": 6
},
{
"date": "2026-04-24",
"count": 1
},
{
"date": "2026-04-25",
"count": 4
},
{
"date": "2026-04-26",
"count": 5
},
{
"date": "2026-04-27",
"count": 4
},
{
"date": "2026-04-28",
"count": 2
},
{
"date": "2026-04-29",
"count": 3
},
{
"date": "2026-04-30",
"count": 1
},
{
"date": "2026-05-01",
"count": 4
},
{
"date": "2026-05-03",
"count": 3
},
{
"date": "2026-05-04",
"count": 1
},
{
"date": "2026-05-05",
"count": 1
},
{
"date": "2026-05-06",
"count": 1
},
{
"date": "2026-05-08",
"count": 3
},
{
"date": "2026-05-09",
"count": 2
},
{
"date": "2026-05-10",
"count": 1
},
{
"date": "2026-05-11",
"count": 2
},
{
"date": "2026-05-13",
"count": 1
},
{
"date": "2026-05-14",
"count": 2
},
{
"date": "2026-05-15",
"count": 3
},
{
"date": "2026-05-16",
"count": 3
},
{
"date": "2026-05-17",
"count": 1
},
{
"date": "2026-05-18",
"count": 2
},
{
"date": "2026-05-19",
"count": 1
},
{
"date": "2026-05-20",
"count": 2
},
{
"date": "2026-05-22",
"count": 1
},
{
"date": "2026-05-25",
"count": 4
},
{
"date": "2026-05-26",
"count": 2
},
{
"date": "2026-05-27",
"count": 2
},
{
"date": "2026-05-28",
"count": 3
},
{
"date": "2026-05-29",
"count": 1
},
{
"date": "2026-05-30",
"count": 1
},
{
"date": "2026-05-31",
"count": 2
},
{
"date": "2026-06-03",
"count": 5
},
{
"date": "2026-06-04",
"count": 2
},
{
"date": "2026-06-07",
"count": 1
},
{
"date": "2026-06-12",
"count": 2
},
{
"date": "2026-06-15",
"count": 3
},
{
"date": "2026-06-16",
"count": 1
},
{
"date": "2026-06-18",
"count": 1
},
{
"date": "2026-06-19",
"count": 1
},
{
"date": "2026-06-20",
"count": 2
},
{
"date": "2026-06-21",
"count": 2
},
{
"date": "2026-06-22",
"count": 2
},
{
"date": "2026-06-23",
"count": 3
},
{
"date": "2026-06-24",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-06-27",
"count": 2
},
{
"date": "2026-06-28",
"count": 1
},
{
"date": "2026-06-29",
"count": 2
},
{
"date": "2026-06-30",
"count": 4
},
{
"date": "2026-07-01",
"count": 1
},
{
"date": "2026-07-02",
"count": 2
},
{
"date": "2026-07-03",
"count": 4
},
{
"date": "2026-07-04",
"count": 2
},
{
"date": "2026-07-05",
"count": 4
},
{
"date": "2026-07-06",
"count": 4
},
{
"date": "2026-07-07",
"count": 1
},
{
"date": "2026-07-09",
"count": 3
},
{
"date": "2026-07-10",
"count": 2
},
{
"date": "2026-07-11",
"count": 2
},
{
"date": "2026-07-12",
"count": 1
},
{
"date": "2026-07-13",
"count": 2
},
{
"date": "2026-07-15",
"count": 2
},
{
"date": "2026-07-16",
"count": 4
},
{
"date": "2026-07-17",
"count": 1
},
{
"date": "2026-07-18",
"count": 4
},
{
"date": "2026-07-20",
"count": 4
},
{
"date": "2026-07-21",
"count": 1
}
],
"complete": false,
"collected": 1000,
"total_stars": 12869
},
"open_issues_and_prs": 642
},
"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": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 3565102,
"source_files_sampled": 849,
"oversized_source_files": 16,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md",
"src/controllers/AGENTS.md",
"src/core/AGENTS.md",
"src/core/services/AGENTS.md",
"src/gui/AGENTS.md",
"src/models/AGENTS.md",
"src/utils/AGENTS.md",
"src/views/AGENTS.md",
"src/widgets/AGENTS.md",
"src/widgets/dialogs/AGENTS.md",
"tests/AGENTS.md"
],
"agent_instruction_max_bytes": 46330
},
"dependencies": {
"manifests": [],
"advisories": {
"error": "No resolved dependencies to assess",
"scope": "repository_graph",
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [],
"dependencies": [],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [],
"collected": true,
"truncated": false,
"total_count": 0,
"direct_count": 0,
"indirect_count": 0
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 206,
"open_issues": 642,
"closed_ratio": 0.72,
"closed_issues": 1648,
"closed_unmerged_prs": 36
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "tamlok",
"commits": 2935,
"avatar_url": "https://avatars.githubusercontent.com/u/5763157?v=4"
},
{
"type": "User",
"login": "feloxx",
"commits": 28,
"avatar_url": "https://avatars.githubusercontent.com/u/8359848?v=4"
},
{
"type": "User",
"login": "miurahr",
"commits": 16,
"avatar_url": "https://avatars.githubusercontent.com/u/123720?v=4"
},
{
"type": "User",
"login": "dbkuaizi",
"commits": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/44014601?v=4"
},
{
"type": "User",
"login": "Schips-Wong",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/20796750?v=4"
},
{
"type": "User",
"login": "xianzhon",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/3517710?v=4"
},
{
"type": "User",
"login": "henices",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/929715?v=4"
},
{
"type": "User",
"login": "BeyondXinXin",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/78600221?v=4"
},
{
"type": "User",
"login": "tanle",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/375182?v=4"
},
{
"type": "User",
"login": "tootal",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/40533565?v=4"
}
],
"contributors_sampled": 49,
"top_contributor_share": 0.959
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci-linux-tsan.yml",
"ci-linux.yml",
"ci-macos.yml",
"ci-win.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"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": 10,
"reason": "project has 6 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no 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 16 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": 0,
"reason": "no SAST tool detected",
"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": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "368366061196f00be12b847a52fe1111dec1bb16",
"ran_at": "2026-07-22T03:02:59Z",
"aggregate_score": 4.7,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-21T15:37:02Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-07T03:32:48Z",
"ci_last_conclusion": "FAILURE",
"oldest_open_issues": [
{
"number": 16,
"created_at": "2017-06-01T15:41:29Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 59,
"created_at": "2017-11-15T03:36:59Z",
"last_comment_at": "2020-03-21T22:01:33Z",
"last_comment_author": "eblanshey"
},
{
"number": 75,
"created_at": "2017-12-18T02:26:35Z",
"last_comment_at": "2017-12-18T23:47:47Z",
"last_comment_author": "tamlok"
},
{
"number": 86,
"created_at": "2018-01-02T02:23:14Z",
"last_comment_at": "2019-10-26T15:49:50Z",
"last_comment_author": "deerainw"
},
{
"number": 89,
"created_at": "2018-01-08T01:51:09Z",
"last_comment_at": "2022-05-24T15:01:51Z",
"last_comment_author": "haigear"
},
{
"number": 109,
"created_at": "2018-01-19T08:07:41Z",
"last_comment_at": "2018-09-23T03:09:28Z",
"last_comment_author": "tamlok"
},
{
"number": 117,
"created_at": "2018-01-24T16:19:35Z",
"last_comment_at": "2018-01-25T14:33:15Z",
"last_comment_author": "tamlok"
},
{
"number": 160,
"created_at": "2018-03-10T12:30:28Z",
"last_comment_at": "2021-09-18T03:34:44Z",
"last_comment_author": "HelloWorld886"
},
{
"number": 196,
"created_at": "2018-04-08T00:59:14Z",
"last_comment_at": "2018-04-08T13:47:41Z",
"last_comment_author": null
},
{
"number": 207,
"created_at": "2018-04-16T19:32:42Z",
"last_comment_at": "2018-09-26T09:19:02Z",
"last_comment_author": "fghhfg"
},
{
"number": 246,
"created_at": "2018-05-17T17:20:50Z",
"last_comment_at": "2019-10-26T15:50:23Z",
"last_comment_author": "deerainw"
},
{
"number": 251,
"created_at": "2018-05-24T00:25:34Z",
"last_comment_at": "2018-05-25T00:21:23Z",
"last_comment_author": "tamlok"
},
{
"number": 275,
"created_at": "2018-06-21T18:43:52Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 281,
"created_at": "2018-06-28T05:29:29Z",
"last_comment_at": "2019-12-31T09:51:12Z",
"last_comment_author": "BioinfoTongLI"
},
{
"number": 300,
"created_at": "2018-07-17T12:56:22Z",
"last_comment_at": "2018-07-23T06:17:31Z",
"last_comment_author": null
},
{
"number": 307,
"created_at": "2018-07-19T01:23:52Z",
"last_comment_at": "2019-12-12T02:38:02Z",
"last_comment_author": "charlescui"
},
{
"number": 309,
"created_at": "2018-07-19T15:06:30Z",
"last_comment_at": "2025-02-15T13:12:23Z",
"last_comment_author": "ilkosta"
},
{
"number": 313,
"created_at": "2018-07-23T01:33:00Z",
"last_comment_at": "2022-05-24T04:19:24Z",
"last_comment_author": "Fxiao1"
},
{
"number": 314,
"created_at": "2018-07-23T07:23:00Z",
"last_comment_at": "2018-07-24T04:57:33Z",
"last_comment_author": null
},
{
"number": 321,
"created_at": "2018-07-25T09:10:25Z",
"last_comment_at": "2023-04-16T03:29:28Z",
"last_comment_author": "wanqiufeng"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/vnotex/vnote",
"host": "github.com",
"name": "vnote",
"owner": "vnotex"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"security": 47,
"vitality": 65,
"community": 76,
"governance": 54,
"engineering": 76
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 65,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 72,
"inputs": {
"commits_last_year": 577,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 11
},
"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": "11/52 weeks with commits",
"points": 7.6,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 11
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "577 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 577
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 16 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "moderate",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"releases_count": 87,
"latest_release_tag": "continuous-build",
"releases_from_tags": false,
"days_since_latest_release": 2054,
"mean_days_between_releases": -148.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "87 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 87
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 2054 days ago",
"points": 0,
"status": "missed",
"details": [
{
"code": "release_recency",
"params": {
"days": 2054
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~-148.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": -148.9
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"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": 2,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 2 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 2
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "good",
"name": "Community & Adoption",
"value": 76,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "excellent",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 98,
"inputs": {
"forks": 1298,
"stars": 12869,
"watchers": 236,
"growth_state": "organic",
"growth_factor_pct": 100
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "12,869 stars",
"points": 60,
"status": "met",
"details": [
{
"code": "stars",
"params": {
"count": 12869
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "1,298 forks",
"points": 25,
"status": "met",
"details": [
{
"code": "forks",
"params": {
"count": 1298
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "236 watchers",
"points": 13.2,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 236
}
}
],
"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 (LGPL-3.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "LGPL-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": "moderate",
"name": "Sustainability & Governance",
"value": 54,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 33,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 49,
"top_contributor_share": 0.959
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 96% of commits",
"points": 0.9,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 96
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "49 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 49
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 6 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"merged_prs": 206,
"open_issues": 642,
"closed_issues": 1648,
"issue_closed_ratio": 0.72,
"closed_unmerged_prs": 36
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "72% of issues closed",
"points": 33.7,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 72
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "206/242 decided PRs merged",
"points": 32.6,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 206,
"decided": 242
}
}
],
"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": null,
"notes": [],
"value": 66,
"inputs": {
"followers": 98,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "vnotex",
"public_repos": 21,
"account_age_days": 2694
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "98 followers of vnotex",
"points": 14.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 98,
"login": "vnotex"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "21 public repos, account ~7 yr old",
"points": 21.8,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 21
}
},
{
"code": "account_age_years",
"params": {
"years": 7
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 76,
"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": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"topics": [
"vnote",
"vim",
"markdown",
"note-taking",
"note",
"editor",
"uml",
"mathjax"
],
"has_wiki": true,
"homepage": "https://app.vnote.fun",
"has_readme": true,
"has_docs_dir": true,
"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": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://app.vnote.fun",
"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": "8 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 8
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 47,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"ci_tests",
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 47,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 4.7
},
"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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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 6 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"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 16 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": "no SAST tool detected",
"points": 0,
"status": "missed",
"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": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"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": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 13
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 68,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.87,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md",
"src/controllers/AGENTS.md",
"src/core/AGENTS.md",
"src/core/services/AGENTS.md",
"src/gui/AGENTS.md",
"src/models/AGENTS.md",
"src/utils/AGENTS.md",
"src/views/AGENTS.md",
"src/widgets/AGENTS.md",
"src/widgets/dialogs/AGENTS.md",
"tests/AGENTS.md"
],
"agent_instruction_max_bytes": 46330
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md, src/controllers/AGENTS.md, src/core/AGENTS.md, src/core/services/AGENTS.md, src/gui/AGENTS.md, src/models/AGENTS.md, src/utils/AGENTS.md, src/views/AGENTS.md, src/widgets/AGENTS.md, src/widgets/dialogs/AGENTS.md, tests/AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md, src/controllers/AGENTS.md, src/core/AGENTS.md, src/core/services/AGENTS.md, src/gui/AGENTS.md, src/models/AGENTS.md, src/utils/AGENTS.md, src/views/AGENTS.md, src/widgets/AGENTS.md, src/widgets/dialogs/AGENTS.md, tests/AGENTS.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "87 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 87,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 43,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "Dockerfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile"
}
}
],
"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": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"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": 3565102,
"source_files_sampled": 849,
"oversized_source_files": 16
},
"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": "16/849 source files over 60KB",
"points": 54,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 849,
"oversized": 16
}
}
],
"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": [],
"report_type": "repository",
"generated_at": "2026-07-22T03:03:17.262750Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/v/vnotex/vnote.svg",
"full_name": "vnotex/vnote",
"license_state": "standard",
"license_spdx": "LGPL-3.0"
}