gleam-knowledge-patch

Installation
SKILL.md

Gleam Knowledge Patch

Covers Gleam 1.7–1.15 (2025-01-05 through 2026-03-16). Claude Opus 4.6 knows Gleam through v1.6.x including core language (types, pattern matching, pipes, use expressions, Result/Option, labelled arguments, generics, opaque types, externals/FFI), BEAM and JavaScript targets, and gleam build tool basics.

Index

Topic Reference Key features
Debug & testing references/debug-and-testing.md echo keyword, echo labels, assert for tests, let assert messages
Bit arrays references/bit-arrays.md JS parity (unaligned, 16-bit float, unit, UTF-16/32), float shorthand, size expressions
JavaScript FFI references/javascript-ffi.md $-prefixed external API, BitArray FFI, @external on types, CommonJS
Type system & patterns references/type-system.md Record updates across type params, const record updates, string <> in guards
Build tool & project references/build-tool.md Git deps, gleam dev, dev/ dir, gleam deps outdated, formatter controls

Quick Reference — New Keywords & Syntax

Feature Version Syntax
echo (debug print) 1.9 echo expr or expr |> echo
echo with label 1.12 echo expr as "label"
assert (test assertion) 1.11 assert expr == expected
assert with message 1.11 assert expr as "message"
let assert message 1.7 let assert Ok(x) = expr as "msg"
Variant deprecation 1.7 @deprecated("msg") on variant
@external on types 1.14 @external(erlang, "mod", "type") on pub type
Record update type change 1.7 Named(..data, value: new_typed_value)
Record update in const 1.14 const dev = Config(..base, port: 4000)
String <> in guards 1.15 case x { s if a <> b == s -> ... }
Bit array float literal 1.10 <<1.5>> (no :float needed)
Bit array size expressions 1.12 <<data:bytes-size(size / 8 - 1)>>
Trailing comma → multiline 1.12 ["a", "b",] forces multiline format
Git dependencies 1.9 pkg = { git = "url", ref = "..." }
gleam dev 1.11 Runs dev/ directory code
gleam deps outdated 1.14 Check for newer Hex versions

Essential Patterns

Debug printing with echo (1.9+)

// Standalone — prints value + file:line to stderr
echo [1, 2, 3]

// In pipelines — passes value through
[1, 2, 3]
|> list.map(fn(x) { x + 1 })
|> echo
|> list.map(fn(x) { x * 2 })

// With label (1.12+)
echo config.port as "server port"

Test assertions with assert (1.11+)

pub fn hello_test() {
  assert telecom.ring() == "Hello, Joe!"
}

// Custom message:
pub fn system_test() {
  assert telecom.is_up(key, strict, 2025)
    as "My internet must always be up!"
}

JavaScript FFI — External API (1.13+)

// src/person.gleam
pub type Person {
  Teacher(name: String, subject: String)
  Student(name: String)
}
// src/my_ffi.mjs
import { Person$Teacher, Person$Student, Person$isTeacher,
         Person$Teacher$subject, Person$name } from "./person.mjs";

let teacher = Person$Teacher("Joe", "CS");
Person$isTeacher(teacher);         // true
Person$Teacher$subject(teacher);   // "CS"
Person$name(teacher);              // "Joe" (shared field)

Project structure with dev/ (1.11+)

my_app/
├── src/    # Production code (gleam run)
├── test/   # Tests (gleam test)
└── dev/    # Development scripts (gleam dev)

The $PACKAGENAME_dev module's main function runs via gleam dev.

Git dependencies in gleam.toml (1.9+)

[dependencies]
gleam_stdlib = { git = "https://github.com/gleam-lang/stdlib.git", ref = "957b83b" }

Supports git/HTTP URLs with a tag, branch, or commit ref.

@external on type declarations (1.14+)

@external(erlang, "erlang", "map")
@external(javascript, "../dict.d.mts", "Dict")
pub type Dict(key, value)

Produces precise Erlang type specs and TypeScript declarations instead of any.

Related skills
Installs
2
GitHub Stars
19
First Seen
Apr 7, 2026