๐Ÿฐ Tiramisu

A type-safe 3D game engine for Gleam

Tiramisu brings the power of functional programming and static type safety to game development, leveraging Three.js for professional-grade 3D rendering while maintaining Gleamโ€™s elegant, immutable design principles.

Package Version Hex Docs


โœจ Features


๐Ÿš€ Quick Start

import tiramisu
import tiramisu/effect
import tiramisu/scene
import tiramisu/transform

type Model {
  Model(rotation: Float)
}

type Msg {
  Frame
}

pub fn main() {
  tiramisu.run(
    width: 800,
    height: 600,
    background: 0x111111,
    init: init,
    update: update,
    view: view,
  )
}

fn init(_ctx: tiramisu.Context) {
  #(Model(rotation: 0.0), effect.none())
}

fn update(model: Model, msg: Msg, ctx: tiramisu.Context) {
  case msg {
    Frame -> {
      let new_rotation = model.rotation +. ctx.delta_time
      #(Model(rotation: new_rotation), effect.none())
    }
  }
}

fn view(model: Model) {
  [
    scene.Mesh(
      id: "cube",
      geometry: scene.BoxGeometry(1.0, 1.0, 1.0),
      material: scene.StandardMaterial(color: 0x00ff00),
      transform: transform.identity
        |> transform.rotate_y(model.rotation),
    ),
  ]
}

๐Ÿ“ฆ Installation

Add Tiramisu to your Gleam project:

gleam add tiramisu@1

Add Three.js and Rapier via Lustre to your gleam.toml


name = "my_game"
version = "0.1.0"
license = "MIT"

...

[tools.lustre.html]
scripts = [
  { type = "importmap", content = "{ \"imports\": { \"three\": \"https://cdn.jsdelivr.net/npm/three@0.180.0/build/three.module.js\", \"three/addons/\": \"https://cdn.jsdelivr.net/npm/three@0.180.0/examples/jsm/\", \"@dimforge/rapier3d-compat\": \"https://cdn.jsdelivr.net/npm/@dimforge/rapier3d-compat@0.11.2/+esm\" } }" }
]

๐Ÿ“š Documentation


๐Ÿ—๏ธ Core Concepts

MVU Architecture

Tiramisu follows the Model-View-Update pattern:

Effect System

Side effects (network, timers, audio) are handled through a composable effect system, keeping your update logic pure and testable.

Scene Graph

Hierarchical node system powered by Three.js, with functional updates and transforms. Support for meshes, lights, cameras, groups, and more.


๐ŸŽฎ What Can You Build?


๐Ÿ› ๏ธ Built With


๐Ÿค Contributing

Contributions are welcome! Whether itโ€™s bug reports, feature requests, or code contributions, please feel free to open an issue or pull request.


๐Ÿ“„ License

MIT License - see LICENSE.md for details.


๐ŸŒŸ Why Tiramisu?

โ€œLike the dessert, Tiramisu is made of layers - each one adding richness and depth. From the functional purity of Gleam to the rendering power of Three.js, every layer works together to create something delightful.โ€

Start building type-safe games today. โœจ


Development

gleam run   # Run the project
gleam test  # Run the tests
โœจ Search Document