Get started

Ten minutes, one small binary, and a working website at the end. Let's go.

1. Install

One line installs both basil (the server) and pars (the language):

curl -fsSL https://herbaceous.net/install.sh | sh

Prefer to see what you're running first? Read the script, or grab a binary from the releases page — macOS, Linux, and Windows, Apple Silicon and Intel. (On Windows, download the .zip and add it to your PATH.)

2. Sixty seconds of Parsley

Type pars to open the REPL, then try a few lines:

>> @now + @7d
@2026-07-19T18:06:16Z

>> $19.99 * 3
$59.97

>> [1, 2, 3].map(fn(x){ x * x })
[1, 4, 9]

Yes — dates, durations, and money are all real types you can just write. @7d is seven days. $19.99 is money (and it won't grow floating-point crumbs when you multiply it). Type exit when you're done.

3. Your first script

Parsley was made for turning data into web pages. Save this as users.pars:

let Page = fn({title, users}) {
    <html>
        <body>
            <h1>title</h1>
            <ul>
                for (user in users) {
                    <li><b>user.name</b> " — " user.email</li>
                }
            </ul>
        </body>
    </html>
}

let emailList <== CSV(@./email-list.csv)
<Page title="Active Users" users={emailList}/>

And this as email-list.csv:

name,email
Luke,luke@example.com
Leia,leia@example.com

Run it:

pars --raw users.pars
<html><body><h1>Active Users</h1><ul><li><b>Luke</b> — luke@example.com</li><li><b>Leia</b> — leia@example.com</li></ul></body></html>

That's the whole program. HTML is part of the language, <== slurps the CSV into a table, and the for loop runs right inside the markup. No template language, no imports, no build.

4. Your first website

basil --init myapp
cd myapp
basil --dev

Open http://localhost:8080. There's your site.

Now open site/index.pars in your editor and change it:

<h1>"My first Basil site"</h1>
<p>"Today is " + @now.dayName + "."</p>

Save, and the browser refreshes itself. That's the loop: edit, save, look. There is no step three.

5. Add a page

Routes are folders. To make /about, create site/about/ with a file named after the folder:

// site/about/about.pars
<h1>"About"</h1>
<p>"This page is one file."</p>

Visit http://localhost:8080/about — it's already live. (A file called index.pars works too; the folder-named version is just easier to spot in your editor when you have ten tabs open.)

Where next?

Stuck? Something confusing? Open an issue — early feedback is a gift.