Chester · typed language + tooling

Typed programs that stay honest about effects and ship as TypeScript.

Chester keeps the language small but the tooling serious: one Scala pipeline lowers to TypeScript, powers the CLI and LSP, and can live inside the browser through a shared Scala.js bundle.

TypeScript backend

Records, enums, functions, and effects lower into a predictable TS AST.

Effect story

Optional CPS rewrite keeps IO explicit when you need it.

Browser REPL
Same Scala.js bundle as the CLI

Build once with sbt webRepl/copyWebRepl and the site will serve /scala/web-repl.js to power the REPL inline.

chester · REPLCTRL+C clears the current line
  • Install site deps
    pnpm install --frozen-lockfile
  • Build the REPL bundle
    sbt webRepl/copyWebRepl
  • Run the site
    pnpm dev

What is Chester?

A typed language with an effects story and a built-in TypeScript backend, implemented in Scala with both JVM and Scala.js targets.

Why this site?

Showcase the language, ship a browser REPL backed by the real CLI bundle, and keep the getting-started story lightweight.

How to try it locally

Build the Scala.js bundle with sbt webRepl/copyWebRepl, then run pnpm dev. The same bundle powers /repl and the inline REPL below.

Effect-aware core

Functions, records, enums, and Pi types stay explicit about effects with an optional CPS rewrite when you want it.

Readable TypeScript output

Lower a Chester program into a small, predictable TypeScript AST that works for codegen experiments or direct interop.

One pipeline everywhere

The CLI, LSP, and browser REPL all run on the same Scala pipeline—no separate “web mode” to maintain.

Practical ergonomics

A small language surface that favors data-first code and preserves intent when moved between tools.