---
title: "Review in Studio"
description: "Start Verbatra Studio, work the needs-review queue, fix entries in place, and retranslate flagged keys from the local dashboard."
type: "how-to"
---
# Review in Studio

Start Verbatra Studio, work the needs-review queue, fix entries in place, and retranslate flagged keys from the local dashboard.

Find pending machine translations, fix values, and approve or reject what a provider wrote, in Verbatra Studio.

Two rules: **local editing is always on**, and **provider spend is always off** unless you start Studio with `--allow-spend`.

## Start Studio [#start-studio]

```bash
npm install --save-dev @verbatra/studio
verbatra studio
```

Open the URL it prints, token included. [`verbatra studio`](https://verbatra.kreitz-webdev.de/docs/cli/studio.md) covers the port, token, flags and live refresh.

## Read the Translations page [#read-the-translations-page]

### One key table [#one-key-table]

<AvailableFrom version="0.7.0" pkg="@verbatra/studio" />

Translations is one table of every key that needs attention: missing, changed, orphaned, protected, in the review queue or failing an integrity check. Each row shows the key, source text and a status per locale; pick a locale for translation, status and origin. Search also finds in-sync keys.

### Key details [#key-details]

Click a key to open its editor, which lists each locale's value with an integrity indicator: placeholders match, a mismatch with the tokens named, or invalid message syntax. Also shown:

| Detail | Shows |
| --- | --- |
| **Inline markup mismatch** | each tag the translation dropped (`-`) or added (`+`) <AvailableFrom version="0.5.1" pkg="@verbatra/studio" /> |
| **ICU arms mismatch** | plural or select arms that do not fit the target language; right-to-left values render right to left ([Language support](https://verbatra.kreitz-webdev.de/docs/language-support.md#right-to-left-languages)) <AvailableFrom version="0.6.0" pkg="@verbatra/studio" /> |
| Origin badge | who wrote each value, read from [`verbatra.provenance.json`](https://verbatra.kreitz-webdev.de/docs/the-lock-file.md#provenance-who-wrote-each-value), such as **Machine**, **Human** or **Edited outside verbatra** <AvailableFrom version="0.6.0" pkg="@verbatra/studio" /> |

### Filter by state [#filter-by-state]

<AvailableFrom version="0.6.0" pkg="@verbatra/studio" />

Chips beside the search narrow the table by state, including **Review queue** and **Integrity problems**. **Copy as review report** copies the pending keys as Markdown for a pull request.

### Edit with integrity gating [#edit-with-integrity-gating]

**Edit** opens that locale's draft. Saving runs the value through the [integrity gate](https://verbatra.kreitz-webdev.de/docs/translation-safety.md#the-integrity-gate); a value it refuses is not written, and the reason is shown. An accepted edit writes the locale file and updates the lock file.

#### Draft checks [#draft-checks]

<AvailableFrom version="0.6.0" pkg="@verbatra/studio" />

The editor shows the key's description, the glossary terms your draft uses or misses, and its length against the source and `maxLength`. Ctrl or Cmd with Enter saves.

#### Set a length limit [#set-a-length-limit]

<AvailableFrom version="0.7.0" pkg="@verbatra/studio" />

Under the length line, **Set limit**, **Change limit** and **Remove limit** edit the key's entry in [`verbatra.limits.json`](https://verbatra.kreitz-webdev.de/docs/config-file.md#maxlength), for every locale. The config's `maxLength` wins, read-only. An unusable file shows why and blocks the control. A limit is advisory: translate runs flag a longer value for review, and nothing is blocked. Studio sets limits only for source keys; a limit written for a generated form's own key still applies.

#### Preview ICU messages [#preview-icu-messages]

<AvailableFrom version="0.7.0" pkg="@verbatra/studio" />

With `next-intl-json` or `arb`, a collapsed **ICU preview** under the draft renders it once per arm in the locale's language and direction. A typed sample adds a row when it reaches an arm, else a note. Numbers and dates use this computer's language data, so your app may differ.

#### Beside the table [#beside-the-table]

<AvailableFrom version="0.7.0" pkg="@verbatra/studio" />

From 1280px wide the editor sits beside the table; below that it is a drawer. Leaving the key with unsaved edits asks you to save, discard or keep editing; leaving Studio gets the browser's own confirmation.

### Search and replace [#search-and-replace]

<AvailableFrom version="0.7.0" pkg="@verbatra/studio" />

**Search and replace** changes literal text in translated values: choose the text, replacement, case and locales, review up to 1,000 matches, then apply. Pinned keys and protected values stay out unless you tick their box. Protected means a person wrote, imported or changed it outside verbatra, or any value while `verbatra.provenance.json` is unreadable.

## Work the Review queue [#work-the-review-queue]

The Review page lists every value a machine wrote that nobody approved: one row per locale and key with the full source and translation, origin and any [review flags](https://verbatra.kreitz-webdev.de/docs/translation-safety.md#review-flags) from the last run on this machine.

<StudioScreenshot
  shot="review"
  alt="The Verbatra Studio Review page with the Needs review chip pressed, listing German entries; two rows carry review reasons, Matches source text and Unusual length, next to the Machine origin, and each row has Edit, Approve and Reject actions."
  caption="The Review queue after a run, with flagged rows showing their reasons. Studio ships in light and dark; switch the screenshot to compare."
/>

### Flag labels [#flag-labels]

<AvailableFrom version="0.5.1" pkg="@verbatra/studio" />

Two review flags read **Over length budget** and **Reused after source edit**.

### Row actions [#row-actions]

<AvailableFrom version="0.5.0" pkg="@verbatra/studio" />

Filter by locale or text, then:

- **Edit** opens the integrity-gated editor. An accepted edit clears the row.
- **Approve** accepts the value.
- **Reject** removes the value for replacement, after confirming.

### Saved decisions [#saved-decisions]

<AvailableFrom version="0.6.0" pkg="@verbatra/studio" />

Both decisions are saved in `verbatra.provenance.json` under the [Review decisions](https://verbatra.kreitz-webdev.de/docs/the-lock-file.md#review-decisions) rules. An approval also needs the value to be up to date with its source. Commit the locale, lock and provenance files together; in an XLIFF project, edit instead of rejecting.

### One queue for the whole team [#one-queue-for-the-whole-team]

<AvailableFrom version="0.6.0" pkg="@verbatra/studio" />

The queue is read from the committed files, so a teammate who pulls them sees it too. A value leaves it once a person approves, rejects, writes or imports it; an approved value that a machine rewrites comes back.

The **Needs review** and **Approved** chips switch the list and show counts; the bar narrows by origin; with a locale chosen, **Approve all in** approves it all after confirming. To fail a pull request while machine translations wait, run [`verbatra check --require-reviewed`](https://verbatra.kreitz-webdev.de/docs/cli/check.md#require-reviewed-translations) in CI.

### Work the queue from the keyboard [#work-the-queue-from-the-keyboard]

<AvailableFrom version="0.6.0" pkg="@verbatra/studio" />

Press `j` or the down arrow to start, then:

| Key | Action |
| --- | --- |
| `j` or down arrow | next entry |
| `k` or up arrow | previous entry |
| `a` | approve the highlighted entry |
| `r` | reject it (the confirmation still opens) |
| `e` or Enter | open it in the editor |
| `t` | retranslate it (only with `--allow-spend`; calls your provider) |
| `x` | select or unselect it for a bulk action |
| `?` | show or hide the shortcut list |

Shortcuts pause while you type, in the filter bar or in a dialog.

### Act on several entries at once [#act-on-several-entries-at-once]

<AvailableFrom version="0.6.0" pkg="@verbatra/studio" />

Tick rows (or the header box for all filtered rows), then choose **Approve selected**, **Reject selected** or, with `--allow-spend`, **Retranslate selected**. Failures are listed by cause and stay selected. A batch holds at most 100 entries to approve or reject, or 20 to retranslate.

## Retranslate a flagged key [#retranslate-a-flagged-key]

Start Studio with spend allowed ([how spend is granted](https://verbatra.kreitz-webdev.de/docs/cli/studio.md#spend-and-agent-tools)):

```bash
verbatra studio --allow-spend
```

A **Retranslate** button appears on each Review row, and in a key's editor for a value with an integrity defect. It makes one provider call, gates the result, and leaves the new value in the queue to approve. From a Review row, a value a person wrote is never replaced; in its editor on Translations, choose **Replace anyway**.

## Translate pending changes [#translate-pending-changes]

When a source or target locale file changes while Studio runs, a toast reads `Source changed` or `Target changed: de` with its key counts. With `--allow-spend`, the source toast also offers **Translate pending changes across all locales**, the run `verbatra translate` would do.

## Check coverage and the last run on Overview [#check-coverage-and-the-last-run-on-overview]

<AvailableFrom version="0.7.0" pkg="@verbatra/studio" />

Studio opens on Overview: each locale's coverage with its [lock file](https://verbatra.kreitz-webdev.de/docs/the-lock-file.md) state, the locale files' git history and the last run's token usage, with the budget meter when set.

**Run history and cost** below it charts cost and tokens for the newest runs above a table, with each locale's last known coverage.

<StudioScreenshot
  shot="overview"
  alt="The Verbatra Studio Overview page with four figures, Needs attention, Waiting for review, Avg coverage and Locales in sync, above a table with the coverage of the de, es and fr locales and links to each locale's translations and review queue."
  caption="The Overview page opens Studio. Switch the screenshot to compare light and dark."
/>

## Keep the glossary current on the Glossary page [#keep-the-glossary-current-on-the-glossary-page]

<AvailableFrom version="0.4.0" pkg="@verbatra/studio" />

Glossary has its own page. With a JSON glossary you can search, add, edit and remove terms. Removing one asks first; unsaved edits ask before you leave. An inline glossary stays read-only.

A glossary edit changes what the next run is told, never text already written; restart Studio so its own retranslations use it.

### Per-locale view [#per-locale-view]

<AvailableFrom version="0.6.0" pkg="@verbatra/studio" />

**Show translations for** switches to one locale's [glossary](https://verbatra.kreitz-webdev.de/docs/config-file.md#glossary) view: translation, forbidden renderings and note.

## Related [#related]

- [Drive Studio with a browser agent](https://verbatra.kreitz-webdev.de/docs/agent-tools-in-studio.md): the same workflow from a browser AI agent.
- [Record machine-translation evidence](https://verbatra.kreitz-webdev.de/docs/provenance-evidence.md)
- [Review and retranslate from the SDK](https://verbatra.kreitz-webdev.de/docs/sdk/review.md)
