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