Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"macos",
"ios",
"swift",
"xterm-256color",
"xterm",
"uikit",
"appkit",
"vt100",
"sixel",
"imgcat",
"terminal-engine",
"ssh-connection"
],
"is_fork": false,
"size_kb": 4513,
"has_wiki": true,
"homepage": null,
"languages": {
"Metal": 3957,
"Swift": 1824735,
"Python": 3410,
"Makefile": 878
},
"pushed_at": "2026-07-26T16:24:31Z",
"created_at": "2019-03-27T02:52:33Z",
"owner_type": "User",
"updated_at": "2026-07-27T08:55:42Z",
"description": "Xterm/VT100 Terminal emulator in Swift",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Swift",
"significant_languages": [
"Swift"
]
},
"owner": {
"blog": "http://tirania.org/blog",
"name": "Miguel de Icaza",
"type": "User",
"login": "migueldeicaza",
"company": "Xibbon",
"location": "Boston, MA.",
"followers": 5238,
"avatar_url": "https://avatars.githubusercontent.com/u/36863?v=4",
"created_at": "2008-11-26T22:37:16Z",
"is_verified": null,
"public_repos": 224,
"account_age_days": 6452
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.15.0",
"kind": "minor",
"published_at": "2026-07-19T18:57:22Z"
},
{
"tag": "v1.14.0",
"kind": "minor",
"published_at": "2026-07-10T21:10:46Z"
},
{
"tag": "v1.13.0",
"kind": "minor",
"published_at": "2026-03-27T13:56:59Z"
},
{
"tag": "v1.12.0",
"kind": "minor",
"published_at": "2026-03-15T04:55:02Z"
},
{
"tag": "v1.11.2",
"kind": "patch",
"published_at": "2026-02-20T16:09:15Z"
},
{
"tag": "V1.11.1",
"kind": "other",
"published_at": "2026-02-20T12:11:43Z"
},
{
"tag": "v1.11.0",
"kind": "minor",
"published_at": "2026-02-18T15:00:58Z"
},
{
"tag": "v1.10.1",
"kind": "patch",
"published_at": "2026-02-03T13:28:07Z"
},
{
"tag": "v1.10.0",
"kind": "minor",
"published_at": "2026-02-02T18:42:32Z"
},
{
"tag": "v1.9.0",
"kind": "minor",
"published_at": "2026-01-13T14:24:27Z"
},
{
"tag": "v1.8.0",
"kind": "minor",
"published_at": "2026-01-10T19:48:40Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2025-12-12T18:29:01Z"
},
{
"tag": "v1.5.1",
"kind": "patch",
"published_at": "2025-08-09T02:56:04Z"
},
{
"tag": "1.5.0",
"kind": "minor",
"published_at": "2025-08-09T00:24:54Z"
},
{
"tag": "1.2.1",
"kind": "patch",
"published_at": "2023-04-17T17:36:21Z"
}
],
"recent_commits": [
{
"oid": "6918d74b5c2880007901151cd4ac1820779abd7b",
"body": null,
"is_bot": false,
"headline": "Render Powerline separators as cell geometry (#605)",
"author_name": "Tantan Fu",
"author_login": "futantan",
"committed_at": "2026-07-26T16:24:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1dab7c60d038563147921ea5a21b952a357d8a0c",
"body": "Two independent blockers, both hit when building with the Swift Static\nLinux SDK (`--swift-sdk x86_64-swift-linux-musl`) from a Mac.\n\n1. A package manifest is compiled and run on the HOST, so `os(Linux)` is\n false when cross-compiling and `platformExcludes` stays empty — the\n Apple/Mac/iOS sourc\n[…]\n`\n and `Glibc` does not exist. Switched to canImport so the cascade\n covers musl, glibc and Windows without changing any existing case.\n\nNo behaviour change on macOS, iOS, native Linux or Windows.",
"is_bot": false,
"headline": "Let SwiftTerm cross-compile from macOS to Linux (#612)",
"author_name": "ASNNetworks",
"author_login": "ASNNetworks",
"committed_at": "2026-07-26T15:32:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aa977c374dbbdb83f7525e769b45878c8f9a7de7",
"body": "Based on https://github.com/migueldeicaza/SwiftTerm/pull/604\n\nBy https://github.com/Vahn84",
"is_bot": false,
"headline": "Expose BufferLine.isWrapped for embedders.",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-26T04:32:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d327a2bb8b74e2d9cd79838e755b8931d1bf4975",
"body": "…DCS/OSC params.\n\nBased on a patch by https://github.com/klc\n\nTuned it a bit:\n\nI took a slightly different path based on your patch, but with some changes:\n\n- CSI/DCS values will cap at UInt16.max\n- CSI/DCS sequences exceeding 24 parameters are dropped (like Ghostty does)\n- Overflow state persists c\n[…]\nindices use the strict decimal parser instead.\n- Made transition table immutable after construction (so we get a let instead of a var)\n\nOriginal PR: https://github.com/migueldeicaza/SwiftTerm/pull/608",
"is_bot": false,
"headline": "Share one VT500 transition table across parsers; clamp oversized CSI/…",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-26T04:28:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "87a7888edc0ae415922174e4e6c0486f3991e0ea",
"body": "Round terminal cell widths to the nearest device pixel instead of always\nrounding up. This keeps cells pixel-aligned while avoiding visibly loose text\nspacing for fonts such as Monaco 12.\n\nAdd a macOS regression test covering the calculation.\n\nFixes #606.",
"is_bot": false,
"headline": "Fix cell width rounding to avoid excess spacing",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-25T22:14:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "64dc185a7d0caedeb7d8d8a7c98aa8b9d3c6e4ed",
"body": "Co-authored-by: Sean Ferguson <obvioussean@github.com>\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "decode Kitty placeholder IDs in RGB order (#607)",
"author_name": "sirfergy",
"author_login": "sirfergy",
"committed_at": "2026-07-25T21:58:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b1b4636cdf962076a327a64a17cf89a778b6a063",
"body": "CTRunGetAttributes returns Any-typed values, and code in\nAppleTerminalView and CaretView force-cast the font (and, in\nAppleTerminalView, the foreground color) with `as!`. If CoreText ever\nhands back a run whose .font attribute isn't the expected TTFont type,\nthis crashes. Fall back to the terminal's normal font (and skip the\ncolor override) with `as?` instead.",
"is_bot": false,
"headline": "Avoid force-casting CTRun font/color attributes (#610)",
"author_name": "Mustafa Kılıç",
"author_login": "klc",
"committed_at": "2026-07-25T21:52:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c16716431d210d3c0a139cdaa46ce8aaf5402eca",
"body": "…hecks (#609)\n\nrecycle() called the bare C abort() (after a print()) when invoked on\na buffer that wasn't full yet, and both recycle() and the subscript\ngetter force-unwrapped the makeEmpty closure with `!`. Both are still\nprogrammer-error traps (calling recycle() on a non-full buffer or\nusing a Cir\n[…]\ntal\nerror by design), but precondition/preconditionFailure give a\ndescriptive message and, unlike assertionFailure, still trap in\nrelease builds instead of silently continuing past a broken\ninvariant.",
"is_bot": false,
"headline": "Replace abort() and force-unwraps in CircularList with precondition c…",
"author_name": "Mustafa Kılıç",
"author_login": "klc",
"committed_at": "2026-07-25T21:51:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "58915b1010d7dbc86d0e79dc2c40f0c183ccaf5b",
"body": null,
"is_bot": false,
"headline": "Fix sixel crash",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-19T21:41:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd2fb8ac5b861e7bf617c872895e338f38165648",
"body": null,
"is_bot": false,
"headline": "Fixed flipped mouse reporting toggle (#601)",
"author_name": "Moshe Gottlieb",
"author_login": "moshegottlieb",
"committed_at": "2026-07-19T18:55:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be0300c4955840efd46fc93e07c03297dd0ada79",
"body": "not work on the first column as reported in the follow up comment in:\n\nhttps://github.com/migueldeicaza/SwiftTerm/issues/563\n\nI suspect the transaction only recognized UIKit deleting two\ncharacters. At the start of the input buffer, UIKit deletes only the\ncomposed syllable, so the transaction never started.\n\nAdded a single-character deletion path in HangulInput and updated the\ntransaction application to handle zero or more replacement characters\nin our iOS driver.",
"is_bot": false,
"headline": "Attempt to fix the issue where the new korean input workaround would",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-19T18:55:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "084a26c3915a9ea2d76d540412e35db0bd6e2448",
"body": "investigation from Dong Shin in https://github.com/migueldeicaza/SwiftTerm/issues/563\n\nWe now have a state machine as suggested",
"is_bot": false,
"headline": "Implements the Korean IME transaction fix, as detailed on the",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-19T18:55:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38861e57edba5eb9e5d4eff9b1baee66fdd7e4c4",
"body": "replacement text, e.g. 하세, never just 세.\n\nThis is a follow up",
"is_bot": false,
"headline": "delete exactly one prior syllable and insert the full",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-19T18:55:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f11586b7e6e2c1957090610f13709aa51d491ee2",
"body": "…ssues/563\n\nThis attempts to solve an issue in Korean where our custom rewriter.\n\nKorean input now tries the inverse rewrite before the existing final-consonant\ncomposition. For example, after the existing path turns 하 + ㅅ into 핫, a\nfollowing ㅔ rewrites it to 하세 by sending backspace + replacement text.",
"is_bot": false,
"headline": "This attempts to fix the https://github.com/migueldeicaza/SwiftTerm/i…",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-19T18:55:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "91863f0720baa05c0efbbca4b64c9fd250845db5",
"body": "…(#600)\n\n* feat(mac): line-accurate scroll wheel with sensitivity control\n\nReplace the step-function scroll velocity (which jumped a full page on\nfast trackpad flicks, causing visible line \"skipping\") with pixel-delta\naccumulation that scrolls at a true 1:1 rate. Precise trackpad deltas are\naccumula\n[…]\n -1 —\nscrolling the view on an event that carried no movement.\n\nRestated against `scrollingDeltaY`, the delta this method now reads.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Line-accurate scroll wheel with optional sensitivity control (macOS) …",
"author_name": "Mustafa Kılıç",
"author_login": "klc",
"committed_at": "2026-07-19T18:52:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1a7b5d22cd389c694ae11c677ced2ddf74478524",
"body": "Two customization points that are currently closed off on open classes.\n\nrequestOpenLink — LocalProcessTerminalView sets terminalDelegate = self, so link activation resolves to the TerminalViewDelegate protocol extension default. Protocol extension methods are statically dispatched, so a subclass ca\n[…]\n handling (e.g. app-level ⌘-shortcuts over a focused terminal). UIResponder declares it open; this just restores the inherited access level.\n\nNo API removals and no behavior change for existing users.",
"is_bot": false,
"headline": "Let subclasses customize link and key handling (#599)",
"author_name": "Moshe Gottlieb",
"author_login": "moshegottlieb",
"committed_at": "2026-07-18T20:23:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ec15e2382486bd850f2aad527154ef106f2d6b2f",
"body": null,
"is_bot": false,
"headline": "Merge branch 'atlas-overflow'",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-18T14:38:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d83d8a18d8d6ad210dea0d54ef9e1f92cb6a953b",
"body": "…nt (#598)\n\nBufferPool buckets are keyed by exact 256-byte-aligned length, so any\nworkload whose per-frame vertex count keeps changing (htop, tail -f,\nbuilds) allocates a new bucket almost every frame. Each bucket retains\nup to maxBuffersPerSize buffers forever, which shows up as unbounded\nIOAcceler\n[…]\ns actually reusable, so the pool plateaus at a\nfew MB. Verified with footprint/vmmap: IOAccelerator stays flat with\nhtop running for 8+ minutes.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix unbounded Metal BufferPool growth under constantly-changing conte…",
"author_name": "Mustafa Kılıç",
"author_login": "klc",
"committed_at": "2026-07-18T14:35:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d6e0709ac2ad54cfc790d7e3499fdd2827df082e",
"body": " Size grayscale and color atlases according to platform and device\n limits, with an environment override for capacity testing. Add targeted\n logging for growth, resets, allocation failures, and sustained overflow\n conditions.\n\n Rebuild draw data whenever atlas growth or reset invalidates normalized\n UVs or cached regions. Bound rebuild attempts and freeze atlases on the\n final pass so oversized working sets skip glyphs instead of emitting\n stale references or recursing indefinitely.",
"is_bot": false,
"headline": "Harden Metal glyph atlas overflow handling",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-17T05:05:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f02e34bb7d564408a0f48d5c73d382ddb7d04dc0",
"body": "… (#593)\n\nMetalTerminalRenderer.candidateBundles() included Bundle.module as its\nfirst candidate for locating SwiftTerm_SwiftTerm.bundle (the shaders).\nSwiftPM's generated accessor for executable targets doesn't behave like\na normal Bundle lookup: it fatalErrors (aborting the whole process, not\nthro\n[…]\nn main-bundle-\nrelative lookup, plus the Contents/Resources location it misses. Falls\nthrough to the existing fallback candidates exactly as before for any\nenvironment where the old code didn't crash.",
"is_bot": false,
"headline": "Fix Metal renderer crash in packaged apps (Bundle.module fatalErrors)…",
"author_name": "Tim McGlothin",
"author_login": "mcglothi",
"committed_at": "2026-07-15T02:34:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ac99a546296e5f2dd3feea1c8bc69b5e49ca693b",
"body": "* Report current focus state immediately when DECSET 1004 is enabled\n\nxterm reports the current focus state as soon as an application enables\nfocus reporting; without it, applications that enable 1004 while the\nterminal is already focused assume they are unfocused until the first\nreal focus change (\n[…]\ns, hover-tracking applications receive rows\nfar outside the viewport and their hit-testing never matches.\n\nAlso removes a leftover debug print in the SGR-pixel mouse encoder\nthat fires on every event.",
"is_bot": false,
"headline": "Mouse motion row and focus reporting fixes (#590)",
"author_name": "naifalziadna",
"author_login": "naifalziadna",
"committed_at": "2026-07-13T00:50:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ed395c7136cc07b80d46eb776a5eb3279f5447b9",
"body": "as it is possible to end up in cases where it is difficult\nto see the text.\n\nAnd changed the defaults for the terminal.\n\nFixes: https://github.com/migueldeicaza/SwiftTerm/issues/588",
"is_bot": false,
"headline": "Introduced a way of setting the selection color foreground,",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-10T21:24:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "849e8a4f3d6f79ddee07152400137f1370c32621",
"body": "terminal tracking. Safely clean up state when a window deallocates, share\ntracking across split panes, preserve overlay/first-responder delivery, and\nignore moves outside the terminal view.\n\nAvoid clobbering a host that disables acceptsMouseMovedEvents while tracking\nis active, and add regression co\n[…]\nteardown.\n\nKnown limitation remains: local monitors do not receive mouse movement while the app is inactive. Diff whitespace check passes.\n\nFixes: https://github.com/migueldeicaza/SwiftTerm/issues/584",
"is_bot": false,
"headline": "Use one lock-protected, per-window mouse-moved monitor for macOS 26+",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-10T20:46:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f971cbf6cf19c8ff94ceb8bc310b758e6036e626",
"body": "Dragging a selection and holding the pointer past the top or bottom edge\nno longer scrolled the viewport. The machinery was only half-wired:\nmouseDragged computed autoScrollDelta at the edges and\nscrollingTimerElapsed existed to consume it, but nothing ever scheduled\nthat timer. AppKit only delivers\n[…]\nn to the pointer position under the\n new viewport (calculateMouseHit(at: lastSelectionDragPoint)) so the\n selection grows as the view scrolls.\n\nmacOS only; does not touch the iOS scroll-follow path.",
"is_bot": false,
"headline": "Mac: restore auto-scroll while dragging a selection past an edge",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-10T19:56:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a6c640e9c1b97f8cfcca313a5528795f6d9ba3a6",
"body": "Terminal output previously snapped the iOS view back to the bottom on\nevery update: updateScroller() unconditionally set\n\n contentOffset.y = (lines.count - rows) * cellHeight\n\nso incoming data overrode the user's scroll position. Make yDisp the\nsource of truth for the viewport and contentOffset its\n[…]\n pan callbacks occur).\n\nTest: testScrollToMarksTerminalAsUserScrolling covers scrollTo setting\nuserScrolling, output not moving yDisp while scrolled up, and returning\nto the bottom clearing the flag.",
"is_bot": false,
"headline": "iOS: freeze auto-scroll while the user has scrolled up (#587)",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-10T19:47:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e0784f4291dcdae078b86f6182f32697b4a51c8d",
"body": "Upstream encodeFlags hard-codes button: 1, so every tap/drag is reported\nto the remote app as a middle-click. In terminal apps that means left-click\ntargets never fire and vim pastes on tap. Send button 0 (left) instead.\n\nCo-authored-by: Mathew Taylor <mathew@oligo.asia>",
"is_bot": false,
"headline": "iOS: send taps/drags as left button (0), not middle (1) (#586)",
"author_name": "Mathew",
"author_login": "mathewtaylor",
"committed_at": "2026-07-10T02:55:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d5ee56e1c74777120f3af688600d336de4201bd2",
"body": "…-region artifacts) (#582)\n\nScrolling or editing inside a restricted DECSTBM scroll region (a fixed header/\nfooter, as in nano/vim/less/htop) left stale rows and a sub-cell \"ghost\" on the\nregion's last row on the CoreGraphics renderer (Metal masks it by clearing the\nwhole target each frame).\n\nThe de\n[…]\ngion flags just\n[scrollTop, scrollBottom] instead of the whole viewport, keeping the\nfull-screen+scrollback cheap path. Verified in nano/vim/less/htop, translucency\nintact; the package builds cleanly.",
"is_bot": false,
"headline": "Clear the dirty region in the CoreGraphics renderer (fixes restricted…",
"author_name": "Anton Rudakov",
"author_login": "tavvet",
"committed_at": "2026-07-01T20:57:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8157b2fb1aa3343ab53b2bcbe9e09c93b9b4c258",
"body": "on the bug.\n\nThe off-main path now checks and sets pendingDisplay before posting to the\nmain queue, sharing the same coalescing gate as queuePendingDisplay().\nupdateDisplay() clears the flag, reopening the gate. So a burst of feed chunks\nwithin the 150ms window now collapses into a single main-threa\n[…]\n\nbypassing the 16.67ms frame timer for responsiveness without flooding the main\nqueue with one updateDisplay per chunk.\n\nFixes a data race on lastUserInputUptimeNs. We use a lock around the\nuser input",
"is_bot": false,
"headline": "Follow up to PR#553 these addresses the comments I left",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-07-01T20:38:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "471c978ca1ea87e39374c8c4d5b3f92621e0ef13",
"body": "* Render local input responses immediately\n\nWhen output arrives within 150ms of a keystroke and the terminal isn't\ninside a DEC 2026 sync block, paint synchronously on the main runloop\ninstead of going through queuePendingDisplay's 16.67ms frame throttle.\n\nWithout this, input echo waits one 60Hz tic\n[…]\nined in the tree, so main currently fails\nto compile. Stripping the call sites in Terminal.swift and\nAppleTerminalView.swift unblocks CI on this PR.\n\nEasy to revert if SyncDebug is reintroduced later.",
"is_bot": false,
"headline": "Render local input responses immediately (#553)",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-07-01T20:00:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9adb62463d2264e7403feb7a1471aaf27eaab2f4",
"body": "Commit 9446f60 simplified DEC mode 2026 handling by removing the\nfrozen `synchronizedOutputBuffer` snapshot (`displayBuffer` now just\nreturns `buffer`) and moving display blocking to the view layer\n(`AppleTerminalView.updateDisplay` early-returns while sync is active).\n\n`testSynchronizedOutputBlocks\n[…]\npin the current core contract: the active flag toggles on\n?2026h/?2026l and the live buffer always reflects the latest content.\nView-layer blocking remains covered by the existing #if os(macOS) tests.",
"is_bot": false,
"headline": "Fix stale synchronized-output test after buffer-snapshot removal (#581)",
"author_name": "bones7456",
"author_login": "bones7456",
"committed_at": "2026-06-24T15:06:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ab99ba3e484c44c68bd3d44ae31536a21b5ce15f",
"body": "…ing them (#578)\n\n* Center full-width (CJK) glyphs within their cell slot\n\nFull-width (CJK) and other substituted glyphs were pinned to the left\nedge of their 2-cell slot, dumping the slack between the glyph advance and\nthe slot width onto the right of every cell — the phantom gap reported for\nJapan\n[…]\nder the block cursor than in the surrounding text (and\nits dy, computed for the scaled glyph, was applied without the scale).\nMirror drawTerminalContents: draw with a scaled CTFont when fit.scale < 1.",
"is_bot": false,
"headline": "Center full-width (CJK) glyphs within their cell instead of left-pinn…",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-06-22T18:08:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7af5db235e137a39e17b8e39a13c16a3f1d2d376",
"body": "Mac: word-mode drag selection drops the seed word when dragging backwards",
"is_bot": false,
"headline": "Merge pull request #576 from bones7456/fix/word-mode-drag-extend",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-18T20:30:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb8423df300f4759fd093ed49bb6ed9996b18eb8",
"body": "…ards\n\nWhen a word is selected by double-click and the user then drags the\nmouse backwards (to the left, or up onto an earlier line), the seed word\nitself was excluded from the selection. Given \"aaa bbb ccc\", double-click\n\"bbb\" and drag onto \"aaa\" and the selection becomes \"aaa \" instead of the\nexpe\n[…]\n keep the whole word. Forward\nword-by-word extension is unchanged. The anchor is cleared whenever a\nnon-word selection begins.\n\nAdds regression tests for backward and forward word-mode drag extension.",
"is_bot": false,
"headline": "Mac: word-mode drag selection drops the seed word when dragging backw…",
"author_name": "Bones",
"author_login": "bones7456",
"committed_at": "2026-06-18T02:18:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6e5dcf293186032c4938e0966ccb6f110e281ce2",
"body": "Fix default-text-presentation symbols rendering as color emoji on iOS (U+2733 & friends)",
"is_bot": false,
"headline": "Merge pull request #575 from AlexDemzz/fix/ios-default-text-presentation",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-16T02:12:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3b8c9b680cb38d87d2a067b8ecd6427910538a6",
"body": "…s-tracking\n\nFix DECRST 1005/1006/1015/1016 disabling mouse tracking",
"is_bot": false,
"headline": "Merge pull request #571 from AlexDemzz/fix/decrst-mouse-encoding-keep…",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-13T12:21:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ff59b8a9c51805ce2170e336bb4457b389564c6c",
"body": "Covers: resetting 1005/1006/1015/1016 keeps the active tracking mode;\nthe encoding itself still resets (events back to X10, DECRQM reports\nthe encoding reset while tracking reports set); the mosh resize\nre-assert sequence (CSI ?1003l ?1003h ?1004l ?1006l ?1006h) leaves\ntracking enabled with SGR encoding; and DECRST on a tracking mode\nstill disables tracking.",
"is_bot": false,
"headline": "Add tests for DECRST encoding modes preserving mouse tracking",
"author_name": "AlexDemzz",
"author_login": "AlexDemzz",
"committed_at": "2026-06-12T12:14:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ebc6ca2edf9982ca149ecaa3139eec98abfbe973",
"body": "Symbols with Emoji=Yes but Emoji_Presentation=No (U+2733, U+26A0, U+2714, ...)\nmust default to text presentation per UTS #51. When the terminal font lacks a\nglyph for such a codepoint, Core Text's cascade fallback on iOS resolves it to\nApple Color Emoji anyway, rendering a full-color emoji where a m\n[…]\ning scalar are left untouched, so explicit emoji\npresentation from the stream is preserved. Applied in buildAttributedString\n(shared by the CoreGraphics and Metal renderers) and the three caret paths.",
"is_bot": false,
"headline": "Force text presentation for default-text emoji-capable symbols",
"author_name": "AlexDemzz",
"author_login": "AlexDemzz",
"committed_at": "2026-06-11T20:22:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "24a68bcadc479d945c7ca32f21ac0a8ab895c690",
"body": "Buffer: expose public totalLinesTrimmed accessor",
"is_bot": false,
"headline": "Merge pull request #569 from AG-Studio-Apps/expose-totallinestrimmed",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-10T20:13:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "34a1c13cc14b82b99aa775aac78dd539b6ece3cc",
"body": "Add public searchMatchSummary for search-UI match counters",
"is_bot": false,
"headline": "Merge pull request #572 from AlexDemzz/search-match-summary",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-10T20:12:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7f0e3bdfe032422db92e7d198fa7f52c84759c7",
"body": "Buffer.resize: iterate lines.count, not lines.maxLength (O(scrollback capacity) -> O(content))",
"is_bot": false,
"headline": "Merge pull request #573 from dxmone/fix-resize-capacity-loops",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-10T20:12:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "46e168f074c9d6f0c2faaa4a4c4c04663d388584",
"body": "LocalProcess: bound the PTY read backlog with backpressure",
"is_bot": false,
"headline": "Merge pull request #574 from dxmone/pty-read-backpressure",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-10T20:11:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f620c12e0e25b8e3a2bbe91f5c6f8c8676e9980b",
"body": "LocalProcess re-armed its PTY read unconditionally, in two compounding\nways:\n\n1. The read handler re-armed on *every* DispatchIO invocation, including\n partial deliveries (done=false). Each partial delivery therefore\n spawned an additional concurrent read chain, and under a fast\n producer the \n[…]\n both changes the same `yes` flood plateaus at ~7 MB of footprint\ngrowth with continuous suspend/resume cycling, instead of growing\nunboundedly.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "LocalProcess: bound the PTY read backlog with backpressure",
"author_name": "Thomas Strömberg",
"author_login": "dxmone",
"committed_at": "2026-06-10T10:53:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c6e35fde9fe9ab0442a57e1c6212a2dc9657e496",
"body": "Three loops in resize() iterated lines.maxLength — the scrollback\n*capacity* — instead of lines.count, the lines actually in the buffer.\nCircularList's subscript materializes a BufferLine for every empty slot\nit touches (getter calls makeEmpty), so each loop walks and allocates\nthe entire scrollback\n[…]\nlines at the\n old cols value (cols is updated after the check) and trip the abort()\n when widening, in addition to walking the whole capacity.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Buffer.resize: iterate lines.count, not lines.maxLength",
"author_name": "Thomas Strömberg",
"author_login": "dxmone",
"committed_at": "2026-06-10T10:50:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "426b8f8c2011a766e7b18b4737743dd95fac4649",
"body": "Exposes the current match's 1-based index and the total match count for a\nsearch term, so a search UI can render an \"2/14\"-style counter next to\nfindNext/findPrevious. Built on the existing internal SearchService.findAll;\nreturns (0, total) when there is no current match and (0, 0) when search is\nunavailable.",
"is_bot": false,
"headline": "Add public searchMatchSummary for search-UI match counters",
"author_name": "AlexDemzz",
"author_login": "AlexDemzz",
"committed_at": "2026-06-10T01:15:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8ad1701a422d764da590ab18d4aa3f2ea1d492ca",
"body": "These modes select the mouse coordinate encoding and are independent of\nthe tracking modes (9/1000-1003). xterm keeps tracking enabled when an\nencoding is reset; setting mouseMode = .off here disabled tracking for\nclients that reset encodings as part of mode re-assertion. mosh does\nexactly that on every resize/reattach repaint (CSI ?1003l ?1003h ?1006l\n?1006h), which left mouse reporting permanently off after a resize.",
"is_bot": false,
"headline": "Fix DECRST 1005/1006/1015/1016 disabling mouse tracking",
"author_name": "AlexDemzz",
"author_login": null,
"committed_at": "2026-06-09T21:39:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f6429c6ce2acecc8a58aa3d3c766846d909fec7e",
"body": "Read-only view of the internal linesTop counter (monotonic lines\ntrimmed off the top of a full scrollback). meshTerm uses it to anchor\na scrolled-up primary-screen viewport by absolute buffer line instead\nof pixel offset, which drifts one row per trimmed line at the\nscrollback cap. Tag v1.13.0-meshterm.5.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Buffer: expose public totalLinesTrimmed accessor",
"author_name": "James Betchley",
"author_login": "JBetchGH",
"committed_at": "2026-06-08T22:26:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2d8234ff762085e6da0d16a87a27f7df87d678e0",
"body": null,
"is_bot": false,
"headline": "Revert, wrong branch",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-08T14:28:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05361a42f0de3336e6ac2e6a37b966760e395691",
"body": "The important change is that 핫 + ㅔ now replaces the last syllable with the\nfull string 하세, not just 세.",
"is_bot": false,
"headline": "Make it so the vowel rewrite preserves the previous syllable.",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-08T14:27:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bf72355c3776a7b5912093bbc09b295de1f16424",
"body": "iOS: expose public showStandardContextMenu wrapper",
"is_bot": false,
"headline": "Merge pull request #554 from AG-Studio-Apps/expose-show-context-menu",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-06T21:54:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "677384e6d4a26eb5b504da6cc97e3776f62d07bc",
"body": null,
"is_bot": false,
"headline": "Add missing file",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-06T21:54:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5d653993d856e1f24194dc9306b84e46dab10bb",
"body": "…paque\n\nfix(iOS): mark TerminalView non-opaque to stop scrollback rendering corruption",
"is_bot": false,
"headline": "Merge pull request #567 from ferponse/fix/ios-scroll-corruption-non-o…",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-06T21:52:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d44954ccd8e9d82930094747312c3b638861320e",
"body": "…orruption\n\nThe iOS `TerminalView` (a `UIScrollView`) renders its background through\n`layer.backgroundColor` and paints glyph cells with a transparent backdrop in\n`draw(_:)`, relying on the layer colour showing through the gaps. This only\nworks on a non-opaque view. Because `isOpaque` was never clea\n[…]\ncomes\nvisible as flickering, striped corruption over the scrollback.\n\nSetting `isOpaque = false` in `setupOptions()` makes the transparent\ncompositing behave as designed and eliminates the corruption.",
"is_bot": false,
"headline": "fix(ios): mark TerminalView non-opaque to stop scrollback rendering c…",
"author_name": "Ferran Pons Serra",
"author_login": null,
"committed_at": "2026-06-06T15:06:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "899146260232c3eb67802975427ac5e115996918",
"body": "Fix Option-composed characters dropped under the kitty keyboard protocol",
"is_bot": false,
"headline": "Merge pull request #564 from evertjr/fix/kitty-option-composed-text",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-03T20:15:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59f3bcc5be550d7ca3c797ab77093f14456ebcad",
"body": "On layouts where a printable character is produced via Option as a\ncompose/AltGr layer (Czech Option+2 = \"@\", German AltGr+Q = \"@\", etc.),\ninsertText was encoding the commit as a kitty CSI-u key event keyed off the\nbase-layout codepoint. Apps that negotiate reportAllKeys/reportAlternates\nwithout rep\n[…]\nr\nwith no control/command modifier, send the composed text directly as UTF-8\ninstead, matching how kitty and Ghostty handle AltGr layers. Adds a\nview-level regression test for the Czech Option+2 case.",
"is_bot": false,
"headline": "Send Option-composed characters directly under kitty protocol",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-06-03T14:20:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "618e43ef6503bfb5f537d9e92a523797dd21fc33",
"body": "iOS: make TerminalView.deleteBackward open for subclass overriding",
"is_bot": false,
"headline": "Merge pull request #562 from AG-Studio-Apps/expose-deletebackward-open",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-06-02T02:39:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c356d5897d78d56f58895ba9419b55e8e8f5f711",
"body": "insertText(_:) is already open, letting subclasses observe inserted text\n(e.g. to drive an autocomplete/prediction model). deleteBackward() — the\ncompanion UIKeyInput method the soft keyboard's delete key routes through —\nis public, so subclasses in another module can't override it and miss\ndeletions. Widen it to open for symmetry with insertText. No behavioural\nchange.",
"is_bot": false,
"headline": "iOS: make TerminalView.deleteBackward open for subclass overriding",
"author_name": "James Betchley",
"author_login": "JBetchGH",
"committed_at": "2026-06-01T22:53:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b5ad46cab4ac3c4304ca3a6dbfeae326a15527c8",
"body": "Wraps the existing internal showContextMenu(forRegion:pos:) presenter\nwith a CGPoint-taking entry point that also becomes first responder\nand computes the menu region — matching what the built-in long-press\ngesture does internally.\n\nHost apps that replace the built-in long-press (e.g. with a cursor-\ndrag mode) can use this to fall back to the standard menu on\nrelease-without-movement.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "iOS: expose public showStandardContextMenu wrapper",
"author_name": "James Betchley",
"author_login": "JBetchGH",
"committed_at": "2026-05-20T05:56:48Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9446f60557ed1bbea1b4720bd5884c2b3d3428be",
"body": "updates to not flush to the screen on time.",
"is_bot": false,
"headline": "Simplifies the DEC 2026 buffering support, which was causing",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-18T20:55:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "911483b61933c92bacd3d63882c6bab7529dbbaf",
"body": "…apps become very sluggish",
"is_bot": false,
"headline": "Quick band-aid, the sync output code needs to be tuned, because some …",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-17T21:50:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c068a905c5aeab60852fb865bee05dc8a5af190c",
"body": "…code that we had kept using Swift-based grapheme cluster indexes, which turned out to crash with Thai input. This should fix #552",
"is_bot": false,
"headline": "UITextInput's NSRange sends ranges in UTF16-indexes, and some of the …",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-17T21:39:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dae32cc8f9bcda15713f4091bb2ea7e11f6dd57c",
"body": "Fix LocalProcess retain cycle causing terminal memory leak",
"is_bot": false,
"headline": "Merge pull request #551 from evertjr/fix/localprocess-retain-cycle",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-17T14:34:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3a7dcdcb912fdc49225740cc3df63e0ba84d7c10",
"body": "Fix hidden scroller layout on macOS",
"is_bot": false,
"headline": "Merge pull request #543 from evertjr/fix/hidden-scroller-layout",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-17T14:10:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "73943c1ae016e5657415481262f3077e9fe6848e",
"body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "Merge main into fix/hidden-scroller-layout",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-17T14:10:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "424a5a12dd683ef5e313e42697191a47ddea9f88",
"body": "LocalProcess used `childProcessRead` as a method reference in\n`io.read(ioHandler:)`, which implicitly captures `self` strongly.\nBecause the read loop re-arms itself on every successful read, there\nis always a pending DispatchIO operation pinning `self` — making it\nimpossible for LocalProcess to deal\n[…]\nreatment\nto the `DispatchIO.write` completion handler. Additionally, close\nthe DispatchIO in `deinit` so that dropped instances release their\nfile descriptors even when `terminate()` was never called.",
"is_bot": false,
"headline": "Fix LocalProcess retain cycle causing terminal memory leak",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-17T00:27:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "602be53419f765840832424993d70b76df37ecac",
"body": null,
"is_bot": false,
"headline": "Fix terminal background margin rendering (#541)",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-17T00:11:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1da8e026c09109e6dabbddc4be6a1a87bd895e06",
"body": "* Fix Terminal retain cycle in resetNormalBuffer() causing memory leak\n\nresetNormalBuffer() assigned the scroll closure using a bare method\nreference (`scroll(isWrapped:)`), which captures `self` strongly.\nThis creates a retain cycle: Terminal → Buffer → scroll closure → Terminal.\n\nThe init() correc\n[…]\nr resetNormalBuffer() and\nresetToInitialState(). Without the scroll closure [weak self] fix,\nboth tests fail — confirming the retain cycle that leaked the entire\nTerminal object on every buffer clear.",
"is_bot": false,
"headline": "Fix Terminal retain cycle in resetNormalBuffer() (#538)",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-17T00:10:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b0730ad0ce3ad48a172718b114d43d5daeb8f160",
"body": "A regular layer-backed NSView/UIView writes its draw(_:) output to a\nbacking store whose colorspace is set to the display colorspace. The\ncompositor color-manages those pixels — sRGB content gets converted to\nthe display's gamut (sRGB or Display P3) at scan-out.\n\nCAMetalLayer.colorspace defaults to \n[…]\nthe same source\ncolor produces the same on-screen pixel through both renderers.\n\nCo-authored-by: Miguel de Icaza <miguel@gnome.org>\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "Tag CAMetalLayer with sRGB colorspace (#546)",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-16T12:30:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3f5c89c3484b308d314dee1a396cbe38f1fa353d",
"body": "Sequences like CSI Ps C / CSI Ps D (e.g. shell responses to Option+Arrow\nword jumps) only mutate buffer.x without dirtying any row, so\ngetUpdateRange() returns nil and updateDisplay early-returns without\nasking the Metal renderer to redraw. Because MTKView is paused and the\nMetal renderer draws the \n[…]\nor blink timer: every\n700ms it called setNeedsDisplay, which incidentally caught up the stale\ncursor position. Disabling the blink animation removed that side-effect\nand surfaced the underlying issue.",
"is_bot": false,
"headline": "Fix stale Metal cursor on cursor-only buffer moves (#547)",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-16T12:16:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a24f65c86f2f14cc98b9142a305eff7cde9f8320",
"body": "… (#548)\n\nCAMetalLayer's binding to a window's WindowServer surface is established\nwhen the layer is first attached to a window, and Apple exposes no public\nAPI to refresh it. When a `TerminalView` is reparented across NSWindow\ninstances — for example, in SwiftUI apps that set\n`applicationShouldTerm\n[…]\nerAfterRebindFailure`\ntears down Metal state and falls back to CoreGraphics rather than\nleaving a frozen view in place. Errors go through `os_log` so a library\ncaller doesn't see stray `print` output.",
"is_bot": false,
"headline": "Rebind Metal renderer when TerminalView is reparented to a new window…",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-15T17:30:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "655212fa878fb9e8d347938853c139bdec13e49e",
"body": "…ction) (#550)\n\nAdds two public methods on iOSTerminalView so callers outside the\nSwiftTerm module can programmatically drive the existing selection\nmechanism:\n\n public func setSelectionRange(start: Position, end: Position)\n public func clearSelection()\n\nBoth delegate to the internal SelectionServ\n[…]\nxisting hasActiveSelection accessor as the same\nshape of patch: public-surface exposure of internal-but-otherwise-\npublic-API state.\n\nCo-authored-by: James Betchley <JBetchGH@users.noreply.github.com>",
"is_bot": false,
"headline": "iOS: expose public selection accessors (setSelectionRange / clearSele…",
"author_name": "James",
"author_login": "JBetchGH",
"committed_at": "2026-05-15T13:41:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "432a32da04b5e8c3f8a86d776fb836ead2082745",
"body": "Minimal public-surface addition so embedders can veto their own\ngesture recognisers while the user is dragging a selection handle.\nRequired by the meshTerm fork's \"don't scroll while I'm dragging\nthe selection handle\" pattern; without it the existing\n`var selection: SelectionService!` (internal prot\n[…]\n filed; once it merges we'll swap back to upstream and drop\nthe fork.\n\nCo-authored-by: JBetchGH <JBetchGH@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "expose public hasActiveSelection on iOSTerminalView (#549)",
"author_name": "James",
"author_login": "JBetchGH",
"committed_at": "2026-05-13T15:15:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "73576f6f838414bab4c230cd1b56237bd16c3bbf",
"body": "…derer is just to not update things during an udpate",
"is_bot": false,
"headline": "Couple of guards to avoid duplicate work, the one on MetalTerminalRen…",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-10T14:09:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "129063d8de77c33e328388679eed34d82f103a4f",
"body": "Allow overriding Metal renderer scale",
"is_bot": false,
"headline": "Merge pull request #545 from evertjr/feat/metal-scale-factor-override",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-10T14:05:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "444bd6fdceae06712b89ed635f900e33f54d0b8c",
"body": "The padding work in PR #540 had collapsed the BGRA write into a per-pixel\n4-byte store inside the inner loop, regressing the hot path for color\nglyphs. Restructure write() so the content rows still use the original\nArraySlice row copy, then replicate the edge pixels into the padding\nstrips separately. The padding strips are only `padding` rows/cols wide,\nso the per-byte work there is negligible.",
"is_bot": false,
"headline": "GlyphAtlas: keep bulk row copy fast path for content pixels",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-10T13:54:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "74a6e0785496575e15bd908f375e73678d708a17",
"body": null,
"is_bot": false,
"headline": "Pad Metal glyph atlas entries",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-10T13:54:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5034d7ac14ca29335ff73df484d3bb8f4c82632c",
"body": null,
"is_bot": false,
"headline": "Report PTY pixel size from terminal cells (#544)",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-07T01:25:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19a48146eb56f93c9334357d87938c84fd7ca327",
"body": null,
"is_bot": false,
"headline": "Merge branch 'fix-metal-row-cache-generation'",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-06T21:30:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5716b0365dcc97cde43b1c06819078059b8aeefb",
"body": "BufferLine now tracks a monotonic generation counter that bumps on every\nmutation (cell write, isWrapped/renderMode/images change, fill/clear/\ncopy/resize/insert/delete). The Metal row cache stores both the\nBufferLine identity and its generation at cache time, and a row is reused\nonly when both stil\n[…]\nstale-row case from #539 (in-place mutations the dirty\nrange tracking misses, plus CircularList rotations that swap which\nBufferLine lives at a given absolute index without per-frame per-cell\nhashing.",
"is_bot": false,
"headline": "Detect Metal row cache invalidation via BufferLine generation",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-06T21:30:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "059c655207e98d0dd2ec3b7ff82c52913ae1fc8e",
"body": "supprot to the shift-override for mouse reporting.",
"is_bot": false,
"headline": "Update the last PR with a handful of comments, and add iOS",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-05-06T21:29:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "551bfcc4a4df4e95049b70ddd6de1aecaad87e32",
"body": "* Support Shift+mouse to bypass application mouse reporting\n\nWhen an application enables mouse reporting, all mouse events are\nforwarded and the user cannot perform native text selection. The\nestablished convention across terminal emulators is to let users hold\nShift to bypass mouse reporting and in\n[…]\n continues to bypass mouse reporting for local text\nselection. Sending CSI > 0 s (or a terminal reset) restores the default.\n\nThe existing allowMouseReporting toggle is preserved as the master switch.",
"is_bot": false,
"headline": "Support Shift+mouse to bypass application mouse reporting (#536)",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-06T21:19:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9fe62fb7da1f65f2e6a48eab44bbfd75b2442fae",
"body": null,
"is_bot": false,
"headline": "Allow overriding Metal renderer scale",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-05T23:43:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b60644dc8e9fc452dfa126077f5ef5fffb817f23",
"body": null,
"is_bot": false,
"headline": "Fix hidden scroller layout on macOS",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-05-05T23:42:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "86456ca32aaa81cadb4ca8dbe8be4546ffbccd18",
"body": "Allow external consumers to override mouseDown/mouseUp/mouseDragged.\nRequired for termi's GameTerminalView, which subclasses TerminalView\nto add focus observation, shift-click selection anchoring, and\ndrag-to-select auto-scroll.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make Mac mouse event overrides open for external subclassing (#535)",
"author_name": "padresb",
"author_login": "padresb",
"committed_at": "2026-04-26T16:28:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f37a52c947b6115b56cc59dcc5cb949ca0103378",
"body": "…ss is no longer used, but had to make benchmarking optional",
"is_bot": false,
"headline": "Make SwiftTerm work on MacOS v11 instead of requiring v13 as Subproce…",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-04-20T14:23:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f37922e49067c26f0b0cbabc7131b3f02862a7b5",
"body": null,
"is_bot": false,
"headline": "Fix the build on iOS",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-04-16T19:53:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "77ab194c9779098a37e5e70fcf79e3971773fb41",
"body": "Extend OSC 52 handling to support clipboard read queries (?) in addition\nto the existing write support. Following Ghostty's approach:\n\n- Add clipboardRead(source:) to TerminalDelegate and TerminalViewDelegate.\n Returns nil denies the request (safe default), non-nil allows it.Data?\n Hosts can use \n[…]\ne.\n\n- Implement clipboardRead in MacLocalTerminalView (reads NSPasteboard).\n\n- Add comprehensive tests for write, read-allowed, read-denied, default\n selection, primary selection, and invalid base64.",
"is_bot": false,
"headline": "Add OSC 52 clipboard read support with safe defaults",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-04-16T01:43:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "272fdc9cde4ab9a0a76863580a6b2e27b6b913a4",
"body": "* feat: add configurable fontSmoothing property\n\nAdd `fontSmoothing` public property to TerminalView (defaults to true).\nWhen set to false, disables font smoothing on macOS for thinner strokes\non Retina displays — equivalent to iTerm2's \"Thin strokes\" setting.\n\nAffects both the CoreText draw path (A\n[…]\nred-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Jim Prosser <jimprosser@MacBook-Pro.local>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add configurable fontSmoothing property (#531)",
"author_name": "Jim Prosser",
"author_login": "jimprosser",
"committed_at": "2026-04-15T00:39:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "751b72f80a523b8db7250514ac8495b9c4f7830b",
"body": null,
"is_bot": false,
"headline": "Sample Mac Terminal app harness improvements to test new colors",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-04-15T00:22:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ede2b0b85ef3570b036ffa0c8651683a67bcc36d",
"body": "Two bugs in removeKittyPlacements():\n\n1. updateRange() was only called when removedKeys was non-empty.\n Images without an explicit placementId (nil) were correctly removed\n from line.images but removedKeys stayed empty, so updateRange() was\n never called and the view never repainted those rows\n[…]\nng\nbetween image files left the previous image visible, and navigating to\na text file showed text rendered behind the stale image.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "Fix Kitty image deletion not triggering repaint",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-04-15T00:18:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b6ce28a4b222b06d76a3fd44e904e00a95044d53",
"body": "…es (#529)",
"is_bot": false,
"headline": "Fix base16Lab palette producing inverted grayscale ramp on light them…",
"author_name": "Evert Junior",
"author_login": "evertjr",
"committed_at": "2026-04-06T18:07:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a15d503e47d27fd5290b1edffc1ddfb2ada70559",
"body": null,
"is_bot": false,
"headline": "Add tests for recent contribution",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-04-03T20:08:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "94b63560c55e80876f32cb3ceeeba369b474bb2c",
"body": "…en (#522)\n\nBuffer.init never set _marginRight, leaving it at 0 instead of cols-1.\ncmdScrollDown (CSI T) unconditionally used marginRight to determine how\nmany columns to copy per line, so on the alternate buffer it only copied\n1 column — making scroll-down appear to update only the first line.\n\nThi\n[…]\ne wheel, since htop uses CSI T to shift content down within its\nscroll region. reverseIndex (ESC M) was unaffected because it checks\nmarginMode and moves whole line objects when margins aren't active.",
"is_bot": false,
"headline": "Fix: initialize buffer margins so CSI T scroll-down works on alt scre…",
"author_name": "Brad",
"author_login": "colemaco",
"committed_at": "2026-04-03T19:51:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f5fca51e678e4aeb35856362387819bdbe6e1b3d",
"body": "On iOS, the Metal GPU backend renders all regular text glyphs in\nwhite, ignoring the foreground color attribute. Background colors\nand box-drawing/block character foreground colors work correctly.\n\nFix provided by @boorch on github",
"is_bot": false,
"headline": "Fixes https://github.com/migueldeicaza/SwiftTerm/issues/512",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-04-03T19:48:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d024ed7136681d88d14ca2fd220d41f94cc8c547",
"body": "The 100ms syncSequenceSettleMs default causes visible input lag for\napplications that use DEC 2026 synchronized output directly (not\nthrough tmux). tmux handles DEC 2026 internally, so the debounce\nonly affects direct applications like Claude Code, Neovim, and\nratatui-based TUIs — which send single BSU/ESU pairs per update\nand don't need multi-burst coalescing.\n\nReduce default to 16ms (one frame at 60fps) and make the property\npublic so embedders can tune it further.\n\nFixes #525",
"is_bot": false,
"headline": "fix: reduce sync output debounce to 16ms and make public (#526)",
"author_name": "Gilles Dubuc",
"author_login": "gi11es",
"committed_at": "2026-04-03T15:59:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "57eec369a4f335dcaec1bbaa20526ca527bdd69a",
"body": "… (#523)\n\nAfter scrolling for a long time (more than the length of the circular buffer of lines, around 500 lines of terminal output), the isWrapped value for the buffer line is out of sync with the actual content (it can be isWrapped == true even for a very short line, or isWrapped == false for a l\n[…]\nthe proper value for isWrapped. But if the buffer is full, then we recycle a previous line. The content of the line is erased in lines.recycle() but its isWrapped status is left as its previous value.",
"is_bot": false,
"headline": "Fix for the isWrapped value being out of sync with the actual content…",
"author_name": "Nicolas Holzschuch",
"author_login": "holzschu",
"committed_at": "2026-04-03T15:58:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "36bd4c96d578387160f4b21580a6a88abaf33619",
"body": "accessibilityBaseAttributes(), accessibilityAttributedLine(_:endCol:),\nand accessibilityAttributedDisplayText(start:end:) were defined twice\nin iOSTerminalView.swift after the merge of #521, causing iOS build\nfailures.\n\nRemove the second copy (lines 2833–2951) which duplicated the\ndefinitions at lines 2710–2828.",
"is_bot": false,
"headline": "fix: remove duplicate accessibility methods in iOSTerminalView (#527)",
"author_name": "Gilles Dubuc",
"author_login": "gi11es",
"committed_at": "2026-04-03T15:57:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44ea6500511b675b82b18389b1c3bdfc776384af",
"body": "* Add suggested APIs\n\n* Improving accessibility: VoiceOver for wrapped lines, speak the current page. (#511)\n\n* Don't copy the empty characters after emojis\n\n* Don't copy the empty characters after emojis\n\n* Auxiliary functions needed for a-Shell\n\n* Removed code for scaling emojis\n\n* Adding function\n[…]\n\nCo-authored-by: HOLZSCHUCH Nicolas <nicolas.holzschuch@inria.fr>\n\n---------\n\nCo-authored-by: Nicolas Holzschuch <n.holzschuch@free.fr>\nCo-authored-by: HOLZSCHUCH Nicolas <nicolas.holzschuch@inria.fr>",
"is_bot": false,
"headline": "Accessible attributed string (#521)",
"author_name": "Miguel de Icaza",
"author_login": "migueldeicaza",
"committed_at": "2026-04-02T19:46:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "468d0a8850bc4db25a915f1fabf4bbf40529eed9",
"body": "* Fix synchronized output rendering (DEC mode 2026)\n\nSwiftTerm's existing DEC 2026 implementation correctly snapshots the\nbuffer via displayBuffer, but never suppresses rendering during sync\nblocks. draw() calls continue via queuePendingDisplay, updateDisplay,\nscrollTo, and ensureCaretIsVisible — ca\n[…]\nnsureCaretIsVisible() retains guard (prevents programmatic scroll-through)\n- Emit terminalDelegate?.scrolled() after debounce timer so host UI updates\n- Add model-level and view-level regression tests",
"is_bot": false,
"headline": "Fix synchronized output rendering (DEC mode 2026) (#498)",
"author_name": "inbarajaldrin",
"author_login": "inbarajaldrin",
"committed_at": "2026-04-02T19:45:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2fe63d1a244e98a4fbadc7b77b93799ceb97389",
"body": "The NSTextInputClient implementation on macOS had stub/incomplete marked\ntext methods that caused dictation to silently fail (system \"bonk\" sound)\nand IME composition to not track state properly.\n\nChanges:\n- Track marked text state (markedTextStorage/markedSelectedRange) across\n setMarkedText, unma\n[…]\nTextField) at the caret position that shows\n live dictation/IME composition text with an underline, matching the\n terminal font and colors\n- Remove leftover debug print() calls from protocol methods",
"is_bot": false,
"headline": "Fix macOS dictation and IME support in NSTextInputClient (#501)",
"author_name": "Zabir Raihan",
"author_login": "SilverMarcs",
"committed_at": "2026-04-02T19:44:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e4b72727cd371ad9c4c46fbb08063e94edd4cb32",
"body": "… (#507)\n\nThis is related to issue #482\nCurrently, canScroll takes into account the left and right margins set in the buffer, even if marginMode is not set.\n\nThe PR adds !marginMode || at the beginning of the test, so that canScroll defaults to true if marginMode is not set.\n\nI identified this issue\n[…]\nthe latter causes a crash when something is larger than 255.\n\n(This is the first in a series of PR I'm making. I'm splitting my changes into small, separate PRs, so you can review them independently).",
"is_bot": false,
"headline": "The `canScroll` boolean defaults to `true` if `marginMode` is not set…",
"author_name": "Nicolas Holzschuch",
"author_login": "holzschu",
"committed_at": "2026-04-02T19:43:01Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 15,
"commits_last_year": 304,
"latest_release_at": "2026-07-19T18:57:22Z",
"latest_release_tag": "v1.15.0",
"releases_from_tags": false,
"days_since_last_push": 1,
"active_weeks_last_year": 40,
"days_since_latest_release": 8,
"mean_days_between_releases": 20.8
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 85,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 414,
"stars": 1632,
"watchers": 20,
"fork_history": {
"days": [
{
"date": "2020-03-09",
"count": 1
},
{
"date": "2020-03-29",
"count": 1
},
{
"date": "2020-04-09",
"count": 1
},
{
"date": "2020-04-23",
"count": 1
},
{
"date": "2020-04-24",
"count": 1
},
{
"date": "2020-04-27",
"count": 1
},
{
"date": "2020-04-28",
"count": 2
},
{
"date": "2020-05-02",
"count": 1
},
{
"date": "2020-05-04",
"count": 1
},
{
"date": "2020-05-15",
"count": 1
},
{
"date": "2020-05-23",
"count": 1
},
{
"date": "2020-05-28",
"count": 2
},
{
"date": "2020-05-30",
"count": 1
},
{
"date": "2020-06-30",
"count": 1
},
{
"date": "2020-07-04",
"count": 1
},
{
"date": "2020-07-19",
"count": 1
},
{
"date": "2020-07-21",
"count": 1
},
{
"date": "2020-07-27",
"count": 1
},
{
"date": "2020-08-05",
"count": 1
},
{
"date": "2020-08-07",
"count": 1
},
{
"date": "2020-08-28",
"count": 1
},
{
"date": "2020-10-11",
"count": 1
},
{
"date": "2020-10-12",
"count": 1
},
{
"date": "2020-11-20",
"count": 1
},
{
"date": "2020-11-25",
"count": 1
},
{
"date": "2020-12-05",
"count": 1
},
{
"date": "2020-12-08",
"count": 1
},
{
"date": "2021-01-05",
"count": 1
},
{
"date": "2021-01-08",
"count": 2
},
{
"date": "2021-01-09",
"count": 1
},
{
"date": "2021-01-28",
"count": 1
},
{
"date": "2021-02-15",
"count": 1
},
{
"date": "2021-04-08",
"count": 1
},
{
"date": "2021-04-28",
"count": 1
},
{
"date": "2021-05-14",
"count": 1
},
{
"date": "2021-07-05",
"count": 1
},
{
"date": "2021-07-06",
"count": 1
},
{
"date": "2021-08-11",
"count": 1
},
{
"date": "2021-09-13",
"count": 1
},
{
"date": "2021-10-13",
"count": 1
},
{
"date": "2021-10-19",
"count": 1
},
{
"date": "2021-10-30",
"count": 1
},
{
"date": "2021-11-15",
"count": 1
},
{
"date": "2021-12-22",
"count": 1
},
{
"date": "2022-01-20",
"count": 1
},
{
"date": "2022-01-31",
"count": 1
},
{
"date": "2022-02-08",
"count": 1
},
{
"date": "2022-03-08",
"count": 1
},
{
"date": "2022-04-02",
"count": 1
},
{
"date": "2022-04-06",
"count": 1
},
{
"date": "2022-04-11",
"count": 1
},
{
"date": "2022-04-12",
"count": 1
},
{
"date": "2022-04-14",
"count": 1
},
{
"date": "2022-04-15",
"count": 1
},
{
"date": "2022-05-22",
"count": 1
},
{
"date": "2022-05-25",
"count": 1
},
{
"date": "2022-06-10",
"count": 1
},
{
"date": "2022-07-10",
"count": 1
},
{
"date": "2022-07-24",
"count": 1
},
{
"date": "2022-09-04",
"count": 1
},
{
"date": "2022-09-06",
"count": 1
},
{
"date": "2022-09-10",
"count": 1
},
{
"date": "2022-09-22",
"count": 1
},
{
"date": "2022-10-06",
"count": 1
},
{
"date": "2022-10-17",
"count": 1
},
{
"date": "2022-10-19",
"count": 1
},
{
"date": "2022-11-26",
"count": 1
},
{
"date": "2022-12-01",
"count": 1
},
{
"date": "2022-12-06",
"count": 1
},
{
"date": "2022-12-14",
"count": 1
},
{
"date": "2022-12-15",
"count": 1
},
{
"date": "2022-12-18",
"count": 1
},
{
"date": "2022-12-22",
"count": 1
},
{
"date": "2023-01-07",
"count": 1
},
{
"date": "2023-02-16",
"count": 1
},
{
"date": "2023-02-23",
"count": 1
},
{
"date": "2023-02-24",
"count": 1
},
{
"date": "2023-03-07",
"count": 1
},
{
"date": "2023-03-16",
"count": 1
},
{
"date": "2023-04-07",
"count": 1
},
{
"date": "2023-04-19",
"count": 1
},
{
"date": "2023-05-07",
"count": 1
},
{
"date": "2023-06-01",
"count": 1
},
{
"date": "2023-06-17",
"count": 1
},
{
"date": "2023-07-01",
"count": 1
},
{
"date": "2023-07-02",
"count": 1
},
{
"date": "2023-07-08",
"count": 1
},
{
"date": "2023-08-11",
"count": 1
},
{
"date": "2023-08-23",
"count": 1
},
{
"date": "2023-08-25",
"count": 1
},
{
"date": "2023-09-23",
"count": 1
},
{
"date": "2023-09-26",
"count": 1
},
{
"date": "2023-10-11",
"count": 1
},
{
"date": "2023-11-12",
"count": 1
},
{
"date": "2023-11-24",
"count": 1
},
{
"date": "2023-11-30",
"count": 1
},
{
"date": "2024-01-12",
"count": 1
},
{
"date": "2024-01-23",
"count": 1
},
{
"date": "2024-02-05",
"count": 1
},
{
"date": "2024-02-29",
"count": 1
},
{
"date": "2024-03-16",
"count": 1
},
{
"date": "2024-03-21",
"count": 2
},
{
"date": "2024-03-26",
"count": 1
},
{
"date": "2024-03-29",
"count": 1
},
{
"date": "2024-03-30",
"count": 1
},
{
"date": "2024-04-06",
"count": 1
},
{
"date": "2024-04-16",
"count": 1
},
{
"date": "2024-04-28",
"count": 1
},
{
"date": "2024-05-12",
"count": 1
},
{
"date": "2024-05-17",
"count": 1
},
{
"date": "2024-06-18",
"count": 1
},
{
"date": "2024-06-30",
"count": 1
},
{
"date": "2024-07-03",
"count": 2
},
{
"date": "2024-07-20",
"count": 1
},
{
"date": "2024-07-26",
"count": 1
},
{
"date": "2024-07-29",
"count": 1
},
{
"date": "2024-07-30",
"count": 1
},
{
"date": "2024-08-01",
"count": 1
},
{
"date": "2024-08-11",
"count": 1
},
{
"date": "2024-08-29",
"count": 1
},
{
"date": "2024-09-09",
"count": 1
},
{
"date": "2024-09-21",
"count": 1
},
{
"date": "2024-09-22",
"count": 1
},
{
"date": "2024-10-05",
"count": 1
},
{
"date": "2024-10-30",
"count": 1
},
{
"date": "2024-11-04",
"count": 1
},
{
"date": "2024-11-23",
"count": 1
},
{
"date": "2025-01-07",
"count": 1
},
{
"date": "2025-01-31",
"count": 1
},
{
"date": "2025-02-23",
"count": 1
},
{
"date": "2025-03-01",
"count": 1
},
{
"date": "2025-04-04",
"count": 1
},
{
"date": "2025-04-09",
"count": 1
},
{
"date": "2025-05-24",
"count": 1
},
{
"date": "2025-05-28",
"count": 1
},
{
"date": "2025-06-16",
"count": 1
},
{
"date": "2025-06-17",
"count": 1
},
{
"date": "2025-06-29",
"count": 1
},
{
"date": "2025-07-06",
"count": 1
},
{
"date": "2025-07-15",
"count": 1
},
{
"date": "2025-07-16",
"count": 1
},
{
"date": "2025-07-27",
"count": 1
},
{
"date": "2025-08-03",
"count": 1
},
{
"date": "2025-08-12",
"count": 1
},
{
"date": "2025-08-18",
"count": 1
},
{
"date": "2025-08-23",
"count": 1
},
{
"date": "2025-08-26",
"count": 1
},
{
"date": "2025-08-27",
"count": 1
},
{
"date": "2025-08-30",
"count": 1
},
{
"date": "2025-08-31",
"count": 1
},
{
"date": "2025-09-01",
"count": 1
},
{
"date": "2025-09-14",
"count": 1
},
{
"date": "2025-09-18",
"count": 1
},
{
"date": "2025-09-24",
"count": 1
},
{
"date": "2025-09-25",
"count": 1
},
{
"date": "2025-10-05",
"count": 1
},
{
"date": "2025-10-21",
"count": 1
},
{
"date": "2025-11-06",
"count": 1
},
{
"date": "2025-11-07",
"count": 1
},
{
"date": "2025-11-08",
"count": 1
},
{
"date": "2025-11-14",
"count": 1
},
{
"date": "2025-11-15",
"count": 1
},
{
"date": "2025-11-19",
"count": 1
},
{
"date": "2025-11-25",
"count": 1
},
{
"date": "2025-12-04",
"count": 1
},
{
"date": "2025-12-05",
"count": 1
},
{
"date": "2025-12-06",
"count": 1
},
{
"date": "2025-12-16",
"count": 1
},
{
"date": "2025-12-18",
"count": 1
},
{
"date": "2025-12-24",
"count": 1
},
{
"date": "2025-12-25",
"count": 1
},
{
"date": "2025-12-29",
"count": 1
},
{
"date": "2025-12-31",
"count": 1
},
{
"date": "2026-01-01",
"count": 1
},
{
"date": "2026-01-05",
"count": 1
},
{
"date": "2026-01-06",
"count": 1
},
{
"date": "2026-01-08",
"count": 1
},
{
"date": "2026-01-09",
"count": 3
},
{
"date": "2026-01-10",
"count": 3
},
{
"date": "2026-01-11",
"count": 1
},
{
"date": "2026-01-12",
"count": 1
},
{
"date": "2026-01-14",
"count": 2
},
{
"date": "2026-01-15",
"count": 1
},
{
"date": "2026-01-16",
"count": 1
},
{
"date": "2026-01-17",
"count": 2
},
{
"date": "2026-01-19",
"count": 1
},
{
"date": "2026-01-20",
"count": 1
},
{
"date": "2026-01-23",
"count": 1
},
{
"date": "2026-01-24",
"count": 1
},
{
"date": "2026-01-25",
"count": 2
},
{
"date": "2026-01-29",
"count": 2
},
{
"date": "2026-01-30",
"count": 1
},
{
"date": "2026-01-31",
"count": 1
},
{
"date": "2026-02-01",
"count": 1
},
{
"date": "2026-02-02",
"count": 1
},
{
"date": "2026-02-03",
"count": 1
},
{
"date": "2026-02-04",
"count": 1
},
{
"date": "2026-02-08",
"count": 2
},
{
"date": "2026-02-10",
"count": 1
},
{
"date": "2026-02-11",
"count": 2
},
{
"date": "2026-02-12",
"count": 2
},
{
"date": "2026-02-14",
"count": 1
},
{
"date": "2026-02-15",
"count": 1
},
{
"date": "2026-02-16",
"count": 1
},
{
"date": "2026-02-19",
"count": 2
},
{
"date": "2026-02-20",
"count": 3
},
{
"date": "2026-02-21",
"count": 1
},
{
"date": "2026-02-22",
"count": 1
},
{
"date": "2026-02-24",
"count": 1
},
{
"date": "2026-02-25",
"count": 1
},
{
"date": "2026-02-26",
"count": 2
},
{
"date": "2026-02-27",
"count": 1
},
{
"date": "2026-03-01",
"count": 2
},
{
"date": "2026-03-02",
"count": 2
},
{
"date": "2026-03-03",
"count": 1
},
{
"date": "2026-03-04",
"count": 1
},
{
"date": "2026-03-05",
"count": 1
},
{
"date": "2026-03-07",
"count": 1
},
{
"date": "2026-03-08",
"count": 1
},
{
"date": "2026-03-09",
"count": 1
},
{
"date": "2026-03-10",
"count": 2
},
{
"date": "2026-03-11",
"count": 2
},
{
"date": "2026-03-12",
"count": 1
},
{
"date": "2026-03-13",
"count": 1
},
{
"date": "2026-03-15",
"count": 1
},
{
"date": "2026-03-20",
"count": 2
},
{
"date": "2026-03-21",
"count": 3
},
{
"date": "2026-03-22",
"count": 2
},
{
"date": "2026-03-23",
"count": 3
},
{
"date": "2026-03-24",
"count": 1
},
{
"date": "2026-03-25",
"count": 3
},
{
"date": "2026-03-26",
"count": 1
},
{
"date": "2026-03-27",
"count": 1
},
{
"date": "2026-03-28",
"count": 2
},
{
"date": "2026-03-29",
"count": 1
},
{
"date": "2026-04-01",
"count": 1
},
{
"date": "2026-04-02",
"count": 3
},
{
"date": "2026-04-03",
"count": 1
},
{
"date": "2026-04-04",
"count": 1
},
{
"date": "2026-04-06",
"count": 1
},
{
"date": "2026-04-07",
"count": 1
},
{
"date": "2026-04-09",
"count": 2
},
{
"date": "2026-04-12",
"count": 3
},
{
"date": "2026-04-14",
"count": 1
},
{
"date": "2026-04-15",
"count": 2
},
{
"date": "2026-04-16",
"count": 1
},
{
"date": "2026-04-19",
"count": 1
},
{
"date": "2026-04-21",
"count": 1
},
{
"date": "2026-04-22",
"count": 1
},
{
"date": "2026-04-23",
"count": 2
},
{
"date": "2026-04-24",
"count": 1
},
{
"date": "2026-04-25",
"count": 1
},
{
"date": "2026-04-26",
"count": 1
},
{
"date": "2026-04-27",
"count": 1
},
{
"date": "2026-04-29",
"count": 1
},
{
"date": "2026-04-30",
"count": 1
},
{
"date": "2026-05-02",
"count": 2
},
{
"date": "2026-05-06",
"count": 1
},
{
"date": "2026-05-07",
"count": 1
},
{
"date": "2026-05-13",
"count": 1
},
{
"date": "2026-05-14",
"count": 1
},
{
"date": "2026-05-16",
"count": 2
},
{
"date": "2026-05-18",
"count": 1
},
{
"date": "2026-05-19",
"count": 1
},
{
"date": "2026-05-21",
"count": 1
},
{
"date": "2026-05-22",
"count": 1
},
{
"date": "2026-05-23",
"count": 1
},
{
"date": "2026-05-24",
"count": 2
},
{
"date": "2026-05-26",
"count": 2
},
{
"date": "2026-05-28",
"count": 1
},
{
"date": "2026-05-30",
"count": 1
},
{
"date": "2026-06-02",
"count": 1
},
{
"date": "2026-06-03",
"count": 1
},
{
"date": "2026-06-04",
"count": 5
},
{
"date": "2026-06-05",
"count": 1
},
{
"date": "2026-06-06",
"count": 2
},
{
"date": "2026-06-09",
"count": 3
},
{
"date": "2026-06-10",
"count": 2
},
{
"date": "2026-06-12",
"count": 1
},
{
"date": "2026-06-13",
"count": 1
},
{
"date": "2026-06-14",
"count": 1
},
{
"date": "2026-06-15",
"count": 1
},
{
"date": "2026-06-16",
"count": 1
},
{
"date": "2026-06-17",
"count": 1
},
{
"date": "2026-06-18",
"count": 1
},
{
"date": "2026-06-21",
"count": 1
},
{
"date": "2026-06-22",
"count": 4
},
{
"date": "2026-06-24",
"count": 1
},
{
"date": "2026-06-25",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-06-28",
"count": 1
},
{
"date": "2026-06-29",
"count": 3
},
{
"date": "2026-07-01",
"count": 3
},
{
"date": "2026-07-02",
"count": 1
},
{
"date": "2026-07-03",
"count": 2
},
{
"date": "2026-07-04",
"count": 2
},
{
"date": "2026-07-06",
"count": 3
},
{
"date": "2026-07-07",
"count": 1
},
{
"date": "2026-07-08",
"count": 1
},
{
"date": "2026-07-09",
"count": 2
},
{
"date": "2026-07-10",
"count": 2
},
{
"date": "2026-07-11",
"count": 3
},
{
"date": "2026-07-12",
"count": 2
},
{
"date": "2026-07-13",
"count": 1
},
{
"date": "2026-07-14",
"count": 3
},
{
"date": "2026-07-16",
"count": 4
},
{
"date": "2026-07-17",
"count": 2
},
{
"date": "2026-07-18",
"count": 2
},
{
"date": "2026-07-19",
"count": 3
},
{
"date": "2026-07-20",
"count": 2
},
{
"date": "2026-07-21",
"count": 2
},
{
"date": "2026-07-22",
"count": 2
},
{
"date": "2026-07-23",
"count": 2
},
{
"date": "2026-07-24",
"count": 1
},
{
"date": "2026-07-25",
"count": 3
},
{
"date": "2026-07-26",
"count": 2
},
{
"date": "2026-07-27",
"count": 3
}
],
"complete": true,
"collected": 403,
"total_forks": 414
},
"star_history": null,
"open_issues_and_prs": 84
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 254288,
"source_files_sampled": 122,
"oversized_source_files": 6,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"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": 24,
"merged_prs": 175,
"open_issues": 60,
"closed_ratio": 0.811,
"closed_issues": 257,
"closed_unmerged_prs": 61
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "migueldeicaza",
"commits": 863,
"avatar_url": "https://avatars.githubusercontent.com/u/36863?v=4"
},
{
"type": "User",
"login": "krzyzanowskim",
"commits": 75,
"avatar_url": "https://avatars.githubusercontent.com/u/758033?v=4"
},
{
"type": "User",
"login": "evertjr",
"commits": 18,
"avatar_url": "https://avatars.githubusercontent.com/u/13040196?v=4"
},
{
"type": "User",
"login": "palmin",
"commits": 14,
"avatar_url": "https://avatars.githubusercontent.com/u/1230554?v=4"
},
{
"type": "User",
"login": "iOSappssolutions",
"commits": 11,
"avatar_url": "https://avatars.githubusercontent.com/u/60011782?v=4"
},
{
"type": "User",
"login": "thecoolwinter",
"commits": 8,
"avatar_url": "https://avatars.githubusercontent.com/u/35942988?v=4"
},
{
"type": "User",
"login": "georges",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/3819?v=4"
},
{
"type": "User",
"login": "JBetchGH",
"commits": 5,
"avatar_url": "https://avatars.githubusercontent.com/u/268853887?v=4"
},
{
"type": "User",
"login": "klc",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/26712751?v=4"
},
{
"type": "User",
"login": "holzschu",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/8070736?v=4"
}
],
"contributors_sampled": 63,
"top_contributor_share": 0.796
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"docc.yml",
"xcode.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 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": 3,
"reason": "6 out of 16 merged PRs checked by a CI test -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 5,
"reason": "Found 15/30 approved changesets -- score normalized to 5",
"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": 10,
"reason": "project is fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 11 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": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 9,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "6918d74b5c2880007901151cd4ac1820779abd7b",
"ran_at": "2026-07-28T02:56:58Z",
"aggregate_score": 6.1,
"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-26T16:27:16Z",
"oldest_open_prs": [
{
"number": 291,
"created_at": "2023-04-18T03:38:35Z",
"last_comment_at": "2023-05-22T15:33:17Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 389,
"created_at": "2025-08-27T07:15:06Z",
"last_comment_at": "2026-02-11T05:37:46Z",
"last_comment_author": "sgehrman"
},
{
"number": 395,
"created_at": "2025-09-03T16:56:20Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 430,
"created_at": "2026-01-09T23:50:06Z",
"last_comment_at": "2026-07-14T18:56:34Z",
"last_comment_author": "botsdown"
},
{
"number": 449,
"created_at": "2026-01-20T19:19:12Z",
"last_comment_at": "2026-01-20T19:23:18Z",
"last_comment_author": "leftspin"
},
{
"number": 464,
"created_at": "2026-02-11T08:14:05Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 467,
"created_at": "2026-02-12T02:19:09Z",
"last_comment_at": "2026-02-17T23:20:42Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 468,
"created_at": "2026-02-12T09:15:29Z",
"last_comment_at": "2026-05-19T08:06:32Z",
"last_comment_author": "MartinStrambach"
},
{
"number": 475,
"created_at": "2026-02-22T21:29:54Z",
"last_comment_at": "2026-02-23T01:54:46Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 519,
"created_at": "2026-04-01T13:21:36Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 530,
"created_at": "2026-04-07T11:45:32Z",
"last_comment_at": "2026-05-17T21:36:40Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 555,
"created_at": "2026-05-22T17:34:26Z",
"last_comment_at": "2026-06-22T19:00:36Z",
"last_comment_author": "gilbert-barajas"
},
{
"number": 556,
"created_at": "2026-05-23T01:51:38Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 558,
"created_at": "2026-05-24T17:13:08Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 561,
"created_at": "2026-05-30T04:18:35Z",
"last_comment_at": "2026-07-12T04:03:23Z",
"last_comment_author": "SilverMarcs"
},
{
"number": 577,
"created_at": "2026-06-18T03:13:30Z",
"last_comment_at": "2026-07-01T20:02:50Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 580,
"created_at": "2026-06-23T15:23:38Z",
"last_comment_at": "2026-07-01T20:56:10Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 585,
"created_at": "2026-07-01T09:26:37Z",
"last_comment_at": "2026-07-22T03:03:34Z",
"last_comment_author": "Coiggahou2002"
},
{
"number": 589,
"created_at": "2026-07-12T17:21:19Z",
"last_comment_at": "2026-07-17T04:47:16Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 594,
"created_at": "2026-07-15T03:49:51Z",
"last_comment_at": "2026-07-16T14:46:33Z",
"last_comment_author": "migueldeicaza"
}
],
"last_merged_pr_at": "2026-07-26T16:24:31Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 9,
"created_at": "2020-03-14T02:14:56Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 12,
"created_at": "2020-03-14T03:00:03Z",
"last_comment_at": "2026-03-30T11:54:01Z",
"last_comment_author": "holzschu"
},
{
"number": 13,
"created_at": "2020-03-14T03:00:13Z",
"last_comment_at": "2026-02-04T22:00:37Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 38,
"created_at": "2020-04-01T00:39:50Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 43,
"created_at": "2020-04-04T03:33:06Z",
"last_comment_at": "2020-04-12T04:22:42Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 60,
"created_at": "2020-04-10T03:12:51Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 87,
"created_at": "2020-04-22T17:28:38Z",
"last_comment_at": "2026-04-01T13:21:45Z",
"last_comment_author": "gi11es"
},
{
"number": 89,
"created_at": "2020-04-23T19:01:55Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 93,
"created_at": "2020-04-25T04:03:27Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 99,
"created_at": "2020-04-27T03:45:40Z",
"last_comment_at": "2020-05-08T03:43:24Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 108,
"created_at": "2020-05-02T14:55:29Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 117,
"created_at": "2020-05-04T04:23:07Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 136,
"created_at": "2020-08-06T02:58:29Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 149,
"created_at": "2020-11-27T19:55:47Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 170,
"created_at": "2021-04-06T03:17:56Z",
"last_comment_at": "2022-06-30T18:16:45Z",
"last_comment_author": "migueldeicaza"
},
{
"number": 172,
"created_at": "2021-04-18T02:56:10Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 185,
"created_at": "2021-06-19T01:23:02Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 190,
"created_at": "2021-07-16T04:17:31Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 203,
"created_at": "2022-01-02T14:14:04Z",
"last_comment_at": "2024-03-17T03:21:02Z",
"last_comment_author": "l2dy"
},
{
"number": 213,
"created_at": "2022-02-17T03:35:28Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/migueldeicaza/SwiftTerm",
"host": "github.com",
"name": "SwiftTerm",
"owner": "migueldeicaza"
},
"metrics": {
"overall": {
"key": "overall",
"band": "good",
"name": "Overall health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"security": 61,
"vitality": 95,
"community": 74,
"governance": 60,
"engineering": 56
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 95,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "excellent",
"name": "Development activity",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"commits_last_year": 304,
"human_commit_share": 1,
"days_since_last_push": 1,
"active_weeks_last_year": 40
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 1 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 1
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "40/52 weeks with commits",
"points": 27.7,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 40
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "304 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 304
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 11 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 15,
"latest_release_tag": "v1.15.0",
"releases_from_tags": false,
"days_since_latest_release": 8,
"mean_days_between_releases": 20.8
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "15 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 15
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 8 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 8
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~20.8 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 20.8
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 1,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 1 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 1
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "good",
"name": "Community & Adoption",
"value": 74,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "good",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 81,
"inputs": {
"forks": 414,
"stars": 1632,
"watchers": 20,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1,632 stars",
"points": 52.1,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 1632
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "414 forks",
"points": 21.8,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 414
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "20 watchers",
"points": 7.1,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 20
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": true,
"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": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 13.5,
"status": "met",
"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": 60,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 37,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 63,
"top_contributor_share": 0.796
},
"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 80% of commits",
"points": 4.6,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 80
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "63 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 63
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 6 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 74,
"inputs": {
"merged_prs": 175,
"open_issues": 60,
"closed_issues": 257,
"issue_closed_ratio": 0.811,
"closed_unmerged_prs": 61
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "81% of issues closed",
"points": 37.9,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 81
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "175/236 decided PRs merged",
"points": 28.4,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 175,
"decided": 236
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 15/30 approved changesets -- score normalized to 5",
"points": 7.5,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "good",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 75,
"inputs": {
"followers": 5238,
"owner_type": "User",
"is_verified": null,
"owner_login": "migueldeicaza",
"public_repos": 224,
"account_age_days": 6452
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "5,238 followers of migueldeicaza",
"points": 25,
"status": "met",
"details": [
{
"code": "owner_followers",
"params": {
"count": 5238,
"login": "migueldeicaza"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "224 public repos, account ~17 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 224
}
},
{
"code": "account_age_years",
"params": {
"years": 17
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 56,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 54,
"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": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 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": "6 out of 16 merged PRs checked by a CI test -- score normalized to 3",
"points": 6,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"topics": [
"macos",
"ios",
"swift",
"xterm-256color",
"xterm",
"uikit",
"appkit",
"vt100",
"sixel",
"imgcat",
"terminal-engine",
"ssh-connection"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "12 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 12
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 61,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 61,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 6.1
},
"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": "6 out of 16 merged PRs checked by a CI test -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 15/30 approved changesets -- score normalized to 5",
"points": 3.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 6 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is fuzzed",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 11 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 4.5,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 10
},
"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": 60,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.81,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "81 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 81,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.13,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "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": "Swift (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Swift"
}
}
],
"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": "13 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 13,
"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": 97,
"inputs": {
"primary_language": "Swift",
"largest_source_bytes": 254288,
"source_files_sampled": 122,
"oversized_source_files": 6
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Swift (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Swift"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "6/122 source files over 60KB",
"points": 52.3,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 122,
"oversized": 6
}
}
],
"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"
],
"report_type": "repository",
"generated_at": "2026-07-28T02:57:20.024629Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/migueldeicaza/SwiftTerm.svg",
"full_name": "migueldeicaza/SwiftTerm",
"license_state": "standard",
"license_spdx": "MIT"
}