Glesia

Safe-ish Gleam bindings for Erlang Mnesia.

Glesia follows the same idea as glixir: keep the public API in Gleam, and use a tiny Erlang FFI layer for the OTP feature that Gleam does not wrap directly. Mnesia records are dynamic BEAM tuples, so Glesia keeps that boundary explicit with Dynamic values and optional decoders.

Install

gleam add glesia

Quick start

import glesia
import gleam/dynamic
import gleam/erlang/atom

pub fn main() -> Nil {
  let users = atom.create("users")

  let _ = glesia.set_dir("/tmp/my_app_mnesia")
  let _ = glesia.create_local_schema()
  let assert Ok(_) = glesia.start()
  let _ = glesia.create_ram_table(users, [
    atom.create("id"),
    atom.create("name"),
  ])

  let assert Ok(_) = glesia.dirty_write(dynamic.from(#(users, 1, "Ada")))
  let assert Ok(records) = glesia.dirty_read(users, dynamic.from(1))

  let _ = glesia.stop()
}

API

Safety notes

Mnesia table names and attributes are atoms. Do not create atoms from untrusted user input. Records are Erlang tuples, so reads return Dynamic unless you pass a decoder with dirty_read_decoded.

The wrapper is intentionally small. It gives Gleam code access to Mnesia without hiding the BEAM interop boundary.

Development

gleam test
Search Document