Why Pulumi (not Terraform)?
ubx uses Pulumi as its runtime because:Output<T>type system — Pulumi’sOutput<T>is the right primitive forPending<T>. Terraform has no equivalent.- Multi-language support — Pulumi providers work with TypeScript, Go, Python, Java.
- Automation API — Programmatic control over plan/apply without subprocess calls.
- Component Resources — First-class support for reusable component abstractions.
ubx convert --from terraform).
Why HCL-inspired syntax (not YAML)?
- YAML is whitespace-sensitive and error-prone for complex nested structures
- HCL is familiar to the largest IaC user base (Terraform)
- Block-based syntax maps naturally to cloud resource declarations
- Comments, string interpolation, and expressions are first-class
Why a ~ sigil for Pending<T>?
The ~ prefix makes Pending<T> references visually distinct at a glance:
${} (clashes with interpolation), @{} (less readable), no prefix (ambiguous).
Why single label for component?
source already expresses the type. Single label is consistent with input, output, local.
Why output not export?
export has TypeScript connotations. output is familiar to Terraform/OpenTofu users and matches the ubx output CLI command.
Why no OPA for policies?
Thepolicy block evaluates conditions at compile time using a simple boolean expression evaluator. This eliminates:
- External OPA server dependency
- Rego learning curve
- Network calls during
ubx validate
Why BYOK for AI features?
Bring Your Own Key (BYOK) means:- No ubx telemetry or data collection
- Users control their Anthropic API spend
- AI features work with any Anthropic-compatible endpoint
- No dependency on Ubiquex infrastructure for AI functionality
