Paragraphs
Branches

Translations, branched like code.

Stage a campaign's translations on a branch. Review per-locale. Merge atomically when the campaign ships.

The concept

Branches in translations work like branches in code.

Every translation lives on a branch. Most live on main. Create a spring-2026 branch, translate the campaign's units there, and the live site keeps serving main until the campaign goes live. Merge the branch atomically — all locales move to main in a single transaction.

Diff view

Side-by-side per-locale.

The dashboard shows the per-locale diff between the branch and main. Approvers see exactly what's changing in every locale, with the source unit and the prior translation alongside the proposed one. Approval is per-locale, per-unit, or per-branch.

Atomic merge

No half-shipped campaigns.

When you merge, every translation on the branch moves to main in a single Postgres transaction. Either the whole campaign goes live, or none of it does. Full revision history preserved; rollback is one click.

CLI bash
# Create a branch
paragraphs branch create spring-2026

# Translate units on the branch
paragraphs translate --branch=spring-2026 --units-from=./campaign-units.json

# Diff against main
paragraphs branch diff spring-2026 --locale=es-ES

# Merge atomically
paragraphs branch merge spring-2026 --into=main

# Rollback if needed (within revision window)
paragraphs branch rollback main --to=<revision-id>
Use cases

When branches earn their place.

  • Seasonal campaigns. Spring sale copy translated and approved in February, served in March, archived in April.
  • A/B testing. Run two translation variants concurrently with traffic splitting; merge the winner.
  • Multi-stakeholder review. Legal reviews the de-DE branch separately from the es-ES branch.
  • Regional launches. Stage a new locale fully before flipping its DNS.

Start free in 30 seconds.

No credit card. 100,000 words on the free tier. Self-serve onboarding.