Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 478,
"has_wiki": false,
"homepage": null,
"languages": {
"CSS": 1071,
"HTML": 1053,
"Dockerfile": 1277,
"JavaScript": 23735,
"TypeScript": 382327
},
"pushed_at": "2026-07-18T14:21:18Z",
"created_at": "2026-04-04T13:15:18Z",
"owner_type": "User",
"updated_at": "2026-07-18T14:21:42Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript"
]
},
"owner": {
"blog": null,
"name": "Arose Niazi",
"type": "User",
"login": "Arose-Niazi",
"company": "@Vedocit ",
"location": "Pakistan",
"followers": 54,
"avatar_url": "https://avatars.githubusercontent.com/u/11246188?v=4",
"created_at": "2015-02-28T15:24:11Z",
"is_verified": null,
"public_repos": 81,
"account_age_days": 4163
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [],
"recent_commits": [
{
"oid": "65f6ac234c48947d25ca0c15f41466d0056caf55",
"body": "Document the full feature set — terminals with disconnect-persistence, tmux\nmirror (shared sessions + scroll + Claude enrichment), Claude Code\nintegration (resume/new/live chat/prompt buttons/file links), push\nnotifications, VPN control, file explorer/transfer, multi-user isolation,\nand agent niceti\n[…]\ne-instance, --version). npm README\nalso gains a commands table, config/VPN/env reference. Version-only bump to\npush the refreshed README to npm.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: comprehensive feature docs in repo + npm READMEs (agent v1.0.16)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-18T14:21:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "740f09f29e42a2ac81e677ce15d8e6e6e0c86ff2",
"body": "No easy way to see the installed version without digging into node_modules.\ncli.ts now handles -v/--version (reads the package's own package.json at\nruntime) and shows the version + a command list in --help.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add 'crc-agent --version' / -v (and version in --help) (agent v1.0.15)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-16T01:38:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ee97529b85240f779abd09488e9c17ebbbb2208d",
"body": "A remote-control agent is unreachable if the Mac idle-sleeps and drops the\nnetwork. The agent now runs 'caffeinate -i -w <pid>' on macOS: prevents\nIDLE system sleep only, so the display can still sleep, closing the lid or\nan explicit sleep still sleeps the machine, and locking the screen keeps it\nrunning. Tied to the agent PID so macOS releases it automatically on exit\n(even crash/kill). CRC_ALLOW_SLEEP=1 opts out.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Keep the Mac awake while the agent runs (agent v1.0.14)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-16T01:28:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "20e3f763bb24cd7f5284d3995cbc5e07a65bec7d",
"body": "…croll)\n\nA downward terminal drag at the top triggered the browser's pull-to-refresh,\nreloading the page. Set overscroll-behavior:none + overflow:hidden on the\nroot, and touch-action:none on the tmux-mirror content area so the drag is\nhandled by our scroll-forwarding instead of the browser.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Disable mobile pull-to-refresh / overscroll (was reloading mid drag-s…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T23:53:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8146fb443bbd4cd1ad3e7655f5f5ec041b31dcd1",
"body": "… copy-mode\n\nThe mirror runs a full-screen app (Claude Code) on the alt-screen, so tmux\nhas zero scrollback and copy-mode had nothing to scroll (~15 lines of the\nlive screen). Claude manages its own conversation scroll and responds to\nmouse-wheel events. Now wheel/touch/buttons forward SGR wheel seq\n[…]\nem to Claude, which scrolls its own view\n— exactly like the desktop terminal. Web-only: rides the existing\nTERMINAL_INPUT path, no agent change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "tmux mirror scroll: forward mouse-wheel to the app (Claude), not tmux…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T23:45:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f45bb3e5234f7d580660d0030aa38982e0f4ecd6",
"body": "Buttons felt clunky and desktop wheel/PC-reattach didn't scroll at all.\nNow: mouse wheel and touch-drag both drive tmux scroll (line-based via\nsend-keys -N -X scroll-up/down, coalesced+throttled so a flick is one\ncommand, not a burst). Detection also requests SESSION_LIST so a mirror\nreattached on PC (no ?tmux= in the URL) is recognized by its 'tmux: '\nsession name. The ⬆/⬇ buttons stay as a fallback.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "tmux mirror: natural wheel + touch-drag scrolling (agent v1.0.13)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T23:29:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b18b7d607f4d57ad9dd9003e671f09eddf1f43a1",
"body": "…nd pane')\n\nThe =name exact-session prefix is only valid for session targets\n(kill-session); copy-mode/send-keys/display-message take a target-PANE\nwhere =name fails. Server-side scroll_position now accumulates correctly\n(11/22/33/... per halfpage-up). Also only enter copy-mode when not\nalready in it, so repeated scroll-up doesn't reset to the bottom.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "tmux scroll: use plain session name for pane targets (fixes 'can't fi…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T23:19:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3081ccb0225c3a362eb8dbd96ad0b0e9f6cf28f3",
"body": "tmux's alternate screen bypasses xterm's own scrollback, so there was no\nway to scroll a mirrored session's history on mobile. Add ⬆/⬇ scroll\nbuttons (shown for tmux mirrors) that drive tmux copy-mode from the agent\nCLI (copy-mode + send-keys -X halfpage-up/down) — deterministic and\ncross-platform, \n[…]\neel quirks.\nScrolling down to the bottom auto-exits copy-mode, and typing while\nscrolled up exits copy-mode first so keystrokes reach the shell.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "tmux mirror: scroll controls via copy-mode (agent v1.0.11)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T23:13:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a411b2aab8b12d0269bfa32eeb6f793ce559a871",
"body": "…0.10)\n\nRoot cause of 'randomly loaded a different chat': the conversation view\nresolved 'the newest transcript in the project', which is a DIFFERENT\nactive Claude's chat when another Claude runs in the same project.\n\nFix: Claude Code stamps its session_id into every OSC 777 notify event\n(session_st\n[…]\nand lsof both proved\nunreliable for a fresh Claude; --session-id is ignored by interactive\nlaunch. The OSC session_start is the reliable signal.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Reliable Claude session identity via OSC 777 session_start (agent v1.…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T04:08:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "427ea20c9155b7f6c89d168762cfec19b04ea4eb",
"body": "….0.8)\n\nRoot cause of 'messages never send': two agent processes were running as\nthe same agentId (a 9-day-old orphan shadowing a freshly-updated agent).\nThe server routes terminal I/O to whichever socket registered last, so a\nweb-opened terminal's input landed on the wrong process and reached no\nCl\n[…]\nWeb: 15s safety valve disarms the new-chat 'skip pre-existing session'\n guard if it never latches, so the view can't get stuck with no session.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Prevent duplicate agents + harden new-chat session latching (agent v1…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T03:36:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d3ace024be4ab363ed028627af61fb346a30dd81",
"body": "…hat on new launch\n\nTwo coupled bugs in the Claude conversation flow:\n\n1. Submit: handleComposeSend wrote 'text\\r' in one PTY burst. Claude Code\n 2.x's paste heuristic folds an Enter arriving in the same burst as the\n text into the input as a newline instead of submitting — so the prompt\n sat \n[…]\nhem, latching only\n onto the session this launch creates. Clock-skew safe (compares ids), with\n a 5s fallback if the baseline never arrives.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix compose-bar send to Claude: submit reliably + don't show an old c…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T03:11:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d861c10fa4e8a53d3253ab1f6bf2ed063a3e7db0",
"body": "npm strips the execute bit off node-pty's bundled spawn-helper on\ninstall, and node-pty never restores it, so pty.fork() fails with\n'posix_spawnp failed' and NO terminal (plain or tmux) can spawn. Our\nRaycast script chmod'd it, but a friend running crc-agent directly had\nnothing to. The agent now ch\n[…]\nd spawn-helper (and clears\nmacOS quarantine) at startup, before any PTY spawn. Verified by\nstripping the bit and confirming startup restores it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Self-heal node-pty spawn-helper execute bit on startup (agent v1.0.7)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T02:51:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f92bc49dc3eab2f05b31518c932dc3ffe098b25a",
"body": "…0.6)\n\nListing tmux sessions used the agent's inherited PATH (execFile 'tmux'),\nbut attaching went through 'zsh -l -c' whose login-only PATH misses tmux\nwhen a user sets PATH in ~/.zshrc rather than ~/.zprofile. Result: the\nsession listed with a Mirror button, but tapping it spawned a dead pane\n(bla\n[…]\no a 'cd … && exec claude' launch still finds claude).\nIf tmux truly isn't installed, the pane now prints an install hint\ninstead of going blank.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix tmux mirror on Macs with tmux off the login-shell PATH (agent v1.…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T02:31:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a715359af6ad71ba6405404af58f58e0e4324a62",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove stray test screenshot",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T02:07:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "572341a612bf92de6452b57bba38ae35be15d459",
"body": "…rollment\n\nbuildEnrollToken (and the dialog's displayed URL) concatenated\n'wss' + '//' + host — no colon — so agents enrolled through the web UI\nconnect-looped on a malformed serverUrl with only 'websocket error' to\ngo on. First real friend onboarding hit it immediately.\n\nAlso hardens crc-agent-setu\n[…]\ne historical 'wss//' shape) and validated before the config is\nwritten, so a bad token now fails loudly at setup instead of silently\nat connect.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix enroll token URL: 'wss//' missing colon broke every web-dialog en…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T02:06:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "992f01a1ebbe5628f66271d625a15f3bcf8a21ef",
"body": "…+ New' in the tmux list\n\ntmux -A always resumes the session with the same name, so a single\nhardcoded 'claude' session couldn't cover working on several projects\nat once. Each Claude project group now has a 'tmux' button that starts\n(or attaches) a session named after the project folder, running Claude\nin that folder; the inline tmux section gets a '+ New' prompt for\nad-hoc named sessions.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Per-project tmux sessions: 'tmux' button on Claude project groups + '…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-15T01:42:05Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7991a5cf73ffee3168db5bf33de09dae23b9184e",
"body": "tmux sessions outlive their Warp tab by design, so a stale one kept\nshowing as mirrorable with no way to end it from the phone. New\nTMUX_KILL round-trip: web (inline row + Warp overlay, with confirm)\n-> server relay (owner-guarded, same rpc tracking as TMUX_LIST) ->\nagent runs tmux kill-session -t =<name> (exact-match, no prefix\nsurprises). Result removes the row optimistically and re-fetches;\nfailures surface as a toast.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add tmux session Kill from the web UI (agent v1.0.4)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-06T01:20:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7206e7e0d76637315b1ab5330d97c8cd0ef62a65",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Sync package-lock for agent 1.0.3",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-06T01:09:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "11aadb8d192298bf6fcf2092a7f8bb39ea408a60",
"body": "The agent enriches TMUX_LIST results with each session's working directory\nand, when a Claude Code instance runs inside it, the live chat name (the\nauto-generated /rename-able title) and status from ~/.claude/sessions/\n<pid>.json. Claude PIDs are matched to tmux sessions by walking process\nancestry \n[…]\n\non tmux rows (inline list and Warp overlay), and tmux-mirror session cards\ninherit the same metadata by joining on their 'tmux: <name>' target.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Show cwd + live Claude chat name on tmux session rows (agent v1.0.3)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-06T01:08:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0b93146c7b8c2bb5f93464dbd081499fcc3cd2ee",
"body": "Tmux sessions on the agent machine now render directly on the\n/sessions/:agentId screen (tap to mirror), so the Warp overlay isn't\nneeded to find them. The list refreshes on mount and on window focus,\nsorted by last activity; the section hides when there are none. Tmux\nmirrors are also named 'tmux: <target>' at create time so they're\nidentifiable in the list instead of the generic 'Session N'.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Show tmux sessions inline in the session list",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-06T00:54:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5c7a49f10d8bc436b1919e447a6d0e90125b2bd6",
"body": "…ngth\n\nA word-wrapped row can end within a couple cells of the terminal width,\nwhich the old length>=cols-1 heuristic misread as a mid-token hard break,\ngluing the wrap boundary ('keeperwithout'). A hard break provably occupies\nthe row's last column; word wrap leaves it blank where the space collapsed.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Mirror: detect hard token breaks by last-column occupancy, not row le…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-06T00:29:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "67b26f9dc686a5971de537ec645a3ac24e1a31fa",
"body": "On phone-width terminals Claude Code 2.1.x truncates the status hint, so the\nfull string 'esc to interrupt' never renders (it shows '…cycle) · esc …').\nThat silently broke buffer-based working detection — and with it the input\nmirror's Claude gate and the buffer-driven finished notification. Working\n[…]\npinner\nverb, and a new detectClaudeChrome() recognizes idle Claude UI so the mirror\nworks right after attaching, before Claude has run anything.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Claude working/chrome detection on narrow panes (Claude Code 2.1.x)",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-06T00:22:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4f912c0138ace7bb8044e1be711c865145492384",
"body": "ESC-interrupt restores the interrupted message into Claude Code's own input\nline, and up/down cycle its history — but the compose bar knew nothing about\nit, so the restored text was invisible to the bar and sending new text would\nappend to it. Now the bar mirrors the \"❯ …\" composer line.\n\nDesign (se\n[…]\nen\ntokens like URLs without inserting spaces, cuts the caret row at the caret to\nexclude placeholder text, and handles the boxed composer style.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Mirror Claude's TUI input line into the compose bar after ESC/arrow keys",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-06T00:05:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "de01b23a8135f7aeb180109d6e36fdb16a49b256",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Sync package-lock for agent v1.0.2 bin/version bump",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T23:26:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3ca1ede490b7ae20bf9011ef0fac5a60d4c50250",
"body": "…agent v1.0.2)\n\nThe crc-agent bin pointed straight at index.js, which ignores argv — so the\ndocumented 'crc-agent setup --token …' (including the web UI Add-agent snippet)\nprinted the circular 'No agent configured. Run: crc-agent setup' instead of\nenrolling. crc-agent now goes through cli.ts, which routes 'setup' to the\nenrollment flow, handles --help, and otherwise starts the agent.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix 'crc-agent setup' subcommand: dispatch via new cli.ts bin entry (…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T23:25:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2fc2122ef467ed57cb32c7413c0cf9241cf14f0d",
"body": "A completion notification deep-links with the Stop hook's reported cwd, but Claude\nstores the transcript under the dir where the session STARTED. If the user cd's into\na subdir during the session, encode(cwd) points to a nonexistent project dir and the\nviewer showed 'No conversation found'. Since the deep-link carries the unique session\nid, fall back to locating <sessionId>.jsonl across all project dirs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix transcript deep-link when cwd drifts mid-session (agent v1.0.1)",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T22:35:49Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7ee3e32e3fecd4bdb5df853cc1293ef044434fb5",
"body": "Avoids implying official Anthropic affiliation for a public package; the agent is\na general remote pty/file/notification host (Claude Code is one integration).\nUpdates the web 'Add agent' install command and all docs to match.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Rename npm package: claude-remote-agent -> cli-remote-agent",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T12:06:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7ad211d1d4c453be2b0428d4c0a85aee977a6dad",
"body": "…oduction\n\nA weak TOKEN_SECRET lets anyone forge login tokens (including admin), so the\nproduction startup guard now validates secret strength (length >= 32, not a known\nplaceholder) instead of merely checking the vars are defined.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Security: reject weak/placeholder TOKEN_SECRET & ADMIN_PASSWORD in pr…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T11:19:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e27358baed243b28799d16e6fee2b69e3a260d6c",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Genericize personal path in code comment example",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T11:05:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ef3b1a41805c78f0f3c45c401b0c5aa5fab73185",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add root README (self-host, multi-user, trust model)",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T10:42:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1287428f695a7b042068f790834be0cd50539b57",
"body": "Web:\n- Username+password login (LoginPage + authStore); currentUser/isAdmin.\n- AgentsManager modal: enroll agents (POST /api/agents/enroll) with a\n one-time copyable \"npm i -g claude-remote-agent && crc-agent setup\n --token ...\" snippet; list/delete enrolled agents.\n- UsersManager (admin): create/\n[…]\nprereqs; root LICENSE (MIT).\n\nAll four packages build clean (server unchanged for the Dockerfile contract;\nagent builds via tsup).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Phase 3-4: web accounts/enrollment UI + publish-ready agent package",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T10:24:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a1da79c385222756e474a03e03c527a88ee80514",
"body": "…er-verify)\n\nServer is now strictly multi-user: each user sees/controls only their own\nagents.\n- Agents authenticate via agents-store -> ownerUserId (on socket.data);\n clients via resolveTokenUser -> userId, joined to a 'user:<id>' room.\n- assertOwnsAgent() guards ALL 18 client->agent handlers (ses\n[…]\nd mis-route);\n token revocation requires a matching tokenVersion.\n\nAdversarial opus review: all control paths correctly isolated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Phase 2: per-user isolation (assertOwnsAgent, per-user rooms, RPC own…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T10:12:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "816bdb17925ab5a025a84c88fed964238531d626",
"body": "- JSON persistence (store.ts) under DATA_DIR; scrypt hashing (hash.ts) —\n zero new dependencies.\n- users.ts: user records (scrypt password hash, role, tokenVersion for\n revocation), CRUD, login verify, resolveTokenUser (enforces tokenVersion\n + maps legacy sub-less admin tokens to the seeded admi\n[…]\nin seed, backward-compat login, legacy-agent adoption, friend\nenrollment, and per-user agent isolation all pass a functional test.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Phase 1: accounts + persistence + auth backend (multi-user foundation)",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T09:52:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "35bb58660c9f6362599c2fb67a16c0334e4a512f",
"body": "- Untrack .claude/settings.local.json and PLAN.md (leaked prod IPs, SSH\n targets, agent secrets, deploy webhook secret) — kept local, gitignored.\n- Sanitize .env.example to placeholders; document new optional env vars\n (ALLOWED_ORIGINS, TOKEN_TTL_DAYS) and add the VAPID_* lines.\n- Neutralize the p\n[…]\naked values are still in git history — they will be scrubbed\n(git filter-repo) and rotated in the final phase before going public.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Phase 0: remove committed secrets, sanitize example, harden ignores",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-05T09:45:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ec08d4fa758aa6d736db416737d8cbf082da8b1b",
"body": "The Stop hook read the transcript synchronously, before Claude finished\nwriting the final assistant message, so the notification showed the\nPREVIOUS response. Read the last assistant text ~600ms after the hook\n(matching the old bash sleep), so the latest reply is captured.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix stale notification response: read transcript after flush delay",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T17:49:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a42ca83190a45404c0508f7f0d5ad263374b050b",
"body": "… header\n\n- ConversationView now supports tapping file paths to download them (via\n onFileDownload), resolving relative paths against the project dir with\n resolveFilePath; download cards via FileNotifications.\n- SessionManager header was overflowing on phones: stack the title row and\n put the action buttons in a horizontally-scrollable row so nothing spills\n off-screen; truncate the agent name.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Transcript view: file downloads (rel + abs paths); fix mobile session…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T17:38:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ea30308d8bb8c1805800810f6229596493960851",
"body": "- Only the Stop hook notifies now (\"Claude finished\"); the redundant\n Notification \"waiting\"/permission alerts are removed (installer also\n cleans up previously-installed Notification/SubagentStop hooks).\n- The notification title carries the project folder, and the body carries\n Claude's last res\n[…]\n flex-column parent to get height; wrap it correctly. Also\n keep \"loading\" until data or a timeout, and handle empty transcripts.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "One completion alert with folder + result; fix empty transcript view",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T17:27:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e9162485c45fb9418b1f0b4f83dd256b035a9e42",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Log project/session on received Claude hooks (deep-link diagnostics)",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T17:06:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8cb3933193d94b80af9843c0f913cc67a15aef4e",
"body": "…ript\n\n- Suppress \"Claude needs permission\" notifications. Claude Code fires the\n Notification hook for permission even when it auto-resolves (allow rules\n / bypass), so they're noisy and not reliably actionable — keep only Stop\n (\"finished\") and the genuine idle \"waiting for input\".\n- Tapping a \n[…]\nion_id -> the push URL\n deep-links to /conversation/:agentId, which reads the JSONL via the\n agent and renders it with ChatView.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Notifications: drop auto-resolved permission alerts; tap opens transc…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T17:02:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "12e397f0b10fa39dc9b4ff0b02f543b59afad981",
"body": "Android renders the notification badge (status-bar icon) as a flat\nmonochrome silhouette, so the full-color icon showed as a white block.\nAdd a transparent white \">_\" badge (badge-96.png) and use it as the\n`badge` in the SW push handler and the foreground notification path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Use a monochrome notification badge for the status bar",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T16:54:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e8944af80a312428ddf9cd18850dc1eaa4ac040b",
"body": "The plugin-based install never actually fired: Claude Code only loads\nplugins from a registered marketplace, and our installer faked the\ninstalled_plugins.json entry without registering a 'crc' marketplace, so\nthe hooks were dead on every platform (this is why real completions never\nnotified).\n\n- In\n[…]\nard that only accepted {event} and silently dropped\n native {hook_event_name} payloads (returned 204 but never forwarded).\n\nVerified: native Stop/Notification POSTs are received and mapped correctly.",
"is_bot": false,
"headline": "Fix Claude notify hooks: use settings.json, accept native hook payload",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T16:49:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "532c44e2d86272dcc782303b76255e35511b3f02",
"body": "Windows was over-guarded. With Git for Windows installed, Claude Code\nruns command hooks via Git Bash, and the loopback control endpoint is\njust Node HTTP, so both work on Windows:\n- Install the Claude notify plugin on all platforms (hooks fire via Git\n Bash on Windows; jq/curl enrich + POST as usu\n[…]\nssues), and PtySession takes a\n{file,args} launch spec so it can spawn wsl.exe directly (or a login\nshell running tmux elsewhere).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Enable agent notifications + tmux mirror on Windows",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T16:02:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3825933771ffb4013519b45952b00a4b7d754c55",
"body": "Push notifications (works when the app is closed/locked):\n- Server: web-push/VAPID, persisted subscription store, sendPush, and\n /api/push (vapid key + subscribe/unsubscribe) routes.\n- Web: service worker push + notificationclick handlers (suppressed when a\n window is focused so it doesn't double \n[…]\n TmuxPanel lists sessions and mirrors one; \"Start shared Claude\"; the\n PC stays attached to the same session for full continuity.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add Web Push, Warp/Claude hook notifications, and shared tmux mirror",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-07-04T15:44:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4ef47106cb05d79ebf591346c3a2dafe3def501a",
"body": "Replaces the noisy/unreliable notification triggers with a coherent,\ncross-platform policy:\n\n- Completion is now detected from Claude Code's own \"esc to interrupt\"\n working line in the terminal (detectClaudeWorking) — fires \"Claude\n finished\" when it disappears (3s debounce). Works in raw AND chat\n[…]\nOnly buzz the OS / play sound / flash the title when the tab isn't\n visible+focused — always show a quiet in-app toast otherwise.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Redesign notifications: reliable completion, far less noise",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-06-30T21:23:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "232fb28e81e33b142ff75ef86d046ee2401a771e",
"body": "Structural redesigns:\n- RPC correlation: client now generates a requestId; the server routes\n one-shot results (files list/download, agent exec) only to the\n requesting client instead of broadcasting. Adds FILES_DOWNLOAD_ERROR;\n result payloads carry agentId. Fixes cross-client contamination.\n- R\n[…]\nHTML\nescaped exactly once; removed iOS-crashing regex lookbehind; PWA icons +\nmanifest; RPC result filtering by requestId/agentId.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix 48 audited bugs across server, agent, and web",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-06-30T20:48:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "91f49a69e079ff89f0c3e0674b35c09e65485680",
"body": "Multiple notification paths (OSC 777 hooks, JSONL idle detection, prompt\ndetection, bell) were racing against each other because the JSONL polling\nkept resetting claudeNotifiedRef when new messages arrived. Added a\ntime-based cooldown (lastNotifyTimeRef) — after any notification fires,\nall paths are blocked for 10 seconds regardless of source.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix duplicate notifications with 10-second global cooldown",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-22T00:25:54Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c07389d9e8b989da08f7d96212fc7c31f3d15c4f",
"body": "new Notification() is blocked by mobile browsers when the tab is in the\nbackground. ServiceWorkerRegistration.showNotification() works even when\nthe app is backgrounded. Adds a minimal service worker, PWA manifest, and\napple-mobile-web-app meta tags so notifications work on both Android and\niOS (when added to home screen).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add service worker for background notifications on mobile",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-22T00:09:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "992c5f5052bedfc19afc4219642887e250ddb139",
"body": "…_COMMAND\n\nThe DEBUG trap fires before every simple command including those inside\nPROMPT_COMMAND, which was resetting the timer before we could check it.\nNow we compute elapsed time in the trap itself (stored in __crc_elapsed)\nand only read it in PROMPT_COMMAND. Also adds __crc_armed guard to skip\nthe first prompt, and a version file to force init file regeneration.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix shell integration: compute elapsed time in DEBUG trap, not PROMPT…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-21T23:46:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e762acef5b2595b8bb5a58ec90eaf2e4b92e2b46",
"body": "Inject PROMPT_COMMAND (bash) and precmd/preexec hooks (zsh) via custom\nrcfiles so any command taking >= 3 seconds sends a BEL character through\nthe PTY. The web client bell detection catches it and fires a browser\nnotification. Reduces bell throttle from 5s to 2s for sequential commands.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add shell integration for command completion notifications",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-21T23:37:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a06952edbbaa963858654f20c56fa8afaaf3e69c",
"body": "…nd fallback detection\n\nInstall a Claude Code plugin on agent startup that hooks into Stop, Notification,\nPermissionRequest, UserPromptSubmit, and PostToolUse lifecycle events, emitting\nOSC 777 escape sequences through the PTY. The web client parses these in xterm.js\nfor instant, precise notificatio\n[…]\nssion exit. Bell toggle in the header controls all notification channels\n(browser notification, in-app toast, sound, title flash).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add browser notifications for task completion via Claude Code hooks a…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-21T23:28:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "616e0f0f191ceabe6aa6f8d5d125951698e303e2",
"body": "…e sessions remain intact",
"is_bot": false,
"headline": "Implement stale socket eviction for agent connections to ensure activ…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-11T01:44:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db02e9b1617084c3eeaf02c7f0110cf897fab86b",
"body": "… shell quoting issues",
"is_bot": false,
"headline": "Fix osascript timeout handling by passing separate arguments to avoid…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-11T01:35:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e45b40a3271b52dab64bf11cd6a8f689572a3035",
"body": null,
"is_bot": false,
"headline": "Add Tunnelblick support for macOS VPN configurations",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-11T01:31:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "192c2f028e0516aad6b73d6fa308c18ed7db5623",
"body": null,
"is_bot": false,
"headline": "Remove unnecessary \"peer\" property from package-lock.json entries",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-10T09:05:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c22a9fa70839ce1018fb2d624eeb2d5cd91887fc",
"body": "…o-bottom\n\nReplaces the JSONL-heuristic prompt banner (which fired on any \"?\" or word\nlike \"plan\" / \"proceed\") with live detection from the xterm buffer. The new\ndetector only fires when Claude Code's actual numbered-option menu is on\nscreen, reads the option labels from the TTY, and navigates via a\n[…]\nnfo-level summary of removed / kept\nfiles each cycle, so it's possible to verify from logs that cleanup is\nactually running.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\nEOF\n)",
"is_bot": false,
"headline": "Detect real Claude Code prompts, add file download links and scroll-t…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-10T09:04:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "61112dd538d0549ed3ff31e8e0dc70b7ab07cfa9",
"body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Disable VPN feature on Windows (requires admin to manage services)",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T20:41:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "343d8397dc257948b41b5f1d4917fb6470e77a97",
"body": "WireGuard tunnel services require admin privileges. The agent now uses\nStart-Process -Verb RunAs to run wireguard.exe commands elevated, which\ntriggers a UAC prompt on the local machine. Also sets service to Manual\nstartup to prevent auto-start on boot.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix WireGuard on Windows: use elevated PowerShell for connect/disconnect",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T20:18:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e8e98b772ea8279233c674b4d422a72de2b0d6ec",
"body": "- Disconnect: use wireguard.exe /uninstalltunnelservice instead of\n Stop-Service (which requires admin privileges)\n- Connect: set service to Manual startup after install to prevent\n auto-start on boot\n- Add verification after disconnect to confirm service is stopped\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix WireGuard disconnect on Windows and prevent auto-start",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T20:12:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "efede6170f0e2dc462853bb95ec912828bdea980",
"body": "The banner now detects multiple types of waiting states:\n- tool_use: permission prompts (Allow/Deny/Always buttons)\n- assistant questions: plan confirmations, yes/no questions, selections\n (Yes/No/Enter/Esc buttons)\n\nDetection uses last message type + content pattern matching.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Smarter input prompt banner: detect plans, questions, and confirmations",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T18:16:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "08c29ea04685c763aa480bb448ffb74670564503",
"body": "When Claude's last message is a tool_use (waiting for permission), show a\nyellow banner with Allow/Deny/Always buttons directly in the chat view.\nUsers no longer need to switch to TTY mode to approve tool use.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add permission prompt banner in compose mode",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T18:08:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "dd4de056a7489e242f618cc5cd781687f8dcc2d6",
"body": "Previous approaches (bracketed paste, chunked writes) still failed.\nSend each line individually with delays, using raw newline between lines\nand carriage return to submit. No escape sequences.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Try line-by-line sending without bracketed paste for multi-line messages",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T14:06:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4a62756a7bb306af35f322238e70ba304be8bf16",
"body": "… breaks\n\nTwo issues prevented large (10-15 line) messages from reaching Claude:\n1. Writing entire message to PTY at once overflows macOS PTY buffer (~1024 bytes)\n2. Using \\n for line breaks in paste - terminals use \\r, not \\n, in raw mode\n\nFix: chunk writes into 256-byte pieces with 10ms delays, and convert \\n to \\r\ninside bracketed paste sequences. Submit \\r sent separately after paste ends.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix multi-line messages not reaching Claude: chunked writes + \\r line…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T14:00:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "207c8b2bee1bd411ea4c957dd5b4afd364e33d76",
"body": "The pendingSent clearing logic only matched on user messages in the JSONL.\nIf a message got garbled (e.g. multi-line without bracketed paste), the\nuser message never appeared in the JSONL and \"sending...\" stayed forever.\n\nTwo fixes:\n- Clear all pending when assistant messages arrive (Claude responding\n means it received the input)\n- 30-second timeout fallback to clear stale pending messages\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix pendingSent stuck forever: clear on assistant response + 30s timeout",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T13:42:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "de7146a642aaf841f82434169bac25b48312b138",
"body": "Multi-line compose messages had their newlines interpreted as individual\nEnter presses by the terminal, so only the first line was submitted to\nClaude CLI. Wrapping in bracketed paste escape sequences (ESC[200~/201~)\nensures the terminal treats the entire block as a single pasted input.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix multi-line messages stuck in sending: wrap in bracketed paste",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-09T13:31:49Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "77be728c0670ed9754c82a627015e8d3d12e8bdb",
"body": "…N.stringify\n\nJSON.stringify doubles backslashes in paths (D:\\Projects → D:\\\\Projects in cmd param).\nThe extracted path needs unescaping before sending to agent for JSONL lookup.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Windows conversation lookup: unescape double backslashes from JSO…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-08T20:33:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "889abe8207bff3891014ef2daa373d626419a01d",
"body": null,
"is_bot": false,
"headline": "Trigger redeploy",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-08T20:19:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e9d6f4464850df3159bd831c1dbceb964bc8e7c",
"body": "- Replace && with ; in Claude session commands (PowerShell doesn't support &&)\n- Fix MobileKeyboard hidden behind iOS virtual keyboard (100vh → 100dvh)\n- Switch extra key buttons from onPointerDown to onClick for reliable mobile taps\n- Fix projectName to handle Windows backslash paths\n- Update cmd regex to match ; separator\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Windows PowerShell compat and mobile extra keys",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-08T20:10:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "77148fa75348f5d3d692c5f85bdf934bcb1f5432",
"body": "…s with registry commands for startup management",
"is_bot": false,
"headline": "Refactor service installation and uninstallation: replace node-window…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-07T16:22:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "71ce571f408a8ff322feb273ad7216be8fbb771d",
"body": "…nctions",
"is_bot": false,
"headline": "Refactor project path handling: add encoding and directory finding fu…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-07T15:50:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec598f87199032368220b4b9bc8601f0e192b7bd",
"body": null,
"is_bot": false,
"headline": "Add service installation and uninstallation scripts for CRC Agent",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-07T15:43:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d65d42c185b065e98304361a3e170b7ed0951deb",
"body": "…ession\n\nWhen resuming via --resume <id>, the Claude session ID is extracted from\nthe command and passed to CLAUDE_CONV_READ so it reads that specific\nJSONL file instead of the latest one in the project directory.\n\nFor new sessions (no --resume), the session ID is discovered from the\nfirst CLAUDE_CO\n[…]\nnd Claude session ID are persisted in localStorage\nkeyed by terminal session ID, so reattaching restores the correct\nconversation.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix chat view mixing sessions: track Claude session ID per terminal s…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-07T01:23:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2ffb73d546280fa6e32a89585428bb61e0593475",
"body": "When a Claude session starts via ?cmd=, the project path is saved to\nlocalStorage keyed by terminal sessionId. When reattaching to the same\nsession later (no ?cmd= param), the path is restored from localStorage,\nso the chat view activates automatically.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Persist Claude project path per session in localStorage",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T22:19:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a8da753026b33d8833ae3885dbc40845566f6403",
"body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix inline markdown (backtick code, bold) inside table cells",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T22:10:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "306f35eb9a0cf4c19c9dc6b98e0f403283c2a60c",
"body": "Detects pipe-delimited table rows, accumulates them, renders as proper\nHTML tables with:\n- Header row with bg-surface-overlay background\n- Body cells with border-bottom dividers\n- Horizontal scrolling for wide tables\n- 'MATCH' values highlighted in green\n- Whitespace-nowrap to prevent cell wrapping\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add markdown table rendering in ChatView",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T22:01:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "33a8ce84b6fb2c4c4fe7b20ba62ad18392575318",
"body": "New system reads Claude Code's structured JSONL session files and renders\nthem as a proper chat interface:\n\nAgent: claude-conversation.ts reads JSONL files, extracts user messages,\nassistant text, tool_use (name + input summary), tool_result (truncated).\nSupports incremental reading via afterLine of\n[…]\nde.\nSent commands appear as pending bubbles until JSONL confirms them.\nFalls back to terminal view when no conversation is active.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add live chat view from Claude JSONL conversations",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T21:47:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "279debe54acbb184540a2768e621b9e2646f4686",
"body": "The chat bubble approach fundamentally breaks for Claude Code's TUI output —\ncursor positioning, in-place updates, line clearing, and box-drawing chars\ncan't survive ANSI stripping. Characters split across lines, spaces eaten,\ntables destroyed.\n\nNew approach: terminal always visible for output (xter\n[…]\ns (vim, interactive programs)\n- Terminal refits when switching between modes\n- ChatView.tsx kept but unused (can be deleted later)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Revert chat view: use xterm.js for output, compose bar for input",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T21:36:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ba56503207bfd2a5eaf4278de149a0da08b5a966",
"body": "…ude Code parsing\n\nMajor fixes:\n- Streaming output now APPENDS to the last received message instead of\n creating a new bubble per chunk. Only creates a new received message\n after a user sends something. This eliminates the flood of tiny messages.\n- Comprehensive ANSI stripping: OSC sequences, CSI\n[…]\nd history\n- Received bubbles now full-width for better readability\n- Throttled re-renders (150ms) for smooth streaming performance\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix chat view: streaming updates last message, better ANSI strip, Cla…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T21:20:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "51c986f649f6eadebe4803baf36275e22565cec9",
"body": "… compose mode\n\nNew ChatView component replaces the terminal screen in compose mode:\n- Sent commands displayed as right-aligned accent bubbles (like iMessage)\n- Terminal output displayed as left-aligned bubbles with ANSI stripped\n- Error detection: lines with error/fatal/exception get red-tinted bub\n[…]\nmounted but invisible in compose mode (preserves PTY state)\n- TTY mode shows raw xterm.js as before\n- Empty state with prompt icon\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add chat view: message bubbles with markdown, replace raw terminal in…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T20:56:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "aa22dc065c490caeb9d8b4dda919bf2c18914b59",
"body": "- Send \\r (carriage return) instead of \\n (line feed) — PTY expects CR\n for Enter key. This was causing text to add a newline instead of executing.\n- Touch-blocking overlay over terminal in compose mode — tapping the\n terminal output area focuses the compose input instead of triggering\n the soft \n[…]\nith send arrow button,\n auto-focus, subtle hint text below for raw send and shift+enter.\n- Fixed initial auto-cmd to also use \\r.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix compose input: use \\r for Enter, block terminal touch, chat-style UI",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T20:26:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a8af1b9fba5d05395aed7089acba36ce8a2ce4f0",
"body": "- Default mode: xterm.js renders output only (disableStdin), no soft keyboard\n pops up when tapping terminal. All input goes through the compose textarea.\n- Compose textarea: type/paste text, Enter sends with newline, Shift+Enter\n for multi-line, Raw button sends without newline. Auto-grows for mu\n[…]\neyboard bar always visible for Ctrl+C/Z, arrows, ESC, TAB\n- Blurs terminal textarea when exiting raw mode to dismiss soft keyboard\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Hybrid terminal: compose-first input with optional raw TTY mode",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T20:03:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2e7478064625931dea30f254c7cb986cd31add7d",
"body": "Text input bar between download notifications and mobile keyboard.\nType or paste text locally, then:\n- 'Send' button or Enter key sends text + newline (like typing a command)\n- 'Raw' button sends text without newline (for pasting into editors, etc.)\nInput stays focused after send for rapid follow-up.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add compose input bar for typing/pasting text before sending",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T19:00:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c72a950327fcc17b76c5db7b672d86135165a948",
"body": "- Custom Tailwind color system: surface (warm grays), accent (terracotta\n #d4714e), claude (purple #9b7ddb), warm text hierarchy\n- Inter font via Google Fonts\n- Rounded-2xl cards, backdrop-blur modals, subtle borders\n- xterm theme updated: warm background, terracotta cursor, purple magenta\n- Custom\n[…]\nards\n- Consistent badge design: tiny uppercase tracking-wider\n- All 14 components themed consistently\n- Renamed to 'Claude Remote'\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Redesign UI with Claude-centric warm dark theme",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T15:40:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "692edbcb631947664fee58d0d03f908dcfa6e8b3",
"body": "When user taps 'Claude' in file explorer for a directory without .claude/,\nshows a permission mode picker (Bypass/Default/Plan). Creates\n.claude/settings.json with chosen mode + effortLevel: 'high' via\nAGENT_EXEC, then starts Claude.\n\nDirectories that already have .claude/ skip straight to launching Claude.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Auto-create .claude/settings.json when starting Claude in new project",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T15:31:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8c546aa7ef05fd1f51e88a1a9f0dcdfc89d44ea5",
"body": "- New 'Browse' button on SessionManager opens file explorer as full overlay\n- File explorer gains 'Claude' button to start fresh session in any directory\n- File explorer detects .git directories and shows 'Pull' button for git repos\n- New AGENT_EXEC protocol event for one-shot commands (git pull run\n[…]\nows inline feedback (output/error) with auto-dismiss\n- File explorer onStartClaude callback navigates to terminal with ?cmd= param\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add standalone file browser with 'Start Claude' and 'Git Pull' buttons",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T15:13:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "50f01e74098dd084df7e26c9e6e71aa315e85aa6",
"body": "- New ClaudeSessions panel accessible via purple 'Claude' button on SessionManager\n- Scans ~/.claude/projects/ for session JSONL files, extracts metadata\n (first message, timestamp, model, message count, git branch)\n- Sessions grouped by project with search/filter\n- 'Resume' button opens terminal a\n[…]\nto-write initial command via ?cmd= URL param on TerminalView\n- Uses cwd from session metadata for accurate project path resolution\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add Claude Sessions browser: view and resume past conversations",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T14:59:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fec53705f91e2eb1a65f2ebaeed494a09f6ae065",
"body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove temporary debug logging for terminal control chars",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T01:27:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a363d2b87b674f2a9c5ac145a4aee59a09a5004e",
"body": "The Vite/esbuild minifier constant-folds String.fromCharCode(3) into the\nliteral \"\\x03\", then strips it to \"\" during minification. C0 control\ncharacters below 0x1B are silently removed from string literals.\n\nFix: store charCode as a number in the key definition and call\nString.fromCharCode(k.charCode) at click time via runtime property\naccess, which the minifier cannot fold away.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Ctrl+C and Ctrl+Z buttons: minifier was stripping control chars",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T01:23:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8061a5a573f0d77733a2ba80d97c35c35901c9cf",
"body": "Logs hex of control chars on both server (TERMINAL_INPUT relay) and agent\n(writeToSession) to diagnose why Ctrl+C/Z from mobile keyboard are not\nreaching the PTY.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add temporary debug logging for terminal control characters",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T01:16:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ab5ee135fc20d245fdbf3240e8dd5c9e2d88328d",
"body": "- Add left padding (pl-2) to terminal container so first character isn't clipped\n- Lift Ctrl/Alt toggle state from MobileKeyboard to TerminalView so modifiers\n apply to soft keyboard input via xterm.js onData (previously only worked for\n keys sent through MobileKeyboard's sendKey\n- Rewrite macOS V\n[…]\neName field to VpnProfileConfig for macOS network service names\n- Azure VPN now works on macOS via scutil + cached AAD token\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\nEOF\n)",
"is_bot": false,
"headline": "Fix terminal padding, Ctrl/Alt modifiers, and macOS VPN scutil support",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T00:45:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9bd7deff9a232be95051515235c0c1a1bbc1b3a8",
"body": "…dd serviceName for VPN profiles, and implement scutil commands for connection management",
"is_bot": false,
"headline": "Update PLAN.md and VPN manager for macOS support: complete Phase 5, a…",
"author_name": "Muhammad Arose",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-06T00:08:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19a8f83419d38f8129aecf0f57b37d206b95d781",
"body": "… cmdlets\n\n- OpenVPN: auto-install ovpnconnector service, kill GUI app before\n connecting (conflicts with headless connector)\n- WireGuard: use Start-Service/Stop-Service instead of net start/stop\n (avoids $ escaping issues across shells)\n- Both tested and confirmed working headlessly on Windows\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix VPN manager: auto-install ovpnconnector, kill GUI, use PowerShell…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-05T13:39:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d2db60ac7bf1f3e4fa37d91d1db07537fa8ccb44",
"body": "Azure P2S with AAD auth requires interactive sign-in — can't be\nfully headless. Now imports XML config via azurevpn -i, then opens\nthe Azure VPN app. OpenVPN and WireGuard remain fully headless.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Handle Azure VPN XML config: import + open app for AAD auth",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-05T13:22:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c3b3f03d749cdae3fb268fbc1278c3e2f04977d9",
"body": "All VPN types now work fully headlessly without GUI interaction:\n- WireGuard: .conf files in ~/.crc-agent/vpn/, uses wireguard.exe\n /installtunnelservice + net start/stop\n- OpenVPN: .ovpn files via ovpnconnector.exe set-config + start/stop\n- Azure VPN: export P2S config as .ovpn from Azure Portal, \n[…]\nn)\n\nConfig simplified: each profile just needs id, name, type, and\nconfigFile (path to .conf/.ovpn relative to ~/.crc-agent/vpn/).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Rewrite VPN manager to use config files for headless control",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-05T00:33:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fc0351774102ccd1c95ab3cc9f8375c9057e00b5",
"body": "Azure VPN Client doesn't support ms-azurevpn: URI or headless CLI\nconnect — it requires GUI for Azure AD authentication. Now opens\nthe app directly so user can tap Connect/Disconnect. Info messages\nshown in blue instead of red in VPN panel.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Azure VPN: open app instead of unsupported URI scheme",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-05T00:28:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9697eec3d7f2b5ecda9e6fbb46f04973de022530",
"body": "…r status\n\n- Azure VPN: uses ms-azurevpn:connect/disconnect URI scheme (works\n with UWP app, rasdial doesn't)\n- All commands use powershell.exe as shell on Windows for proper\n cmdlet support (Get-Service, Start-Process, etc.)\n- WireGuard: falls back to wireguard.exe /installtunnelservice if\n net \n[…]\nprofiles for status\n- Azure status: checks Get-NetAdapter for active VPN adapters\n- Updated config with aadds-vnet connection name\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix VPN manager: Azure uses ms-azurevpn: URI, PowerShell shell, bette…",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-05T00:17:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0974c234a46f6ec364f30c95c9a0390c7c5c0727",
"body": "- VPN panel accessible from session manager via \"VPN\" button\n- Agent vpn-manager.ts: platform-specific connect/disconnect/status\n for WireGuard (net start/wg-quick), OpenVPN (--connect-shortcut),\n and Azure VPN (rasdial)\n- Agent config supports vpn.profiles[] with per-type settings\n- Server relays\n[…]\nfiles with live status, connect/disconnect\n buttons, error display, loading states\n- Shared types: VpnType, VpnStatus, VpnProfile\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add VPN remote control (Phase 5)",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-04T23:56:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7a3a819c3dd5f91da3bc46babaaa4349732c202b",
"body": "FileExplorer now syncs to initialPath when heartbeat arrives with\nthe real homeDir, unless user has already manually navigated.\nPrevents random fallback to os.homedir().\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix file explorer homeDir race condition",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-04T23:50:27Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "24480db416c540d371bdfa9d3910cc398a33a5b8",
"body": "At 14px on a phone screen, only ~48 columns fit, causing PowerShell\nls output to drop file names. 11px gives ~70-80 cols on most phones.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Reduce terminal font to 11px on mobile for ~80 column width",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-04T23:47:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c829dd5b93a747bbaa5412204fef333ffc27353f",
"body": "- File explorer is now a full-screen overlay on mobile, side panel\n on desktop (md+). Terminal always gets full width for proper cols.\n- Toolbar compressed to single line with smaller buttons (text-xs)\n- Renamed buttons: Upload→Up, folder emoji→Files\n- Fixed homeDir race: falls back to rootPaths[0] if heartbeat pending\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix mobile layout: full-screen file explorer, compact toolbar",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-04T23:44:25Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c047ac04a798aa94b87b7e20571d9c92825d3da3",
"body": "Clipboard icon next to each folder copies full path for cd.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add copy-path button for folders in file explorer",
"author_name": "Arose Niazi",
"author_login": "Arose-Niazi",
"committed_at": "2026-04-04T23:35:22Z",
"body_truncated": false,
"is_coding_agent": true
}
],
"releases_count": 0,
"commits_last_year": 107,
"latest_release_at": null,
"latest_release_tag": null,
"releases_from_tags": false,
"days_since_last_push": 5,
"active_weeks_last_year": 7,
"days_since_latest_release": null,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": false,
"has_contributing": false,
"health_percentage": 28,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "cli-remote-agent",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/cli-remote-agent",
"is_deprecated": false,
"latest_version": "1.0.16",
"repository_url": "https://github.com/Arose-Niazi/claude-remote-controller",
"versions_count": 16,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 2567,
"first_published_at": "2026-07-05T12:06:31.124000Z",
"latest_published_at": "2026-07-18T14:21:21.682000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"packages/agent/tsconfig.json",
"packages/server/tsconfig.json",
"packages/shared/tsconfig.json",
"packages/web/tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 46821,
"source_files_sampled": 81,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"package.json"
],
"advisories": {
"error": null,
"scope": "published_package",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 39,
"malicious_count": 0,
"assessed_package": "npm:cli-remote-agent@1.0.16",
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "node-pty",
"manifest": "packages/agent/package.json",
"ecosystem": "npm",
"version_constraint": "^1.1.0"
},
{
"name": "pino",
"manifest": "packages/agent/package.json",
"ecosystem": "npm",
"version_constraint": "^9.6.0"
},
{
"name": "pino-pretty",
"manifest": "packages/agent/package.json",
"ecosystem": "npm",
"version_constraint": "^13.0.0"
},
{
"name": "socket.io-client",
"manifest": "packages/agent/package.json",
"ecosystem": "npm",
"version_constraint": "^4.8.0"
},
{
"name": "@crc/shared",
"manifest": "packages/server/package.json",
"ecosystem": "npm",
"version_constraint": "*"
},
{
"name": "express",
"manifest": "packages/server/package.json",
"ecosystem": "npm",
"version_constraint": "^4.21.0"
},
{
"name": "socket.io",
"manifest": "packages/server/package.json",
"ecosystem": "npm",
"version_constraint": "^4.8.0"
},
{
"name": "pino",
"manifest": "packages/server/package.json",
"ecosystem": "npm",
"version_constraint": "^9.6.0"
},
{
"name": "pino-pretty",
"manifest": "packages/server/package.json",
"ecosystem": "npm",
"version_constraint": "^13.0.0"
},
{
"name": "uuid",
"manifest": "packages/server/package.json",
"ecosystem": "npm",
"version_constraint": "^11.1.0"
},
{
"name": "web-push",
"manifest": "packages/server/package.json",
"ecosystem": "npm",
"version_constraint": "^3.6.7"
},
{
"name": "@crc/shared",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "*"
},
{
"name": "@xterm/xterm",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "^5.5.0"
},
{
"name": "@xterm/addon-fit",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "^0.10.0"
},
{
"name": "@xterm/addon-webgl",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "^0.18.0"
},
{
"name": "react",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "^18.3.0"
},
{
"name": "react-dom",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "^18.3.0"
},
{
"name": "react-router-dom",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "^7.1.0"
},
{
"name": "socket.io-client",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "^4.8.0"
},
{
"name": "zustand",
"manifest": "packages/web/package.json",
"ecosystem": "npm",
"version_constraint": "^5.0.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "Arose-Niazi",
"commits": 107,
"avatar_url": "https://avatars.githubusercontent.com/u/11246188?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": false,
"has_tests": false,
"ci_workflows": [],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"package-lock.json"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 4 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 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": 5,
"reason": "dependency not pinned by hash detected -- score normalized to 5",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "21 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "65f6ac234c48947d25ca0c15f41466d0056caf55",
"ran_at": "2026-07-23T21:57:02Z",
"aggregate_score": 3.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-18T14:21:19Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/Arose-Niazi/claude-remote-controller",
"host": "github.com",
"name": "claude-remote-controller",
"owner": "Arose-Niazi"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 35,
"inputs": {
"security": 45,
"vitality": 42,
"community": 32,
"governance": 41,
"engineering": 13
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 42,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 69,
"inputs": {
"commits_last_year": 107,
"human_commit_share": 1,
"days_since_last_push": 5,
"active_weeks_last_year": 7
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "7/52 weeks with commits",
"points": 4.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 7
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "107 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 107
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "critical",
"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": 1,
"inputs": {
"releases_count": 0
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "no releases published",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases_published",
"params": {}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"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": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 32,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (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": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 57,
"inputs": {
"packages": [
"cli-remote-agent"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 2567
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,567 downloads/month across npm",
"points": 45.5,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2567,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 41,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"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 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 4 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 59,
"inputs": {
"followers": 54,
"owner_type": "User",
"is_verified": null,
"owner_login": "Arose-Niazi",
"public_repos": 81,
"account_age_days": 4163
},
"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": "54 followers of Arose-Niazi",
"points": 12.5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 54,
"login": "Arose-Niazi"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "81 public repos, account ~11 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 81
}
},
{
"code": "account_age_years",
"params": {
"years": 11
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"cli-remote-agent"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 5 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 5
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "16 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 16
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "critical",
"name": "Engineering Quality",
"value": 13,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "critical",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"has_ci": false,
"has_tests": false,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "at_risk",
"name": "Documentation",
"note": null,
"notes": [],
"value": 30,
"inputs": {
"topics": [],
"has_wiki": false,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": false
},
"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": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 45,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"dangerous_workflow",
"packaging",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 31,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 13,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 5,
"scorecard_aggregate": 3.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": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 4 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 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 5",
"points": 2.5,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "21 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:cli-remote-agent@1.0.16 runtime dependency closure — what installing the published package pulls in — 39 packages. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_published",
"params": {
"package": "npm:cli-remote-agent@1.0.16",
"assessed": 39
}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 39,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "no indirect dependency carries a known advisory",
"points": 25,
"status": "met",
"details": [
{
"code": "no_indirect_advisories",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 39,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 3
},
"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": "at_risk",
"name": "AI Readiness",
"value": 49,
"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.83,
"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": "83 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 83,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 36,
"inputs": {
"has_nix": false,
"has_tests": false,
"lockfiles": [
"package-lock.json"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [
"packages/agent/tsconfig.json",
"packages/server/tsconfig.json",
"packages/shared/tsconfig.json",
"packages/web/tsconfig.json"
],
"agent_commit_share": 0.9,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "packages/agent/tsconfig.json, packages/server/tsconfig.json, packages/shared/tsconfig.json, packages/web/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "packages/agent/tsconfig.json, packages/server/tsconfig.json, packages/shared/tsconfig.json, packages/web/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "90 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 90,
"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 5",
"points": 5,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 46821,
"source_files_sampled": 81,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/81 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 81,
"oversized": 0
}
}
],
"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": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-23T21:57:06.780969Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/Arose-Niazi/claude-remote-controller.svg",
"full_name": "Arose-Niazi/claude-remote-controller",
"license_state": "standard",
"license_spdx": "MIT"
}