JSCR — JavaScript AI-Powered Code Runner
Live inline JavaScript & TypeScript execution inside VS Code.
Type code, see results — no button presses, no terminal switching, no context loss.
Why JSCR
- Live inline evaluation — every top-level expression is reported next to its line, in real time.
- File Mode — runs the active
.js / .ts file against your workspace's node_modules. No config.
- Scratch Mode — persistent scratchpad snippets that survive restarts, kept in
~/.jscr/snippets/.
- Dormant when off — zero background processes when the panel is closed.
- AI-assisted fixes — send a runtime error + code to OpenRouter and preview a two-column diff before accepting.
- Theme-native output — panel colors are pulled from your active VS Code color theme, not hardcoded.
- Polyglot — first-class Python, Java and Go alongside JS/TS, each running live.
Polyglot: Python, Java & Go
JSCR also runs Python, Java and Go snippets live, streaming their output into the same panel. Each language's toolchain is auto-detected on startup (results are cached, so subsequent launches are instant); a language only appears in the New Snippet menu when a supported toolchain is found.
| Language |
Minimum version |
Run mode |
Live debounce |
Notes |
| JavaScript / TypeScript |
Node 17+ |
live |
300 ms |
In-process V8 vm, line-anchored value inspector |
| Python |
3.7 |
live |
1 s |
Runs the file in place: python <file> |
| Go |
1.11 |
live |
3 s |
Modules build; the go.mod target tracks your detected Go version, so modern features (generics, etc.) compile |
| Java |
11 |
live |
3 s |
Single-file source launcher (JEP 330) — no javac step, no .class files |
- Below the minimum? If a detected toolchain is older than the minimum, that language is treated as unavailable — running such a snippet shows a clear "version too old" message (just like an unsupported Node version) while every other language keeps working.
- Compiled languages run live too — Go/Java re-run on a 3 s idle debounce (never mid-keystroke). Turn this off per language with
jscr.go.liveMode / jscr.java.liveMode to run them only on demand.
- Timeouts — native runs get a longer default (
jscr.process.timeoutMs, 45 s) than the in-vm JS engine, and the whole process tree is force-killed (SIGTERM → SIGKILL) on timeout so worker threads never linger.
For interactive-looking programs — Java Scanner, Python input(), Go fmt.Scan — the panel has a Program Input box (toggle it from the header's terminal-prompt icon). Type the input your program reads ahead of time, one value per line, with one-click Paste and Clear:
Alice
30
On each run JSCR feeds that into the program's stdin and then closes it. So a read past what you supplied instantly hits end-of-input (Java NoSuchElementException, Python EOFError, Go io.EOF) with a red squiggle on that line — the re-run never hangs waiting for a human. Fill the box → every line runs each cycle. Leave it short → it fails fast at the first unsatisfied read. Input is remembered per snippet.
Requirements
- VS Code 1.85+
- Node.js v17+ (recommended v22 LTS for full ES2023 support)
- Optional, only for their languages: Python 3.7+, Java (JDK) 11+, Go 1.11+ on your
PATH (or point JSCR at them with jscr.python.path / jscr.java.path / jscr.go.path).
Install
Marketplace (recommended):
Extensions view → search JSCR → Install.
From a local .vsix:
code --install-extension jscr-<version>.vsix
Build a local .vsix yourself with npm run package — see docs/LOCAL_BUILD_AND_USE.md.
Quick start
- Press Ctrl+Shift+J (macOS: Cmd+Shift+J) to open the JSCR panel.
- Open any
.js or .ts file — or press Ctrl+Shift+N to create a Scratch snippet.
- Type. Each 300 ms of idle triggers a run.
- Per-line results appear inline in the panel:
L 3 const total = 42 → 42
L 4 users.map(u => u.name) → ['ada', 'grace', 'linus']
L 5 console.log('hi', 3) → hi 3
Commands
| Command |
Default keybind |
| JSCR: Toggle Panel |
Ctrl+Shift+J / Cmd+Shift+J |
| JSCR: New Scratch Snippet (JavaScript) |
Ctrl+Shift+N / Cmd+Shift+N |
| JSCR: New Scratch Snippet (TypeScript) |
— |
| JSCR: New Scratch Snippet (Python / Java / Go) |
— (shown when the toolchain is detected) |
| JSCR: Run Snippet |
Ctrl+Shift+Enter / Cmd+Shift+Enter |
| JSCR: Refresh Language Environments |
— |
| JSCR: Run Current File |
— |
| JSCR: Show Live Output |
— |
| JSCR: Install Package |
— |
| JSCR: Switch Package Source |
— |
| JSCR: Fix with AI |
Ctrl+Shift+A / Cmd+Shift+A |
| JSCR: Switch AI Model (OpenRouter) |
Ctrl+Shift+Alt+A / Cmd+Shift+Alt+A |
| JSCR: Save Snippet to Project |
— |
| JSCR: Move Snippet to Global |
— |
| JSCR: Delete Snippet |
— |
| JSCR: Clear All Snippets |
— |
| JSCR: Toggle Snippet Language (JS ↔ TS) |
— |
All commands are available from the Command Palette — press Ctrl+Shift+P (macOS: Cmd+Shift+P) and type JSCR. Fix with AI is also on the editor right-click menu for .js/.ts files.
Configuration
Search jscr in Settings, or edit .vscode/settings.json:
| Setting |
Default |
What it controls |
jscr.debounceMs |
300 |
Wait this long after a keystroke before running (JS/TS). |
jscr.executionTimeoutMs |
20000 |
Hard timeout for JS/TS — user code is killed after this many ms. |
jscr.process.timeoutMs |
45000 |
Hard timeout for Python/Java/Go. The process tree is force-killed on timeout. |
jscr.python.path |
"" |
Override the Python interpreter path. Empty = auto-detect (py / python3 / python). |
jscr.java.path |
"" |
Override the Java (JDK 11+) launcher path. Empty = auto-detect. |
jscr.go.path |
"" |
Override the Go toolchain path. Empty = auto-detect. |
jscr.python.debounceMs |
1000 |
Live re-run debounce for Python. |
jscr.compiled.liveDebounceMs |
3000 |
Idle debounce before a live re-run of Go/Java. |
jscr.go.liveMode |
true |
Re-run Go live as you type. Off = run on demand only. |
jscr.java.liveMode |
true |
Re-run Java live as you type. Off = run on demand only. |
jscr.openRouterApiKey |
"" |
Required for Fix with AI. Get one at openrouter.ai. |
jscr.openRouterModel |
cohere/north-mini-code:free |
Any OpenRouter model ID. Change it with JSCR: Switch AI Model. |
jscr.aiRequestTimeoutMs |
30000 |
AI request timeout. |
jscr.output.tokenColors |
{} |
Optional per-token color overrides (string, number, keyword, property). Empty = inherit from theme. |
Fix with AI
Uses OpenRouter — bring your own API key.
- Get a key at openrouter.ai and paste it into
jscr.openRouterApiKey.
- Open a
.js / .ts file with a runtime error.
- Run it once so JSCR captures the error (a red squiggle marks the failing line).
- Command palette → JSCR: Fix with AI, or right-click the file → JSCR: Fix with AI.
- Review the side-by-side diff → Accept Fix or Reject.
Choosing a model
Run JSCR: Switch AI Model (OpenRouter) from the Command Palette (Ctrl+Shift+P) to:
- see the model you're currently using,
- change it by browsing OpenRouter's live catalog (free models are tagged) or entering a custom ID, and
- validate the choice — JSCR sends a tiny request with your key and confirms it works before saving.
The default cohere/north-mini-code:free works out of the box; any free-tier model is a good starting point.
Share a run
The panel header has a Save run as… button (next to Copy). It exports the current snippet and its output as either:
- Markdown — a code fence + output fence, ready to paste into a GitHub issue or PR comment.
- Standalone HTML — a self-contained, theme-coloured page you can drop into a doc or chat.
One click turns "let me screenshot this" into "here's the code, here's what it prints."
Scratch snippets
Snippets are file-backed and auto-saved with a 400 ms debounce — you'll never see a "save?" prompt. They live under:
~/.jscr/snippets/global/ — shared across all workspaces.
~/.jscr/snippets/projects/<workspace>/ — scoped to a workspace.
An JSCR Snippets view appears in the Explorer once you create one:
- 📁 Save to project (global rows only) — moves the snippet into the current workspace.
- 🗑️ Delete — with confirm.
- 🔀 Toggle language — renames
.js ↔ .ts in place, ID preserved.
- Clear all — wipes global snippets (with confirm).
How it compares
|
JSCR |
RunJS |
Quokka |
| Runs inside VS Code |
✅ |
❌ (separate app) |
✅ |
| Live inline evaluation |
✅ |
✅ |
✅ (paid tier) |
| Persistent scratch snippets |
✅ |
✅ |
❌ |
Uses workspace node_modules |
✅ |
partial |
✅ |
| AI-assisted fixes (bring your own key) |
✅ |
❌ |
❌ |
| Free to use (incl. commercial) |
✅ |
❌ |
partial |
Troubleshooting
See docs/LOCAL_BUILD_AND_USE.md § 11.
Contributing
Issues and PRs at github.com/wirekind/jscr.
Support
Questions, enquiries, or need a hand? Reach Wirekind Communications LLP:
License
JSCR Freeware End-User License Agreement (EULA) — © 2026 Wirekind Communications LLP.
JSCR is free to download and use by both individuals and companies, including in commercial settings, at no cost.
You may not modify, reverse-engineer, copy/redistribute, sublicense, rent, or sell the Software.
All rights are reserved by Wirekind Communications LLP — see LICENSE for the full terms, or contact support@wirekind.com for permissions beyond this license.
Publisher
Wirekind Communications LLP — jscr.app