Core Capabilities
HTTP Server & SSE
Build web services with async route handlers. Handlers can call http.get, sleep, and any async builtin. SSE streaming built in. Header values can be arrays for multiple Set-Cookie, Link, etc.
http.serve(8080, {
GET = {
["/login"] = function(req)
return {
status = 200,
headers = {
["Set-Cookie"] = {
"session=abc; Path=/",
"csrf=xyz; Path=/",
},
},
json = { ok = true },
}
end
}
})
Kubernetes & GitOps
30+ K8s resource types, ArgoCD, Kargo, Flux, Traefik. In-cluster and cross-cluster auth.
local k8s = require("assay.k8s")
local pods = k8s.list("default", "pod")
local argo = require("assay.argocd")
local c = argo.client(url, {token=t})
local apps = c:applications()
AI Agent Integration
OpenClaw platform tools, GitHub PRs/issues, Gmail, Google Calendar. Build AI-powered workflows.
local oc = require("assay.openclaw")
local c = oc.client()
c:send("discord", "#ops", "Done!")
local r = c:llm_task("Summarize")
c:state_set("key", {v="1.2"})
Monitoring & Observability
Prometheus, Grafana, Loki, Alertmanager. Query metrics, push logs, manage alerts and dashboards.
local prom = require("assay.prometheus")
local r = prom.query(url, "up")
assert.gt(#r, 0, "No targets")
local loki = require("assay.loki")
loki.push(url, "log line")
Security & Secrets
Vault, cert-manager, ESO, Dex, Zitadel. JWT signing, OIDC, secret management.
local vault = require("assay.vault")
local c = vault.client(url, {token=t})
local s = c:kv_get("my/secret")
local jwt = crypto.jwt_sign(
{sub="svc"}, key, "HS256")
Infrastructure Testing
Builtin assertions, structured YAML checks with retry and backoff. Verify deployments, health endpoints, and service readiness.
# checks.yaml — retry + backoff
checks:
- name: api-healthy
type: http
url: http://api:8080/health
retries: 5
backoff: 3s
expect:
status: 200
9 MB static binary — FROM scratch, 5 ms cold start, 14x smaller than postman/newman.
See full size & speed comparison →
Two Modes
Auto-detected by file extension:
Lua Scripts (.lua)
#!/usr/bin/assay
local prom = require("assay.prometheus")
local result = prom.query("http://prom:9090", "up")
assert.gt(#result, 0, "No targets up")
log.info("Targets up: " .. #result)
YAML Checks (.yaml)
timeout: 120s
retries: 3
backoff: 5s
checks:
- name: grafana-healthy
type: http
url: http://grafana:80/api/health
expect:
status: 200
json: ".database == \"ok\""
Container Image Size
FROM scratch — no shell, no package manager, just the static binary:
| Runtime | Compressed | vs Assay |
|---|---|---|
| Assay | 9 MB | 1x |
| alpine/python | 17 MB | 2x |
| bitnami/kubectl | 35 MB | 4x |
| Node.js alpine | 57 MB | 6x |
| alpine/k8s | 60 MB | 7x |
Install
Pre-built Binary
# Linux (x86_64, static)
curl -L -o assay https://github.com/developerinlondon/assay/releases/latest/download/assay-linux-x86_64
chmod +x assay && sudo mv assay /usr/local/bin/
# macOS (Apple Silicon)
curl -L -o assay https://github.com/developerinlondon/assay/releases/latest/download/assay-darwin-aarch64
chmod +x assay && sudo mv assay /usr/local/bin/
Docker
docker pull ghcr.io/developerinlondon/assay:latest
Cargo / Rust Library
# CLI tool
cargo install assay-lua
# As a Rust dependency
# Cargo.toml: assay-lua = "0.6"
mise
# .mise.toml
"github:developerinlondon/assay" = "v0.6.1"