In the first post I introduced the Content Sync Toolkit, a Sync status application for Xperience by Kentico that shows what still needs syncing to your Content Sync target. 1.0.0-beta.3 makes it much faster on large sites, lets you open items that only exist on the target, and fixes how languages with a fallback are compared.

Install or Update

Update the package on both instances, the Content Sync source and target:

dotnet add package XperienceCommunity.ContentSyncToolkit --version 1.0.0-beta.3

Registration is unchanged:

builder.Services.AddContentSyncToolkit();

// On the source instance: adds the Sync status application.
builder.Services.AddContentSyncToolkitAdmin();

Faster on Large Sites

Before moving on to new features, I wanted to make sure the toolkit holds up on a big site. So I filled a test pair of instances with 20,000 pages and 20,000 content hub items each, and measured.

Beta.2 took about four seconds to open the Pages tab, and over eight seconds to refresh it. The cause was how each instance read its content: in small pages of 500 items, with every field of every content type, when the comparison only needs a handful of them. Beta.3 reads items in batches of 5,000, each one starting where the previous one ended, and asks only for the columns it uses:

1.0.0-beta.2 1.0.0-beta.3
Pages tab: open, page, filter ~4.0 s ~0.35 s
Pages tab: Refresh 8.4 s 0.9 s
Content hub tab: open, page, filter ~2.0 s ~0.25 s
Content hub tab: Refresh 4.0 s 0.6 s

The copy of the target’s list that the source keeps for a minute and a half is lighter too, from about 12 MB to 7 MB at that size. Editors whose pages are filtered by page permissions see about 0.75 seconds per request, since every page has to be checked.

To make sure nothing changed along the way, I exported every list from both versions, for both instances, every tab and both languages, and compared them field by field: over 160,000 items, all identical.

Items Only on the Target

Content Sync can add and update content, but it can’t delete it. When you delete a page on staging after it was synced, it stays on production, and the toolkit shows it as Only on target. Until now, all it could do was tell you to delete it there.

Now the item’s name (its path on the Pages tab) is a link, marked ↗, that opens its editor on the target in a new tab. From there you can delete it, unpublish it with a redirect, or schedule the unpublish. You sign in to the target with your own account, and its permissions apply.

An Only on target row whose name links to the item on the target

The link works out of the box: it uses Content Sync’s target URL, plus /admin. If your production administration is on a different address, there’s an optional setting for it.

Languages With a Fallback

When a language falls back to another, for example Spanish to English, Xperience’s content queries return the fallback version of every item that hasn’t been translated. The toolkit was listing those as if they existed in Spanish: on my test site, the Spanish view showed 20,279 pages when only 9 had a Spanish version. Content Sync syncs one language at a time, and can’t sync an item in a language it has no version in.

Beta.3 lists only the items translated into the selected language. That also fixed two smaller problems: translated items now show their Spanish names, and an item never published in Spanish no longer appears as published.

Upgrading

Update both instances. A beta.2 target still works with a beta.3 source, but its Only on target items have no link, and it still includes untranslated items in a language with a fallback.

The release was checked on both ends of the supported range, Xperience by Kentico 30.8.0 and 31.9.1. See Compatibility.md for the full record. It’s still a beta, so APIs and behavior may change before 1.0.0.

What’s Next

I’m looking at items deleted on the source that are still in its recycle bin: while they’re there, you can take them off production with Content Sync alone, without signing in to production. Feedback is welcome through GitHub issues, and the Usage Guide has the setup and usage details.

That’s it for today.

Until the next post!