Translation coverage board for your Contentful locales

By General Input

See every entry against every locale in one grid, spot what is missing or out of date, and have an agent draft the gaps for human review.

Integrations

  • Contentful
  • Linear

Type

App

Categories

  • Marketing
  • Operations

I want an app that gives me one screen for translation coverage across my Contentful space. Right now there is no single view of which locales are done, stale, or missing, so coordinating a global launch means opening entries one at a time. The people who live in this app are our localization manager and the content ops team.

The main surface is a coverage grid. Rows are entries, columns are locales. Build it from Contentful List Locales for the columns, List Content Types to label and filter rows, and List Entries for the rows themselves, paging through with skip and limit until every entry is loaded. Contentful stores localized fields keyed by locale code, so fields.title has an en-US key, a de-DE key, and so on, and each cell state comes from reading those per-locale keys on the entry.

Each cell reads as one of three states. Translated means the entry has non-empty content for that locale across its localized fields. Missing means those per-locale keys are absent or empty. Stale means the translation exists but the source locale was updated after that translation was last touched, so compare the entry sys.updatedAt and the source locale field content against when that locale's values last changed. Color the three states distinctly and make the legend obvious, because stale is the state people currently miss entirely.

Along the top of each locale column, show a coverage percentage: the share of the entries currently in view that are fully translated for that locale. The percentage should respond to the filters, so filtering to Blog Post shows blog coverage rather than whole-space coverage. Give me a content type filter, a filter to show only rows with gaps, and a search box for entry titles.

Clicking a cell opens a detail view beside the grid. Load the entry with Get Entry and show the source locale fields on the left and the target locale fields on the right, field by field, so I can see what I am translating from. The target side is editable and I can save inline. Saving writes back with Create or Update Entry with ID, sending the entry's current version in the X-Contentful-Version header. If Contentful returns a 409 version mismatch because somebody else edited the entry, refetch the entry, tell me my copy is out of date, and let me retry rather than silently overwriting their work.

Add a Draft translations button that works on a single entry from the detail view and on a filtered batch from the grid. It kicks off a background agent. The agent reads the source locale fields for each selected entry, drafts the missing locale values in the right tone and roughly the right length for the field it is filling, so a short heading stays short and body copy keeps its structure, then writes the drafts back with Create or Update Entry with ID as unpublished field values on the existing entry.

When the agent finishes a run, it files a review ticket in Linear with Create Issue against a team I pick from List Teams, assigned to the reviewer who is a native speaker of that locale, resolved from Linear List Users. The issue body lists the entries and locales that were drafted and links back to the entry in Contentful and to the matching cell in this app, so the reviewer lands in the right place.

Two rules are non-negotiable. The agent never publishes anything; every draft lands unpublished so a human reviews it before it goes live, and the app should say so plainly wherever drafting is offered. Second, keep a configurable glossary of do-not-translate terms, meaning product names, brand names, and feature names, and the agent must reproduce those terms verbatim in every locale instead of translating them.

Persist the settings the app needs: which locale is the source of truth, which content types are in scope, the do-not-translate glossary, the mapping from locale code to Linear reviewer, and the default Linear team. Also keep a short run history so the board can show which cells the agent recently drafted and which ticket is tracking them, and mark those cells as awaiting review rather than plain translated. Respect Contentful's rate limit of roughly seven requests per second when loading a large space, and back off on a 429 rather than hammering it.

Related prompts

Explore more prompts
Catch feature flags that never got switched on in productionWeekly alert noise review board for incident.io on-callMorning triage board for your Kernel browser agent runsTrack every half finished LaunchDarkly rollout in one boardFind the customers stuck contacting support again and againTurn shipped Linear work into Intercom product announcementsVoice agent QA review board for your Hume EVI callsClose the loop between Front tickets and Linear bug fixesOpen a Heroku release war room the moment production looks wrongFind the themes Help Scout tags miss and file them in Linear