v0.69.1

charmbracelet/crushv0.69.1May 15, 2026by github-actions[bot]

AI Summary

Performance release focused on optimizing UI rendering for long sessions, long messages, and streaming content.

Key Highlights

  • Cached assistant message parts separately
  • Only render visible chat lines
  • Skip re-rendering unchanged chat items
  • Batch streaming message updates
  • Show only tail of long reasoning blocks when expanded

New Features

  • UI performance optimizations for long-running sessions

Full Release Notes

# It’s Perf Time

This release is all about juicin’ UI perf. We did a ton of work around it, and it should be particularly noticeable with long sessions, long messages, long, open-toggled thinking blocks, mouse selection, scrolling and stuff like that.

We always strive to make the Crush user experience top-notch, so if you notice any places where perf _is_ suffering please let us know!

Have a great weekend,
The Charm Team

## Changelog
### Fixed
* 646a5053bd58635316bf960f3d8e5d4a0996a24b: fix(ui): keep tool spinners animating during long-running tasks (@meowgorithm)
### Other stuff
* 30f9c6ed55daf68b5ee5cc6a3f0fcebbf2559252: chore(ui): make spinner deterministic for testing (@meowgorithm)
* 8370edb6910e3044f0e7e375685431110a3eac9c: perf(chat): cache the parts of an assistant message separately (@meowgorithm)
* 771117cafeedffc8a9b5859503fc055bcd525d3e: perf(chat): cache the prefixed render of chat messages (@meowgorithm)
* 77b6c38b0fb150d97dbce466f737d1217e5a7604: perf(chat): only render the chat lines that fit on screen (@meowgorithm)
* 1c7ccfd7f78853dd86598eeef103f4ac0c29e8b2: perf(chat): reuse the rendered prefix of a streaming reply (@meowgorithm)
* 43b986c8c00a81b83fcf0422d5334ad61ab046c8: perf(chat): show only the tail of long reasoning blocks when expanded (@meowgorithm)
* 65f30a13430a93ef3f271adb3cee4b535ade3de6: perf(chat): skip re-parsing the rendered chat when nothing has changed (@meowgorithm)
* 6b101f38600cd4e4b974ee56af3c9d2382cc2c43: perf(chat): skip re-rendering chat list items that have not changed (@meowgorithm)
* 6938dedd6cde0378f428b2a90d1591f69dbce6eb: perf: batch streaming message updates (@meowgorithm)

---

<details>
<summary>Verifying the artifacts</summary>

First, download the [`checksums.txt` file](https://github.com/charmbracelet/crush/releases/download/v0.69.1/checksums.txt) and the [`checksums.txt.sigstore.json` file](https://github.com/charmbracelet/crush/releases/download/v0.69.1/checksums.txt.sigstore.json) files, for example, with `wget`:

```bash
wget 'https://github.com/charmbracelet/crush/releases/download/v0.69.1/checksums.txt'
wget 'https://github.com/charmbracelet/crush/releases/download/v0.69.1/checksums.txt.sigstore.json'
```

Then, verify it using [`cosign`](https://github.com/sigstore/cosign):

```bash
cosign verify-blob \
  --certificate-identity 'https://github.com/charmbracelet/meta/.github/workflows/goreleaser.yml@refs/heads/main' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  --bundle 'checksums.txt.sigstore.json' \
  ./checksums.txt
```

If the output is `Verified OK`, you can safely use it to verify the checksums of other artifacts you downloaded from the release using `sha256sum`:

```bash
sha256sum --ignore-missing -c checksums.txt
```

Done! You artifacts are now verified!

</details>

<a href="https://charm.land/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-banner-next.jpg" width="400"></a>

Thoughts? Questions? We love hearing from you. Feel free to reach out on [X](https://x.com/charmcli), [Discord](https://charm.land/discord), [Slack](https://charm.land/slack), [The Fediverse](https://mastodon.social/@charmcli), [Bluesky](https://bsky.app/profile/charm.land).