v0.85.0

charmbracelet/crushv0.85.0Jul 16, 2026by github-actions[bot]

AI Summary

Introduced a first-class Question tool for structured user input and an elapsed seconds timer.

Key Highlights

  • Added a Question tool with multiple input types (single/multi choice, text, yes/no).
  • Implemented an elapsed seconds timer to track how long an LLM has been running.
  • Improved auth reliability and dialog rendering on small screens.

New Features

  • Question tool for structured input
  • Elapsed seconds timer

Full Release Notes

# If you have questions, we have answers

This release brings us a question tool (at last!) plus a bunch of bugfixes and niceties. Let's go!

## The Question Tool

So! Crush now ships with a first class question tool, useful for when LLMs wanna grill you. The question tool comes in many forms, like single choice, multiple choice, free form text, and yes/no. Questions can be ganged together to build a form, too.

<p><img width="600" src="https://github.com/user-attachments/assets/81097b9b-6819-4e7d-9944-6ae771f6dab5" /></p>

What’s that you say? “Does it have mouse support?” Why, yes it does.

<p><img width="600" src="https://github.com/user-attachments/assets/75911693-49c9-4475-b812-935221337f5b" /></p>

What is this sorcery? Only @taciturnaxolotl knows. He solo’d this whole feature exclusively with open source models on [Hyper](https://hyper.charm.land).

## Hurry up and wait

Ever put an LLM to work, only to forget about it and come back and wonder how long it's been cranking? @andrinoff sure did. Wonder no more.

<p><img width="411" alt="output" src="https://github.com/user-attachments/assets/a2e35914-d89f-4a77-97d6-3283f1de06a3" /></p>

## And so much more

Like Prince in the 80s, @taciturnaxolotl continued his tour of awesomeness alongside @andreynering to make Crush better under the hood too:

* Fixed: `crush auth` now works outside of client/server mode
* New: Crush now auto retries auth under the hood when it fails
* Improved: dialogues now render great on tiny screens
* Perf: scrollbar optimizations for faster rendering
* Perf: memoized markdown renderer for faster rendering
* Perf: short circuit `jq` builtin operations if the turn was canceled before it started
* Yay! OpenAI merged our PR upstream so we're back off our fork

Buckle up, we have a bunch more coming.

xoxo,
Charm 💘

## Changelog
### New!
* 686a3f46e1876e9025a29bf846f11fac91bbb3f3: feat(dialog): hide list info column when it would crowd item names (@taciturnaxolotl)
* 75e7195fbd713d7f13dd242b8f994f11e070fe6b: feat(question): add client server integration (@taciturnaxolotl)
* 6f33b6668505ce0e30ef7e83fa642c9bf8c23c95: feat(question): add mouse scrolling (@taciturnaxolotl)
* 321c661e88079a6af12cec7a4606a389a5627a73: feat(question): add mouse support (@taciturnaxolotl)
* 1b5994c04f5a3e1c0d94cb05c80ccd07a187ebf1: feat(question): add paste support in text areas (@taciturnaxolotl)
* c2a6f76565600492aa2769d66ccd5ef7c00ea6a0: feat(question): add question tool with structured UI (@taciturnaxolotl)
* 9f4f145ad7c63bf6526d4517b88e8a98aa5bda96: feat(question): adjust question prompts and error messages (@taciturnaxolotl)
* 5e611a70a6e48ccb7dbb3ff020ee1efa5d37772d: feat(question): allow newlines and make free text like pop (@taciturnaxolotl)
* f69a91e5ab058a78c581af68c4e6bdde569bad44: feat(question): extend length limits on question tool (@taciturnaxolotl)
* 3bf40358a06e43863dc9689ea2bd286937063ca6: feat(question): make escape cancel the question instead of submitting empty answers (@taciturnaxolotl)
* 81a8ee4b54a980e4f4d08d1f7edfcbdd7a24b810: feat(question): redo tab resizing and mouse -> keyboard transition (@taciturnaxolotl)
* a5a5c6c54b40620ec2fdc20ccdf4b3224961a654: feat(question): tweak the confirmation tab (@taciturnaxolotl)
* 29f5691db4a9646910397bf7437e91f30c5d4fa3: feat(question): tweak yes/no to add shortcuts (@taciturnaxolotl)
* dc1609977e53f62843f6a9df78ba4283da62793c: feat: elapsed seconds timer (#3223) (@andrinoff)
* 64bbbebc430dd5031b92d62f179cbd6a22c09069: feat: integrate fantasy OnAuthRefresh for transparent auth retry (@taciturnaxolotl)
* d1489a603d357ab3e07dda66079130d4d5cdccb9: feat: wire LM Studio vision capabilities to SupportsImages (#3280) (@josh-socium)
### Fixed
* f3592bd8c501732e56128be07ce5fa694b008318: fix(dialog): account for the input prompt width so long values don't wrap (@taciturnaxolotl)
* 2c6424c179ee6ef21d2190744410ca289a9ad9da: fix(dialog): center permission buttons in fullscreen (@taciturnaxolotl)
* bbf654fb92f578bf5a1e4956b0d38b9297768fef: fix(dialog): centralize keybind hint rendering and stop overflow (@taciturnaxolotl)
* d6c63d31e255841038270d4b88ef347986e8da63: fix(dialog): clamp DrawCenter and DrawOnboarding content to screen bounds (@taciturnaxolotl)
* f6528f72ff5057fbb40d8e9b4f2ebf67b3fc119f: fix(dialog): constrain Quit dialog padding on narrow screens (@taciturnaxolotl)
* 31550cb4f9c04d9fc1d5e552be7745d2333cfee6: fix(dialog): fix OAuth content wrapping and full-width layout (@taciturnaxolotl)
* 352e26515901b9fd563fcbe7b8d945da678135d6: fix(dialog): fix model provider label truncation at low widths (@taciturnaxolotl)
* a69ace5e0bb4e0461c230498c29805446b137083: fix(dialog): keep dialogs stable on small screens (@taciturnaxolotl)
* 151b38d424fe561bc19669b10d7ee3aa66a4b19c: fix(dialog): make APIKeyInput width responsive to terminal size (@taciturnaxolotl)
* 3e2bd1cc4535eb5988c6990224f778256fcfb457: fix(dialog): make OAuth dialog width responsive to terminal size (@taciturnaxolotl)
* aaf92f866282d0eccacfa5a21025bcd25a504afc: fix(dialog): mute command list shortcut hints (@taciturnaxolotl)
* 605dfc9e3d3cc497f7594ced3820312cc32ddc3f: fix(dialog): remove dead space beside the list scrollbar (@taciturnaxolotl)
* 6407b8529ed394e6fef49c08fac3cdab165b8013: fix(dialog): scale FilePicker down on small screens (@taciturnaxolotl)
* 0c61aeee761afa9c967e9c6990e003bc4f5e6de7: fix(dialog): stop list item names from wrapping past the list width (@taciturnaxolotl)
* e271cecb3617626d8cf98fe94672c050d1eff2fd: fix(dialog): subtract border size in Reasoning and Notifications width (@taciturnaxolotl)
* e8c2772d272f179a9073b7214e236a2159429058: fix(dialog): truncate TitleInfo when it exceeds dialog width (@taciturnaxolotl)
* 2b4a01ae994cce7c2c9b5c08bb9d2aafad5dd15a: fix(dialog): truncate dialog titles instead of wrapping on small screens (@taciturnaxolotl)
* b5cd46c2381afda7adee567f7abadc101ef4dc2c: fix(errors): properly supress context cancelation error (@taciturnaxolotl)
* e34e707c175abd1a46f0135a2657d308129adb41: fix(events): restore file picker event (#3314) (@taciturnaxolotl)
* b75d6bc27b33bffb59b8ea9f304999515db74ff3: fix(oauth): fix the ui freeze on loading model endpoints (@taciturnaxolotl)
* 82e889858c654896b73bcd3e80616b5adc62fe11: fix(question): address PR review feedback (@taciturnaxolotl)
* ca5a19d7432a50eee59539b7568ce825a0bca2ce: fix(question): fix a bug with the hover state coming deselected (@taciturnaxolotl)
* cbb9d4f2614ad87d0d2feaf7b348189fa464e25f: fix(question): fix scrollbar disappearing in single-select (@taciturnaxolotl)
* 9e6175a2ea839a8a875f59e7ca05aa05e8780fde: fix(question): make scroll containers consistent (@taciturnaxolotl)
* 70c64b5794ec77cac6735007d68e20ae4e2fddd9: fix(question): route scrolling properly depending on which area is (@taciturnaxolotl)
* 5e6890de82a029bbb83b5e8205e483ec44e57207: fix(tests): bail on precancelled ctx in handleJQ (#3058) (@taciturnaxolotl)
* 1937ac54c597bb04553e8242e79314b5b1c0a9b7: fix: match question tool cursor color to main editor (@meowgorithm)
* ee00ec7bb6d0b698bad0bcda2cbf9e23ef307582: fix: respect client-server mode during login (#3315) (@andreynering)
### Other stuff
* 3c51a9f2f03e3f2e9de59a84d7a75e999c5ebe52: bug(client/server): fix non interactive init (@taciturnaxolotl)
* 2b969b2a862c250cbb8c529fe7148574a060f793: chore: auto-update files (@charmcli)
* 4721e53c30a0c51a718b84ff54f42cdee4e63ae0: chore: auto-update files (@charmcli)
* 14483caceb20c1d2283ffc69da1db7d42fb58540: chore: switch back to upstream openai sdk (#3308) (@andreynering)
* 4d901d1be4d4aec2dd1098b7e39c28e19c505b84: perf(ui): keep chat resize smooth on large conversations (@taciturnaxolotl)
* d29fc2ca6c84404ae40ff7dd72c76a079ed3a1bf: perf(ui): memoize chroma lexer lookups by filename (@taciturnaxolotl)
* 1bfc53f66fb92d9491b00b8602b7dff805bccca4: perf(ui): memoize the chroma syntax-highlight style (@taciturnaxolotl)
* e456a902c30e24fe5f4e7e8aa9060294079ed1a3: refactor(dialog): dedupe scrollbar joins and tame the permission Draw (@taciturnaxolotl)
* 492460a854cd890ac362390580b56f38ee2dd359: refactor: make the coordinator use a struct (@taciturnaxolotl)

---

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

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

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