ChatGPT subs, non-interactive improvements, and a touch of perf
This is a pretty solid release with some nice contributions from both the Charm team and one of our fave contributors. Let's go!
Use your ChatGPT subscription in Crush
If you love Crush and your ChatGPT subscription you’ll love this release. Enjoy!
Non-interactive mode: reasoning
Headless Crush users now get more control with a new --reasoning-effort flag in crush run. Go crazy and orchestrate to the max!
If you (or your agent) mistypes a reasoning effort you'll get the proper accepted values, too.
crush run --model "hyper/glm-5.3" --reasoning-effort "max"Shredding the perf
@taigrr contributed a bunch of solid performance improvements to scrolling and spinners. Mouse scroll events are coalesced, chat scrolls are memoized and the spinners all use a shared clock. This stuff is really good: check it out.
Choppin’ off 4MB
We also ripped the Swagger stuff from client-server mode with a hand-rolled—but fully OpenAPI v3.2.1 compliant—implementation. This shaved about 4MB off the binary and will nullify chances of in the long run. Thanks, Go type system!
Have a great weekend,
Charm 💌
Changelog
- efba40b: feat: OpenAI oAuth (@andrinoff)
- 4a74b9e: fix(sessions): keep list position after deletion (#3769) (@ifsin)
- 33be610: fix: @meowgorithm review (@andrinoff)
- 63829ed: fix: always emit tool results right after calls (#3743) (@andrinoff)
- cdc7200: fix: always show full bash command in tui, output stays collapsible (@andreynering)
- d25b5ee: fix: colorize CLI mode and use localhost URL (@andrinoff)
- 45a45c5: fix: do not remove from API catalogue (@andrinoff)
- 80ebee4: fix: dropped reasoning effort (#3748) (@andrinoff)
- 074e41e: fix: keep scroll position when expanding or collapsing chat items (@andreynering)
- 094ac5d: fix: match ex. anthropic UI on choice (@andrinoff)
- 04eed5d: fix: refine first page (@andrinoff)
- 652f74f: fix: remove re-routing logic (@andrinoff)
- 3a84d5e: fix: remove the Sign In with ChatGPT in catalogue (@andrinoff)
- 616c17b: fix: remove the separate sections (@andrinoff)
- 833bef6: fix: show content in full when collapsing would hide only one line (@andreynering)
- bb33cee: chore(event-bus): make event fan-in helpers generic methods (#3768) (@taigrr)
- 8829832: chore: bump fantasy (@andrinoff)
- e5687e2: chore: lint (@andrinoff)
- 8db8331: noninteractive: add --reasoning-effort flag with model validation (@meowgorithm)
- 18447d5: oauth-cli: adjust inline logout TUIs (@meowgorithm)
- bc3931c: oauth-cli: overhaul and unify oauth TUIs (@meowgorithm)
- 7a63cb1: oauth-ui: small nudges (@meowgorithm)
- e2f077c: oauth-ui: use ChatGPT instead of OpenAI in the auth dialog copy (@meowgorithm)
- c21c7c4: refactor: replace swaggo annotations with a Go-native endpoint registry (@meowgorithm)
- 8ce2bdf: ui-perf: drive all spinners from one shared animation clock (@taigrr)
- 0ffab3f: ui-perf: memoize rendered frames for scroll-only updates (@taigrr)
- 35b5f87: ui-perf: stop coalesced wheel scrolls from rewinding to the selection (@taigrr)
Verifying the artifacts
First, download the checksums.txt file and the checksums.txt.sigstore.json file files, for example, with wget:
wget 'https://github.com/charmbracelet/crush/releases/download/v0.94.1/checksums.txt'
wget 'https://github.com/charmbracelet/crush/releases/download/v0.94.1/checksums.txt.sigstore.json'Then, verify it using cosign:
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.txtIf the output is Verified OK, you can safely use it to verify the checksums of other artifacts you downloaded from the release using sha256sum:
sha256sum --ignore-missing -c checksums.txtDone! You artifacts are now verified!
Thoughts? Questions? We love hearing from you. Feel free to reach out on X, Discord, Slack, The Fediverse, Bluesky.

