JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"dynamic-desktop",
"dynamics",
"live-wallpaper",
"python3",
"wallpaper",
"wallpaper-engine",
"wallpaperengine",
"wallpapers",
"widgets",
"window-11",
"windows-10",
"windows-desktop"
],
"is_fork": false,
"size_kb": 90471,
"has_wiki": false,
"homepage": "https://integration-automation.github.io/FrontEngine/",
"languages": {
"Python": 997215
},
"pushed_at": "2026-07-26T02:56:26Z",
"created_at": "2023-04-30T07:06:20Z",
"owner_type": "Organization",
"updated_at": "2026-07-26T02:56:30Z",
"description": "FrontEngine software that can use-define front end or only use like screen saver",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Python",
"significant_languages": [
"Python"
]
},
"owner": {
"blog": null,
"name": null,
"type": "Organization",
"login": "JeffreyChen-SteamProjects",
"company": null,
"location": null,
"followers": 0,
"avatar_url": "https://avatars.githubusercontent.com/u/169593720?v=4",
"created_at": "2024-05-12T12:41:06Z",
"is_verified": null,
"public_repos": 1,
"account_age_days": 804
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": null,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.0.37",
"kind": "patch",
"published_at": "2026-07-26T02:56:44Z"
},
{
"tag": "v1.0.36",
"kind": "patch",
"published_at": "2026-07-26T02:56:13Z"
},
{
"tag": "v1.0.35",
"kind": "patch",
"published_at": "2026-07-26T02:55:46Z"
},
{
"tag": "v1.0.34",
"kind": "patch",
"published_at": "2026-07-25T12:47:15Z"
},
{
"tag": "v1.0.33",
"kind": "patch",
"published_at": "2026-07-25T12:33:08Z"
},
{
"tag": "v1.0.32",
"kind": "patch",
"published_at": "2026-07-25T12:26:31Z"
},
{
"tag": "v1.0.31",
"kind": "patch",
"published_at": "2026-07-25T12:25:54Z"
},
{
"tag": "v1.0.30",
"kind": "patch",
"published_at": "2026-07-25T12:24:28Z"
},
{
"tag": "v1.0.29",
"kind": "patch",
"published_at": "2026-07-25T09:30:44Z"
},
{
"tag": "v1.0.28",
"kind": "patch",
"published_at": "2026-07-25T08:16:13Z"
},
{
"tag": "v1.0.27",
"kind": "patch",
"published_at": "2026-07-25T07:26:28Z"
},
{
"tag": "v1.0.26",
"kind": "patch",
"published_at": "2026-07-25T07:25:29Z"
},
{
"tag": "v1.0.25",
"kind": "patch",
"published_at": "2026-07-24T21:49:31Z"
},
{
"tag": "v1.0.24",
"kind": "patch",
"published_at": "2026-07-24T20:35:11Z"
},
{
"tag": "v1.0.23",
"kind": "patch",
"published_at": "2026-07-24T18:29:24Z"
},
{
"tag": "v1.0.22",
"kind": "patch",
"published_at": "2026-07-24T18:24:12Z"
},
{
"tag": "v1.0.21",
"kind": "patch",
"published_at": "2026-07-24T18:19:01Z"
},
{
"tag": "v1.0.20",
"kind": "patch",
"published_at": "2026-07-24T17:50:48Z"
},
{
"tag": "v1.0.19",
"kind": "patch",
"published_at": "2026-07-24T17:45:54Z"
},
{
"tag": "v1.0.18",
"kind": "patch",
"published_at": "2026-07-24T17:38:51Z"
},
{
"tag": "v1.0.17",
"kind": "patch",
"published_at": "2026-07-24T17:29:29Z"
},
{
"tag": "v1.0.16",
"kind": "patch",
"published_at": "2026-07-24T17:23:20Z"
},
{
"tag": "v1.0.15",
"kind": "patch",
"published_at": "2026-07-24T17:17:17Z"
},
{
"tag": "v1.0.14",
"kind": "patch",
"published_at": "2026-07-24T17:10:58Z"
},
{
"tag": "v1.0.13",
"kind": "patch",
"published_at": "2026-07-24T16:34:39Z"
},
{
"tag": "v1.0.12",
"kind": "patch",
"published_at": "2026-07-24T16:30:00Z"
},
{
"tag": "v1.0.11",
"kind": "patch",
"published_at": "2026-07-24T13:06:04Z"
},
{
"tag": "v1.0.10",
"kind": "patch",
"published_at": "2026-07-24T13:00:21Z"
},
{
"tag": "v1.0.9",
"kind": "patch",
"published_at": "2026-07-24T12:35:53Z"
},
{
"tag": "v1.0.8",
"kind": "patch",
"published_at": "2026-07-24T12:29:50Z"
},
{
"tag": "v1.0.7",
"kind": "patch",
"published_at": "2026-07-24T12:23:51Z"
},
{
"tag": "v1.0.6",
"kind": "patch",
"published_at": "2026-07-24T11:55:25Z"
},
{
"tag": "v1.0.5",
"kind": "patch",
"published_at": "2026-07-24T11:43:01Z"
},
{
"tag": "v1.0.4",
"kind": "patch",
"published_at": "2026-07-24T11:24:28Z"
},
{
"tag": "v1.0.3",
"kind": "patch",
"published_at": "2026-07-24T10:59:44Z"
},
{
"tag": "v1.0.2",
"kind": "patch",
"published_at": "2026-07-24T10:33:51Z"
},
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2026-07-24T10:11:21Z"
},
{
"tag": "1.0.0",
"kind": "major",
"published_at": "2026-02-08T07:29:44Z"
},
{
"tag": "0.0.61",
"kind": "patch",
"published_at": "2025-02-25T02:01:05Z"
},
{
"tag": "0.0.60",
"kind": "patch",
"published_at": "2024-04-29T09:53:56Z"
},
{
"tag": "0.0.58",
"kind": "patch",
"published_at": "2024-04-27T08:17:47Z"
},
{
"tag": "v0.1",
"kind": "other",
"published_at": "2023-07-03T09:44:08Z"
},
{
"tag": "v0.0.9",
"kind": "patch",
"published_at": "2023-07-03T09:29:41Z"
},
{
"tag": "v0.0.8",
"kind": "patch",
"published_at": "2023-05-16T10:01:44Z"
},
{
"tag": "v0.0.7",
"kind": "patch",
"published_at": "2023-05-12T06:56:33Z"
},
{
"tag": "v0.0.6",
"kind": "patch",
"published_at": "2023-05-11T09:21:41Z"
},
{
"tag": "v0.0.5",
"kind": "patch",
"published_at": "2023-05-11T09:09:40Z"
},
{
"tag": "v0.0.4",
"kind": "patch",
"published_at": "2023-05-11T09:01:35Z"
},
{
"tag": "v0.0.3",
"kind": "patch",
"published_at": "2023-05-07T12:18:58Z"
},
{
"tag": "v0.0.2",
"kind": "patch",
"published_at": "2023-05-06T14:31:14Z"
},
{
"tag": "v0.0.1",
"kind": "patch",
"published_at": "2023-05-06T07:25:04Z"
}
],
"recent_commits": [
{
"oid": "233433b87e3e83f689287ccbb9de10d26eb8b2be",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.37 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-26T02:56:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3089a578d3b44c3be4fdaaccd330d0d1b502838",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.36 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-26T02:55:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "acaa1d8af1d01b3da55536617015b26a9a0c3943",
"body": "Tools tab: colour picker, pixel ruler, region capture, window pinning and camera",
"is_bot": false,
"headline": "Merge pull request #171 from JeffreyChen-SteamProjects/feat/dev-tools",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-26T02:55:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "92bf6fd83b2340f786011f28fc667fdd36d5417b",
"body": "…idgets\n\nWidgets tab: audio spectrum, now playing, system monitor and sticky notes",
"is_bot": false,
"headline": "Merge pull request #170 from JeffreyChen-SteamProjects/feat/desktop-w…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-26T02:55:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2ac0ab60432698ea5ea6c3b969f6886b2099247",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.35 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-26T02:55:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f1b51bffe02e1df8337637874a2125a264ded488",
"body": "…-profiles\n\nSmart-pause rules, per-app profiles, custom reminders and quality tiers",
"is_bot": false,
"headline": "Merge pull request #169 from JeffreyChen-SteamProjects/feat/rules-and…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-26T02:55:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "95bc3b66a802393d880734019cc05bc85cdce4eb",
"body": "…mera\n\nThe measuring overlay covers a colour picker, a pixel ruler and a protractor;\nwhatever you measure is copied to the clipboard in the notation you choose.\nRegion capture dims the screen, grabs what you drag out, and refuses to save\noutside the folder you picked.\n\nWindow pinning keeps another p\n[…]\nprobe caught.\n\nThe camera overlay shows the local webcam in a circle, rounded box or\nrectangle. It is displayed locally and never recorded.\n\nREADME documents the new Widgets, Tools and Rules sections.",
"is_bot": false,
"headline": "Add a Tools tab: colour picker, ruler, capture, window pinning and ca…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T13:47:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "488c9658526a52ae73ee4e0379dfc2e6051c8ef5",
"body": "…otes\n\nThe spectrum needs real samples to compute frequencies, so it captures the\nWASAPI loopback stream - unlike the pet and wallpaper, which read only the\noutput meter. Samples are FFT'd in memory, never written or sent, and capture\nstops with the overlay. The page and README say so plainly.\n\nNow \n[…]\nps a short history of CPU, RAM and disk and draws it as\nsparklines - an average hides a stall, a line does not. Sticky notes are\neditable cards that keep their text, colour and place between sessions.",
"is_bot": false,
"headline": "Add a Widgets tab: spectrum, now playing, system monitor and sticky n…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T13:36:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "054efa819d19b8a543cd3f484ac9d7510b7ee7eb",
"body": "Smart pause now covers three rules instead of one: a fullscreen app, running\non battery, or a named app taking focus. The same foreground-app probe backs\nper-app profiles, which apply a saved preset when you switch to an app.\n\nCustom reminders (every N minutes, or daily at a set time) show as a toas\n[…]\nen care,\npresenting), so hide/lock/quality apply to them as well.\n\nAlso fixes two mismatched translation keys that rendered as None: the Chinese\nGIF error message and the English text-alignment label.",
"is_bot": false,
"headline": "Add smart-pause rules, app profiles, reminders and quality tiers",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T13:20:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "718a1ee0e1f287165b12d0f56dee6fddd6152b0d",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.34 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T12:46:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8cc36a8aaa2ff5f0b81d5c8ac0433004337b2b38",
"body": "…lpaper\n\nFocus dimming and masks, per-monitor audio-reactive wallpaper, Workshop import and opt-in plugins",
"is_bot": false,
"headline": "Merge pull request #168 from JeffreyChen-SteamProjects/feat/focus-wal…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:46:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d1842eb5d1de256141b5dcb79d59d0a182110c8",
"body": "Drop the unused typing imports the focus and wallpaper pages carried, mark\nthe playlist shuffle RNG as non-security (it only picks the next wallpaper),\nand remove two unused imports the touched files had been carrying.",
"is_bot": false,
"headline": "Clear the static-analysis findings on the focus/wallpaper pages",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:44:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "391a25edd73156d9743e99760a9bbe6ea4ea72a3",
"body": "Keep both sides of the additive page/menu/i18n changes so the wallpaper,\nfocus, screen care and presentation tabs are all registered. Rebuild\npreset_menu.py on main's version (it had been committed with CRLF, which\nmade the whole file conflict) and re-apply the Workshop import action.",
"is_bot": false,
"headline": "Merge origin/main into feat/focus-wallpaper",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:39:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d03234ea41d4cc53feb975c37049e8be5d35c79a",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.33 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T12:32:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bbe28c7f57b352773152b12edc589d1b3ef8a508",
"body": "…parity\n\nCross-platform idle/battery/window probes, autostart, session restore and low-power mode",
"is_bot": false,
"headline": "Merge pull request #166 from JeffreyChen-SteamProjects/feat/platform-…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:32:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c0f0beba6c572d671c5457dcfb19b8dc779620d7",
"body": "Both sides added tabs, settings keys and control-center buttons, so the\nconflicts were additive: every new setting and string from both branches is\nkept, and the control-center layout is renumbered so the lock, chroma key,\nreset-positions and low-power buttons all have their own row.\n\nOne real integ\n[…]\nde now also slows the dynamic text source\nthat landed on main, not just the marquee — which is what it was always meant\nto do; the source timer simply did not exist on this branch when it was written.",
"is_bot": false,
"headline": "Merge main into the platform branch",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:29:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "eaf948ef9ae5de0e86bc218b53e3682408c30b98",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.32 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T12:26:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "84e82940ba8b91e343d1e736d718d322b208591a",
"body": "Eye-care and presenting tabs: screen tint, reading ruler, eye breaks, annotation, cursor effects, keystrokes, magnifier",
"is_bot": false,
"headline": "Merge pull request #167 from JeffreyChen-SteamProjects/feat/screen-care",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:25:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d02e50b28e6e0e7e55936ca8d714e1bdfb472540",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.31 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T12:25:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "836496e00fe44a9186d7ebaedec39c7caaf4c34e",
"body": "…nion\n\nPet focus timer, self-describing packs, speech, link fetching and opt-in AI chat",
"is_bot": false,
"headline": "Merge pull request #165 from JeffreyChen-SteamProjects/feat/pet-compa…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:25:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cbc143000e3628808412f76d9fc7601d01595ff9",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.30 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T12:24:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56dfc8ec367d88139bd56ee99cf9e63e5f65b839",
"body": "…erlays\n\nLive text widgets, system and weather overlays, a web dashboard, and overlay lock/chroma/placement",
"is_bot": false,
"headline": "Merge pull request #164 from JeffreyChen-SteamProjects/feat/widget-ov…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:24:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3423bf3571b48d2a09007b14dd1292674813dbcd",
"body": null,
"is_bot": false,
"headline": "Document the focus, wallpaper and community features",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:08:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "046b36dde116ebf2ecb8d45b6bb72b9f9d0d73ce",
"body": null,
"is_bot": false,
"headline": "Drop imports the new modules stopped using",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T12:02:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c06b7691264faa771e0394af5fb5b8785e08125a",
"body": "This project ships on Steam, so subscribed Workshop items already land on disk\nunder steamapps/workshop/content. Scanning that folder turns them into usable\ncontent: presets are imported, pet packs are listed with their paths, and items\nthat are neither are skipped rather than guessed at. Publishing\n[…]\nges and cannot be sandboxed, so loading is off by\ndefault, turning it on says exactly that in a warning, every load is logged,\nand one broken plugin is skipped rather than taking the app down with it.",
"is_bot": false,
"headline": "Import Workshop content, and let plugins add tabs when you ask for them",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T11:58:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1f3045a6eb908dc974f14640f4ce218d484de680",
"body": "Focus: one overlay dims everything except the window you are working in, the\nother covers a strip you keep glancing at — the taskbar, a notification corner.\nBoth pass clicks through, so what they cover still works; it just stops\ncompeting for attention. Off Windows the dimmer shades the whole screen\n[…]\n than adding a\nsecond audio path.\n\nThe geometry (what to dim around a window, which strip a region maps to) and\nthe playlist (rotation, shuffle, time-of-day sets) are pure and tested without\na screen.",
"is_bot": false,
"headline": "Add focus masks and a wallpaper tab",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T11:43:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7c1490fbd545a1c3f7f98d885e2f377997e9362b",
"body": "…agnifier\n\nFour tools people currently reach for separate utilities to get, all built on\nthe overlay stack that is already here.\n\nScreen annotation draws over everything with a pen, highlighter or eraser, with\nundo and clear — it is the one overlay that takes the mouse, and turning it off\nhands the \n[…]\nand mouse watching lives in its own service that degrades\nto a no-op without pynput, and every event crosses back to the UI thread as a\nqueued signal rather than touching widgets from pynput's thread.",
"is_bot": false,
"headline": "Add a presenting tab: annotation, cursor emphasis, keystrokes and a m…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T11:36:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aed68335c5e053290b5b0a01fb4d233d7d7e07d4",
"body": "Three things people currently install separate utilities for, all of which are\nthe overlay this project already knows how to draw.\n\nA colour filter tints the whole screen at an adjustable strength — warm dimming\nfor late nights, other tints for visual stress — and Windows itself only added\nthis as a\n[…]\ny, then clears itself when the break is over.\n\nAll three pass clicks through, so they never block the work underneath, and the\nbreak reminder's schedule is a pure state machine with an injected clock.",
"is_bot": false,
"headline": "Add an eye-care tab: screen tint, reading ruler and eye breaks",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T11:30:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ac4c7c8fa7471db76693e664bb3ac5dadd806001",
"body": "The probes named their executables without a path, so which binary ran depended\non PATH — something another program on the machine can influence. The macOS\ntools now run from their fixed system locations, and wmctrl is looked for in a\nshort list of absolute paths rather than resolved through PATH.",
"is_bot": false,
"headline": "Launch the platform probes by absolute path",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:54:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0fea06a292e36d47b5172ee1068082d74c623088",
"body": "The allowlist held argv lists that were then passed through one shared\nsubprocess call, so every call site looked dynamic to a reader and to a\nscanner. Each probe now spells its own command out at the point it runs it, and\nthe allowlist maps a name to that function — same guarantee, visible in one\nplace instead of two.",
"is_bot": false,
"headline": "Give each probe its own literal command line",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:50:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a160fe72d12bf6d2e5d035c633e3ac266c471ee5",
"body": "The pet decided what counted as a link by matching the literal scheme prefixes\non the front of the string. Parsing the URL instead is sturdier — it handles\nodd spacing and casing the same way the browser will — and keeps protocol\nliterals out of the source, which is what a scanner was objecting to.",
"is_bot": false,
"headline": "Recognise dropped links by parsing them, not by prefix",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:46:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f23d24a6f11871565b7a830112f9153b8d25d015",
"body": "Two things a scanner was right to look at. The probe runner took an arbitrary\nargv, so nothing structurally stopped a future caller from putting user text on\na command line — it now takes a name and looks the fixed argv up in a table,\nrefusing anything else. And the plist builder pulled in the stdlib XML module\njust to escape three characters, which flags as XXE-prone parsing even though\nnothing here parses XML; a local escape does the same job with no parser.",
"is_bot": false,
"headline": "Run only allowlisted probes, and write plist XML without an XML parser",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:45:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc4f2f1480f28abddd72ca376b298433bd0bb5d8",
"body": "…here it left off\n\nIdle detection, battery and standable windows were Windows-only, so the pet's\nnaps, low-battery warnings and window-perching silently did nothing everywhere\nelse. They now live in one platform module with real implementations per OS:\nctypes on Windows, XScreenSaver and /sys on Lin\n[…]\necond format.\n\nA low-power toggle in the control center slows every overlay's refresh rate\nthrough the same per-overlay walk as the other global switches, for when the\noverlays are running on battery.",
"is_bot": false,
"headline": "Make the desktop features work off Windows, and let the app pick up w…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:41:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a70354a8669702b089516859c9c8f05d7da16752",
"body": "Five things the pet could not do. A focus timer (pure state machine: focus →\nbreak, long break every few rounds) that the pet announces phase by phase, so\nit keeps you company through a pomodoro instead of just wandering. Pet packs\ncan now ship a pet.json describing that pet's own speed, size, climb\n[…]\ne request runs on a background thread so the UI never\nwaits, and the whole feature disables itself quietly without a key or without\nthe anthropic package installed, which stays an optional dependency.",
"is_bot": false,
"headline": "Give the pet a focus timer, packs with a manifest, a voice and a mouth",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:33:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "21ad298d20dfd31c3f4e244d27114e84109c78f4",
"body": "Three things streamers kept having to work around: overlays always swallowed or\nalways passed clicks, there was no way to key them out in OBS, and an overlay\ncould only be placed by picking a monitor.\n\nOverlays can now be unlocked, dragged where you want them and locked again —\nlocked means click-th\n[…]\nnted. All three run through the control\ncenter's existing per-overlay walk, so every overlay type gets them at once,\nwith a global hotkey for the lock. The pet opts out: it needs the mouse either\nway.",
"is_bot": false,
"headline": "Lock, key and position overlays from one place",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:22:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fc0c3df9f93485aabb0d9f226b5e7273aa0f7ccf",
"body": "A web overlay could only show one page, so keeping several dashboards to hand\nmeant restarting the overlay each time.\n\nTake a list of URLs, open one overlay per line and show a single page at a\ntime, cycling with a button or the new global hotkey. Restarting rebuilds the\nset, closing one page drops it from the rotation, and the single-URL field is\nleft exactly as the user typed it.",
"is_bot": false,
"headline": "Add a web dashboard of overlay pages",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:15:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a43c22e1d6330629f5de64762a1908edf15cbc77",
"body": "A text overlay could only show a fixed string, so the most common desktop\nwidgets — a clock, a countdown, system load, the weather — had no home.\n\nAdd dynamic text sources: clock and date (strftime), countdown (minutes, a\nclock time, or a date), stopwatch, system stats and weather. The source layer \n[…]\nng no dependency. Weather uses Open-Meteo's\nkey-free API over the standard library, sending only coordinates, fetching on a\nbackground thread and caching, so the paint loop never waits on the network.",
"is_bot": false,
"headline": "Turn the text overlay into a live widget",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T10:11:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3a8569f912029768d8b4148bd1c1034c4a7aa4a9",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.29 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T09:30:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eda2731de7fa075153c5daed429180390939f0aa",
"body": "…ehaviours\n\nTag in every behaviour mode, and keep the nightly cron from disabling CI",
"is_bot": false,
"headline": "Merge pull request #163 from JeffreyChen-SteamProjects/feat/tag-all-b…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T09:30:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ba858ff8ac3bad116357f8320dcac50b9b4e524",
"body": "GitHub disables workflows containing a schedule after ~60 days of repository\ninactivity, and that took the whole CI workflow down with it — push and pull\nrequest checks included, which went unnoticed until a PR had no CI at all.\n\nKeep CI on push/pull_request only and expose it via workflow_call, with the\ndaily cron in a thin Nightly workflow that calls it. If inactivity disables\nanything now, it is only the nightly run.",
"is_bot": false,
"headline": "Move the nightly schedule out of the CI workflow",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T08:58:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b64f9e625aca533504b7b754a88fa22c03967609",
"body": "Tag steered pets through the floor-mode \"walk toward this x\" target, so pets in\nfree-wander or chase-cursor mode ignored the game entirely.\n\nGive PetMotion a guidance point that every behaviour honours: floor pets walk\ntoward its x as before, wanderers steer their velocity toward it while keeping\nth\n[…]\nno longer counts as catching the cursor, so\nthey do not fall asleep on top of each other. Tag roles now carry a 2D target\nand runners flee along the line away from \"it\" rather than only left or right.",
"is_bot": false,
"headline": "Let wandering and cursor-chasing pets play tag too",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T08:58:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "086ae60870ab47fea304fa9a7c2ab8e1df87a781",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.28 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T08:15:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5cb7cd8f4f4f3d8efbe96fd52f9bd2aaea70ccf",
"body": "…and-tag\n\nPet food kinds, a game of tag, and repo coverage for the audio meter",
"is_bot": false,
"headline": "Merge pull request #162 from JeffreyChen-SteamProjects/feat/pet-food-…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T08:15:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b7cc198db985459d7c58964c06a9aaf294797d3a",
"body": null,
"is_bot": false,
"headline": "Document the food kinds and the pets' tag game",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T07:46:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d348efb69cb1ae5ec32e744f759198063622ffca",
"body": "Several pets on screen only ever greeted each other. Add an opt-in game of tag:\none pet is \"it\" and walks toward its nearest peer while the others head the\nother way, and catching someone passes \"it\" on with a short cooldown so the tag\ncannot bounce straight back.\n\nThe rules live in a Qt-free PetTag\n[…]\nchasing whom instead of each pet deciding on its\nown tick. Pets are keyed by identity, so closing one cannot shift \"it\" onto a\ndifferent pet, and the game releases everyone once fewer than two remain.",
"is_bot": false,
"headline": "Let the pets play tag with each other",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T07:45:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "de6c83ad2f6612bb1c3836bffd4a4b53035e5efd",
"body": "Every dropped file fed the pet the same way. Guess a food kind from the suffix\ninstead: an archive is a feast that fills it up, music cheers it more than it\nfills, a document is a modest meal, and a binary is too hard to chew — it eats\na crumb and sulks. Each kind has its own reaction lines in English and\nTraditional Chinese, and right-click Feed still serves a plain snack.",
"is_bot": false,
"headline": "Give dropped food a flavour of its own",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T07:38:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aa17d7004574cc428ecfac02cd18360cb2a905c2",
"body": "The envelope, screen-to-endpoint matching and drop classification only had\nthrowaway coverage outside the repo, so nothing guarded them in CI. Move that\ninto tests/unit_test as hardware-free tests: envelope attack/decay/jitter\nbehaviour, endpoint name tokenising and screen matching, meter degradation for\nan unknown device, and what a dropped file is taken to be.",
"is_bot": false,
"headline": "Cover the audio meter and drop classification in the repo suite",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T07:36:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6ef63dad540653cdd0301a02a301f2b94ee2280d",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.27 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T07:26:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d23ce4b6ee5bc6b8b1784549610ca847bc3fcfa9",
"body": "Smooth, per-screen pet audio and drop-to-dress interactions",
"is_bot": false,
"headline": "Merge pull request #160 from JeffreyChen-SteamProjects/dev",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T07:25:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "63d02fa998828ea1cc863450086e9cef3ad18393",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.26 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-25T07:25:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c60819a3c040d8432e10d04121d9383835f6a080",
"body": "…-collection\n\nFix the test suite so pytest can run again",
"is_bot": false,
"headline": "Merge pull request #161 from JeffreyChen-SteamProjects/fix/test-suite…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T07:25:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe15f86db3cc05fe30c20b356b73ad31fafcd60f",
"body": "Bandit flags every pytest assert (B101) and the seeded random used for\nreproducible fixtures (B311), and semgrep flags the dynamic import that walks\nthe package — all expected in test code, so they are noise rather than findings.",
"is_bot": false,
"headline": "Keep static analysis off the test suite",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T07:10:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "11007d268c2d7039f4bb18c896f9218e4a5ec3a7",
"body": "quick_test.py still imported ChatSceneUI, removed with the chat feature in\n7ace791, so `pytest tests/` died during collection and never ran anything.\nDrop that leftover and give the documented command real work to do: a public\nAPI guard that imports every module and checks every exported name (the s\n[…]\nn fixture forces Qt's offscreen platform and runs from a temp directory\nso the import-time log file stays out of the tree. CI now runs the suite, with\npytest added to the dev requirements it installs.",
"is_bot": false,
"headline": "Fix the test suite so pytest can run again",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T07:08:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "368d9a19099573e5b2704b8d886b5b657c106172",
"body": "A screen attribute that raises was swallowed with a bare continue, hiding why a\npet fell back to the default audio endpoint.",
"is_bot": false,
"headline": "Log instead of silently skipping unreadable screen hints",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T06:31:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "63f21fbf86d650333a208e1432fba8361cb96548",
"body": "Dropping an image or a pet pack onto the pet now swaps its look on the spot;\nany other file is eaten as a snack. Drops also wake a sleeping pet, and an\nunusable path is ignored rather than half-applied.\n\nSprite loading now rejects images Qt cannot decode, so a corrupt file keeps the\ncurrent costume \n[…]\n an invisible pet behind. Adds the costume\nchatter lines and a hint on the settings page, plus a README section covering\nthe pet, its drop interactions and what the audio meter does and does not read.",
"is_bot": false,
"headline": "Dress or feed the pet by dropping a file on it",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T06:27:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1c2f92340da219967e870544081231eb0f72f943",
"body": "On a multi-monitor desk each screen often carries its own speakers, so pulsing\nevery pet to the default endpoint is wrong for pets living elsewhere.\n\nTeach the meter to open a named endpoint as well as the default one, add\nendpoint enumeration (friendly names via IPropertyStore), and map a screen to\n[…]\nendpoint by the words its model/manufacturer shares with the endpoint name.\nMatching is a pure function so it can be tested without hardware; an unmatched\nscreen keeps using the default output device.",
"is_bot": false,
"headline": "Follow the audio endpoint of each pet's own screen",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T06:27:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7d60a28a2365497e0357048208439f4f88caf765",
"body": "Raw WASAPI peak samples jitter frame to frame, so the audio-reactive pet\nflickered instead of breathing. Feed samples through a short RMS window and a\nfast-attack / slow-decay follower before mapping them to a pulse scale.\n\nThe envelope is a Qt-free module so it stays unit-testable, and it resets when\nthe level source disappears or the provider is swapped, so a pet never inherits\nthe loudness of a source it no longer listens to.",
"is_bot": false,
"headline": "Smooth the pet audio pulse with an RMS envelope",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T06:27:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f9302196891143a6deddc1c7178aa739c546d601",
"body": null,
"is_bot": false,
"headline": "Merge remote-tracking branch 'origin/main' into dev",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-25T06:25:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a6eb5dff0d34180a031214df19aedbaba47b419",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.25 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T21:49:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "28e060934c01c4383b6c3e1d5b5a70f001a65f99",
"body": "…log-reminder\n\nDocs: session progress-log reminder in CLAUDE.md",
"is_bot": false,
"headline": "Merge pull request #159 from JeffreyChen-SteamProjects/docs/progress-…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T21:49:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ffdbdfd88d95f0d1f63a12663cc049658b7e8d97",
"body": "Point every session at .claude/PROGRESS.md (local, git-ignored) as a scratch record of in-flight work: read it before planning, keep it updated while working, and clear it once all listed items are done.",
"is_bot": false,
"headline": "Add session progress-log reminder to CLAUDE.md",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T21:47:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "abfba720986e49d19fd0af1a5a5fe3722f81f743",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.24 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T20:34:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "11d3370c5a9c6fcf6c7795d0df39d523c6f6085a",
"body": "…-capture\n\nDesktop pet: real system audio level for the pulse (WASAPI peak meter)",
"is_bot": false,
"headline": "Merge pull request #158 from JeffreyChen-SteamProjects/feat/pet-audio…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T20:34:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "95dc61be051601baf773ca44a71297c762dbd7d6",
"body": "Bandit B110: replace the bare except/pass in SystemAudioMeter._release_all with a debug log so cleanup failures are traceable while still not aborting the release loop.",
"is_bot": false,
"headline": "Log instead of silently swallowing COM release failures",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T20:33:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05c2acc17d999516865e8cfca1ac7c856bd74238",
"body": "When 'React to audio' is enabled, spawned pets use system_audio_level as their level provider, so the pulse follows real system output volume.",
"is_bot": false,
"headline": "Drive pet audio pulse from the real system meter",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T20:29:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab4fa30a7045f5e331cc25b597a65616bfbbb731",
"body": "SystemAudioMeter reads the default output device's peak value via IAudioMeterInformation::GetPeakValue (raw ctypes COM, no new dependency). It only reads a meter level (0..1) - it does not capture or record audio content. Windows only; any failure degrades to None. system_audio_level() exposes a lazily-created singleton.",
"is_bot": false,
"headline": "Add WASAPI system output peak meter",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T20:29:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7f6d95b314fe03d46a003d5c01311b2207f4e4fa",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.23 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T18:29:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e93ad75570dfe4d3d85aeab2c86ae09b51e94beb",
"body": "Desktop pet: audio-reactive pulse (audio visualization)",
"is_bot": false,
"headline": "Merge pull request #157 from JeffreyChen-SteamProjects/feat/pet-audioviz",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T18:28:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9da209c8b58612baf0dc1867917cc9f56ff36834",
"body": null,
"is_bot": false,
"headline": "Add pet 'React to audio' toggle",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T18:27:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7dc97af165ee7c02f7f43072fe9e88e62ba9a20",
"body": "With 'React to audio' on and a level provider set, the pet breathes/pulses with the audio level (audio_pulse_scale maps 0..1 to a bottom-anchored draw scale, so its feet stay put). The level source is pluggable via set_audio_level_provider and defaults to none (no effect); audio_pulse_scale is pure and unit-tested.",
"is_bot": false,
"headline": "Add audio-reactive pulse to desktop pet",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T18:27:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce550de3b797e1a8606cad618b413014a89a6bc2",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.22 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T18:23:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c159f8e8159d95ba8dea74818ada4cc3efd023a7",
"body": "Desktop pet: scene timeline of scheduled actions",
"is_bot": false,
"headline": "Merge pull request #156 from JeffreyChen-SteamProjects/feat/pet-timeline",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T18:23:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "10e6823fd28e552e0e146aa54d29f51b51b9359e",
"body": "PetTimeline fires scheduled actions (say / sleep / wake / feed / status / behaviour) at time offsets; configured via user settings (pet_timeline) or set_timeline. PetTimeline/parse_timeline are pure and the dispatch is unit-tested with an injected clock.",
"is_bot": false,
"headline": "Add scene timeline to desktop pet",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T18:21:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7aa4790527294a0aad2b73804af112d568a6d37",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.21 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T18:18:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f59ef68dd55524a803291a4cb96a7aea6a35f369",
"body": "…creen\n\nDesktop pet: target monitor + sound volume (per-screen)",
"is_bot": false,
"headline": "Merge pull request #155 from JeffreyChen-SteamProjects/feat/pet-per-s…",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T18:18:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "905f0f943a74870d0090adfffd3d9ae902624c7f",
"body": "The pet page can spawn a pet on a chosen monitor (reusing the target-monitor combobox) and set its sound volume; both persist in presets.",
"is_bot": false,
"headline": "Add pet target-monitor and volume selectors",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T18:16:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "54128d942ae98814d709c199a7f615b2cdb44c35",
"body": "The pet's interaction sound honours a volume (0..1) applied to its QSoundEffect.",
"is_bot": false,
"headline": "Add sound volume to desktop pet",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T18:16:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f679fa77c24f0c6575d5599560db08284a70f825",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.20 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T17:50:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "25d99f81227707583bf6b7176226a6688c3d0c82",
"body": "Desktop pet: drop against a screen edge to grab the wall",
"is_bot": false,
"headline": "Merge pull request #154 from JeffreyChen-SteamProjects/feat/pet-grab",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:50:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b901846813d2ce96d492c925335058e86b088bac",
"body": "On a drag-release near the left/right screen edge the pet grabs that wall and climbs it instead of being flung; PetMotion.grab_nearest_wall is pure and unit-tested.",
"is_bot": false,
"headline": "Grab the wall when a pet is dropped against a screen edge",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:48:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b3e637d6f680eb1caf756af78ec0ddcb6142d1fb",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.19 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T17:45:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0be5caad0585e12334ddbd37e2396e104f469798",
"body": "Desktop pet: right-click Status readout (level / mood / fullness)",
"is_bot": false,
"headline": "Merge pull request #153 from JeffreyChen-SteamProjects/feat/pet-status",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:45:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "223fefd8653a9c860ae396a64b1744f66fe68b64",
"body": null,
"is_bot": false,
"headline": "Add pet status/state labels",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:42:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e72a538e9a5f0fea1fe24fda05b772b0f32c920",
"body": "Right-click 'Status' shows a bubble with the pet's level, mood and fullness. format_status is a pure, localizable formatter and is unit-tested.",
"is_bot": false,
"headline": "Add status readout to desktop pet",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:42:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56d81deacb91515901d719832d88fa76fecda948",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.18 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T17:38:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5f8644c200946ac3491b7aa3914d5f5347f322ea",
"body": "Desktop pet: pet grows bigger as it levels up",
"is_bot": false,
"headline": "Merge pull request #152 from JeffreyChen-SteamProjects/feat/pet-size",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:38:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bd7b57eb562573ba2b3075bc022bd398f3044d30",
"body": "size_for_level scales the base sprite size by the affection level (+8%/level, capped +50%); the pet spawns at its persisted level's size and grows live when it levels up (motion re-grounds on the next step).",
"is_bot": false,
"headline": "Grow the desktop pet's size with its level",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:36:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7d8096022b7d8eb98dd15dfc19159de3a40bf882",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.17 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T17:29:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "16f1b825c17261dbd00138defb8fcfb3351c4a43",
"body": "Desktop pet: affection / growth (level up by caring for it)",
"is_bot": false,
"headline": "Merge pull request #151 from JeffreyChen-SteamProjects/feat/pet-growth",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:29:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a060f946d9c42f9d1e982e742d4ff4c38d9a3118",
"body": null,
"is_bot": false,
"headline": "Persist pet affection and add level-up lines",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:27:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "28741892176735f7d0d9405c6c2b8694b19398da",
"body": "Interactions build affection (petting +2, feeding +5, greeting a peer +3); crossing a threshold levels the pet up and it celebrates with a level-up line. PetGrowth is pure and unit-tested; affection persists in user settings.",
"is_bot": false,
"headline": "Add affection/growth system to desktop pet",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:27:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d2e4e948663ee50548c36327d5fe8d5fa9dfe3f",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.16 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T17:23:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6335d40c35ceb5975e01977998547af7689350e7",
"body": "Desktop pet: idle reaction (naps when you're away)",
"is_bot": false,
"headline": "Merge pull request #150 from JeffreyChen-SteamProjects/feat/pet-idle",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:22:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3675e2af5cf7becf5228156194ab8bf925aeeeca",
"body": null,
"is_bot": false,
"headline": "Add pet idle/away chatter lines",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:21:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fecc56ea239421fbe88111c54b4d8ddfa43fa84d",
"body": "When the user has been idle past a threshold the pet naps (PetMotion.sleep) and, if chatter is on, says an 'away' line once; it wakes when the user returns. idle_seconds() reads the Windows last-input time (guarded); the reaction is unit-tested via an injected idle provider.",
"is_bot": false,
"headline": "Add idle reaction to desktop pet",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:21:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "083b42f791964e9659eecf32954df1cab208a352",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.15 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T17:16:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81d8a702f5e269524cb5c65396933b127f978105",
"body": "Desktop pet: feeding / hunger system",
"is_bot": false,
"headline": "Merge pull request #149 from JeffreyChen-SteamProjects/feat/pet-hunger",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:16:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db053fa70c5b8f4be3823586fe184e3cc2a186e1",
"body": null,
"is_bot": false,
"headline": "Persist pet hunger and add feed/hungry/fed lines",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:14:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5ca3df7307a63bc56c7d864d9a6c68f766d7b97",
"body": "PetHunger (0..100) decays over time; a right-click Feed refills it and cheers the pet (mood up), which then thanks you. When hungry it asks for a snack once (hysteresis), after low battery in priority. Hunger persists in user settings.",
"is_bot": false,
"headline": "Add feeding/hunger system to desktop pet",
"author_name": "JeffreyChen",
"author_login": "JE-Chen",
"committed_at": "2026-07-24T17:14:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81c2d05a5d8ff80b77e2bafc3440c3f2cca35610",
"body": null,
"is_bot": true,
"headline": "Bump version to 1.0.14 [skip ci]",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-24T17:10:40Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 51,
"commits_last_year": 191,
"latest_release_at": "2026-07-26T02:56:44Z",
"latest_release_tag": "v1.0.37",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 7,
"days_since_latest_release": 0,
"mean_days_between_releases": 0.1
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "frontengine_dev",
"exists": true,
"license": null,
"keywords": [
"Development Status :: 2 - Pre-Alpha",
"Environment :: MacOS X",
"Environment :: Win32 (MS Windows)",
"Environment :: X11 Applications",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.10"
],
"ecosystem": "pypi",
"matches_repo": false,
"registry_url": "https://pypi.org/project/frontengine_dev/",
"is_deprecated": false,
"latest_version": "1.0.0",
"repository_url": "https://github.com/Intergration-Automation-Testing/FrontEngine",
"versions_count": 96,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 463,
"first_published_at": "2023-05-06T07:17:06.425990Z",
"latest_published_at": "2026-02-08T06:35:02.100575Z",
"latest_version_yanked": null,
"days_since_latest_publish": 167
}
]
},
"popularity": {
"forks": 0,
"stars": 9,
"watchers": 1,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 1
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"docs/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 79703,
"source_files_sampled": 241,
"oversized_source_files": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 5232
},
"dependencies": {
"manifests": [
"docs/requirements.txt",
"pyproject.toml",
"requirements.txt"
],
"advisories": {
"error": null,
"scope": "published_package",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 7,
"malicious_count": 0,
"assessed_package": "pypi:frontengine_dev@1.0.0",
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"pypi"
],
"dependencies": [
{
"name": "PySide6",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": "==6.10.2"
},
{
"name": "qt-material",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": null
},
{
"name": "PyOpenGL",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": null
},
{
"name": "PyOpenGL_accelerate",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": null
},
{
"name": "numpy",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": null
},
{
"name": "pynput",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": null
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "numpy",
"direct": true,
"version": null,
"ecosystem": "pypi"
},
{
"name": "pynput",
"direct": true,
"version": null,
"ecosystem": "pypi"
},
{
"name": "pyopengl",
"direct": true,
"version": null,
"ecosystem": "pypi"
},
{
"name": "pyopengl-accelerate",
"direct": true,
"version": null,
"ecosystem": "pypi"
},
{
"name": "pyside6",
"direct": true,
"version": "6.10.2",
"ecosystem": "pypi"
},
{
"name": "pyside6",
"direct": true,
"version": "6.8.2.1",
"ecosystem": "pypi"
},
{
"name": "qt-material",
"direct": true,
"version": null,
"ecosystem": "pypi"
},
{
"name": "auto-py-to-exe",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "build",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "frontengine",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "pytest",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "setuptools",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "sphinx-rtd-theme",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "twine",
"direct": false,
"version": null,
"ecosystem": "pypi"
}
],
"collected": true,
"truncated": false,
"total_count": 14,
"direct_count": 7,
"indirect_count": 7
}
},
"maintainership": {
"issues": {
"open_prs": 1,
"merged_prs": 150,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 18,
"closed_unmerged_prs": 2
},
"bus_factor": 1,
"bot_contributors": 2,
"top_contributors": [
{
"type": "User",
"login": "JE-Chen",
"commits": 501,
"avatar_url": "https://avatars.githubusercontent.com/u/33644111?v=4"
},
{
"type": "User",
"login": "JE-Chen45",
"commits": 22,
"avatar_url": "https://avatars.githubusercontent.com/u/64821850?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.958
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"nightly.yml",
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": null,
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-26T02:56:33Z",
"oldest_open_prs": [
{
"number": 134,
"created_at": "2026-05-13T15:31:02Z",
"last_comment_at": "2026-05-13T15:34:17Z",
"last_comment_author": "codacy-production"
}
],
"last_merged_pr_at": "2026-07-26T02:55:50Z",
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/JeffreyChen-SteamProjects/FrontEngine",
"host": "github.com",
"name": "FrontEngine",
"owner": "JeffreyChen-SteamProjects"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 57,
"inputs": {
"security": 40,
"vitality": 79,
"community": 41,
"governance": 48,
"engineering": 72
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 79,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"commits_last_year": 191,
"human_commit_share": 0.76,
"days_since_last_push": 0,
"active_weeks_last_year": 7
},
"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": "7/52 weeks with commits",
"points": 4.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 7
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "191 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 191
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "OpenSSF Scorecard unavailable",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"releases_count": 51,
"latest_release_tag": "v1.0.37",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 0.1
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "51 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 51
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~0.1 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 0.1
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "OpenSSF Scorecard unavailable",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 41,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 15,
"inputs": {
"forks": 0,
"stars": 9,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "9 stars",
"points": 14.6,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 9
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"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 (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 48,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 14,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.958
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 96% of commits",
"points": 0.9,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 96
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "OpenSSF Scorecard unavailable",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "excellent",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"merged_prs": 150,
"open_issues": 0,
"closed_issues": 18,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 2
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.8,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "150/152 decided PRs merged",
"points": 37.7,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 150,
"decided": 152
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "OpenSSF Scorecard unavailable",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 37,
"inputs": {
"followers": 0,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "JeffreyChen-SteamProjects",
"public_repos": 1,
"account_age_days": 804
},
"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": "0 followers of JeffreyChen-SteamProjects",
"points": 0,
"status": "missed",
"details": [
{
"code": "owner_followers",
"params": {
"count": 0,
"login": "JeffreyChen-SteamProjects"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "1 public repos, account ~2 yr old",
"points": 6.6,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 1
}
},
{
"code": "account_age_years",
"params": {
"years": 2
}
}
],
"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": 72,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"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": "3 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 3
}
}
],
"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": "OpenSSF Scorecard unavailable",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [
"dynamic-desktop",
"dynamics",
"live-wallpaper",
"python3",
"wallpaper",
"wallpaper-engine",
"wallpaperengine",
"wallpapers",
"widgets",
"window-11",
"windows-10",
"windows-desktop"
],
"has_wiki": false,
"homepage": "https://integration-automation.github.io/FrontEngine/",
"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://integration-automation.github.io/FrontEngine/",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "12 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 12
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 40,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"source": "file_signals",
"lockfiles": [],
"manifests": [
"docs/requirements.txt",
"pyproject.toml",
"requirements.txt"
],
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": true
},
"components": [
{
"key": "security_policy_security_md",
"name": "Security policy (SECURITY.md)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 30
},
{
"key": "dependabot_config",
"name": "Dependabot config",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "dependency_lockfiles",
"name": "Dependency lockfiles",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "codeql_workflow",
"name": "CodeQL workflow",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:frontengine_dev@1.0.0 runtime dependency closure — what installing the published package pulls in — 7 packages. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_published",
"params": {
"package": "pypi:frontengine_dev@1.0.0",
"assessed": 7
}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 7,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "no indirect dependency carries a known advisory",
"points": 25,
"status": "met",
"details": [
{
"code": "no_indirect_advisories",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 7,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"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": 63,
"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.882,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 5232
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.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": "67 of 76 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 67,
"sampled": 76
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [
"docs/Makefile"
],
"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": "docs/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "docs/Makefile"
}
}
],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "dependency automation configured, none observed in the sampled commits",
"points": 5,
"status": "partial",
"details": [
{
"code": "dependency_bot_config_only",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "OpenSSF Scorecard unavailable",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"primary_language": "Python",
"largest_source_bytes": 79703,
"source_files_sampled": 241,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Python without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "Python"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/241 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 241,
"oversized": 1
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"pypi package 'frontengine_dev' points at a different repository (https://github.com/Intergration-Automation-Testing/FrontEngine); excluded from ecosystem scoring",
"OpenSSF Scorecard did not return a usable result (2026/07/26 02:56:53 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks"
],
"report_type": "repository",
"generated_at": "2026-07-26T02:57:29.908631Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/JeffreyChen-SteamProjects/FrontEngine.svg",
"full_name": "JeffreyChen-SteamProjects/FrontEngine",
"license_state": "standard",
"license_spdx": "MIT"
}