A professional, offline-first JavaScript IDE
Built with Electron Β· React Β· Monaco Editor Β· Ollama AI
π Overview Β Β·Β β¨ Features Β Β·Β ποΈ Architecture Β Β·Β π οΈ Installation Β Β·Β π Usage Β Β·Β π§° Tech Stack Β Β·Β π€ Contributing
JS Nexus is a professional desktop IDE engineered exclusively for JavaScript developers. It merges a VS Codeβgrade editor with a live variable inspector, an animated event loop visualizer, a built-in API client, full Git source control, an embedded terminal, and a 100% offline AI assistant β all without a single cloud dependency.
π Privacy-first by design. Every computation β code execution, AI inference, Git operations β runs locally. Nothing ever leaves your machine.
JS Nexus = Monaco Editor + VM Sandbox + Memory Box + Event Loop + Git + AI (Ollama) + API Tester
|
Each mode exposes a different API surface, giving you full power or safe isolation with a single dropdown switch. |
||||||
|
The crown jewel of JS Nexus β updates as you type:
|
Step-by-step animated walkthrough of JavaScript concurrency:
Watch your async code execute frame-by-frame. |
||||||
|
Automatic AI-powered debugging on every runtime error:
|
A full Postman-style HTTP client embedded in the IDE:
|
||||||
|
Full source control panel without leaving the IDE:
|
|
JS Nexus follows Electron's multi-process architecture with strict context isolation for maximum security and stability.
graph TB
subgraph MAIN["π₯οΈ Electron Main Process (Node.js)"]
VM["π node:vm\nSandbox Engine"]
FS["π node:fs\nFile System"]
OLLAMA["π€ Ollama Client\nlocalhost:11434"]
HTTP["π HTTP Proxy\nAPI Tester Backend"]
GIT["πΏ simple-git\nGit Operations"]
end
subgraph BRIDGE["π Preload (contextBridge)"]
API["window.api\n(contextIsolation: true)"]
end
subgraph RENDERER["βοΈ React Renderer Process (Vite)"]
EDITOR["ποΈ Monaco Editor"]
MEMBOX["π§ Memory Box"]
EVLOOP["π Event Loop\nVisualizer"]
APITESTER["π API Tester"]
GITPANEL["πΏ Git Panel"]
TERMINAL["π» Terminal\n(Xterm.js)"]
AICHAT["π€ AI Chat"]
AIERR["β‘ AI Error\nWidget"]
end
VM & FS & OLLAMA & HTTP & GIT --> API
API --> EDITOR & MEMBOX & EVLOOP & APITESTER & GITPANEL & TERMINAL & AICHAT & AIERR
style MAIN fill:#1e293b,stroke:#3b82f6,color:#e2e8f0
style BRIDGE fill:#312e81,stroke:#818cf8,color:#e2e8f0
style RENDERER fill:#14532d,stroke:#4ade80,color:#e2e8f0
graph LR
A["Renderer\n(React UI)"] -->|"window.api\n(allow-listed calls)"| B["contextBridge\nPreload"]
B -->|"IPC invoke"| C["Main Process\n(Node.js)"]
C -->|restricted to\nopened folder| D["File System"]
C --> E["node:vm\nSandbox"]
C --> F["Ollama\nlocalhost"]
style A fill:#1d4ed8,stroke:#60a5fa,color:#fff
style B fill:#6d28d9,stroke:#a78bfa,color:#fff
style C fill:#065f46,stroke:#34d399,color:#fff
style D fill:#78350f,stroke:#fbbf24,color:#fff
style E fill:#7f1d1d,stroke:#f87171,color:#fff
style F fill:#831843,stroke:#f472b6,color:#fff
| Security Property | Value |
|---|---|
nodeIntegration |
false |
contextIsolation |
true |
sandbox (preload) |
true |
| File access | Restricted to user-opened folder |
| External links | Allow-listed |
| File deletion | OS trash (reversible) |
The Memory Box appends guarded capture expressions after user code to extract final values without exposing Node.js internals:
// ββ Your code βββββββββββββββββββββββββββββββββββββββββββββββββββββ
let score = 0;
score = 10;
score = score * 2;
const name = "JS Nexus";
var version = 1;
// ββ Internally appended capture pass ββββββββββββββββββββββββββββββ
try { __capture__.score = typeof score === 'undefined' ? undefined : score; } catch {}
try { __capture__.name = typeof name === 'undefined' ? undefined : name; } catch {}
try { __capture__.version = typeof version === 'undefined' ? undefined : version; } catch {}
β οΈ node:vmis a convenience boundary, not a hostile-code sandbox. For adversarial input, pair it with an OS-level sandbox.
sequenceDiagram
participant User
participant Editor as Monaco Editor
participant MemBox as Memory Box
participant IPC as IPC Bridge
participant VM as node:vm Sandbox
participant AI as Ollama AI
User->>Editor: Type code
Editor->>MemBox: Static analysis (instant)
Editor-->>MemBox: Debounced eval after 600ms
User->>Editor: Ctrl+Enter (Run)
Editor->>IPC: executeJS(code, mode)
IPC->>VM: Run in sandbox
VM-->>IPC: { output, variables, error }
IPC-->>Editor: Result
Editor-->>MemBox: Final variable values
alt Runtime Error
VM-->>IPC: Error + stack trace
IPC-->>AI: explainError(code, error)
AI-->>Editor: Root cause + fix suggestion
Editor-->>User: AI Error Widget (Apply Fix)
end
| Requirement | Version | Link |
|---|---|---|
| Node.js | v20.19+ | nodejs.org |
| Git | Any | git-scm.com |
| Ollama (optional) | Latest | ollama.com |
# 1. Clone the repository
git clone https://github.com/SaadRimeh/Js-Nexus.git
cd Js-Nexus
# 2. Install all dependencies
npm install
# 3. Launch the IDE in development mode
npm run devThe Electron window opens automatically with Vite hot-reload enabled.
# Install Ollama from https://ollama.com, then pull a coding model:
ollama pull codellama # Recommended for code tasks
# or
ollama pull llama3 # General purpose
# or
ollama pull deepseek-coder # Specialized code modelπ‘ JS Nexus can also auto-download models from within the IDE β no terminal needed after the initial Ollama install.
# Compile TypeScript + bundle React, then package the installer
npm run dist
# Output: dist/ directory with .exe (Windows) / .dmg (macOS) / .AppImage (Linux)| Shortcut | Action |
|---|---|
Ctrl + Enter |
Run current code |
Ctrl + S |
Save current file |
Ctrl + Z |
Undo last change |
Ctrl + Shift + Z |
Redo |
Ctrl + / |
Toggle line comment |
F11 |
Toggle fullscreen |
stateDiagram-v2
[*] --> Typing: User opens editor
Typing --> StaticAnalysis: Any keystroke
StaticAnalysis --> VariableDetected: let / var / const found
VariableDetected --> DebouncedEval: Wait 600ms (idle)
DebouncedEval --> LiveValues: Silent sandbox run
LiveValues --> Typing: User continues typing
Typing --> RunCode: Ctrl+Enter
RunCode --> FinalCapture: Sandbox executes
FinalCapture --> [*]: Final values + output displayed
Try this example:
let score = 0;
score = 10;
score = score * 2;
for (let i = 0; i < 5; i++) {
score = score + i;
}
const name = "JS Nexus";
var version = 1;Watch the Memory Box panel on the right update live as you type, showing score β 30, name β "JS Nexus", version β 1.
Use the dropdown in the editor toolbar to switch engines:
| Engine | Use Case |
|---|---|
| Node.js Engine | File I/O, native modules, npm packages, shell interop |
| Sandbox VM | Safe isolated execution, Memory Box live inspection |
js-nexus/
βββ π electron/
β βββ main.ts # Main process: VM engine, FS, Ollama, HTTP proxy, Git IPC
β βββ preload.ts # contextBridge: exposes window.api to renderer
β βββ electron-env.d.ts # Electron type declarations
β
βββ π src/
β βββ π main/ # Electron entry types
β βββ π preload/ # Preload type declarations
β βββ π renderer/
β βββ App.jsx # Root layout, tabs, sidebar, state management
β βββ main.jsx # React entry point
β βββ π components/
β βββ Editor.jsx # Monaco Editor wrapper + snippets + shortcuts
β βββ MemoryBox.jsx # Live variable inspector (static + runtime)
β βββ Terminal.jsx # Xterm.js terminal + type-colored output
β βββ EventLoopVisualizer.jsx # Animated call stack / queue viewer
β βββ FileExplorer.jsx # File tree: create, rename, delete, open folder
β βββ GitPanel.jsx # Stage, diff, commit, push, pull, branch
β βββ ApiTester.jsx # HTTP client (GET/POST/PUT/DELETE/PATCH)
β βββ AiChat.jsx # Ollama chat with code context injection
β βββ AIErrorWidget.jsx # Auto-triggered AI debugger + Apply Fix
β βββ BrandLogo.jsx # App logo component
β
βββ π public/
β βββ π branding/ # Logo assets (PNG 32px β 1024px, ICO, ICNS)
β
βββ π scripts/
β βββ generate-icons.cjs # Icon generation utility
β βββ smoke-electron.cjs # Smoke test runner
β
βββ π docs/
β βββ branding.md # Brand guidelines
β
βββ electron-builder.json5 # Installer / packaging configuration
βββ vite.config.ts # Vite + Electron plugin configuration
βββ tsconfig.json # TypeScript project config
βββ package.json # Scripts, deps, entry point
graph LR
subgraph Frontend["βοΈ Frontend"]
R["React 18"]
M["Monaco Editor 0.57"]
X["Xterm.js 6"]
V["Vite 8"]
end
subgraph Desktop["π₯οΈ Desktop Layer"]
E["Electron 42"]
EB["electron-builder 26"]
end
subgraph Backend["βοΈ Main Process"]
SG["simple-git 3"]
VM["node:vm"]
FS["node:fs"]
end
subgraph AI["π€ AI Layer"]
OL["Ollama\n(local LLM)"]
end
Frontend --> Desktop
Desktop --> Backend
Backend --> AI
style Frontend fill:#1e40af,stroke:#60a5fa,color:#fff
style Desktop fill:#3730a3,stroke:#a78bfa,color:#fff
style Backend fill:#065f46,stroke:#34d399,color:#fff
style AI fill:#7c2d12,stroke:#fb923c,color:#fff
| Technology | Version | Role |
|---|---|---|
| Electron | 42 | Desktop application framework |
| React | 18 | UI rendering & state management |
| Monaco Editor | 0.57 | VS Code editor engine |
| Xterm.js | 6 | Embedded terminal emulator |
| Vite | 8 | Bundler & hot-reload dev server |
| TypeScript | 5 | Type-safe development |
| simple-git | 3 | Git operations via IPC |
| node:vm | Built-in | Sandboxed JS execution context |
| Ollama | Latest | Offline local AI model runner |
| electron-builder | 26 | Cross-platform packaging & installer |
Contributions, issues, and feature requests are welcome! Here's how to get started:
gitGraph
commit id: "Fork repo"
branch feature/your-feature
checkout feature/your-feature
commit id: "Make changes"
commit id: "Add tests"
checkout main
merge feature/your-feature id: "Pull Request"
- Fork the repository
- Create your feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'feat: add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request on GitHub
Follow Conventional Commits:
| Prefix | Use for |
|---|---|
feat: |
New features |
fix: |
Bug fixes |
docs: |
Documentation changes |
refactor: |
Code restructuring |
style: |
Formatting only |
chore: |
Build / tooling changes |
This project is licensed under the MIT License β see the LICENSE file for details.
MIT License β free to use, modify, and distribute with attribution.