{"docs":[{"id":10,"title":"Moving Beyond the \"Big Ball of Mud\": A Guide to DDD in .NET","slug":"moving-beyond-the-big-ball-of-mud-a-guide-to-ddd-in-net","excerpt":"In the early days of .NET development, the \"Data-First\" approach reigned supreme. We would design a database, drag tables into an EDMX file (if you’re old enough to remember that), and let the SQL schema dictate our code.\n\nDomain-Driven Design (DDD) flips the script. It argues that the heart of software isn't the database—it's the business logic. If you are building a .NET Web Application today, structuring it around DDD principles (often via Clean Architecture) is the best way to ensure your code remains maintainable as it grows.","content":null,"tinymceContent":"<h2 data-path-to-node=\"4\">The \"Clean\" Project Structure</h2>\n<p data-path-to-node=\"5\">In a standard .NET solution, we split our code into four distinct projects. This separation ensures that our business rules are never \"polluted\" by technical details like SQL strings or HTTP status codes.</p>\n<h3 data-path-to-node=\"6\">1. The Domain Layer (The Heart)</h3>\n<p data-path-to-node=\"7\">This project is at the center of everything. It contains your <strong data-path-to-node=\"7\" data-index-in-node=\"62\">Entities</strong>, <strong data-path-to-node=\"7\" data-index-in-node=\"72\">Aggregates</strong>, and <strong data-path-to-node=\"7\" data-index-in-node=\"88\">Value Objects</strong>.</p>\n<ul data-path-to-node=\"8\">\n<li>\n<p data-path-to-node=\"8,0,0\"><strong data-path-to-node=\"8,0,0\" data-index-in-node=\"0\">The Rule:</strong> This project should have <strong data-path-to-node=\"8,0,0\" data-index-in-node=\"35\">zero dependencies</strong>. It doesn't know about EF Core, it doesn't know about your API, and it certainly doesn't know about your database.</p>\n</li>\n<li>\n<p data-path-to-node=\"8,1,0\"><strong data-path-to-node=\"8,1,0\" data-index-in-node=\"0\">What lives here:</strong> Your \"source of truth\" business logic. If an Order can't be placed without a Customer, that logic is enforced here.</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"9\">2. The Application Layer (The Orchestrator)</h3>\n<p data-path-to-node=\"10\">This is where your \"Use Cases\" live. It defines <em data-path-to-node=\"10\" data-index-in-node=\"48\">what</em> the system can do.</p>\n<ul data-path-to-node=\"11\">\n<li>\n<p data-path-to-node=\"11,0,0\"><strong data-path-to-node=\"11,0,0\" data-index-in-node=\"0\">Where to put DTOs:</strong> Right here. <strong data-path-to-node=\"11,0,0\" data-index-in-node=\"31\">DTOs (Data Transfer Objects)</strong> belong in the Application layer because they define the contract for your use cases.</p>\n</li>\n<li>\n<p data-path-to-node=\"11,1,0\"><strong data-path-to-node=\"11,1,0\" data-index-in-node=\"0\">The Workflow:</strong> This layer receives a Request DTO, uses a Repository to fetch a Domain Entity, tells the Entity to do something, and then saves it back.</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"12\">3. The Infrastructure Layer (The Tools)</h3>\n<p data-path-to-node=\"13\">This handles the \"how\" of the application. It is the only place where technical implementation details live.</p>\n<ul data-path-to-node=\"14\">\n<li>\n<p data-path-to-node=\"14,0,0\"><strong data-path-to-node=\"14,0,0\" data-index-in-node=\"0\">Where to put EF &amp; Database Calls:</strong> All your <strong data-path-to-node=\"14,0,0\" data-index-in-node=\"43\">EF Core DbContexts, Migrations, and Repository implementations</strong> live here.</p>\n</li>\n<li>\n<p data-path-to-node=\"14,1,0\"><strong data-path-to-node=\"14,1,0\" data-index-in-node=\"0\">The Interface Trick:</strong> The Domain layer defines an interface (e.g., <code data-path-to-node=\"14,1,0\" data-index-in-node=\"66\">IOrderRepository</code>), but the Infrastructure layer provides the actual implementation using EF Core. This keeps your business logic decoupled from your database provider.</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"15\">4. The Presentation/API Layer (The Gateway)</h3>\n<p data-path-to-node=\"16\">This is your ASP.NET Core Web API. Its only job is to accept HTTP requests, validate the basic format of the data, and hand it off to the Application layer.</p>\n<hr data-path-to-node=\"17\">\n<h2 data-path-to-node=\"18\">Where Does Everything Go? (The Quick Reference)</h2>\n<p data-path-to-node=\"19\">When you're staring at a new file and wondering where to save it, use this table as your guide:</p>\n<table data-path-to-node=\"20\">\n<thead>\n<tr>\n<td><strong>Component</strong></td>\n<td><strong>Project</strong></td>\n<td><strong>Folder Location</strong></td>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><span data-path-to-node=\"20,1,0,0\"><strong data-path-to-node=\"20,1,0,0\" data-index-in-node=\"0\">Business Rules</strong></span></td>\n<td><span data-path-to-node=\"20,1,1,0\"><code data-path-to-node=\"20,1,1,0\" data-index-in-node=\"0\">.Domain</code></span></td>\n<td><span data-path-to-node=\"20,1,2,0\"><code data-path-to-node=\"20,1,2,0\" data-index-in-node=\"0\">/Aggregates</code> or <code data-path-to-node=\"20,1,2,0\" data-index-in-node=\"15\">/Entities</code></span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"20,2,0,0\"><strong data-path-to-node=\"20,2,0,0\" data-index-in-node=\"0\">DTOs (Input/Output)</strong></span></td>\n<td><span data-path-to-node=\"20,2,1,0\"><code data-path-to-node=\"20,2,1,0\" data-index-in-node=\"0\">.Application</code></span></td>\n<td><span data-path-to-node=\"20,2,2,0\"><code data-path-to-node=\"20,2,2,0\" data-index-in-node=\"0\">/Features/[FeatureName]/Queries</code></span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"20,3,0,0\"><strong data-path-to-node=\"20,3,0,0\" data-index-in-node=\"0\">Interfaces (IRepository)</strong></span></td>\n<td><span data-path-to-node=\"20,3,1,0\"><code data-path-to-node=\"20,3,1,0\" data-index-in-node=\"0\">.Domain</code></span></td>\n<td><span data-path-to-node=\"20,3,2,0\"><code data-path-to-node=\"20,3,2,0\" data-index-in-node=\"0\">/Interfaces</code></span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"20,4,0,0\"><strong data-path-to-node=\"20,4,0,0\" data-index-in-node=\"0\">DbContext / Migrations</strong></span></td>\n<td><span data-path-to-node=\"20,4,1,0\"><code data-path-to-node=\"20,4,1,0\" data-index-in-node=\"0\">.Infrastructure</code></span></td>\n<td><span data-path-to-node=\"20,4,2,0\"><code data-path-to-node=\"20,4,2,0\" data-index-in-node=\"0\">/Persistence</code></span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"20,5,0,0\"><strong data-path-to-node=\"20,5,0,0\" data-index-in-node=\"0\">SQL / LINQ Logic</strong></span></td>\n<td><span data-path-to-node=\"20,5,1,0\"><code data-path-to-node=\"20,5,1,0\" data-index-in-node=\"0\">.Infrastructure</code></span></td>\n<td><span data-path-to-node=\"20,5,2,0\"><code data-path-to-node=\"20,5,2,0\" data-index-in-node=\"0\">/Repositories</code></span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"20,6,0,0\"><strong data-path-to-node=\"20,6,0,0\" data-index-in-node=\"0\">Controllers / Program.cs</strong></span></td>\n<td><span data-path-to-node=\"20,6,1,0\"><code data-path-to-node=\"20,6,1,0\" data-index-in-node=\"0\">.Api</code></span></td>\n<td><span data-path-to-node=\"20,6,2,0\"><code data-path-to-node=\"20,6,2,0\" data-index-in-node=\"0\">/Controllers</code></span></td>\n</tr>\n</tbody>\n</table>\n<hr data-path-to-node=\"21\">\n<h2 data-path-to-node=\"22\">Why This Matters: The \"Fat Service\" Problem</h2>\n<p data-path-to-node=\"23\">Without DDD, .NET developers often fall into the trap of the <strong data-path-to-node=\"23\" data-index-in-node=\"61\">\"Fat Service.\"</strong> You end up with a <code data-path-to-node=\"23\" data-index-in-node=\"94\">OrderService.cs</code> that is 2,000 lines long, filled with <code data-path-to-node=\"23\" data-index-in-node=\"148\">_context.Orders.Add()</code>, validation logic, and email-sending code all mashed together.</p>\n<p data-path-to-node=\"24\">By using DDD:</p>\n<ol start=\"1\" data-path-to-node=\"25\">\n<li>\n<p data-path-to-node=\"25,0,0\"><strong data-path-to-node=\"25,0,0\" data-index-in-node=\"0\">Validation</strong> moves into the <strong data-path-to-node=\"25,0,0\" data-index-in-node=\"26\">Domain Entities</strong>.</p>\n</li>\n<li>\n<p data-path-to-node=\"25,1,0\"><strong data-path-to-node=\"25,1,0\" data-index-in-node=\"0\">Orchestration</strong> moves into small, focused <strong data-path-to-node=\"25,1,0\" data-index-in-node=\"40\">Application Handlers</strong>.</p>\n</li>\n<li>\n<p data-path-to-node=\"25,2,0\"><strong data-path-to-node=\"25,2,0\" data-index-in-node=\"0\">Database logic</strong> moves into <strong data-path-to-node=\"25,2,0\" data-index-in-node=\"26\">Repositories</strong>.</p>\n</li>\n</ol>\n<p data-path-to-node=\"26\">The result? Code that is actually readable, testable, and&mdash;dare I say&mdash;enjoyable to work on.</p>\n<hr data-path-to-node=\"27\">\n<h2 data-path-to-node=\"28\">The Verdict</h2>\n<p data-path-to-node=\"29\">Transitioning to DDD in .NET requires more upfront \"boilerplate\" code. You'll spend more time creating folders and mapping DTOs to Entities. However, for any project that is expected to live longer than six months, that investment pays off in a codebase that doesn't collapse under its own weight.</p>","coverImage":{"id":12,"prefix":"media","updatedAt":"2026-04-03T09:55:24.776Z","createdAt":"2026-04-03T09:55:23.759Z","url":"https://www.sentinelhubs.com/api/media/file/Gemini_Generated_Image_8o8xt78o8xt78o8x.jpg","thumbnailURL":null,"filename":"Gemini_Generated_Image_8o8xt78o8xt78o8x.jpg","mimeType":"image/jpeg","filesize":153795,"width":825,"height":460,"focalX":50,"focalY":50,"sizes":{"card":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null},"hero":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null}}},"author":{"id":1,"name":"Hiep To","updatedAt":"2026-02-09T10:38:48.482Z","createdAt":"2026-02-09T10:38:48.479Z","email":"dinhhiep86@gmail.com","sessions":[{"id":"3f167eba-7d68-46d2-8dad-fa079c948b77","createdAt":"2026-04-03T09:50:41.310Z","expiresAt":"2026-04-03T11:50:41.310Z"}],"collection":"users"},"categories":[],"tags":[],"publishedAt":"2026-04-03T12:00:00.000Z","seo":{"title":null,"description":null,"image":null},"updatedAt":"2026-04-03T09:55:50.180Z","createdAt":"2026-04-03T09:55:50.179Z","_status":"published"},{"id":8,"title":"Speed vs. Control: A Deep Dive into Dapper and the .NET ORM Landscape","slug":"speed-vs-control-a-deep-dive-into-dapper-and-the-net-orm-landscape","excerpt":"In the world of .NET development, choosing how your application communicates with the database is one of the most critical architectural decisions you’ll make. While Entity Framework (EF) Core is often the default choice, a leaner, faster alternative has been a fan favorite for years: Dapper.\n\nOriginally developed by the team at Stack Overflow to handle their massive traffic, Dapper isn't just another tool—it’s a philosophy of performance.","content":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null}},"tinymceContent":"<h2 data-path-to-node=\"4\">What is Dapper?</h2>\n<p data-path-to-node=\"5\">Dapper is a <strong data-path-to-node=\"5\" data-index-in-node=\"12\">Micro-ORM</strong> (Object-Relational Mapper). To understand what that means, think of it as a bridge. A full ORM like Entity Framework builds a massive, automated highway between your code and your database. Dapper, instead, provides a lightweight, high-speed footbridge.</p>\n<p data-path-to-node=\"6\">It is designed as a thin wrapper around <strong data-path-to-node=\"6\" data-index-in-node=\"40\">ADO.NET</strong>. It doesn't try to \"hide\" the SQL from you; instead, it embraces it.</p>\n<h3 data-path-to-node=\"7\">The \"SQL-First\" Workflow</h3>\n<p data-path-to-node=\"8\">In Dapper, you write raw SQL queries. Dapper&rsquo;s job is to take the results of those queries and \"hydrate\" them into C# objects (POCOs) as efficiently as possible.</p>\n<p><!----><!----><!----><!----><!----><!----><!----><!----></p>\n<div class=\"code-block ng-tns-c1066629530-28 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\" data-hveid=\"0\" data-ved=\"0CAAQhtANahcKEwi07YqygtCTAxUAAAAAHQAAAAAQVA\">\n<div class=\"code-block-decoration header-formatted gds-title-s ng-tns-c1066629530-28 ng-star-inserted\"><span class=\"ng-tns-c1066629530-28\">C#</span>\n<div class=\"buttons ng-tns-c1066629530-28 ng-star-inserted\"><!----><button class=\"mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1066629530-28 mat-unthemed ng-star-inserted\" aria-label=\"Copy code\"><!----></button><!----><!----></div>\n<!----><!----></div>\n<!---->\n<div class=\"formatted-code-block-internal-container ng-tns-c1066629530-28\">\n<div class=\"animated-opacity ng-tns-c1066629530-28\">\n<pre class=\"ng-tns-c1066629530-28\"><code class=\"code-container formatted ng-tns-c1066629530-28\" role=\"text\" data-test-id=\"code-content\"><span class=\"hljs-comment\">// The Dapper Way: Simple, Fast, and Explicit</span>\n<span class=\"hljs-keyword\">var</span> profile = connection.QuerySingle&lt;UserProfile&gt;(\n    <span class=\"hljs-string\">\"SELECT * FROM UserProfiles WHERE Username = @name\"</span>, \n    <span class=\"hljs-keyword\">new</span> { name = <span class=\"hljs-string\">\"DevMaster\"</span> }\n);\n</code></pre>\n<!----></div>\n</div>\n</div>\n<p><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----></p>\n<h3 data-path-to-node=\"10\">Why Developers Love It</h3>\n<ul data-path-to-node=\"11\">\n<li>\n<p data-path-to-node=\"11,0,0\"><strong data-path-to-node=\"11,0,0\" data-index-in-node=\"0\">Insane Speed:</strong> Dapper is frequently called the \"King of Micro-ORMs.\" Its performance overhead is virtually unmeasurable compared to raw ADO.NET.</p>\n</li>\n<li>\n<p data-path-to-node=\"11,1,0\"><strong data-path-to-node=\"11,1,0\" data-index-in-node=\"0\">Simplicity:</strong> There are no complex mapping files or \"magic\" configurations. If you know SQL, you know Dapper.</p>\n</li>\n<li>\n<p data-path-to-node=\"11,2,0\"><strong data-path-to-node=\"11,2,0\" data-index-in-node=\"0\">Security:</strong> It provides easy-to-use parameterization to prevent SQL injection attacks.</p>\n</li>\n<li>\n<p data-path-to-node=\"11,3,0\"><strong data-path-to-node=\"11,3,0\" data-index-in-node=\"0\">Modern Support:</strong> It fully supports <code data-path-to-node=\"11,3,0\" data-index-in-node=\"34\">async/await</code> patterns and multi-mapping (joining multiple tables into nested objects).</p>\n</li>\n</ul>\n<hr data-path-to-node=\"12\">\n<h2 data-path-to-node=\"13\">Dapper vs. The Competition</h2>\n<p data-path-to-node=\"14\">Choosing the right tool depends on whether you prioritize <strong data-path-to-node=\"14\" data-index-in-node=\"58\">developer convenience</strong> or <strong data-path-to-node=\"14\" data-index-in-node=\"83\">raw execution speed</strong>.</p>\n<table data-path-to-node=\"15\">\n<thead>\n<tr>\n<td><strong>Feature</strong></td>\n<td><strong>Dapper</strong></td>\n<td><strong>EF Core</strong></td>\n<td><strong>ADO.NET</strong></td>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><span data-path-to-node=\"15,1,0,0\"><strong data-path-to-node=\"15,1,0,0\" data-index-in-node=\"0\">Philosophy</strong></span></td>\n<td><span data-path-to-node=\"15,1,1,0\">Micro-ORM (Lightweight)</span></td>\n<td><span data-path-to-node=\"15,1,2,0\">Full ORM (Feature-rich)</span></td>\n<td><span data-path-to-node=\"15,1,3,0\">Manual (Low-level)</span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"15,2,0,0\"><strong data-path-to-node=\"15,2,0,0\" data-index-in-node=\"0\">SQL Generation</strong></span></td>\n<td><span data-path-to-node=\"15,2,1,0\">Written by You</span></td>\n<td><span data-path-to-node=\"15,2,2,0\">Generated by LINQ</span></td>\n<td><span data-path-to-node=\"15,2,3,0\">Written by You</span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"15,3,0,0\"><strong data-path-to-node=\"15,3,0,0\" data-index-in-node=\"0\">Performance</strong></span></td>\n<td><span data-path-to-node=\"15,3,1,0\">Exceptional</span></td>\n<td><span data-path-to-node=\"15,3,2,0\">Good (Moderate overhead)</span></td>\n<td><span data-path-to-node=\"15,3,3,0\">Maximum</span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"15,4,0,0\"><strong data-path-to-node=\"15,4,0,0\" data-index-in-node=\"0\">Change Tracking</strong></span></td>\n<td><span data-path-to-node=\"15,4,1,0\">No</span></td>\n<td><span data-path-to-node=\"15,4,2,0\">Yes</span></td>\n<td><span data-path-to-node=\"15,4,3,0\">No</span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"15,5,0,0\"><strong data-path-to-node=\"15,5,0,0\" data-index-in-node=\"0\">Learning Curve</strong></span></td>\n<td><span data-path-to-node=\"15,5,1,0\">Low (if you know SQL)</span></td>\n<td><span data-path-to-node=\"15,5,2,0\">High</span></td>\n<td><span data-path-to-node=\"15,5,3,0\">Moderate</span></td>\n</tr>\n</tbody>\n</table>\n<h3 data-path-to-node=\"16\">1. Entity Framework Core (The Heavyweight)</h3>\n<p data-path-to-node=\"17\">EF Core is the \"all-in-one\" solution. It handles database migrations, tracks changes to your objects, and allows you to write queries using LINQ instead of SQL.</p>\n<ul data-path-to-node=\"18\">\n<li>\n<p data-path-to-node=\"18,0,0\"><strong data-path-to-node=\"18,0,0\" data-index-in-node=\"0\">Best for:</strong> CRUD-heavy applications where development speed is more important than squeezing out every millisecond of performance.</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"19\">2. ADO.NET (The Foundation)</h3>\n<p data-path-to-node=\"20\">This is the lowest level of data access in .NET. It gives you 100% control, but it requires a massive amount of \"boilerplate\" code&mdash;manually opening connections, reading rows one by one, and assigning values to properties.</p>\n<ul data-path-to-node=\"21\">\n<li>\n<p data-path-to-node=\"21,0,0\"><strong data-path-to-node=\"21,0,0\" data-index-in-node=\"0\">Best for:</strong> Specific edge cases where even the tiny overhead of Dapper is unacceptable.</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"22\">3. NHibernate (The Legacy Powerhouse)</h3>\n<p data-path-to-node=\"23\">A port of Java&rsquo;s Hibernate, this is a mature, complex ORM.</p>\n<ul data-path-to-node=\"24\">\n<li>\n<p data-path-to-node=\"24,0,0\"><strong data-path-to-node=\"24,0,0\" data-index-in-node=\"0\">Best for:</strong> Complex enterprise systems requiring advanced features like second-level caching or very intricate inheritance mapping.</p>\n</li>\n</ul>\n<hr data-path-to-node=\"25\">\n<h2 data-path-to-node=\"26\">The Best of Both Worlds: The Hybrid Approach</h2>\n<p data-path-to-node=\"27\">You don't actually have to choose just one. Many high-scale .NET applications use a <strong data-path-to-node=\"27\" data-index-in-node=\"84\">Hybrid Approach</strong>:</p>\n<ol start=\"1\" data-path-to-node=\"28\">\n<li>\n<p data-path-to-node=\"28,0,0\"><strong data-path-to-node=\"28,0,0\" data-index-in-node=\"0\">Use Entity Framework Core</strong> for \"Command\" operations (Insert, Update, Delete). EF&rsquo;s change tracking makes managing complex data updates much safer and faster to code.</p>\n</li>\n<li>\n<p data-path-to-node=\"28,1,0\"><strong data-path-to-node=\"28,1,0\" data-index-in-node=\"0\">Use Dapper</strong> for \"Query\" operations (Read). When you need to pull data for a dashboard or a search result, Dapper ensures the database-to-object mapping happens instantly without the overhead of the EF Core engine.</p>\n</li>\n</ol>\n<h2 data-path-to-node=\"29\">Conclusion</h2>\n<p data-path-to-node=\"30\">Dapper is the perfect tool for developers who want to stay close to their data. By removing the abstraction layer and letting you write the SQL yourself, it grants you the performance of a race car with the simplicity of a basic library. If your application is starting to feel sluggish under the weight of a traditional ORM, it might be time to give Dapper a look.</p>","coverImage":{"id":10,"prefix":"media","updatedAt":"2026-04-02T21:46:33.069Z","createdAt":"2026-04-02T21:46:31.684Z","url":"https://www.sentinelhubs.com/api/media/file/Gemini_Generated_Image_262x3h262x3h262x.jpeg","thumbnailURL":null,"filename":"Gemini_Generated_Image_262x3h262x3h262x.jpeg","mimeType":"image/jpeg","filesize":843902,"width":2816,"height":1536,"focalX":50,"focalY":50,"sizes":{"card":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null},"hero":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null}}},"author":{"id":1,"name":"Hiep To","updatedAt":"2026-02-09T10:38:48.482Z","createdAt":"2026-02-09T10:38:48.479Z","email":"dinhhiep86@gmail.com","sessions":[{"id":"3f167eba-7d68-46d2-8dad-fa079c948b77","createdAt":"2026-04-03T09:50:41.310Z","expiresAt":"2026-04-03T11:50:41.310Z"}],"collection":"users"},"categories":[],"tags":[],"publishedAt":"2026-04-02T12:00:00.000Z","seo":{"title":null,"description":null,"image":null},"updatedAt":"2026-04-02T21:46:43.918Z","createdAt":"2026-04-02T20:46:49.242Z","_status":"published"},{"id":9,"title":"The Heavyweight Champion of Imaging: Demystifying the TIFF Format","slug":"the-heavyweight-champion-of-imaging-demystifying-the-tiff-format","excerpt":"Have you ever wondered what file format is the true workhorse behind those stunning, high-resolution magazine covers or museum quality prints? It’s not JPEG, and it’s rarely PNG. Enter the TIFF, the Tagged Image File Format. If you’re a photographer, graphic designer, or archivist, the TIFF is likely your best friend. But for everyone else, it can seem a little mysterious, and frankly, a bit of a file-size hog. Let's pull back the curtain on this digital powerhouse.","content":null,"tinymceContent":"<h3 data-path-to-node=\"2\">What is a TIFF, Anyway?</h3>\n<p data-path-to-node=\"3\">Created back in the 1980s by Aldus Corporation (now Adobe), the TIFF was designed to be a universal standard for digital images, particularly for scanned graphics. Its primary mission: <strong data-path-to-node=\"3\" data-index-in-node=\"185\">to preserve every ounce of data.</strong> In a world where space was limited and compression was common, the TIFF stood tall as the bastion of quality.</p>\n<p data-path-to-node=\"4\">Think of it like this: if an image is a detailed piece of art, a JPEG is like a well-made photocopy. It's efficient, good enough for most things, but some detail is lost. A TIFF is the original masterpiece itself.</p>\n<h3 data-path-to-node=\"5\">The Secrets to Its Power</h3>\n<p data-path-to-node=\"6\">So, what makes the TIFF so special? Here&rsquo;s the technical lowdown in plain English:</p>\n<ul data-path-to-node=\"7\">\n<li>\n<p data-path-to-node=\"7,0,0\"><strong data-path-to-node=\"7,0,0\" data-index-in-node=\"0\">Lossless Compression:</strong> This is the big one. Unlike a JPEG, which permanently deletes data to shrink file sizes (lossy compression), a TIFF uses lossless methods (like LZW) or no compression at all. This means you can open, edit, and re-save a TIFF image thousands of times, and the pixel quality will remain absolutely perfect. Zero degradation.</p>\n</li>\n<li>\n<p data-path-to-node=\"7,1,0\"><strong data-path-to-node=\"7,1,0\" data-index-in-node=\"0\">\"Tagged\" for a Reason:</strong> The name isn&rsquo;t just cool. A TIFF file uses \"tags\" to store vast amounts of metadata. These aren&rsquo;t just \"exposure settings\"; they can tell a printer how much black ink to use (CMYK), define precise color spaces, or even handle transparency and multiple layers, much like a Photoshop file.</p>\n</li>\n<li>\n<p data-path-to-node=\"7,2,0\"><strong data-path-to-node=\"7,2,0\" data-index-in-node=\"0\">Incredible Depth:</strong> Most JPEGs are 8-bit, managing about 16.7 million colors. A TIFF can store 16-bit or even 32-bit data <em data-path-to-node=\"7,2,0\" data-index-in-node=\"120\">per color channel</em>. That means it can represent <em data-path-to-node=\"7,2,0\" data-index-in-node=\"167\">trillions</em> more colors, ensuring smooth gradients and unparalleled tonal range.</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"8\">TIFF vs. The World: When to Use It</h3>\n<p data-path-to-node=\"9\">TIFF isn't a one-size-fits-all solution. It has very specific, powerful applications.</p>\n<ul data-path-to-node=\"10\">\n<li>\n<p data-path-to-node=\"10,0,0\"><strong data-path-to-node=\"10,0,0\" data-index-in-node=\"0\">Use TIFF For:</strong></p>\n<ul data-path-to-node=\"10,0,1\">\n<li>\n<p data-path-to-node=\"10,0,1,0,0\"><strong data-path-to-node=\"10,0,1,0,0\" data-index-in-node=\"0\">Archiving:</strong> It&rsquo;s the gold standard for digitizing and permanently preserving artwork, historical documents, and original photographic negatives.</p>\n</li>\n<li>\n<p data-path-to-node=\"10,0,1,1,0\"><strong data-path-to-node=\"10,0,1,1,0\" data-index-in-node=\"0\">Professional Printing:</strong> When quality is paramount&mdash;think posters, art books, and magazine layouts&mdash;printers demand TIFF for its color precision and lack of compression artifacts.</p>\n</li>\n<li>\n<p data-path-to-node=\"10,0,1,2,0\"><strong data-path-to-node=\"10,0,1,2,0\" data-index-in-node=\"0\">The \"Master\" File:</strong> Keep your high-res, fully-edited images in TIFF. It&rsquo;s your safety net. If you need a smaller file later, you can always make a JPEG from the TIFF.</p>\n</li>\n</ul>\n</li>\n<li>\n<p data-path-to-node=\"10,1,0\"><strong data-path-to-node=\"10,1,0\" data-index-in-node=\"0\">Avoid TIFF For:</strong></p>\n<ul data-path-to-node=\"10,1,1\">\n<li>\n<p data-path-to-node=\"10,1,1,0,0\"><strong data-path-to-node=\"10,1,1,0,0\" data-index-in-node=\"0\">Websites &amp; Emails:</strong> TIFFs are <em data-path-to-node=\"10,1,1,0,0\" data-index-in-node=\"29\">massive</em>. An uncompressed 24MP image can be over 140MB. They won't load in standard web browsers and are terrible for email attachments.</p>\n</li>\n<li>\n<p data-path-to-node=\"10,1,1,1,0\"><strong data-path-to-node=\"10,1,1,1,0\" data-index-in-node=\"0\">General Storage:</strong> If you're just storing thousands of vacation photos, using TIFF will obliterate your hard drive space. Stick to high-quality JPEGs.</p>\n</li>\n</ul>\n</li>\n</ul>\n<h3 data-path-to-node=\"11\">The Verdict</h3>\n<p data-path-to-node=\"12\">The TIFF format is a specialist. It trades off file size and ease-of-use for absolute, unwavering quality. It is the \"Source of Truth\" in the digital darkroom. If you need the ultimate digital representation of an image, or are prepping something for the press, the TIFF is your answer. Just don't try to upload it to your Instagram feed.</p>","coverImage":{"id":11,"prefix":"media","updatedAt":"2026-04-02T21:53:19.050Z","createdAt":"2026-04-02T21:53:18.010Z","url":"https://www.sentinelhubs.com/api/media/file/Gemini_Generated_Image_8vgjd68vgjd68vgj.jpg","thumbnailURL":null,"filename":"Gemini_Generated_Image_8vgjd68vgjd68vgj.jpg","mimeType":"image/jpeg","filesize":522416,"width":1408,"height":768,"focalX":50,"focalY":50,"sizes":{"card":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null},"hero":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null}}},"author":{"id":1,"name":"Hiep To","updatedAt":"2026-02-09T10:38:48.482Z","createdAt":"2026-02-09T10:38:48.479Z","email":"dinhhiep86@gmail.com","sessions":[{"id":"3f167eba-7d68-46d2-8dad-fa079c948b77","createdAt":"2026-04-03T09:50:41.310Z","expiresAt":"2026-04-03T11:50:41.310Z"}],"collection":"users"},"categories":[],"tags":[],"publishedAt":"2026-04-01T12:00:00.000Z","seo":{"title":null,"description":null,"image":null},"updatedAt":"2026-04-02T21:54:22.685Z","createdAt":"2026-04-02T21:53:25.893Z","_status":"published"},{"id":7,"title":"Building a Scalable Optimizely Commerce → Salesforce Integration with MuleSoft","slug":"building-a-scalable-optimizely-commerce-salesforce-integration-with-mulesoft","excerpt":"Integrating Optimizely Commerce with Salesforce sounds simple: when an order is completed, sync it to CRM. In reality, production integrations must handle retries, data transformation, scalability, and long-term change.","content":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"  ","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null}},"tinymceContent":"<h1 data-start=\"115\" data-end=\"195\"><span style=\"font-size: 16px;\">A </span><strong style=\"font-size: 16px;\" data-start=\"447\" data-end=\"487\">practical, enterprise-ready approach</strong><span style=\"font-size: 16px;\"> using </span><strong style=\"font-size: 16px;\" data-start=\"494\" data-end=\"535\"><span class=\"whitespace-normal\">MuleSoft</span></strong><span style=\"font-size: 16px;\"> and API-led connectivity.</span></h1>\n<hr data-start=\"563\" data-end=\"566\">\n<h2 data-start=\"568\" data-end=\"584\">Why MuleSoft?</h2>\n<p data-start=\"586\" data-end=\"679\">Point-to-point integrations break down as volume grows and schemas change. MuleSoft provides:</p>\n<ul data-start=\"681\" data-end=\"851\">\n<li data-start=\"681\" data-end=\"715\">\n<p data-start=\"683\" data-end=\"715\">Native Salesforce connectivity</p>\n</li>\n<li data-start=\"716\" data-end=\"758\">\n<p data-start=\"718\" data-end=\"758\">Robust data transformation (DataWeave)</p>\n</li>\n<li data-start=\"759\" data-end=\"802\">\n<p data-start=\"761\" data-end=\"802\">Built-in retry, queuing, and monitoring</p>\n</li>\n<li data-start=\"803\" data-end=\"851\">\n<p data-start=\"805\" data-end=\"851\">Centralized governance via Anypoint Platform</p>\n</li>\n</ul>\n<p data-start=\"853\" data-end=\"916\">This makes it ideal for mission-critical commerce integrations.</p>\n<hr data-start=\"918\" data-end=\"921\">\n<h2 data-start=\"923\" data-end=\"960\">API-Led Connectivity (In Practice)</h2>\n<p data-start=\"962\" data-end=\"1017\">MuleSoft integrations are structured into three layers:</p>\n<ol data-start=\"1019\" data-end=\"1410\">\n<li data-start=\"1019\" data-end=\"1139\">\n<p data-start=\"1022\" data-end=\"1039\"><strong data-start=\"1022\" data-end=\"1037\">System APIs</strong></p>\n<ul data-start=\"1043\" data-end=\"1139\">\n<li data-start=\"1043\" data-end=\"1089\">\n<p data-start=\"1045\" data-end=\"1089\">Wrap core systems (Optimizely, Salesforce)</p>\n</li>\n<li data-start=\"1093\" data-end=\"1139\">\n<p data-start=\"1095\" data-end=\"1139\">Handle auth, pagination, and normalization</p>\n</li>\n</ul>\n</li>\n<li data-start=\"1141\" data-end=\"1290\">\n<p data-start=\"1144\" data-end=\"1162\"><strong data-start=\"1144\" data-end=\"1160\">Process APIs</strong></p>\n<ul data-start=\"1166\" data-end=\"1290\">\n<li data-start=\"1166\" data-end=\"1192\">\n<p data-start=\"1168\" data-end=\"1192\">Contain business logic</p>\n</li>\n<li data-start=\"1196\" data-end=\"1245\">\n<p data-start=\"1198\" data-end=\"1245\">Orchestrate customers, orders, and line items</p>\n</li>\n<li data-start=\"1249\" data-end=\"1290\">\n<p data-start=\"1251\" data-end=\"1290\">Manage retries and dead-letter queues</p>\n</li>\n</ul>\n</li>\n<li data-start=\"1292\" data-end=\"1410\">\n<p data-start=\"1295\" data-end=\"1316\"><strong data-start=\"1295\" data-end=\"1314\">Experience APIs</strong></p>\n<ul data-start=\"1320\" data-end=\"1410\">\n<li data-start=\"1320\" data-end=\"1358\">\n<p data-start=\"1322\" data-end=\"1358\">Expose consumer-specific endpoints</p>\n</li>\n<li data-start=\"1362\" data-end=\"1410\">\n<p data-start=\"1364\" data-end=\"1410\">Handle webhooks, admin actions, and security</p>\n</li>\n</ul>\n</li>\n</ol>\n<p data-start=\"1412\" data-end=\"1510\">Each layer maps to a <strong data-start=\"1433\" data-end=\"1462\">separate Mule application</strong>, enabling independent scaling and safer change.</p>\n<hr data-start=\"1512\" data-end=\"1515\">\n<h2 data-start=\"1517\" data-end=\"1544\">Middleware Flow Overview</h2>\n<p data-start=\"1546\" data-end=\"1572\">A typical order sync flow:</p>\n<ol data-start=\"1574\" data-end=\"1791\">\n<li data-start=\"1574\" data-end=\"1605\">\n<p data-start=\"1577\" data-end=\"1605\">Receive Optimizely webhook</p>\n</li>\n<li data-start=\"1606\" data-end=\"1635\">\n<p data-start=\"1609\" data-end=\"1635\">Fetch full order details</p>\n</li>\n<li data-start=\"1636\" data-end=\"1676\">\n<p data-start=\"1639\" data-end=\"1676\">Transform data to Salesforce schema</p>\n</li>\n<li data-start=\"1677\" data-end=\"1720\">\n<p data-start=\"1680\" data-end=\"1720\">Upsert customer, order, and line items</p>\n</li>\n<li data-start=\"1721\" data-end=\"1750\">\n<p data-start=\"1724\" data-end=\"1750\">Retry transient failures</p>\n</li>\n<li data-start=\"1751\" data-end=\"1791\">\n<p data-start=\"1754\" data-end=\"1791\">Route unrecoverable errors to a DLQ</p>\n</li>\n</ol>\n<p data-start=\"1793\" data-end=\"1879\">This logic lives in Mule&mdash;not in Optimizely or Salesforce&mdash;keeping both platforms clean.</p>\n<hr data-start=\"1881\" data-end=\"1884\">\n<h2 data-start=\"1886\" data-end=\"1918\">vCore Sizing (Quick Guidance)</h2>\n<p data-start=\"1920\" data-end=\"1963\">vCores represent MuleSoft compute capacity.</p>\n<ul data-start=\"1965\" data-end=\"2125\">\n<li data-start=\"1965\" data-end=\"2027\">\n<p data-start=\"1967\" data-end=\"2027\"><strong data-start=\"1967\" data-end=\"1978\">1 vCore</strong> &ndash; Real-time order webhooks (low&ndash;medium volume)</p>\n</li>\n<li data-start=\"2028\" data-end=\"2076\">\n<p data-start=\"2030\" data-end=\"2076\"><strong data-start=\"2030\" data-end=\"2042\">2 vCores</strong> &ndash; Orders + customers + products</p>\n</li>\n<li data-start=\"2077\" data-end=\"2125\">\n<p data-start=\"2079\" data-end=\"2125\"><strong data-start=\"2079\" data-end=\"2092\">4+ vCores</strong> &ndash; High-volume batch processing</p>\n</li>\n</ul>\n<p data-start=\"2127\" data-end=\"2245\">Most commerce integrations are <strong data-start=\"2158\" data-end=\"2171\">I/O-bound</strong>, so start small, load test, and scale based on concurrency&mdash;not guesswork.</p>\n<hr data-start=\"2247\" data-end=\"2250\">\n<h2 data-start=\"2252\" data-end=\"2279\">Contract-First with RAML</h2>\n<p data-start=\"2281\" data-end=\"2349\">Each Mule app is defined by a <strong data-start=\"2311\" data-end=\"2332\">RAML API contract</strong>, which provides:</p>\n<ul data-start=\"2351\" data-end=\"2449\">\n<li data-start=\"2351\" data-end=\"2375\">\n<p data-start=\"2353\" data-end=\"2375\">Auto-generated flows</p>\n</li>\n<li data-start=\"2376\" data-end=\"2398\">\n<p data-start=\"2378\" data-end=\"2398\">Request validation</p>\n</li>\n<li data-start=\"2399\" data-end=\"2429\">\n<p data-start=\"2401\" data-end=\"2429\">Clear ownership boundaries</p>\n</li>\n<li data-start=\"2430\" data-end=\"2449\">\n<p data-start=\"2432\" data-end=\"2449\">Safe versioning</p>\n</li>\n</ul>\n<p data-start=\"2451\" data-end=\"2517\">Contracts are the foundation that makes API-led architecture real.</p>\n<hr data-start=\"2519\" data-end=\"2522\">\n<h2 data-start=\"2524\" data-end=\"2541\">Final Takeaway</h2>\n<p data-start=\"2543\" data-end=\"2670\">Using MuleSoft with API-led connectivity turns a fragile Optimizely &rarr; Salesforce sync into a <strong data-start=\"2636\" data-end=\"2669\">scalable integration platform</strong>:</p>\n<ul data-start=\"2672\" data-end=\"2739\">\n<li data-start=\"2672\" data-end=\"2697\">\n<p data-start=\"2674\" data-end=\"2697\">Resilient to failures</p>\n</li>\n<li data-start=\"2698\" data-end=\"2718\">\n<p data-start=\"2700\" data-end=\"2718\">Easier to evolve</p>\n</li>\n<li data-start=\"2719\" data-end=\"2739\">\n<p data-start=\"2721\" data-end=\"2739\">Ready for growth</p>\n</li>\n</ul>\n<p data-start=\"2741\" data-end=\"2811\">It&rsquo;s the difference between &ldquo;it works today&rdquo; and &ldquo;it works for years.&rdquo;</p>","coverImage":{"id":4,"prefix":"media","updatedAt":"2026-02-22T15:19:25.670Z","createdAt":"2026-02-22T15:19:25.669Z","url":"https://www.sentinelhubs.com/api/media/file/Screenshot%202026-02-22%20161901.png","thumbnailURL":null,"filename":"Screenshot 2026-02-22 161901.png","mimeType":"image/png","filesize":46849,"width":317,"height":675,"focalX":50,"focalY":50,"sizes":{"card":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null},"hero":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null}}},"author":{"id":2,"name":"Hito","updatedAt":"2026-02-09T14:39:27.275Z","createdAt":"2026-02-09T14:39:27.275Z","email":"hiep.todinh@optimizely.com","sessions":[],"collection":"users"},"categories":[],"tags":[],"publishedAt":"2026-02-22T12:00:00.000Z","seo":{"title":null,"description":null,"image":null},"updatedAt":"2026-02-22T15:19:28.407Z","createdAt":"2026-02-22T14:59:48.898Z","_status":"published"},{"id":5,"title":"Navigating the 2026 Compliance Frontier: A Guide for E-Commerce and NGOs","slug":"navigating-the-2026-compliance-frontier-a-guide-for-e-commerce-and-ngos","excerpt":"In the rapidly evolving digital landscape of 2026, compliance has shifted from a \"once-a-year\" checkbox to a continuous, risk-based operational requirement. Whether you are a high-volume retailer or a mission-driven NGO, understanding the intersection of financial security, data privacy, and national mandates is critical for survival and trust.","content":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"tag":"h2","type":"heading","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"1. The Financial Backbone: PCI DSS 4.0.1","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"The transition to PCI DSS 4.0.1 is now complete, emphasizing \"Customized Approaches\" to security. For e-commerce, the focus has moved heavily toward client-side security to prevent \"skimming\" attacks.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"tag":"h3","type":"heading","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Merchant Level & Validation Requirements","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null},{"type":"table","format":"","indent":0,"version":1,"children":[{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"PCI Level","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Transaction Volume","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Validation Needed","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Level 1","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":">6 Million / year","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Annual On-site QSA Audit; RoC","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Level 2","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"1 – 6 Million / year","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Annual SAQ; Quarterly Network Scan","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","height":33,"indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Level 3","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"20k – 1 Million / year","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Annual SAQ; Quarterly Network Scan","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Level 4","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"<20,000 / year","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Annual SAQ; Recommended Scans","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null}],"colWidths":[92,92,531],"direction":null,"textFormat":1},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Note: In 2026, merchants using iframes or redirects must now technically prove their site is not \"susceptible to script attacks\" to remain eligible for the simpler SAQ A; otherwise, they are elevated to the more rigorous SAQ A-EP or SAQ D .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"________________________________________","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"tag":"h2","type":"heading","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"2. Data Retention: The \"Why\" Dictates the \"How Long\"","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Under GDPR and national laws, you cannot store personal data \"just in case\" . Storage is strictly limited by the purpose of the data.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"The Retention Timeline (Swedish Context)","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"tag":"ul","type":"list","start":1,"format":"","indent":0,"version":1,"children":[{"type":"listitem","value":1,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"14 Days:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" Right of withdrawal window for most online purchases .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1},{"type":"listitem","value":2,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"1 Year:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" Subscriber data following account termination .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1},{"type":"listitem","value":3,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"3 Years:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" Consumer complaint records under the Consumer Sales Act .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1},{"type":"listitem","value":4,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"7 Years:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" Mandatory archiving for all accounting material (invoices, receipts) per the Swedish Accounting Act .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1}],"listType":"bullet","direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"________________________________________","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"tag":"h3","type":"heading","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"3. Global Comparison: Europe vs. Asia","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"While the GDPR provides a baseline in Europe, national tax laws often extend retention periods. In Asia, newer e-commerce laws focus more on transaction transparency and user inactivity.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"table","format":"","indent":0,"version":1,"children":[{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Region","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Country","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Retention (Transaction Data)","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Legal Logic","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Europe","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Sweden","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"7 Years","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Accounting Act (","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"Bokföringslagen","type":"text","style":"","detail":0,"format":2,"version":1},{"mode":"normal","text":")","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Germany","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"8 Years","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Bureaucracy Relief Act (BEG IV)","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"France","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"10 Years","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"French Commercial Code","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Asia","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"China","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"3 Years","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"E-Commerce Law (2019)","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Singapore","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"5 Years","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Income Tax Act","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null},{"type":"tablerow","format":"","indent":0,"version":1,"children":[{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"India","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"3 Years (Inactivity)","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null},{"type":"tablecell","format":"","indent":0,"colSpan":1,"rowSpan":1,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"DPDP Rules 2025","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null,"headerState":0,"backgroundColor":null}],"direction":null}],"colWidths":[92,219,231,516],"direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"________________________________________","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"tag":"h4","type":"heading","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"4. NGOs & The \"90-Account\" Standard","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"For non-profits in Sweden, the 90-account (90-konto) is the ultimate seal of quality. Regulated by Svensk Insamlingskontroll, it assures donors that their money is handled ethically .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"The 75/25 Rule for 90-Accounts","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"tag":"ul","type":"list","start":1,"format":"","indent":0,"version":1,"children":[{"type":"listitem","value":1,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Mission First:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" At least ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"75%","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" of total revenue must go directly to the charitable purpose.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1},{"type":"listitem","value":2,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Lean Admin:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" No more than ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"25%","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" can be spent on administration and fundraising .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1},{"type":"listitem","value":3,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Trust Indicators:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" These accounts always start with \"90\" (e.g., Bankgiro 900-xxxx) and allow for dedicated \"90\" Swish numbers .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1}],"listType":"bullet","direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"NGO vs. E-Commerce: Key Differences","type":"text","style":"","detail":0,"format":1,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"tag":"ol","type":"list","start":1,"format":"","indent":0,"version":1,"children":[{"type":"listitem","value":1,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Sensitive Data:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" NGOs often handle \"Special Category\" data (religious/political affiliation), requiring explicit consent.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1},{"type":"listitem","value":2,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Vetting:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" NGOs face stricter ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"Anti-Money Laundering (AML)","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" checks. Individual donations over ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"€1,000","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" often trigger mandatory \"Know Your Donor\" (KYD) identity verification .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1},{"type":"listitem","value":3,"format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Withdrawal Rights:","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" While e-commerce must offer a \"Withdrawal Button\" by 2026, pure monetary donations are generally exempt from these consumer return rights .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textFormat":1}],"listType":"number","direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"________________________________________","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"tag":"h2","type":"heading","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"5. 2026 Swedish Compliance Checklist","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"If you operate in Sweden, ensure your systems are updated for these three major pillars:","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"•","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"\t","type":"tab","style":"","detail":2,"format":0,"version":1},{"mode":"normal","text":"BankID \"Secure Start\": Mandatory animated QR code scanning for all cross-device logins to prevent phishing.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"•","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"\t","type":"tab","style":"","detail":2,"format":0,"version":1},{"mode":"normal","text":"The Withdrawal Button: Mandatory from June 19, 2026. A clearly labeled button must exist for consumers to terminate contracts easily .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"•","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"\t","type":"tab","style":"","detail":2,"format":0,"version":1},{"mode":"normal","text":"EPR & Packaging (NPA): All \"producers\" (including online shops) must register with a PRO like NPA to manage the lifecycle of their shipping boxes and mailers .","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"The Bottom Line: In 2026, compliance is your most valuable asset for building consumer and donor trust. Start your audits early to avoid the steep penalties of the DSA (up to 6% of turnover) or GDPR.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null}},"tinymceContent":null,"coverImage":{"id":3,"prefix":"media","updatedAt":"2026-02-13T15:23:02.158Z","createdAt":"2026-02-13T15:23:02.158Z","url":"https://www.sentinelhubs.com/api/media/file/Image_6r6tdw6r6tdw6r6t.png","thumbnailURL":null,"filename":"Image_6r6tdw6r6tdw6r6t.png","mimeType":"image/png","filesize":1494963,"width":1024,"height":1024,"focalX":50,"focalY":50,"sizes":{"card":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null},"hero":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null}}},"author":{"id":2,"name":"Hito","updatedAt":"2026-02-09T14:39:27.275Z","createdAt":"2026-02-09T14:39:27.275Z","email":"hiep.todinh@optimizely.com","sessions":[],"collection":"users"},"categories":[],"tags":[],"publishedAt":"2026-02-13T12:00:00.000Z","seo":{"title":null,"description":null,"image":null},"updatedAt":"2026-02-13T15:23:09.632Z","createdAt":"2026-02-13T15:21:17.121Z","_status":"published"},{"id":4,"title":"The Shifting Sands of Employment: Jobs at Risk and Opportunities to Cultivate","slug":"the-shifting-sands-of-employment-jobs-at-risk-and-opportunities-to-cultivate","excerpt":"The rapid advancement of technology is reshaping the global job market at an unprecedented pace. While innovation brings new efficiencies and possibilities, it also inevitably displaces certain roles. Looking ahead just three years, some jobs face a high likelihood of significant disruption or even outright obsolescence, while others are poised for substantial growth. Understanding these shifts is crucial for individuals and economies alike to adapt and thrive.","content":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"The rapid advancement of technology is reshaping the global job market at an unprecedented pace. While innovation brings new efficiencies and possibilities, it also inevitably displaces certain roles. Looking ahead just three years, some jobs face a high likelihood of significant disruption or even outright obsolescence, while others are poised for substantial growth. Understanding these shifts is crucial for individuals and economies alike to adapt and thrive.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"One of the most vulnerable sectors is ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"repetitive administrative and clerical work","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":". Roles involving data entry, basic bookkeeping, transcription, and routine customer service are increasingly being automated by sophisticated AI and robotic process automation (RPA). As these technologies become more accessible and refined, the need for human input in these areas will diminish significantly. Similarly, certain manufacturing jobs that rely on highly repetitive assembly line tasks are susceptible to automation. The same applies to aspects of the transportation industry, with self-driving vehicles projected to take over more trucking and delivery routes.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"So, where should we direct our focus to future-proof our careers? The answer lies in cultivating skills that are inherently human and difficult for machines to replicate. ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"Creativity and innovation","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" are paramount. Jobs in design, content creation, artistic fields, and scientific research will continue to flourish. The ability to think outside the box, solve complex problems in novel ways, and generate new ideas is a uniquely human attribute.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Furthermore, ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"critical thinking and complex problem-solving","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" will be in high demand. As technology handles routine tasks, humans will be needed to analyze data, interpret complex situations, and make strategic decisions. Roles in advanced analytics, strategic consulting, and specialized engineering fall into this category. ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"Emotional intelligence and interpersonal skills","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" are also becoming increasingly valuable. Jobs that involve deep human interaction, such as therapy, nursing, teaching, and intricate sales or negotiation, require empathy, communication, and the ability to understand nuanced social cues – areas where AI still lags far behind.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Finally, ","type":"text","style":"","detail":0,"format":0,"version":1},{"mode":"normal","text":"digital literacy and adaptability","type":"text","style":"","detail":0,"format":1,"version":1},{"mode":"normal","text":" are not just desirable, but essential across almost all future-proofed careers. The ability to learn new technologies quickly, understand data, and collaborate effectively in a digital environment will be a core competency, regardless of the specific field. The future of work isn't about fearing automation, but embracing lifelong learning and focusing on developing uniquely human capabilities.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null}},"tinymceContent":null,"coverImage":{"id":2,"prefix":"media","updatedAt":"2026-02-09T15:08:24.420Z","createdAt":"2026-02-09T15:08:24.419Z","url":"https://www.sentinelhubs.com/api/media/file/unnamed%20(3).jpg","thumbnailURL":null,"filename":"unnamed (3).jpg","mimeType":"image/jpeg","filesize":270562,"width":1024,"height":1024,"focalX":50,"focalY":50,"sizes":{"card":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null},"hero":{"url":null,"width":null,"height":null,"mimeType":null,"filesize":null,"filename":null}}},"author":{"id":2,"name":"Hito","updatedAt":"2026-02-09T14:39:27.275Z","createdAt":"2026-02-09T14:39:27.275Z","email":"hiep.todinh@optimizely.com","sessions":[],"collection":"users"},"categories":[],"tags":[],"publishedAt":"2026-02-12T12:00:00.000Z","seo":{"title":null,"description":null,"image":null},"updatedAt":"2026-02-13T14:14:09.938Z","createdAt":"2026-02-09T15:08:28.434Z","_status":"published"},{"id":2,"title":"Beyond the Chatbot: Why 2026 is the Threshold of AGI","slug":"beyond-the-chatbot-why-2026-is-the-threshold-of-agi","excerpt":"It’s February 2026, and the \"AI hype\" has officially evolved into something far more tangible—and a little more intimidating. We’ve moved past the era of simple prompt-and-response chatbots. Today, we are standing on the precipice of Artificial General Intelligence (AGI).\n\nBut what does that actually mean for us?","content":{"root":{"type":"root","format":"","indent":0,"version":1,"children":[{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Beyond the Chatbot: Why 2026 is the Threshold of AGI","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"It’s February 2026, and the \"AI hype\" has officially evolved into something far more tangible—and a little more intimidating. We’ve moved past the era of simple prompt-and-response chatbots. Today, we are standing on the precipice of Artificial General Intelligence (AGI).","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"But what does that actually mean for us?","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Narrow AI vs. General Intelligence","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"For years, we lived in the world of Narrow AI. These systems were specialists: they could beat you at chess, diagnose a rare skin condition, or generate a stunning portrait of a cat in a tuxedo. However, they lacked the \"common sense\" to transfer skills between domains.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"AGI is the \"holy grail\"—a system capable of understanding, learning, and applying intelligence across any intellectual task a human can do. In 2026, we aren't just looking at smarter models; we’re looking at Agentic Systems. Unlike the \"forgetful\" models of 2024, today’s agents possess:","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Persistent Memory: They remember your goals from last month and build on them.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"Cross-Domain Synthesis: They can apply principles from fluid dynamics to solve a logistics bottleneck.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"World Models: They no longer just predict the next word; they simulate physical reality to understand cause and effect.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"The 2026 Reality Check","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"While some purists argue we haven't reached \"true\" AGI (the kind that can out-philosophize a human over coffee), the practical threshold has been crossed. We are seeing Agent Fleets manage entire R&D pipelines and AI solving mathematical proofs that stumped us for decades.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"We’ve shifted from Generative AI (creating content) to Executable Intelligence (achieving goals). The challenge now isn't just \"can it do the task?\" but \"how do we ensure it stays aligned with human values?\"","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[],"direction":null,"textStyle":"","textFormat":0},{"type":"paragraph","format":"","indent":0,"version":1,"children":[{"mode":"normal","text":"The \"Singularity\" might still be a moving target, but in 2026, the gap between machine and mind has never been thinner.","type":"text","style":"","detail":0,"format":0,"version":1}],"direction":null,"textStyle":"","textFormat":0}],"direction":null}},"tinymceContent":null,"coverImage":null,"author":{"id":2,"name":"Hito","updatedAt":"2026-02-09T14:39:27.275Z","createdAt":"2026-02-09T14:39:27.275Z","email":"hiep.todinh@optimizely.com","sessions":[],"collection":"users"},"categories":[],"tags":[],"publishedAt":"2026-02-10T12:00:00.000Z","seo":{"title":null,"description":null,"image":null},"updatedAt":"2026-02-13T14:14:18.692Z","createdAt":"2026-02-09T14:56:44.095Z","_status":"published"}],"hasNextPage":false,"hasPrevPage":false,"limit":10,"nextPage":null,"page":1,"pagingCounter":1,"prevPage":null,"totalDocs":7,"totalPages":1}