Lustre for React developers

In some ways React and Lustre share the same DNA. But in a lot of other ways they can be quite different! This guide is for React developers who are new to Lustre and want to get up to speed quickly.

How do I…?

Setup a new project

In React you are encouraged to use a meta framework like Next.js or Remix. To start a barebones project you need to run npm install react react-dom. You will typically use a bundler that can transpile JSX like npm install --save-dev vite. Many modern projects use TypeScript as well: npm install --save-dev typescript. A simple hello world might look like this:

// src/index.js
import { createRoot } from "react-dom/client";

const root = createRoot(document.getElementById("app"));

root.render(<h1>Hello, world</h1>);

To run the project you could use Vite’s development server with npx vite.

In Lustre you need to install the lustre package with gleam add lustre. Most Lustre projects will add the dev tools too with gleam add --dev lustre_dev_tools. A simple hello world might look like this:

// main.gleam
import lustre
import lustre/element/html

pub fn main() {
  let app = lustre.element(html.h1([], [html.text("Hello, world")]))
  let assert Ok(_) = lustre.start(app, "#app", Nil)

Render some HTML

In React you can use JSX to render HTML elements. JSX is a syntax extension for JavaScript that looks like HTML that lets you interpolate JavaScript expressions into your markup. Here’s an example:

<button className="primary">Click me</button>

In Lustre HTML is rendered by calling functions (this is what JSX compiles to as well).

button([class("primary")], [text("Click me")])

Render some text

In React a string is a valid type of React node, so you can render text by just writing it in your JSX:


To concatenate text with other variables or expressions, you can use curly braces:

Hello {name}

In Lustre because of Gleam’s type system, all elements must be Lustre’s Element type. To render text you need to use the text function:

text("Hello" <> name)

Manage state

In React

In Lustre

Handle events

In React

In Lustre

Write a component

In React

In Lustre

Fetch data

In React

In Lustre

Where to go next

To walk through setting up a new Lustre project and building your first app, check out the quickstart guide.

If you prefer to learn by example, we have a collection of examples that show off specific features and patterns in Lustre. You can find them in the examples directory

If you’re having trouble with Lustre or not sure what the right way to do something is, the best place to get help is the Gleam Discord server. You could also open an issue on the Lustre GitHub repository.

Search Document