Find a file
Pascal André e5115fe8aa
fix(desktop): prevent shell prompts from blocking startup (#681) (#684)
## 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.
2026-09-07 22:22:01 +02:00
.github fix(desktop): prevent shell prompts from blocking startup (#681) (#684) 2026-09-07 22:22:01 +02:00
.opencode feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
dev-docs feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
docs fix(release): preserve PR notes and validate WinGet access (#658) 2026-08-29 16:02:35 +01:00
images Move screenshots to correct folder 2025-11-21 21:59:58 +00:00
packages fix(desktop): prevent shell prompts from blocking startup (#681) (#684) 2026-09-07 22:22:01 +02:00
scripts feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
temp Bump to v0.11.2 2026-02-17 18:47:21 +00:00
.gitignore chore: ignore local artifacts and add cloudflare lockfile 2026-01-22 16:42:47 +00:00
AGENTS.md feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
BUILD.md build: publish deb and portable tar.gz Linux artifacts (#492) 2026-07-12 19:29:33 +02:00
CONTRIBUTING.md feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
DESKTOP_V2_COMPARISON.md feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
LICENSE chore(license): add MIT license 2026-02-02 11:22:49 +00:00
MIGRATION_V2.md feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
package-lock.json feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
package.json feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
README.md feat(opencode): migrate CodeNomad to native V2 (#647) 2026-09-04 11:36:11 +01:00
THIRD_PARTY_NOTICES.md feat(usage): show provider quota in session status (#584) 2026-07-15 10:25:00 +01:00

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.

Multi-instance workspace


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, the CODENOMAD_SERVER_PASSWORD environment variable, or create an auth.json file (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/:id before forwarding the request upstream
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

Star History


Built with ♥ by Neural Nomads · MIT License