GSH is an interactive REPL for the Gleam Programming Language written in Gleam and Erlang.
Add gsh to your project as a development dependency:
gleam add gsh --dev
gsh can either be used as a standalone REPL or a live-app bootloader.
gleam run -m gsh
Erlang/OTP 28 [erts-16.1.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]
Interactive Gleam (GSH 1.1.6) - press Ctrl+C to exit (type :h ENTER for help)
gsh(1)> import your_app/config
ok
gsh(2)> config.load()
Runtime Error: "error:undef"
gsh(3)> :cc
Compiling your_app
Compiled in 0.25s
Ok (Imports hot-reloaded)
gsh(4)> config.load()
Config("0.1.0", "0.0.0.0", 8000) : Config
gsh(5)>
gleam run -m gsh -- my_app worker_pool bg_module_1
GSH includes several built-in commands to manage your session:
:h - Show the help menu:v - Show the current GSH version:b - List all currently active variable bindings:hs - Show the history of executed commands:cc - Recompile the host Gleam project without leaving the shell:c - Clear the terminal screen (or Ctrl + L)pid() - Create a pid from a string (e.g. pid("<0.34.0>")):h <module/function> - Retrieve module/function documentation:q - Exit the shellNote: GSH is heavily tied to the Erlang VM (BEAM) for state persistence and dynamic evaluation. It does not support the JavaScript target.
After using Elixir's iex, OCaml's utop or even Rust's evcxr. I really wanted to build a tool for Gleam that gets me closer to the BEAM. GSH, expanded as Gleam SHell is a materialization of that dream.
Tab-completion with auto suggestions

Suggestions work for your project modules as well

Input/Output syntax highlighting + Multi-line support

Compile your project before calling functions. Recompile after edits!

Processes & built-ins (pid)

Press <TAB> during imports or function calls to get completion & suggestions.
Use the <up and down arrows> to navigate through previously entered commands. History isn't saved after the session ends.
Ctrl+<left or right arrows> allow word-wise navigation.
Swap out function logic on the fly without restarting the shell. While the Gleam compiler strictly forbids duplicate function names within a module, GSH acts as a dynamic REPL layer—automatically pruning your historical state to allow Elixir-style rapid prototyping.
Provided you have Erlang with wxwidgets support, :obs will open the Observer GUI.
Rather than spawning heavy OS subprocesses with gleam build or writing .beam files to disk, GSH compiles and executes code directly in memory:
Fast AST Emission: Executes gleam compile-package --no-beam to instantly convert Gleam code into raw Erlang (.erl) source, bypassing disk artifact writes.
Native In-VM Bytecode Loading: Uses an Erlang FFI bridge (compile:file with [binary] + code:load_binary) to compile .erl files directly into RAM and hot-load the bytecode into the running VM.
Result: Evaluation latency drops from ~375ms down to ~18ms (~20x speedup), delivering real-time interactive feedback below human perception thresholds.
GSH runs inside a single, long-lived Erlang VM node. To prevent historic variable assignments from re-executing side effects (like spawning processes, printing logs, or hitting a database) during session re-evaluations:
Each let binding is automatically wrapped in a type-safe Process Dictionary cache.
Subsequent prompts reuse the cached memory pointer, ensuring side-effecting code executes exactly once.
Session scope is tracked in an explicit ShellState record across evaluations. GSH dynamically merges, prunes, and re-injects:
Active variable bindings and shadowed variables
Global module imports and custom type definitions
Interactive function declarations and command history
Powered by etch_erlang, GSH toggles terminal raw mode on the fly to support character-by-character key handling, live TAB completion, multiline syntax buffering (...>), and ANSI color formatting without corrupting background process stdout.
iex| Feature | GSH (Gleam Shell) | IEx (Interactive Elixir) |
|---|---|---|
| Live App Bootstrapping | gleam run -m gsh -- app | iex -S mix |
| Syntax | Gleam (Rust-like, strict types) | Elixir (Ruby-like, dynamic) |
| Syntax Highlighting | Yes (ANSI-based) | Yes (Configurable ANSI) |
| Type System | Static (recompiles on the fly) | Dynamic |
| Evaluation Engine | File-backed generation + Hot code reload | Direct Erlang AST evaluation |
| Side-Effect Safety | Yes (Process Dictionary memoization) | Yes (Native to AST loop) |
| VM State Persistence | Yes (Actors, PIDs, ETS stay alive) | Yes |
| Fault Tolerance | Yes (Catches Badarg / VM crashes) | Yes |
| Multiline Input | Yes (Buffer completion) | Yes (Native AST parsing) |
| Built-in Helpers | pid() (easily extensible) | h(), i(), v(), pid(), etc. |
| Autocomplete | Keywords, bound vars, module exports | Deeply context-aware + docstrings |
By combining intelligent package path resolution with a live glexer token stream, the shell locates raw .gleam source files, lexes them on the fly, and extracts both module-level documentation and function signatures. This brings the legendary, tactile developer experience of Elixir's iex to Gleam, allowing developers to read rich, ANSI-formatted markdown documentation directly in the REPL without requiring modifications to the Gleam compiler.
GSH stands on the shoulders of some excellent Gleam libraries:
Contributions are massively appreciated! A REPL would be a nice to have tool in the Gleam ecosystem, and there is plenty of room to grow.
This project is licensed under the Apache-2.0.
Copyright 2026 v4rm4n
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at here. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Gleam
95.0%
Erlang
5.0%
GSH is an interactive REPL for the Gleam Programming Language written in Gleam and Erlang.
Add gsh to your project as a development dependency:
gleam add gsh --dev
gsh can either be used as a standalone REPL or a live-app bootloader.
gleam run -m gsh
Erlang/OTP 28 [erts-16.1.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]
Interactive Gleam (GSH 1.1.6) - press Ctrl+C to exit (type :h ENTER for help)
gsh(1)> import your_app/config
ok
gsh(2)> config.load()
Runtime Error: "error:undef"
gsh(3)> :cc
Compiling your_app
Compiled in 0.25s
Ok (Imports hot-reloaded)
gsh(4)> config.load()
Config("0.1.0", "0.0.0.0", 8000) : Config
gsh(5)>
gleam run -m gsh -- my_app worker_pool bg_module_1
GSH includes several built-in commands to manage your session:
:h - Show the help menu:v - Show the current GSH version:b - List all currently active variable bindings:hs - Show the history of executed commands:cc - Recompile the host Gleam project without leaving the shell:c - Clear the terminal screen (or Ctrl + L)pid() - Create a pid from a string (e.g. pid("<0.34.0>")):h <module/function> - Retrieve module/function documentation:q - Exit the shellNote: GSH is heavily tied to the Erlang VM (BEAM) for state persistence and dynamic evaluation. It does not support the JavaScript target.
After using Elixir's iex, OCaml's utop or even Rust's evcxr. I really wanted to build a tool for Gleam that gets me closer to the BEAM. GSH, expanded as Gleam SHell is a materialization of that dream.
Tab-completion with auto suggestions

Suggestions work for your project modules as well

Input/Output syntax highlighting + Multi-line support

Compile your project before calling functions. Recompile after edits!

Processes & built-ins (pid)

Press <TAB> during imports or function calls to get completion & suggestions.
Use the <up and down arrows> to navigate through previously entered commands. History isn't saved after the session ends.
Ctrl+<left or right arrows> allow word-wise navigation.
Swap out function logic on the fly without restarting the shell. While the Gleam compiler strictly forbids duplicate function names within a module, GSH acts as a dynamic REPL layer—automatically pruning your historical state to allow Elixir-style rapid prototyping.
Provided you have Erlang with wxwidgets support, :obs will open the Observer GUI.
Rather than spawning heavy OS subprocesses with gleam build or writing .beam files to disk, GSH compiles and executes code directly in memory:
Fast AST Emission: Executes gleam compile-package --no-beam to instantly convert Gleam code into raw Erlang (.erl) source, bypassing disk artifact writes.
Native In-VM Bytecode Loading: Uses an Erlang FFI bridge (compile:file with [binary] + code:load_binary) to compile .erl files directly into RAM and hot-load the bytecode into the running VM.
Result: Evaluation latency drops from ~375ms down to ~18ms (~20x speedup), delivering real-time interactive feedback below human perception thresholds.
GSH runs inside a single, long-lived Erlang VM node. To prevent historic variable assignments from re-executing side effects (like spawning processes, printing logs, or hitting a database) during session re-evaluations:
Each let binding is automatically wrapped in a type-safe Process Dictionary cache.
Subsequent prompts reuse the cached memory pointer, ensuring side-effecting code executes exactly once.
Session scope is tracked in an explicit ShellState record across evaluations. GSH dynamically merges, prunes, and re-injects:
Active variable bindings and shadowed variables
Global module imports and custom type definitions
Interactive function declarations and command history
Powered by etch_erlang, GSH toggles terminal raw mode on the fly to support character-by-character key handling, live TAB completion, multiline syntax buffering (...>), and ANSI color formatting without corrupting background process stdout.
iex| Feature | GSH (Gleam Shell) | IEx (Interactive Elixir) |
|---|---|---|
| Live App Bootstrapping | gleam run -m gsh -- app | iex -S mix |
| Syntax | Gleam (Rust-like, strict types) | Elixir (Ruby-like, dynamic) |
| Syntax Highlighting | Yes (ANSI-based) | Yes (Configurable ANSI) |
| Type System | Static (recompiles on the fly) | Dynamic |
| Evaluation Engine | File-backed generation + Hot code reload | Direct Erlang AST evaluation |
| Side-Effect Safety | Yes (Process Dictionary memoization) | Yes (Native to AST loop) |
| VM State Persistence | Yes (Actors, PIDs, ETS stay alive) | Yes |
| Fault Tolerance | Yes (Catches Badarg / VM crashes) | Yes |
| Multiline Input | Yes (Buffer completion) | Yes (Native AST parsing) |
| Built-in Helpers | pid() (easily extensible) | h(), i(), v(), pid(), etc. |
| Autocomplete | Keywords, bound vars, module exports | Deeply context-aware + docstrings |
By combining intelligent package path resolution with a live glexer token stream, the shell locates raw .gleam source files, lexes them on the fly, and extracts both module-level documentation and function signatures. This brings the legendary, tactile developer experience of Elixir's iex to Gleam, allowing developers to read rich, ANSI-formatted markdown documentation directly in the REPL without requiring modifications to the Gleam compiler.
GSH stands on the shoulders of some excellent Gleam libraries:
Contributions are massively appreciated! A REPL would be a nice to have tool in the Gleam ecosystem, and there is plenty of room to grow.
This project is licensed under the Apache-2.0.
Copyright 2026 v4rm4n
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at here. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Gleam
95.0%
Erlang
5.0%