A typed workflow language with capability-gated side effects.

Compiles to a verified artifact. Runs one recorded step at a time. Calls only what the host has granted. Below, the real compiler and runtime in Wasm.

release.gr
import core from "grapheme/core" struct Release {  service: String  step: Float  status: String} glyph Main { Rollout } query Rollout on Any -> Release {  Release { service: "checkout", step: 0.0, status: "ramping" }  |> Ramp} iterator Ramp on Release -> Release @core_default @loop(max: 10, merge: "replace") {  match $state.status {    case complete => return    default => Advance  }} mutation Advance on Release -> Release @core_default {  inc_field(field: "step")  |> if $state.step >= 3.0 then set { status: "complete" } else set { status: "ramping" }}
loading runtime
final state
{
  "service": "checkout",
  "status": "complete",
  "step": 3
}

Fails closed

Call a module the host didn't grant, and the run stops there.

This host grants only the Wasm stdlib. http.get compiles, then is refused at step 01.

needs-http.gr
import http from "grapheme/http" query NeedsHttp {  http.get(url: "https://example.com")}
ready
final state
capability 'http.get' is outside the Wasm stdlib profile;
host must provide grapheme.runtime.host.v1::call.capability

Next: change release.gr and run it.

Open the playground

CLI: cargo install --git https://github.com/entasislabs/grapheme.git grapheme-cli --bin grapheme Quickstart →