Sabline
Run code an AI wrote without handing it everything you can reach.
Each function declares what it may touch. You grant the run one folder, one host or a number of calls, and the runtime refuses anything else the moment it's tried.
Formerly Velaris: the project was renamed in 8.6.0, and everything written for the old name still works in 8.x.
Who it is for #
The person about to run a program a model wrote - on a laptop, in CI, behind an MCP server - who wants what it can touch to be bounded by what they said, not by what the program says about itself. It bounds programs written in Sabline, not a Python or shell script the same model might write instead.
See it refuse, in one command #
No arguments, no network, under a minute. It writes the kind of script an agent writes - read ./.env, post it to a webhook - runs it, and shows the refusal, its line and the run's receipt; then the same task inside a budget, and what differs between the two receipts. It writes what it runs, and reads nothing of yours.
pip install sabline-lang
sabline demo1. A script that reads ./.env and posts it to a webhook. No budget is given, so it gets io:
$ sabline agent_script.vel --receipt refused.receipt.json
line 6: check read_file("./.env") {
error[E310] 'read_file' needs the 'fs' effect, which this run does not allow (it allows: io)
exit 1. receipt: refused; E310 (fs) at line 6; grants used: none
2. The same task inside a budget: one file to read, one directory to write, no network:
$ sabline inside_budget.vel --allow io,fs:read:settings.txt,fs:write:out --receipt allowed.receipt.json
3 setting(s); the report is in out/report.txt
exit 0. receipt: ok; grants used: fs:read:./settings.txt x1, fs:write:./out x1It is not a security boundary by itself: an interpreter in the program's own process enforces the budget. From 8.4 the operating system is asked to hold the same budget under it - fully on Linux, partly on macOS and on Windows. The threat model says what that leaves open.
Try it
Install it and work through the tutorial, about an hour. The playground runs the same compiler in a browser, with nothing installed.
Review it before running agent code
For a person about to run a program a model wrote. The threat model says what Sabline defends against and what it does not; sabline audit says what one program can touch, before it runs.
For a model
The whole language as one plain-text page, written to be given to a model before it writes Sabline. Every compiler error names it.
Guides #
Each starts from how people describe the problem, says first what it does not do, and shows a refusal that runs on every push.
- Why should it have Internet access? Scripts that reach only the hosts you name
- Before I ever have a chance to inspect it: what a script will touch, before it runs
- Access to everything, or nothing? Giving an agent's code only what the task needs
- The lethal trifecta, one run at a time: a script that reads private data but cannot send it
- Secrets that should never leave my machine: running an agent's scripts without your .env
Compared, losses first #
Each comparison opens with where the other tool is ahead of Sabline.
- Sabline compared with Deno's permissions
- Sabline compared with WASI (wasmtime)
- Sabline compared with CaMeL
- Sabline compared with a Python sandbox (smolagents)
- Sabline compared with AILANG
Incidents #
The incident catalogue: publicly reported incidents in this lane, each with whether a program of the same shape is refused.
The paper #
Sabline: effects in signatures, budgets at run time, and a baseline for a repository's capability surface - the design, the implementation, and where other work is ahead. PDF.
Install #
pip install sabline-lang
sabline doctor
sabline new hello && cd hello && sabline main.velA standalone executable for Windows, Linux and macOS is attached to every release.
What a signature says #
The promise below is checked for every input before the program runs, and the compiler hands back the input that breaks it:
fn discount(price: Int) -> Int
requires price >= 0
ensures result >= 0
{
return price - 10
}error[E700] promise cannot be kept: 'discount' ensures result >= 0
proven without running the program: price = 5 gives result = -5Where things are #
- Language reference: what the language means, precisely.
- Standard library and errors: generated from the compiler.
- Floats: why the prover works in IEEE-754 and not in real numbers.
- Embedding: Sabline as a library, a door, an MCP server and a GitHub Action.
- Stability and the changelog: what may change, and what did.