Bicep

Bicep is a full peer language to Terraform on the same canvas. Open your .bicep and .bicepparam files and you get the same graph: params, vars and outputs as nodes, resources as nodes, references as wires, and the value each row resolves to shown in place. The engine is a hand-rolled Bicep lexer/parser/evaluator compiled to the same WebAssembly bundle — no Bicep CLI is required, and your code never leaves your machine.

The same canvas, the same moves

Everything you do with Terraform you do with Bicep:

  • Trace — click a row and its whole lineage lights up while everything else dims.
  • Resolve — see the computed value, not the expression, with a mark that says how it got there.
  • Edit — drag a wire’s source dot to re-point a reference, or type a new expression in the properties panel. It is validated as Bicep before it can touch a file.
  • Review and Save — every change shows its exact one-line diff, staged until you press Save. Only the expression you changed is rewritten; comments, alignment and ordering stay exactly as you wrote them.
  • Analyze and Show Diffs work the same way. Upgrade Preview and copy-between-canvases are Terraform-first for now.

See The canvas and Editing for the shared mechanics.

What maps to what

If you already know the Terraform experience, here is how Bicep lines up:

Terraform Bicep
.tf source files .bicep source files
.tfvars values file .bicepparam file
variable param — addressed as var.<name>
locals var — addressed as local.<name>
output output — addressed as output.<name>
a resource (aws_instance.web) a resource by its symbol (sa, or a nested child sa::blob)
simulated workspaces not applicable — use more than one .bicepparam file

Environments are .bicepparam files

A Bicep canvas does not have simulated workspaces. Instead, add more than one .bicepparam file to the canvas — each is already its own environment (dev.bicepparam, prod.bicepparam) and each is evaluated in place.

One canvas holds one language

A canvas is Terraform or Bicep, never both — the first file you add decides which. If you point one at a folder that contains both kinds, SchematIaC asks you to add them separately rather than guessing.

Modules

A local Bicep module (a referenced .bicep file) loads as a box with input and output ports, like a Terraform module. A registry module (br:) shows as a box with a note rather than real ports — there is no local vendoring step to resolve it against yet.

What is not evaluated yet

  • Loop resources ([for ...]) render as a single node, the same way Terraform’s count/for_each do.
  • User-defined Bicep functions (func) are not evaluated; rows that use them read unresolved rather than guess.
  • The Folder Overview is Terraform-only for now — a Bicep folder opens straight on a canvas instead.

The full list lives in Limits.

Bring your AI agent

The same Bicep engine is available to AI agents over the MCP server: your agent can read the graph, resolve a value, and get a validated Bicep diff for a proposed change — still local, still no CLI binary.