Open Source

Quill Code that reads like English

A beginner-friendly language that compiles to JavaScript. No semicolons, no curly braces, no confusion.

Quill
-- A friendly greeting
to greet name:
  say "Hello, {name}!"

names are ["Alice", "Bob"]
for each name in names:
  greet(name)
Python
# A friendly greeting
def greet(name):
    print(f"Hello, {name}!")

names = ["Alice", "Bob"]
for name in names:
    greet(name)

Features

Why Quill?

Designed from the ground up to be readable, teachable, and enjoyable.

📖

Reads like English

Variables use is, conditions use if/otherwise, loops use for each. Your code tells a story.

👋

Friendly errors

Error messages that explain what went wrong and suggest how to fix it. No more cryptic stack traces.

Built-in testing

Write tests with test and expect keywords. Testing is a first-class citizen, not an afterthought.

📦

Standard library

File I/O, string operations, math, dates -- everything you need is built in and ready to use.

Compiles to JavaScript

Runs anywhere JS runs. Build backends with Node.js or frontends with --browser mode.

💻

Single binary

Download one file, start coding. No runtime, no dependencies, no configuration needed.

🖊

VS Code extension

Syntax highlighting, snippets, and auto-complete. Search "Quill by TradeBuddy" in VS Code.

🔨

Built-in tools

quill fmt auto-formats your code. quill check catches bugs before you run. No plugins needed.

Quick Start

Get started in seconds

Terminal
# Install Quill (coming soon to Homebrew)
brew install quill

# Or download from GitHub
curl -fsSL https://quill.tradebuddy.dev/install.sh | sh

# Write your first program
echo 'say "Hello, World!"' > hello.quill

# Run it
quill run hello.quill

Comparison

See the difference

The same program in three languages. Which one would you rather read?

Quill
names are ["Alice", "Bob"]

for each name in names:
  if length(name) is greater than 3:
    say "{name} is long"
  otherwise:
    say "{name} is short"
Python
names = ["Alice", "Bob"]

for name in names:
    if len(name) > 3:
        print(f"{name} is long")
    else:
        print(f"{name} is short")
Bash
names=("Alice" "Bob")

for name in "${names[@]}"; do
  if [ ${#name} -gt 3 ]; then
    echo "$name is long"
  else
    echo "$name is short"
  fi
done

Live Demo

See Quill in action

These demos are powered by Quill's browser mode. The code below is real Quill, compiled to JS and running live on this page.

Demo 1

Live Greeting

 
to greetUser:
  name is getValue(nameInput)
  if length(name) is greater than 0:
    setHTML(output, "Hello, " + name + "!")
Demo 2

Counter

0
to increment:
  count is count + 1
  updateDisplay()

onClick(addBtn, increment)
Demo 3

Todo List

    0 items
    to addTodo:
      text is getValue(todoInput)
      push(todos, text)
      renderTodos()
    Demo 4

    Color Picker

    #1EB969
    to changeColor event:
      color is getAttribute(event.target, "data-color")
      setStyle(colorBox, "backgroundColor", color)

    All four demos above are written in a single demo.quill file, compiled with quill build demo.quill --browser.