<?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-03-03T16:41:00.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>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>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> <entry><title>Simple Ways to Improve Episerver Websites Security</title><link href="https://www.adnanzameer.com/2021/02/simple-ways-to-improve-episerver.html" /><id>&lt;div class=&quot;bodyDiv&quot;&gt;   &lt;p&gt;In my previous post,&#160;&lt;a href=&quot;https://www.adnanzameer.com/2021/02/basic-episerver-coding-best-practices.html&quot; target=&quot;_blank&quot;&gt;Basic Episerver Coding Best Practices&lt;/a&gt; I briefly mentioned the website security.&#160; I thought I could go a little bit in details about basic security measure you can take in your ASP.NET website or in particular Episerver website.&#160;&lt;/p&gt;   &lt;p&gt;Each project comes with its own set of security requirements but I usually start from the following list to cover the basics. Keep in mind the list below are just suggestions and you can always opt-out or include other measures to quench your thirst for your website security.&#160;&lt;/p&gt;   &lt;span&gt;      &lt;/span&gt;&lt;/div&gt;&lt;a href=&quot;https://www.adnanzameer.com/2021/02/simple-ways-to-improve-episerver.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2021-02-15T11:04:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Basic Episerver Coding Best Practices</title><link href="http://www.adnanzameer.com/2021/02/basic-episerver-coding-best-practices.html" /><id>&lt;h2 style=&quot;text-align: left;&quot;&gt;A. General Coding Conventions&lt;/h2&gt;&lt;div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Compare strings with “==” operator&amp;nbsp;&lt;/h3&gt;&lt;div&gt;The standard C# coding practice advises that string comparison should be done with string.Equals() method, because “==” operator compares strings base on reference equality, and that could lead to unexpected behaviours.&amp;nbsp;&lt;/div&gt;&lt;div&gt;The details can be found here: &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/cc165449.aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/cc165449.aspx&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Use string.Equals() method.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Remove Unused Using Statements&lt;/h3&gt;&lt;div&gt;&amp;nbsp;Remove all unused using statements.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Simplify Names&lt;/h3&gt;&lt;div&gt;Names should be simplified (for example change String -&amp;gt; string, Boolean -&amp;gt; bool, remove leading namespace if the namespace is already declared in using statement).&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;The naming convention for methods, variables, and parameters&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Check all class to make sure the naming follows C# convention. Method and class names should follow Pascal Case, variable and parameter names should follow the Camel Case. Consider changing them for better readability and maintainability.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;High Usage of String Concatenation&lt;/h3&gt;&lt;div&gt;The high number of string concatenations generally leads to poor memory usage because the string is immutable. Every time a string is modified, a new instance is created in the memory and that will lead to too many call to memory allocation. To optimize memory usage on string operations, make use of StringBuilder class if there are more than a few concatenations needed in each code block.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Move hardcoded strings to constants&lt;/h3&gt;&lt;div&gt;Consider moving hardcoded strings to constant classes or resource files to avoid duplication and centralize their management. Strings to process the program flow should be moved to constant, while strings used to display messages should be moved to resource files to enable localization.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Hardcoded service’s URL and sensitive information&amp;nbsp;&lt;/h3&gt;&lt;div&gt;There might be some places in the code which have hardcoded strings to store sensitive information like username, password, encryption key and the service’s URL. This information should be moved to the application settings file (web.config) instead.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Move business Logic from Views&amp;nbsp;&lt;/h3&gt;&lt;div&gt;In the principal domain, logic should go into the model or view model and application logic into the controller. Business logic in views is against MVC principal and it has serious performance implications.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Empty files &amp;amp; classes&amp;nbsp;&lt;/h3&gt;&lt;div&gt;&amp;nbsp;Empty files &amp;amp; classes (if any) should be removed for better maintainability.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Unused classes &amp;amp; methods&amp;nbsp;&lt;/h3&gt;&lt;div&gt;Unused classes &amp;amp; methods (if any) should be removed for better maintainability.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Potential code quality issues&amp;nbsp;&lt;/h3&gt;&lt;div&gt;Special attention needs to be given for code quality issue witch regards to following&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&amp;nbsp;Variables with possible ‘System.NullReferenceException’.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;Uses empty general catch class suppresses any errors&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;Replace with &#39;String.IsNullOrEmpty&#39;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;String formatting method problems&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Unused properties&lt;/h3&gt;&lt;div&gt;Remove unused properties form the blockTypes pageTypes e.t.c&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Move static methods to extension classes&lt;/h3&gt;&lt;div&gt;Static methods which operate on some type of data and placed across the code files and the methods are not related to the business logic of their classes should be organized as extension methods instead.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Use View State to store large information&lt;/h3&gt;&lt;div&gt;Avoid using view state. Sometimes the website makes use of &lt;a href=&quot;http://ASP.NET&quot; target=&quot;_blank&quot;&gt;ASP.NET&lt;/a&gt; View State to store a certain amount of information, sometimes include large objects such as data table. Objects stored in View State are rendered to a hidden field in the HTML output of the web page, and this increases the size of the request. In case the View State gets too large, it could be blocked by proxy servers.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Implement IDisposable&lt;/h3&gt;&lt;div&gt;Use where required.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;JavaScript and CSS code are embedded in razor views (.cshtml)&amp;nbsp;&lt;/h3&gt;&lt;div&gt;Some performance gains can be achieved by minifying the embedded JavaScript and CSS inside the razor views.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;B. Episerver Best Practices&lt;/h2&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Hide information not used frequently by editors&amp;nbsp;&lt;/h3&gt;&lt;div&gt;To create pages of type “500 page”, “400 page” and so on is not the daily work for editors. It should be better to just show them to a smaller specific group that is responsible to set up the site. This can be done by restricting the access to create that page type to a certain group of editors or administrators. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Obsolete EPiServer Class/Methods&lt;/h3&gt;&lt;div&gt;In each major version, old obsolete methods are removed permanently to make sure that the API is kept clean and usable over time, so even if you can postpone fixing warning messages, it is good practice to make sure all warning messages are fixed before upgrading to a major version.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Memory leak due to constructing new DataFactory class&lt;/h3&gt;&lt;div&gt;DataFactory is a singleton class (which mean one instance for entire application), and it should not be constructed. In fact, EPiServer coding practice does not advice developer to use DataFactory directly, and the developer should use an injected instance of IContentRepository instead.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;EPiServer FindPagesWithCriteria problem&lt;/h3&gt;&lt;div&gt;Due to its lack of developer usability and relatively slow performance it&#39;s a method many developers love to hate. Under the hood, FindPagesWithCriteria builds a bunch of SQL statements that query the database directly. There is No caching when you use this. When you use FindPagesWithCriteria, you need to be careful that you don&#39;t overuse it or better avoid using FindPageWithCriteria altogether. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Enable ContentOutputCache&lt;/h3&gt;&lt;div&gt;Caching can dramatically increase the performance of your website. [ContentOutputCache] you can set a much higher duration for your output cache. The cache will be invalidated as soon as an editor change the page and the visitor will see the updated information. ContentOutputCache attribute is commented out in Page controllers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Use inline Blocks instead of custom properties&lt;/h3&gt;&lt;div&gt;Its easier to manage and localize blocks instead of custom properties. Create inline Blocks e.g for CTA any settings &lt;b&gt;AvailableInEditMode = false&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Overuse of ServiceLocator&lt;/h3&gt;&lt;div&gt;&amp;nbsp;To create objects with the service locator cost more than a normal creation with the “new” operator. So, performance gains can be archived if the ServiceLocator is just used once for a page view.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/div&gt; &lt;pre class=&quot;brush:csharp&quot;&gt;  &lt;br /&gt;public class DummyBlockController : BlockController&amp;lt;DummyBlock&amp;gt;&lt;br /&gt;{&lt;br /&gt;    public override ActionResult Index(DummyBlock currentBlock)&lt;br /&gt;    {&lt;br /&gt;        var startPage = ServiceLocator.Current.GetInstance&amp;lt;IContentRepository&amp;gt;().Get&amp;lt;StartPage&amp;gt;(ContentReference.Stat…&lt;br /&gt;        var dummySites = ServiceLocator.Current.GetInstance&amp;lt;IContentRepository&amp;gt;().GetChildren&amp;lt;ContentPage&amp;gt;(startPage…&lt;br /&gt;…&lt;br /&gt;        foreach (var site in dummySites)&lt;br /&gt;        {&lt;br /&gt;            var careerPages = ServiceLocator.Current.GetInstance&amp;lt;IContentRepository&amp;gt;().GetChildren&amp;lt;SamplePage&amp;gt;(site.C…&lt;br /&gt;  &lt;/pre&gt;    &lt;h3 style=&quot;text-align: left;&quot;&gt;The Problems with Service Locator&lt;/h3&gt;&lt;div&gt;Using the snippet of code above is all very good but, in a project, you might have multiple files that need to call IContentRepository. Having this code duplicated also means you will need to write the same tedious set-up code in your unit tests everywhere.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;EPiServer also provides an alternative way of injecting dependencies into your code, via property injection and constructor injection. Injected&amp;lt;&amp;gt; uses property injection via the IoC container to give you access to your dependencies.&lt;/div&gt;&lt;div&gt;An example of how to use &lt;b&gt;Injected&amp;lt;&amp;gt; &lt;/b&gt;can be seen below:&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;brush:csharp&quot;&gt;  &lt;br /&gt;  public class DummyExample&lt;br /&gt;{&lt;br /&gt;	internal Injected&amp;lt;IInterface&amp;gt; interface;&lt;br /&gt;	public DummyExample()&lt;br /&gt;	{&lt;br /&gt;		var implmentation = interface.Service;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;  &lt;/pre&gt;      Injected is useful when you need to implement from things like ISelectionFactory or an InitializationModule. If you try to use constructor injection in these types of files, MVC will complain about not having a parameterless constructor.&amp;nbsp;&lt;div&gt;&lt;iinterface&gt;&lt;br /&gt;&lt;/iinterface&gt;&lt;/div&gt;&lt;div&gt;&lt;iinterface&gt;EPiServer supports constructor injection for controllers. It is possible to inject dependent objects in your EPiServer controllers if you have &lt;a href=&quot;/link/8df6f239e3fa44b99f475adb8e5cf26c.aspx&quot; target=&quot;_blank&quot;&gt;configured it properly&lt;/a&gt; - created MVC dependency resolver.&amp;nbsp;&lt;/iinterface&gt;&lt;/div&gt;&lt;div&gt;&lt;iinterface&gt;&lt;br /&gt;&lt;/iinterface&gt;&lt;/div&gt;&lt;div&gt;Try to minimize the construction of objects when using the ServiceLocator or better use Injected or constructer injection.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Implement EPiServer Schedule Jobs Stop Signal&amp;nbsp;&lt;/h3&gt;&lt;div&gt;Stop signal in EPiServer Schedule Jobs should be periodically checked (in a loop for example) so that the execution can be terminated a short time after if the stop signal has been received.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Periodically check the stop signal in the longest-running code block (the loop). Stop the execution if the stop signal has been received.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Overuse of PageTypes&lt;/h3&gt;&lt;div&gt;Overuse of PageTypes in the system, resulting in code duplication. The ideas of using block types in EPiServer to reduce code duplication and rely on fewer page types.  If multiple pages serve the same layout but different content, there should be one-page type and different blocks should be created to serve different content.&lt;/div&gt;&lt;div&gt;Use abstract class if there is a need for same looking multiple PageTypes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Unused PageTypes&lt;/h3&gt;&lt;div&gt;It is important to keep the CMS clean and it is recommended to clean up the system from the unused page and block types.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;EPiServer Translation&amp;nbsp;&lt;/h3&gt;&lt;div&gt;EPiServer platform provides the flexibility of translating the hard-coded strings to multiple languages with resource XML files. Currently, the content type names, property names, descriptions and label texts on the pages are hardcoded with fixed strings. The values should be taken from the resource XML files instead, as this would better support a global website with multiple languages.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Overuse of Block Controllers&lt;/h3&gt;&lt;div&gt;Simple blocks without processing logic inside their controllers should not have dedicated controllers as this will degrade the performance.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Avoid dynamic properties.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Register UIDescriptor, where you disable on-page edit and preview views&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;For settings kind of pages, ensure that it will not have a template&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Use Episerver’s Object Cache instead of .NET’s built-in cache&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;For property (field) names in code, use standard .NET PascalCase. Make sure to set a friendly Display Name and Description&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Set default values for Content Types’ Properties (if known)&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;For media properties, use the ContentReference type and the appropriate UIHint&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Use the PropertyFor method to render properties (fields) in ContentType views&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Use Container Pages for folder nodes, without presentation (if required) use IContainerPage.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;C. EPiServer Best Practices for Cloud Development &amp;amp; Deployment&lt;/h2&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Replace log4net with EPiServer.Logging&amp;nbsp;&lt;/h3&gt;&lt;div&gt;Episerver DXC redirects all Episerver logs into .NET Diagnostic Trace if the code uses the Episerver logging abstraction &lt;a href=&quot;/link/55fe410f4f65482cab72fb59d47c7561.aspx?documentId=cms/10/8EBB557B&quot; target=&quot;_blank&quot;&gt;EPiServer.Logging.LogManager.&lt;/a&gt; As the application is using log4net and deploying to DXC, replace log4net with EPiServer.Logging.&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Reference:&amp;nbsp;&amp;nbsp;&lt;/h4&gt;&lt;div&gt;&lt;a href=&quot;https://world.episerver.com/digital-experience-cloud-service/development-considerations/&#160;&quot; target=&quot;_blank&quot;&gt;https://world.episerver.com/digital-experience-cloud-service/development-considerations/&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://world.episerver.com/documentation/developer-guides/CMS/logging/logging-into--net-diagnostics-trace/&#160;&quot; target=&quot;_blank&quot;&gt;https://world.episerver.com/documentation/developer-guides/CMS/logging/logging-into--net-diagnostics-trace/&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Keep a look at system requirements&lt;/h3&gt;&lt;div&gt;Some of the EPiServer Add-ons, features or components are not compatible with Microsoft Azure, and it is recommended to keep a look at the system requirements of EPiServer Azure deployment to select appropriate add-ons, components or to choose a suitable approach of development.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Take a look at EPiServer Azure (DXC) system requirements, remove incompatible add-ons, features and components. The system requirements are available at this reference link: &lt;a href=&quot;http://world.episerver.com/digital-experience-cloud-service/requirements/&#160;&quot; target=&quot;_blank&quot;&gt;http://world.episerver.com/digital-experience-cloud-service/requirements/&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Avoid code that depends on specific on-premise resources&amp;nbsp;&lt;/h3&gt;&lt;div&gt;&amp;nbsp;Code that was developed to run on a cloud website should not have any specific dependency on the on-premise resources, such as SMTP server, writing to local files and folders. Session state should be avoided, and if it is impossible to avoid the use of session state, Azure Session Affinity or other optimized session state providers for Azure should be considered.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Try to avoid any code that depends on specific on-premise resources, consider alternative options for them in Azure environment (for example, emails can be sent from SendGrid service, any logic which writes to the local files/folders should now use Azure Blob Storage instead)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Security&amp;nbsp;&lt;/h3&gt;&lt;div&gt;Read the following documentation for the level of security EPiServer provides &lt;a href=&quot;/link/87efea613e1d4e0392a8287250315168.aspx&quot;&gt;https://world.episerver.com/documentation/developer-guides/CMS/security/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;It is recommended some level of protection should be there in the website against click-jacking.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Install and configure the NuGet package called NWebsec (&lt;a href=&quot;https://www.nuget.org/packages/NWebsec&quot;&gt;https://www.nuget.org/packages/NWebsec&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</id><updated>2021-02-08T11:28:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Basic Episerver Coding Best Practices</title><link href="https://www.adnanzameer.com/2021/02/basic-episerver-coding-best-practices.html" /><id>&lt;div class=&quot;bodyDiv&quot;&gt;This is my first post on Episerver development best practices. In this one, I&amp;#39;ll present the best practices that should be followed while working with Episerver - ASP.Net MVC framework.&#160;&lt;div&gt;Here are some best practices you should always have in mind:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href=&quot;https://www.adnanzameer.com/2021/02/basic-episerver-coding-best-practices.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2021-02-08T11:28:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Advanced Task Manager: Gadget for Administration of Awaiting Review Tasks in Episerver</title><link href="http://www.adnanzameer.com/2020/01/advanced-task-manager-gadget-for.html" /><id>&lt;div class=&quot;bodyDiv&quot;&gt;Currently, the User notification and Tasks (Awaiting Review) are disconnected and provide very basic information to the editors.&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;Tasks pane&quot; src=&quot;https://github.com/adnanzameer/AdvancedTaskManager/raw/master/assets/docsimages/image001.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;User notification&quot; src=&quot;https://github.com/adnanzameer/AdvancedTaskManager/raw/master/assets/docsimages/image003.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;The idea behind this project is two-fold. The first purpose is to build a more versatile Content Approval Sequence (Awaiting Review) task management gadget to extend the information available to the editors. The second purpose is to combine user notifications with tasks and empower Content Approvers to act on their tasks within a single interface.&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;http://www.adnanzameer.com/2020/01/advanced-task-manager-gadget-for.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2020-01-14T09:55:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Advanced Task Manager: Gadget for Administration of Awaiting Review Tasks in Episerver</title><link href="http://www.adnanzameer.com/2020/01/advanced-task-manager-gadget-for.html" /><id>&lt;div class=&quot;bodyDiv&quot;&gt;Currently, the User notification and Tasks (Awaiting Review) are disconnected and provide very basic information to the editors.&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;Tasks pane&quot; src=&quot;https://github.com/adnanzameer/AdvancedTaskManager/raw/master/assets/docsimages/image001.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;User notification&quot; src=&quot;https://github.com/adnanzameer/AdvancedTaskManager/raw/master/assets/docsimages/image003.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;The idea behind this project is two-fold. The first purpose is to build a more versatile Content Approval Sequence (Awaiting Review) task management gadget to extend the information available to the editors. The second purpose is to combine user notifications with tasks and empower Content Approvers to act on their tasks within a single interface.&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;http://www.adnanzameer.com/2020/01/advanced-task-manager-gadget-for.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2020-01-14T09:55:00.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Advanced Task Manager: Gadget for Administration of Awaiting Review Tasks in Episerver</title><link href="https://www.adnanzameer.com/2020/01/advanced-task-manager-gadget-for.html" /><id>&lt;div class=&quot;bodyDiv&quot;&gt;Currently, the User notification and Tasks (Awaiting Review) are disconnected and provide very basic information to the editors.&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;Tasks pane&quot; src=&quot;https://github.com/adnanzameer/AdvancedTaskManager/raw/master/assets/docsimages/image001.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt=&quot;User notification&quot; src=&quot;https://github.com/adnanzameer/AdvancedTaskManager/raw/master/assets/docsimages/image003.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;The idea behind this project is two-fold. The first purpose is to build a more versatile Approval Sequence task management gadget (for Content &amp;amp; Change Awaiting Review tasks) to extend the information available to the editors. The second purpose is to combine user notifications with tasks and empower Approvers to act on their tasks within a single interface&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;https://www.adnanzameer.com/2020/01/advanced-task-manager-gadget-for.html#more&quot;&gt;Read more&lt;/a&gt;</id><updated>2020-01-14T09:55:00.0000000Z</updated><summary type="html">Blog post</summary></entry></feed>