## Summary Fixes #681. Prevent GPG/password prompts in shell startup files from holding the desktop backend launch hostage. Both Tauri and Electron now discover the POSIX shell environment in a separate, bounded process before launching Node directly. ## Implementation - Limit shell environment discovery to three seconds and 1 MiB of output, support cancellation, disconnect stdin/controlling terminal, and clean up the probe's process group. - Fall back to the inherited application environment if discovery fails or times out; do not log captured environment values. - Remove the duplicate explicit `.zshrc` load while preserving the existing Bash `.bashrc` compatibility path when a login profile does not source it. - Use an explicitly terminated environment frame. A background child retaining stdout no longer causes a false timeout after the complete snapshot has arrived. - Validate the discovered runtime path and environment before direct backend launch. - Keep Windows on the direct-launch path and preserve existing backend containment/readiness/shutdown behavior. No shared OpenCode daemon lifecycle or user configuration changes. ## Review and regression coverage An initial review reproduced two regressions: missing Bash rc exports and waiting for stdout EOF despite a complete environment snapshot. Both were corrected with regression tests in the TypeScript and Rust implementations. Real-Zsh tests are now wired into Linux/macOS CI, with Zsh installed for Linux and a targeted TypeScript shell test step on macOS. They no longer silently pass or skip on POSIX because optional environment variables were absent. An additional local review exercised success, truncated/invalid frames, oversized output and cancellation after a descendant started. All test descendants were gone afterward; no additional confirmed findings remained in the exercised scope. ## Validation - [x] Electron TypeScript typecheck. - [x] Electron native tests on Windows: 194 passed; four POSIX tests skipped. - [x] Real Bash/Zsh tests under WSL Linux: 8/8 passed, no skips. - [x] Production Rust environment module tested under WSL Linux via an isolated harness: 5/5 passed. - [x] Production Rust module/tests checked for `aarch64-apple-darwin` (not a macOS application build). - [x] Windows Tauri CLI-manager tests: 28/28 passed. - [x] Full Windows Tauri release build and packaged-resource smoke tests. - [x] Installed Tauri executable and resources replaced after graceful closure, with a separate verified backup; relaunch inspected and captured through Developer Mode. - [x] Workflow YAML validation and `git diff --check`. - [ ] Hosted CI results pending this PR. - [ ] Actual macOS 27 GUI/GPG pinentry reproduction remains to be verified on a Mac. Linux tests simulate the blocking wait using a real Zsh; Windows GUI startup does not exercise the POSIX path. ## Behavior and scope notes Shell discovery is best effort: startup files that genuinely fail, block or exceed the limits cannot contribute their environment for that launch. The application then uses its inherited environment. Bash retains its previous compatibility behavior if a profile itself also sources `.bashrc`. This branch is based on `dev` and contains only the #681 changes, not the separate #678 work. Existing large files touched: `cli_manager.rs` (~2,340 lines) and Electron `process-manager.ts` (~634 lines). The new environment modules are narrowly scoped; no size-only refactor is included. |
||
|---|---|---|
| .github | ||
| .opencode | ||
| dev-docs | ||
| docs | ||
| images | ||
| packages | ||
| scripts | ||
| temp | ||
| .gitignore | ||
| AGENTS.md | ||
| BUILD.md | ||
| CONTRIBUTING.md | ||
| DESKTOP_V2_COMPARISON.md | ||
| LICENSE | ||
| MIGRATION_V2.md | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| THIRD_PARTY_NOTICES.md | ||
CodeNomad
The AI Coding Cockpit for OpenCode
CodeNomad transforms OpenCode from a terminal tool into a premium desktop workspace — built for developers who live inside AI coding sessions for hours and need control, speed, and clarity.
OpenCode gives you the engine. CodeNomad gives you the cockpit.
Features
- 🚀 Multi-Instance Workspace
- 🌐 Remote Access
- 🧠 Session Management
- 🎙️ Voice Input & Speech
- 🌳 Git Worktrees
- 💬 Rich Message Experience
- 🧩 SideCars
- ⌨️ Command Palette
- 📁 File System Browser
- 🔐 Authentication & Security
- 🔔 Notifications
- 🎨 Theming
- 🌍 Internationalization
Getting Started
🖥️ Desktop App
Available as both Electron and Tauri builds — choose based on your preference.
Download the latest installer for your platform from Releases.
| Platform | Formats |
|---|---|
| macOS | DMG, ZIP (Universal: Intel + Apple Silicon) |
| Windows | NSIS Installer, ZIP (x64, ARM64) |
| Linux | Tauri deb, Electron portable tar.gz (x64) |
The Tauri deb is currently built and installation-tested on Ubuntu 24.04. Compatibility with older Debian-based distributions is not yet guaranteed.
💻 CodeNomad Server
Run as a local server and access via browser. Perfect for remote development.
npx @neuralnomads/codenomad --password <your-password> --launch
Authentication required: The server requires a password on first run. You can pass it via
--password, theCODENOMAD_SERVER_PASSWORDenvironment variable, or create anauth.jsonfile (see Server Documentation).
Self-signed certificate: On first launch with HTTPS enabled (the default), your browser will show a "Your connection is not private" warning. This is expected — the server generates a local self-signed certificate automatically. Click Advanced → Proceed to localhost to continue. For local-only use without the warning, run with
--https=false --http=true.
See Server Documentation for flags, TLS, auth, and remote access.
🧪 Dev Releases
Bleeding-edge builds from the dev branch:
npx @neuralnomads/codenomad-dev --password <your-password> --launch
SideCars
SideCars let you open local web tools inside CodeNomad as tabs.
Previews use token-scoped URLs inside opaque-origin sandboxes. Loopback HTTP native previews receive a dedicated .preview.localhost origin so root routes, POSTs, and live reload behave normally; HTTPS, LAN, and web hosts use the capability path. Element comments use a source-checked message bridge.
Configuration
- Name: Display name used in CodeNomad
- Port: Local HTTP or HTTPS service running on
127.0.0.1:<port> - Base path: Mounted under
/sidecars/:id - Prefix mode:
- Preserve prefix forwards the full
/sidecars/:id/...path upstream - Strip prefix removes
/sidecars/:idbefore forwarding the request upstream
- Preserve prefix forwards the full
VSCode (OpenVSCode Server)
Run with Docker:
docker run -it --init -p 8000:3000 -v "${HOME}:${HOME}:cached" -e HOME=${HOME} gitpod/openvscode-server --server-base-path /sidecars/vscode
Add SideCar as:
- Name:
VSCode - Port:
http://127.0.0.1:8000 - Base path:
/sidecars/vscode - Prefix mode:
Preserve prefix
Terminal (ttyd)
Run with:
ttyd --writable zsh
Add SideCar as:
- Name:
Terminal - Port:
http://127.0.0.1:7681 - Base path:
/sidecars/terminal - Prefix mode:
Strip prefix
Requirements
- OpenCode CLI — must be installed and in your
PATH - Node.js 18+ — for server mode or building from source
Development
CodeNomad is a monorepo built with:
| Package | Description |
|---|---|
| packages/server | Core logic & CLI — workspaces, OpenCode proxy, API, auth, speech |
| packages/ui | SolidJS frontend — reactive, fast, beautiful |
| packages/electron-app | Desktop shell — process management, IPC, native dialogs |
| packages/tauri-app | Tauri desktop shell (experimental) |
Quick Start
git clone https://github.com/NeuralNomadsAI/CodeNomad.git
cd CodeNomad
npm install
npm run dev
Troubleshooting
macOS: "CodeNomad.app is damaged and can't be opened"
Gatekeeper flag due to missing notarization. Clear the quarantine attribute:
xattr -dr com.apple.quarantine /Applications/CodeNomad.app
On Intel Macs, also check System Settings → Privacy & Security on first launch.
Linux (Wayland + NVIDIA): Tauri App closes immediately
WebKitGTK DMA-BUF/GBM issue. Run with:
WEBKIT_DISABLE_DMABUF_RENDERER=1 codenomad-tauri
See full workaround in the original README.
Community
Built with ♥ by Neural Nomads · MIT License
