Translations, branched like code.
Stage a campaign's translations on a branch. Review per-locale. Merge atomically when the campaign ships.
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.
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.
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.
# 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> 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.