Your blog and help center can now live in several languages without you keeping track of every copy: ask your AI assistant to translate an entry, and Kookee links the translation to the original and tells you when it falls behind.
New
Translate with your AI assistant. Ask Claude, ChatGPT, Cursor or any MCP client to translate a blog post or help article into one of your project's languages. The translation is linked to the original and goes into the version of the original's category in that language. When that category has no translation yet, the assistant is told which one, and can translate it too. Translations don't take the original's cover image.
Outdated translations. When you change the title, body, excerpt or SEO texts of an entry in your default language, its translations are marked outdated. The Translations panel of blog posts and help articles shows an Outdated badge and a Mark as up to date button, and saving a translation's own text clears it. Assistants see the same flag in
get_entry, find outdated translations withlist_entries, and mark one up to date withupdate_entryafter they re-translate it.Categories for your blog. Blog posts get categories, like help articles: create and translate them from Manage Categories on the Blog page, and pick one in the post editor. Adding a translation of a post puts it in its category's version in that language.
The site widget in German. Its own text now comes in six languages, and the Language select on the Installation tab offers Deutsch.
Improved
Readable addresses in any language. A Russian or other Cyrillic title becomes a transliterated slug (
Как начать→kak-nachat), a German title writes umlauts asae,oeandue(Größe→groesse), and other languages drop their accents. When a title has no Latin or Cyrillic letters, as in Chinese, a translation made over MCP takes its original's slug.One language in the category select. The category select of the blog and help editors lists only the categories in the entry's language.
For developers:
@kookee/sdkand@kookee/react1.15.0.blog.categories()andblog.list({ category }), and theBlogCategoryNavcomponent to show them.getTranslationsBySlug(slug, { type, locale })finds the right entry when several types or languages share a slug, and each translation now carries its own category, sogetEntrySeolinks every language to its own address. Its newdefaultLocaleoption adds anx-defaultlink, and its JSON-LD gainsinLanguage.BlogTagFilterleaves out tags with no posts.hideEmpty={false}lists them all again.
Fixed
Deleting a category that still has entries now tells you to move them out first. Before, the warning said its entries would be deleted with it, and the delete then failed.
One version of each category in assistant answers. The help center assistant no longer lists a category twice when its translations have their own slugs.
Changes in behavior
GET /v1/categoriesandGET /v1/help/categorieswithoutlocalenow return the categories in your default language, not in every language. Hosted portals show those categories too, so a help category address that uses another language's slug no longer opens.A
categoryfilter matches the slug in the requested language, then in your default language. A slug that exists only in a third language no longer matches.Only blog posts and help articles take categories. Creating a category for another type, or giving such an entry a new one, answers
ENTRY_TYPE_CATEGORIES_DISABLED. Categories already set stay as they are.
Getting it
Translation and blog categories work now in the dashboard and over MCP; start a new conversation so your assistant sees the new options. The script tag at https://kookee.dev/chat/latest.js already has the German texts. From npm, update to @kookee/react 1.15.0 and @kookee/sdk 1.15.0. See Managing your content from an AI assistant (MCP) in the help center.