1**NOTE:** This is a personal fork of
2[Crush](https://github.com/charmbracelet/crush) where I'm experimenting with
3things. You'll also find my patches merged here before they're merged into
4upstream. I've also unconditionally disabled metrics and yote the CLA; devs
5shouldn't assign their copyrights to maintainers and hand them the rug they'll
6yank from under you later.
7
8Install my fork either…
9
10- Using [bin](https://github.com/marcosnils/bin) (highly recommended
11 because it's one tool to manage and update myriad CLI tools
12 distributed as statically-linked binaries, like _nasin pali_)
13 ```bash
14 bin install goinstall://git.secluded.site/crush@v0.23.0-fork.1
15 ```
16- Or using the [go toolchain](https://go.dev/dl) (requires tracking updates
17 manually)
18 ```bash
19 go install git.secluded.site/crush@v0.23.0-fork.1
20 ```
21
22I pull upstream changes into the `upstream` branch here, break my
23branches off that, then merge them into my `dev` branch, which gets
24rebased on `upstream` fairly often. `dev` history will get rewritten
25frequently.
26
27Contributions are welcome (see following section) and I'll try to
28maintain anything I accept here.
29
30## Contributions
31
32Patch requests are in [amolith/llm-projects] on [pr.pico.sh]. You don't
33need a new account to contribute, you don't need to fork this repo, you
34don't need to fiddle with `git send-email`, you don't need to faff with
35your email client to get `git request-pull` working...
36
37You just need:
38
39- Git
40- SSH
41- An SSH key
42
43```sh
44# Clone this repo, make your changes, and commit them
45# Create a new patch request with
46git format-patch origin/main --stdout | ssh pr.pico.sh pr create amolith/llm-projects
47# After potential feedback, submit a revision to an existing patch request with
48git format-patch origin/main --stdout | ssh pr.pico.sh pr add {prID}
49# List patch requests
50ssh pr.pico.sh pr ls amolith/llm-projects
51```
52
53See "How do Patch Requests work?" on [pr.pico.sh]'s home page for a more
54complete example workflow.
55
56[amolith/llm-projects]: https://pr.pico.sh/r/amolith/llm-projects
57[pr.pico.sh]: https://pr.pico.sh
58
59---
60
61_Everything from here on is from the original Crush README._
62
63---
64
65# Crush
66
67<p align="center">
68 <a href="https://stuff.charm.sh/crush/charm-crush.png"><img width="450" alt="Charm Crush Logo" src="https://github.com/user-attachments/assets/adc1a6f4-b284-4603-836c-59038caa2e8b" /></a><br />
69 <a href="https://github.com/charmbracelet/crush/releases"><img src="https://img.shields.io/github/release/charmbracelet/crush" alt="Latest Release"></a>
70 <a href="https://github.com/charmbracelet/crush/actions"><img src="https://github.com/charmbracelet/crush/actions/workflows/build.yml/badge.svg" alt="Build Status"></a>
71</p>
72
73<p align="center">Your new coding bestie, now available in your favourite terminal.<br />Your tools, your code, and your workflows, wired into your LLM of choice.</p>
74<p align="center">你的新编程伙伴,现在就在你最爱的终端中。<br />你的工具、代码和工作流,都与您选择的 LLM 模型紧密相连。</p>
75
76<p align="center"><img width="800" alt="Crush Demo" src="https://github.com/user-attachments/assets/58280caf-851b-470a-b6f7-d5c4ea8a1968" /></p>
77
78## Features
79
80- **Multi-Model:** choose from a wide range of LLMs or add your own via OpenAI- or Anthropic-compatible APIs
81- **Flexible:** switch LLMs mid-session while preserving context
82- **Session-Based:** maintain multiple work sessions and contexts per project
83- **LSP-Enhanced:** Crush uses LSPs for additional context, just like you do
84- **Extensible:** add capabilities via MCPs (`http`, `stdio`, and `sse`)
85- **Works Everywhere:** first-class support in every terminal on macOS, Linux, Windows (PowerShell and WSL), FreeBSD, OpenBSD, and NetBSD
86
87## Installation
88
89Use a package manager:
90
91```bash
92# Homebrew
93brew install charmbracelet/tap/crush
94
95# NPM
96npm install -g @charmland/crush
97
98# Arch Linux (btw)
99yay -S crush-bin
100
101# Nix
102nix run github:numtide/nix-ai-tools#crush
103```
104
105Windows users:
106
107```bash
108# Winget
109winget install charmbracelet.crush
110
111# Scoop
112scoop bucket add charm https://github.com/charmbracelet/scoop-bucket.git
113scoop install crush
114```
115
116<details>
117<summary><strong>Nix (NUR)</strong></summary>
118
119Crush is available via [NUR](https://github.com/nix-community/NUR) in `nur.repos.charmbracelet.crush`.
120
121You can also try out Crush via `nix-shell`:
122
123```bash
124# Add the NUR channel.
125nix-channel --add https://github.com/nix-community/NUR/archive/main.tar.gz nur
126nix-channel --update
127
128# Get Crush in a Nix shell.
129nix-shell -p '(import <nur> { pkgs = import <nixpkgs> {}; }).repos.charmbracelet.crush'
130```
131
132### NixOS & Home Manager Module Usage via NUR
133
134Crush provides NixOS and Home Manager modules via NUR.
135You can use these modules directly in your flake by importing them from NUR. Since it auto detects whether its a home manager or nixos context you can use the import the exact same way :)
136
137```nix
138{
139 inputs = {
140 nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
141 nur.url = "github:nix-community/NUR";
142 };
143
144 outputs = { self, nixpkgs, nur, ... }: {
145 nixosConfigurations.your-hostname = nixpkgs.lib.nixosSystem {
146 system = "x86_64-linux";
147 modules = [
148 nur.modules.nixos.default
149 nur.repos.charmbracelet.modules.crush
150 {
151 programs.crush = {
152 enable = true;
153 settings = {
154 providers = {
155 openai = {
156 id = "openai";
157 name = "OpenAI";
158 base_url = "https://api.openai.com/v1";
159 type = "openai";
160 api_key = "sk-fake123456789abcdef...";
161 models = [
162 {
163 id = "gpt-4";
164 name = "GPT-4";
165 }
166 ];
167 };
168 };
169 lsp = {
170 go = { command = "gopls"; enabled = true; };
171 nix = { command = "nil"; enabled = true; };
172 };
173 options = {
174 context_paths = [ "/etc/nixos/configuration.nix" ];
175 tui = { compact_mode = true; };
176 debug = false;
177 };
178 };
179 };
180 }
181 ];
182 };
183 };
184}
185```
186
187</details>
188
189<details>
190<summary><strong>Debian/Ubuntu</strong></summary>
191
192```bash
193sudo mkdir -p /etc/apt/keyrings
194curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
195echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
196sudo apt update && sudo apt install crush
197```
198
199</details>
200
201<details>
202<summary><strong>Fedora/RHEL</strong></summary>
203
204```bash
205echo '[charm]
206name=Charm
207baseurl=https://repo.charm.sh/yum/
208enabled=1
209gpgcheck=1
210gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo
211sudo yum install crush
212```
213
214</details>
215
216Or, download it:
217
218- [Packages][releases] are available in Debian and RPM formats
219- [Binaries][releases] are available for Linux, macOS, Windows, FreeBSD, OpenBSD, and NetBSD
220
221[releases]: https://github.com/charmbracelet/crush/releases
222
223Or just install it with Go:
224
225```
226go install github.com/charmbracelet/crush@latest
227```
228
229> [!WARNING]
230> Productivity may increase when using Crush and you may find yourself nerd
231> sniped when first using the application. If the symptoms persist, join the
232> [Discord][discord] and nerd snipe the rest of us.
233
234## Getting Started
235
236The quickest way to get started is to grab an API key for your preferred
237provider such as Anthropic, OpenAI, Groq, or OpenRouter and just start
238Crush. You'll be prompted to enter your API key.
239
240That said, you can also set environment variables for preferred providers.
241
242| Environment Variable | Provider |
243| --------------------------- | -------------------------------------------------- |
244| `ANTHROPIC_API_KEY` | Anthropic |
245| `OPENAI_API_KEY` | OpenAI |
246| `OPENROUTER_API_KEY` | OpenRouter |
247| `GEMINI_API_KEY` | Google Gemini |
248| `CEREBRAS_API_KEY` | Cerebras |
249| `HF_TOKEN` | Huggingface Inference |
250| `VERTEXAI_PROJECT` | Google Cloud VertexAI (Gemini) |
251| `VERTEXAI_LOCATION` | Google Cloud VertexAI (Gemini) |
252| `GROQ_API_KEY` | Groq |
253| `AWS_ACCESS_KEY_ID` | Amazon Bedrock (Claude) |
254| `AWS_SECRET_ACCESS_KEY` | Amazon Bedrock (Claude) |
255| `AWS_REGION` | Amazon Bedrock (Claude) |
256| `AWS_PROFILE` | Amazon Bedrock (Custom Profile) |
257| `AWS_BEARER_TOKEN_BEDROCK` | Amazon Bedrock |
258| `AZURE_OPENAI_API_ENDPOINT` | Azure OpenAI models |
259| `AZURE_OPENAI_API_KEY` | Azure OpenAI models (optional when using Entra ID) |
260| `AZURE_OPENAI_API_VERSION` | Azure OpenAI models |
261
262### By the Way
263
264Is there a provider you’d like to see in Crush? Is there an existing model that needs an update?
265
266Crush’s default model listing is managed in [Catwalk](https://github.com/charmbracelet/catwalk), a community-supported, open source repository of Crush-compatible models, and you’re welcome to contribute.
267
268<a href="https://github.com/charmbracelet/catwalk"><img width="174" height="174" alt="Catwalk Badge" src="https://github.com/user-attachments/assets/95b49515-fe82-4409-b10d-5beb0873787d" /></a>
269
270## Configuration
271
272Crush runs great with no configuration. That said, if you do need or want to
273customize Crush, configuration can be added either local to the project itself,
274or globally, with the following priority:
275
2761. `.crush.json`
2772. `crush.json`
2783. `$HOME/.config/crush/crush.json`
279
280Configuration itself is stored as a JSON object:
281
282```json
283{
284 "this-setting": { "this": "that" },
285 "that-setting": ["ceci", "cela"]
286}
287```
288
289As an additional note, Crush also stores ephemeral data, such as application state, in one additional location:
290
291```bash
292# Unix
293$HOME/.local/share/crush/crush.json
294
295# Windows
296%LOCALAPPDATA%\crush\crush.json
297```
298
299### LSPs
300
301Crush can use LSPs for additional context to help inform its decisions, just
302like you would. LSPs can be added manually like so:
303
304```json
305{
306 "$schema": "https://charm.land/crush.json",
307 "lsp": {
308 "go": {
309 "command": "gopls",
310 "env": {
311 "GOTOOLCHAIN": "go1.24.5"
312 }
313 },
314 "typescript": {
315 "command": "typescript-language-server",
316 "args": ["--stdio"]
317 },
318 "nix": {
319 "command": "nil"
320 }
321 }
322}
323```
324
325### MCPs
326
327Crush also supports Model Context Protocol (MCP) servers through three
328transport types: `stdio` for command-line servers, `http` for HTTP endpoints,
329and `sse` for Server-Sent Events. Environment variable expansion is supported
330using `$(echo $VAR)` syntax.
331
332```json
333{
334 "$schema": "https://charm.land/crush.json",
335 "mcp": {
336 "filesystem": {
337 "type": "stdio",
338 "command": "node",
339 "args": ["/path/to/mcp-server.js"],
340 "timeout": 120,
341 "disabled": false,
342 "disabled_tools": ["some-tool-name"],
343 "env": {
344 "NODE_ENV": "production"
345 }
346 },
347 "github": {
348 "type": "http",
349 "url": "https://api.githubcopilot.com/mcp/",
350 "timeout": 120,
351 "disabled": false,
352 "disabled_tools": ["create_issue", "create_pull_request"],
353 "headers": {
354 "Authorization": "Bearer $GH_PAT"
355 }
356 },
357 "streaming-service": {
358 "type": "sse",
359 "url": "https://example.com/mcp/sse",
360 "timeout": 120,
361 "disabled": false,
362 "headers": {
363 "API-Key": "$(echo $API_KEY)"
364 }
365 }
366 }
367}
368```
369
370### Memory
371
372Crush automatically includes two memory files for cross-project instructions.
373
374- `~/.config/crush/CRUSH.md`: Crush-specific rules that would confuse other
375 agentic coding tools. If you only use Crush, this is the only one you need to
376 edit.
377- `~/.config/AGENTS.md`: generic instructions that other coding tools might
378 read. Avoid referring to Crush-specific tools or workflows here.
379
380You can customize these paths using the `memory_paths` option in your
381configuration:
382
383```json
384{
385 "$schema": "https://charm.land/crush.json",
386 "options": {
387 "memory_paths": [
388 "/path/to/custom/memory/file.md",
389 "/path/to/folder/of/files/" // recursively load all .md files in folder
390 ]
391 }
392}
393```
394
395### Ignoring Files
396
397Crush respects `.gitignore` files by default, but you can also create a
398`.crushignore` file to specify additional files and directories that Crush
399should ignore. This is useful for excluding files that you want in version
400control but don't want Crush to consider when providing context.
401
402The `.crushignore` file uses the same syntax as `.gitignore` and can be placed
403in the root of your project or in subdirectories.
404
405### Allowing Tools
406
407By default, Crush will ask you for permission before running tool calls. If
408you'd like, you can allow tools to be executed without prompting you for
409permissions. Use this with care.
410
411```json
412{
413 "$schema": "https://charm.land/crush.json",
414 "permissions": {
415 "allowed_tools": [
416 "view",
417 "ls",
418 "grep",
419 "edit",
420 "mcp_context7_get-library-doc"
421 ]
422 }
423}
424```
425
426You can also skip all permission prompts entirely by running Crush with the
427`--yolo` flag. Be very, very careful with this feature.
428
429### Disabling Built-In Tools
430
431If you'd like to prevent Crush from using certain built-in tools entirely, you
432can disable them via the `options.disabled_tools` list. Disabled tools are
433completely hidden from the agent.
434
435```json
436{
437 "$schema": "https://charm.land/crush.json",
438 "options": {
439 "disabled_tools": [
440 "bash",
441 "sourcegraph"
442 ]
443 }
444}
445```
446
447To disable tools from MCP servers, see the [MCP config section](#mcps).
448
449### Desktop notifications
450
451Crush sends desktop notifications when a tool call requires permission and when
452the agent finishes its turn. They're only sent when the terminal window isn't
453focused _and_ your terminal supports reporting the focus state.
454
455```json
456{
457 "$schema": "https://charm.land/crush.json",
458 "options": {
459 "disable_notifications": true // default
460 }
461}
462```
463
464To disable desktop notifications, set `disable_notifications` to `true` in your
465configuration. On macOS, notifications currently lack icons due to platform
466limitations.
467
468### Initialization
469
470When you initialize a project, Crush analyzes your codebase and creates
471a context file that helps it work more effectively in future sessions.
472By default, this file is named `AGENTS.md`, but you can customize the
473name and location with the `initialize_as` option:
474
475```json
476{
477 "$schema": "https://charm.land/crush.json",
478 "options": {
479 "initialize_as": "AGENTS.md"
480 }
481}
482```
483
484This is useful if you prefer a different naming convention or want to
485place the file in a specific directory (e.g., `CRUSH.md` or
486`docs/LLMs.md`). Crush will fill the file with project-specific context
487like build commands, code patterns, and conventions it discovered during
488initialization.
489
490### Attribution Settings
491
492By default, Crush adds attribution information to Git commits and pull requests
493it creates. You can customize this behavior with the `attribution` option:
494
495```json
496{
497 "$schema": "https://charm.land/crush.json",
498 "options": {
499 "attribution": {
500 "trailer_style": "co-authored-by",
501 "generated_with": true
502 }
503 }
504}
505```
506
507- `trailer_style`: Controls the attribution trailer added to commit messages
508 (default: `assisted-by`)
509 - `assisted-by`: Adds `Assisted-by: [Model Name] via Crush <crush@charm.land>`
510 (includes the model name)
511 - `co-authored-by`: Adds `Co-Authored-By: Crush <crush@charm.land>`
512 - `none`: No attribution trailer
513- `generated_with`: When true (default), adds `💘 Generated with Crush` line to
514 commit messages and PR descriptions
515
516### Custom Providers
517
518Crush supports custom provider configurations for both OpenAI-compatible and
519Anthropic-compatible APIs.
520
521> [!NOTE]
522> Note that we support two "types" for OpenAI. Make sure to choose the right one
523> to ensure the best experience!
524> * `openai` should be used when proxying or routing requests through OpenAI.
525> * `openai-compat` should be used when using non-OpenAI providers that have OpenAI-compatible APIs.
526
527#### OpenAI-Compatible APIs
528
529Here’s an example configuration for Deepseek, which uses an OpenAI-compatible
530API. Don't forget to set `DEEPSEEK_API_KEY` in your environment.
531
532```json
533{
534 "$schema": "https://charm.land/crush.json",
535 "providers": {
536 "deepseek": {
537 "type": "openai-compat",
538 "base_url": "https://api.deepseek.com/v1",
539 "api_key": "$DEEPSEEK_API_KEY",
540 "models": [
541 {
542 "id": "deepseek-chat",
543 "name": "Deepseek V3",
544 "cost_per_1m_in": 0.27,
545 "cost_per_1m_out": 1.1,
546 "cost_per_1m_in_cached": 0.07,
547 "cost_per_1m_out_cached": 1.1,
548 "context_window": 64000,
549 "default_max_tokens": 5000
550 }
551 ]
552 }
553 }
554}
555```
556
557#### Anthropic-Compatible APIs
558
559Custom Anthropic-compatible providers follow this format:
560
561```json
562{
563 "$schema": "https://charm.land/crush.json",
564 "providers": {
565 "custom-anthropic": {
566 "type": "anthropic",
567 "base_url": "https://api.anthropic.com/v1",
568 "api_key": "$ANTHROPIC_API_KEY",
569 "extra_headers": {
570 "anthropic-version": "2023-06-01"
571 },
572 "models": [
573 {
574 "id": "claude-sonnet-4-20250514",
575 "name": "Claude Sonnet 4",
576 "cost_per_1m_in": 3,
577 "cost_per_1m_out": 15,
578 "cost_per_1m_in_cached": 3.75,
579 "cost_per_1m_out_cached": 0.3,
580 "context_window": 200000,
581 "default_max_tokens": 50000,
582 "can_reason": true,
583 "supports_attachments": true
584 }
585 ]
586 }
587 }
588}
589```
590
591### Amazon Bedrock
592
593Crush currently supports running Anthropic models through Bedrock, with caching disabled.
594
595- A Bedrock provider will appear once you have AWS configured, i.e. `aws configure`
596- Crush also expects the `AWS_REGION` or `AWS_DEFAULT_REGION` to be set
597- To use a specific AWS profile set `AWS_PROFILE` in your environment, i.e. `AWS_PROFILE=myprofile crush`
598- Alternatively to `aws configure`, you can also just set `AWS_BEARER_TOKEN_BEDROCK`
599
600### Vertex AI Platform
601
602Vertex AI will appear in the list of available providers when `VERTEXAI_PROJECT` and `VERTEXAI_LOCATION` are set. You will also need to be authenticated:
603
604```bash
605gcloud auth application-default login
606```
607
608To add specific models to the configuration, configure as such:
609
610```json
611{
612 "$schema": "https://charm.land/crush.json",
613 "providers": {
614 "vertexai": {
615 "models": [
616 {
617 "id": "claude-sonnet-4@20250514",
618 "name": "VertexAI Sonnet 4",
619 "cost_per_1m_in": 3,
620 "cost_per_1m_out": 15,
621 "cost_per_1m_in_cached": 3.75,
622 "cost_per_1m_out_cached": 0.3,
623 "context_window": 200000,
624 "default_max_tokens": 50000,
625 "can_reason": true,
626 "supports_attachments": true
627 }
628 ]
629 }
630 }
631}
632```
633
634### Local Models
635
636Local models can also be configured via OpenAI-compatible API. Here are two common examples:
637
638#### Ollama
639
640```json
641{
642 "providers": {
643 "ollama": {
644 "name": "Ollama",
645 "base_url": "http://localhost:11434/v1/",
646 "type": "openai-compat",
647 "models": [
648 {
649 "name": "Qwen 3 30B",
650 "id": "qwen3:30b",
651 "context_window": 256000,
652 "default_max_tokens": 20000
653 }
654 ]
655 }
656 }
657}
658```
659
660#### LM Studio
661
662```json
663{
664 "providers": {
665 "lmstudio": {
666 "name": "LM Studio",
667 "base_url": "http://localhost:1234/v1/",
668 "type": "openai-compat",
669 "models": [
670 {
671 "name": "Qwen 3 30B",
672 "id": "qwen/qwen3-30b-a3b-2507",
673 "context_window": 256000,
674 "default_max_tokens": 20000
675 }
676 ]
677 }
678 }
679}
680```
681
682## Logging
683
684Sometimes you need to look at logs. Luckily, Crush logs all sorts of
685stuff. Logs are stored in `./.crush/logs/crush.log` relative to the project.
686
687The CLI also contains some helper commands to make perusing recent logs easier:
688
689```bash
690# Print the last 1000 lines
691crush logs
692
693# Print the last 500 lines
694crush logs --tail 500
695
696# Follow logs in real time
697crush logs --follow
698```
699
700Want more logging? Run `crush` with the `--debug` flag, or enable it in the
701config:
702
703```json
704{
705 "$schema": "https://charm.land/crush.json",
706 "options": {
707 "debug": true,
708 "debug_lsp": true
709 }
710}
711```
712
713## Provider Auto-Updates
714
715By default, Crush automatically checks for the latest and greatest list of
716providers and models from [Catwalk](https://github.com/charmbracelet/catwalk),
717the open source Crush provider database. This means that when new providers and
718models are available, or when model metadata changes, Crush automatically
719updates your local configuration.
720
721### Disabling automatic provider updates
722
723For those with restricted internet access, or those who prefer to work in
724air-gapped environments, this might not be want you want, and this feature can
725be disabled.
726
727To disable automatic provider updates, set `disable_provider_auto_update` into
728your `crush.json` config:
729
730```json
731{
732 "$schema": "https://charm.land/crush.json",
733 "options": {
734 "disable_provider_auto_update": true
735 }
736}
737```
738
739Or set the `CRUSH_DISABLE_PROVIDER_AUTO_UPDATE` environment variable:
740
741```bash
742export CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1
743```
744
745### Manually updating providers
746
747Manually updating providers is possible with the `crush update-providers`
748command:
749
750```bash
751# Update providers remotely from Catwalk.
752crush update-providers
753
754# Update providers from a custom Catwalk base URL.
755crush update-providers https://example.com/
756
757# Update providers from a local file.
758crush update-providers /path/to/local-providers.json
759
760# Reset providers to the embedded version, embedded at crush at build time.
761crush update-providers embedded
762
763# For more info:
764crush update-providers --help
765```
766
767## Metrics
768
769Crush records pseudonymous usage metrics (tied to a device-specific hash),
770which maintainers rely on to inform development and support priorities. The
771metrics include solely usage metadata; prompts and responses are NEVER
772collected.
773
774Details on exactly what’s collected are in the source code ([here](https://github.com/charmbracelet/crush/tree/main/internal/event)
775and [here](https://github.com/charmbracelet/crush/blob/main/internal/llm/agent/event.go)).
776
777You can opt out of metrics collection at any time by setting the environment
778variable by setting the following in your environment:
779
780```bash
781export CRUSH_DISABLE_METRICS=1
782```
783
784Or by setting the following in your config:
785
786```json
787{
788 "options": {
789 "disable_metrics": true
790 }
791}
792```
793
794Crush also respects the [`DO_NOT_TRACK`](https://consoledonottrack.com)
795convention which can be enabled via `export DO_NOT_TRACK=1`.
796
797## Contributing
798
799See the [contributing guide](https://github.com/charmbracelet/crush?tab=contributing-ov-file#contributing).
800
801## Whatcha think?
802
803We’d love to hear your thoughts on this project. Need help? We gotchu. You can find us on:
804
805- [Twitter](https://twitter.com/charmcli)
806- [Slack](https://charm.land/slack)
807- [Discord][discord]
808- [The Fediverse](https://mastodon.social/@charmcli)
809- [Bluesky](https://bsky.app/profile/charm.land)
810
811[discord]: https://charm.land/discord
812
813## License
814
815[FSL-1.1-MIT](https://github.com/charmbracelet/crush/raw/main/LICENSE.md)
816
817---
818
819Part of [Charm](https://charm.land).
820
821<a href="https://charm.land/"><img alt="The Charm logo" width="400" src="https://stuff.charm.sh/charm-banner-next.jpg" /></a>
822
823<!--prettier-ignore-->
824Charm热爱开源 • Charm loves open source