Live inline execution · 12 languages · Free to use

Type code.
See results, live.

JSCR runs your code the moment you stop typing — right inside VS Code, next to every line. No run button, no terminal switching, no context loss. JavaScript & TypeScript, plus ten more languages.

Zero config Dormant when off Free — incl. commercial use
Why JSCR

A scratchpad that thinks as fast as you do

Every top-level expression is evaluated and reported next to its line — in real time, as you type.

Live inline evaluation

Every expression is reported beside its line in real time. Stop typing for 300 ms — it runs. That's the whole workflow.

File Mode + Scratch Mode

Run any .js/.ts file against your workspace's node_modules, or spin up persistent scratch snippets that survive restarts.

AI-assisted fixes

Hit a runtime error? Preview a two-column diff before you accept a single character. Works with the GitHub Copilot your team already has (VS Code 1.90+, no extra key) or a bring-your-own OpenRouter key — auto-detected, your choice.

Dormant when off

Zero background processes when the panel is closed. JSCR only works while you're watching — nothing lingers, nothing polls.

Theme-native output

Panel colors are pulled straight from your active VS Code theme — never hardcoded. It looks like it always belonged there.

Truly polyglot

First-class Python, Java, Go, Rust, C#, C++, Ruby, Groovy, Lua and Elixir alongside JS/TS — each auto-detected and running live.

Multi-file snippets

Give a snippet companion files it can import — in all twelve languages. Ordinary import, require, mod, #include: JSCR uses each language's own resolution, no project needed.

Rich output

Render instead of print: jscr.table(), jscr.chart(), jscr.image(), jscr.html(). A mini-notebook display — without the notebook.

Run in Terminal

One click runs the same snippet in a real terminal with live stdin — for menus, prompts and readline loops the live panel can't serve.

Live Web

Render a webpage, not a console. React, Svelte, Vue, Preact, Solid, Lit, jQuery or plain HTML — live as you type, in its own pane.

WASM preview

Go, Rust and Lua compile or load to WebAssembly and render as a live page in the same pane — draw, print, fetch, re-rendering as you type.

The free toolkit

Eight things you shouldn’t need an AI for

No API key. No tokens. Nothing sent anywhere. Not gated by the Assist switch — these keep working, and stay in the menu, with AI turned off. Nothing here leaves your machine.

Benchmark

Run it N times, see the real distribution — min, median, p95, max, std dev and peak memory, with a bar per run. Warmup runs are discarded so a JVM's one-time JIT cost can't skew the median, and compiled languages compile once and re-spawn — so you measure run time, not ten compiles.

Find in output

Ctrl+F in the panel. Highlight matches with a live counter, filter out everything that doesn't match, hide lines you don't want, or fold repeated lines into one ×N row. Copy and Save still export the complete run — filtering the screen never changes what you share.

Compare

Diff the last two runs, this run against an earlier one, or two snippets side by side. Or run both and diff what they actually printed — across languages. "Is my Rust port of this Python function equivalent?" answered by execution, not by a model's opinion.

Folders, tags & search

Search matches name, language, folder, tags and file content — because "where did I write that binary search?" is the real question. Nestable folders you drag snippets onto, plus tags and favorites. Folders are virtual: your files never move on disk.

Snapshots & restore

Every run quietly snapshots your code — deduplicated by hash, so unchanged re-runs cost nothing. Browse past versions, diff one against the current file, restore it. Restoring is itself undoable: the current content is saved first.

Env vars & secrets

Snippets that hit real APIs need keys — and the snippet file is the last place one should live. Ordinary values go in a per-snippet .env; secrets go to your OS keychain and the file keeps only a placeholder. Nothing that copies a snippet can carry the credential, because the credential isn't in it.

Starter templates

Four tasks — the basics, read input, parse CSV, run work concurrently — each written in all twelve languages, standard library only. Every one of the 48 combinations is executed against its real toolchain before shipping, so a fresh template always runs.

Shared team workspaces

Point JSCR at a folder your team already syncs — cloud drive, network share, or a git repo you manage yourself — and it becomes another root in the tree. JSCR doesn't run git for you; it delegates sync to whatever already does it. Secrets are never shared.

Local, always

Benchmarks, diffs, search, snapshots, secrets — all computed from files on your disk and processes JSCR ran itself. No key to configure, no request budget to watch, nothing sent anywhere. Turn AI off entirely and every one of these still works.

Build the habit

Learn where you already work

Turn the scratchpad into a daily habit — a streak you don’t want to break, guided courses, and a challenge a day. Right where you already write code, no course site, no second tab.

Streaks

A 🔥 N in your status bar that grows every day you practice or solve a challenge — and quietly resets if you skip one. The visible number that turns “tried it once” into “open it daily”.

Courses

Guided tracks — one per language, all twelve (Learn Rust Basics, Python for Interviews, Java Essentials, C++ Foundations…) — a few minutes a lesson. Built on the AI tutor: each lesson runs a preset practice session and advances you to the next when you finish.

Advanced Path

An Advanced track for every language, open any time: six progressive stages — SOLID, the GoF Design Patterns (creational, structural, behavioral), Clean Code & Code Smells, and Refactoring. Every lesson is a runnable example plus an interview-oriented card: why it matters, real-world uses, common mistakes, interview questions and an exercise. Curated for Java, C#, TypeScript/JavaScript, Python & C++; AI-generated on demand for the rest.

Daily Challenges

Today’s problem, solved in any of twelve languages and graded by real execution against hidden test cases — no AI needed. December turns it into an Advent-of-Code-style run, and every solve gives you a shareable card.

Runtime-aware AI

AI that reads your run, not just your code

Static editor-AI reads your source and guesses. JSCR's AI also sees the actual run — real per-line values, real errors, real output, real timing — so its answers are grounded in what your program did. Powered by the GitHub Copilot you already have (VS Code 1.90+, no extra key) or your own OpenRouter key; one master switch gates all of it.

① Understand a run
Make sense of what just happened.
Error Tutor
Plain-language why your code broke — it teaches the misconception instead of dumping a patch. When there's no error, it's a quick code review.
Explain This Value
Why one line produced the value it did, traced through the real runtime values from this run. Click an inline result to ask.
Output Diff
Why the output changed between your last two runs — tied to your edit, or pointing at the source of nondeterminism.
AI Program Input
Reads what your program reads from stdin and generates a typical input plus an edge-case one, dropped into the input box.
② Change code — with proof
Every change is verified by running it.
Fix with AI
Sends your code + the captured error and previews a two-column accept/reject diff before a character changes.
Performance A/B Lab
Proposes a faster version, runs both, and shows measured timings + a behavioral-equivalence verdict + a diff to apply.
Freeze Behavior as Tests
Turns the snippet's current observed output into an idiomatic test file (Jest / pytest / JUnit / …) — a snapshot before a refactor.
Self-Repairing Snippet
Describe a goal; the AI writes it, JSCR runs it, and the real error is fed back to fix-and-retry until it runs clean.
Verified Translation
Port a snippet to another language, run both and diff outputs until they match — then saved as a runnable snippet.
③ Always-on guards
Catch divergence the moment it appears.
Intent Comments auto
Annotate a line with //? stating what it should do; JSCR flags it inline when the real output disagrees.
Surprise Detector auto
Flags outputs you likely didn't intend — NaN, blanks, a swallowed error, an off-by-one count.
Explain Flakiness
Runs the snippet N× on the same input and names the source of nondeterminism when results diverge.
Hunt Counterexample
Fuzzes your stdin to find one input that breaks it, then loads it in so it reproduces live.
Minimize Repro
Shrinks a failing input to the smallest slice that still reproduces the same failure, and explains why.
④ Investigate & verify
Ground-truth answers, not guesses.
Hallucination-Proof API Probes
Writes a probe that exercises your real installed library and runs it — answering strictly from what happened, so it can't invent an API. All 12 languages, incl. Rust, Java & C++.
Execution Time-Travel + AI Blame
Keeps a rolling history of past runs; step back through them, and Blame attributes the current result to the run that introduced it.

JSCR Assist (default on) is the master circuit breaker — flip it off and every AI feature is disabled and hidden, and any on-screen card is dismissed. Uses your GitHub Copilot by default on VS Code 1.90+ (no extra key — great for teams on GitHub Enterprise/Business Copilot), or bring your own OpenRouter key (a free model works out of the box) — auto-detected, and switchable any time. Every feature works across all twelve languages.

★ Milestone feature

Practice with AI — turn any snippet into a coding tutor

Right-click any file → JSCR ▸ Practice with AI, and the Live Output panel becomes an interactive classroom. You learn where you already work — no course site, no second tab, no context switch. Type any topic you want (it's not a fixed curriculum) and drill it against a real runtime.

Graded on what your code did

In Written Answer the AI writes a complete, runnable starter into the snippet — the problem as comments plus the language's boilerplate, cursor dropped exactly where you finish it. Submit, and it grades your code against its real execution output — not a guess about what it would print.

Four modes, four learning styles

Written for hands-on building, Multiple Choice for fast recognition, Fill in the Blanks for recall, and Implement Template for building a real UI component. MCQ and Fill are graded instantly on-device against the answer key — no extra request, no waiting.

Ladder up the difficulty

Four levels — Easier → Medium → Hard → Complex — so the same topic grows with you. Your level, mode and session length persist per snippet.

Feedback you actually read

Every verdict comes with a 👍/👎 and an explanation of why. Advancing is manual — a wrong answer stays put so you can retry, or skip. A pinnable Info Pane offers a hint and the expected output when you're stuck.

Sessions & a scorecard

Run 2–50 questions or an endless Stream ∞. Finish on a dashboard with your passed / failed / skipped tally and passing rate — then Restart or close.

Practise anything, anywhere

All twelve languages — plus unknown file types, so you can drill any technology as plain text. Learn a new language, prep for interviews, or get fluent in a library against the deps you actually installed.

Implement Template — build real UI

Pick React, Vue or Angular in the drawer and build a real component against a curated, AI-varied task. A left pane shows the problem plus a non-inspectable Target Preview (rendered to an image, so its DOM and data-testids can't be read); you write only the component, and Run Tests / Submit grade it with real Jest cases (~5–40, scaling with difficulty). Frameworks and Jest tooling download on demand into ~/.jscr — nothing bundled.

Save a template for later

Persist any template challenge and pick it back up whenever you want. The whole challenge is saved to ~/.jscr/templates — the drawer config, the problem, the hidden Jest tests, the Target Preview and your in-progress code — then browsed under All Global Templates in the snippets tree, with a hover preview. Resume exactly where you left off; it leaves the store when you Submit or Delete it.

Questions render as formatted, syntax-highlighted code blocks in a modern drawer UI. Every session is isolated per snippet, so switching editors shows each one's own practice state. Gated by JSCR Assist like every AI feature — flip it off and it's gone.

Polyglot engine

Twelve languages, one live panel

Each toolchain is auto-detected on startup and cached, so launches stay instant. A language only appears when a supported version is found — everything else keeps working regardless.

JavaScript
JavaScript✓ npm install
Node 17+
TypeScript
TypeScript✓ npm install
3.8+
Python
Python✓ pip install
3.7+
Java
Java✓ Maven / Coursier
JDK 11+
Go
Go✓ go modules
1.11+
Rust
Rust✓ cargo (crates)
1.39+
C#
C#✓ NuGet
.NET 6+
C++
C++✓ header-only libraries
14+
Ruby
Ruby✓ gem install
2.5.1+
Groovy
Groovy✓ Grape / @Grab
2.5+
Lua
Lua✓ luarocks
5.3+
Elixir
Elixir✓ Mix.install (hex)
1.9+

The small label under each language is its one-click package install — when a run hits a missing dependency, JSCR offers to fetch it into an isolated ~/.jscr store and re-runs. Every banner has an editable version selector (default latest, or pin any version — e.g. drop a broken latest back to a known-good release) and an Install Troubleshooter that diagnoses a failed install (deprecated / moved / renamed, version conflict, corrupt download, permissions) and, for Java/Groovy, offers a safe direct-download from Maven Central. Browse and remove what you've installed in the All Global Packages view — per language, with version, size and date, one-click delete. Every one of the twelve languages now has a package-install path.

C++ has no package manager of its own, so JSCR fetches the library itself — a curated catalog of header-only libraries (nlohmann/json, {fmt}, spdlog, Eigen, GLM, EnTT, Asio, doctest, Catch2, cpp-httplib, cereal, magic_enum, nameof, cxxopts, CLI11, argparse, toml++, range-v3, date, GSL, tl::expected, nanoflann, unordered_dense, ConcurrentQueue, tabulate and utfcpp) downloaded from each project's own release into ~/.jscr/cpp/include, which is already on every compile's -I. A missing #include is matched to its library and one click installs it; any flags it needs (-DFMT_HEADER_ONLY, the socket libs for cpp-httplib) are applied automatically, so the snippet declares nothing. Libraries that need compiled binaries and linker flags (OpenCV, Qt, Boost) are explained rather than half-installed — a single-file playground has nowhere to put them — and you can still drop any header-only library into that folder by hand.

Package install shells out to each language's own package manager, so that tool must be installed. Java uses Coursier to resolve a Maven group:artifact:version (with transitive deps) into ~/.jscr/java/lib — run with the JDK you already have (or a cs/coursier on PATH), so nothing extra to install. Lua needs luarocks — a separate download from the Lua interpreter; install it and add it to your PATH (or set jscr.luarocks.path) to enable Lua package install. Lua snippets still run without it. Pure-Lua rocks (e.g. dkjson, inspect, serpent) install in one click; C-extension rocks (e.g. lua-cjson, luasocket) additionally need Lua dev headers + a C compiler, so a binary-only Lua can't build them. luarocks targets Lua 5.1–5.4. Elixir uses hex via inline Mix.install.

Compiled languages (Go, Java, Rust, C#, C++) re-compile and run live on an idle debounce — never mid-keystroke. Turn it off per language to run on demand.

Multi-file snippets

One snippet, many files — in every language

A scratchpad shouldn't cap out at one file. Give a snippet companion files and JSCR runs them together — using each language's own resolution, so you write ordinary code, not JSCR-flavoured code.

  • Python import · Ruby require_relative · Lua require · Go same-package · Rust mod · C# project globbing · C++ headers + extra units · Groovy classpath · Elixir -r.
  • Java switches to a real javac compile; JS/TS get an in-vm module loader — TypeScript companions transpile automatically.
  • Manage them from the tree, or drag a snippet onto another to make it a companion — and drag it back out to make it standalone.
  • Edit a companion and its entry re-runs live.
JSCR Snippets
snippet-a1b2.py · +2
helper_math.py
helper_greeting.py
// entry
from helper_math import add
5 + 7 = 12
Rich output

A mini-notebook display — without the notebook

Text is a poor way to read a dataset. Call the ambient jscr API — no import, just like console — and the panel renders instead of prints.

  • jscr.table() — an array of objects, array of arrays, dict of columns, or a pandas DataFrame (duck-typed; pandas is never imported).
  • jscr.chart() — bar, line, scatter, area, pie and donut, drawn as inline SVG that matches your VS Code theme. No charting library, no bloat.
  • jscr.image() and jscr.html() — the latter in a sandboxed iframe, never the panel's own DOM.
  • Blocks sit in the same line-anchored grid as your other output. In JavaScript, TypeScript and Python today.
Live Output
jscr.table(rows)
┌────────┬──────┐
lang runs
Python 12
Rust 3
└────────┴──────┘
Live Web

Render a webpage, not a console

Some code isn't meant to print — it's meant to look like something. Open a React component, a Svelte file, a Vue SFC or plain HTML and JSCR renders the page, live as you type, in its own pane beside the editor.

  • React (.jsx/.tsx), Svelte, Vue (SFC or JS API), Preact, Solid, Lit, jQuery, plain DOM code and static HTML.
  • Nothing is bundled into JSCR. Frameworks and their compilers resolve from your own store — one-click Install Package is all it takes.
  • Auto-detects web source — conservatively, so an ordinary console snippet is never hijacked. One click in the tree toggles console ↔ webpage, and your choice sticks.
  • Build errors, missing packages and runtime errors surface in the pane — never a blank page.
  • Not just JS. Go, Rust and Lua render here too — compiled or loaded to WebAssembly. See the WASM preview ↓
JSCR — Live Web · React
const [count, setCount] = useState(0);
return <button>clicked {count}</button>;
clicked 3
↑ a real, running page
Live Web · WebAssembly

Go, Rust & Lua, rendered as a live web preview

Live Web isn't only for JS frameworks. Write Go, Rust or Lua, flip the WASM toggle, and JSCR compiles or loads it to WebAssembly and runs it right in the pane — drawing to a canvas, printing to a console, calling fetch — re-rendering as you type, in the same sandboxed webview React and Vue already use. No server, and no extra install for the toolchain you already have.

Go — zero install

The js/wasm target is built into Go. JSCR builds your code with GOOS=js GOARCH=wasm and the wasm_exec.js that already ships in your GOROOT — nothing to add. Draw and print through syscall/js.

Rust — detect & guide

Builds for wasm32-unknown-unknown and runs wasm-bindgen — the cleanest DOM story of the three via web-sys. Missing the target or bindgen? JSCR explains the one-time setup in the pane, never an opaque failure.

Lua — no toolchain

JSCR ships a Lua 5.4 compiled to WASM runtime (wasmoon) and runs your script inside it — nothing to install at all, works offline. It injects document/canvas globals so a snippet can draw or print.

How to use it

One toggle, remembered per snippet

  • Open a .go, .rs or .lua snippet and click the WASM button in the Live Output header — it flips that snippet from console to a rendered WASM page.
  • The choice sticks per snippet, and ordinary console runs are never hijacked — a normal Go/Rust/Lua run still prints to the console until you ask for the preview.
  • Re-renders live as you type (debounced for compile cost). Build and link errors show in the pane with the real compiler message — never a blank page.
  • It's a browser sandbox: compute, draw, print and fetch through JS glue — no raw sockets, threads or real filesystem. The right ceiling for a preview, and the same one every webview has.
JSCR — Live Web · WASM · Go
canvas := doc.Call("getElementById", "c")
ctx.Call("arc", 60, 40, 30, 0, 6.28)
ctx.Call("fill")
↑ Go, compiled to WASM, drawing live
Program input

Interactive programs that never hang

For code that reads stdin — Java Scanner, Python input(), Go fmt.Scan — type your input ahead of time in the Program Input box.

  • One value per line, remembered per snippet.
  • JSCR feeds it in, then closes stdin — a read past your input fails fast instead of waiting for a human.
  • The live re-run never blocks on a prompt again.
  • Need a real back-and-forth? Run in Terminal launches the same snippet in a PTY with live stdin — same compile, classpath, packages and companions.
Program Input
Alice
30
// java Scanner reads →
Hello Alice, age 30
Share a run

From "let me screenshot this" to "here's the code"

The panel's Save run as… button exports your snippet and its output in one click.

  • Markdown — a code fence + output fence, ready to paste into a GitHub issue or PR.
  • Standalone HTML — a self-contained, theme-coloured page you can drop into any doc or chat.
run.md
```js
console.log('winner:', top)
```
Output
winner: linus
SQL & NoSQL

Query 19 databases — live, in the same panel

Beyond the twelve languages, JSCR turns a query file into a live database client. Write a query in the database's own syntax, press one shortcut, and the rows render as a rich table in JSCR — Live Output — with execution time and row counts, right where you already work. No new runtime: SQL rides the JVM JSCR already detects, and each NoSQL family runs over its native driver.

12 relational · one-click JDBC drivers

PostgreSQL MySQL MariaDB SQLite H2 Firebird Oracle SQL Server IBM DB2 SAP HANA Snowflake Cloud Spanner

7 NoSQL · native drivers & REST

MongoDB Cassandra Couchbase DynamoDB Redis CouchDB HBase

Amazon Aurora uses the PostgreSQL/MySQL driver. Drivers install one click from a picker into an isolated ~/.jscr/db_drivers store (Coursier, like a Java library) — except CouchDB/HBase, which need no driver at all (the JDK's built-in HTTP client).

Connect once, reuse everywhere

A single dialog with real labeled fields per family — host, port, bucket, keyspace, region — not a raw URL to guess at. Connections are reusable global profiles with a Test Connection button; the password goes to your OS keychain (Windows Credential Manager / macOS Keychain), never to disk and never on the process command line.

Write it in the database's own language

SQL for relational. And each NoSQL family the way you already know it: MongoDB shell (use db, db.users.find(), show collections), Cassandra CQL, Couchbase N1QL, DynamoDB PartiQL or the AWS CLI (aws dynamodb scan …), Redis commands, CouchDB HTTP requests, and HBase shell (put / get / scan / create).

Run it live → JSCR — Live Output

Press Ctrl+Shift+Enter (macOS +Shift+Enter) and results render in the JSCR — Live Output panel — a rich table (or JSON) with execution time and row counts, themed to your editor. Read-only queries also auto-run as you type on a short debounce.

Safe by default

Auto-run executes reads only — a SELECT, a Mongo find, a Redis GET — on a read-only connection, so a write can never fire from a keystroke. A write in the buffer shows a "this looks like a write — press Run" banner and executes only on an explicit Run, and a connection can be marked read-only to block writes even then (production databases).

Browse the schema

A schema pane lists each family's own kinds — databases and tables, MongoDB collections, Cassandra keyspaces, Redis keys, DynamoDB tables — so you can explore a connection without leaving the panel.

Reach private databases, safely

Tunnel any host/port connection through an SSH bastion (custom port, private-key file or password — the SSH secret lives in the keychain too). Trust a private CA with a TLS certificate file for Couchbase / Cassandra / MongoDB. And per-family scale guards — a row cap with an honest "truncated" caption, streaming fetch, a query timeout and a per-cell cap — are always on so a huge result can't wedge the pane.

Connect & run

From zero to rows in three steps

  1. Add a connection. Run “JSCR: New database query”, pick a database (a badge shows whether its driver is already installed), and fill the labeled fields. Hit Test Connection — a green ✓ means you're wired up. The profile is saved and reusable.
  2. Write your query in the file's native syntax — a .sql statement, a .mongodb shell command, a .dynamodb AWS CLI line, a .redis command, and so on.
  3. Press Ctrl+Shift+Enter — on macOS +Shift+Enter. The rows appear in JSCR — Live Output as a table. Reads also auto-run as you type; a write waits for your explicit Run.

Prefer a specific value? Everything is tunable via jscr.sql.* and jscr.<family>.* — debounce, row cap, fetch size, timeout, cell cap.

users.mongodb — mongodb-prod
# reads auto-run · writes press Run
db.users.find({ city: "Mumbai" })
JSCR — Live Output
namecity PriyaMumbai RahulMumbai
2 rows · 41 ms
How it compares

Everything you liked, none of the walls

Capability JSCR RunJS Quokka
Runs inside VS Codeseparate app
Live inline evaluationpaid tier
Persistent scratch snippets
Uses workspace node_modulespartial
10-language polyglot engine
AI-assisted fixes (Copilot or BYO key)
Free — including commercialpartial

Install JSCR in one click

Open the Extensions view, search JSCR, hit install — then press Ctrl+Shift+J.