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?
- Getting Started with Parsley — a fuller tour of the language: variables, functions, dictionaries, components
- The Parsley Manual — every type, operator, and builtin
- The REPL — output modes, tab completion, and
:help - File I/O — reading and writing JSON, CSV, and Markdown
- Why does this exist? — the story, and why the quirks are quirks
Stuck? Something confusing? Open an issue — early feedback is a gift.