one source of truth. point.
infinite extensibility·infinite composition·infinite portability
Source → outputs
Plugins claim kinds for the surfaces you expose; target plugins emit the clients, servers and specs. Change the source, every consumer follows.
use "@box/http"
import "./schema.box"
http("user-api") {
basePath = "/v1"
route("/users") {
get = list(): schema.User[]
post = create(req: schema.CreateUserRequest): schema.User
}
route("/users/{id}") {
get = get(id: string): schema.User
delete = delete(id: string): void
}
auth {
type = bearer
audience = "admin-tools"
}
}Generates
Install
Box ships as an adi cli plugin. Install once, then drive it through the adi command line.