Releases: junkdog/beamterm
beamterm-v1.0.0
[beamterm-v1.0.0] - 2026-03-30
The included terminal emulator example running with a dynamic font atlas (Hack + Noto Color Emoji).
beamterm is a GPU-accelerated terminal rendering library for Rust, targeting sub-millisecond render times. It supports both WebGL2 (WASM) and OpenGL 3.3 (native) from a single codebase via glow. beamterm handles the display layer while you provide the terminal logic. It also powers Ratzilla's WebGL2 backend.
1.0 marks a stable public API with full semver guarantees. Breaking changes will only happen in future major versions.
🚀 Features
- (core,renderer) Re-export 3rd party crates and document stability policy
💼 Other
- (deps-dev) Bump jsdom from 27.4.0 to 29.0.0 in /js (#106)
- (deps-dev) Bump esbuild in /js in the minor-and-patch group (#105)
- (deps-dev) Bump jsdom (#112)
🐛 Bug Fixes
- (core) Correct DirtyRegions draining for terminals exceeding 65536 cells
🚜 Refactor
- (core) Reduce visibility of internal types
- (errors) Add
Fromimpls for cross-crate error types (#110) - (unicode) Extract
beamterm-unicodecrate for shared emoji/width utils
⚙️ Miscellaneous Tasks
- Set MSRV to 1.90.0
- Add
includeallow-lists to all published Cargo.toml files - (clippy) Resolve new clippy warnings across all crates
- [breaking] Remove deprecations (#111)
beamterm-v0.18.0
[beamterm-v0.18.0] - 2026-03-27
a blazingly fast terminal emulator example built on the new dynamic atlas.
This release introduces beamterm-rasterizer, a native font rasterization crate built on swash and fontdb. It powers the new native-dynamic-atlas feature in beamterm-core - bringing runtime font selection to desktop targets, on par with the WASM dynamic atlas - and replaces cosmic-text for static atlas generation.
The terminal emulator example tops vtebench cell rendering and kitten throughput benchmarks against alacritty, kitty, urxvt, and konsole - up to 3.2x faster on escape code throughput. Full results in the terminal-emulator README.
🚀 Features
- (rasterizer) Add beamterm-rasterizer for glyph rasterization on native targets
- (core) Add feature-gated native dynamic font atlas and rasterizer (#101)
- (dynamic-atlas) Increase wide glyph slots to 2048, doubling capacity (#107)
- Add
#[must_use]to builder methods and GPU resources
💼 Other
- (core) Add a simple terminal-emulator example
- (deps) Bump cosmic-text from 0.16.0 to 0.18.2
- (deps) Bump actions/upload-artifact from 6 to 7 (#97)
- (deps) Bump criterion from 0.5.1 to 0.8.2 (#109)
⚡ Performance
- (rasterizer) Avoid rasterizing glyphs already evicted (#108)
🚜 Refactor
- (core) Eliminate RefCell usage in core
- Make
FontAtlasData,LineDecorationandGlyphfields private - [breaking] Replace bare tuples with
CellSizeandTerminalSize - Replace emojis crate with optimized implementation
- (atlas-cli) Replace cosmic-text with beamterm-rasterizer
- (atlas-cli) Restructure CLI with generate and inspect subcommands
- (atlas-cli) Remove verify-atlas binary in favor of inspect subcommand
beamterm-v0.17.0
[beamterm-v0.17.0] - 2026-03-11
💼 Other
- Add
#[non_exhaustive]to public enums - (deps) Bump glow from 0.16.0 to 0.17.0 (#100)
- (deps) Bump winit from 0.30.12 to 0.30.13 (#98)
🐛 Bug Fixes
- (core) Re-export
FontAtlasDeserializationError - (mouse) Read coordinates from live grid state instead of cached TerminalMetrics
⚡ Performance
- (core) Chunked dirty tracking for cell buffer uploads
🚜 Refactor
- Reduce public API surface
- (atlas) Make
Atlasa sealed trait
beamterm-v0.16.0
[beamterm-v0.16.0] - 2026-02-26
The rendering backend has been abstracted with glow, unifying OpenGL 3.3 (native desktop) and WebGL2 (WASM/browser) under a single codebase. beamterm now runs natively, no browser required.
The new game-console example: a rotating cube rendered behind a semi-transparent terminal overlay, running natively on OpenGL 3.3.
🚀 Features
- (core) Abstract GL backend with glow for OpenGL 3.3 + WebGL2
- (example) Add native OpenGL 3.3 example with glutin/winit in core
- (core) Add
TerminalGrid::set_bg_alpha() - (core) Add
TerminalGrid::renderQoL method that wrap prepare/draw/cleanup
💼 Other
- (core) Add
native-terminalexample - (core) Add
game-consoleexample showing a rotating cube behind a terminal - (deps) Bump clap from 4.5.58 to 4.5.60 (#96)
🐛 Bug Fixes
- (renderer)
TerminalGrid::cleanup()now unbinds the shader program - (core)
TerminalGrid::cell_data_mutnow setscells_pending_flush = true - (atlas)
Serializer::write_stringnow rejects strings exceeding 255 bytes. - (renderer) Prevent zero-sized terminal grids
- (atlas) Correct off-by-one in texture layer count calculation
- (core) Enforce Copy bound on GPU buffer upload functions
🚜 Refactor
- (renderer) Replace web_sys WebGL2 calls with glow
- (atlas) [breaking] Propagate atlas flush errors instead of panicking
- (atlas) Convert panics to Result errors in atlas deserialization and glyph limits
- (wasm)
BeamtermRendererdelegates toTerminal, no more duplicated logic
⚙️ Miscellaneous Tasks
- (tools) Remove neglected
font-previewtool
beamterm-v0.15.0
[beamterm-v0.15.0] - 2026-02-17
🚀 Features
- (terminal) Detect url with
Terminal::find_url_at()(#87) - (mouse) Extend mouse events with
Click,MouseEnterandMouseLeave(#88)
💼 Other
- (js) Add opengl context loss/recovery button to atlas replacement example
- (deps) Bump clap from 4.5.54 to 4.5.56 (#90)
- (deps) Bump bitflags from 2.10.0 to 2.11.0 (#94)
- (deps) Bump clap from 4.5.56 to 4.5.58 (#93)
🐛 Bug Fixes
- (js) Recovery from opengl context loss was missing
- (atlas) Correct emoji classification for text-presentation-by-default glyphs
⚙️ Miscellaneous Tasks
- (atlas) Expand emoji set for default atlas
beamterm-v0.14.0
[beamterm-v0.14.0] - 2026-01-27
A tiny release to address issues when the canvas size is managed by external CSS controls (flexbox, grid, percentages).
🚀 Features
- (renderer) Add
auto_resize_canvas_cssoption toTerminalBuilder(#85)
beamterm-v0.13.0
[beamterm-v0.13.0] - 2026-01-25
HiDPI Display Support
The renderer now automatically detects and handles device pixel ratio (DPR) for crisp (or pixelated) text on high-resolution displays. Each atlas handles DPR differently:
Dynamic Atlas re-rasterizes glyphs at the exact DPR for pixel-perfect text at any scaling factor (1.25, 1.5, 2, etc.).
Static Atlas uses snapped scaling (0.5, 1.0, 2.0, 3.0) to avoid scaling artifacts when upscaling pre-rasterized glyphs. Arbitrary fractional scaling would blur the texture, so the renderer rounds to the nearest supported value.
Many thanks to @fand for the initial implementation.
🚀 Features
- (atlas) Runtime font atlas replacement (#73)
- (mouse) Modifier key requirements for text selection (#74)
- (renderer) Automatic device pixel ratio scaling for HiDPI displays (#83)
💼 Other
- (deps) Bump serde_json from 1.0.148 to 1.0.149 (#77)
- (deps) Bump lru from 0.16.2 to 0.16.3 (#76)
- (deps) Bump miniz_oxide from 0.8.9 to 0.9.0 (#75)
- (deps) Bump thiserror from 2.0.17 to 2.0.18 (#80)
- (deps) Bump colored from 3.0.0 to 3.1.1 (#81)
🐛 Bug Fixes
beamterm-v0.12.0
[beamterm-v0.12.0] - 2026-01-08
This release focuses on stabilizing the dynamic font atlas feature introduced in 0.11.0.
The canvas waves example now includes performance measurements.
🚀 Features
- (atlas) Detect and report fallback font usage during atlas generation
- (selection) Auto-clear mouse selection when content changes (#68)
- (examples) Add performance metrics display to canvas_waves
- (static-atlas) Add
--debug-space-patternoption for pixel-perfect validation - (dynamic-atlas) Add
Terminal::builder().debug_dynamic_font_atlas()to validate pixel-perfect rendering
💼 Other
🐛 Bug Fixes
- (verify-atlas) Update for vertical layout and double-width glyphs
- (dynamic-atlas) Clip glyph rasterization to prevent pixel bleed
- (dynamic-atlas) Account for underline/strikethrough flags
- (dynamic-atlas) Handle ASCII characters in
get_symbol()(#70)
beamterm-v0.11.0
[beamterm-v0.11.0] - 2026-01-05
Dynamic Font Atlas
The new TerminalBuilder::dynamic_font_atlas() builder method enables runtime glyph
rasterization, removing the need for prebuilt atlas files. Glyphs are rendered on demand
using the browser's Canvas API and cached with an LRU strategy for efficient reuse. This
mode supports arbitrary Unicode characters, emoji, and font variants without compile-time
constraints.
let terminal = Terminal::builder("#canvas")
.dynamic_font_atlas(&["JetBrains Mono", "Fira Code"], 16.0)
.build()?;The font family list acts as a fallback chain, using the first available font on
the client system.
🚀 Features
- (atlas) Add
DynamicFontAtlasfor on-demand glyph rasterization with LRU cache (#63)
💼 Other
beamterm-v0.10.0
[beamterm-v0.10.0] - 2025-12-25
🚀 Features
- (verify-atlas) Atlas path is now a required argument
- (renderer) Automatic recovery from opengl context loss
💼 Other
- (deps) Bump actions/upload-artifact from 5 to 6 (#56)
- (deps-dev) Bump jsdom in /js in the minor-and-patch group (#55)
- (deps) Bump tracing from 0.1.43 to 0.1.44 (#58)
- (deps) Bump serde_json from 1.0.145 to 1.0.146 (#59)
🐛 Bug Fixes
- (renderer) Fix green tint in chrome-based browsers due to ANGLE uint bit operation bugs (AMD/Qualcomm)
- (renderer) Fix vertical banding artifacts in chrome-based browsers due to ANGLE mediump precision issues