<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Blog posts by Adnan Zameer</title><link href="http://world.optimizely.com" /><updated>2026-10-02T08:33:26.0000000Z</updated><id>https://world.optimizely.com/blogs/adnan-zameer/</id> <generator uri="http://world.optimizely.com" version="2.0">Optimizely World</generator> <entry><title>From robots.txt to GEO Analytics: A Year On</title><link href="https://www.adnanzameer.com/2026/10/from-robotstxt-to-geo-analytics-a-year-on.html" /><id>&lt;!--excerpt: In September 2025, we updated our robots.txt files to explicitly allow AI crawlers like GPTBot and PerplexityBot. A year later, Optimizely CMS 13 and the Agent Visibility dashboard let us measure what those bots actually do with our content. Here is how the transition from robots.txt permission to GEO measurement and optimization works.--&gt;

In September 2025, I wrote about  updating </id><updated>2026-10-02T08:33:26.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Why Your CMS 12 and CMS 13 Sites Can&#39;t Share a Graph Instance</title><link href="https://www.adnanzameer.com/2026/10/why-cms-12-and-cms-13-cant-share-a-graph-instance.html" /><id>&lt;!--excerpt: Optimizely CMS 13 introduces a breaking change to the Graph schema, meaning CMS 12 and CMS 13 sites can&#39;t share the same Graph instance. This guide walks through both supported migration paths, provisioning a new instance for zero downtime or running a smooth rebuild, so you can plan the Graph migration as part of your CMS 13 upgrade.--&gt;
If you&#39;re planning your Optimizely CMS 13 </id><updated>2026-10-01T11:08:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Optimizely XML Resource Builder: A Visual Studio Extension for Language Resource Files</title><link href="https://www.adnanzameer.com/2026/08/optimizely-xml-resource-builder.html" /><id>&lt;!--excerpt: Optimizely XML Resource Builder is a Visual Studio extension that generates Optimizely language resource XML from content type definitions, helping teams keep editor labels, descriptions, and shared properties in sync with less manual work.--&gt;

Anyone who has worked on a larger Optimizely solution will know the feeling. You add or update a page type, block type, or shared base class,</id><updated>2026-08-13T09:34:42.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Advanced Task Manager Gets a Big Update</title><link href="https://www.adnanzameer.com/2026/07/whats-new-in-advanced-task-manager.html" /><id>&lt;p&gt;One of the things I keep coming back to with Optimizely&#39;s content approval workflow is that it&#39;s solid at the individual level - you know a piece of content needs approving, you click through, done. But the moment you&#39;re managing a site with dozens or hundreds of items in the queue, the interface starts to feel a bit like doing surgery with oven mitts.&lt;/p&gt;

&lt;p&gt;This release is largely the result of that frustration. Each feature below started as something I (or someone using the tool) wanted to do that took too many clicks, too much scrolling, or just wasn&#39;t possible at all. Here&#39;s what changed, and why.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Advanced Filtering&lt;/h2&gt;

&lt;p&gt;Before this update, the only way to narrow down the task list was by language. That&#39;s fine if your queue is short, but not if you&#39;re staring at 200 tasks and trying to find everything that&#39;s a block, or everything from a specific site, or that one page whose name you only half remember.&lt;/p&gt;

&lt;p&gt;There&#39;s now a proper filter bar above the list with four independent dimensions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt; - &lt;em&gt;In Review&lt;/em&gt; (the default) or &lt;em&gt;Ready to Publish&lt;/em&gt;, useful for finding things that are approved but haven&#39;t gone live yet.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt; - narrow to Pages, Blocks, or Assets/Media only.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Site&lt;/strong&gt; - in multi-site setups, limits the list to one site. Hidden on single-site installs.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Content search&lt;/strong&gt; - type a content ID (integer) or part of the name to find a specific item.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every filter combination updates the URL, so you can bookmark a view or send a link to a colleague.&lt;/p&gt;

&lt;p style=&quot;background:#e8f0ff; border-left:3px solid #1a56e8; padding:12px 16px; border-radius:0 4px 4px 0;&quot;&gt;Active filters show up as dismissible badge pills below the filter bar. Each badge removes just that one filter when clicked. A &lt;strong&gt;Clear all&lt;/strong&gt; link removes everything at once.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Select All Across Pages&lt;/h2&gt;

&lt;p&gt;The existing checkbox in the table header selects everything visible on the current page. Which is fine, until you realise there are 12 more pages of results and you need to approve the lot.&lt;/p&gt;

&lt;p&gt;When you check that header checkbox and there are more results than the current page can show, a small banner appears:&lt;/p&gt;

&lt;p style=&quot;background:#e8f0ff; border-left:3px solid #1a56e8; padding:12px 16px; border-radius:0 4px 4px 0;&quot;&gt;&lt;em&gt;All 30 items on this page are selected.&lt;/em&gt; &lt;strong&gt;Select all 412 items matching current filters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clicking that link fetches every matching approval ID across all pages and loads them into the current selection. The approval action then covers the complete set - one click, one comment, done. A &lt;strong&gt;Clear selection&lt;/strong&gt; link sits in the same banner if you want to start over.&lt;/p&gt;

&lt;p&gt;The &quot;all items&quot; fetch respects every active filter, so you&#39;re not accidentally bulk-approving things you didn&#39;t intend to include.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Scheduled Publishing&lt;/h2&gt;

&lt;p&gt;Publishing right after approval is the common path, but it&#39;s not the only one. Launches, campaigns, news embargoes - there are plenty of reasons to approve content today and want it to go live at a specific future moment without someone having to remember to click Publish at 8 AM on a Tuesday.&lt;/p&gt;

&lt;p&gt;When you check the &lt;em&gt;Publish selected content after approval&lt;/em&gt; option in the approval modal, a second checkbox appears: &lt;em&gt;Schedule publishing for a specific date and time.&lt;/em&gt; Enabling it reveals a date/time picker.&lt;/p&gt;

&lt;p&gt;The chosen datetime is passed along with the approval request. Optimizely handles the rest by setting &lt;code&gt;IVersionable.StartPublish&lt;/code&gt; to that value, so the standard CMS scheduled-publish mechanism kicks in with no custom job needed.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Approve Blocks &amp;amp; Media on a Page&lt;/h2&gt;

&lt;p&gt;This is the one I&#39;m most glad made it into this release. Here&#39;s the scenario: a page has gone through its approval sequence and is ready, but it references a dozen blocks and a handful of media files that are all sitting in their own approval queues. The page can&#39;t go live until those are cleared too. Hunting them down individually is tedious.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Approve Page Dependencies&lt;/strong&gt; button in the filter bar opens a modal where you can pick any page in the site and approve all of its pending block and media dependencies in one action.&lt;/p&gt;

&lt;p&gt;Here&#39;s how it works:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Click &lt;strong&gt;Approve Page Dependencies&lt;/strong&gt; in the filter bar.&lt;/li&gt;
  &lt;li&gt;Navigate the &lt;strong&gt;page hierarchy tree&lt;/strong&gt; to find the target page. The tree lazy-loads child pages as you expand nodes. In multi-site setups, each configured site appears as a top-level node.&lt;/li&gt;
  &lt;li&gt;If you know the content ID, type it directly into the number input above the tree instead. Picking from the tree clears the input; typing a number clears the tree selection.&lt;/li&gt;
  &lt;li&gt;Select one or more &lt;strong&gt;language branches&lt;/strong&gt; to process.&lt;/li&gt;
  &lt;li&gt;Optionally add an approval comment and check &lt;strong&gt;Publish approved content&lt;/strong&gt; to publish the dependencies immediately after approval.&lt;/li&gt;
  &lt;li&gt;Click &lt;strong&gt;Approve Dependencies&lt;/strong&gt;. A spinner shows while the request runs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Behind the scenes the system reads every &lt;code&gt;ContentArea&lt;/code&gt; and &lt;code&gt;ContentReference&lt;/code&gt; property on the selected page, collects all referenced blocks and media, and approves any that currently have a pending approval step for the chosen languages. The number of items approved is shown inline, and if anything was approved the task list refreshes automatically after a short pause.&lt;/p&gt;

&lt;p style=&quot;background:#e8f0ff; border-left:3px solid #1a56e8; padding:12px 16px; border-radius:0 4px 4px 0;&quot;&gt;&lt;strong&gt;Note:&lt;/strong&gt; This only approves dependencies - blocks and media that the page references. It does not approve the page itself. That separation is intentional: the page&#39;s own approval workflow stays under normal editorial control.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Task Ordering&lt;/h2&gt;

&lt;p&gt;The task list columns are now sortable. Click a column header to sort ascending, click again to sort descending. You can order by name, content type, task type, submission date, who started the review, or deadline (if you&#39;re using the deadline property).&lt;/p&gt;

&lt;p&gt;It sounds small, but being able to sort by submission date newest-first, or by deadline to see what&#39;s most urgent, changes how you triage a long queue.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;Site Column (Multi-site)&lt;/h2&gt;

&lt;p&gt;If your Optimizely installation runs multiple sites, the task list now shows a &lt;strong&gt;Site&lt;/strong&gt; column alongside each item so you can see at a glance where things belong. On a single-site installation the column stays hidden.&lt;/p&gt;

&lt;p&gt;This pairs naturally with the Site filter: use the column to notice that most of your queue is from one site, then use the filter to focus on it.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2&gt;A note on CMS versions&lt;/h2&gt;

&lt;p&gt;All of the above is available in &lt;strong&gt;version 4.1.0&lt;/strong&gt; on Optimizely CMS 13 / .NET 10, and as &lt;strong&gt;version 3.1.0&lt;/strong&gt; on the CMS 12 branch for teams still on .NET 6. Change Approval support is CMS 12 only for now, since the &lt;code&gt;EPiServer.ChangeApproval&lt;/code&gt; package doesn&#39;t yet have a CMS 13-compatible release.&lt;/p&gt;

&lt;p&gt;To install or update:&lt;/p&gt;

&lt;pre style=&quot;background:#f1f5fb; border:1px solid #dce6f8; border-radius:6px; padding:14px 18px; overflow-x:auto; font-size:14px;&quot;&gt;&lt;code&gt;dotnet add package AdvancedTaskManager&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Source, changelog, and issue tracker are on &lt;a href=&quot;https://github.com/adnanzameer/optimizely-advancedtaskmanager&quot;&gt;GitHub&lt;/a&gt;. If any of these features behave unexpectedly in your setup, or there&#39;s something you&#39;d like to see that isn&#39;t here yet, open an issue - the backlog is public and feature requests are genuinely read.&lt;/p&gt;</id><updated>2026-07-21T14:43:20.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Optimizely DXP: Every Supported Culture, One Searchable Page</title><link href="https://www.adnanzameer.com/2026/07/every-optimizely-dxp-culture-one.html" /><id>&lt;p&gt;Quick one for anyone building multi-language sites on Optimizely DXP. I put together a reference tool listing all 806 supported cultures. More usefully, it shows which ones actually work with Azure Translator&#39;s 1-click auto-translate, and which get full NLP treatment (stemming, tokenization, decompounding) from Optimizely Graph.&lt;/p&gt;
 
&lt;p&gt;If you&#39;ve ever added a new market and then spent twenty minutes digging through docs to figure out whether editors will get auto-translate for that locale, or whether search will actually work well in that language, this is for that exact moment. Search or filter by culture name or code, grab the exact culture code you need for config, and see right away which capabilities you&#39;re getting.&lt;/p&gt;
 
&lt;p&gt;806 cultures. 33 with Azure Translator support. Full Graph NLP coverage mapped out. All in one table.&lt;/p&gt;
 
&lt;p&gt;Check it out here: &lt;a href=&quot;https://www.adnanzameer.com/p/optimizely-dxp-supported-cultures.html&quot;&gt;Optimizely DXP – Supported Cultures / Languages&lt;/a&gt;&lt;/p&gt;
 </id><updated>2026-07-10T13:22:20.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>OpenAI-Driven AI Assistant for TinyMCE in Optimizely CMS 12</title><link href="https://www.adnanzameer.com/2026/03/openai-driven-ai-assistant-for-tinymce.html" /><id>&lt;p&gt;The &lt;b&gt;&lt;a href=&quot;https://nuget.optimizely.com/packages/a2z.optimizely.tiny.ai/&quot; target=&quot;_blank&quot;&gt;Tiny.AI&lt;/a&gt;&lt;/b&gt; add-on enhances Optimizely CMS 12 by seamlessly integrating OpenAI directly into the TinyMCE editor. It empowers editors to rewrite, improve, summarize, expand, or translate selected content without leaving the CMS. Instead of copying content into external AI tools and risking formatting issues, Tiny.AI processes HTML safely and returns clean, CMS-ready output.&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2026/03/openai-driven-ai-assistant-for-tinymce.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2026-03-03T16:41:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Advanced Form Submissions for Optimizely CMS 12</title><link href="https://www.adnanzameer.com/2026/02/advanced-form-submissions-for.html" /><id> &lt;p&gt; Managing form submissions in enterprise Optimizely CMS installations can quickly become inefficient. While the default Optimizely Forms submission view works, it lacks flexibility, personalization, and advanced management tools. &lt;/p&gt;
&lt;a href=&quot;https://www.adnanzameer.com/2026/02/advanced-form-submissions-for.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2026-02-12T13:45:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Master Language Switcher for Optimizely CMS 12</title><link href="https://www.adnanzameer.com/2025/09/master-language-switcher-for-optimizely.html" /><id>&lt;p&gt;
Managing multiple languages in &lt;strong&gt;Optimizely CMS 12&lt;/strong&gt; can sometimes be challenging — especially when you need to promote a new language branch to be the &lt;em&gt;master language&lt;/em&gt;.  
The &lt;strong&gt;Master Language Switcher&lt;/strong&gt; is a new admin tool that makes this process faster and safer by letting you &lt;strong&gt;switch or convert master languages&lt;/strong&gt; for pages, blocks, and media directly at the database level.&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2025/09/master-language-switcher-for-optimizely.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2025-09-24T12:58:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Preview Unpublished Pages and Blocks on the Frontend (Optimizely CMS 12)</title><link href="https://www.adnanzameer.com/2025/09/preview-unpublished-pages-and-blocks-on.html" /><id>&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;In my &lt;a href=&quot;https://www.adnanzameer.com/2025/09/how-to-show-unpublished-blocks-in-page.html&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt;, I explained how to customize the ContentArea rendering pipeline in Optimizely CMS 12 so editors can see unpublished block content while previewing pages in the CMS.&lt;/p&gt;
&lt;p&gt;That approach works great inside the CMS UI (Edit/Preview mode). But what if you want to enable the same functionality on the &lt;strong&gt;front-end site&lt;/strong&gt;, using a simple query string flag?&lt;/p&gt;
&lt;p&gt;That’s where the &lt;code&gt;?showdrafts=true&lt;/code&gt; parameter comes in.&lt;/p&gt;
  &lt;a href=&quot;https://www.adnanzameer.com/2025/09/preview-unpublished-pages-and-blocks-on.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2025-09-04T09:36:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Showing Unpublished Block Status in Optimizely CMS 12 ContentArea</title><link href="https://www.adnanzameer.com/2025/09/showing-unpublished-block-status-in.html" /><id>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;One of the most common editor complaints in Optimizely CMS is that it’s not obvious when a &lt;strong&gt;block inside a ContentArea&lt;/strong&gt; has unpublished changes. By default, editors can only see those drafts if they preview the block itself (not the page that contains it). This leads to confusion, because the page looks “finished” but actually contains hidden drafts.&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2025/09/showing-unpublished-block-status-in.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2025-09-02T15:46:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>How to Show Unpublished Blocks in Page Preview (Optimizely CMS 12)</title><link href="https://www.adnanzameer.com/2025/09/how-to-show-unpublished-blocks-in-page.html" /><id>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;
In this post, we’ll look at why Draft Blocks don’t show in Page Preview by default, and I&amp;#39;ll show you a clean, drop-in solution to fix that. 
The result? Editors get a more accurate &lt;b&gt;“what you see is what you’ll publish”&lt;/b&gt; experience - no more hidden draft blocks.
&lt;/p&gt;
&lt;a href=&quot;https://www.adnanzameer.com/2025/09/how-to-show-unpublished-blocks-in-page.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2025-09-01T17:41:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Removing a Segment from the URL in Optimizely CMS 12 using Partial Routing</title><link href="https://www.adnanzameer.com/2025/03/removing-segment-from-url-in-optimizely.html" /><id>&lt;h3 data-pm-slice=&quot;1 3 []&quot;&gt;&lt;strong&gt;Problem Statement&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;In Optimizely CMS 12, dynamically generated pages inherit URL segments from their container pages. However, in certain cases, some pages are renamed, leading to undesired URL structures. The three primary challenges faced in this scenario are:&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2025/03/removing-segment-from-url-in-optimizely.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2025-03-14T16:36:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Optimizely Marketing Automation Connector for MailChimp</title><link href="https://www.adnanzameer.com/2024/04/optimizely-marketing-automation.html" /><id>&lt;p&gt;The A2Z.EPiServer.MarketingAutomationIntegration.Mailchimp add-on enhances Optimizely Forms by seamlessly integrating with Mailchimp, catering to both developers and marketers. It moves beyond the traditional use of Mailchimp&amp;#39;s embedded forms for email list collection, enabling direct connection and data posting to a Mailchimp list via its API. This integration simplifies email marketing automation within Optimizely, offering a streamlined approach to audience engagement.&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2024/04/optimizely-marketing-automation.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2024-04-19T15:28:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Visitor Groups Usage Report For Optimizely CMS 12</title><link href="https://www.adnanzameer.com/2024/04/visitor-groups-usage-report-for.html" /><id>&lt;p&gt;This add-on offers detailed information on how visitor groups are used and how effective they are within Optimizely CMS. Editors can monitor and evaluate the interactions of various visitor groups with site content, leading to better decision-making and more focused content strategies.&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2024/04/visitor-groups-usage-report-for.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2024-04-18T14:57:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Plugin for Identifying and Bulk Deleting Orphaned Missing Properties in Optimizely</title><link href="https://www.adnanzameer.com/2024/04/plugin-for-identifying-and-bulk.html" /><id>&lt;p&gt;I am aware that the Optimizely World community has extensively discussed this topic, with numerous solutions and code snippets available to help administrators address this issue. Despite this wealth of resources, I&amp;#39;ve noticed a lack of a dedicated NuGet package specifically aimed at tackling this problem, especially for CMS 12 on the Optimizely NuGet feed. Here&amp;#39;s my perspective on the issue and my contribution: an administrative plugin for Optimizely CMS 12.&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2024/04/plugin-for-identifying-and-bulk.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2024-04-11T15:34:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Streamlining Content Translation in Optimizely CMS with Google Translate</title><link href="https://www.adnanzameer.com/2024/01/streamlining-content-translation-in.html" /><id>&lt;p&gt;The &lt;a href=&quot;https://github.com/adnanzameer/A2Z.Episerver.Labs.LanguageManager.GoogleTranslate&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;A2Z.Episerver.Labs.LanguageManager.GoogleTranslate&lt;/b&gt;&lt;/a&gt; extension is a valuable resource for Optimizely CMS editors seeking an alternative to the built-in Azure Cognitive Services Translator. Its main purpose is to simplify and enhance the content translation process, making it more efficient and accessible. By integrating with EPiServer.Labs.LanguageManager, it harnesses the capabilities of Google Cloud Translation. This integration is through &lt;b&gt;Google.Cloud.Translation.V2&lt;/b&gt; NuGet package, enables seamless, automated translations directly within the CMS environment, enhancing the efficiency and ease of managing multilingual content.&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2024/01/streamlining-content-translation-in.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2024-01-23T12:39:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Improving Alt Text for Images within TinyMCE in Optimizley CMS</title><link href="https://www.adnanzameer.com/2024/01/improving-alt-text-for-images-within.html" /><id>&lt;h2&gt;Introduction:&lt;/h2&gt;
&lt;p&gt;Content editors often face a tricky challenge when dealing with images within TinyMCE in Optimizley CMS. In this post, we&amp;#39;ll explore the default options, the hurdles, and a straightforward solution to make our content more inclusive for everyone.&lt;/p&gt;
&lt;a href=&quot;https://www.adnanzameer.com/2024/01/improving-alt-text-for-images-within.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2024-01-19T16:13:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Maximizing SEO Potential with SEOBOOST for Optimizely 12</title><link href="https://www.adnanzameer.com/2024/01/maximizing-seo-potential-with-seoboost.html" /><id>&lt;p&gt;&lt;a href=&quot;https://github.com/adnanzameer/optimizely-seoboost&quot;&gt;SEOBOOST for Optimizely 12&lt;/a&gt; has recently undergone a significant upgrade tailored for SEO enthusiasts. This enhanced tool comes with a comprehensive set of features and an updated codebase supporting .NET Core 6. Now, developers and editors have the power to shape and control their website&amp;#39;s SEO journey.&lt;/p&gt;&lt;a href=&quot;https://www.adnanzameer.com/2024/01/maximizing-seo-potential-with-seoboost.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2024-01-15T18:10:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Upgrading to Advanced Task Manager for Optimizely CMS 12</title><link href="https://www.adnanzameer.com/2024/01/upgrading-to-advanced-task-manager-for.html" /><id>&lt;div class=&quot;bodyDiv&quot;&gt;
&lt;p&gt;I am thrilled to announce the release of &lt;strong&gt;&lt;a href=&quot;https://github.com/adnanzameer/optimizely-advancedtaskmanager.&quot; target=&quot;_blank&quot;&gt;Advanced Task Manager Version 3&lt;/a&gt;&lt;/strong&gt; for Optimizely CMS 12, a
   major upgrade from the previous version designed for CMS 11 and .NET Framework 4.7.1. This release marks a
   significant step forward, leveraging the power of CMS 12 and .NET Core 6 to provide an enhanced and efficient
   experience for CMS editors.
&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Advanced Task Manager for Optimizely&lt;/strong&gt; is a tool designed to empower CMS editors
   with advanced oversight of administration tasks related to Awaiting Review in Content Approval and Change
   Approval processes.
&lt;/p&gt;
&lt;h2&gt;What&#39;s New&lt;/h2&gt;
&lt;h3&gt;1. Migration to .NET Core 6 and CMS 12&lt;/h3&gt;
&lt;p&gt;Advanced Task Manager has undergone a complete rewrite from the ground up, embracing the latest technologies. The
   tool is now compatible with .NET Core 6 and Optimizely CMS 12, ensuring optimal performance and compatibility
   with the latest platform advancements.
&lt;/p&gt;
&lt;h3&gt;2. New User Interface&lt;/h3&gt;
&lt;p&gt;The tool features a revamped user interface that not only provides a modern and intuitive experience but also
   enhances the overall usability of the Advanced Task Manager. Editors will find it easier and more efficient to
   manage tasks within the CMS.
&lt;/p&gt;
&lt;h3&gt;3. Bug Fixes and Enhancements&lt;/h3&gt;
&lt;p&gt;Version 3 includes several bug fixes and enhancements based on valuable feedback from users of the previous version. I&#39;ve addressed issues and fine-tuned the tool to deliver a smoother and more reliable user experience.&lt;/p&gt;
&lt;h3&gt;4. Optimized for Latest Optimizely API Requirements &lt;/h3&gt;
&lt;p&gt;The entire codebase of Advanced Task Manager has been refactored to align with the latest Optimizely API requirements. This ensures seamless integration with Optimizely CMS 12, providing editors with a robust and reliable tool for their daily tasks.&lt;/p&gt;
&lt;h2&gt;Installation and Configuration&lt;/h2&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;To install Advanced Task Manager version 3, simply add the NuGet package using the Optimizely NuGet package
   manager:
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dotnet add package AdvancedTaskManager&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Configuration&lt;/h3&gt;

&lt;p&gt;Configuration is made easy with the flexibility to adjust settings either in the &lt;code&gt;Startup.cs&lt;/code&gt; file or
   through the &lt;code&gt;appsettings.json&lt;/code&gt; file. Here&#39;s an example with available configurations:
&lt;/p&gt;

&lt;pre class=&quot;brush:csharp&quot;&gt;
public void ConfigureServices(IServiceCollection services)
{
    
    services.AddAdvancedTaskManager(o =&amp;gt;
    {
        o.DeleteChangeApprovalTasks = true; //Default true
        o.PageSize = 10; //Default 30
        o.AddContentApprovalDeadlineProperty = true; //Default false
        o.DeleteContentApprovalDeadlineProperty = true; //Default false
        o.WarningDays = 4; //Default 4;
        o.DateTimeFormat = &quot;yyyy-MM-dd HH:mm&quot;; //Default &quot;yyyy-MM-dd HH:mm&quot;;
        o.DateTimeFormatUserFriendly = &quot;yyyy-MM-dd HH:mm&quot;; //Default &quot;MMM dd, yyyy, h:mm:ss tt&quot;;
    });

    OR

    services.AddAdvancedTaskManager();
    
...
}
&lt;/pre&gt;

OR

&lt;pre class=&quot;brush:xml&quot;&gt;
&quot;AdvancedTaskManager&quot;: {
    &quot;DeleteChangeApprovalTasks&quot;:  true, 
    &quot;PageSize&quot;: 6,
    &quot;AddContentApprovalDeadlineProperty&quot;:  false, 
    &quot;DeleteContentApprovalDeadlineProperty&quot;: false,
    &quot;WarningDays&quot;:  4, 
    &quot;DateTimeFormat&quot;: &quot;yyyy-MM-dd HH:mm&quot;,    
    &quot;DateTimeFormatUserFriendly&quot;: &quot;MMM dd, yyyy, h:mm:ss tt&quot;
}
&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;

The settings specified in the &lt;code&gt;appsettings.json&lt;/code&gt; file will take precedence over any configurations defined in the Startup.&lt;/p&gt;&lt;h3&gt;Integrating Advanced Task Manager into the CMS&lt;/h3&gt;
&lt;p&gt;The solution seamlessly integrates with Optimizely CMS, automatically adding administration pages to the CMS Admin menu titled &lt;b&gt;Adv. Task Manager&lt;/b&gt;. The implementation of the IMenuProvider ensures the effortless inclusion of the Advanced Task Manager pages in the CMS Admin menu.&lt;/p&gt;

&lt;h3&gt;Restricting Access to the Admin UI&lt;/h3&gt;
&lt;p&gt;Access to the Admin UI is, by default, limited to users with the administrator&#39;s role. However, for additional flexibility, access to the &lt;b&gt;Adv. Task Manager&lt;/b&gt; menu can be granted to specific roles by configuring the authorization policy during registration.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;pre class=&quot;brush:csharp&quot;&gt;services.AddAdvancedTaskManager(o =&amp;gt; { },
    policy =&amp;gt;
    {
        policy.RequireRole(&quot;MyRole&quot;);
    });
&lt;/pre&gt;

&lt;h3&gt;Overview of Features&lt;/h3&gt;

&lt;h4&gt;1. Approve Entire Approval Sequence (Content Approval Only)&lt;/h4&gt;
&lt;p&gt;The tool prompts editors to approve the entire Content Approval Sequence for single or multiple contents. A comment in the comment field is mandatory for enhanced communication and is already prefilled to make editors&#39; lives easier.&lt;/p&gt;


&lt;h4&gt;2. Publish Content After Approval&lt;/h4&gt;
&lt;p&gt;Editors with publishing rights for content approval can now choose to publish selected content after approval, either in bulk or for individual tasks.&lt;/p&gt;

&lt;h4&gt;3. Deadline Field for Content Approval Sequence (Optional)&lt;/h4&gt;
&lt;p&gt;A new deadline field has been introduced for content approval, allowing editors to assign priority to content with a specified deadline. This ensures that approvers are informed about the urgency before approval.&lt;/p&gt;

&lt;h4&gt;4. User Notifications Linked to the Task&lt;/h4&gt;
&lt;p&gt;The tool now facilitates reading user notifications linked to the task, providing editors with deeper insights and better control over tasks and notifications.&lt;/p&gt;

&lt;h4&gt;5. Task Ordering&lt;/h4&gt;
&lt;p&gt;Editors now have the option to sort through all tasks with the status Awaiting Review in various columns, providing a more organized view of tasks.&lt;/p&gt;

&lt;h4&gt;6. Information for Change Approval Tasks&lt;/h4&gt;
&lt;p&gt;Change Approval tasks now display detailed information in an accordion-style table row, offering a clearer view of security setting changes, content movement, language setting changes, and expiration date setting changes.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Advanced Task Manager Version 3 for Optimizely CMS 12 represents a leap forward in providing editors with enhanced oversight and control over Content Approval and Change Approval processes. The new features, improved user interface, and compatibility with the latest technologies make it a valuable tool for optimizing workflows within Optimizely CMS.&lt;/p&gt;&lt;p&gt;The comprehensive documentation is available on the project&#39;s GitHub page &lt;b&gt;&lt;a href=&quot;https://github.com/adnanzameer/optimizely-advancedtaskmanager&quot;&gt;https://github.com/adnanzameer/optimizely-advancedtaskmanager.&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;</id><updated>2024-01-03T13:48:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Quick Continuous Integration/Deployment (CI/CD) workflow for Episerver DXP using Azure DevOps</title><link href="https://www.adnanzameer.com/2021/02/quick-continuous-integrationdeployment.html" /><id>&lt;div class=&quot;bodyDiv&quot;&gt;&lt;p&gt;There are a lot of questions on Episerver World on how to quickly deploy the code on Episerver DXP or more specifically how to set up Continuous Integration/Deployment (CI/CD) workflow&#160;for Episerver DXP.&#160;&lt;/p&gt;&lt;/div&gt;&lt;a href=&quot;https://www.adnanzameer.com/2021/02/quick-continuous-integrationdeployment.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2021-02-23T12:59:00.0000000Z</updated><summary type="html">Blog post</summary></entry></feed>