LRM Cloud is a web-based platform for team localization management with real-time collaboration, machine translation, and CLI synchronization.
LRM is a fully open source project under the MIT license. Unlike other localization platforms that only open-source parts of their system, LRM provides the complete stack:
- CLI Tool - Open source (MIT)
- Cloud Backend API - Open source (MIT)
- Web Frontend - Open source (MIT)
- VS Code Extension - Open source (MIT)
- Docker Deployment - Open source (MIT)
This means you can:
- Self-host with no feature restrictions
- Modify the source code for your needs
- Audit the code for security compliance
- Contribute improvements back to the community
Use our managed cloud platform at lrm-cloud.com — no setup required.
| Plan | Price | Best For |
|---|---|---|
| Free | $0/month | Personal projects, evaluation |
| Team | $9/month | Small teams, startups |
| Enterprise | $29/month | Large teams, high volume |
All plans include the full feature set. See pricing details for limits.
Deploy LRM Cloud on your own infrastructure using Docker Compose. All features are available — no artificial limitations, no phone-home, no license checks.
Self-hosted benefits:
- Unlimited translation characters (use your own API keys)
- Unlimited projects and team members
- Complete data ownership — your data stays on your servers
- GDPR/compliance friendly — control your data jurisdiction
- Air-gapped deployments — works offline with Ollama for translation
- Customizable — modify the source code as needed
Requirements:
- Docker & Docker Compose
- Linux server (Ubuntu 20.04+ recommended)
- Domain with SSL certificate (optional but recommended)
Quick Start:
# Clone the repository
git clone https://github.com/nickprotop/LocalizationManager.git
cd LocalizationManager/cloud/deploy
# Run interactive setup (first time only)
./setup.sh
# Build and deploy
./deploy.shThe setup.sh script interactively configures:
- Database credentials and connection
- Domain name and SSL settings
- API keys for translation providers
- nginx configuration from templates
The deploy.sh script handles building and deploying.
Self-Hosted Components:
| Service | Purpose |
|---|---|
| nginx | Reverse proxy, SSL termination |
| api | REST API server (.NET 9) |
| web | Blazor WASM frontend |
| postgres | PostgreSQL 16 database |
| redis | Session cache |
| minio | S3-compatible storage (optional) |
For detailed deployment instructions, see cloud/deploy/README.md.
- Web-based Translation Editor - Edit translations in a spreadsheet-like interface
- Multiple Translation Providers - Google, DeepL, OpenAI, Claude, Azure, and more
- Translation Memory - Automatic caching for cost savings and consistency
- Glossary Management - Enforce consistent terminology across translations
- CLI Sync - Bidirectional sync between local files and cloud with three-way merge
- GitHub Integration - Connect repositories, push/pull translations, auto-create PRs
- Team Collaboration - Organizations with role-based access control
- Multi-format Support - RESX, JSON, i18next, Android XML, iOS strings
The dashboard provides an overview of your localization projects:
- Project count and total keys across all projects
- Average completion percentage
- LRM Usage - Translation character consumption
- Recent Projects with quick access to edit and settings
Each project contains your localization resources in a specific format.
The project detail page shows:
- Key Statistics - Total keys, languages, completion percentage
- Language Progress - Per-language translation status with progress bars
- Validation Status - Real-time validation for duplicates, missing translations, and placeholder mismatches
- Project Details - Format, default language, localization path, sync status
- Quick Actions - Open Editor, View Snapshots, Sync History, Glossary, Validation, Translate
- Click "New Project" from the dashboard
- Enter a project name and slug
- Select the resource format (RESX, JSON, i18next, Android, iOS)
- Set the default language (source language)
- Click "Create"
You can import resources from:
- ZIP archive - Upload a ZIP containing your localization files
- CLI Push - Use
lrm cloud pushto upload from your local project
The web-based editor provides a powerful interface for managing translations.
- Multi-language Grid - View all languages side by side
- Key Preview Panel - Detailed view of selected key with all translations
- Search & Filter - Find keys by name, value, or status
- Status Indicators - See which translations are complete, missing, or need review
- Bulk Selection - Select multiple keys for batch operations
- Column Visibility - Show/hide languages as needed
- Click on any cell to select a key
- View details in the Key Preview panel on the right
- Click "Edit" to modify values
- Changes are saved automatically
- Click "+ Add Key" in the toolbar
- Enter the key name
- Provide the default language value
- Optionally add a comment for translators
- Click "Save"
LRM Cloud offers multiple translation options to fit your workflow and budget.
| Type | Description | Examples |
|---|---|---|
| LRM Managed | We handle the API - no key needed | LRM Translation |
| BYOK (Bring Your Own Key) | Use your own API keys | Google, DeepL, OpenAI, Claude, Azure |
| Free Providers | Community providers, no API key | MyMemory, Lingva |
- Select one or more keys in the editor
- Click "Translate" in the toolbar
- Choose the Translation Provider
- Select Target Languages
- Configure options:
- Only translate missing - Skip already translated keys
- Overwrite existing - Replace current translations
- Context - Provide context for AI providers
- Enable Translation Memory options:
- Use Translation Memory - Check TM before calling provider
- Store translations in TM - Save new translations for reuse
- Minimum match - Fuzzy match threshold (100% = exact only)
- Click "Translate All"
To use your own API keys:
- Go to Settings > Translation Providers
- Click "Configure" on a provider
- Enter your API key
- Click "Save & Test" to verify
Project-level overrides are available in Project Settings > Translation tab.
Translation Memory (TM) automatically stores translations for reuse, saving costs and ensuring consistency.
- TM Check - Before calling a provider, TM is searched for matches
- Exact Match (100%) - Reused immediately, no API call needed
- Fuzzy Match (70-99%) - Suggested based on similarity threshold
- No Match - Provider is called, result stored in TM
- Cost Savings - Avoid redundant API calls
- Consistency - Same text always produces same translation
- Speed - Instant matches from cache
- Learning - TM grows with every translation
- Personal TM - Your individual translations
- Organization TM - Shared across team members (Team/Enterprise plans)
Define approved terminology to ensure consistent translations.
- Brand Terms - Product names that shouldn't be translated
- Domain Terminology - Industry-specific terms
- Consistency - Same term always translates the same way
- Open project Glossary from Quick Actions
- Click "Add Term"
- Enter source term and translations per language
- Set case sensitivity if needed
- Click "Save"
Glossary terms are automatically enforced when using AI providers (OpenAI, Claude).
Track all push and revert operations with full audit trail.
The Sync History page shows:
- Operation ID - Unique identifier for each push/revert
- Type - Push, revert, or web edit
- Timestamp - When the operation occurred
- Changes - Keys added, modified, or deleted
- User - Who performed the operation
- Find the push you want to undo in history
- Click the revert icon
- Confirm the revert operation
- A new history entry is created for the revert
Snapshots are point-in-time backups of your project's translations. Use them to track changes and restore to previous states.
- Go to Project > Snapshots tab
- Click "Create Snapshot"
- Add an optional description
- Click "Create"
Snapshots can be viewed, compared, and restored at any time.
Synchronize local resource files with LRM Cloud using the CLI.
# Clone a cloud project
lrm cloud clone https://lrm-cloud.com/@username/my-project
# Or link existing project
lrm remote set https://lrm-cloud.com/@username/my-project
lrm cloud login# Pull latest changes
lrm cloud pull
# Make local changes...
# Push changes to cloud
lrm cloud push| Command | Description |
|---|---|
lrm cloud clone <url> |
Clone a cloud project |
lrm cloud push |
Upload local changes |
lrm cloud pull |
Download cloud changes |
lrm cloud status |
Show sync status |
lrm cloud log |
View sync history |
lrm cloud revert <id> |
Undo a previous push |
lrm cloud snapshot create |
Create a named snapshot |
See Cloud Sync Guide for complete documentation.
Connect your GitHub repository to LRM Cloud for seamless version control integration.
- Go to Project Settings > GitHub
- Click "Connect to GitHub"
- Authorize LRM Cloud to access your repository
- Select the repository and branch
Push translations from LRM Cloud to your GitHub repository:
- Make changes in the web editor or via CLI sync
- Click "Push to GitHub" in project settings
- LRM creates a branch and opens a pull request
- Review and merge the PR in GitHub
Pull translations from GitHub into LRM Cloud:
- Click "Pull from GitHub" in project settings
- LRM performs a three-way merge:
- Compares GitHub, Cloud, and last synced state
- Auto-merges non-conflicting changes
- Presents conflicts for manual resolution
- Review and apply changes
LRM uses proper three-way merge (like Git) at every sync boundary:
- CLI ↔ Cloud: Merges local file changes with cloud changes
- Cloud ↔ GitHub: Merges cloud edits with repository changes
This means:
- Changes in different places merge automatically
- Same change in both places = no conflict
- Only truly divergent changes require resolution
- No accidental overwrites
When conflicts occur:
| Strategy | Description |
|---|---|
| GitHub | Accept all GitHub values |
| Cloud | Keep all Cloud values |
| Prompt | Choose per-conflict in UI |
Organizations enable team collaboration on localization projects.
| Role | Permissions |
|---|---|
| Owner | Full access, billing, delete org |
| Admin | Manage projects, members, settings |
| Member | Edit resources, translate, sync |
| Viewer | View only, export |
- Go to Organizations in the sidebar
- Click "Create Organization"
- Enter name and optional description
- Invite team members
| Feature | Free | Team ($9/mo) | Enterprise ($29/mo) |
|---|---|---|---|
| LRM Translation | 5K chars/mo | 50K chars/mo | 500K chars/mo |
| BYOK Translation | 25K chars/mo | 250K chars/mo | 2.5M chars/mo |
| Projects | 3 | Unlimited | Unlimited |
| Team Members | - | 10 | Unlimited |
| Organizations | - | Yes | Yes |
| Cloud Storage | 25 MB | 250 MB | 500 MB |
| Snapshots | 3/project | 10/project | 30/project |
- Create Account - Sign up at lrm-cloud.com/app/register
- Create Project - Click "New Project" and configure format
- Import Resources - Upload ZIP or push via CLI
- Start Translating - Use the web editor or CLI
Update translations in real-time without redeploying your .NET application. LRM is the first and only OTA localization solution for .NET!
- Your .NET app starts and loads local/embedded resources
- Background service fetches translations from LRM Cloud
- Translations sync automatically (default: every 5 minutes)
- Changes in LRM Cloud reflect in your app without redeployment
// Program.cs
builder.Services.AddJsonLocalizationWithOta(options =>
{
options.UseOta(
endpoint: "https://lrm-cloud.com",
apiKey: "lrm_your_read_only_api_key",
project: "@username/my-project" // or "org/project"
);
});- Go to Project Settings > API Keys
- Click "Create API Key"
- Select "Read" scope (sufficient for OTA)
- Copy the key (
lrm_...)
| Option | Default | Description |
|---|---|---|
Endpoint |
https://lrm-cloud.com |
LRM Cloud API endpoint |
ApiKey |
- | API key with read scope (required) |
Project |
- | Project path: @user/project or org/project |
RefreshInterval |
5 minutes | How often to check for updates |
FallbackToLocal |
true | Use local resources when offline |
Timeout |
10 seconds | HTTP request timeout |
MaxRetries |
3 | Retry attempts for failed requests |
OTA works with the entire .NET ecosystem:
- ASP.NET Core (Web APIs, MVC, Razor Pages)
- Blazor (Server + WebAssembly)
- .NET MAUI (iOS, Android, Windows, macOS)
- Avalonia (Cross-platform desktop)
- WPF and WinForms
- Console applications
- Azure Functions / AWS Lambda
- Worker Services
The OTA client includes:
- Retry with exponential backoff - Automatically retries failed requests
- Circuit breaker - Stops requests after repeated failures, auto-recovers
- ETag caching - Efficient bandwidth usage, only fetches when changed
- Graceful fallback - Uses local resources when cloud is unavailable
When using OTA with LocalizationManager.JsonLocalization.Generator:
- Generated classes work for compile-time keys
- New OTA keys use dynamic access:
Strings.Localizer["NewKey"]
The ConsoleApp.OtaDemo sample demonstrates all OTA features using a mock HTTP handler - no real LRM Cloud server required:
- Initial bundle fetch
- ETag caching (304 Not Modified)
- Multi-language support
- CLDR pluralization
- Live translation updates
- Fallback to embedded resources
Run it directly to see OTA in action:
cd samples/ConsoleApp.OtaDemo
dotnet runSee the NuGet package documentation for full OTA API details.
- Cloud Sync Guide - Complete CLI sync documentation
- Cloud Sync Quick Start - 5-minute quick start
- Translation Guide - Translation providers and options
- Commands Reference - All CLI commands












