Connect your projects,
translate & ship together
Malmoi is a localization tool for GitHub repos: it finds your translation files, lets teammates edit them in the browser, and sends every change back as one pull request.
No paid plans. Open source under the MIT License.
- Malmoi reads the translation files already in your repository.
- Fill in the languages a key is missing.
- Each saved edit adds to the count on Publish.
- Review every change as a diff before it's sent.
- Everything goes back as one pull request.
Search…⌘K
New projectA
Projects33 projectsInboxMCP connectorPreferencesAccount
Acme web
HomeSources22 sourcesTranslations288288 keysLogsMembers44 membersSettingsChangelog1.3.1DocsCollapse sidebar
Translations288288 keysSyncPublish
Search all sources…
Sources22 sources
emails40
web248All namespaces248cart36checkout52common104product56
Keys248248 keysAll keys
Place ordercheckout.submit1 untranslated
Add a couponcheckout.coupon2 untranslated
Shipping addresscheckout.shipping1 untranslated
Your cartcart.titleComplete
Your cart is emptycart.emptyComplete
Removecart.removeComplete
Checkoutcheckout.titleComplete
Order totalcheckout.totalComplete
webcheckoutAll languages
checkout.submit2 of 3 languages
Primary button on the payment stepenSource
Place orderde
Bestellung aufgebenfrUntranslated
Place orderSave
Search…⌘K
New projectA
Projects33 projectsInboxMCP connectorPreferencesAccount
Acme web
HomeSources22 sourcesTranslations288288 keysLogsMembers44 membersSettingsChangelog1.3.1DocsCollapse sidebar
Translations288288 keysSyncPublish
Search all sources…
Sources22 sources
emails40
web248All namespaces248cart36checkout52common104product56
Keys248248 keysAll keys
Place ordercheckout.submit1 untranslated
Add a couponcheckout.coupon2 untranslated
Shipping addresscheckout.shipping1 untranslated
Your cartcart.titleComplete
Your cart is emptycart.emptyComplete
Removecart.removeComplete
Checkoutcheckout.titleComplete
Order totalcheckout.totalComplete
webcheckoutAll languages
checkout.submit2 of 3 languages
Primary button on the payment stepenSource
Place orderde
Bestellung aufgebenfrNot saved
Place order1 unsaved changeSave
Search…⌘K
New projectA
Projects33 projectsInboxMCP connectorPreferencesAccount
Acme web
HomeSources22 sourcesTranslations288288 keysLogsMembers44 membersSettingsChangelog1.3.1DocsCollapse sidebar
Translations288288 keysSyncPublishPublish11 unsent edit
Search all sources…
Repository updates are held until 1 unsent edit is sent.
Send with Publish
Sources22 sources
emails40
web248All namespaces248cart36checkout52common104product56
Keys248248 keysAll keys
Place ordercheckout.submitUnsent1 untranslatedComplete
Add a couponcheckout.coupon2 untranslated
Shipping addresscheckout.shipping1 untranslated
Your cartcart.titleComplete
Your cart is emptycart.emptyComplete
Removecart.removeComplete
Checkoutcheckout.titleComplete
Order totalcheckout.totalComplete
webcheckoutAll languages
checkout.submit2 of 3 languages3 of 3 languages
Primary button on the payment stepenSource
Place orderde
Bestellung aufgebenfrNot savedUnsent
Passer la commande1 unsaved changeSaved · unsentRevert to last sentSaveSave
Search…⌘K
New projectA
Projects33 projectsInboxMCP connectorPreferencesAccount
Acme web
HomeSources22 sourcesTranslations288288 keysLogsMembers44 membersSettingsChangelog1.3.1DocsCollapse sidebar
Translations288288 keysSyncPublish11 unsent edit
Search all sources…
Repository updates are held until 1 unsent edit is sent.
Send with Publish
Sources22 sources
emails40
web248All namespaces248cart36checkout52common104product56
Keys248248 keysAll keys
Place ordercheckout.submitUnsentComplete
Add a couponcheckout.coupon2 untranslated
Shipping addresscheckout.shipping1 untranslated
Your cartcart.titleComplete
Your cart is emptycart.emptyComplete
Removecart.removeComplete
Checkoutcheckout.titleComplete
Order totalcheckout.totalComplete
webcheckoutAll languages
checkout.submit3 of 3 languages
Primary button on the payment stepenSource
Place orderde
Bestellung aufgebenfrUnsent
Passer la commandeSaved · unsentRevert to last sentSave
Publish 1 changeEverything you've edited goes to acme/web as one pull request. 1 change in 1 key.
A new pull request opens on acme/web
Nothing is open right now, so this change goes out on its own.
KeyLanguageValue
messages/fr.json1 change · 1 key
checkout.submitfrYour edit+Passer la commandeAlex
1 change · 1 key · 1 file
Open pull request
Search…⌘K
New projectA
Projects33 projectsInboxMCP connectorPreferencesAccount
Acme web
HomeSources22 sourcesTranslations288288 keysLogsMembers44 membersSettingsChangelog1.3.1DocsCollapse sidebar
Translations288288 keysSyncPublishView result
Search all sources…
Sources22 sources
emails40
web248All namespaces248cart36checkout52common104product56
Keys248248 keysAll keys
Place ordercheckout.submitComplete
Add a couponcheckout.coupon2 untranslated
Shipping addresscheckout.shipping1 untranslated
Your cartcart.titleComplete
Your cart is emptycart.emptyComplete
Removecart.removeComplete
Checkoutcheckout.titleComplete
Order totalcheckout.totalComplete
webcheckoutAll languages
checkout.submit3 of 3 languages
Primary button on the payment stepenSource
Place orderde
Bestellung aufgebenfr
Passer la commandeSavedSave
Sent for review1 change is in a pull request. It reaches the product once someone on the team merges it.
acme/web #128Opened just nowOpen
Editing or closing this pull request happens on GitHub. If you don't have access there, ask a project owner.
Pull request #128 · 1 file changed
View pull request
Malmoi reads the translation files already in your repository.
Start from the files you already have
Connect a GitHub repository with JSON, YAML, JS/TS or Chrome extension translation files, invite your team, and let AI agents work in the same projects over MCP.