v0.71.0

charmbracelet/crushv0.71.0May 22, 2026by github-actions[bot]

AI Summary

Multiple improvements including UI scrollbar, token usage estimation for providers that don't report it, Bedrock region enforcement, and security improvements to permission prompts.

Key Highlights

  • Added scrollbar to model list dialog
  • Token usage estimation when provider doesn't report it
  • Enforced us-east-1 region for AWS Bedrock
  • Permission prompts required for chained Bash commands
  • Support for user-invocable skills

New Features

  • Scrollbar for model list
  • Token and cost estimation fallback
  • Permission prompts for chained commands
  • User-invocable skills support

Full Release Notes

# Small feats, fixes, Bedrock and more

We have quite a good number of things for a Friday. Let's take a quick look at them!

## Scrollbar

The model list now got a scrollbar, so you can see how long the list is and where you are on it. It's a small addition, but nice and useful.

<img width="674" height="438" alt="Screenshot 2026-05-22 at 17 29 28" src="https://github.com/user-attachments/assets/e78cc790-7201-4fee-a0c0-bcb7bfbf73f1" />

## Token usage

Some providers do not report how many tokens were used in a request. In these cases, Crush wasn't showing the token usage or estimated cost in the sidebar.

@taoeffect added token and cost estimation when the provider doesn't report this. Now you'll have an idea on how fast you're burning tokens.

## Bedrock

We made some changes to avoid some confusing when using AWS Bedrock.

Before, Crush was using whichever region you had set on `AWS_REGION` or `AWS_DEFAULT_REGION` variables. The problem is that most region have few models available, so you could be unable to use them if you had a different region set.

We're always using the `us-east-1` region, which have all models available. This should make Crush work out-of-the-box with Bedrock without specific local region configuration.

If you have any feedback on Crush for Bedrock, reach out on our [Discord](https://charm.land/discord) or [Slack](https://charm.land/slack) communities.

## Stream fixes

@ethanndickson contributed with two fixes on [Fantasy](https://github.com/charmbracelet/fantasy) that should fix some errors related to streaming.

## Permission prompts

We tightned up permission prompts a bit to improve security, when the model wants to run Bash comments with pipes, redirection, etc. Crush will now always ask for permission in these cases.

## Reasoning effort level fix

We fixed a bug to ensure Crush won't ever send a reasoning effort level when the model doesn't supports it. This should fix potential errors for a couple providers.

## More client-server

More fixes to the experimental client-server architecture were merged.

You can opt-in to this mode with `export CRUSH_CLIENT_SERVER=1`.

## That's all

There were more small fixes and improvements, but the list above is a good summary.

Enjoy your weekend (and Holiday for Americans) and see you next week!
Charm :sparklers:

## Changelog
### New!
* 96728b15d037f187424db63cd6bdb20a01fbe08f: feat(permissions): require a permission prompt for chained commands (@taciturnaxolotl)
* 6716ef09fc0612e3f707469395546362922e0dc4: feat(skills): add support for user invocable skills (@taciturnaxolotl)
* ce395837b7f584d025574fab7939fc37a445fae1: feat: render scrollbar for model list (dialog and onboarding) (#2978) (@andreynering)
### Fixed
* 83d2abbf0a62f8bda0cb4b5ef499eff11dd81a20: fix(agent): clear stale summary token counts (@taoeffect)
* 2e9c65057b8ca5abc8aa54b21856b869c733d52c: fix(agent): correct fallback usage accounting (@taoeffect)
* 6ed8852b621faff72fe3f791efdc41678b439b9e: fix(agent): estimate missing streamed usage (@taoeffect)
* 74e6e378e37493440cb01c956ef6de7ebcde38e1: fix(agent): harden fallback usage accounting (@taoeffect)
* 74b84f6968fde0d80562be9f31f56cbc8cf35cf7: fix(bedrock): enforce `us-east-1` as region for bedrock (#2985) (@andreynering)
* 56cf50adac921ae8cb57d894e7930f06cfc1e8d7: fix(db): keep SQLite temp files in memory (@taciturnaxolotl)
* 841eec8f89335d0eebb8f334057a1a2ee0efb159: fix(models): fix sorting of hyper (@taciturnaxolotl)
* 1811bec2cc6d7d595a9d1c9ff19dd9e239a41392: fix(prompts): tweak file reads to encourage more targetted reads (@taciturnaxolotl)
* d025403923d4f2fc8523d962f5e9d51a854ac801: fix(server): display available skills in client (@meowgorithm)
* 27a35c94cc1496bd4a2f5fdb4e398427815a4715: fix(server): support attachments in client-server mode (@meowgorithm)
* 9595d1f073dde42e1749853688299a4bad19f496: fix(session): preserve estimated usage marker (@taoeffect)
* 5d7797d0f1b37a1ccf19f5ab1e1c48c3598daa5d: fix(ui): add locking around markdown rendering (@neomantra)
* 5b1b2b435cd805462e6c01fa6d3453bea0199166: fix(ui): guard divide-by-zero display error (@neomantra)
* 2736e487cf511a686daf691d9135f9491d4ac865: fix(ui): mark estimated context usage (@taoeffect)
* 4fc17ddcae6a37eb14f824f81b3befbcd1da03fd: fix(ui): preserve estimated usage percentage color (@taoeffect)
* 1320fcf5ce10ce0b8ac0e2f3580ae3adf1da18cc: fix(ui): scroll to the properly select model (@taciturnaxolotl)
* 2faa467ab08de94aaa7583836491c6d4f7fabcf8: fix: fix sometimes sending reasoning effort when it shouldn't (#2982) (@andreynering)
* 6b312bee06bf3ca90ba587035a7287594b97e186: fix: potential data race on `permissionService` (#2964) (@mei2jun1)
* 3250fef354eb7ebc40faaa0a1c4c5c9f37f0f6dc: fix: update fantasy with stream fixes (#2968) (@andreynering)
### Other stuff
* 8468c8c011095520a3b6eda23ee1d03c2e9eefc2: chore(tests): update golden files (@taciturnaxolotl)
* 88e97a05a307e87fbddb25aa692d7be1ee906d1a: chore: auto-update files (@charmcli)
* df3a04d19d8a43e4568c1dc89cd86ebe6c707424: chore: isolate store test (@taciturnaxolotl)

---

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

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

```bash
wget 'https://github.com/charmbracelet/crush/releases/download/v0.71.0/checksums.txt'
wget 'https://github.com/charmbracelet/crush/releases/download/v0.71.0/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).