Features & workflows
Publishing Workflow
langctl uses a draft/published workflow similar to staging/production environments, ensuring only reviewed translations reach your users.
Draft vs Published
| State | Purpose | Included in pull / export |
|---|---|---|
| Draft | Work in progress, under review | No (unless —include-drafts) |
| Published | Ready for production | Yes (default) |
Publishing Keys
# publish specific keys
langctl keys publish my-app home.welcome home.subtitle
# publish every draft key in a module
langctl keys publish my-app --module auth
# publish every draft key in the project
langctl keys publish my-app --all
# move keys back to draft
langctl keys unpublish my-app home.subtitle # new keys are drafts by default
langctl keys create my-app feature.title --value en="New Feature"
# review it
langctl keys get my-app feature.title
langctl keys list my-app --drafts
# publish it, then pull — only published keys are written
langctl keys publish my-app feature.title
langctl pull Keys you upload with langctl push or langctl import are drafts too, unless you pass --publish. To skip the draft stage for a key you create from the terminal, use langctl keys create … --publish.
To preview drafts locally without publishing them:
langctl pull --include-drafts Tip
Use drafts for new translations or work-in-progress. Publish only after review.
In the dashboard, publish and unpublish from a key’s detail panel or a row’s action buttons, or select several keys and use Publish / Unpublish in the bulk bar.
AI Translations and Review
On top of draft/published, each AI translation has its own review state. An AI translation is left out of exports and langctl pull - even in a published key - until someone approves it or edits it. Your app falls back to the default language for that string in the meantime. See AI Translation.
| Key | AI translation | Included in pull / export |
|---|---|---|
| Draft | any | No (unless drafts are included) |
| Published | Approved or edited | Yes |
| Published | Awaiting review | No - that language falls back |
Best Practices
- Default to Draft - Create new keys as drafts
- Review Before Publishing - Check accuracy and context
- Bulk Publish - Publish complete modules at once (
keys publish my-app --module auth) - Production Builds - Pull without
--include-draftsfor production; drafts are excluded by default
Next Steps
- Translation Management - Manage translations
- Module Organization - Organize by module
- Collaboration - Team workflows