Six languages, one binary
JavaScript, TypeScript, Python, Ruby, Go, and Rust live inside the same Monaco-powered window. No project scaffold to test an idea.
Multi-language code runner · Desktop & web
Lingua is the playground senior developers reach for when they want to throw a 10-line script at six languages without spinning up a project. Desktop-first, source-available, and plain about what runs where.
No install — runs in your browserView on GitHub
const sizes = [512, 1024, 4096];
const kib = sizes.map((n) => n >> 10);
console.log(kib);type Lang = 'ts' | 'py' | 'go';
const active: Lang = 'ts';
console.log(active.toUpperCase());from pathlib import PurePosixPath
path = PurePosixPath("src/runner/python.py")
print(path.suffix)records = [{ name: "Ada", score: 98 }, { name: "Linus", score: 95 }]
leaders = records.select { |record| record[:score] >= 96 }
puts leaders.map { |record| record[:name] }package main
import "fmt"
func main() { fmt.Println("hello from your local go toolchain") }fn main() {
println!("local rustc, no project required");
}Why Lingua
JavaScript, TypeScript, Python, Ruby, Go, and Rust live inside the same Monaco-powered window. No project scaffold to test an idea.
Pyodide v0.29.4 ships inside the desktop binary. Open Lingua on a plane, write Python, hit run. The web build does the same after the first load.
Switch a JS or TS tab to the desktop Node runtime and you get the real thing: fs, path, http, and require() of every package already in your project node_modules. Lingua spawns Node directly — never through a shell — with an allow-listed environment.
Nothing leaves your machine until you opt in. We never transmit your code. Read the privacy page — it says exactly what we collect when you do turn it on.
Past runs stay close to the editor, so a quick scratchpad can still show what changed between attempts.
Shipped in Lingua
Captured from current builds, not mockups. Each workflow states where it runs and when it needs Pro; the complete technical record lives in the changelog.

Free · web + desktop
Set pause points, conditions, and logpoints in the Monaco gutter, then step through JavaScript or TypeScript with watches, locals, and call stacks in one bounded debugging surface.

Pro · web + desktop
Mix code and Markdown, share state across cells, and keep old output visible when an edit invalidates downstream work. Lingua marks the affected cells and replays them only when you ask.

Free · web + desktop
Build HTTP requests, live SSE or WebSocket sessions, secret-aware environments, response captures, assertions, and named pipelines without moving an API workflow into another app.

Desktop · trusted local shell
Open one explicit, project-rooted terminal session with a filtered environment and bounded transcript. Lingua names the trust boundary clearly: it is your real local shell, not a sandbox.

Desktop · local toolchains
Compare the exact detected runner and command before launching Vitest, Jest, Pytest, Go, or Cargo. Output streams live, Stop is always available, and execution stays no-shell and bounded.

Desktop · local + read-only
Expose only the project you opened through a loopback-only, session-token-protected MCP server. Its tools are read-only, capability-scoped, and revoked automatically when the project or app closes.
A steady record of local-first progress. Expand any version for its highlights.
AI assistance · Pro
Opt-in, bring-your-own-key, and local-first. Point it at a local model (Ollama, LM Studio) and your code never leaves the machine — or use any OpenAI-compatible endpoint. Lingua ships no default key and makes no background calls; every request shows you the exact payload first.

When a run fails — a notebook cell, the console, a SQL query, an HTTP request — one click explains what went wrong and streams a fix, aware of where your code actually ran. Ask follow-up questions in the same thread.
When the answer proposes a fix, apply it behind a full diff preview — replacing your code never happens blind — and Lingua re-runs it. Error → explain → apply → green.
Describe a query in plain English and get DuckDB SQL back. Only the live schema is sent — never your rows — and you review the query before it runs.
A local model means code never leaves your device. Obvious secrets are redacted before the preview, and the key lives only in Settings — never in exports, capsules, share links, or telemetry.
Inside the app
No mockups below — every frame is the shipping app captured mid-task on the production web build.

Pyodide boots in a worker, stdout streams into the console, and each top-level statement shows its value inline next to the code. The wall-clock time of every run lands in the console too — timing is output, not a claim.

Cmd+K searches everything at once — commands, snippets, templates, and every developer utility. Type three letters, hit Enter, keep coding.

JSON formatter with a tree viewer, JWT debugger, mock data, hash and UUID generators — plus Utility Pipelines that chain them into one-click workflows. Each one runs locally in the same window, so quick tasks stop costing you a browser tab.

Drop a CSV, JSON, or Parquet file and it becomes a queryable table on the bundled DuckDB engine — results grid, one-keystroke query formatting, and per-column profiling included. Your local Run Ledger is queryable from here too.

Requests, query params, auth, environments, and response capture live in one workspace tab. Send and read the pretty-printed body with status, timing, and size right where you code.

Telemetry ships off and stays off until you flip it. The Run Ledger records locally, sensitive headers are redacted by name, and the redaction preview shows exactly what would leave your machine — nothing.
Language matrix
Six languages execute today. Six more are useful for opening, reading, and lint-adjacent workflows, but they are not runnable yet.
Developer utilities
The browser tabs that usually orbit a code runner — JSON formatter, regex, JWT, diff, hash, cron, color, the lot — already live inside Lingua.
One install. Six languages. No project to spin up.