# Customize README

> Customize your SDK README with Fern's generators.yml configuration. Add custom sections, control example styles, and organize endpoints by feature.

Each SDK includes a `README.md` file in its root directory that provides an overview of the SDK and instructions for working with the associated API.

By default, Fern [generates the README automatically](./sdk-user-features) with usage examples and API details. For a complete example of a generated SDK README, see [Intercom's Python SDK](https://github.com/intercom/python-intercom/blob/3aac991a92cefe34cf437f8f5ca46c97c04c1a6c/README.md).

Although each SDK has its own README, the content can be configured globally through the `readme` section in the `generators.yml` file.

## Configuration options

```yaml title="generators.yml" maxLines=10
readme:
  bannerLink: "https://example.com/banner"
  introduction: "Welcome to our API"
  apiReferenceLink: "https://docs.example.com"
  apiName: "Example Product"
  exampleStyle: "minimal"
  disabledSections:
    - "contributing"
  defaultEndpoint:
    method: "POST"
    path: "/users"
    stream: false
  customSections:
    - title: "Custom Section"
      language: "java"
      content: |
        This is a custom section. Latest package info is {{ group }}:{{ artifact }}:{{ version }}.
    - title: "Custom Section"
      language: "typescript"
      content: |
        Custom section for {{ packageName }}
    - title: "Another Custom Section"
      language: "typescript"
      content: |
        A second custom section for {{ packageName }}
  features:
    authentication:
      - method: "POST"
        path: "/auth/login"
      - "GET /auth/profile"
    users:
      - method: "GET"
        path: "/users"
      - method: "POST"
        path: "/users"
```

<ParamField path="bannerLink" type="string" required={false} toc={true}>
  URL for a banner image or link that appears at the top of the README.
</ParamField>

<ParamField path="introduction" type="string" required={false} toc={true}>
  Custom introduction text that appears at the beginning of the README.
</ParamField>

<ParamField path="apiReferenceLink" type="string" required={false} toc={true}>
  URL to your external API documentation or reference guide.
</ParamField>

<ParamField path="apiName" type="string" required={false} toc={true}>
  Name of the API that appears in the README. Will appear as `Your Api Name SDK` or `Your Api Name API` throughout the README. Defaults to organization name if not set.
</ParamField>

<ParamField path="exampleStyle" type="'minimal' | 'comprehensive'" required={false} default="comprehensive" toc={true}>
  Controls whether usage examples show only required parameters (`minimal`) or all parameters (`comprehensive`). Currently only supported for Java SDKs.
</ParamField>

<ParamField path="disabledSections" type="list of strings" required={false} toc={true}>
  Sections to disable in the README. Supported values: `"contributing"`.
</ParamField>

<ParamField path="features" type="list of objects" required={false} toc={true}>
  Organizes endpoints into named feature sections within the README. Each feature creates a dedicated section with example code snippets for the specified endpoints.
</ParamField>

<AccordionGroup>
  <Accordion title="Endpoint configuration">
    Specifies which endpoint's code snippet to showcase as the primary example in the README.

    <ParamField path="defaultEndpoint.method" type="string" required={true} toc={true}>
      HTTP method of the default endpoint (e.g., `GET`, `POST`, `PUT`, `DELETE`).
    </ParamField>

    <ParamField path="defaultEndpoint.path" type="string" required={true} toc={true}>
      Endpoint path for the default example (e.g., `/users`, `/auth/login`).
    </ParamField>

    <ParamField path="defaultEndpoint.stream" type="boolean" required={false} default="false" toc={true}>
      Whether the endpoint is a streaming endpoint. Defaults to `false`.
    </ParamField>
  </Accordion>

  <Accordion title="Custom sections">
    Define a custom section in the generated README for a specific SDK.

    <ParamField path="customSections.title" type="string" required={true} toc={true}>
      The title of the custom section as it will appear in the README.
    </ParamField>

    <ParamField path="customSections.language" type="'java' | 'typescript'" required={true} toc={true}>
      The target SDK language for this section. The custom section will only appear in README files generated for the specified language.
    </ParamField>

    <ParamField path="customSections.content" type="string" required={true} toc={true}>
      The Markdown content of the custom section. You can use template variables in the format `{{ variable }}` that will be dynamically replaced with values specific to each SDK language when the README is generated.

      Available template variables by language:

      | Language   | Variable      | Description                                                                                                                                                                |
      | ---------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
      | TypeScript | `packageName` | Name of your package, as specified in the [`package-name` field](/sdks/generators/typescript/configuration#package-name)                                                   |
      | Python     | `packageName` | Name of your package, as specified in the [`package_name` field](/sdks/generators/python/configuration#package_name)                                                       |
      | Go         | `owner`       | The owner of your Go module                                                                                                                                                |
      | Go         | `repo`        | The [repository](/sdks/generators/go/publishing#configure-output-location) where your Go module is published                                                               |
      | Go         | `version`     | SDK version                                                                                                                                                                |
      | Java       | `group`       | Maven `groupId` [from `coordinate` field](/sdks/generators/java/publishing#configure-maven-coordinate)                                                                     |
      | Java       | `artifact`    | Maven `artifactId` [from `coordinate` field](/sdks/generators/java/publishing#configure-maven-coordinate)                                                                  |
      | Java       | `version`     | SDK version                                                                                                                                                                |
      | C#/.NET    | `packageName` | Name of your package, as specified in the [`package-name` field](/sdks/generators/csharp/configuration#package-name)                                                       |
      | PHP        | `packageName` | Name of your package, as specified in the [`package-name` field](/sdks/generators/php/configuration#package-name)                                                          |
      | Ruby       | `packageName` | Name of your package, as specified in the [`package-name` field](/sdks/generators/ruby/configuration#package-name)                                                         |
      | Swift      | `gitUrl`      | The [URL](/sdks/generators/swift/publishing#verify-package-availability) where your Swift package is published. For example, `https://github.com/fern-api/basic-swift-sdk` |
      | Swift      | `minVersion`  | SDK version                                                                                                                                                                |
    </ParamField>
  </Accordion>
</AccordionGroup>

## Additional customization

To go beyond the available configuration options, you can [manually edit the `README.md` file](/learn/sdks/overview/custom-code). Then, add it to the `.fernignore` file to prevent it from being overwritten during regeneration.