Skip to main content

Luat CLI is Ready: Install and Start Building in Seconds

· 5 min read
Senol Tas
Founder & Principal Engineer, Maravilla Labs

The moment we've been working towards is here: the Luat CLI is ready and will be published soon. Once available, you'll be able to install it, run luat dev, and start building.

Built with Rust

The entire CLI is written in Rust, giving you native performance and reliability. Under the hood, we're using:

  • Axum - A fast, ergonomic web framework for the development and production servers
  • Tokio - Async runtime powering concurrent file watching and request handling
  • notify - Cross-platform file system monitoring with 750ms debouncing to catch rapid saves
  • matchit - Lightning-fast URL pattern matching for route resolution
  • mlua - Lua runtime bindings that power the template engine

The result? A dev server that starts instantly and rebuilds in milliseconds.

Install in Seconds

Once published, choose your preferred installation method:

npm install -g @maravilla-labs/luat

Homebrew (macOS)

brew install maravilla-labs/tap/luat

Shell Script (Linux/macOS)

curl -fsSL https://raw.githubusercontent.com/maravilla-labs/luat/main/scripts/install.sh | sh

Cargo (Rust developers)

cargo install luat-cli

Your First Project

Creating a new Luat project takes one command:

luat init my-app
cd my-app
luat dev

Your browser opens to http://localhost:3000 with a starter template ready to customize.

What's Included

The CLI brings everything we've been building together into five commands:

CommandDescription
luat init [name]Create a new project with SvelteKit-style structure
luat devStart development server with live reload
luat buildBundle templates for production deployment
luat serveRun optimized production server
luat watchWatch files and rebuild without HTTP server

Development Server

luat dev --port 3000

The dev server is where we spent the most time polishing the experience:

  • WebSocket Live Reload - Changes trigger instant browser refresh via a lightweight WebSocket connection at /__livereload. The client auto-reconnects if the connection drops.
  • Smart File Watching - Only .luat and .lua files trigger rebuilds. We debounce rapid saves (750ms window) to avoid unnecessary work.
  • Error Overlay - When something breaks, you see the error in the browser with syntax-highlighted context.
  • Hot CSS Updates - Tailwind and Sass changes apply without full page refresh when possible.

Production Build

luat build
luat serve --port 8080

The build command runs your frontend tools in production mode and bundles all templates. The serve command runs an optimized server with a larger template cache (1000 entries vs 100 in dev mode) and no live reload overhead.

Integrated Toolchain

This is one of our favorite features. Zero configuration for:

  • Tailwind CSS - Utility-first styling
  • Dart Sass - CSS preprocessing
  • esbuild - Fast TypeScript/JavaScript bundling

Here's the magic: you don't need npm installed. When you first run luat dev, we automatically download the right binaries for your platform:

  • Linux (x64, ARM64)
  • macOS (Intel, Apple Silicon)
  • Windows (x64)

Downloads are cached in your system's cache directory (~/.cache/luat/tools/ on Linux, ~/Library/Caches/com.maravilla-labs.luat/tools/ on macOS). We verify checksums (SHA256) and retry with exponential backoff if downloads fail.

The build orchestrator runs tools in sequence (Sass → Tailwind → esbuild) with a multi-progress display showing exactly what's happening.

File-Based Routing

The file-based routing we announced in October is fully implemented:

src/routes/
├── +layout.luat # Root layout
├── +page.luat # Home page (/)
├── +page.server.lua # Server-side data loading
├── blog/
│ ├── +page.luat # /blog
│ └── [slug]/
│ ├── +page.luat # /blog/:slug
│ └── +page.server.lua
└── api/
└── posts/
└── +server.lua # /api/posts endpoint

Route files explained:

  • +page.luat - The template to render
  • +page.server.lua - Runs before rendering to load data (returns props)
  • +layout.luat - Wraps pages and nested layouts
  • +server.lua - API endpoint (define GET, POST, etc. functions)

Dynamic routes use bracket syntax: [param] for required, [[optional]] for optional, and [...rest] for catch-all.

The router automatically collects the layout chain from root to current route, executing load functions bottom-up and merging their props.

How Rendering Works

When a request comes in, here's what happens:

  1. Route matching - URL matched against routes using matchit
  2. Context building - Route params, query strings, form data, and headers assembled
  3. Load functions - Execute from layouts down to page, accumulating props
  4. Template rendering - Page rendered with collected props
  5. Layout wrapping - Content wrapped in layouts (innermost to outermost)
  6. Shell substitution - Result inserted into app.html via %luat.body%
  7. Live reload injection (dev only) - Script injected before </body>

Each request gets a fresh Lua instance for isolation - no state leaks between requests.

Platform Support

The CLI runs everywhere:

PlatformArchitectures
Linuxx86_64, ARM64
macOSIntel (x86_64), Apple Silicon (ARM64)
Windowsx86_64

The Road Here

This release represents months of work:

We've tested extensively, iterated on developer experience, and polished every interaction.

What's Next

Once the CLI is public, we're focusing on:

  • Project Templates - Starters for common use cases (blog, dashboard, API)
  • Plugin System - Extensibility for custom build steps and tools
  • Performance - Even faster rebuilds with incremental compilation
  • VS Code Extension - Syntax highlighting and LSP support for .luat files

Get Started

Once published:

npm install -g @maravilla-labs/luat
luat init my-app
cd my-app
luat dev

That's it. You'll be building with Luat.

Check out our getting started guide for a complete walkthrough, or dive into the documentation to explore everything Luat can do.


We can't wait to see what you build. Follow @thelabertasch on X for the release announcement!