# @inquirer/checkbox

> Inquirer checkbox prompt

Latest version **5.2.5** (published 2026-09-07) · MIT license · 0 weekly downloads

## Install

```sh
npm install @inquirer/checkbox
pnpm add @inquirer/checkbox
yarn add @inquirer/checkbox
bun add @inquirer/checkbox
```

## Health

**Score 75/100 (B)** — status: active.

Positive: has types; esm support; no vulnerabilities; has provenance; recently updated; high maintenance score; popular repo.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 5.2.5 |
| Published | 2026-09-07 |
| First published | 2019-06-20 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=23.5.0 \|\| ^22.13.0 \|\| ^20.17.0 |
| Dependencies | 4 |
| Unpacked size | 20.5 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Provenance | attested (GitHub Actions) |
| GitHub stars | 21622 |
| Author | Simon Boudrias |
| Maintainers | sboudrias, mischah |
| Keywords | answer, answers, ask, base, cli, command, command-line, confirm, enquirer, generate, generator, hyper, input, inquire, inquirer, interface, iterm, javascript, menu, node, nodejs, prompt, promptly, prompts, question, readline, scaffold, scaffolder, scaffolding, stdin, stdout, terminal, tty, ui, yeoman, yo, zsh |

## Links

- npm: https://www.npmjs.com/package/@inquirer/checkbox
- Repository: https://github.com/SBoudrias/Inquirer.js
- Homepage: https://github.com/SBoudrias/Inquirer.js/blob/main/packages/checkbox/README.md
- Issues: https://github.com/SBoudrias/Inquirer.js/issues
- npm.io page: https://npm.io/package/@inquirer/checkbox

## Dependencies (4)

- [@inquirer/ansi](https://npm.io/package/@inquirer/ansi.md) ^2.0.8
- [@inquirer/core](https://npm.io/package/@inquirer/core.md) ^12.0.3
- [@inquirer/type](https://npm.io/package/@inquirer/type.md) 4.1.1
- [@inquirer/figures](https://npm.io/package/@inquirer/figures.md) ^2.0.9

## Alternatives

- [@salesforce/cli](https://npm.io/package/@salesforce/cli.md) — 389.7K weekly downloads
- [@mintlify/cli](https://npm.io/package/@mintlify/cli.md) — 208.9K weekly downloads
- [@grafana/e2e-selectors](https://npm.io/package/@grafana/e2e-selectors.md) — 128.7K weekly downloads
- [mintlify](https://npm.io/package/mintlify.md) — 112.0K weekly downloads
- [@intlayer/cli](https://npm.io/package/@intlayer/cli.md) — 22.8K weekly downloads

## Recent versions

- 5.2.5 (latest) — 2026-09-07
- 5.2.4 — 2026-09-02
- 5.2.3 — 2026-08-26
- 5.2.2 — 2026-08-19
- 5.2.1 — 2026-05-29
- 5.2.0 — 2026-05-25
- 5.1.5 — 2026-05-10
- 5.1.4 — 2026-04-19
- 5.1.3 — 2026-04-06
- 5.1.2 — 2026-03-15
- 5.1.1 — 2026-03-15
- 5.1.0 — 2026-02-22
- 5.0.7 — 2026-02-16
- 5.0.6 — 2026-02-14
- 5.0.5 — 2026-02-14
- … 116 more at https://npm.io/package/@inquirer/checkbox/versions

## README

# `@inquirer/checkbox`

Simple interactive command line prompt to display a list of checkboxes (multi select).

![Checkbox prompt](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/checkbox.svg)

# Installation

<table>
<tr>
  <th>npm</th>
  <th>yarn</th>
</tr>
<tr>
<td>

```sh
npm install @inquirer/prompts
```

</td>
<td>

```sh
yarn add @inquirer/prompts
```

</td>
</tr>
<tr>
<td colSpan="2" align="center">Or</td>
</tr>
<tr>
<td>

```sh
npm install @inquirer/checkbox
```

</td>
<td>

```sh
yarn add @inquirer/checkbox
```

</td>
</tr>
</table>

# Usage

```js
import { checkbox, Separator } from '@inquirer/prompts';
// Or
// import checkbox, { Separator } from '@inquirer/checkbox';

const answer = await checkbox({
  message: 'Select a package manager',
  choices: [
    { name: 'npm', value: 'npm' },
    { name: 'yarn', value: 'yarn' },
    new Separator(),
    { name: 'pnpm', value: 'pnpm', disabled: true },
    {
      name: 'pnpm',
      value: 'pnpm',
      disabled: '(pnpm is not available)',
    },
  ],
});
```

## Options

| Property  | Type                                    | Required | Description                                                                                                                                                                                           |
| --------- | --------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| message   | `string`                                | yes      | The question to ask                                                                                                                                                                                   |
| choices   | `Choice[]`                              | yes      | List of the available choices.                                                                                                                                                                        |
| pageSize  | `number`                                | no       | By default, lists of choice longer than 7 will be paginated. Use this option to control how many choices will appear on the screen at once.                                                           |
| loop      | `boolean`                               | no       | Defaults to `true`. When set to `false`, the cursor will be constrained to the top and bottom of the choice list without looping.                                                                     |
| required  | `boolean`                               | no       | When set to `true`, ensures at least one choice must be selected.                                                                                                                                     |
| validate  | `async (Choice[]) => boolean \| string` | no       | On submit, validate the choices. When returning a string, it'll be used as the error message displayed to the user. Note: returning a rejected promise, we'll assume a code error happened and crash. |
| shortcuts | [See Shortcuts](#Shortcuts)             | no       | Customize shortcut keys for `all` and `invert`.                                                                                                                                                       |
| theme     | [See Theming](#Theming)                 | no       | Customize look of the prompt.                                                                                                                                                                         |

`Separator` objects can be used in the `choices` array to render non-selectable lines in the choice list. By default it'll render a line, but you can provide the text as argument (`new Separator('-- Dependencies --')`). This option is often used to add labels to groups within long list of options.

### `Choice` object

The `Choice` object is typed as

```ts
type Choice<Value> = {
  value: Value;
  name?: string;
  checkedName?: string;
  description?: string;
  short?: string;
  checked?: boolean;
  disabled?: boolean | string;
};
```

Here's each property:

- `value`: The value is what will be returned by `await checkbox()`.
- `name`: This is the string displayed in the choice list.
- `checkedName`: Alternative `name` (or format) displayed when the choice is checked.
- `description`: Option for a longer description string that'll appear under the list when the cursor highlight a given choice.
- `short`: Once the prompt is done (press enter), we'll use `short` if defined to render next to the question. By default we'll use `name`.
- `checked`: If `true`, the option will be checked by default.
- `disabled`: Disallow the option from being selected. If `disabled` is a string, it'll be used as a help tip explaining why the choice isn't available.

Also note the `choices` array can contain `Separator`s to help organize long lists.

`choices` can also be an array of string, in which case the string will be used both as the `value` and the `name`.

## Keybindings

Set `INQUIRER_KEYBINDINGS=vim`, `INQUIRER_KEYBINDINGS=emacs`, or `INQUIRER_KEYBINDINGS=vim,emacs` to enable alternative navigation keybindings globally.

You can override the environment setting per prompt with `theme.keybindings`.

## Shortcuts

You can customize the shortcut keys for `all` and `invert` or disable them by setting them to `null`.

```ts
type Shortcuts = {
  all?: string | null; // default: 'a'
  invert?: string | null; // default: 'i'
};
```

## Theming

You can theme a prompt by passing a `theme` object option. The theme object only need to includes the keys you wish to modify, we'll fallback on the defaults for the rest.

```ts
type Theme = {
  prefix: string | { idle: string; done: string };
  spinner: {
    interval: number;
    frames: string[];
  };
  style: {
    answer: (text: string) => string;
    message: (text: string, status: 'idle' | 'done' | 'loading') => string;
    error: (text: string) => string;
    defaultAnswer: (text: string) => string;
    help: (text: string) => string;
    highlight: (text: string) => string;
    key: (text: string) => string;
    disabledChoice: (text: string) => string;
    description: (text: string) => string;
    renderSelectedChoices: <T>(
      selectedChoices: ReadonlyArray<Choice<T>>,
      allChoices: ReadonlyArray<Choice<T> | Separator>,
    ) => string;
    keysHelpTip: (keys: [key: string, action: string][]) => string | undefined;
  };
  icon: {
    checked: string;
    unchecked: string;
    cursor: string;
  };
  keybindings: readonly ('emacs' | 'vim')[];
};
```

### `theme.style.keysHelpTip`

This function allows you to customize the keyboard shortcuts help tip displayed below the prompt. It receives an array of key-action pairs and should return a formatted string. You can also hook here to localize the labels to different languages.

It can also returns `undefined` to hide the help tip entirely.

```js
theme: {
  style: {
    keysHelpTip: (keys) => {
      // Return undefined to hide the help tip completely
      return undefined;

      // Or customize the formatting. Or localize the labels.
      return keys.map(([key, action]) => `${key}: ${action}`).join(' | ');
    };
  }
}
```

# License

Copyright (c) 2023 Simon Boudrias (twitter: [@vaxilart](https://twitter.com/Vaxilart))<br/>
Licensed under the MIT license.

---
_Source: https://npm.io/package/@inquirer/checkbox · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
