Skip to content
Project Hollowâ„¢Docs
Hollow AIHollowScriptAppsPlatformDocs
GuidesAPILanguage
Start hereOverview
HollowScriptOverviewSyntaxStandard libraryCapabilities & sandboxing
HELOverviewSyntaxOperators & valuesDates, ranges & sentinels
Documentation

Language reference

Hollow ships two small languages. HollowScript is what a Cascade Code step is written in. HEL is the query syntax used by search boxes, saved views, smart lists and task-intake routing rules, wherever Hollow needs someone to type a filter by hand and get it right first time. Neither knows the other exists.

  • HollowScript: Capability-safe scripting for Cascade.
  • HEL: The filter syntax behind every search box.
HollowScript

HollowScript

Real functions, real types, real control flow, exactly like any language you already know, plus one rule the language itself enforces: a script can only reach the parts of Hollow you hand it, and it has to say so, in plain sight, before it ever runs. Every Cascade Code step written in HollowScript uses the .hws extension.

On this pageSyntaxStandard libraryCapabilities

Syntax

The shape of the language, annotated against a real step.

// runs as a Cascade step, nothing more, nothing less
uses tasks, notify

constant urgent =
  effect tasks.where(`status:open priority:high`)

for task in urgent {
  match task.owner {
    none { effect notify("team", "Unassigned: ${task.title}") }
    else { effect notify(task.owner, "Urgent: ${task.title}") }
  }
}
uses
Declares every module the script can reach. Nothing outside this list is callable.
constant
Binds a name to a value. HollowScript has no mutable variables.
effect
Marks a call that leaves pure computation, so the runtime can audit and rate-limit it on its own.
`…`
A backtick string is HEL, not HollowScript. .where() is the one place they meet.
for … in
Iterates a list.
match … { }
Exhaustive pattern matching; the compiler rejects a match missing a case rather than falling through silently.

Standard library

Modules mirror the suite's native tool set; import only what a step needs with uses.

tasks
Query, create and update tasks, the same actions Hollow AI's tool has.
notes
Read and append to notes.
calendar
List and create events.
files
List, move and read file metadata.
notify
Send a message to a person, a channel or the bell.
http
Call an external endpoint; same sandbox as Cascade's HTTP step.
time, json
Pure helpers: no capability declaration needed, they touch nothing outside the script.

Capabilities & sandboxing

  • Declared, not ambient. The uses line at the top of the file is the complete capability surface. Nothing outside it is reachable, and nothing needs a runtime permission check to prove it.
  • Every effect is auditable. Calls marked effect are logged individually in Lumen alongside the step's own run log.
  • Isolated and bounded. Each run gets its own sandbox with a CPU and time budget matching the step's own timeout; nothing a script does can affect another run.
  • Fails loud. A panic is caught at the step boundary and reported to the run's log as a failure, never a silent no-op.

See it running inside Cascade →

A second, separate language

Hollow Expression Language (HEL)

A small, independent language for filtering records, shared by search boxes, saved views and smart lists across every Hollow app, and by the routing rules that file work arriving over the Tasks API. HollowScript embeds it for .where(), but HEL has no knowledge of HollowScript and works anywhere Hollow needs a query someone can type by hand and get right first time.

On this pageSyntaxOperatorsTokens

Syntax

status:todo priority>=high -tag:chore
due<today+7 OR (assignee:none AND starred)
  • Open, high-priority-or-above, and not tagged chore, on line one.
  • Due within a week, or unassigned and starred, on line two.
  • Reads left to right. No query builder, no separate mode to learn.

Operators & values

Operators
: equals, contains or is one of; = and != exact; < > <= >= for dates, numbers and ranked fields like priority.
Values
Words, "quoted phrases", numbers, dates as 2026-07-01, ranges as a..b, and today/today+7.
Combining
A space is AND. OR branches. A leading - or NOT excludes. Parentheses group, so precedence is never a guess.

Dates, ranges & sentinels

HEL has no function-call syntax: it isn't Turing-complete, and that's deliberate. A handful of tokens cover the cases a filter actually needs.

today
Resolves at query time to the current date. today+7 and today-1 offset by days.
a..b
An inclusive range, for dates or numbers.
none, any
Match a field that's empty, or match a field that's set to anything.

What each field means, such as which values rank like priority, is defined once per app; HEL itself has no idea what a task or a bill is. It never rejects a query outright: a half-finished one still returns a best-effort result, so a search box can filter live on every keystroke instead of waiting for enter.

Project Hollow

Hollow AIAppsPlatform

Documentation

OverviewGetting startedHollow StudioApp reference

Account

Sign inCreate accountEarly access

Legal

PrivacyTermsContact
© 2026 Project Hollow