# @medusajs/dashboard

> This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Latest version **2.21.2** (published 2026-09-28) · SEE LICENSE IN LICENSE license · 0 weekly downloads

## Install

```sh
npm install @medusajs/dashboard
pnpm add @medusajs/dashboard
yarn add @medusajs/dashboard
bun add @medusajs/dashboard
```

## Health

**Score 80/100 (A)** — status: active.

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

Warnings: low downloads; large bundle.

## Facts

| | |
|---|---|
| Version | 2.21.2 |
| Published | 2026-09-28 |
| First published | 2024-05-14 |
| Weekly downloads | 0 |
| License | SEE LICENSE IN LICENSE |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | ^20.19.0 \|\| >=22.12.0 |
| Dependencies | 40 |
| Unpacked size | 38.5 MB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Provenance | attested (GitHub Actions) |
| GitHub stars | 36315 |
| Maintainers | sebrindom, oliverjuhl, nicolas-gorga, sradevski, olijuhl, shahednasser |

## Links

- npm: https://www.npmjs.com/package/@medusajs/dashboard
- Repository: https://github.com/medusajs/medusa
- Homepage: https://github.com/medusajs/medusa#readme
- Issues: https://github.com/medusajs/medusa/issues
- npm.io page: https://npm.io/package/@medusajs/dashboard

## Dependencies (40)

- [qs](https://npm.io/package/qs.md) ^6.15.2
- [zod](https://npm.io/package/zod.md) 4.2.0
- [cmdk](https://npm.io/package/cmdk.md) ^0.2.0
- [react](https://npm.io/package/react.md) ^18.3.1
- [motion](https://npm.io/package/motion.md) ^11.15.0
- [qrcode](https://npm.io/package/qrcode.md) ^1.5.4
- [i18next](https://npm.io/package/i18next.md) 23.7.11
- [date-fns](https://npm.io/package/date-fns.md) ^3.6.0
- [radix-ui](https://npm.io/package/radix-ui.md) 1.1.2
- [react-dom](https://npm.io/package/react-dom.md) ^18.3.1
- [react-jwt](https://npm.io/package/react-jwt.md) ^1.2.0
- [@medusajs/ui](https://npm.io/package/@medusajs/ui.md) 4.2.6
- [bignumber.js](https://npm.io/package/bignumber.js.md) ^9.1.2
- [match-sorter](https://npm.io/package/match-sorter.md) ^6.3.4
- [@dnd-kit/core](https://npm.io/package/@dnd-kit/core.md) ^6.1.0
- [react-i18next](https://npm.io/package/react-i18next.md) 13.5.0
- [@ariakit/react](https://npm.io/package/@ariakit/react.md) ^0.4.15
- [@babel/runtime](https://npm.io/package/@babel/runtime.md) ^7.26.10
- [lodash.isequal](https://npm.io/package/lodash.isequal.md) ^4.5.0
- [@medusajs/icons](https://npm.io/package/@medusajs/icons.md) 2.21.2
- [lodash.debounce](https://npm.io/package/lodash.debounce.md) ^4.0.8
- [react-hook-form](https://npm.io/package/react-hook-form.md) 7.83.0
- [@medusajs/js-sdk](https://npm.io/package/@medusajs/js-sdk.md) 2.21.2
- [react-router-dom](https://npm.io/package/react-router-dom.md) 7.18.2
- [@dnd-kit/sortable](https://npm.io/package/@dnd-kit/sortable.md) ^8.0.0
- [copy-to-clipboard](https://npm.io/package/copy-to-clipboard.md) ^3.3.3
- [@dnd-kit/utilities](https://npm.io/package/@dnd-kit/utilities.md) ^3.2.2
- [react-country-flag](https://npm.io/package/react-country-flag.md) ^3.1.0
- [react-helmet-async](https://npm.io/package/react-helmet-async.md) ^2.0.5
- [@hookform/resolvers](https://npm.io/package/@hookform/resolvers.md) 5.5.7
- [@uiw/react-json-view](https://npm.io/package/@uiw/react-json-view.md) ^2.0.0-alpha.17
- [@tanstack/react-query](https://npm.io/package/@tanstack/react-query.md) 5.64.2
- [@tanstack/react-table](https://npm.io/package/@tanstack/react-table.md) 8.20.5
- [@medusajs/admin-shared](https://npm.io/package/@medusajs/admin-shared.md) 2.21.2
- [@radix-ui/react-dialog](https://npm.io/package/@radix-ui/react-dialog.md) 1.1.4
- [@hookform/error-message](https://npm.io/package/@hookform/error-message.md) ^2.0.1
- [@tanstack/react-virtual](https://npm.io/package/@tanstack/react-virtual.md) ^3.8.3
- [react-currency-input-field](https://npm.io/package/react-currency-input-field.md) ^3.6.11
- [i18next-browser-languagedetector](https://npm.io/package/i18next-browser-languagedetector.md) 7.2.0
- [@radix-ui/react-dismissable-layer](https://npm.io/package/@radix-ui/react-dismissable-layer.md) 1.1.4

## Recent versions

- 2.21.2 (latest) — 2026-09-28
- 2.22.0-snapshot-20261008225942 (snapshot) — 2026-10-08
- 2.22.0-preview-20261002101246 (preview) — 2026-10-02
- 2.16.0-options-preview-20260605124754 (options-preview) — 2026-06-05
- 2.0.0-rc-20241022183311 (rc) — 2024-10-22
- 2.22.0-snapshot-20261008220405 — 2026-10-08
- 2.22.0-snapshot-20261008144129 — 2026-10-08
- 2.22.0-snapshot-20261006025321 — 2026-10-06
- 2.22.0-preview-20261002093930 — 2026-10-02
- 2.21.2-snapshot-20260928075521 — 2026-09-28
- 2.21.2-snapshot-20260925150426 — 2026-09-25
- 2.21.2-preview-20260925133948 — 2026-09-25
- 2.21.1 — 2026-09-22
- 2.21.1-preview-20260922104932 — 2026-09-22
- 2.21.1-preview-20260922093132 — 2026-09-22
- … 163 more at https://npm.io/package/@medusajs/dashboard/versions

## README

# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:

- Configure the top-level `parserOptions` property like this:

```js
export default {
  // other rules...
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
    project: ['./tsconfig.json', './tsconfig.node.json'],
    tsconfigRootDir: __dirname,
  },
}
```

- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`
- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`
- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list

## Translations

Translation files live in `src/i18n/translations`. `en.json` is the source of truth, and every other `<locale>.json` file is translated from it.

### Find missing translations

```bash
yarn i18n:sync missing
```

Prints the number of strings in `en.json` that each locale is missing. Plural keys are expanded to the plural forms each locale uses, as defined in `src/i18n/plural-config.json`.

Pass `--output` to also write the missing strings to a JSON file:

```bash
yarn i18n:sync missing --output missing.json
```

The file is keyed by locale. Each entry has the number of missing strings (`count`), the locale's plural forms (`pluralForms`), and the missing keys nested as in `en.json` with their English text as values (`missing`).

### Apply translations

```bash
yarn i18n:sync apply --input <directory>
```

Merges translated strings into the locale files. The directory must contain JSON files named `<locale>.json`, or `<locale>.<anything>.json` to split a locale across several files (for example, `de.part-1.json`). Each file uses the same nested shape as `missing` in the `missing` output, with translated values.

New keys are inserted next to their neighbors in `en.json`, and existing keys keep their order. A translation is skipped with a warning if:

- Its key doesn't exist in `en.json`, or is a plural form the locale doesn't use.
- The locale already has a translation for the key. Existing translations are never overwritten.
- It's empty or not a string.
- Its `{{placeholders}}` or `<0>` tags don't match the English text. Plural forms may add or drop `{{count}}`.

### Automated sync

The [Admin i18n Sync](../../../.github/workflows/admin-i18n-sync.yml) workflow runs daily. It finds missing translations, translates them with Claude, and opens a PR on the `chore/admin-i18n-sync-translations` branch. It skips runs while a previous sync PR is still open.

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