> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/anomalyco/opencode/llms.txt
> Use this file to discover all available pages before exploring further.

# Formatters

> OpenCode uses language specific formatters

OpenCode automatically formats files after they are written or edited using language-specific formatters. This ensures that the code that is generated follows the code styles of your project.

## Built-in Formatters

OpenCode comes with several built-in formatters for popular languages and frameworks. Below is a list of the formatters, supported file extensions, and commands or config options it needs.

| Formatter            | Extensions                                                                                               | Requirements                                                               |
| -------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| air                  | .R                                                                                                       | `air` command available                                                    |
| biome                | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://biomejs.dev/)                   | `biome.json(c)` config file                                                |
| cargofmt             | .rs                                                                                                      | `cargo fmt` command available                                              |
| clang-format         | .c, .cpp, .h, .hpp, .ino, and [more](https://clang.llvm.org/docs/ClangFormat.html)                       | `.clang-format` config file                                                |
| cljfmt               | .clj, .cljs, .cljc, .edn                                                                                 | `cljfmt` command available                                                 |
| dart                 | .dart                                                                                                    | `dart` command available                                                   |
| dfmt                 | .d                                                                                                       | `dfmt` command available                                                   |
| gleam                | .gleam                                                                                                   | `gleam` command available                                                  |
| gofmt                | .go                                                                                                      | `gofmt` command available                                                  |
| htmlbeautifier       | .erb, .html.erb                                                                                          | `htmlbeautifier` command available                                         |
| ktlint               | .kt, .kts                                                                                                | `ktlint` command available                                                 |
| mix                  | .ex, .exs, .eex, .heex, .leex, .neex, .sface                                                             | `mix` command available                                                    |
| nixfmt               | .nix                                                                                                     | `nixfmt` command available                                                 |
| ocamlformat          | .ml, .mli                                                                                                | `ocamlformat` command available and `.ocamlformat` config file             |
| ormolu               | .hs                                                                                                      | `ormolu` command available                                                 |
| oxfmt (Experimental) | .js, .jsx, .ts, .tsx                                                                                     | `oxfmt` dependency in `package.json` and an experimental env variable flag |
| pint                 | .php                                                                                                     | `laravel/pint` dependency in `composer.json`                               |
| prettier             | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://prettier.io/docs/en/index.html) | `prettier` dependency in `package.json`                                    |
| rubocop              | .rb, .rake, .gemspec, .ru                                                                                | `rubocop` command available                                                |
| ruff                 | .py, .pyi                                                                                                | `ruff` command available with config                                       |
| rustfmt              | .rs                                                                                                      | `rustfmt` command available                                                |
| shfmt                | .sh, .bash                                                                                               | `shfmt` command available                                                  |
| standardrb           | .rb, .rake, .gemspec, .ru                                                                                | `standardrb` command available                                             |
| terraform            | .tf, .tfvars                                                                                             | `terraform` command available                                              |
| uv                   | .py, .pyi                                                                                                | `uv` command available                                                     |
| zig                  | .zig, .zon                                                                                               | `zig` command available                                                    |

So if your project has `prettier` in your `package.json`, OpenCode will automatically use it.

## How It Works

When OpenCode writes or edits a file, it:

1. Checks the file extension against all enabled formatters.
2. Runs the appropriate formatter command on the file.
3. Applies the formatting changes automatically.

This process happens in the background, ensuring your code styles are maintained without any manual steps.

## Configure Formatters

You can customize formatters through the `formatter` section in your OpenCode config.

```json title="opencode.json" theme={null}
{
  "$schema": "https://opencode.ai/config.json",
  "formatter": {}
}
```

Each formatter configuration supports the following:

<ParamField path="formatter.{name}.disabled" type="boolean">
  Set this to `true` to disable the formatter.
</ParamField>

<ParamField path="formatter.{name}.command" type="string[]">
  The command to run for formatting. Use `$FILE` as a placeholder for the file path.
</ParamField>

<ParamField path="formatter.{name}.environment" type="object">
  Environment variables to set when running the formatter.
</ParamField>

<ParamField path="formatter.{name}.extensions" type="string[]">
  File extensions this formatter should handle.
</ParamField>

### Disabling Formatters

To disable **all** formatters globally, set `formatter` to `false`:

```json title="opencode.json" theme={null}
{
  "$schema": "https://opencode.ai/config.json",
  "formatter": false
}
```

To disable a **specific** formatter, set `disabled` to `true`:

```json title="opencode.json" theme={null}
{
  "$schema": "https://opencode.ai/config.json",
  "formatter": {
    "prettier": {
      "disabled": true
    }
  }
}
```

### Custom Formatters

You can override the built-in formatters or add new ones by specifying the command, environment variables, and file extensions:

```json title="opencode.json" theme={null}
{
  "$schema": "https://opencode.ai/config.json",
  "formatter": {
    "prettier": {
      "command": ["npx", "prettier", "--write", "$FILE"],
      "environment": {
        "NODE_ENV": "development"
      },
      "extensions": [".js", ".ts", ".jsx", ".tsx"]
    },
    "custom-markdown-formatter": {
      "command": ["deno", "fmt", "$FILE"],
      "extensions": [".md"]
    }
  }
}
```

The **`$FILE` placeholder** in the command will be replaced with the path to the file being formatted.

## Examples

### Override Prettier Configuration

```json title="opencode.json" theme={null}
{
  "$schema": "https://opencode.ai/config.json",
  "formatter": {
    "prettier": {
      "command": ["npx", "prettier", "--write", "--single-quote", "$FILE"],
      "environment": {
        "NODE_ENV": "production"
      }
    }
  }
}
```

### Add Custom Python Formatter

```json title="opencode.json" theme={null}
{
  "$schema": "https://opencode.ai/config.json",
  "formatter": {
    "black": {
      "command": ["black", "$FILE"],
      "extensions": [".py"]
    }
  }
}
```

### Configure Multiple Formatters

```json title="opencode.json" theme={null}
{
  "$schema": "https://opencode.ai/config.json",
  "formatter": {
    "prettier": {
      "command": ["npx", "prettier", "--write", "$FILE"],
      "extensions": [".js", ".ts", ".jsx", ".tsx"]
    },
    "gofmt": {
      "command": ["gofmt", "-w", "$FILE"],
      "extensions": [".go"]
    },
    "rustfmt": {
      "command": ["rustfmt", "$FILE"],
      "extensions": [".rs"]
    }
  }
}
```
