docs: split root level README to crate-specific docs; revise

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Id4cbc98d109251486a30d2955d084b856a6a6964
This commit is contained in:
raf 2026-06-26 12:49:12 +03:00
commit 589c26f210
No known key found for this signature in database
GPG key ID: 29D95B64378DB4BF
4 changed files with 198 additions and 151 deletions

View file

@ -16,5 +16,7 @@ missing_debug_implementations = "warn"
all = { level = "warn", priority = -1 } all = { level = "warn", priority = -1 }
[profile.release] [profile.release]
lto = "thin" opt-level = 3
lto = "fat"
codegen-units = 1 codegen-units = 1
strip = true

182
README.md
View file

@ -1,163 +1,47 @@
# beer # 🍺 beer
`beer` is a small Wayland-native terminal emulator written in Rust. It renders **A terminal worth pouring time into.**
through `wl_shm` with the CPU, uses a real PTY for the child shell, and keeps
the architecture close to the model used by terminals like foot: no GPU
renderer, no tabs, no ligatures, and no async runtime.
The project is still pre-1.0, but it is already usable as a single-window A small, fast, Wayland-native terminal emulator written in Rust drawn entirely
terminal on Wayland. on the CPU, with no GPU pipeline, no tabs, no ligatures, and no async runtime to
get in the way.
## Features ## Why another terminal?
- Software-rendered Wayland window with server-side decoration negotiation. [foot]: https://codeberg.org/dnkl/foot
- PTY-backed login shell with resize propagation through `TIOCSWINSZ`.
- VT parsing through `vte`, including cursor movement, erase/edit operations,
scroll regions, alternate screen, SGR attributes, truecolor, 256-color, OSC
palette/theme escapes, title updates, DA/DSR, XTGETTCAP, and synchronized
output.
- Font discovery and rasterization through fontconfig and FreeType, including
fallback faces, styled variants, bounded glyph caching, and color emoji.
- Scrollback with wheel and key scrolling, reflow on resize, and incremental
search.
- Mouse selection with word, line, and rectangular selection; clipboard and
primary-selection integration; bracketed paste; OSC 52 set/query.
- Mouse and focus reporting for terminal applications.
- TOML configuration with live reload on `SIGUSR1`.
- Shell integration through OSC 7 and OSC 133 for cwd-aware new windows, prompt
jumping, and piping the last command's output.
- OSC 8 hyperlinks, visible URL hint mode, and OSC 9/777/99 notifications.
## Not Implemented Yet Most terminals reach for the GPU and a stack of abstractions before they draw a
single glyph. `beer` goes the other way. It takes its cues from [foot] keep the
moving parts few, render with the CPU through `wl_shm`, talk to a real PTY, and
stay out of the way. The result is a terminal that starts instantly, sits
quietly in the background, and spends its cycles on your shell rather than on
itself. It is the kind of tool you forget is running which, for a terminal, is
the highest compliment. Pour one, get to work.
- Daemon/server mode and client mode. ## Project status
- Kitty keyboard protocol and Unicode codepoint input mode.
- Touchscreen input.
- Conformance and performance hardening passes beyond the current unit tests.
## Build `beer` is pre-1.0 but already comfortable as your daily single-window terminal
on Wayland. It's made clear in documentation about what it does and does not do
yet, and it would rather do a smaller set of things well than a larger set
half-heartedly. Feature requests are welcome, but not everything will be
implemented.
The repository provides a Nix dev shell with the Rust toolchain and native ## What's in here
Wayland/font dependencies:
```sh This is a Cargo workspace with two crates:
# Enter the development shell.
$ nix develop
# Build an optimized local binary. - **[`crates/beer`](crates/beer/README.md)** - the terminal application itself.
$ cargo build --release Start here for the feature list, installation, configuration, and day-to-day
``` use.
- **[`crates/beer-protocols`](crates/beer-protocols/README.md)** - the reusable,
self-documenting building blocks the terminal is made of, and a readable
reference for the escape sequences and protocols `beer` speaks.
The Nix package builds the binary, terminfo entry, and man pages: If you just want to run it, head to the
[application README](crates/beer/README.md). If you are curious how a terminal
```sh actually talks to the programs inside it, the
# Build the Nix package. [protocols README](crates/beer-protocols/README.md) is a friendly tour.
$ nix build
```
## Run
From a Wayland session:
```sh
# Start Beer from your terminal.
$ beer
```
or after a release build:
```sh
# Run the release binary directly.
$ ./target/release/beer
```
Useful flags:
```sh
# Pass a config file to Beer.
$ beer --config /path/to/beer.toml
# Check the version with -V or --version.
$ beer --version
# See the help text.
$ beer --help
```
`--server` exists as a future mode switch and currently returns an error.
## Configuration
By default, `beer` reads:
```text
$XDG_CONFIG_HOME/beer/beer.toml
```
or, if `XDG_CONFIG_HOME` is unset:
```text
~/.config/beer/beer.toml
```
A missing file uses defaults. A malformed file logs a warning and falls back to
defaults. Unknown keys are ignored for forward compatibility.
Example:
```toml
[main]
font = "monospace"
font-size = 16
pad-x = 2
pad-y = 2
[colors]
background = "#181818"
foreground = "#c5c8c6"
alpha = 1.0
[key-bindings]
"Ctrl+Shift+C" = "copy"
"Ctrl+Shift+V" = "paste"
"Ctrl+Shift+F" = "search"
[url]
launch = ["xdg-open"]
```
See `doc/beer.toml.5.scd` for the full configuration reference.
## Development
The expected verification set is:
```sh
# Check Rust formatting.
$ cargo fmt --all -- --check
# Run Clippy with warnings denied.
$ cargo clippy --all-targets --all-features -- -D warnings
# Build a release-optimized binary.
$ cargo build --release
# Run the test suite.
$ cargo test
# Check dependency policy.
$ cargo deny check
# Verify the Nix package.
$ nix build
```
The code is organized as a single crate with internal modules for the PTY, VT
model, grid, font pipeline, renderer, input encoding, configuration, and Wayland
frontend. Keep feature logic in the module that owns the concept; avoid adding
more state directly to the Wayland event root or the core grid when a focused
submodule can own it.
## License ## License
EUPL-1.2. [EUPL-1.2](https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12).

View file

@ -5,7 +5,7 @@ edition.workspace = true
rust-version.workspace = true rust-version.workspace = true
license.workspace = true license.workspace = true
description = "A fast, software-rendered, Wayland-native terminal emulator" description = "A fast, software-rendered, Wayland-native terminal emulator"
readme = true readme = "README.md"
[dependencies] [dependencies]
anyhow = "1.0.102" anyhow = "1.0.102"

161
crates/beer/README.md Normal file
View file

@ -0,0 +1,161 @@
# beer
`beer` is a small Wayland-native terminal emulator written in Rust. It renders
through `wl_shm` with the CPU, uses a real PTY for the child shell, and keeps
the architecture close to the model used by terminals like foot: no GPU
renderer, no tabs, no ligatures, and no async runtime.
The project is still pre-1.0, but it is already usable as a single-window
terminal on Wayland.
## Features
- Software-rendered Wayland window with server-side decoration negotiation.
- PTY-backed login shell with resize propagation through `TIOCSWINSZ`.
- VT parsing through `vte`, including cursor movement, erase/edit operations,
scroll regions, alternate screen, SGR attributes, truecolor, 256-color, OSC
palette/theme escapes, title updates, DA/DSR, XTGETTCAP, and synchronized
output.
- Font discovery and rasterization through fontconfig and FreeType, including
fallback faces, styled variants, bounded glyph caching, and color emoji.
- Scrollback with wheel and key scrolling, reflow on resize, and incremental
search.
- Mouse selection with word, line, and rectangular selection; clipboard and
primary-selection integration; bracketed paste; OSC 52 set/query.
- Mouse and focus reporting for terminal applications.
- TOML configuration with live reload on `SIGUSR1`.
- Shell integration through OSC 7 and OSC 133 for cwd-aware new windows, prompt
jumping, and piping the last command's output.
- OSC 8 hyperlinks, visible URL hint mode, and OSC 9/777/99 notifications.
## Not Implemented Yet
- Daemon/server mode and client mode.
- Conformance and performance hardening passes beyond the current unit tests.
## Build
The repository provides a Nix dev shell with the Rust toolchain and native
Wayland/font dependencies:
```sh
# Enter the development shell.
$ nix develop
# Build an optimized local binary.
$ cargo build --release
```
The Nix package builds the binary, terminfo entry, and man pages:
```sh
# Build the Nix package.
$ nix build
```
## Run
From a Wayland session:
```sh
# Start Beer from your terminal.
$ beer
```
or, after a release build:
```sh
# Run the release binary directly.
$ ./target/release/beer
```
Useful flags:
```sh
# Pass a config file to Beer.
$ beer --config /path/to/beer.toml
# Check the version with -V or --version.
$ beer --version
# See the help text.
$ beer --help
```
`--server` exists as a future mode switch and currently returns an error.
## Configuration
By default, `beer` reads:
```text
$XDG_CONFIG_HOME/beer/beer.toml
```
or, if `XDG_CONFIG_HOME` is unset:
```text
~/.config/beer/beer.toml
```
A missing file uses defaults. A malformed file logs a warning and falls back to
defaults. Unknown keys are ignored for forward compatibility.
Example:
```toml
[main]
font = "monospace"
font-size = 16
pad-x = 2
pad-y = 2
[colors]
background = "#181818"
foreground = "#c5c8c6"
alpha = 1.0
[key-bindings]
"Ctrl+Shift+C" = "copy"
"Ctrl+Shift+V" = "paste"
"Ctrl+Shift+F" = "search"
[url]
launch = ["xdg-open"]
```
See `doc/beer.toml.5.scd` for the full configuration reference.
## Development
The expected verification set is:
```sh
# Check Rust formatting.
$ cargo fmt --all -- --check
# Run Clippy with warnings denied.
$ cargo clippy --all-targets --all-features -- -D warnings
# Build a release-optimized binary.
$ cargo build --release
# Run the test suite.
$ cargo test
# Check dependency policy.
$ cargo deny check
# Verify the Nix package.
$ nix build
```
The application crate has internal modules for the PTY, VT model, grid, font
pipeline, renderer, configuration, and Wayland frontend; the reusable protocol
codecs and key/mouse encoders live in the `beer-protocols` crate. Keep feature
logic in the module that owns the concept; avoid adding more state directly to
the Wayland event root or the core grid when a focused submodule can own it.
## License
EUPL-1.2.