For Developers

Build agents with
real TypeScript

Full control over your agent logic. Write TypeScript tools, test locally, deploy globally. No YAML configs, no vendor lock-in.

$npm install -g lua-cli
import { LuaTool } from "lua-cli";
import { z } from "zod";

export class GetWeatherTool implements LuaTool {
  name = "get_weather";
  description = "Get current weather for a location";

  inputSchema = z.object({
    city: z.string().describe("City name"),
    units: z.enum(["celsius", "fahrenheit"]).default("celsius"),
  });

  async execute(input: z.infer<typeof this.inputSchema>) {
    const response = await fetch(
      `https://api.weather.com/v1/current?city=${input.city}&units=${input.units}`
    );
    return response.json();
  }
}

Modern developer
experience

Everything you expect from a modern framework. TypeScript, testing, live reload, and one-command deployments.

Real TypeScript

Not YAML or JSON configs. Actual code with full IDE support.

// Type-safe tool definitions
export class MyTool implements LuaTool {
  name = "my_tool";
  inputSchema = z.object({...});
  async execute(input: any) {...}
}

Zod Validation

Schema validation built-in. Parameters are type-safe at runtime.

inputSchema = z.object({
  email: z.string().email(),
  age: z.number().min(18)
})

Live Reload

Instant feedback during development. No restart needed.

$ lua dev
✓ Watching for changes...
✓ Agent updated

One-Command Deploy

Push to production with a single command. We handle the rest.

$ lua deploy
✓ Building...
✓ Deploying to production
✓ Live at agent.heylua.ai

Ready to start
building?

Get from zero to your first deployed agent in under 5 minutes.

$lua init my-agent
$lua chat
You:What's the weather in SF?
Agent:Let me check that for you...
🔧 get_weather(city: "SF")
Agent:It's 68°F and sunny in San Francisco!