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.31.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.31.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# FreeBSD
105pkg install crush
106```
107
108Windows users:
109
110```bash
111# Winget
112winget install charmbracelet.crush
113
114# Scoop
115scoop bucket add charm https://github.com/charmbracelet/scoop-bucket.git
116scoop install crush
117```
118
119<details>
120<summary><strong>Nix (NUR)</strong></summary>
121
122Crush is available via the offical Charm [NUR](https://github.com/nix-community/NUR) in `nur.repos.charmbracelet.crush`, which is the most up-to-date way to get Crush in Nix.
123
124You can also try out Crush via the NUR with `nix-shell`:
125
126```bash
127# Add the NUR channel.
128nix-channel --add https://github.com/nix-community/NUR/archive/main.tar.gz nur
129nix-channel --update
130
131# Get Crush in a Nix shell.
132nix-shell -p '(import <nur> { pkgs = import <nixpkgs> {}; }).repos.charmbracelet.crush'
133```
134
135### NixOS & Home Manager Module Usage via NUR
136
137Crush provides NixOS and Home Manager modules via NUR.
138You 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 :)
139
140```nix
141{
142 inputs = {
143 nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
144 nur.url = "github:nix-community/NUR";
145 };
146
147 outputs = { self, nixpkgs, nur, ... }: {
148 nixosConfigurations.your-hostname = nixpkgs.lib.nixosSystem {
149 system = "x86_64-linux";
150 modules = [
151 nur.modules.nixos.default
152 nur.repos.charmbracelet.modules.crush
153 {
154 programs.crush = {
155 enable = true;
156 settings = {
157 providers = {
158 openai = {
159 id = "openai";
160 name = "OpenAI";
161 base_url = "https://api.openai.com/v1";
162 type = "openai";
163 api_key = "sk-fake123456789abcdef...";
164 models = [
165 {
166 id = "gpt-4";
167 name = "GPT-4";
168 }
169 ];
170 };
171 };
172 lsp = {
173 go = { command = "gopls"; enabled = true; };
174 nix = { command = "nil"; enabled = true; };
175 };
176 options = {
177 context_paths = [ "/etc/nixos/configuration.nix" ];
178 tui = { compact_mode = true; };
179 debug = false;
180 };
181 };
182 };
183 }
184 ];
185 };
186 };
187}
188```
189
190</details>
191
192<details>
193<summary><strong>Debian/Ubuntu</strong></summary>
194
195```bash
196sudo mkdir -p /etc/apt/keyrings
197curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
198echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
199sudo apt update && sudo apt install crush
200```
201
202</details>
203
204<details>
205<summary><strong>Fedora/RHEL</strong></summary>
206
207```bash
208echo '[charm]
209name=Charm
210baseurl=https://repo.charm.sh/yum/
211enabled=1
212gpgcheck=1
213gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo
214sudo yum install crush
215```
216
217</details>
218
219Or, download it:
220
221- [Packages][releases] are available in Debian and RPM formats
222- [Binaries][releases] are available for Linux, macOS, Windows, FreeBSD, OpenBSD, and NetBSD
223
224[releases]: https://github.com/charmbracelet/crush/releases
225
226Or just install it with Go:
227
228```
229go install github.com/charmbracelet/crush@latest
230```
231
232> [!WARNING]
233> Productivity may increase when using Crush and you may find yourself nerd
234> sniped when first using the application. If the symptoms persist, join the
235> [Discord][discord] and nerd snipe the rest of us.
236
237## Getting Started
238
239The quickest way to get started is to grab an API key for your preferred
240provider such as Anthropic, OpenAI, Groq, or OpenRouter and just start
241Crush. You'll be prompted to enter your API key.
242
243That said, you can also set environment variables for preferred providers.
244
245| Environment Variable | Provider |
246| --------------------------- | -------------------------------------------------- |
247| `ANTHROPIC_API_KEY` | Anthropic |
248| `OPENAI_API_KEY` | OpenAI |
249| `OPENROUTER_API_KEY` | OpenRouter |
250| `GEMINI_API_KEY` | Google Gemini |
251| `CEREBRAS_API_KEY` | Cerebras |
252| `HF_TOKEN` | Huggingface Inference |
253| `VERTEXAI_PROJECT` | Google Cloud VertexAI (Gemini) |
254| `VERTEXAI_LOCATION` | Google Cloud VertexAI (Gemini) |
255| `GROQ_API_KEY` | Groq |
256| `AWS_ACCESS_KEY_ID` | Amazon Bedrock (Claude) |
257| `AWS_SECRET_ACCESS_KEY` | Amazon Bedrock (Claude) |
258| `AWS_REGION` | Amazon Bedrock (Claude) |
259| `AWS_PROFILE` | Amazon Bedrock (Custom Profile) |
260| `AWS_BEARER_TOKEN_BEDROCK` | Amazon Bedrock |
261| `AZURE_OPENAI_API_ENDPOINT` | Azure OpenAI models |
262| `AZURE_OPENAI_API_KEY` | Azure OpenAI models (optional when using Entra ID) |
263| `AZURE_OPENAI_API_VERSION` | Azure OpenAI models |
264
265### By the Way
266
267Is there a provider you’d like to see in Crush? Is there an existing model that needs an update?
268
269Crush’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.
270
271<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>
272
273## Configuration
274
275Crush runs great with no configuration. That said, if you do need or want to
276customize Crush, configuration can be added either local to the project itself,
277or globally, with the following priority:
278
2791. `.crush.json`
2802. `crush.json`
2813. `$HOME/.config/crush/crush.json`
282
283Configuration itself is stored as a JSON object:
284
285```json
286{
287 "this-setting": { "this": "that" },
288 "that-setting": ["ceci", "cela"]
289}
290```
291
292As an additional note, Crush also stores ephemeral data, such as application state, in one additional location:
293
294```bash
295# Unix
296$HOME/.local/share/crush/crush.json
297
298# Windows
299%LOCALAPPDATA%\crush\crush.json
300```
301
302> [!TIP]
303> You can override the user and data config locations by setting:
304> * `CRUSH_GLOBAL_CONFIG`
305> * `CRUSH_GLOBAL_DATA`
306
307### LSPs
308
309Crush can use LSPs for additional context to help inform its decisions, just
310like you would. LSPs can be added manually like so:
311
312```json
313{
314 "$schema": "https://charm.land/crush.json",
315 "lsp": {
316 "go": {
317 "command": "gopls",
318 "env": {
319 "GOTOOLCHAIN": "go1.24.5"
320 }
321 },
322 "typescript": {
323 "command": "typescript-language-server",
324 "args": ["--stdio"]
325 },
326 "nix": {
327 "command": "nil"
328 }
329 }
330}
331```
332
333### MCPs
334
335Crush also supports Model Context Protocol (MCP) servers through three
336transport types: `stdio` for command-line servers, `http` for HTTP endpoints,
337and `sse` for Server-Sent Events. Environment variable expansion is supported
338using `$(echo $VAR)` syntax.
339
340```json
341{
342 "$schema": "https://charm.land/crush.json",
343 "mcp": {
344 "filesystem": {
345 "type": "stdio",
346 "command": "node",
347 "args": ["/path/to/mcp-server.js"],
348 "timeout": 120,
349 "disabled": false,
350 "disabled_tools": ["some-tool-name"],
351 "env": {
352 "NODE_ENV": "production"
353 }
354 },
355 "github": {
356 "type": "http",
357 "url": "https://api.githubcopilot.com/mcp/",
358 "timeout": 120,
359 "disabled": false,
360 "disabled_tools": ["create_issue", "create_pull_request"],
361 "headers": {
362 "Authorization": "Bearer $GH_PAT"
363 }
364 },
365 "streaming-service": {
366 "type": "sse",
367 "url": "https://example.com/mcp/sse",
368 "timeout": 120,
369 "disabled": false,
370 "headers": {
371 "API-Key": "$(echo $API_KEY)"
372 }
373 }
374 }
375}
376```
377
378### Memory files
379
380Crush automatically includes two files for cross-project instructions.
381
382- `~/.config/crush/CRUSH.md`: Crush-specific rules that would confuse other
383 agentic coding tools. If you only use Crush, this is the only one you need to
384 edit.
385- `~/.config/AGENTS.md`: generic instructions that other coding tools might
386 read. Avoid referring to Crush-specific tools or workflows here.
387
388You can customize these paths using the `memory_paths` option in your
389configuration:
390
391```jsonc
392{
393 "$schema": "https://charm.land/crush.json",
394 "options": {
395 "memory_paths": [
396 "~/path/to/custom/memory/file.md",
397 "/full/path/to/folder/of/files/" // recursively load all .md files in folder
398 ]
399 }
400}
401```
402
403### Ignoring Files
404
405Crush respects `.gitignore` files by default, but you can also create a
406`.crushignore` file to specify additional files and directories that Crush
407should ignore. This is useful for excluding files that you want in version
408control but don't want Crush to consider when providing context.
409
410The `.crushignore` file uses the same syntax as `.gitignore` and can be placed
411in the root of your project or in subdirectories.
412
413### Allowing Tools
414
415By default, Crush will ask you for permission before running tool calls. If
416you'd like, you can allow tools to be executed without prompting you for
417permissions. Use this with care.
418
419```json
420{
421 "$schema": "https://charm.land/crush.json",
422 "permissions": {
423 "allowed_tools": [
424 "view",
425 "ls",
426 "grep",
427 "edit",
428 "mcp_context7_get-library-doc"
429 ]
430 }
431}
432```
433
434You can also skip all permission prompts entirely by running Crush with the
435`--yolo` flag. Be very, very careful with this feature.
436
437### Disabling Built-In Tools
438
439If you'd like to prevent Crush from using certain built-in tools entirely, you
440can disable them via the `options.disabled_tools` list. Disabled tools are
441completely hidden from the agent.
442
443```json
444{
445 "$schema": "https://charm.land/crush.json",
446 "options": {
447 "disabled_tools": [
448 "bash",
449 "sourcegraph"
450 ]
451 }
452}
453```
454
455To disable tools from MCP servers, see the [MCP config section](#mcps).
456
457### Agent Skills
458
459Crush supports the [Agent Skills](https://agentskills.io) open standard for
460extending agent capabilities with reusable skill packages. Skills are folders
461containing a `SKILL.md` file with instructions that Crush can discover and
462activate on demand.
463
464Skills are discovered from:
465
466- `~/.config/crush/skills/` on Unix (default, can be overridden with `CRUSH_SKILLS_DIR`)
467- `%LOCALAPPDATA%\crush\skills\` on Windows (default, can be overridden with `CRUSH_SKILLS_DIR`)
468- Additional paths configured via `options.skills_paths`
469
470```jsonc
471{
472 "$schema": "https://charm.land/crush.json",
473 "options": {
474 "skills_paths": [
475 "~/.config/crush/skills", // Windows: "%LOCALAPPDATA%\\crush\\skills",
476 "./project-skills"
477 ]
478 }
479}
480```
481
482You can get started with example skills from [anthropics/skills](https://github.com/anthropics/skills):
483
484```bash
485# Unix
486mkdir -p ~/.config/crush/skills
487cd ~/.config/crush/skills
488git clone https://github.com/anthropics/skills.git _temp
489mv _temp/skills/* . && rm -rf _temp
490```
491
492```powershell
493# Windows (PowerShell)
494mkdir -Force "$env:LOCALAPPDATA\crush\skills"
495cd "$env:LOCALAPPDATA\crush\skills"
496git clone https://github.com/anthropics/skills.git _temp
497mv _temp/skills/* . ; rm -r -force _temp
498```
499
500### Desktop notifications
501
502Crush sends desktop notifications when a tool call requires permission and when
503the agent finishes its turn. They're only sent when the terminal window isn't
504focused _and_ your terminal supports reporting the focus state.
505
506```jsonc
507{
508 "$schema": "https://charm.land/crush.json",
509 "options": {
510 "disable_notifications": false // default
511 }
512}
513```
514
515To disable desktop notifications, set `disable_notifications` to `true` in your
516configuration. On macOS, notifications currently lack icons due to platform
517limitations.
518
519### Initialization
520
521When you initialize a project, Crush analyzes your codebase and creates
522a context file that helps it work more effectively in future sessions.
523By default, this file is named `AGENTS.md`, but you can customize the
524name and location with the `initialize_as` option:
525
526```json
527{
528 "$schema": "https://charm.land/crush.json",
529 "options": {
530 "initialize_as": "AGENTS.md"
531 }
532}
533```
534
535This is useful if you prefer a different naming convention or want to
536place the file in a specific directory (e.g., `CRUSH.md` or
537`docs/LLMs.md`). Crush will fill the file with project-specific context
538like build commands, code patterns, and conventions it discovered during
539initialization.
540
541### Attribution Settings
542
543By default, Crush adds attribution information to Git commits and pull requests
544it creates. You can customize this behavior with the `attribution` option:
545
546```json
547{
548 "$schema": "https://charm.land/crush.json",
549 "options": {
550 "attribution": {
551 "trailer_style": "co-authored-by",
552 "generated_with": true
553 }
554 }
555}
556```
557
558- `trailer_style`: Controls the attribution trailer added to commit messages
559 (default: `assisted-by`)
560 - `assisted-by`: Adds `Assisted-by: [Model Name] via Crush <crush@charm.land>`
561 (includes the model name)
562 - `co-authored-by`: Adds `Co-Authored-By: Crush <crush@charm.land>`
563 - `none`: No attribution trailer
564- `generated_with`: When true (default), adds `💘 Generated with Crush` line to
565 commit messages and PR descriptions
566
567### Custom Providers
568
569Crush supports custom provider configurations for both OpenAI-compatible and
570Anthropic-compatible APIs.
571
572> [!NOTE]
573> Note that we support two "types" for OpenAI. Make sure to choose the right one
574> to ensure the best experience!
575> * `openai` should be used when proxying or routing requests through OpenAI.
576> * `openai-compat` should be used when using non-OpenAI providers that have OpenAI-compatible APIs.
577
578#### OpenAI-Compatible APIs
579
580Here’s an example configuration for Deepseek, which uses an OpenAI-compatible
581API. Don't forget to set `DEEPSEEK_API_KEY` in your environment.
582
583```json
584{
585 "$schema": "https://charm.land/crush.json",
586 "providers": {
587 "deepseek": {
588 "type": "openai-compat",
589 "base_url": "https://api.deepseek.com/v1",
590 "api_key": "$DEEPSEEK_API_KEY",
591 "models": [
592 {
593 "id": "deepseek-chat",
594 "name": "Deepseek V3",
595 "cost_per_1m_in": 0.27,
596 "cost_per_1m_out": 1.1,
597 "cost_per_1m_in_cached": 0.07,
598 "cost_per_1m_out_cached": 1.1,
599 "context_window": 64000,
600 "default_max_tokens": 5000
601 }
602 ]
603 }
604 }
605}
606```
607
608#### Anthropic-Compatible APIs
609
610Custom Anthropic-compatible providers follow this format:
611
612```json
613{
614 "$schema": "https://charm.land/crush.json",
615 "providers": {
616 "custom-anthropic": {
617 "type": "anthropic",
618 "base_url": "https://api.anthropic.com/v1",
619 "api_key": "$ANTHROPIC_API_KEY",
620 "extra_headers": {
621 "anthropic-version": "2023-06-01"
622 },
623 "models": [
624 {
625 "id": "claude-sonnet-4-20250514",
626 "name": "Claude Sonnet 4",
627 "cost_per_1m_in": 3,
628 "cost_per_1m_out": 15,
629 "cost_per_1m_in_cached": 3.75,
630 "cost_per_1m_out_cached": 0.3,
631 "context_window": 200000,
632 "default_max_tokens": 50000,
633 "can_reason": true,
634 "supports_attachments": true
635 }
636 ]
637 }
638 }
639}
640```
641
642### Amazon Bedrock
643
644Crush currently supports running Anthropic models through Bedrock, with caching disabled.
645
646- A Bedrock provider will appear once you have AWS configured, i.e. `aws configure`
647- Crush also expects the `AWS_REGION` or `AWS_DEFAULT_REGION` to be set
648- To use a specific AWS profile set `AWS_PROFILE` in your environment, i.e. `AWS_PROFILE=myprofile crush`
649- Alternatively to `aws configure`, you can also just set `AWS_BEARER_TOKEN_BEDROCK`
650
651### Vertex AI Platform
652
653Vertex AI will appear in the list of available providers when `VERTEXAI_PROJECT` and `VERTEXAI_LOCATION` are set. You will also need to be authenticated:
654
655```bash
656gcloud auth application-default login
657```
658
659To add specific models to the configuration, configure as such:
660
661```json
662{
663 "$schema": "https://charm.land/crush.json",
664 "providers": {
665 "vertexai": {
666 "models": [
667 {
668 "id": "claude-sonnet-4@20250514",
669 "name": "VertexAI Sonnet 4",
670 "cost_per_1m_in": 3,
671 "cost_per_1m_out": 15,
672 "cost_per_1m_in_cached": 3.75,
673 "cost_per_1m_out_cached": 0.3,
674 "context_window": 200000,
675 "default_max_tokens": 50000,
676 "can_reason": true,
677 "supports_attachments": true
678 }
679 ]
680 }
681 }
682}
683```
684
685### Local Models
686
687Local models can also be configured via OpenAI-compatible API. Here are two common examples:
688
689#### Ollama
690
691```json
692{
693 "providers": {
694 "ollama": {
695 "name": "Ollama",
696 "base_url": "http://localhost:11434/v1/",
697 "type": "openai-compat",
698 "models": [
699 {
700 "name": "Qwen 3 30B",
701 "id": "qwen3:30b",
702 "context_window": 256000,
703 "default_max_tokens": 20000
704 }
705 ]
706 }
707 }
708}
709```
710
711#### LM Studio
712
713```json
714{
715 "providers": {
716 "lmstudio": {
717 "name": "LM Studio",
718 "base_url": "http://localhost:1234/v1/",
719 "type": "openai-compat",
720 "models": [
721 {
722 "name": "Qwen 3 30B",
723 "id": "qwen/qwen3-30b-a3b-2507",
724 "context_window": 256000,
725 "default_max_tokens": 20000
726 }
727 ]
728 }
729 }
730}
731```
732
733## Logging
734
735Sometimes you need to look at logs. Luckily, Crush logs all sorts of
736stuff. Logs are stored in `./.crush/logs/crush.log` relative to the project.
737
738The CLI also contains some helper commands to make perusing recent logs easier:
739
740```bash
741# Print the last 1000 lines
742crush logs
743
744# Print the last 500 lines
745crush logs --tail 500
746
747# Follow logs in real time
748crush logs --follow
749```
750
751Want more logging? Run `crush` with the `--debug` flag, or enable it in the
752config:
753
754```json
755{
756 "$schema": "https://charm.land/crush.json",
757 "options": {
758 "debug": true,
759 "debug_lsp": true
760 }
761}
762```
763
764## Provider Auto-Updates
765
766By default, Crush automatically checks for the latest and greatest list of
767providers and models from [Catwalk](https://github.com/charmbracelet/catwalk),
768the open source Crush provider database. This means that when new providers and
769models are available, or when model metadata changes, Crush automatically
770updates your local configuration.
771
772### Disabling automatic provider updates
773
774For those with restricted internet access, or those who prefer to work in
775air-gapped environments, this might not be want you want, and this feature can
776be disabled.
777
778To disable automatic provider updates, set `disable_provider_auto_update` into
779your `crush.json` config:
780
781```json
782{
783 "$schema": "https://charm.land/crush.json",
784 "options": {
785 "disable_provider_auto_update": true
786 }
787}
788```
789
790Or set the `CRUSH_DISABLE_PROVIDER_AUTO_UPDATE` environment variable:
791
792```bash
793export CRUSH_DISABLE_PROVIDER_AUTO_UPDATE=1
794```
795
796### Manually updating providers
797
798Manually updating providers is possible with the `crush update-providers`
799command:
800
801```bash
802# Update providers remotely from Catwalk.
803crush update-providers
804
805# Update providers from a custom Catwalk base URL.
806crush update-providers https://example.com/
807
808# Update providers from a local file.
809crush update-providers /path/to/local-providers.json
810
811# Reset providers to the embedded version, embedded at crush at build time.
812crush update-providers embedded
813
814# For more info:
815crush update-providers --help
816```
817
818## Metrics
819
820Crush records pseudonymous usage metrics (tied to a device-specific hash),
821which maintainers rely on to inform development and support priorities. The
822metrics include solely usage metadata; prompts and responses are NEVER
823collected.
824
825Details on exactly what’s collected are in the source code ([here](https://github.com/charmbracelet/crush/tree/main/internal/event)
826and [here](https://github.com/charmbracelet/crush/blob/main/internal/llm/agent/event.go)).
827
828You can opt out of metrics collection at any time by setting the environment
829variable by setting the following in your environment:
830
831```bash
832export CRUSH_DISABLE_METRICS=1
833```
834
835Or by setting the following in your config:
836
837```json
838{
839 "options": {
840 "disable_metrics": true
841 }
842}
843```
844
845Crush also respects the [`DO_NOT_TRACK`](https://consoledonottrack.com)
846convention which can be enabled via `export DO_NOT_TRACK=1`.
847
848## Contributing
849
850See the [contributing guide](https://github.com/charmbracelet/crush?tab=contributing-ov-file#contributing).
851
852## Whatcha think?
853
854We’d love to hear your thoughts on this project. Need help? We gotchu. You can find us on:
855
856- [Twitter](https://twitter.com/charmcli)
857- [Slack](https://charm.land/slack)
858- [Discord][discord]
859- [The Fediverse](https://mastodon.social/@charmcli)
860- [Bluesky](https://bsky.app/profile/charm.land)
861
862[discord]: https://charm.land/discord
863
864## License
865
866[FSL-1.1-MIT](https://github.com/charmbracelet/crush/raw/main/LICENSE.md)
867
868---
869
870Part of [Charm](https://charm.land).
871
872<a href="https://charm.land/"><img alt="The Charm logo" width="400" src="https://stuff.charm.sh/charm-banner-next.jpg" /></a>
873
874<!--prettier-ignore-->
875Charm热爱开源 • Charm loves open source