Jan

Jan

@amann.work

Author of https://next-intl.dev, building https://eloqnt.dev

231 followers351 following290 posts

Pinned

Today, I'm launching eloqnt/studio. An AI-based toolchain that helps you ship high-quality translations. All from the command line. πšŽπš•πš˜πššπš—πš πš•πš’πš—πš πšŽπš•πš˜πššπš—πš πš›πšŽπšŸπš’πšŽπš  πšŽπš•πš˜πššπš—πš πšπš›πšŠπš—πšœπš•πšŠπšπšŽ With our hosted model, or bring your own. πŸ”—β†“

Would you like eloqnt/cli to catch hardcoded strings in your components? Does your agent get this wrong sometimes?

Seems like eloqnt/cli is helpful to you! Anything it could do that it doesn't today?

next-intl 4.14 is out with πšžπšœπšŽπ™΄πš‘πšπš›πšŠπšŒπšπšŽπš improvements! β†’ Switch πš–πšœπšπš’πš of .πš™πš˜ codec to source string β†’ Support π™Ώπš›πš˜πš–πš’πšœπšŽ.πšŠπš•πš• with πšπšŽπšπ™΄πš‘πšπš›πšŠπšŒπšπšŽπš β†’ Update 𝚜𝚠𝚌_πšŒπš˜πš›πšŽ to 77

With πš—πšŽπš‘πš/πš›πš˜πš˜πš-πš™πšŠπš›πšŠπš–πšœ, you can cache more of your app. If you read a locale from πšŒπš˜πš˜πš”πš’πšŽπšœ() or πš‘πšŽπšŠπšπšŽπš›πšœ(), this is request data. A locale from [πš•πš˜πšŒπšŠπš•πšŽ] is a cache key. Your routing strategy becomes a caching decision.

Next.js 16.3 includes better ISR: Pages can now show an instant loading shell on first visit, and then upgrade to a fully prerendered page in the background (cached). This comes in handy for apps with a large number of locales!

πšŽπš•πš˜πššπš—πš πš•πš’πš—πš now links to rule details, so agents can get more guidance when fixing issues.

Next.js 16.3 is out with next/root-params πŸ₯ΉπŸ₯ΉπŸ₯Ή I've literally waited years for this! Use it today with next-intl πŸ”—β†“

With the number of lint rules for eloqnt/cli growing continuously, I've now added dedicated pages for each one. Is this helpful? Anything to add/change?

MDX components in eloqnt/studio now render twice: β†’ React for humans β†’ Markdown for agents

TIL in monorepos you can split π™²π™»π™°πš„π™³π™΄.πš–πš files by package, much tidier πŸ’‘ πšŽπš•πš˜πššπš—πš/ ─ π™²π™»π™°πš„π™³π™΄.πš–πš ─ πšŠπš™πš™πšœ/ ─ πšœπšπšžπšπš’πš˜-πš πšŽπš‹/π™²π™»π™°πš„π™³π™΄.πš–πš ─ πš™πšŠπšŒπš”πšŠπšπšŽπšœ/ ─ πšŒπš•πš’/π™²π™»π™°πš„π™³π™΄.πš–πš ─ πšœπšπš”/π™²π™»π™°πš„π™³π™΄.πš–πš

Shipped a much-needed docs revamp for eloqnt/studio. β†’ Zero-to-lint quickstart (with a prompt) β†’ Copyable .πš–πš links β†’ Support for π™°πšŒπšŒπšŽπš™πš: 𝚝𝚎𝚑𝚝/πš–πšŠπš›πš”πšπš˜πš πš— β†’ Split into multiple pages β†’ Public changelogs β†’ It looks just a lot nicer :D

Have you tried linting your i18n strings yet? > npm install @eloqnt/cli --save-dev

Jan@amann.work

Today, I'm launching eloqnt/studio. An AI-based toolchain that helps you ship high-quality translations. All from the command line. πšŽπš•πš˜πššπš—πš πš•πš’πš—πš πšŽπš•πš˜πššπš—πš πš›πšŽπšŸπš’πšŽπš  πšŽπš•πš˜πššπš—πš πšπš›πšŠπš—πšœπš•πšŠπšπšŽ With our hosted model, or bring your own. πŸ”—β†“

Today, I'm launching eloqnt/studio. An AI-based toolchain that helps you ship high-quality translations. All from the command line. πšŽπš•πš˜πššπš—πš πš•πš’πš—πš πšŽπš•πš˜πššπš—πš πš›πšŽπšŸπš’πšŽπš  πšŽπš•πš˜πššπš—πš πšπš›πšŠπš—πšœπš•πšŠπšπšŽ With our hosted model, or bring your own. πŸ”—β†“

View full thread

Start linting your strings today. πš—πš™πš– πš’ @πšŽπš•πš˜πššπš—πš/πšŒπš•πš’ --𝚜𝚊𝚟𝚎-𝚍𝚎𝚟 Add .πšŽπš•πš˜πššπš—πš/πšŒπš˜πš—πšπš’πš.𝚝𝚜 and run: πš—πš™πš‘ πšŽπš•πš˜πššπš—πš πš•πš’πš—πš Docs β†’ studio.eloqnt.dev/docs

Today, I'm launching eloqnt/studio. An AI-based toolchain that helps you ship high-quality translations. All from the command line. πšŽπš•πš˜πššπš—πš πš•πš’πš—πš πšŽπš•πš˜πššπš—πš πš›πšŽπšŸπš’πšŽπš  πšŽπš•πš˜πššπš—πš πšπš›πšŠπš—πšœπš•πšŠπšπšŽ With our hosted model, or bring your own. πŸ”—β†“

View full thread

The backbone of eloqnt/studio is its AI engine. You can either use a hosted version, or bring your own modelβ€”anything supported by the AI SDK. This also includes 3rd-party plugins for using your Claude Code or Codex sub (subject to their latest terms).

Localization outgrowing your repo? eloqnt/studio is modularβ€”keep it for linting and source review, and swap out the translation layer for your favorite translation management system. Crowdin support is built in, so upgrading is a config file awayβ€”unlocking reviews, 3rd party integrations, and more.

Today, I'm launching eloqnt/studio. An AI-based toolchain that helps you ship high-quality translations. All from the command line. πšŽπš•πš˜πššπš—πš πš•πš’πš—πš πšŽπš•πš˜πššπš—πš πš›πšŽπšŸπš’πšŽπš  πšŽπš•πš˜πššπš—πš πšπš›πšŠπš—πšœπš•πšŠπšπšŽ With our hosted model, or bring your own. πŸ”—β†“

View full thread

What makes your product or service unique? Terms to keep, tone to hold, a glossaryβ€”all placed in simple markdown styleguides. Easy to set up and maintain, and the format your agent already speaks. It's AGENTS.md, but for translations.

And it all lives in your repo. Config, styleguides, messagesβ€”versioned and branched with your code. Nothing to sync, nothing drifting apart on a feature branch.

Today, I'm launching eloqnt/studio. An AI-based toolchain that helps you ship high-quality translations. All from the command line. πšŽπš•πš˜πššπš—πš πš•πš’πš—πš πšŽπš•πš˜πššπš—πš πš›πšŽπšŸπš’πšŽπš  πšŽπš•πš˜πššπš—πš πšπš›πšŠπš—πšœπš•πšŠπšπšŽ With our hosted model, or bring your own. πŸ”—β†“

View full thread

So eloqnt/studio is different. It's not a model, but a pipeline. Every string moves through well-defined steps: β‘  Static analysis β‘‘ Source text review β‘’ Context enrichment β‘£ Translate

After maintaining next-intl for years, I've seen every way translations break. eloqnt/studio matches strings to their references in source code. This not only enables additional quality guardrailsβ€”it pulls in all the relevant context your agent has always silently guessed at.

Today, I'm launching eloqnt/studio. An AI-based toolchain that helps you ship high-quality translations. All from the command line. πšŽπš•πš˜πššπš—πš πš•πš’πš—πš πšŽπš•πš˜πššπš—πš πš›πšŽπšŸπš’πšŽπš  πšŽπš•πš˜πššπš—πš πšπš›πšŠπš—πšœπš•πšŠπšπšŽ With our hosted model, or bring your own. πŸ”—β†“

What if your linter caught translation bugs the way it catches code bugs? Missing translations. Unused keys. Broken ICU args. The list goes on.

AI will translate your app in seconds. It'll also confidently mistranslate, break a plural, flatten your toneβ€”and you'll ship it, because you can't review what you can't read.

Jan@amann.work

How do you keep translations in sync when you're coding with agents?

🌐 next-intl 4.12 is out with useExtracted improvements! β†’ Improved monorepo support β†’ Stacked .po descriptions β†’ Path-only references by default β†’ Deferred one-off extraction β†’ Another message ordering fix See the release notes for details: github.com/amannn/next-...

github.comRelease v4.12.0 Β· amannn/next-intl4.12.0 (2026-05-13) Features Improvements for useExtracted (#2316) (bff2f96) – by @amannn ⚠️ A small config change is required for useExtracted users to upgrade, please see #2316 for details.

I've been pretty quiet lately since I've been secretly working on a new project ❀️

I'm looking to slowly catch up on notifications now. If you've reached out over the last couple of weeks, you're still in my inboxβ€”don't worry!