Changelog
What changed in each release of Malmoi, newest first. Dates are in UTC. The same notes are published on GitHub Releases.
v1.3.1
Highlights
Coding agents connected over MCP can now read the Malmoi user guide directly, and the public pages get a theme switcher.
Features
AI agents
- Agents can read the guide. A new read-only MCP tool,
read_docs, lists the guide's pages, returns one page in full, or finds the five best-matching sections for a question. It needs no project role or allowed action, so an agent can look up a rejection message, a permission, or how Publish works without leaving the conversation. On a self-hosted install it reads the guide that ships with that version, and links point to your own address.
Appearance
- Theme switcher on public pages. The footer of the public pages now has a theme menu (System, Light, Dark) next to the language menu. It works signed out too; when you're signed in, the choice is saved to your account.
Fixes
- Steadier loading on Home, Projects and Members. The placeholder cards now have the same shape as the real ones, so rows no longer jump down or shift by a pixel when the data arrives.
v1.3.0
Highlights
Malmoi can now be self-hosted with Docker Compose, and Publish recovers safely when a run is interrupted.
Features
Self-hosting
- Run Malmoi on your own server. A Docker image and a Compose setup (app, Postgres, proxy, scheduler) let you install Malmoi under your own domain. The self-hosting guide covers install, updates, backup and restore, key rotation, and troubleshooting. Startup checks name any missing or malformed setting before the app starts.
- Use only the sign-in provider you have. A self-hosted installation can register just a GitHub OAuth app, just Google, or both. Sign-in pages and the Account screen show only the providers that are set up. A half-configured provider stops startup with a clear message instead of showing a button that fails.
Fixes
- Interrupted publishes no longer hang. Publish now has a fixed time budget. If a run ends in an uncertain state, Malmoi holds new runs briefly and then recovers cleanly instead of leaving the project stuck.
- Accepting invitations at the same time works. Two people accepting invitations to the same project at once could fail; both acceptances now go through.
- Sign-in gives a clear reason when your method is turned off. If an installation turns off the only sign-in method you used, the sign-in page now tells you to ask your administrator, rather than pointing at a button that isn't there.
v1.2.6
Highlights
Your projects are one click away from anywhere in Malmoi, and new workflows use the latest GitHub Action.
Features
Navigation
- Projects in the sidebar. Outside a project — on Projects, Inbox, Account and Preferences — the sidebar now lists your projects with a New project row, so you can jump straight into one.
GitHub Action
- New workflows use Action v3. The workflow file Malmoi generates now references
malmoi-i18n-push-v3. It warns in the run log when an update is held because a Malmoi pull request is open, and a value Malmoi doesn't manage no longer fails the run. Existing workflows keep working; copy the file again from Settings → Workflow file to move.
Fixes
- Focus after closing New project. Closing the New project window opened from the header now returns keyboard focus to the button that opened it instead of the top of the page.
- Sidebar focus. Keyboard focus no longer jumps unexpectedly after you click a sidebar row that stays on screen.
v1.2.5
Highlights
Inbox gets its own page, and the avatar menu now takes you straight to your projects.
Features
Inbox
- Inbox page. The items from the header Inbox now also live at
/inbox, grouped into one card per project. It has its own URL, so back navigation and new tabs work, and opening it marks your items as seen. - Sidebar Inbox with an unread badge. A new Inbox item sits right under Projects in the sidebar and shows how many items you haven't seen yet.
Navigation
- Your projects in the avatar menu. The avatar menu lists up to five of your active projects, in the same order as the project switcher, and jumps to the project's Home in one click. This also works on Docs, Changelog and Privacy, where there is no sidebar. Inside a project, the one you're in is checked.
Public pages
- Footer layout. The footer keeps its links on the left and moves the language switcher to the right end.
Fixes
- Loading placeholders match the real layout. Skeletons on the Inbox, Home attention list and Logs were slightly taller than the content they stood in for, so the page shifted when it loaded. They now line up exactly.
v1.2.4
Highlights
More reliable translation delivery, clearer localized feedback, and easier-to-navigate product documentation.
Fixes
- Keep unsent edits protected. Publish and automatic imports now recheck delivery state more carefully when operations overlap, and archived projects are checked again before scheduled work begins.
- Make Publish warnings actionable. Preview and delivery consistently reject unsupported repository file types and ambiguous dictionary entries, with clearer guidance when a result cannot be confirmed.
- Handle project setup more consistently. Resource limits apply across all selected sources, overlapping file selections are rejected before download, and expired GitHub authorization receives the appropriate recovery guidance.
- Improve translation references and search. Reference collection respects locally shadowed translation functions, and search highlighting preserves the correct character boundaries for Unicode text.
- Match numbers and loading states to your language. Counts use the selected UI language's formatting, and loading placeholders better match their finished controls, including localized activity filters.
- Clarify the guides. Spanish image descriptions and search guidance are more consistent. The landing page and English, Korean, and Spanish guides now explain current pricing, supported formats, product scope, and MCP access more directly.
- Improve public-page metadata and document delivery. Document language and breadcrumbs are more accurate, the landing page links directly to common adoption questions, machine-readable guide links resolve to public URLs, and the first guide image loads with higher priority. Fonts and guide images can be reused between visits with a bounded cache lifetime.
v1.2.3
Highlights
Malmoi protects translations during concurrent publishing and preserves the current structure of JSON locale files.
Features
Workspace
- Remember your sidebar. The sidebar keeps its collapsed state on this device, including changes made with the resize handle or keyboard.
Fixes
- Protect recently published translations. Automatic imports now defer when Publish finishes during an import check, preventing older repository values from replacing those translations.
- Preserve JSON structure. Publishing follows the current locale file's nested objects, dotted keys, and containers when repository structure changes while imports are deferred.
- Consistent Publish checks. Preview and execution use the same delivery checks. Unsupported empty-value edits are blocked with a warning, and edits whose source keys have disappeared remain unsent.
- Safer dictionary exports. Duplicate keys in code dictionaries are rejected consistently during publishing.
- Clearer operation results. Completed project changes no longer appear to fail solely because page revalidation failed. Missing images return 404, and slow OAuth client discovery has a bounded timeout.
v1.2.2
Highlights
Polish for onboarding, sign-in, the Sources list, and invitation emails.
Fixes
- Add repositories is easier to find. When connecting a repository, the link to grant access to more repositories now sits above the repo list, so you see it before scrolling.
- Sign-in visuals render correctly. The background card art no longer covers its own blur effect, and the project card behind it is softened as intended.
- Sources list fits narrow panels. The status badge and chevron stay on the same row when the panel is narrow instead of wrapping below.
- Cleaner invitation emails. Invitations now use the same compact column and spacing as the sign-in page, with a full-width button, and the body explains what Malmoi is.
v1.2.1
Highlights
Sources can now be removed and added back, adding sources asks for each source's base language, and the app follows your system theme by default.
Features
Sources
- Remove a source. Owners can remove a source from its detail panel. Translations, history and repository files stay untouched, and the confirmation tells you about unsent edits, an open pull request and the workflow step to delete.
- Add it back anytime. Re-adding the same file with the same format brings the source back with its translations and history.
- Choose a base language per source. Adding sources is now two steps, so every new source's base language is shown and confirmed before anything is added.
Inbox
- Attention inbox. A header inbox shows what needs you across your projects, with an unread badge — also on public pages while you are signed in.
Preferences
- System theme by default. Without a saved choice, Malmoi follows your device's light or dark setting.
- Your theme and language follow you. Signing in stores your account's theme and language on this device, so pages look the same after you sign out.
Fixes
- Clearer path conflicts when adding sources. The message names only the files and sources that actually exist, and going back to step 1 shows which file to uncheck.
v1.2.0
Highlights
Malmoi now speaks Korean and Spanish, shows dates in your own time zone, and has a dark theme.
Features
Interface language
- Korean and Spanish interface. Switch Malmoi between English, 한국어 and Español from the footer or the new Preferences page. Your choice follows your account to every device, and the user guide is available in all three languages.
Time zones
- Dates in your time zone. Pick a time zone in Preferences and every date and time in the app — logs, sources, publish history — is shown in it, always labeled with its offset (for example
08:10 UTC+9). Until you choose, Malmoi keeps using UTC.
Theme
- Dark theme. Choose System, Light or Dark in Preferences. Dark applies instantly, from the very first paint, and System follows your device's setting as it changes. Light stays the default and looks exactly as before.
Fixes
- Clearer Korean and Spanish wording. Terms are now consistent across screens and the guide, and long Spanish labels no longer wrap in the account panel.
v1.1.9
Highlights
The project Home's side column is now organized into Project, Sync and Publish tabs, and each publish records how many translations it changed.
Features
Project Home
- Project, Sync and Publish tabs. The column on the right of a project's Home now shows one fact per row across three tabs. Sync shows the last sync that brought changes in — its type, when it finished, the result, how many values it changed and how many keys it saw. Publish shows the last publish — when it ran, its pull request and whether that pull request is still open, and how many values it changed.
- Connection and CI at a glance. The Project tab shows whether the repository connection is healthy and whether the CI workflow is set up, plus members with pending invitations, e.g.
4 (2). - Shortcuts to the logs. The Sync and Publish tabs link straight to Logs filtered to that kind of run.
Logs
- Changed values on publishes. A publish's details now show how many translation values it changed in your repository files.
Navigation
- Project switcher in the collapsed sidebar. With the sidebar collapsed, the project thumbnail stays visible as a button to switch projects.
Fixes
- Project limit applies everywhere. Restoring an archived project, being promoted to owner, or accepting an owner invitation now respects the project limit, with a clear message when you're at it.
- Invitation emails. Invitation emails are now centered, and the button keeps its rounded corners.
v1.1.8
Highlights
Find anything from the header: one search box now reaches your projects, Malmoi's pages, your translation keys and the docs.
Features
Search
- Global search. Press ⌘K (Ctrl K on Windows and Linux) or click Search… in the header to search your projects, pages, translation keys and the docs in one place. Results are grouped, matched text is highlighted, and archived projects are marked and listed last.
- Clear failures. If projects, keys or docs can't be searched right now, a line under the search box says which part failed and how to try again — it no longer looks like "no results". Signed out, search covers the docs.
Projects
- Start from a single language. A repository whose locale files hold only one language so far can now become a project.
Fixes
- Typing in Korean or Japanese no longer closes dialogs. Pressing Esc while a character is still being composed keeps the dialog open; Esc after the character is finished closes it as before.
- Search picks the row you expect. The first result stays selected while results load, and a resting mouse pointer no longer changes it.
- Project name search matches every word.
/projects, the project switcher and search now agree — "app web" finds "Web App" everywhere. - One look for archived. The Archived badge, the archived date and other status chips look the same on every screen.
v1.1.7
Highlights
Malmoi now uses Geist with a Korean font fallback and more consistent controls across the app.
Features
Typography and release notes
- Geist typography. English text and numbers use Geist, with Pretendard Variable providing Korean glyphs.
- Find the latest release. A green Latest badge appears above the newest changelog version.
Fixes
- Consistent controls. Search, selection, copy feedback, fields, dialogs and loading states now share consistent presentation across project and account screens.
- Clearer landing demo. The demo starts without unsent changes. Saving the French translation creates one change, which is then shown in the publish preview.
v1.1.6
Highlights
The translations screen now keeps the source tree, the key list and the translation panel in step, and Sync holds edits safely while it runs.
Features
Translations
- The tree sets what the key list shows. Click a source's
All namespacesto list every key in that source, or a namespace to list just its keys. Your filter and search stay as they are. - One Status filter, next to the list it filters. The key list header has a single menu —
All keys,Incomplete,Needs review,Unsent,New from GitHub— and the toolbar is just search. - Search looks across every source. While you search, an
All sourcesentry sits at the top of the tree; click any source or namespace to narrow the results without losing your query. - Found a key? See where it lives. Picking a search result marks its namespace in the tree and, if it belongs to another source, takes you there with the key still selected. Clear the search to keep working in that namespace.
- Tree numbers stay put while you filter. They change only when you search; the Status and language filters never hide or grey out parts of the tree.
- Old links still work. Bookmarks using the previous filters open the matching view.
Home and projects
- Shortcuts land where the work is. Home count cards open the first source that has matching keys, a "no translations" row opens that language's incomplete keys, and the projects list's
ReviewandSendlinks open the list already filtered.
Sync
- Edits wait while a sync runs. Saving, reverting and agent writes are paused during a manual Sync or the nightly update, and the screen says so. The Sync dialog now shows progress and the result in place.
Fixes
- Menus stay on screen. The language menu could open past the right edge of the window; menus now stay inside the viewport and scroll when long.
- Smoother large lists. Re-sent lists no longer re-render every row.
- Focus no longer gets lost when moving between sources or after picking a filter.
v1.1.5
Highlights
Every screen now names the same state with the same word, colour and action, and the translation list finds keys faster.
Features
Translations
- Filters and the tree work together. The view starts on all sources, the tree picks where you are, and filters narrow that place — moving in the tree keeps your filters and lands on the first key there.
- The whole filtered list loads at once. No more "load more keys"; use the arrow keys to move through the list.
Status everywhere
- One word per state. Sync failed, Partially synced, Held, Unsent and Disconnected read the same on the project list, Home, Sources, Settings and Logs. A partial sync is never called a failure.
- Home explains why updates are held. When a Malmoi pull request is open or unsent edits are waiting, Home says so next to the last sync, with the reason on the To send card.
- Alerts scroll with the page. Page-level notices now sit at the top of the content and scroll away with it.
Fixes
- Disconnected projects. A project whose repository link was lost now shows Disconnected with a Reconnect action everywhere; the translation screen turns Publish and Sync off from the start and says why.
- Safer destructive actions. Buttons that open an irreversible confirmation are red like the confirmation itself, and confirmations open with focus on Cancel.
- Sign out without a detour. Signing out no longer asks for confirmation; signing out everywhere still does.
- Steadier loading. Loading placeholders keep the same layout as the page that replaces them, and not-found pages sit centred inside the app.
v1.1.4
Highlights
Malmoi now keeps your projects in sync every night, and the app reads more clearly at a glance.
Features
Nightly sync
- Repository changes arrive every night. Once a day Malmoi sends unsent translations as a pull request, or picks up new commits from your repository — even without a CI workflow. Projects with nothing to do are left alone.
- Your translations stay safe while a pull request is open. While a Malmoi pull request is waiting for review, repository imports pause so they can't overwrite the translations in it. Merge or close the pull request and imports resume.
- See who ran it. Home and Logs now say whether a sync or publish was manual, nightly or from CI.
Look and feel
- Clearer states. Results, sync status, triggers, languages and permissions show as badges, and failures share one red.
- Wider settings. Project settings and Account use the full page width like every other page.
- Simpler MCP connector page. Copy the server URL from the Connected apps card; connected Claude and ChatGPT apps show their logos; setup steps live in the guide.
- Sources. Open a source to reach its translations from the dialog.
Fixes
- Nightly failures show up. A missing base branch or a failed file now appears on Home instead of "Nothing needs you", and failed files are retried the next night.
v1.1.3
Highlights
New project moves to the top bar, the sidebar gets simpler, and the home page shows what's new.
Features
Navigation
- New project is in the header. The button now sits at the top right, next to your avatar, on every app screen, instead of in the sidebar and the account menu.
- Simpler sidebar. The row with your avatar and name at the top of the sidebar is gone, leaving more room for navigation.
Home page
- What's new link. The landing page shows the current version above the headline and links to the changelog.
Fixes
- Consent screen layout. When you connect an AI app to Malmoi through browser sign-in, the expiry options now span the full width of the form.
v1.1.2
Highlights
A calmer, more responsive app: redesigned notices, instant feedback when you switch screens, and a faster project Home.
Features
Interface
- Redesigned notices. Alerts across the app are now borderless, tinted by tone, with body text at full contrast so the message reads first and the color says how urgent it is.
- Instant feedback when switching screens. Clicking a link to another screen softly dims the view until it loads, so a slow network no longer leaves you wondering whether the click registered.
Speed
- Faster project Home. Home reuses the repository connection check for 30 seconds, so reopening activity details or coming back to Home is noticeably quicker.
- Keep moving while long actions run. You can navigate away while Reconnect or Add sources is still working; the screen updates when the result arrives.
Docs
- AI agent guide split into pages. Token setup, browser sign-in, permissions and example prompts now each have their own page, and old links still land on the right section.
Fixes
- Account page no longer hangs on a slow GitHub. The installed-repositories line gives up after 8 seconds instead of holding the page.
- Sync confirmation grammar. With a single unsent change, the warning now reads "replace it" and "To keep it".
- Sync-failed banner readability. The banner's explanation is no longer dimmed.
v1.1.1
Highlights
Connect Claude Code, Codex, or claude.ai to Malmoi by signing in through your browser — no token to copy.
Features
MCP connector
- Sign in through your browser. Add only the server URL to Claude Code, Codex, or a claude.ai custom connector, then approve the app on Malmoi's consent screen. You choose what it may do, in which projects, and for how long; the app never shows you a token.
- Connected apps. Every app you authorize is listed on the MCP connector page with its permissions, scope, last use, and expiry. Disconnect one and it loses access right away, while your other apps and your personal token keep working.
- Personal tokens stay. Clients that only take a fixed header, such as Cursor, keep using a personal token.
Fixes
- Clearer permission errors for connected apps. When an app connected through the browser lacks a permission, the error now tells you to reconnect from the app instead of issuing a new token.
v1.1.0
Highlights
Connect your AI coding agent to Malmoi over MCP and let it create projects, fill translations and publish — with the same permissions you have.
Features
MCP connector
- Personal token for AI agents. A new MCP connector page in the sidebar creates one token for your account. You choose what it may do (translate & publish, project settings, members, create projects), which projects it reaches, and when it expires. Rotate or revoke it any time; Malmoi keeps only a hash.
- Works with Claude Code, Codex and Cursor. Copy the connection snippet for your client — the token is read from an environment variable, never pasted into a file.
- Agents do what you can do, no more. An agent can list and translate keys, preview and publish, sync, revert, change settings, manage members, and connect a new repository — each limited by your project role and the token you gave it. Destructive steps still go through a preview first, just like on screen.
- What the agent did shows up as yours. Saves, publishes and settings changes appear in Logs under your name.
Onboarding
- Land on the project Home after creating a project. The last step's button is now Open project.
Fixes
- Publish never sends something you didn't preview. If the translations change after you open the preview, Publish asks you to preview again instead of sending the newer state.
- Logs no longer exposes teammates' email addresses. Actor labels in Logs are masked the same way as on the Members page.
- Member rows show account photos instead of initials.
- Empty JSON locale files keep their nested structure when Malmoi fills them.
v1.0.5
Highlights
A collapsible sidebar, clearer loading on the translations screen, and a tidier public site.
Features
Workspace
- Collapsible sidebar. Collapse the sidebar to a slim icon rail from its bottom toggle, or drag it past its minimum width. Drag it back to reopen at your last width.
- Clearer key switching. When you pick another key, the locale panel shows a loading placeholder until that key arrives, instead of the previous key's values.
- Quieter screens. Cards and settings drop descriptions that repeated their titles, and icons and card headers share one consistent size.
Public site
- Simpler header. The logo takes you home, signed-in visitors get their account menu, and the GitHub link sits next to Get started.
- Consistent reading pages. Docs, the privacy policy and the changelog share one type scale, and each changelog version links to its GitHub release.
Fixes
- Invitation email thumbnails. Project thumbnails in invitation emails showed a black background in Gmail and looked blocky on iOS. They now display cleanly.
v1.0.4
Highlights
Malmoi now has an in-app changelog, one date format everywhere, and invitation emails that show which project you are joining.
Features
Changelog
- Changelog inside Malmoi. The sidebar and account menu open a Changelog page in the app instead of GitHub, with each release newest first. The sidebar item also shows the version you are using.
Invitations
- Invitation emails show the project. The email now carries the project's picture (or a colored tile), its name and the role you are invited as.
Fixes
- Dates read the same everywhere. Logs, Sources, Publish, Settings and the privacy policy now write dates as
Sep 27, 2026and times asSep 27, 2026 16:34 UTC, including the Logs date filter. - Tidier headers. Page and card headers take less vertical space, and the GitHub mark looks the same on every screen.
v1.0.3
Highlights
Maintenance release — no user-facing changes.
v1.0.2
Highlights
Project thumbnails and profile photos now load on corporate networks that block cloud storage hosts.
Fixes
- Images no longer look like failed uploads on restricted networks. Many company firewalls block Vercel Blob as "file sharing and storage", which made thumbnails and profile photos silently fall back to a coloured tile or initials — even though the upload had succeeded. Malmoi now serves those images from its own address, so they appear normally.
- A lost Publish response no longer claims a pull request was opened. When the connection drops mid-Publish, Malmoi now says the changes may have been sent and refreshes to show what actually happened, instead of reporting a PR that may not exist.
- The Sync reconfirmation message no longer guesses at the cause. It states what needs confirming without asserting why the previous attempt was refused.
- Invitation emails have tighter spacing under the logo.
v1.0.1
Highlights
A new version of the GitHub Action for new and re-copied workflows, and three fixes in the app.
Features
GitHub Action
- Action v2 on Node 24. New projects get a workflow that uses
malmoi-i18n-push-v2, so runs no longer show GitHub's Node 20 deprecation warning. Existing workflows keep working on v1; to move, copy the file again from Settings → Workflow file and re-add any inputs you added by hand (such aswrapper).
Fixes
- Sync no longer reports a failure it can't know about. If the connection drops before the result arrives, Malmoi now says it couldn't confirm whether the sync finished and refreshes the page to show what actually happened, instead of saying the sync didn't go through.
- Picking a member role with Enter works. The confirmation dialog used to close on the same keypress; it now stays open.
- Clearer empty-language notice on Home. A language with no translations reads "has no translations here" rather than claiming it was never filled.
v1.0.0
Highlights
The first public release of Malmoi: your repository decides which strings exist, your teammates translate them in the browser, and Publish sends the result back as one pull request.
Features
Connect a repository
- Detection instead of setup. Connect a GitHub repository and Malmoi finds your translation files and loads them — no commit needed before you see your strings.
- Five formats. JSON and YAML catalogs, Chrome extension messages, and code dictionaries (one file per language, or all languages in one file). One project can hold several sources in any mix of formats.
- Your files keep their shape. YAML catalogs and code dictionaries keep comments, blank lines, and key order; JSON catalogs and Chrome messages keep indentation, one-line containers, escapes, and field order.
Translate
- Find, then edit. A source tree and key list beside the selected key in every language. Search covers key names, source text, and saved translations, and one Save writes every changed language of a key.
- Needs review. When source text changes in the code, its translations are flagged for review.
- Removed keys are kept. Bring the code back and its translations return.
Publish
- Preview every change before it's sent. Publish lists each key × language change before it writes anything, and says so up front when a file can't be written.
- One pull request. An open Malmoi pull request is replaced instead of a second one being opened. Publish never writes to your base branch — merging stays with your reviewers.
- Nightly publishing. Saved changes nobody published go out once a night for active, connected projects.
- Unsent edits are protected. While any saved edit is unpublished, workflow runs load nothing, so the repository can't overwrite work that hasn't been sent. Only a project owner can discard unsent edits.
Stay current
- One workflow file. Malmoi generates the GitHub Actions workflow; every push to the base branch brings new keys in.
Work as a team
- Two roles. Owners manage the repository, settings, and members; editors translate and publish. Invite teammates by email with a role per invite.
- Every change on the record. Logs records edits, syncs, and publishes with who made them and the value before and after, kept for the life of the project.
- A guide at mal-moi.com/docs for setup, syncing, publishing, and limits.