# Etch - A Gleam TUI Backend Library
[](https://hex.pm/packages/etch)
[](https://hexdocs.pm/etch/)
Etch is a powerful terminal user interface (TUI) backend library for Gleam, designed to help you build rich, interactive terminal applications with ease. It provides a comprehensive set of tools for managing terminal output, handling events, and styling text, with no third-party dependencies.
This project was inspired by [crossterm](https://github.com/crossterm-rs/crossterm).
## Features
### Terminal Control
- **Raw Mode**: Enter and exit raw mode for direct terminal control
- **Alternative Screen**: Switch between main and alternative screen buffers
- **Window Management**: Get and set terminal dimensions
- **Screen Clearing**: Clear the screen or specific portions with various options
- **Line Wrapping**: Enable or disable line wrapping
- **Scrolling**: Scroll the terminal content up or down
### Cursor Management
- **Positioning**: Move cursor to specific positions or relative offsets
- **Visibility**: Show or hide the cursor
- **Position Saving**: Save and restore cursor positions
- **Styling**: Set cursor style (block, underscore, bar) with blinking options
### Event Handling
- **Keyboard Input**: Capture and parse keyboard events with modifiers
- **Mouse Support**: Handle mouse events (clicks, drags, scrolls)
- **Focus Management**: Detect focus gain/loss events
- **Window Resizing**: Respond to terminal resize events
- **Keyboard Enhancement**: Support for [progressive keyboard enhancement flags](https://sw.kovidgoyal.net/kitty/keyboard-protocol/#progressive-enhancement)
### Text Styling
- **Colors**: Full color support including:
- Standard colors (black, red, green, etc.)
- Bright variants
- 256 ANSI colors
- True RGB colors
- **Attributes**: Text styling with bold, dim, italic, underline, blinking, and inverse
- **Style Management**: Save and apply complex styles (foreground, background, attributes)
### Command System
- **Queue System**: Batch and flush terminal commands efficiently
- **Comprehensive Commands**: Wide range of commands for all terminal operations
- **Immediate Execution**: Execute commands without queueing
## Getting Started
Here's a basic template to get you started with Etch:
```gleam
import etch/command
import etch/terminal
import etch/style
import etch/stdout.{type Queue, execute, flush, queue}
pub fn main() {
// Use execute to execute `Commands`
execute([
command.EnterRaw,
command.EnterAlternateScreen,
command.HideCursor,
command.Clear(terminal.All)
])
// Queue `Commands`
let q = Queue([
command.SetForegroundColor(style.Red),
command.SetBackgroundColor(style.Black),
])
let text = "Styled text"
let q = queue(q, [command.Println(text)])
// Flush queued `Commands`
flush(q)
}
```
## Examples
Check out the examples in the `examples/` directory for more advanced usage:
- `hello_world.gleam`: Basic text rendering and centering
- `events.gleam`: Comprehensive event handling
- `snake.gleam`: Simple game implementation
- `styles.gleam`: Advanced text styling techniques
To run the use this command:
```sh
gleam run -m examples/{example_name}
```
## Documentation
For detailed API documentation, see the [documentation](https://hexdocs.pm/etch/) for the Etch package.
## Building and Shipping Your App
To build the app into single executable:
1. **Add Etch and gleescript to your project**:
```sh
gleam add etch
gleam add --dev gleescript
```
2. **Build your application**:
```sh
gleam build
gleam run -m gleescript
```
You will get an executable file in your project's root directory. Users must have Erlang installed in order to run your executable.
## Contributing.
Feel free to open issues and make pull requests.
## Authors
* Egor Kurtashkin — project owner and creator.
## License
This project is licensed under MIT License. See LICENSE file for details.