Getting started
Quick Start Guide
Get up and running with langctl in under 5 minutes. This guide will walk you through creating your first project and getting translation files into your app.
Note
This guide covers both the Dashboard and CLI workflows. Choose whichever approach fits your workflow best - or use both!
Prerequisites
Before you begin, make sure you have:
- A langctl account (sign up at app.langctl.com)
- For CLI: Node.js 20+ installed
- 5 minutes of your time
Option 1: Using the Dashboard
Step 1: Sign Up & Create Organization
- Go to app.langctl.com/signup
- Enter your full name, email and password, then click Create account
- Open the verification link we email you (it expires after 24 hours; you can resend it)
- Enter your organization name (e.g., “My Company”) and create the organization
Note
You need to verify your email before you can create an organization, invite people or use AI translation.
Step 2: Create Your First Project
- From Home or Projects, click New Project
- Fill in the form:
- Project Name: “My First Project” (the slug the CLI uses is generated from it)
- Description: “Learning langctl” (optional)
- Default Language: English - the language you write source text in
- Target Languages: add Spanish and French
- Click Create Project
Tip
You can add more languages later from the project’s Languages page.
Step 3: Add Translation Keys
- Open Translations in the sidebar (it shows the project selected in the sidebar’s project switcher)
- Click Add Key
- Fill in the form:
- Key Name:
home.welcome - Module:
home(optional but recommended) - Description:
Welcome message on homepage - English:
Welcome to our app! - Spanish:
¡Bienvenido a nuestra aplicación! - French:
Bienvenue dans notre application!
- Key Name:
- Save the key
Step 4: Add More Keys (Optional)
Let’s add a few more keys to make it more interesting:
| Key | Module | English | Spanish | French |
|---|---|---|---|---|
home.subtitle | home | Get started now | Comienza ahora | Commencez maintenant |
auth.login | auth | Log In | Iniciar sesión | Se connecter |
auth.signup | auth | Sign Up | Registrarse | S’inscrire |
Pro Tip: AI Translation
Instead of typing every translation:
- Enter only the English text
- Click Translate missing above the list (or Suggest next to a language in the key’s detail panel)
- Review the AI translations and click Approve - until then they are left out of exports and
langctl pull
Step 5: Publish Your Keys
- Select the keys you want to publish (use the checkboxes)
- Click Publish in the bar that appears at the bottom
Only published keys are included in exports and langctl pull.
Step 6: Export Translations
- Open Import & Export in the sidebar and switch to Export
- Select the format - for example i18n JSON or Flat JSON for web apps
- Select the languages to export
- Download the files
Your exported file will look like this:
{
"home.welcome": "Welcome to our app!",
"home.subtitle": "Get started now",
"auth.login": "Log In",
"auth.signup": "Sign Up"
} Place the exported files in your project, named after their language (the dashboard downloads them as translations.en.json, …; langctl pull names and places files for you):
my-project/
├── public/
│ └── locales/
│ ├── en.json ← Place here
│ ├── es.json
│ └── fr.json
└── src/
└── ... Option 2: Using the CLI
Step 1: Install the CLI
The CLI needs Node.js 20 or newer.
npm install -g langctl Verify installation:
langctl --version Step 2: Create an API Key
- Log in to app.langctl.com
- Go to API Keys in the sidebar
- Click New API Key
- Enter a name (“My CLI Key”) and choose its permissions - Translations Read and Write cover
pullandpush - Copy the key (shown only once!)
Important
The API key is shown only once! Save it immediately in a secure location.
Step 3: Set Up Your Repository
In the root of your app’s repository, run:
langctl init init asks for the API key (input is hidden), lets you pick the project, file format and file location, and writes a langctl.json you can commit:
{
"project": "my-first-project",
"format": "json",
"output": "src/locales/{lang}.json"
} You can also skip the prompts with flags: langctl init --project my-first-project --format json --output "src/locales/{lang}.json".
Don't have a project yet?
Create one from the terminal first, then run langctl init:
langctl projects create "My First Project" --languages en,es,fr --default-language en
Step 4: Pull Translations
langctl pull This writes one file per language to the path in langctl.json:
+ src/locales/en.json created
+ src/locales/es.json created 3/4 translated
+ src/locales/fr.json created 3/4 translated Only published keys are included. Drafts stay out of your app until someone reviews and publishes them (use --include-drafts to override). AI translations that nobody has approved yet are left out as well, so your app falls back to the default language for them.
Step 5: Push New Strings
Add new keys to your source-language file (e.g. src/locales/en.json), then upload them:
langctl push --dry-run # preview what would change
langctl push # upload new keys from the source language file
langctl push --publish # upload and publish them in one step By default push uploads only the source language and only adds new keys. Use -l all to upload every language and --overwrite to replace existing translations.
Step 6: Add Keys from the Terminal (Optional)
langctl keys create my-first-project home.welcome \
--module home \
--description "Welcome message on homepage" \
--value en="Welcome to our app!" \
--value es="¡Bienvenido a nuestra aplicación!" \
--value fr="Bienvenue dans notre application!"
langctl keys create my-first-project auth.login \
--module auth \
--value en="Log In" \
--value es="Iniciar sesión" \
--value fr="Se connecter" New keys are drafts until you publish them:
langctl keys publish my-first-project home.welcome auth.login
# or publish every draft key in the project
langctl keys publish my-first-project --all Other Platforms
Pick a different format in langctl init, or pass it to pull directly. Each format has a default path that follows the platform’s layout:
langctl pull -f android # res/values/strings.xml, res/values-es/strings.xml, …
langctl pull -f ios # en.lproj/Localizable.strings, es.lproj/…
langctl pull -f arb # lib/l10n/app_en.arb, lib/l10n/app_es.arb, …
langctl pull -f nested-json -o "public/locales/{lang}.json" Run langctl formats to list every format and its default path.
Next Steps
Now that you have translation files, integrate them with your framework:
-
React/Next.js: See Web Frameworks Guide
-
Angular: See Web Frameworks Guide
-
Vue: See Web Frameworks Guide
-
iOS: See Mobile Apps Guide
-
Android: See Mobile Apps Guide
-
Flutter: See Cross-Platform Guide
-
AI Translation - Automate translations with AI
-
Module Organization - Organize large projects
-
Team Collaboration - Invite team members
-
CI/CD Integration - Automate with GitHub Actions
Even if you prefer CLI, the dashboard is great for:
- Visual translation editing
- Team member management
- Checking plan usage
- Reviewing AI translations
Check out the full CLI Reference for more:
- Managing projects, keys and languages
- Publishing and unpublishing keys in bulk
- Team management from the terminal (API key with the
org:adminscope) --jsonoutput and exit codes for scripts
Add More Languages
langctl projects add-language my-first-project de ja Import Existing Translations
Already have translation files?
langctl import my-first-project ./old-translations/es.json -l es
# or, with langctl.json set up, upload every language at once
langctl push -l all Automate with CI
In CI there’s no login step — set the key as a secret environment variable (LANGCTL_API_KEY) and check that committed files are up to date:
- run: npx langctl@0 pull --check # exit code 7 if committed files are out of date
env:
LANGCTL_API_KEY: ${{ secrets.LANGCTL_API_KEY }} See CI/CD Integration for the full workflow.
Troubleshooting
Authentication failed
Run langctl whoami to see which key is in use (LANGCTL_API_KEY, --api-key or the stored key), its organization and scopes. Make sure your API key:
- Starts with
lc_ - Hasn’t been revoked
- Was copied correctly (no extra spaces)
Project not found
Use the project slug (URL-friendly name), not the display name. langctl projects list shows the slugs:
langctl pull my-first-project # ✓ slug
langctl pull "My First Project" # ✗ display name Keys missing from pulled files
Make sure your keys are published — drafts are excluded from pull and export:
langctl keys list my-project --drafts # see unpublished keys
langctl keys publish my-project key1 key2 key3
langctl pull Get Help
Stuck? We’re here to help:
- CLI Help: Run
langctl --helporlangctl <command> --help - Documentation: Browse the sidebar for detailed guides
- Email Support: support@langctl.com
- GitHub Issues: Report a bug
What’s Next?
Now that you’ve completed the quick start, dive deeper into:
- Installation Guide - Detailed setup and configuration
- Dashboard Guide - Master the web interface
- CLI Reference - Learn all CLI commands
- Platform Integrations - Integrate with your stack
Join the Community
Have questions or feedback? Open an issue on GitHub or email support@langctl.com.