feat(desktop): add cross-platform Electron shell#985
Conversation
|
@prajapatisparsh is attempting to deploy a commit to the NexusCore Team on Vercel. A member of the Team first needs to authorize it. |
There was a problem hiding this comment.
Pull request overview
Adds a new gitnexus-desktop/ Electron application to bundle the GitNexus backend + web UI into a single cross-platform desktop install, along with packaging automation and supporting docs/config.
Changes:
- Introduces an Electron main process that spawns/monitors the GitNexus backend and embeds the GitNexus web UI in a
BrowserView. - Adds packaging scripts/config (electron-vite + electron-builder) to produce platform installers and output artifacts under
gitnexus-desktop/release/. - Adds a GitHub Actions workflow to build and upload desktop artifacts for PRs touching
gitnexus-desktop/**.
Reviewed changes
Copilot reviewed 19 out of 23 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| gitnexus-desktop/tsconfig.renderer.json | Renderer TS config (Vite/bundler-oriented settings). |
| gitnexus-desktop/tsconfig.node.json | Node/Electron TS config for main/preload. |
| gitnexus-desktop/tsconfig.json | Project references wiring for node + renderer configs. |
| gitnexus-desktop/src/renderer/src/styles.css | Renderer styling asset (currently appears unused). |
| gitnexus-desktop/src/renderer/src/main.tsx | Renderer entrypoint that builds the custom shell DOM and applies window state. |
| gitnexus-desktop/src/renderer/src/App.tsx | React-based shell UI (currently appears unused). |
| gitnexus-desktop/src/renderer/index.html | Renderer HTML entry. |
| gitnexus-desktop/src/main/preload.ts | Preload bridge exposing gitnexusDesktop API to renderer. |
| gitnexus-desktop/src/main/main.ts | Electron main process: starts/stops servers, creates windows/views, IPC handlers. |
| gitnexus-desktop/src/126312502.png | Added PNG asset (currently appears unreferenced / unclear purpose). |
| gitnexus-desktop/scripts/package.mjs | Packaging orchestration (bundle + build + electron-builder invocation). |
| gitnexus-desktop/scripts/ensure-gitnexus-runtime.mjs | Ensures dependent workspaces are installed/built; dev port cleanup. |
| gitnexus-desktop/package.json | Desktop package manifest + scripts + toolchain deps. |
| gitnexus-desktop/electron.vite.config.ts | electron-vite build/dev configuration for main/preload/renderer. |
| gitnexus-desktop/electron-builder.yml | electron-builder config (alongside generated config approach). |
| gitnexus-desktop/README.md | Desktop package usage/build documentation. |
| gitnexus-desktop/.gitignore | Ignores desktop build outputs (dist/, release/). |
| CLAUDE.md | Updates GitNexus rules section (currently has markdown formatting issues). |
| AGENTS.md | Updates/normalizes embedded GitNexus MCP guidance and references. |
| .gitignore | Adds new repo-wide ignores (undefined/, _bmad/). |
| .github/workflows/desktop-packaging.yml | New workflow to build/upload desktop artifacts on PRs. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
CI Report❌ Some checks failed Pipeline Status
Test Results
✅ All 10928 tests passed 13 test(s) skipped — expand for details
Code CoverageTests
📋 View full run · Generated by CI |
|
Claude finished @magyargergo's task in 3m 23s —— View job PR #985 Review — feat(desktop): add cross-platform Electron shellTasks:
Production-ready bar for this PRThis PR adds an isolated new package (
Findings1. Correctness & functional completeness[BLOCKING] Wrong renderer file path in packaged and preview mode
[BLOCKING]
|
| Check | Result |
|---|---|
| No secrets or tokens | ✅ None found |
| No machine-specific paths | ✅ All paths via process.resourcesPath, __dirname, path.resolve |
| No blind renames in existing packages | ✅ No renames in gitnexus/, gitnexus-web/, gitnexus-shared/ |
| License preserved | ✅ gitnexus-desktop/package.json:7 — PolyForm-Noncommercial-1.0.0 |
| PR title conventional commit format | ✅ feat(desktop): add cross-platform Electron shell |
| No drive-by refactors in existing packages | ✅ Only AGENTS.md, CLAUDE.md, .gitignore touched outside new package |
What I could not fully verify
- Whether the CI typecheck failure is pre-existing or introduced by this PR. The PR claims no changes to
gitnexus/orgitnexus-web/, but the CI typecheck failure ontsc --noEmitneeds to be confirmed againstorigin/mainindependently. - Whether the
npm run build:dirstep in CI actually produces a working ASAR bundle. Thescripts/package.mjsinvokes electron-builder but the workflow has never run successfully due to the permissions bug, so end-to-end packaging has not been validated in CI. - Whether native module rebuild (tree-sitter, LadybugDB) works correctly in packaged mode. The
scripts/package.mjshandles this, but it cannot be verified without running the full packaging flow. - Whether the
App.tsxcomponent was intentionally left as work-in-progress or is truly dead code — it's not imported but contains a substantial amount of shell UI logic.
Final verdict
Blocking items in priority order:
permissions: {}indesktop-packaging.yml:10— The workflow has never successfully run. Fix tocontents: readbefore any CI validation is possible.- Wrong renderer path
main.ts:614—../renderer/src/renderer/index.htmldoes not exist in the build output. The shell titlebar will fail to load in all non-dev modes. - Unguarded
decodeURIComponentinmain.ts:433— Single malformed request crashes the packaged web server permanently. - CI Typecheck failure — Confirm whether pre-existing (document it) or introduced (fix it). CONTRIBUTING.md requires typecheck to pass before opening a PR.
|
@prajapatisparsh can you please look into these findings? |
|
@magyargergo Sure ill resolve them after my day job . Thanks 😊 |
|
It would be also amazing if we could make it available some installers available such as |
|
I would be more than happy to be part of this |
I'm happy to hear that, if you want join to our discord server and you can find other intersting topics ot contributre to, and of course we welcome innovative ideas too and we put it up on the list. :) |
|
Thats Great just joined the discord , sent u friend request |
|
@magyargergo Let me knwo if there are more changes needed if not ill start work on making it availble on other installers in another PR |
|
Claude finished @magyargergo's task in 3m 8s —— View job PR #985 Review — feat(desktop): add cross-platform Electron shellTasks:
Production-ready bar for this PRThis PR adds an isolated new package (
FindingsNote on branch state: The current HEAD ( 1. Correctness & functional completeness[BLOCKING] Wrong renderer path in preview and packaged mode
[BLOCKING] Unguarded
|
| Check | Result |
|---|---|
| No secrets or tokens | ✅ None found |
| No machine-specific paths | ✅ All paths via process.resourcesPath, __dirname, path.resolve |
| No blind renames in existing packages | ✅ No renames in gitnexus/, gitnexus-web/, gitnexus-shared/ |
| License preserved | ✅ gitnexus-desktop/package.json:7 — PolyForm-Noncommercial-1.0.0 |
| PR title conventional commit format | ✅ feat(desktop): add cross-platform Electron shell |
| No drive-by refactors in existing packages | ✅ Only AGENTS.md, CLAUDE.md, .gitignore, gitnexus-web/src/index.css touched |
What I could not fully verify
- CI typecheck failure origin — cannot confirm pre-existing vs. introduced without running
tsc --noEmitonorigin/mainindependently. - End-to-end packaging correctness — the workflow has never successfully run due to the
permissions: {}bug, so the full build → ASAR → artifact pipeline has not been validated in CI. - Native module rebuild correctness —
scripts/package.mjshandles tree-sitter and LadybugDB native rebuild, but this cannot be verified without running the full packaging flow.
Final verdict
Blocking items in priority order:
permissions: {}indesktop-packaging.yml:10— The workflow has never successfully run. Fix tocontents: readbefore any CI validation is possible.- Wrong renderer path
main.ts:583—../renderer/src/renderer/index.htmldoes not exist in the build output. The shell renderer fails to load in all non-dev modes. - Unguarded
decodeURIComponentinmain.ts:414— A single malformed request crashes the packaged web server permanently.
|
We also need some regression testing. Please @prajapatisparsh look into these findings 🙏 |
|
Claude finished @magyargergo's task in 5m 49s —— View job PR #985 Review — feat(desktop): add cross-platform Electron shellTasks:
Production-ready bar for this PRThis PR adds an isolated
Resolved since previous reviewsThe three blocking items raised in both prior automated reviews have been addressed in the current HEAD:
The The
Findings1. Correctness & functional completeness[BLOCKING] Native module ABI mismatch — packaged builds will likely crash on first API call
[BLOCKING] Smoke test is vacuously successful — cannot distinguish startup success from failure
2. Architecture & boundary integrityNo violations. 3. Code clarity, clean code & maintainability[NON-BLOCKING]
|
| Check | Result |
|---|---|
| No secrets or tokens | ✅ None found |
| No machine-specific paths | ✅ All paths via process.resourcesPath, __dirname, path.resolve |
| No blind renames in existing packages | ✅ No renames in gitnexus/, gitnexus-web/, gitnexus-shared/ |
| License preserved | ✅ gitnexus-desktop/package.json:7 — PolyForm-Noncommercial-1.0.0 |
| PR title conventional commit format | ✅ feat(desktop): add cross-platform Electron shell |
| No drive-by refactors outside scope | ✅ gitnexus/scripts/build.js change is security-correct fix (execFileSync over execSync) |
| Workflow concurrency correct | ✅ Group key + event-aware cancel-in-progress |
What I could not fully verify
- Whether Electron 41's embedded Node version matches Node 20 ABI. If Electron 41 still uses Node 20 (ABI 115), the native module issue does not manifest. If it uses Node 22 (ABI 127, as Electron 33+ generally does), all packaged builds fail on first API call. This needs to be confirmed against the Electron 41 release notes.
- Whether the
GITNEXUS_DESKTOP_SMOKE_TESTexit-code issue manifests in practice. On Windows in a headless CI environment,dialog.showErrorBoxmay block or crash with non-zero exit, accidentally making the test meaningful. But this is platform/environment-specific and unreliable. - Whether any tree-sitter grammars used by
gitnexus/also contain native.nodebinaries.@ladybugdb/core/lbugjs.nodeis clearly native (listed as a marker atensure-gitnexus-runtime.mjs:187). Tree-sitter itself and its language packages may also have native binaries that would hit the same ABI issue. - End-to-end packaging correctness on macOS/Linux. The smoke test only runs on Windows; macOS and Linux packaged builds have no functional validation in CI.
Final verdict
Blocking items in priority order:
- Smoke test exits 0 on both success and failure (
main.ts:766, 753) — fix by callingprocess.exit(1)instead ofapp.quit()in the error path, so failures are distinguishable. This is a one-line fix and unblocks meaningful CI signal. - Native module ABI mismatch — confirm whether Electron 41's embedded Node version matches the system Node used to compile
@ladybugdb/core/lbugjs.nodeand tree-sitter binaries. If they differ, add anelectron-rebuildstep before packaging. This is the failure mode most likely to reach end users silently and is the highest-impact correctness risk in the PR.
|
@prajapatisparsh To let you know, I haven't forgotten about your PR, I'm planning to include it in the next bigger version |
|
@prajapatisparsh in the meantime, can you please create official installer support? 🙏 |
|
Claude finished @magyargergo's task in 7m 40s —— View job PR #985 Production-Readiness Review — feat(desktop): add cross-platform Electron shell
|
| Job | Status |
|---|---|
| Workflow Lint | ✅ success |
| PR Autofix | ✅ success |
| Claude Code | ✅ skipped |
| Desktop Packaging | ⏳ queued |
| CI (tests + typecheck) | ⏳ queued |
| CodeQL | ⏳ in_progress |
| Docker Build & Push | ⏳ in_progress |
| Dependency Review | ⏳ in_progress |
| Gitleaks | ⏳ queued |
No required platform packaging or test checks are green at current HEAD. Desktop Packaging (the primary validation gate for this PR) is queued and has not produced a result.
Merge status and mergeability
Not mergeable. Required checks are pending/queued. Per DoD.md § 4.5 and the review bar above, the Desktop Packaging workflow must complete successfully on all three platforms before merge can be approved.
Branch hygiene assessment
The branch has 112 commits including 9+ Merge branch 'main' into feat/Desktop-app commits and multiple self-merge commits from the contributor's fork. History is noisy. The final diff vs main is coherent and scope-appropriate. Non-desktop changes are all causally motivated (see Lane E and F). Branch hygiene is acceptable for a squash merge on landing, but a linear history would be cleaner.
Understanding of the change
gitnexus-desktop/ is a new Electron shell that:
- Spawns the gitnexus server as a child process (
node dist/cli/index.js serve --host localhost) - Serves the pre-built gitnexus-web assets via a local HTTP file server (random port,
127.0.0.1-bound) - Opens a
BrowserWindow(shell renderer with custom title bar) +BrowserViewembedding the web UI - On Windows, uses a bundled
node.exe(copied from the CI Node binary byafter-pack.mjs) to avoid the PE-import issue withlbugjs.node; on POSIX, usesELECTRON_RUN_AS_NODE=1on Electron's binary
Non-desktop changes that are causally required:
gitnexus/src/server/api.ts: addsshouldEnableMcpHttp()/GITNEXUS_DISABLE_MCP_HTTP=1gate to avoid MCP SDK module-resolution conflicts in Electron's ELECTRON_RUN_AS_NODE modegitnexus/src/server/validation.ts: restores IPv6/56subnet normalization comment and correct'unknown'fallback bucket in rate-limitergitnexus-web/src/components/*: removes stalescrollbar-thinclassName references; scrollbar styling moved to global*::-webkit-scrollbarrules inindex.css(required for consistent rendering in Electron's Chromium)gitnexus/package-lock.json: lockfile update from the express-rate-limit and validation changes
Resolved since prior review cycles
All blocking items from the previous five automated review cycles are confirmed fixed at current HEAD:
| Previous finding | Current state |
|---|---|
Wrong renderer path ../renderer/src/renderer/index.html |
✅ runtime-paths.ts:45: path.join(currentDir, '../renderer/index.html') |
Unguarded decodeURIComponent crash |
✅ getRequestedPath() in try/catch, returns null on URIError |
permissions: {} stripping contents: read |
✅ Job-level permissions: contents: read on each job |
dialog.showErrorBox() blocking CI smoke tests |
✅ Guarded by if (!IS_DESKTOP_SMOKE_TEST) |
| Native module ABI mismatch | ✅ Bundled node.exe for Windows via after-pack.mjs; POSIX uses Electron's Node 22 |
| Smoke test exits 0 on startup failure | ✅ exitStartupFailure() calls process.exit(1) |
npm.cmd EINVAL on Windows |
✅ shell: needsShell in runCommand |
| Stream error handler missing | ✅ .once('error', ...) with response.destroy() in sendStaticResponse |
repairGitNexusPackages using npm install --no-package-lock |
✅ Now uses npm ci |
lsof stale-process detection broken |
✅ getPosixCommandLine(pid) via ps -p <pid> -o args= |
Findings
[BLOCKING] CI required checks are not green at current HEAD
Risk: The primary validation gate for this PR (Desktop Packaging) and the general test suite (CI) have not completed at HEAD 09cff2a. All three platform packaging jobs (Windows NSIS, macOS DMG, Linux AppImage), the smoke tests, the full test suite, Gitleaks, and Dependency Review are all either queued or in progress.
Evidence: CI status confirms Desktop Packaging is queued, CI (tests) is queued. Per DoD.md § 4.5, the workflow must pass a triggered run before merge; per the review bar, all CI checks must be green on the current head.
Blocks merge: Yes. This is non-negotiable.
[MAJOR] Port 4747 server identity not verified — app may attach to an unrelated process
Risk: If any HTTP server is listening on port 4747 before the desktop app starts and returns any 200 OK response for GET /api/info, the desktop app will treat it as a ready GitNexus backend, skip spawning its own server, and proceed to load the embedded web UI — which will then send all API requests to the unrelated server.
Evidence: main.ts:701:
if (await isAnyHttpUrlReady(GITNEXUS_SERVER_HEALTH_URLS)) {
return; // ← Exits without spawning, no identity verification
}isAnyHttpUrlReady is called with no expectedMarkers. It returns true if any URL in GITNEXUS_SERVER_HEALTH_URLS responds with any non-null text. There is no check that the response body contains a GitNexus-specific marker (e.g., { "name": "gitnexus", ... }).
Why it matters: A developer who has any local web server on port 4747 — or another GitNexus instance started from the CLI — will have the desktop app connect to the wrong backend silently. The embedded web UI will receive incorrect API responses. No error is shown; the app appears to start correctly.
Recommended fix: Check the /api/info response for a GitNexus-specific field (e.g., response.name === 'gitnexus' or similar unique marker) before treating the server as ready. Fix this →
Blocks merge: Yes — the review bar explicitly states "blocks merge: yes if the app can attach to an unrelated process."
[MEDIUM] gitnexusDesktopRuntimeDependencyNames hardcoded — staleness detection may miss missing packages
Risk: Dev-mode repair (npm run dev) may not trigger when an unmanaged package (e.g., tree-sitter, pino, onnxruntime-node) is missing, since the staleness check only watches the 17 hardcoded package markers.
Evidence: ensure-gitnexus-runtime.mjs:135-153 — 17 packages hardcoded. unmanagedGitNexusRuntimeDependencyNames at line 154 correctly computes the gap and warns, but the staleness detection at isGitNexusRuntimeInstallStale() only uses the 17 hardcoded markers. Note: when triggered, repairGitNexusPackages runs npm ci (full install), so the installed state is correct. The issue is the trigger condition.
Impact: If tree-sitter grammars are absent but all 17 markers are present and fresh, gitnexus serve will fail with module-not-found errors in dev mode. Packaged builds are unaffected (use full closure from package.mjs:75).
Recommended fix: Derive gitnexusDesktopRuntimeInstallMarkerPaths from Object.keys(gitnexusPackageJson.dependencies ?? {}) to match package.mjs:75. Fix this →
Blocks merge: No — packaged builds unaffected. But will cause confusing dev setup failures.
[LOW] BrowserView is deprecated — migration tracked but deferred
Evidence: main.ts:594: new BrowserView(...) with comment // BrowserView is deprecated in Electron; keep this isolated until we migrate to WebContentsView. Electron 41 still supports it.
Blocks merge: No — tracked, migration is a follow-up item.
[LOW] No unit test for shouldEnableMcpHttp()
Evidence: api.ts:42-44 — one-liner function, no test in gitnexus/test/. Previous review cycle flagged this. The function gates the entire MCP HTTP subsystem.
Blocks merge: No — low-risk one-liner, but a regression guard is warranted.
[INFORMATIONAL] Artifact attestation does not fire on PR events
Evidence: desktop-packaging.yml:175: if: github.event_name != 'pull_request' — correct behavior for fork-PR OIDC restrictions. PR preview artifacts are unattested by design (per maintainer agreement). Attestation will fire on workflow_dispatch, which has not yet been validated end-to-end.
Blocks merge: No — documented design decision.
PR-specific assessment sections
Lane A — Desktop runtime & process lifecycle ⚠️
- Renderer path:
getPackagedRendererEntry(__dirname)→path.join(currentDir, '../renderer/index.html')— correct ✅ - Startup failure:
exitStartupFailure()callsprocess.exit(1);showStartupErrorskips dialog in smoke test mode ✅ - Process lifecycle:
before-quitandwindow-all-closedhandlers call all stop functions; macOSactivatehandler callsensureGitNexusServerStarted()beforecreateWindow()✅ - Port collision:
isAddressInUseErrordetects EADDRINUSE and shows actionable dialog ✅ - Server identity: ❌ Not verified — see MAJOR finding above
Lane B — Electron security boundary ✅
BrowserWindow:contextIsolation: true,nodeIntegration: false✅BrowserView(embedded web UI): additionallysandbox: true✅preload.ts:26:contextBridge.exposeInMainWorld('gitnexusDesktop', {...})— narrow surface, no rawipcRenderer, no process/filesystem exposed ✅- IPC
DESKTOP_WINDOW_ACTION_CHANNELhandler usesswitch/default: throw— invalid actions throw ✅ isAllowedExternalUrl: permits onlyhttp:,https:,mailto:✅setWindowOpenHandlerandwill-navigateblock cross-origin navigation ✅GITNEXUS_DISABLE_MCP_HTTP=1injected in packaged mode; dynamic import prevents eager loading ✅- Packaged web server binds to
127.0.0.1only, not0.0.0.0✅
Lane C — Packaging & native modules ✅ (macOS/Linux; Windows pending CI)
after-pack.mjs: copies CI'sprocess.execPathasresources/runtime/node.exefor Windows — correct ABI (both compiled under Node 22) ✅main.ts:247-252:getNodeCommand()prefers bundlednode.exeon Windows if present, falls back toprocess.execPath + ELECTRON_RUN_AS_NODE=1on POSIX ✅npmRebuild: falseis intentional — ABI handled by bundled node strategy ✅syncPackagedRuntimeResources()trims node_modules to runtime closure after electron-builder runs ✅gitnexusRuntimeDependencyNames = Object.keys(gitnexusPackageJson.dependencies ?? {})inpackage.mjs:75— dynamic, correct ✅- macOS quarantine:
smoke-unpacked.mjs:114:xattr -crcalled inprepareExecutableForSmokeTest✅ - Windows smoke test outcome at current HEAD unknown (Desktop Packaging queued) ⏳
Lane D — CI/workflow & supply chain ✅ (structure; results pending)
permissions: {}at workflow level; job-levelcontents: read,id-token: write,attestations: writeon package jobs ✅- All Actions pinned to full commit SHAs ✅
persist-credentials: falseon all checkouts ✅cancel-in-progress: ${{ github.event_name == 'pull_request' }}— event-aware ✅fail-fast: false— all three platforms test even when one fails ✅if-no-files-found: erroron artifact upload ✅- Path triggers now include
gitnexus/**,gitnexus-web/**,gitnexus-shared/**— correct given the non-desktop changes ✅ - Workflow Lint passes ✅
- Desktop Packaging results: not yet available ⏳
Lane E — Server/API compatibility ✅
shouldEnableMcpHttp()returnsprocess.env.GITNEXUS_DISABLE_MCP_HTTP !== '1'— defaults totrue(enabled), preserving existing behavior for non-desktop users ✅mountMCPEndpointsis a dynamicawait import('./mcp-http.js')inside the gate — no import-time side effects when disabled ✅validation.tsrate-limiter: IPv6/56normalization comment restored;'unknown'sentinel for IP-less requests restored (corrects the prior regression) ✅gitnexus/tests: in CI queue; previous runs all passed ✅
Lane F — Web UI compatibility ✅
gitnexus-web/src/components/*.tsx: 8scrollbar-thinclassName references removed from 5 components; global*::-webkit-scrollbarrules inindex.csshandle styling consistently in Chromium/Electron ✅index.css: +20/-13 adds animation keyframes and reduced-motion query; no layout regression risk ✅- Changes are causal (Electron renderer requires native CSS scrollbar rules) ✅
- E2E validation: web UI tests queued in CI, not yet confirmed ⏳
Lane G — Docs & agent-rule changes ✅
CLAUDE.md: markdown formatting fixed ✅AGENTS.md: updated with desktop package references ✅gitnexus-desktop/README.md: documents dev/build/verification commands correctly ✅.gitignore: adds artifact directories only, no source files hidden ✅
Lane H — Branch hygiene
- 112 commits, 9+ merge-from-main commits, several self-merges from contributor fork — noisy history
- Final diff vs
mainis coherent and scope-appropriate - All non-desktop changes causally motivated
- Squash merge on landing recommended to clean history
- Not a blocking concern in itself, but the noise makes per-commit attribution difficult
Hidden Unicode / hygiene scan
Review of main.ts, preload.ts, runtime-paths.ts, package.mjs, ensure-gitnexus-runtime.mjs, after-pack.mjs, smoke-unpacked.mjs, and desktop-packaging.yml shows only standard ASCII characters in logic, regex, and security-critical sections. No bidi controls, zero-width joiners, or BOM markers detected in the files examined. Clean.
Non-negotiables check
| Check | Result |
|---|---|
| No secrets or tokens | ✅ None found |
| No machine-specific paths | ✅ All via process.resourcesPath, __dirname, path.resolve |
No blind renames in gitnexus/, gitnexus-web/, gitnexus-shared/ |
✅ |
| License preserved | ✅ PolyForm-Noncommercial-1.0.0 in gitnexus-desktop/package.json |
| PR title conventional commit format | ✅ feat(desktop): add cross-platform Electron shell |
| Non-desktop changes causally required | ✅ All motivated by desktop runtime requirements |
What I could not fully verify
- Desktop Packaging CI results at current HEAD — Desktop Packaging is queued; Windows smoke test outcome is unknown. The previous run (May 2026) showed the bundled
node.exeapproach was architecturally sound, but current HEAD results are unconfirmed. - Gitleaks scan — queued; no secret scan result available at this HEAD.
- Dependency Review — in progress; new packages in
gitnexus-desktop/package-lock.jsonare not yet reviewed. /api/inforesponse schema — whether it currently returns a unique GitNexus identifier field that could be used for identity verification (needed for the MAJOR finding fix).
Final verdict
not production-ready
Two blockers stand:
1. CI checks are pending. Desktop Packaging (the primary functional gate), the test suite, Gitleaks, and Dependency Review are all queued or in progress at HEAD 09cff2a. The review bar requires all required checks to be green before merge. No platform packaging result exists for this head.
2. Port 4747 server identity is not verified. ensureGitNexusServerStarted() treats any HTTP server returning a 200 on port 4747 at /api/info as the ready GitNexus backend (main.ts:701). An unrelated server on that port causes the desktop app to silently proceed and load the web UI against the wrong backend. The review bar explicitly blocks on this scenario. The fix is a one-line addition of a GitNexus-specific response marker check to GITNEXUS_SERVER_HEALTH_URLS readiness probes.
All previous blocking items from the five prior review cycles are confirmed fixed. Once CI completes successfully on all platforms and the server identity check is added, this PR is otherwise close to mergeable. The hardcoded dependency list in ensure-gitnexus-runtime.mjs and missing shouldEnableMcpHttp() unit test can be addressed as follow-ups.
· PR branch
|
Now, users are able to define |
Thanks good to know |
sure ill start my work on this any reference u wanna give ? |
okay ill look into it |
|
This may affect this work - #1748 |
We need to run some investigations. I'd love to see this electron app available on offical stores like, microsoft, apple, ubuntu (any other distro) etc... |
thanks for a heads up |
Spawn the GitNexus backend server with --port 0 so the OS assigns a free port instead of hardcoding 4747. The server announces the chosen port via a GITNEXUS_PORT=N stdout line, which the desktop captures and uses for health checks and identity verification. Also fixes server/api.ts to log the actual bound port (server.address().port) instead of the port parameter, which was wrong when using --port 0. Removes GITNEXUS_PORT, GITNEXUS_SERVER_URL, GITNEXUS_SERVER_HEALTH_URLS constants. Adds identity verification via /api/info version field. Passes server URL to web UI via ?server= query param (already supported by App.tsx auto-connect). Refs abhigyanpatwariGH-985
tree-sitter-kotlin was listed in gitnexus/package.json dependencies but was not installed in node_modules because its native build step requires Python 3, make, and g++ which are not available on Windows by default. Running npm install downloads the prebuilt binary and resolves the TS2307 error that caused the pre-commit typecheck hook to fail on every commit touching the gitnexus/ package. Refs abhigyanpatwariGH-985
|
Hey @magyargergo a couple of clarifications before I start on the installer support:
|
|
|
@magyargergo sure I will do that. Also great work @prajapatisparsh, thanks for the contribution! |
its not much but welcome |
|
@magyargergo so what should i do next ? |
| return expectedMarkers.every((marker) => responseText.includes(marker)); | ||
| }; | ||
|
|
||
| const isAnyHttpUrlReady = async (urls: string[], expectedMarkers?: string[]): Promise<boolean> => { |

What changed
Adds
gitnexus-desktop/— a new Electron app that bundles the GitNexuslocal server and web UI into a single installable desktop application.
Nothing in
gitnexus/,gitnexus-web/, orgitnexus-shared/was modified.Why
Running GitNexus currently requires cloning the repo, installing deps across
multiple packages, and manually starting the server. This removes all of that
friction — users download one file and open it.
How to verify
cd gitnexus-desktop npm install npm run devThe Electron window should open, start the local server on port 4747, and
load the full gitnexus-web graph UI inside the window.
To build platform installers:
A GitHub Actions workflow (
desktop-packaging.yml) builds and uploadsartifacts automatically on any PR touching
gitnexus-desktop/**.Risk
handled by
ensure-gitnexus-runtime.mjs