<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Blog posts by Szołkowski Blog</title><link href="https://world.optimizely.com/blogs/szokowski-blog/" /><updated>2026-10-21T11:30:30.0000000Z</updated><id>https://world.optimizely.com/blogs/szokowski-blog/</id><generator uri="https://world.optimizely.com/blogs/szokowski-blog/" version="2.0">Optimizely World</generator><entry><title>The Low-Level API Is Not Automatically Fast. Part 4: Counting Round Trips</title><link href="https://szolkowski.github.io/2026/10/21/the-low-level-api-is-not-automatically-fast-part-4-counting-round-trips" /><id>https://szolkowski.github.io/2026/10/21/the-low-level-api-is-not-automatically-fast-part-4-counting-round-trips</id><published>2026-10-21T08:00:00.0000000Z</published><updated>2026-10-21T11:30:30.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">The low-level Commerce DTO API is not automatically fast: counting the database round trips per imported row, and four fixes I would apply first.</summary></entry><entry><title>Surviving a Dirty Feed. Part 3: Error Handling and Event Batching</title><link href="https://szolkowski.github.io/2026/10/16/surviving-a-dirty-feed-part-3-error-handling-and-event-batching" /><id>https://szolkowski.github.io/2026/10/16/surviving-a-dirty-feed-part-3-error-handling-and-event-batching</id><published>2026-10-16T08:00:00.0000000Z</published><updated>2026-10-16T08:31:08.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">Committing a 250,000-row Optimizely catalog import row by row, returning a per-row failure report, and coalescing catalog events into one per batch.</summary></entry><entry><title>Writing a Catalog Entry the Low-Level Way. Part 2: The Writer</title><link href="https://szolkowski.github.io/2026/10/07/writing-a-catalog-entry-the-low-level-way-part-2-the-writer" /><id>https://szolkowski.github.io/2026/10/07/writing-a-catalog-entry-the-low-level-way-part-2-the-writer</id><published>2026-10-07T08:00:00.0000000Z</published><updated>2026-10-07T09:31:05.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">Upserting a catalog entry through CatalogContext and MetaDataPlus: ContentGuid, the meta class seam, response groups, and a create path that rolls back.</summary></entry><entry><title>Bulk Catalog Import in Optimizely Commerce. Part 1: Why the DTO API</title><link href="https://szolkowski.github.io/2026/09/30/bulk-catalog-import-in-optimizely-commerce-part-1-why-the-dto-api" /><id>https://szolkowski.github.io/2026/09/30/bulk-catalog-import-in-optimizely-commerce-part-1-why-the-dto-api</id><published>2026-09-30T08:00:00.0000000Z</published><updated>2026-09-30T08:30:47.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">Why bulk catalog writes in Optimizely Commerce belong on the DTO API rather than IContentRepository — measured 2.7-3.3x faster, and what it costs you.</summary></entry><entry><title>Building a Blazor Server UI Inside the Optimizely CMS 13 Admin Shell</title><link href="https://szolkowski.github.io/2026/09/17/building-a-blazor-server-ui-inside-the-optimizely-cms-13-admin-shell" /><id>https://szolkowski.github.io/2026/09/17/building-a-blazor-server-ui-inside-the-optimizely-cms-13-admin-shell</id><published>2026-09-17T08:00:00.0000000Z</published><updated>2026-09-17T10:31:16.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">What I learned shipping a Blazor Server UI inside Optimizely CMS 13 — Razor components in a NuGet package, the Blazor hub next to MapContent(), prerendering.</summary></entry><entry><title>OptiPowerTools.ScheduledJobsInsights: Execution History for Optimizely’s Native Scheduled Jobs</title><link href="https://szolkowski.github.io/2026/09/15/optipowertools-scheduledjobsinsights-execution-history-for-optimizely-scheduled-jobs" /><id>https://szolkowski.github.io/2026/09/15/optipowertools-scheduledjobsinsights-execution-history-for-optimizely-scheduled-jobs</id><published>2026-09-15T08:00:00.0000000Z</published><updated>2026-09-15T10:30:28.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">A drop-in base class and Blazor UI that records what Optimizely CMS 13 scheduled jobs actually did — logs, metrics, result summaries, and retention.</summary></entry><entry><title>OptiPowerTools.Hangfire 2.0.0: CMS 13 Support and Sample Jobs</title><link href="https://szolkowski.github.io/2026/04/13/OptiPowerTools-Hangfire-2.0-CMS-13-Support" /><id>https://szolkowski.github.io/2026/04/13/OptiPowerTools-Hangfire-2.0-CMS-13-Support</id><published>2026-04-13T09:00:00.0000000Z</published><updated>2026-04-13T09:30:29.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">When I released OptiPowerTools.Hangfire back in March, it targeted Optimizely CMS 12. With CMS 13 now out and running on .NET 10, it was time to bring the package along. Version 2.0.0 adds full CMS 13 support, and I also shipped 1.0.1 on the CMS 12 line with sample jobs to help people get started faster.</summary></entry><entry><title>OptiPowerTools.Hangfire 2.0.0: CMS 13 Support and Sample Jobs</title><link href="https://szolkowski.github.io/2026/04/13/optipowertools-hangfire-2-0-cms-13-support" /><id>https://szolkowski.github.io/2026/04/13/optipowertools-hangfire-2-0-cms-13-support</id><published>2026-04-13T09:00:00.0000000Z</published><updated>2026-05-06T09:30:30.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">OptiPowerTools.Hangfire 2.0 adds Optimizely CMS 13 / .NET 10 support and ships ready-to-run sample jobs to shorten Hangfire setup on Optimizely projects.</summary></entry><entry><title>Running the Optimizely CMS 13 Alloy Site on macOS with Docker</title><link href="https://szolkowski.github.io/2026/04/09/optimizely-alloy-on-macos-apple-silicon" /><id>https://szolkowski.github.io/2026/04/09/optimizely-alloy-on-macos-apple-silicon</id><published>2026-04-09T09:00:00.0000000Z</published><updated>2026-04-09T09:30:26.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">In my first Apple Silicon post and the 2025 revisit I covered running an Optimizely Foundation site on an M1/ARM Mac. This time I wanted to try something smaller — the official Alloy template site for Optimizely CMS 13, which ships with a ready-made Docker Compose setup. On Windows it works out of the box, but on macOS with Apple Silicon a few adjustments are needed before everything runs smoothly.</summary></entry><entry><title>OptiPowerTools.Hangfire: A Drop-in Hangfire Integration for Optimizely CMS 12</title><link href="https://szolkowski.github.io/2026/03/31/OptiPowerTools.Hangfire-A-Drop-in-Hangfire-Integration-for-Optimizely-CMS-12" /><id>https://szolkowski.github.io/2026/03/31/OptiPowerTools.Hangfire-A-Drop-in-Hangfire-Integration-for-Optimizely-CMS-12</id><published>2026-03-31T08:00:00.0000000Z</published><updated>2026-03-31T09:30:30.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">Back in 2024, I wrote a post on Adding Hangfire to Episerver/Optimizely CMS 12, walking through each step of integrating Hangfire into an Optimizely project — the authorization filter, the controller, the view with an iframe, the menu provider, the startup wiring. It was a fair amount of boilerplate, but it worked and people found it useful.</summary></entry><entry><title>OptiPowerTools.Hangfire: A Drop-in Hangfire Integration for Optimizely CMS 12</title><link href="https://szolkowski.github.io/2026/03/31/optipowertools-hangfire-a-drop-in-hangfire-integration-for-optimizely-cms-12" /><id>https://szolkowski.github.io/2026/03/31/optipowertools-hangfire-a-drop-in-hangfire-integration-for-optimizely-cms-12</id><published>2026-03-31T08:00:00.0000000Z</published><updated>2026-05-06T09:30:30.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">OptiPowerTools.Hangfire is an open-source NuGet package that turns the manual Hangfire-on-Optimizely-CMS-12 setup into two lines of code.</summary></entry><entry><title>Catalog Traversal with Hangfire. Part 3: Advanced Job Management</title><link href="https://szolkowski.github.io/2026/03/03/Catalog-Traversal-with-Hangfire-Part-3-Advanced-Job-Management" /><id>https://szolkowski.github.io/2026/03/03/Catalog-Traversal-with-Hangfire-Part-3-Advanced-Job-Management</id><published>2026-03-03T08:00:00.0000000Z</published><updated>2026-03-03T10:30:31.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">In Part 1, I showed how to build a memory-efficient catalog traversal service, and in Part 2, I demonstrated practical patterns using Optimizely’s built-in scheduled jobs.</summary></entry><entry><title>Catalog Traversal in Action. Part 2: Real-World Scheduled Job Patterns</title><link href="https://szolkowski.github.io/2026/02/24/Catalog-Traversal-in-Action-Part-2-Real-World-Scheduled-Job-Patterns" /><id>https://szolkowski.github.io/2026/02/24/Catalog-Traversal-in-Action-Part-2-Real-World-Scheduled-Job-Patterns</id><published>2026-02-24T08:00:00.0000000Z</published><updated>2026-02-24T11:30:34.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">In my previous post, I showed how to build a memory-efficient catalog traversal service for Optimizely Commerce. The service uses streaming to process large catalogs without loading everything into memory at once.</summary></entry><entry><title>Memory-Efficient Catalog Traversal in Optimizely Commerce. Part 1: Building the Service</title><link href="https://szolkowski.github.io/2026/02/18/Memory-Efficient-Catalog-Traversal-in-Optimizely-Commerce-Part-1-Building-the-Service" /><id>https://szolkowski.github.io/2026/02/18/Memory-Efficient-Catalog-Traversal-in-Optimizely-Commerce-Part-1-Building-the-Service</id><published>2026-02-18T08:00:00.0000000Z</published><updated>2026-02-18T11:30:31.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">If you’ve worked with Optimizely Commerce for any length of time, you’ve probably faced this scenario: you need to process an entire product catalog in a scheduled job. Maybe you’re syncing to an external PIM system, exporting data for analytics, or performing bulk updates. The straightforward approach of loading all products into memory works fine for small catalogs, but once you hit thousands of products, things start to get uncomfortable.</summary></entry><entry><title>Memory-Efficient Catalog Traversal in Optimizely Commerce. Part 1: Building the Service</title><link href="https://szolkowski.github.io/2026/01/18/Memory-Efficient-Catalog-Traversal-in-Optimizely-Commerce-Part-1-Building-the-Service" /><id>https://szolkowski.github.io/2026/01/18/Memory-Efficient-Catalog-Traversal-in-Optimizely-Commerce-Part-1-Building-the-Service</id><published>2026-01-18T08:00:00.0000000Z</published><updated>2026-02-24T11:30:35.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">If you’ve worked with Optimizely Commerce for any length of time, you’ve probably faced this scenario: you need to process an entire product catalog in a scheduled job. Maybe you’re syncing to an external PIM system, exporting data for analytics, or performing bulk updates. The straightforward approach of loading all products into memory works fine for small catalogs, but once you hit thousands of products, things start to get uncomfortable.</summary></entry><entry><title>Quiet Performance Wins: Scheduled Job for SQL Index Maintenance in Optimizely</title><link href="https://szolkowski.github.io/2025/10/08/Quiet-Performance-Wins-Scheduled-Job-for-SQL-Index-Maintenance-in-Optimizely" /><id>https://szolkowski.github.io/2025/10/08/Quiet-Performance-Wins-Scheduled-Job-for-SQL-Index-Maintenance-in-Optimizely</id><published>2025-10-08T08:00:00.0000000Z</published><updated>2025-10-08T10:30:37.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">As Optimizely CMS projects grow, it’s not uncommon to introduce custom tables—whether for integrations, caching, or specialized business logic. But with great schema comes great responsibility: SQL Server indexes and statistics need love too.</summary></entry><entry><title>How to automatically remove orphaned Opti jobs from the DB</title><link href="https://szolkowski.github.io/2025/09/04/automatically-removing-orphaned-jobs-from-db" /><id>https://szolkowski.github.io/2025/09/04/automatically-removing-orphaned-jobs-from-db</id><published>2025-09-04T08:00:00.0000000Z</published><updated>2025-09-04T10:30:43.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">Optimizely CMS provides a simple yet powerful built-in job system that handles most standard scheduling scenarios with ease. Developers can easily implement these jobs to run automatically on a defined schedule or trigger them manually through the CMS interface. From my experience as an Optimizely/Episerver developer, manual jobs are especially useful for one-off operations or bulk content updates. Typically, these jobs serve a temporary purpose and are removed from the codebase in subsequent releases once they’ve fulfilled their role.</summary></entry><entry><title>Tunning Application Insights telemetry filtering in Optimizely</title><link href="https://szolkowski.github.io/2025/06/12/episerver-and_application_insights_filters" /><id>https://szolkowski.github.io/2025/06/12/episerver-and_application_insights_filters</id><published>2025-06-12T08:00:00.0000000Z</published><updated>2025-06-12T10:31:10.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">Application Insights is a cloud-based service designed to monitor web applications, providing insights into performance, errors, and user behavior, which integrates very well with the Optimizely CMS/Commerce solution and is included in the default DXP experience. However, like any generic tool for complex systems, it can be tuned to work even better for specific platforms and projects.</summary></entry><entry><title>Tunning Application Insights telemetry filtering in Optimizely</title><link href="https://szolkowski.github.io/2025/06/12/episerver-and-application-insights-filters" /><id>https://szolkowski.github.io/2025/06/12/episerver-and-application-insights-filters</id><published>2025-06-12T08:00:00.0000000Z</published><updated>2026-05-05T18:30:27.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">Tune Application Insights for Optimizely DXP: filter noisy internal requests and SQL dependencies to cut telemetry volume and surface real performance issues.</summary></entry><entry><title>Running full Optimizely development setup on M1 (ARM) based machine</title><link href="https://szolkowski.github.io/2025/05/26/episerver-on-apple-silicon-2025" /><id>https://szolkowski.github.io/2025/05/26/episerver-on-apple-silicon-2025</id><published>2025-05-26T08:00:00.0000000Z</published><updated>2025-05-26T10:31:16.0000000Z</updated><author><name>stanislaw.szolkowski@firstlinesoftware.com</name></author><category term="Blog post" /><summary type="html">A few years ago I posted post about how to run Optimizely/Episerver on M1 (ARM) based machine, so I think it is high time to revisit and check what did change.</summary></entry></feed>