From 363d9435625940a6c988539137b0087732820796 Mon Sep 17 00:00:00 2001
From: Simone <185146821+Lucenx9@users.noreply.github.com>
Date: Thu, 20 Aug 2026 20:14:26 +0200
Subject: [PATCH 1/3] release: forktty 0.2.0-alpha.21
---
CHANGELOG.md | 2 ++
Cargo.lock | 12 ++++-----
Cargo.toml | 2 +-
README.md | 26 +++++++++----------
.../linux/dev.forktty.forktty.metainfo.xml | 1 +
5 files changed, 23 insertions(+), 20 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a12b5e67..94b063d1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@ All notable changes to ForkTTY are documented here.
## [Unreleased]
+## [0.2.0-alpha.21] - 2026-08-20
+
### Added
- The workspace sidebar can now be pinned beside terminal content from its
header or left in the existing overlay presentation. The choice persists
diff --git a/Cargo.lock b/Cargo.lock
index cac1eb64..7f25dec5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -677,7 +677,7 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
[[package]]
name = "forktty-core"
-version = "0.2.0-alpha.20"
+version = "0.2.0-alpha.21"
dependencies = [
"chrono",
"dirs",
@@ -698,7 +698,7 @@ dependencies = [
[[package]]
name = "forktty-import"
-version = "0.2.0-alpha.20"
+version = "0.2.0-alpha.21"
dependencies = [
"aes 0.9.1",
"cbc 0.2.1",
@@ -718,7 +718,7 @@ dependencies = [
[[package]]
name = "forktty-socket"
-version = "0.2.0-alpha.20"
+version = "0.2.0-alpha.21"
dependencies = [
"async-channel",
"dirs",
@@ -738,7 +738,7 @@ dependencies = [
[[package]]
name = "forktty-terminal"
-version = "0.2.0-alpha.20"
+version = "0.2.0-alpha.21"
dependencies = [
"forktty-core",
"libc",
@@ -750,7 +750,7 @@ dependencies = [
[[package]]
name = "forktty-ui-gtk"
-version = "0.2.0-alpha.20"
+version = "0.2.0-alpha.21"
dependencies = [
"async-channel",
"base64",
@@ -3175,7 +3175,7 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
[[package]]
name = "xtask"
-version = "0.2.0-alpha.20"
+version = "0.2.0-alpha.21"
dependencies = [
"serde_json",
"toml",
diff --git a/Cargo.toml b/Cargo.toml
index 05d581e2..5a4cef18 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,7 +10,7 @@ members = [
resolver = "2"
[workspace.package]
-version = "0.2.0-alpha.20"
+version = "0.2.0-alpha.21"
edition = "2021"
rust-version = "1.96"
license = "AGPL-3.0-only"
diff --git a/README.md b/README.md
index afff5b81..84070920 100644
--- a/README.md
+++ b/README.md
@@ -13,18 +13,18 @@ place work in dedicated git worktrees without tying the UI to one agent vendor.
[](LICENSE)
[](https://github.com/Lucenx9/forktty/actions)
-[](https://github.com/Lucenx9/forktty/releases/tag/v0.2.0-alpha.20)
+[](https://github.com/Lucenx9/forktty/releases/tag/v0.2.0-alpha.21)
[](https://rustup.rs/)
[](docs/native-gtk-ghostty.md)
[Website](https://forktty.dev/) ·
[Docs](https://forktty.dev/docs) ·
[Agent context](https://forktty.dev/llms.txt) ·
-[Download v0.2.0-alpha.20 AppImage](https://github.com/Lucenx9/forktty/releases/download/v0.2.0-alpha.20/forktty-0.2.0-alpha.20-x86_64.AppImage)
+[Download v0.2.0-alpha.21 AppImage](https://github.com/Lucenx9/forktty/releases/download/v0.2.0-alpha.21/forktty-0.2.0-alpha.21-x86_64.AppImage)
-> **Status**: Early alpha (v0.2.0-alpha.20). ForkTTY is Linux-only and the GTK/Ghostty runtime is now the primary implementation. The AppImage is the primary Linux download for this alpha; the Debian package remains available for Debian/Ubuntu users.
+> **Status**: Early alpha (v0.2.0-alpha.21). ForkTTY is Linux-only and the GTK/Ghostty runtime is now the primary implementation. The AppImage is the primary Linux download for this alpha; the Debian package remains available for Debian/Ubuntu users.

@@ -55,12 +55,12 @@ the linked guides carry the detailed contracts.
## Install
The fastest paths are the prebuilt artifacts from the
-[v0.2.0-alpha.20 release](https://github.com/Lucenx9/forktty/releases/tag/v0.2.0-alpha.20).
+[v0.2.0-alpha.21 release](https://github.com/Lucenx9/forktty/releases/tag/v0.2.0-alpha.21).
Each release ships:
-- `forktty-0.2.0-alpha.20-x86_64.AppImage` — recommended portable Linux package.
-- `forktty-0.2.0-alpha.20-x86_64.AppImage.zsync` — AppImage delta-update metadata for external AppImage managers.
-- `forktty_0.2.0.alpha.20_amd64.deb` — Debian/Ubuntu package.
+- `forktty-0.2.0-alpha.21-x86_64.AppImage` — recommended portable Linux package.
+- `forktty-0.2.0-alpha.21-x86_64.AppImage.zsync` — AppImage delta-update metadata for external AppImage managers.
+- `forktty_0.2.0.alpha.21_amd64.deb` — Debian/Ubuntu package.
- `SHA256SUMS` — checksums for release artifacts.
After downloading, verify checksums:
@@ -72,8 +72,8 @@ sha256sum -c SHA256SUMS
### AppImage
```bash
-chmod +x forktty-0.2.0-alpha.20-x86_64.AppImage
-./forktty-0.2.0-alpha.20-x86_64.AppImage
+chmod +x forktty-0.2.0-alpha.21-x86_64.AppImage
+./forktty-0.2.0-alpha.21-x86_64.AppImage
```
The AppImage carries ForkTTY's private Ghostty libraries and a bundled
@@ -91,9 +91,9 @@ so external AppImage managers remain in control. If the UI renders incorrectly,
retry with the alternate GTK OpenGL renderer name:
```bash
-GSK_RENDERER=gl ./forktty-0.2.0-alpha.20-x86_64.AppImage
+GSK_RENDERER=gl ./forktty-0.2.0-alpha.21-x86_64.AppImage
# or
-GSK_RENDERER=ngl ./forktty-0.2.0-alpha.20-x86_64.AppImage
+GSK_RENDERER=ngl ./forktty-0.2.0-alpha.21-x86_64.AppImage
```
Use `GSK_RENDERER=cairo` only as a slower software-rendering fallback. More
@@ -106,9 +106,9 @@ Debian 12/Bookworm is below the package baseline because it does not provide
libadwaita 1.4+.
```bash
-sudo apt install ./forktty_0.2.0.alpha.20_amd64.deb
+sudo apt install ./forktty_0.2.0.alpha.21_amd64.deb
# or, if apt cannot read the file path directly:
-sudo dpkg -i forktty_0.2.0.alpha.20_amd64.deb
+sudo dpkg -i forktty_0.2.0.alpha.21_amd64.deb
sudo apt -f install
```
diff --git a/packaging/linux/dev.forktty.forktty.metainfo.xml b/packaging/linux/dev.forktty.forktty.metainfo.xml
index 12d1841d..301fe171 100644
--- a/packaging/linux/dev.forktty.forktty.metainfo.xml
+++ b/packaging/linux/dev.forktty.forktty.metainfo.xml
@@ -18,6 +18,7 @@
Lucenx9
+
From 65e6158ae86db2c4e51544ab9556087cdf7a17c6 Mon Sep 17 00:00:00 2001
From: Simone <185146821+Lucenx9@users.noreply.github.com>
Date: Thu, 20 Aug 2026 20:26:53 +0200
Subject: [PATCH 2/3] fix: satisfy Rust 1.98 clippy gates
---
crates/forktty-terminal/src/spawn.rs | 6 +++---
crates/forktty-ui-gtk/src/browser_pane.rs | 1 -
crates/forktty-ui-gtk/src/gtk_app/terminal_renderer.rs | 2 +-
3 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/crates/forktty-terminal/src/spawn.rs b/crates/forktty-terminal/src/spawn.rs
index b50c007e..aa15ea3c 100644
--- a/crates/forktty-terminal/src/spawn.rs
+++ b/crates/forktty-terminal/src/spawn.rs
@@ -939,8 +939,8 @@ mod tests {
let mut unset_keys = Vec::new();
let mut set_keys = Vec::new();
let mut saw_set = false;
- let mut options = helper_options.chunks_exact(2);
- for option in &mut options {
+ let (options, remainder) = helper_options.as_chunks::<2>();
+ for option in options {
match option[0].as_str() {
"--unset" => {
assert!(!saw_set, "unsets must precede assignments");
@@ -953,7 +953,7 @@ mod tests {
other => panic!("unexpected AppImage helper option {other}"),
}
}
- assert!(options.remainder().is_empty());
+ assert!(remainder.is_empty());
let mut sorted_unset_keys = unset_keys.clone();
sorted_unset_keys.sort();
assert_eq!(unset_keys, sorted_unset_keys);
diff --git a/crates/forktty-ui-gtk/src/browser_pane.rs b/crates/forktty-ui-gtk/src/browser_pane.rs
index c3d1ba7d..9aa396d0 100644
--- a/crates/forktty-ui-gtk/src/browser_pane.rs
+++ b/crates/forktty-ui-gtk/src/browser_pane.rs
@@ -4,7 +4,6 @@
use gtk4 as gtk;
use gtk::glib;
-use gtk::prelude::*;
use webkit6::prelude::*;
use webkit6::WebView;
diff --git a/crates/forktty-ui-gtk/src/gtk_app/terminal_renderer.rs b/crates/forktty-ui-gtk/src/gtk_app/terminal_renderer.rs
index d1acc2ba..dc0a560f 100644
--- a/crates/forktty-ui-gtk/src/gtk_app/terminal_renderer.rs
+++ b/crates/forktty-ui-gtk/src/gtk_app/terminal_renderer.rs
@@ -1025,7 +1025,7 @@ fn cairo_argb32_from_rgba(rgba: &[u8], width: u32, height: u32) -> Option().0 {
let alpha = u16::from(pixel[3]);
let premultiply = |value: u8| ((u16::from(value) * alpha + 127) / 255) as u8;
out.extend_from_slice(&[
From 9359c27351d1dc84d9a5e9629f6df9495b4e76c1 Mon Sep 17 00:00:00 2001
From: Simone <185146821+Lucenx9@users.noreply.github.com>
Date: Thu, 20 Aug 2026 20:28:52 +0200
Subject: [PATCH 3/3] docs: fix Debian release filename
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 84070920..96b5a8a8 100644
--- a/README.md
+++ b/README.md
@@ -60,7 +60,7 @@ Each release ships:
- `forktty-0.2.0-alpha.21-x86_64.AppImage` — recommended portable Linux package.
- `forktty-0.2.0-alpha.21-x86_64.AppImage.zsync` — AppImage delta-update metadata for external AppImage managers.
-- `forktty_0.2.0.alpha.21_amd64.deb` — Debian/Ubuntu package.
+- `forktty_0.2.0~alpha.21_amd64.deb` — Debian/Ubuntu package.
- `SHA256SUMS` — checksums for release artifacts.
After downloading, verify checksums:
@@ -106,9 +106,9 @@ Debian 12/Bookworm is below the package baseline because it does not provide
libadwaita 1.4+.
```bash
-sudo apt install ./forktty_0.2.0.alpha.21_amd64.deb
+sudo apt install ./forktty_0.2.0~alpha.21_amd64.deb
# or, if apt cannot read the file path directly:
-sudo dpkg -i forktty_0.2.0.alpha.21_amd64.deb
+sudo dpkg -i forktty_0.2.0~alpha.21_amd64.deb
sudo apt -f install
```