<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Flat Pack Tech - Medium]]></title>
        <description><![CDATA[We are known for our flat packs, our big blue stores and our Swedish meatballs. Now we want to tell you about our digital products, our agile ways of working and our tech innovations. Welcome! - Medium]]></description>
        <link>https://medium.com/flat-pack-tech?source=rss----7cd7bbcfe7f3---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Flat Pack Tech - Medium</title>
            <link>https://medium.com/flat-pack-tech?source=rss----7cd7bbcfe7f3---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 01:59:42 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/flat-pack-tech" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[The hidden decision behind every delivery promise: Understanding Order Promising & Allocation]]></title>
            <link>https://medium.com/flat-pack-tech/the-hidden-decision-behind-every-delivery-promise-understanding-order-promising-allocation-95930e79e779?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/95930e79e779</guid>
            <category><![CDATA[order-promsing]]></category>
            <category><![CDATA[retail]]></category>
            <category><![CDATA[order-management-system]]></category>
            <category><![CDATA[supply-chain]]></category>
            <category><![CDATA[order-allocation]]></category>
            <dc:creator><![CDATA[Prasanna Giddannanavar]]></dc:creator>
            <pubDate>Mon, 17 Aug 2026 09:34:46 GMT</pubDate>
            <atom:updated>2026-08-17T09:34:44.860Z</atom:updated>
            <content:encoded><![CDATA[<p><em>“Delivery by Friday!”</em></p><p>We have all seen it.</p><p>You order a Billy bookcase on Monday. The eCommerce website confidently tells you that it will arrive by Friday. You don’t think twice about it.</p><p>But behind the simple promise lies one of the most complex decision making problems, in retail and supply chain technology.</p><p>That delivery date is not picked at random! It isn’t based only on whether the item is in stock. And it certainly isn’t someone in a warehouse manually checking inventory before you click <strong>Place Order</strong>.</p><p>Before you even complete your purchase, the retailer’s Order Promising engine has already answered two critical questions:</p><ul><li><strong>Can we realistically deliver this order by Friday?</strong></li><li><strong>If yes, where should we fulfill it from?</strong></li></ul><p>These two decisions are known as <strong>Order Promising</strong> and <strong>Order Allocation</strong>.</p><p>Although customers rarely notice them, they play a huge role in shaping the shopping experience.</p><h3>Isn’t inventory enough?</h3><p>A common assumption is that if an item is available, the retailer can simply promise a delivery date.</p><p>If only it were that simple.</p><p>Imagine a retailer has the same product available in three locations:</p><ul><li>A warehouse 300 km away</li><li>A nearby store</li><li>Another distribution center that’s already operating at full capacity</li></ul><p>Technically, the item is available. But can it still be delivered by Friday? That depends on more than inventory.</p><p>The system needs to consider warehouse operating hours, order cut-off times, carrier transit times, holidays, processing capacity and several business rules before it can confidently commit to a delivery date. In other words, the delivery date shown to the customer is a solved outcome — not just an inventory lookup.</p><p>This is where <strong>Order Promising</strong> begins.</p><h3>What is Order Promising?</h3><p>At its core, Order Promising answers one simple question:</p><p><strong><em>“What is the earliest date we can confidently promise this order to the customer?”</em></strong></p><p>It’s not about showing the fastest possible date. It’s about showing a date that the business can realistically meet.</p><p>To make that decision, an Order Promising engine evaluates multiple operational factors together, such as:</p><ul><li>Inventory availability</li><li>Warehouse calendars</li><li>Order release cut-off times</li><li>Processing capacity</li><li>Carrier transit times</li><li>Delivery service levels</li><li>Business rules and shipping constraints</li></ul><p>None of these factors alone determine the answer. Together, they do!</p><p>That’s why Order Promising is a decision making process rather than a simple calculation.</p><h3>Making a promise is only half the decision</h3><p>Once the system knows <strong>when</strong> it can deliver the order, another question immediately follows.</p><p><strong>Where should the order be fulfilled from?</strong></p><p>This is where <strong>Order Allocation </strong>comes in.</p><p>Suppose the product is available in three different fulfilllment locations. Which one should the retailer choose?</p><p>The closest location may seem like the obvious answer.</p><p>But what if that store has only one unit left, while another customer plans to collect it in person?</p><p>What if shipping from that location costs significantly more?</p><p>What if another warehouse has plenty of stock and can still meet the same delivery promise?</p><p>Order Allocation evaluates these trade-offs to find the best fulfillment location. Factors such as inventory availability , distance, cost and operational considerations influence the decision.</p><p>The objective isn’t simply to ship the order. It’s to fulfill the promise in the most efficient and sustainable way!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8bIL2ACn-n0iqawuinsfPw.jpeg" /></figure><h3>Why these decisions matter?</h3><p>From a customer’s perspective, a delivery date is just information.</p><p>From a retailer’s perspective, it’s a commitment!</p><p>Every promise influences customer expectations, warehouse planning, logistics schedules and operational execution. Once the promise is made, the business is expected to execute its operations around meeting that commitment.</p><p>An inaccurate promise can lead to:</p><ul><li>Disappointed customers</li><li>Increased support calls</li><li>Higher shipping costs</li><li>Order cancellations</li><li>Loss of customer trust</li></ul><p>Ironically, customers rarely remember when a retailer delivers exactly as promised. But they almost always remember when that promise is broken!</p><h3>More than just software!</h3><p>As software engineers, we often think about APIs, databases, integrations and microservices.</p><p>Retail technology reminds us that some of the hardest engineering problems are not purely technical. They are business decisions translated into software.</p><p>Every delivery date displayed on an eCommerce website represents hundreds of operational rules, constraints and calculations working together in the background.</p><p>Thats what makes Order Promising and Order Allocation so fascinating. They are not just Retail supply chain fetaures. They are decision engines that balance customer expectations with operational reality!</p><h3>Final Thoughts</h3><p>The next time you see “<em>Delivery by Friday</em>”, remember that it isn’t just a date. Its the result of numerous decisions made in milliseconds.</p><p>A good promise isn’t simply optimistic. It’s realistic!</p><p>And behind every realistic promise is an Order Promising engine making one of the most important decisions in the retail supply chain.</p><p><em>When you shop online, do you think retailers are becoming better at keeping delivery promises, or do you still experience missed delivery dates? I would love to hear your thoughts!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=95930e79e779" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/the-hidden-decision-behind-every-delivery-promise-understanding-order-promising-allocation-95930e79e779">The hidden decision behind every delivery promise: Understanding Order Promising &amp; Allocation</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How far can we push the needle of quality in AI-generated translations?]]></title>
            <link>https://medium.com/flat-pack-tech/how-far-can-we-push-the-needle-of-quality-in-ai-generated-translations-a858608c5c58?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/a858608c5c58</guid>
            <category><![CDATA[translation-services]]></category>
            <category><![CDATA[language-translation]]></category>
            <dc:creator><![CDATA[Johan Sporre]]></dc:creator>
            <pubDate>Mon, 06 Jul 2026 06:59:14 GMT</pubDate>
            <atom:updated>2026-07-06T06:59:12.641Z</atom:updated>
            <content:encoded><![CDATA[<p>I hear a great deal of people telling me that if you add context, you will get better AI-generated texts. The question I ask myself is how much?</p><p>We have a well-working infrastructure in this area, but can this be better and more cost-efficient?</p><p>I started an AI-evaluation benchmarking with my team. It was questioned! Why should we do this and what should we get out of it? My answer was that we should know that we have an informed decision for the future:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Mg-a8xZhvV3hzu6PBFaNoA.png" /></figure><p>We divided the work into two phases:</p><p>Phase 1. We shared a small Translation Memory in six languages and sent complete files for translation from the TMS via a built proprietary orchestration for AI-text generation to the API of the provider.</p><p>Phase 2. We shared style guides, an extraction of terminology, and sent the domain information in the API-call.</p><p>The evaluating evaluation provider assessed the quality of each segment by Accuracy, Grammar, Readability, Style and Adherence. The assessments were made by linguists and AI. The ranking of the four dimensions where equally weighed and the linguist assessment was favored in relation to the AI assessment.</p><p>It was loads of work both from a communication and technical perspective, as we had numerous providers involved.</p><p>These were the lessons identified:</p><p>- The result was good already in Phase 1, most providers delivered translations with good readability and minor errors.</p><p>- The providers scored close together, with a narrow overall range.</p><p>- Different providers were good in different languages.</p><p>- There was quite a great deal of differences in how to access services by API which consumed time in engineering and communication.</p><p>- The selection of languages showed that language coverage varies between providers.</p><p>- What concerned me the most was the small improvements from Phase 1 to Phase 2. I had expected a more significant increase. The providers and we invested quite a lot of time.</p><p>- TMS forces sentence-level segmentation across the process, which does not support full text translations, i.e., not taking full advantage of the LLMs.</p><p>- It is a challenge that TMSs don’t provide any information beyond the segments to be translated.</p><p>- We have developed a proprietary orchestration enabling us to select different providers, engines or models of AI-generated texts.</p><p>This is where I should come up with a conclusion, but I won’t. I have more questions:</p><p>- Is the way we are used to training engines value adding? What if there are enterprise engines or open-source models out of the box that provide sufficient quality.</p><p>- What is the quality needed of the text generation for our co-workers and customers?</p><p>- If we add more data, how far will we push the needle and get better quality? Where is there a trade-off/break-even?</p><p>- Is one provider enough to cover all languages?</p><p>I have an old friend who said: “Most of the lessons learned are not learnt, they are just identified. It is not until you do the same thing again and you apply the lessons identified that they get lessons learned”.</p><p>We will pursue our path of digging the Language Lake and finding the right solution for the Language Generator with these lessons identified to make them learned.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qFPUuN2kEuHURclXM0tkhg.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a858608c5c58" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/how-far-can-we-push-the-needle-of-quality-in-ai-generated-translations-a858608c5c58">How far can we push the needle of quality in AI-generated translations?</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Understanding AI: Five Key Concepts to Get Ahead]]></title>
            <link>https://medium.com/flat-pack-tech/understanding-ai-five-key-concepts-to-get-ahead-5f432bf9c45f?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/5f432bf9c45f</guid>
            <category><![CDATA[personal-growth]]></category>
            <category><![CDATA[generative-ai-use-cases]]></category>
            <category><![CDATA[token]]></category>
            <category><![CDATA[computer-science]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Debapriya Basu]]></dc:creator>
            <pubDate>Thu, 09 Apr 2026 07:01:21 GMT</pubDate>
            <atom:updated>2026-04-09T07:01:19.520Z</atom:updated>
            <content:encoded><![CDATA[<p>While exploring Google’s <a href="https://www.skills.google/paths/1951">Gen AI Leader certification</a>, I came across several key concepts that I’ve also started applying in our recent in-house CRM development. The goal is to make the system more intelligent and capable, ultimately enhancing coworkers’ efficiency in-store and enabling them to support customers more intuitively throughout their buying journey.</p><p>In today’s rapidly evolving AI landscape, many discussions tend to be either overly technical or too abstract to be practical. However, understanding a few fundamental concepts can make a significant difference in how effectively AI is understood and applied whether in technology, business, education, or everyday curiosity about the future.</p><p>This document highlights five essential concepts; tokens, context window, temperature, hallucination, and retrieval-augmented generation (RAG). Together, these provide a solid foundation for navigating and leveraging AI with greater confidence and clarity.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OZRe3bfIoMjseF-Mp6sKfQ.png" /><figcaption>Generated by Napkin.ai</figcaption></figure><h3>1. Tokens</h3><p>The first concept to grasp is that AI models do not read words or letters; they read tokens.</p><h3>What is a Token?</h3><p>Think of tokens as chunks of text. A token can be a complete word, part of a word, or even punctuation. For instance, the sentence “I love pizza” can be broken down into three tokens: “I,” “love,” and “pizza.”</p><h4>Why Tokens Matter</h4><p>Every AI product, such as ChatGPT or Claude, processes tokens behind the scenes. The more tokens you send, the more the model has to process, which can increase operational costs. The model’s context window — the number of tokens it can hold in memory at once — also plays a crucial role. Older models might handle 4,000 tokens, while newer ones can manage over a million. This limitation explains why AI sometimes forgets earlier parts of a long conversation; once the context window fills up, the oldest tokens are discarded.</p><p>Understanding tokens is essential for crafting effective prompts and managing the AI’s memory limitations during interactions.</p><h3>2. Context Window</h3><p>The context window is akin to a person’s memory during a conversation. It defines how much text, measured in tokens, an AI model can consider at one time.</p><h4>The Whiteboard Analogy</h4><p>Imagine a whiteboard where you can write anything you want. However, once it’s full, you must erase something old to make space for new information. A small context window (e.g., 4,000 tokens) limits the AI to a few pages of text, while a large context window (e.g., 200,000 tokens) allows for entire books.</p><h4>Practical Implications</h4><p>When working on tasks like summarizing long documents or analyzing data, be aware that your AI might forget earlier parts of the conversation. This limitation is not a bug; it’s simply a function of the context window.</p><h3>3. Temperature</h3><p>Temperature is a setting that influences the randomness or predictability of an AI’s output.</p><h4>Low vs. High Temperature</h4><ul><li><strong>Low Temperature (closer to 0)</strong>: The AI opts for the most likely, expected words, resulting in consistent but somewhat dull outputs.</li><li><strong>High Temperature (closer to 1 or beyond)</strong>: The AI takes risks, producing surprising and creative responses, though not always useful for factual tasks.</li></ul><h4>When to Adjust Temperature</h4><p>For factual tasks like summarizing or coding, a low temperature is preferable for precision. Conversely, for creative tasks such as writing fiction or brainstorming, a higher temperature can yield more interesting results. While many consumer apps set this dial to a middle ground, understanding how to adjust it can enhance your AI interactions.</p><h3>4. Hallucination</h3><p>Hallucination refers to instances when an AI confidently provides incorrect answers, presenting them as facts.</p><h4>Why Hallucination Occurs</h4><p>AI language models do not function as databases; they predict the next most likely token based on learned patterns. When they lack information, they generate plausible-sounding but incorrect answers. The danger lies in the AI’s confidence, which can mislead users.</p><h4>Practical Takeaway</h4><p>Always verify facts, statistics, or advice obtained from AI, especially in critical areas like health or law. Understanding hallucination allows you to use AI more intelligently, treating it as a starting point rather than a definitive source.</p><h3>5. Retrieval-Augmented Generation (RAG)</h3><p>RAG is a concept that many misunderstand but is crucial for effective AI applications.</p><h4>What is RAG?</h4><p>RAG combines retrieval and generation. Traditional AI models are limited to the data they were trained on, which may not include recent or specific information. RAG solves this by breaking documents into chunks and storing them in a vector database that understands meaning.</p><h4>How RAG Works</h4><p>When you ask a question, the system retrieves the most relevant chunks from the database and feeds them to the AI along with your query. This process allows the AI to generate answers based on up-to-date and contextually relevant information.</p><h4>Importance of RAG</h4><p>RAG is foundational for many AI products, enabling them to provide accurate and context-aware responses. Understanding this concept helps you appreciate how AI tools work and what limitations they may have.</p><h3>Conclusion</h3><p>As AI continues to permeate various sectors, understanding these five key concepts; tokens, context window, temperature, hallucination, and RAG, will set you apart from those who merely skim the surface. You don’t need to be an engineer or a coder; a basic understanding of these terms will enhance your ability to use AI effectively.</p><p>By mastering these concepts, you position yourself in the top 10% of individuals who can navigate the complexities of AI with confidence. Welcome to a deeper understanding of the technology shaping our future.</p><h4>Usefull links</h4><p><a href="https://www.skills.google/paths/1951">Generative AI Leader Certification</a></p><h3>What’s Next</h3><p>I will sum up few more topics which I found interesting to look at. Let’s get learning🍀!</p><p>🙏<em> Thank you for reading to the end! </em><strong><em>Comment</em></strong><em> below or email me at </em><a href="/service/mailto:dbpr.sinha@gmail.com"><em>dbpr.sinha@gmail.com</em></a><em> if you have any questions. For more articles please stay tuned.</em></p><h3>Connect with me</h3><ul><li><a href="https://medium.com/@dbpr.sinha"><strong>Medium</strong></a></li><li><a href="https://www.linkedin.com/in/debapriya-basu-233b7881/"><strong>LinkedIn</strong></a></li><li><a href="https://www.instagram.com/the.techie.mommy/"><strong>Instagram</strong></a></li><li><a href="https://www.facebook.com/dbprbasu"><strong>Facebook</strong></a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5f432bf9c45f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/understanding-ai-five-key-concepts-to-get-ahead-5f432bf9c45f">Understanding AI: Five Key Concepts to Get Ahead</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Beyond the Bestsellers: How We’re Teaching IKEA’s Recommender to Think Differently]]></title>
            <link>https://medium.com/flat-pack-tech/beyond-the-bestsellers-how-were-teaching-ikea-s-recommender-to-think-differently-630f6dd63b4f?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/630f6dd63b4f</guid>
            <category><![CDATA[contrastive-learning]]></category>
            <category><![CDATA[product-discovery]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[retail]]></category>
            <category><![CDATA[recommender-systems]]></category>
            <dc:creator><![CDATA[Ezgi Yildirim]]></dc:creator>
            <pubDate>Tue, 31 Mar 2026 14:55:03 GMT</pubDate>
            <atom:updated>2026-03-31T18:53:10.694Z</atom:updated>
            <content:encoded><![CDATA[<p><em>By Vasileios Karlis, Ezgi Yıldırım, David Vos &amp; Maarten de Rijke</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zKYied6tzd_hQlEsSO4KRw.png" /></figure><h3>The Long-Tail Problem</h3><p>Our product catalogue is vast and wonderfully diverse — thousands of items across every room, style, and budget. Yet when we looked at what our recommender was actually surfacing to customers, the picture was stark: a small cluster of popular items was dominating the recommendations, while the majority of the catalogue barely got a look-in.</p><p>This is the <strong>long-tail phenomenon</strong>, and it’s endemic to recommendation systems. The mathematics behind it follow a power-law distribution — a tiny head of popular items captures most of the attention, while a long tail of equally worthy products languishes in obscurity.</p><p>This isn’t just a missed business opportunity. It’s a missed <em>customer</em> opportunity. Discovery is one of the most delightful parts of shopping. When a recommender only echoes back what’s already popular, it narrows the world rather than expanding it.</p><h3>How Our Recommender Works (The Short Version)</h3><p>Our existing system is a three-stage pipeline:</p><ol><li><strong>Product embeddings</strong> — We use a Word2Vec-style algorithm, but instead of learning from sequences of words, it learns from sequences of products that customers view. Each product ends up as a point in a rich, high-dimensional space where similar products cluster together.</li><li><strong>Session modelling with an LSTM</strong> — A neural network tracks your browsing session across devices and visits, predicting which product you’re most likely to add to your cart next. It’s trained to minimise the distance (in embedding space) between its prediction and the product you actually chose.</li><li><strong>Nearest neighbour search</strong> — Once the model has a predicted embedding, it finds the real products closest to that point in the catalogue and serves them as recommendations.</li></ol><p>The system works well for relevance. The problem is that “closest in embedding space” tends to gravitate towards popular items, because popular items are better represented in the training data. The rich get richer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nXFr-JMo23oZGp1MAf6N6g.png" /><figcaption>Where a few favorites get all the love — and the rest wait their turn</figcaption></figure><h3>Enter Contrastive Learning</h3><p>Our insight was to change <em>how the model learns</em>, not just what it recommends.</p><p>The key idea is <strong>contrastive learning with negative sampling</strong>. Instead of only training the model to move <em>towards</em> the right answer (the product a customer added to cart), we also train it to move <em>away</em> from carefully chosen wrong answers — the negative samples.</p><p>This is analogous to how we teach children to distinguish between concepts. You don’t just show a child pictures of cats; you also show them dogs and say “not this.” The contrast sharpens understanding.</p><p>We explored two approaches to selecting these negative samples:</p><p><strong>In-batch negative sampling</strong> treats other products in the same training batch as negatives. If you’re training on a session where someone bought a BILLY bookcase, other items being processed at the same time — a POÄNG chair, a KALLAX shelf — become the “not this” examples. We introduced a configurable cap on how many negatives to use, balancing learning signal against computational cost.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jpKKlHKsIMzwPT7EsKpavw.png" /><figcaption><em>(left) BILLY, (center) POÄNG, (right) KALLAX</em></figcaption></figure><p><strong>Adaptive top-k negative sampling</strong> goes a step further. Rather than using all available negatives, it dynamically selects the <em>hardest</em> ones — the products whose embeddings are most similar to the model’s current prediction. These are the confusable items, the ones where the model is most likely to go wrong. Training on these hard negatives forces the model to develop finer-grained discrimination.</p><h3>Rethinking the Loss Function</h3><p>Our existing system uses <strong>cosine similarity loss</strong> — it trains the model to maximise the similarity between its prediction and the true item. Simple, effective, but blind to diversity.</p><p>We extended this with two contrastive variants:</p><p><strong>Weighted loss</strong> adds a penalty term. For each negative sample, the model is penalised if its prediction is too similar to that negative. The strength of the penalty is controlled by hyperparameters <em>α</em> and <em>β</em>, letting us tune the trade-off between accuracy and diversity.</p><p><strong>Cross-entropy loss</strong> reframes the problem as classification: given the true item and <em>N</em> negative candidates, can the model identify the correct one? This formulation, inspired by SimCLR [1] and SimCSE [2] from the computer vision and NLP worlds, proved particularly powerful in our setting.</p><h3>What the Results Showed</h3><p>We evaluated our methods on two datasets: our own proprietary IKEA Netherlands data, and the publicly available RetailRocket benchmark. We measured both accuracy (NDCG@10 — how well the true item ranks in our recommendations) and diversity metrics (catalogue coverage and Gini Coefficient).</p><p>On the IKEA dataset, our best offline configuration — cross-entropy loss with 100 in-batch negatives — delivered:</p><ul><li><strong>+26.4%</strong> improvement in catalogue coverage</li><li><strong>+6.5%</strong> improvement in Gini Coefficient (a measure of how equitably recommendations are spread across the catalogue)</li><li><strong>+6.4%</strong> improvement in NDCG@10</li></ul><p>Critically, we weren’t trading accuracy for diversity. The model got <em>better</em> at recommending the right products <em>and</em> surfaced a much wider slice of the catalogue.</p><p>We then ran an <strong>online A/B test</strong> on the IKEA Netherlands website using the weighted loss with 100 in-batch negatives. The live results confirmed what offline evaluation suggested: <strong>+2.53% improvement in catalogue coverage</strong> and a <strong>+9.59% improvement in diversity</strong> over the baseline.</p><h3>Why This Matters</h3><p>A recommender that only amplifies what’s already popular is, in a subtle way, a recommender that’s stopped doing its job. The whole point of personalisation is to connect each customer with the right product for <em>them</em> — and that product might be sitting quietly in the long tail, waiting to be discovered.</p><p>For IKEA, this has real stakes. A broader recommendation distribution means:</p><ul><li><strong>Customers discover products</strong> they wouldn’t have found through search alone</li><li><strong>Newer or niche items</strong> get a fair chance to find their audience</li><li><strong>The shopping experience feels more alive</strong> — more like browsing a well-curated store than being handed a bestseller list</li></ul><p>The Gini Coefficient gives us a useful target to aim for. We want it in the range of [0.4,0.7]— a “softened” power-law where popular products remain visible (as they should; popularity is a signal of quality) but the tail is meaningfully surfaced. Not perfect equality, but genuine diversity.</p><h3>What’s Next</h3><p>This work opens several directions we’re excited to explore. Our next focus is on <strong>smarter negative sampling</strong> — not just selecting the hardest negatives for model performance, but identifying the most <em>informative</em> ones for learning efficiency. Training on the right negatives could let us achieve the same diversity gains with less computation, making the approach more scalable.</p><p>We’re also thinking about how to incorporate richer signals — product attributes, room contexts, style families — into the embedding space itself, so that the notion of “similar” and “different” better reflects what customers actually care about.</p><h3>A Note on the Research</h3><p>This work is a collaboration between IKEA Retail (Ingka Group) and the University of Amsterdam’s Information Retrieval Lab, as a part of IKEA’s internship program. It reflects the kind of industry-academia partnership that produces the most grounded, rigorous applied AI research.</p><p>The full paper is available on <a href="https://arxiv.org/abs/2602.08886">arXiv</a>.</p><h3><strong>References</strong></h3><p>[1] Chen, Ting, Simon Kornblith, Mohammad Norouzi, and Geoffrey Hinton. “A simple framework for contrastive learning of visual representations.” In <em>International conference on machine learning</em>, pp. 1597–1607. PmLR, 2020.</p><p>[2] Gao, Tianyu, Xingcheng Yao, and Danqi Chen. “Simcse: Simple contrastive learning of sentence embeddings.” In <em>Proceedings of the 2021 conference on empirical methods in natural language processing</em>, pp. 6894–6910. 2021.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=630f6dd63b4f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/beyond-the-bestsellers-how-were-teaching-ikea-s-recommender-to-think-differently-630f6dd63b4f">Beyond the Bestsellers: How We’re Teaching IKEA’s Recommender to Think Differently</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Design systems and shareable browser support]]></title>
            <link>https://medium.com/flat-pack-tech/design-systems-and-shareable-browser-support-8b2783597fec?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/8b2783597fec</guid>
            <category><![CDATA[design-systems]]></category>
            <category><![CDATA[web-performance]]></category>
            <category><![CDATA[browser-compatibility]]></category>
            <category><![CDATA[browserslist]]></category>
            <dc:creator><![CDATA[Robin Whittleton]]></dc:creator>
            <pubDate>Mon, 12 Jan 2026 10:43:59 GMT</pubDate>
            <atom:updated>2026-01-12T10:43:58.052Z</atom:updated>
            <content:encoded><![CDATA[<p>When we put together a design system, we typically spend a good chunk of that time building components that will live on the web. When we start doing that, there’s an obvious question to ask: what browsers will we support?</p><figure><img alt="A desk with a pot of pens, some scattered lego bricks, a couple of white boxes containing more lego, and a small lego house with a lego figure in a top hat, another in a red jumper, and a small lego palm tree." src="https://cdn-images-1.medium.com/max/1024/1*IOpmvDsKsxRAwhl8aGLFLw.jpeg" /></figure><p>Regardless of whether we choose to just support the latest evergreen browsers or to go back many versions, if we want to expose this to code the process is typically the same: we define a <a href="https://browsersl.ist/">browserslist</a> (and / or <a href="https://esbuild.github.io/api/#target">esbuild</a>) compatibility list. This allows us to specify in code the spread of browsers and versions we want to support, and expose it to various build systems. Feeding the browserslist configuration into something like <a href="https://babeljs.io/">Babel</a> or <a href="https://autoprefixer.github.io/">autoprefixer</a> will let it calculate whether it needs to add browser-specific workarounds for older systems you’re still targeting. The same goes for esbuild: it’s easily configured for specific target version numbers.</p><p>IKEA’s design system — Skapa — does just this. Looking at our browser statistics, we see mostly fairly modern browsers that are quickly updated; the outlier is older versions of Safari on IKEA.com. So we currently have this browserslist configuration for our design system build tooling:</p><pre>last 5 major versions and last 5 years,<br>Firefox ESR,<br>not Safari &lt; 15.4,<br>not iOS &lt; 15.4,<br>not op_mini all,<br>not dead</pre><p>Let’s deconstruct that. We start by requesting <a href="https://github.com/browserslist/browserslist#query-composition">the intersection</a> of the last five major versions and the last five years. For evergreen browsers (those that update quickly and regularly) that gives us around five to seven months worth of support: more than enough time for most systems to automatically upgrade. We also make sure we include <a href="https://www.firefox.com/en-GB/browsers/enterprise/">the enterprise release of Firefox which has longer support</a>. Then for Safari, we go back to 15.4: that version added a set of features like <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/mask">masking</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:focus-visible">focus-visible</a> that we want to have native support for. Finally, we disable support for very old browsers that would cost too much to support.</p><h3>Shipping this data</h3><p>Having this browser support matrix stored as code is a big benefit for Skapa, as changes to it can now be tracked over time, and it’s stored in one place. But if it’s a big benefit for Skapa, why shouldn’t it also be a big benefit for consuming teams? They are, after all, using Skapa patterns and components to build their own systems, so they might as well standardise on the same browser support if reasonable.</p><p>It turns out that this isn’t particularly difficult to do. A typical way to include browserslist is as a field in a project’s <a href="https://docs.npmjs.com/cli/configuring-npm/package-json">package.json</a> file, and this has a hidden super power: instead of directly listing the chosen browser configuration in package.json you can <a href="https://github.com/browserslist/browserslist#shareable-configs">tell browserslist to import it from an NPM package</a>. This means that as well as our components Skapa can ship a package that just exports the browserslist config. The package output then looks a little like this:</p><pre>module.exports = [<br> &#39;last 5 major versions and last 5 years&#39;,<br> &#39;Firefox ESR&#39;,<br> &#39;not Safari &lt; 15.4&#39;,<br> &#39;not iOS &lt; 15.4&#39;, <br> &#39;not op_mini all&#39;, <br> &#39;not dead&#39;,<br> ];</pre><p>Once this package has been imported as a dependency, then the compatibility data can be configured in as a key-value pair in package.json, like this:</p><pre>&quot;browserslist&quot;: [&quot;extends @ingka/browserslist-config&quot;]</pre><p>Given the simplicity of this approach, it was an obvious thing to ship out to Skapa’s consumers. They would then get the benefit of having their system’s browser support automatically updated to match the level the components they’re consuming have.</p><h3>Compatibility with esbuild</h3><p>While browserslist is supported by a wide range of different technologies, there’s a major exception: esbuild. Given its widespread and growing popularity — due to the performance benefits it can bring to the table — we need to make sure that our browser compatibility choices are made available to it.</p><p>Luckily for us, this is a solved problem: there are a few libraries that will translate a browserslist configuration to something that esbuild can consume. We can keep our browserslist configuration as the source of truth, and expose the automatic translation for esbuild consumers. We chose to do this with a new export called esbuild that’s included the same browserslist-config package.</p><p>For an example of how this is used, let’s look at <a href="https://vite.dev/">Vite</a>: a commonly used consumer of esbuild. In the standard vite.config.js configuration file, we can consume the browser support data by importing the package’s new export, and attaching it into Vite’s <a href="https://vite.dev/config/build-options#build-target">build.target configuration option</a>:</p><pre>import target from &quot;@ingka/browserslist-config/esbuild&quot;;<br><br>export default defineConfig({<br>  build: { target }<br>});</pre><p>This works in exactly the same way as the previous package.json method, and indeed both can be consumed if you have a mix of esbuild and browserslist tooling (Vite and <a href="https://sass-lang.com/">SASS</a> for example).</p><h3>Overall benefits</h3><p>We have already talked about how this process helps product teams align their own browser compatibility with that of the design system’s. There’s another positive side-effect though: the browserslist-config package becomes something that is gradually updated over time, meaning that consuming teams automatically follow the company-wide browser compatibility standard. Historically we’ve found many projects with es2015 or es6 set as the configuration: that’s a static level which leads to steadily increasing bundle sizes as more and more compatibility layers are automatically and silently added into the build. Tracking the design system’s baseline configuration helps to keep bundle sizes small and performance high.</p><p>To give specific data for that last point, a piece of JavaScript code that is shipped to the majority of IKEA.com users saw a drop in gzipped file size from 78KB to 34KB — a fall of over 55% — simply by configuring the build system to use the browserslist-config package instead of the previous single target of &#39;ie&#39;: 11.</p><p>Another benefit is that this configuration can be shipped as part of an app scaffolding system, meaning that teams starting new projects will automatically have access to the current and future browser support standards without having to lift a finger.</p><p>Of course, there’s nothing stopping a team that wants to own their own browser compatibility configuration from managing that themselves. Teams that know they will only be targeting the latest and greatest technologies, or teams that are consuming only simple components and want a longer support schedule, are welcome to configure this themselves. But starting with the default configuration and opting-out later when a need has been discovered is an easy choice.</p><p>Hopefully this has inspired you to investigate sharing your browser support matrix in your own design system. It’s a simple technique that leads to compatibility and performance benefits. I’d also love to hear if you’re doing anything similar or if there are ways you see that this could be improved.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8b2783597fec" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/design-systems-and-shareable-browser-support-8b2783597fec">Design systems and shareable browser support</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Liberate your language assets!]]></title>
            <link>https://medium.com/flat-pack-tech/liberate-your-language-assets-cafc4dae3724?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/cafc4dae3724</guid>
            <category><![CDATA[localisation]]></category>
            <category><![CDATA[digital-transformation]]></category>
            <category><![CDATA[content-strategy]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[translation]]></category>
            <dc:creator><![CDATA[Johan Sporre]]></dc:creator>
            <pubDate>Thu, 18 Dec 2025 15:31:03 GMT</pubDate>
            <atom:updated>2025-12-18T17:19:50.503Z</atom:updated>
            <content:encoded><![CDATA[<p>Back in 2018, when we first explored AI-generated translations, I used to wonder “How hard can it be to replace words?” What I quickly learned was that we weren’t just swapping words between languages; we were engaging with applied machine learning, a sophisticated blend of grammar and AI.</p><p>Today, I encounter similar questions in my organisation, albeit with a new twist: “Why do we need translation solutions when it’s all done ‘out of the box’?” or “Why pay for human review when an LLM can simply do it?” These moments transport me back to my 2018 self, unaware of the intricate complexity behind translation. I hadn’t grasped the advanced technology involved, the critical importance of localized texts crafted by linguists and supported by AI, nor the importance of the skills of our linguistic experts.</p><p>This journey has been transformative, introducing me to many co-workers and contacts who have illuminated the worlds of localisation, translation, and AI-driven text generation for me. It’s this learning journey that has led to the development of our “Liberation Playbook.”</p><p>Our foundational steps began in 2020 when my team Global Language Services implemented a traditional Translation Management System (TMS) at IKEA. This system was designed to combine artificial and human intelligence, offering essential capabilities like workflow management, text reuse, UI for review, and efficient file submission to translation agencies.</p><p>While some may question the decision today, I firmly believe it was the right first step. Centralizing assets, harmonizing workflows, and establishing robust processes are non-negotiable prerequisites for any scalable language strategy. This TMS provided the crucial infrastructure upon which we would build.</p><p>Following this, in spring 2022, we introduced a terminology solution and brought in a specialist to lead our efforts. The goal was clear: to provide linguists with precise keywords, ensuring the unmistakable IKEA tone of voice was consistent across all IKEA content. This initiative unveiled a new, vital area of learning for us.</p><p>We faced a significant challenge — our texts were locked within third-party solutions. This was fragmenting our content value chain and preventing us from leveraging valuable linguistic assets outside these systems.</p><p>Meanwhile, the landscape of machine translation at IKEA shifted dramatically between 2022 and 2023, largely thanks to the pioneering work of my Senior Software Engineer. She meticulously built IKEA MT, leveraging 24 Marian models from Hugging Face. During our tests, IKEA MT outperformed commercial alternatives for IKEA-specific content. Additionally, Her deep dive into our translation memories revealed a critical insight: despite style guide directives, the tone of voice in some of our translations was not always consistent.</p><p>Then, November 2022 brought the ChatGPT revolution, sending ripples of both excitement and apprehension through the entire localization community. We responded by conducting tests with Automated Post Editing (APE) in April 2023. While the results weren’t groundbreaking, they were undeniably interesting.</p><p>The fact that our language assets were locked inside the TMS and the new Terminology solution, preventing us from using these for quality enhancement purposes outside these systems, was making me uneasy. This prompted me to accept an invitation from a friend to submit a proposal to present in Leipzig in 2023 on “Language Technology Requirements to Serve Global Enterprise Business Needs.”</p><p>The evening before the conference, I was introduced by chance to the concept of “triples” — subject, predicate, and object — and their role in structured data. The conference keynotes further reinforced this, highlighting how knowledge graphs could significantly reduce hallucinations in Large Language Models (LLMs).</p><p>Inspired, I returned and tasked our data engineer, with diving into graph technology and building our Language Lake and its data pipelines. This was a new frontier for him, and his journey will be shared in a future article.</p><p>Our exploration continued into autumn 2024, when my Senior Software Engineer, alongside a senior AI-engineer from MLOPS, conducted a Proof of Concept (POC) on LLMs and Retrieval-Augmented Generation (RAG) using data from the Language Lake for Spanish and Korean. The results were satisfactory but didn’t significantly surpass traditional machine translation. My Senior Software Engineer’s keen observation stuck with me: “The challenge for LLMs is they tend to generalize. IKEA’s specific tone of voice and its unique style make it difficult for LLMs to mimic effectively.”</p><p>Building a robust knowledge graph presents its own set of challenges, particularly concerning data and metadata management, and how these can be leveraged for quality estimation and correction of translated texts.</p><p>In 2025, we initiated a POC focused on this, working with a substantial volume of English-to-Spanish and Spanish-to-English files. Several questions arose: should we index at a file or segment level when preparing content for LLMs? For instance, if content from e-learning solutions relates to “Kitchen,” should it be indexed as “Kitchen” or “e-learning”? This decision profoundly impacts how we generate, assess, and correct texts, and it’s an area we continue to explore.</p><p>Despite moments of FOMO when observing other enterprises’ LLM advancements, I’ve remained steadfast in my conviction: without a solid data structure, we will not achieve the desired results. This belief was strongly validated during my Cognitive Project Management for AI Enhanced (CPMAI+E) course, which emphasizes that 80% of any cognitive technology project’s success hinges on its data foundation. You can access the free introduction to this course to learn more.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/543/1*3H6Afoe4_rWF5OcmufhIBw.png" /><figcaption>Figure 1. The CPMAI phases. Source CPMAI Playbook.</figcaption></figure><h4>The language asset liberation playbook</h4><p>Below is a developed step‑by‑step path, mapped to CPMAI (Cognitive Project Management for AI) phases, to execute consistently, scale and secure success. I hope this can serve as inspiration for other enterprises to start this journey. The playbook is based on CPMAI playbook and coedited with CoPilot.</p><p>1. <strong>Frame the outcomes</strong> (CPMAI: Business Understanding)</p><ul><li>Define the measurable goals: time‑to‑market, cost avoidance, language coverage, quality uplift.</li><li>Prioritize use cases with clear owners: product copy, e-learning, store information, internal comms.</li><li>Establish governance: roles, decision rights, tone‑of‑voice stewardship, market co‑creation.</li></ul><p><strong>Deliverables:</strong> Business case, success metrics, use‑case backlog, governance charter.</p><p>2. <strong>Inventory of texts</strong> (CPMAI: Data Understanding)</p><ul><li>Map where content lives: TMS, CMS, PIM, design tools, portals, files.</li><li>Assess quality and provenance: who wrote it, who validated it, where is it used, how it performs.</li><li>Find gaps: missing languages, inconsistent tone, outdated glossaries, orphaned assets.</li></ul><p><strong>Deliverables:</strong> System/content map, asset catalogue, quality &amp; risk assessment.</p><p>3. a. <strong>Extract and normalize</strong> (CPMAI: Data Preparation)</p><ul><li>Extract texts via connectors/pipelines and/or exports; preserve metadata and structure.</li><li>Normalize into an interchangeable format (segmenting, markup, placeholders, variables).</li><li>Enrich with metadata (linguistic, business, technical) and link to the repository/ repositories.</li><li>De‑duplicate, align bilingual corpora, and apply quality labels.</li></ul><p><strong>Deliverables:</strong> Unified repository/repositories, metadata schema, enrichment pipelines, quality labels.</p><p>3. b.<strong> Dig the lake and build pipelines</strong> (CPMAI: Data Preparation and Solution Architecture)</p><ul><li>Dig the Language Lake(s): storage, indexing, graph layer, access controls.</li><li>Implement RAG retrieval tuned by domain, market, and tone.</li><li>Configure terminology services and style validators as reusable microservices.</li><li>Establish observability (usage, coverage, drift, quality).</li></ul><p><strong>Deliverables:</strong> Lake architecture, RAG services, terminology &amp; style APIs, monitoring dashboards.</p><p>4. a. <strong>Model &amp; generate</strong> (CPMAI: Modelling)</p><ul><li>Operationalise prompt frameworks that codify tone, values, and constraints.</li><li>Fine‑tune where proper on IKEA corpora; prefer retrieval grounding to reduce hallucinations.</li><li>Support source‑language flexibility and channel‑aware variants (micro copy vs long‑form).</li><li>Integrate human‑in‑the‑loop review flows with linguists/SMEs.</li></ul><p><strong>Deliverables:</strong> Generation services, prompt library, evaluation harness, reviewer workflows.</p><p>5. <strong>Evaluate &amp; ensure quality</strong> (CPMAI: Model evaluation)</p><ul><li>Define multi‑layer metrics: fluency, adequacy, terminology adherence, brand tone.</li><li>Mix automatic checks (terminology, grammar, style) with linguistic reviews.</li><li>A/B test against legacy baselines; track impact where measurable.</li><li>Create feedback loops from co‑workers, linguists, and customers into the lake.</li></ul><p><strong>Deliverables:</strong> Quality scorecards, release criteria, feedback pipelines, test results.</p><p>6. a. <strong>Deploy &amp; scale</strong> (CPMAI: Operationalisation)</p><ul><li>Integrate via APIs into CMS/PIM/service tooling; enable self‑service for teams.</li><li>Roll out progressively: Start with one content source to pilot markets expand to more and make it global; keep track of updates of texts.</li><li>Automate bundles per market.</li><li>Harden security &amp; compliance: data residency, PII handling, audit trails.</li></ul><p><strong>Deliverables:</strong> Production integrations, rollout plan, runbooks, risk &amp; compliance artifacts.</p><p>6. b. <strong>Operate, govern, and improve</strong> (CPMAI: Monitoring &amp; Continuous Improvement)</p><ul><li>Monitor language coverage, quality drift, and asset freshness.</li><li>Expand the lake with new assets, e.g. other CMS, types of content.</li><li>Periodically recalibrate tone and terminology with brand and markets.</li><li>Measure business impact continuously; retire low‑value legacy flows.</li></ul><p><strong>Deliverables:</strong> Operational dashboards, governance reviews, quarterly improvement roadmap.</p><h3>We iterate between step one, two and three in the playbook.</h3><p>Today, we are at in the data phases. One of GLS consumers were concerned that “the lake might freeze before it gets used”. We are moving slowly as we learn together with our partners. The infrastructure under construction is new to us and to others.</p><h3>Frame the outcomes</h3><p>- Evaluate the value proposition:</p><p>o Enhanced text generation in an optimised IKEA tone of voice in any language with less human interaction.</p><p>o How much better will it be than today and will the ROI be sufficient?</p><p>- Reduce the dependency of the Translation Management System and/or relations to siloed third party solutions.</p><p>- Generate domain information</p><p>- Transition from a solution-based value chain to a data driven one.</p><p>- Possibilities to do term extraction of source and target texts.</p><p>- Generate texts in existing and new locales.</p><p>- Any co-worker should be able to get and generate the texts they need in any language using self-service. (We are IKEA, you know. 😉)</p><h3>Inventory of our texts</h3><p>- We explore how to understand the data extracted from files from TMS. What does it look like and for what can we use it?</p><h3>Extract and normalize &amp; Dig the lake, and build pipelines</h3><p>- Where will the Language lake give us the most benefits?<br>- What will the APIs look like?<br>- How do we combine the Language lake with terminology?</p><p>I have one data engineer and one AI-engineer. With this we have been able to explore and learn and develop an MVP for few use cases in phase one to three. Think big, start small, and iterate.</p><p>Step four to six are more complex, i.e. the Language generator. These are the easiest ones to rush into and to slip on. The question for me is if we should buy or build? The most important is that we own the data/language assets and the access to it. It is the competitive advantage of IKEA. There is a lot of people and organisations that can do the modelling and generation better than my team.</p><p>Follow our process on how we envision the transition in the GIF below, from what we do today to tomorrow.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iA95f5_AG7bnM_-m9TuElA.gif" /></figure><p>In the next article(s) my Senior Software (data) engineer and a Field engineer from the Graph data base provider will share what they have done and do in step two and three.</p><p>Consider this series of articles as a do it yourself guide on what you can do to embrace the future and change from a cost centre to a value generator.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qFPUuN2kEuHURclXM0tkhg.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cafc4dae3724" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/liberate-your-language-assets-cafc4dae3724">Liberate your language assets!</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[English’s Dirty Little Secret: The “To Be” Bomb That Sabotages Your Engineering Brain]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/flat-pack-tech/englishs-dirty-little-secret-the-to-be-bomb-that-sabotages-your-engineering-brain-3d03585d467d?source=rss----7cd7bbcfe7f3---4"><img src="https://cdn-images-1.medium.com/max/759/1*rhnOkGtTa1a523CUsxtK4w.png" width="759"></a></p><p class="medium-feed-snippet">Oh, English, you sneaky seductress of syllables! But let&#x2019;s get real&#x200A;&#x2014;&#x200A;lurking in your grammar dwells a Trojan horse!</p><p class="medium-feed-link"><a href="https://medium.com/flat-pack-tech/englishs-dirty-little-secret-the-to-be-bomb-that-sabotages-your-engineering-brain-3d03585d467d?source=rss----7cd7bbcfe7f3---4">Continue reading on Flat Pack Tech »</a></p></div>]]></description>
            <link>https://medium.com/flat-pack-tech/englishs-dirty-little-secret-the-to-be-bomb-that-sabotages-your-engineering-brain-3d03585d467d?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/3d03585d467d</guid>
            <category><![CDATA[influence]]></category>
            <category><![CDATA[english-language]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[linguistics]]></category>
            <category><![CDATA[communication-skills]]></category>
            <dc:creator><![CDATA[Nik Diakov]]></dc:creator>
            <pubDate>Mon, 17 Nov 2025 10:14:19 GMT</pubDate>
            <atom:updated>2025-11-17T10:14:18.463Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[From flat pack to fluid language: IKEA’s journey to seamless multilingual communication]]></title>
            <link>https://medium.com/flat-pack-tech/from-flat-pack-to-fluid-language-ikeas-journey-to-seamless-multilingual-communication-3ab2454af989?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/3ab2454af989</guid>
            <category><![CDATA[knowledge-graph]]></category>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[localization]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[translation]]></category>
            <dc:creator><![CDATA[Johan Sporre]]></dc:creator>
            <pubDate>Thu, 13 Nov 2025 13:05:36 GMT</pubDate>
            <atom:updated>2025-11-14T12:14:20.501Z</atom:updated>
            <content:encoded><![CDATA[<p>IKEA, a brand synonymous with clever design and accessible home furnishings, operates on a global scale, serving customers and co-workers across 64 markets. This vast reach, however, has historically presented a significant challenge: effective and consistent multilingual communication.</p><p>For years, IKEA navigated a complex landscape of legacy translation technologies and manual processes, often leading to inconsistencies, delays, and resource inefficiencies. Today, IKEA is moving towards a future where AI-driven language generation ensures seamless communication in any language.</p><p><strong>The challenge: a multilingual maze</strong></p><p>• 70% of Ingka co-workers are only fluent in one language — we need to translate needed material to their language</p><p>• Translations are made on top of the job of the co-workers</p><p>• There is a vast number of producers of content who require content to be translated</p><p>• Coordination is missing between the producers of content and countries</p><p>• There is a lack of visibility over translations</p><p>• Translations are often overlooked in planning and budgeting</p><p><strong>The evolution: from manual to machine-assisted</strong></p><p>Recognising these challenges, Global Language Services (GLS) by Group Digital in Ingka Group, an internal IKEA service team, embarked on a mission to modernize language capabilities. The journey began with implementing Machine Translation for the IT Service Desk in 2018, supporting 19 languages within nine months. A key learning from this period was the realisation that existing texts were scattered across various solutions, countries, and agencies, highlighting a significant opportunity for improvement. This led to the rollout of a Translation Management System. GLS also took ownership of a Translation Management System for digital product labels and established governance around it. They developed “IKEA real-time translation,” an AI-powered machine translation service designed to maintain IKEA tone of voice.</p><p>GLS implemented solutions to support each use case based on a strategy based on self-service. (We are IKEA, you know. 😉):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uYECzfNOcc--nl25uDnR5g.png" /><figcaption>Figure 1. IKEA Language strategy.</figcaption></figure><p>IKEA Retail (Ingka Group) translates the intranet, Confluence and other co-worker facing solutions by AI. When there is a need of higher accuracy and/or transcreation a combination of human and artificial intelligence is used.</p><p>A key to success has been the change process to bring technology to the many co-workers. This has been guided by the principles below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_2m1nMEDaGuSuW0lgSF_5Q.png" /><figcaption>Figure 2. GLS design principles.</figcaption></figure><p>The impact of these initiatives has been substantial. GLS supports 45 adapted languages for machine translation and has implemented solutions in 42 countries, demonstrating a strong commitment to democratizing language services and reducing reliance on external translation agencies. This strategic shift has resulted in considerable cost avoidance, with millions of Euros saved annually by leveraging GLS solutions.</p><p>It has been an amazing journey in cooperation with Localisations specialists in the markets and our language service providers. We have reached a stage where we have a good combination of human and artificial intelligence. The numbers below show the size of our translation operation managed by ten full-time equivalents.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DeNNolEeApj_XhiGpj23GA.png" /><figcaption>Figure 3. GLS in numbers.</figcaption></figure><p>Still, we are not where we want to be.</p><p>One issue is the inconsistency of the translation process across different “customer meeting points”.</p><p>Another issue is that IKEA do not effectively capture localised versions of texts to use as a base for further generation of texts into other local languages.</p><p>Furthermore, GLS solutions lack the flexibility to easily switch source languages. The nature of the copy itself presented difficulties; it was often hard to translate and automate, with some expressions not having equivalents in many languages.</p><p>The sheer number of solutions within the customer journey, all requiring translation, meant that customers engaging with multiple phases on their journey might encounter various language experiences.</p><p>The vast number of content producers in several channels make it hard to visualise translation efforts.</p><p>Many existing solutions and users not utilising GLS mean they miss out on common processes and centralised text assets.</p><p><strong>The future: embracing the language generator powered by the language lake</strong></p><p>Looking ahead, Global Language Services vision is ambitious: “To enable IKEA customers and co-workers, to communicate in any language, in every market, in every meeting point” by 2030. The cornerstone of this future is “The Language Generator”, a disruptive concept that re-envisions texts as linguistic assets and data. This approach will leverage AI-generated translation, Generative AI, Knowledge Graph capabilities, and Retrieval Augmented Generation to optimise IKEA’s tone of voice in any language, augmenting human capabilities.</p><p>The Language Lake aims to combine and integrate all IKEA language assets, moving away from siloed text management. By extracting validated translations from third-party solutions and applying knowledge graphs, IKEA will create a comprehensive multi-lingual text database with metadata. This will allow for the generation and translation of text that is optimised for IKEA’s tone of voice, making any text available in any IKEA language, and offering customers and co-workers the flexibility to select their preferred language in any interaction.</p><p>This future-proof and scalable foundation will simplify architecture, streamline localisation processes, and enable a truly multi-language omnichannel experience. IKEA’s journey from harmonising existing processes to disrupting language handling entirely reflects one of our core-values “Different with a meaning”.</p><p>We are at the beginning of this new journey. This is the first article we write sharing our steps towards a future enabling a seamless multilingual communication for co-workers and customers.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qFPUuN2kEuHURclXM0tkhg.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3ab2454af989" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/from-flat-pack-to-fluid-language-ikeas-journey-to-seamless-multilingual-communication-3ab2454af989">From flat pack to fluid language: IKEA’s journey to seamless multilingual communication</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LangChain vs. LangGraph: From Simple Chains to Complex AI Agents]]></title>
            <link>https://medium.com/flat-pack-tech/langchain-vs-langgraph-from-simple-chains-to-complex-ai-agents-e6d47085d275?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/e6d47085d275</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[langchain]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[langgraph]]></category>
            <dc:creator><![CDATA[William Oliveira]]></dc:creator>
            <pubDate>Mon, 01 Sep 2025 14:43:31 GMT</pubDate>
            <atom:updated>2025-09-01T14:43:21.771Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D28UlP7HjSgxWf2wQqQpaA.png" /></figure><p>If you, like me, are new to the AI Agents world, you probably heard about LangChan and LangGraph. The thing is: if you didn’t have time before to learn more about these tools, you may be uncertain about what each one is and when to use it.</p><p>LangChain has become the go-to framework for chaining LLM calls with other components like APIs, databases, and document stores. It allows developers to move beyond simple prompts and build sophisticated, data-aware applications.</p><p>However, as applications become more complex, the simple, linear nature of LangChain’s “chains” can become a limitation. What if you need your application to loop, make decisions, and operate more like an autonomous agent?</p><p>This is where LangGraph comes in. It’s not a replacement for LangChain but a powerful extension built by the same team, designed specifically for creating complex, stateful, and cyclical applications.</p><p>Let’s dive into the core differences, see them in action with code, and understand them.</p><h3>Requirements</h3><p>If you want to run the code examples on your machine, you’ll need the following dependencies:</p><ul><li><a href="https://www.python.org/downloads/">Python 3.8+</a></li><li><a href="https://ollama.com/">Ollama</a> installed and running</li></ul><p>By leveraging Ollama, you can build and test these powerful patterns privately and cost-effectively on your hardware.</p><p>I use Visual Studio Code to type code, and its installed extensions already satisfy the needs for working with Python.</p><p>If you don’t know how to run the code examples, we have a session for doing it after the code.</p><h3>The Power of Sequential Chains: LangChain</h3><p>At its core, LangChain is designed to create Directed Acyclic Graphs (DAGs). Don’t let the term intimidate you. It simply means you are building a sequence of steps that flows in one direction, without loops. Think of it as a factory assembly line: an input goes in one end, passes through a series of stations, and a final output comes out the other end.</p><p>This structure is perfect for predictable, sequential tasks. A classic example is a Retrieval-Augmented Generation (RAG) pipeline:</p><p>Receive a user’s question. Fetch relevant documents from a database. “Stuff” the context from those documents into a prompt. Send the prompt to an LLM to generate an answer.</p><p>If you don’t know what RAG is, you can check this post: <a href="https://woliveiras.github.io/posts/understanding-rag-llm/">Understanding the RAG Pattern with LLMs</a>.</p><h3>LangChain Code Example: A Simple RAG Chain</h3><p>This example creates a simple RAG chain that answers questions based on a small piece of provided text, using Ollama to run both the chat model and the embeddings model locally.</p><pre>from langchain_core.prompts import ChatPromptTemplate<br>from langchain_core.output_parsers import StrOutputParser<br>from langchain_core.runnables import RunnablePassthrough<br>from langchain_community.vectorstores import FAISS<br>from langchain_ollama import ChatOllama, OllamaEmbeddings<br><br># 1. Set up the LLM and Embeddings model using Ollama<br># Make sure Ollama is running with the required models:<br># ollama pull llama3<br># ollama pull nomic-embed-text<br>llm = ChatOllama(model=&quot;llama3&quot;)<br>embeddings = OllamaEmbeddings(model=&quot;nomic-embed-text&quot;)<br><br># 2. Create a simple text source and Vector Store<br>text_chunks = [<br>    &quot;LangGraph is a library for building stateful, multi-actor applications with LLMs.&quot;,<br>    &quot;It extends the LangChain ecosystem and enables creating cyclical graphs.&quot;,<br>    &quot;LangChain is primarily used for creating linear sequences of LLM calls (chains).&quot;,<br>    &quot;You can use LangChain Expression Language (LCEL) to compose these chains.&quot;<br>]<br># Create a vector store from the text chunks<br># This will index the text chunks and allow for efficient retrieval<br>vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)<br>retriever = vectorstore.as_retriever(search_kwargs={&quot;k&quot;: 2})<br><br># 3. Create a Prompt Template<br>template = &quot;&quot;&quot;<br>Answer the question based only on the following context:<br>{context}<br>Question: {question}<br>&quot;&quot;&quot;<br>prompt = ChatPromptTemplate.from_template(template)<br><br># 4. Build the RAG Chain using LCEL<br>retrieval_chain = (<br>    {&quot;context&quot;: retriever, &quot;question&quot;: RunnablePassthrough()}<br>    | prompt<br>    | llm<br>    | StrOutputParser()<br>)<br><br># 5. Invoke the chain<br>question = &quot;What is LangGraph used for?&quot;<br>response = retrieval_chain.invoke(question)<br>retrieval_chain = (<br>    {&quot;context&quot;: retriever, &quot;question&quot;: RunnablePassthrough()}<br>    | prompt<br>    | llm<br>    | StrOutputParser()<br>)<br><br>print(&quot;Question:&quot;, question)<br>print(&quot;Answer:&quot;, response)<br><br>question_two = &quot;What is the main feature of LangChain?&quot;<br>response_two = retrieval_chain.invoke(question_two)<br><br>print(&quot;\nQuestion:&quot;, question_two)<br>print(&quot;Answer:&quot;, response_two)</pre><p>You can play with the text_chunks to see how things work.</p><h3>When Chains Aren’t Enough: LangGraph</h3><p>Complex tasks require reflection, tool usage, and decision-making. This requires loops and conditional logic, something a simple Directed Acyclic Graph (DAG) cannot handle. LangGraph models the application as a stateful graph, where nodes represent functions and edges define the next step based on the current state.</p><h3>LangGraph Code Example: A Local Agent with a Tool</h3><p>This example builds an agent that can decide whether to use a “search” tool or respond directly to the user. The logic is driven entirely by a local llama3 model running in Ollama.</p><pre>import operator<br>from typing import Annotated, TypedDict, List<br>from langchain_core.messages import BaseMessage, HumanMessage, AIMessage<br>from langchain_ollama import ChatOllama<br>from langgraph.graph import StateGraph, END<br><br># 1. Define the agent state<br>class AgentState(TypedDict):<br>    messages: Annotated[List[BaseMessage], operator.add]<br><br># 2. Define the graph nodes<br># 2.1 Main node that calls the LLM<br>def call_model(state: AgentState):<br>    &quot;&quot;&quot;Main node that calls the LLM.&quot;&quot;&quot;<br>    print(&quot;---CALLING MODEL---&quot;)<br>    response = llm.invoke(state[&quot;messages&quot;])<br>    return {&quot;messages&quot;: [response]}<br><br># 2.2 Tool node (mock)<br>def call_tool(state: AgentState):<br>    &quot;&quot;&quot;Simulated tool node.&quot;&quot;&quot;<br>    print(&quot;---USING TOOL---&quot;)<br>    tool_response = HumanMessage(<br>        content=&quot;The latest report indicates a 15% increase in market share. What should I do next?&quot;,<br>        name=&quot;tool_output&quot;<br>    )<br>    return {&quot;messages&quot;: [tool_response]}<br><br># 3. Conditional logic to decide the next step<br>def should_continue(state: AgentState) -&gt; str:<br>    &quot;&quot;&quot;<br>    Decides the next step. If the last LLM message includes &#39;search&#39;,<br>    calls the tool. Otherwise, ends the process.<br>    &quot;&quot;&quot;<br>    print(&quot;---ASSESSING NEXT STEP---&quot;)<br>    last_message = state[&quot;messages&quot;][-1]<br>    if isinstance(last_message, AIMessage) and &quot;search&quot; in last_message.content.lower():<br>        print(&quot;DECISION: Use Tool&quot;)<br>        return &quot;tool&quot;<br>    else:<br>        print(&quot;DECISION: End&quot;)<br>        return END<br><br># 4. Build the state graph<br># Make sure Ollama is running with the &#39;llama3&#39; model pulled.<br># ollama pull llama3<br>llm = ChatOllama(model=&quot;llama3&quot;, temperature=0)<br># Define the workflow using StateGraph<br>workflow = StateGraph(AgentState)<br>workflow.add_node(&quot;agent&quot;, call_model)<br>workflow.add_node(&quot;tool&quot;, call_tool)<br>workflow.set_entry_point(&quot;agent&quot;)<br>workflow.add_conditional_edges(<br>    &quot;agent&quot;,<br>    should_continue,<br>    {&quot;tool&quot;: &quot;tool&quot;, END: END},<br>)<br>workflow.add_edge(&quot;tool&quot;, &quot;agent&quot;)<br>app = workflow.compile()<br><br># 5. Run the graph with examples<br>def print_message_output(output):<br>    &quot;&quot;&quot;<br>    Pretty print the output for the user, showing only the message content in a readable way.<br>    &quot;&quot;&quot;<br>    messages = output.get(&#39;messages&#39;, [])<br>    for msg in messages:<br>        role = msg.__class__.__name__<br>        print(f&quot;[{role}]\n{msg.content}\n&quot;)<br><br>## EXAMPLE 1: Agent decides to end immediately<br>inputs_1 = {&quot;messages&quot;: [HumanMessage(content=&quot;What is the weather in Madrid?&quot;)]}<br>for output in app.stream(inputs_1, {&quot;recursion_limit&quot;: 5}):<br>    for key, value in output.items():<br>        print(f&quot;Output from node &#39;{key}&#39;:\n---&quot;)<br>        print_message_output(value)<br>        print(&quot;---\n&quot;)<br><br>## EXAMPLE 2: Agent decides to use a tool<br>inputs_2 = {&quot;messages&quot;: [HumanMessage(content=&quot;I need the latest market report. Can you perform a search?&quot;)]}<br>for output in app.stream(inputs_2, {&quot;recursion_limit&quot;: 5}):<br>    for key, value in output.items():<br>        print(f&quot;Output from node &#39;{key}&#39;:\n---&quot;)<br>        print_message_output(value)<br>        print(&quot;---\n&quot;)</pre><p>The function print_message_output is not necessary for running the model. I just added it here to make the output a bit more legible for us.</p><p>You can play with the inputs_1 and inputs_2 to check how the application will work.</p><h3>How to Run the Examples</h3><h3>Step 1: Download the Local Models</h3><p>Open your terminal and pull the models we’ll be using from Ollama’s registry. The nomic-embed-text model is for generating embeddings (vectorizing text), and llama3 is our chat model.</p><p>You can use the Visual Studio Code Terminal to do it.</p><pre>ollama pull llama3<br>ollama pull nomic-embed-textcopy</pre><h3>Step 2: Create a Project Folder and Virtual Environment</h3><p>It’s good practice to isolate your project’s dependencies. Virtual Env will help us isolate it.</p><p>On your opened terminal, type the following commands (one by one, please):</p><pre>mkdir langchain-langgraph-examples<br>cd langchain-langgraph-examples<br>python -m venv venv<br>source venv/bin/activate  # On Windows, use `venv\Scripts\activate`copy</pre><h3>Step 3: Install Required Libraries</h3><p>Install all the necessary packages. Note that we are installing langchain-ollama instead of the OpenAI-specific library, like we usually find in the documentation and blog post examples.</p><pre>pip install langchain langchain_core langchain_community langgraph faiss-cpucopy</pre><h3>Step 4: Run the Code</h3><p>Save each code block into its respective .py file (langchain_ollama_example.py and langgraph_ollama_example.py). Then, run them from your terminal.</p><p>Make sure the Ollama application is running first.</p><pre># Run the LangChain example<br>python langchain_ollama_example.py<br><br># Run the LangGraph example<br>python langgraph_ollama_example.pycopy</pre><p>You will see the output printed to your console, showing how each framework processes the requests using your local models.</p><h3>Conclusion: Which One Should You Use?</h3><p>To be direct:</p><ul><li>Use LangChain for building predictable, sequential workflows. It’s perfect for RAG, summarization, and other tasks that follow a clear, linear path.</li><li>Use LangGraph when you need your application to reason, plan, and loop. It’s the right choice for building complex agents, multi-step conversational models, or any process that requires dynamic, state-driven execution.</li></ul><h3>References</h3><ul><li>LangChain Documentation: <a href="https://python.langchain.com/">https://python.langchain.com/</a></li><li>LangGraph Documentation: <a href="https://langchain-ai.github.io/langgraph/">https://langchain-ai.github.io/langgraph/</a></li><li>Ollama: <a href="https://ollama.com/">https://ollama.com/</a></li></ul><p><em>Originally published at </em><a href="https://woliveiras.github.io/posts/langchain-vs-langgraph-from-simple-chains-to-complex-ai-agents/"><em>https://woliveiras.github.io</em></a><em> on June 27, 2025.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e6d47085d275" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/langchain-vs-langgraph-from-simple-chains-to-complex-ai-agents-e6d47085d275">LangChain vs. LangGraph: From Simple Chains to Complex AI Agents</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[IKEA – a house full of cards]]></title>
            <link>https://medium.com/flat-pack-tech/ikea-a-house-full-of-cards-eed0485854fa?source=rss----7cd7bbcfe7f3---4</link>
            <guid isPermaLink="false">https://medium.com/p/eed0485854fa</guid>
            <dc:creator><![CDATA[Jonatan Grönkvist]]></dc:creator>
            <pubDate>Wed, 27 Aug 2025 14:38:31 GMT</pubDate>
            <atom:updated>2025-08-27T15:39:25.604Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>Cards are everywhere – in dashboards, mobile apps, and retail sites. But building one that feels right? That’s not so simple…</strong></h3><figure><img alt="A collage of various IKEA promotional and informational cards, each showcasing different content types such as product advertisements, customer benefits, job opportunities, and seasonal campaigns. The cards vary in structure and interactivity, illustrating the broad and inconsistent use of the term “Card” — ranging from clickable offers to static informational blocks." src="https://cdn-images-1.medium.com/max/1024/1*2G65_kvvrT8fBeY-aaMNTg.png" /></figure><p>At IKEA, we set out to create a Card component that balances accessibility, style, and flexibility. Not just one Card, but several – similar in structure, yet distinct in purpose. Here’s how we approached it.</p><blockquote>At first glance, a Card seems straightforward –a layout with a title, a label, a body and maybe an image. Easy, right? <strong>Not quite. Not at IKEA.</strong></blockquote><h4>More than just a box</h4><p>Because our Card component is used across many teams and contexts, we needed something far more robust. It had to be flexible, highly customisable, and fully accessible. More than just a content container, it needed to be scalable, a component that could adapt to a wide range of use cases – without compromising on design or accessibility.</p><h4><strong>Research, iteration, and collaboration</strong></h4><p>From the start, we worked closely with our product teams to iterate, gather feedback, and refine our components.</p><p>At IKEA, the design system team values continuous dialogue. Product teams – our end users – bring invaluable insights and data that help us improve and adapt. While we know we can’t meet all teams’ needs, aiming for 80% coverage is a more realistic goal for a new component.</p><p>Real-world testing is a cornerstone of our process. We partnered with several product teams to understand their challenges, needs, and expectations for the new Card components.</p><figure><img alt="A Miro board from IKEA’s design system workshop, filled with images, colored sticky notes, and labeled sections like “To inspire,” “Functional,” and “Sales steering.” It explores what a Card should and shouldn’t be, ranging from inspirational to functional use." src="https://cdn-images-1.medium.com/max/1024/1*568fCYPBhi-hcMzyoN7dAQ.png" /><figcaption>One of the Miro boards from the design system team’s initial workshop. The aim was to explore and define what a Card should — and should not be at IKEA.</figcaption></figure><h4><strong>What even is a Card? </strong>🤔</h4><p>Our research revealed that the term Card means just about anything. And we do mean anything. We encountered everything from simple surfaces with a centered icon to non-clickable containers – all labelled “Card.” The definition had become so broad that it covered a wide range of interpretations, regardless of structure, interactivity, or content.</p><blockquote>Clearly, we needed to bring clarity and consistency.</blockquote><h4><strong>Our solution </strong>💡</h4><p>The existing version of our Card was stable and reusable. Teams could simply provide content, and the component handled the rest.</p><figure><img alt="A visual representation of IKEA’s updated Card component, showcasing its flexible layout and theme options. The card is split into two sections: a media container featuring an image of a cat with a pet house, and a content container displaying a “New” badge, label, title (“The life of pets at home”), subtitle, placeholder body text, and a call-to-action arrow icon. The design illustrates configurable elements." src="https://cdn-images-1.medium.com/max/1024/1*_gKWwfKA3iRhnDPEtDAmGg.png" /></figure><figure><img alt="Three IKEA cards titled “The life of pets at home,” showing layout variations: one with text only, one with a label and icon, and one with a dog image — demonstrating flexible media container options." src="https://cdn-images-1.medium.com/max/1024/1*rqxb9iY-p_jOSOCL9_caGA.png" /><figcaption>The new Card component offers flexible configuration options and can be displayed with or without a media container.</figcaption></figure><p>But as more use cases emerged, we realised background colour and more flexible layout options for content was a key factor for adoption. Different scenarios, market requirements and image content required different visual treatments. So, we introduced Card themes to extend the available brand colours that existed in the current Card component – predefined combinations with clear usage guidelines from the IKEA brand team.</p><p>To support even more alternatives, we also added an extended colour palette – a curated set of approved colours that maintain brand consistency while allowing teams to adapt to their needs. Since all colours are connected to the design system tokens – all components support dark and light mode automatically.</p><figure><img alt="A person holds a circular foam object toward the camera. Beside them, a green-themed card displays Swedish text about DAJLIEN, illustrating customizable background, foreground, and button styling in the new Card component." src="https://cdn-images-1.medium.com/max/1024/1*d0yv-keLV486FohWzNRSNw.png" /><figcaption>The content container of the new Card component supports multiple themes, including background and foreground colours, as well as button styling.</figcaption></figure><figure><img alt="A visual collection of feedback from IKEA product teams about the new Card component. Comments include praise for compatibility with existing designs, suggestions for larger fonts and spacing for in-store use, concerns about mobile carousel width, and ideas to reduce vertical space on mobile by adjusting heading size and icon button visibility. Teams also express enthusiasm for using the Compact card in new projects." src="https://cdn-images-1.medium.com/max/1024/1*uIAhWcgyFk1b1zV3vTQTLA.png" /><figcaption>A few examples of feedback from our product teams at IKEA.</figcaption></figure><h4><strong><em>Media container — adding more interactive content</em></strong></h4><p>Teams needed to support video playback, badges, commercial messages, and even shoppable image marker – all within the same space. So, the media container evolved from being a simple image slot into a dynamic, flexible canvas for rich, interactive content – without breaking the design.</p><figure><img alt="Three pet-themed IKEA cards titled “The life of pets at home,” featuring images of a dog on a cushion, a cat, and a dog with a toy priced at 0.00€, illustrating media containers with shoppable marker, image and video." src="https://cdn-images-1.medium.com/max/1024/1*yyM6UAmADDOvKQ5RKpDTTQ.png" /><figcaption>The media container within the Card component supports images, videos, and shoppable markers that link directly to product pages.</figcaption></figure><h4><strong>Accessibility-first design: Behind the scenes of the new Card development</strong></h4><p>Working on the new Card component was a truly insightful journey, especially when it came to accessibility. Since there’s no official pattern for Card components, we explored a wide range of community suggestions, best practices, and real-world implementations. This process helped us craft a solution tailored to our needs while staying true to inclusive design principles.</p><p>One of the most interesting challenges was achieving the correct keyboard interaction. To do this, we had to restructure the layout in our web implementations – a decision driven entirely by accessibility requirements. This change ensured that users navigating via keyboard could interact with the component in a logical and intuitive way.</p><p>The development process was highly collaborative. We prototyped and tested the component with several teams across IKEA, including vision impaired colleagues and members of the Accessibility team. Their feedback was invaluable in shaping a component that is not only functional and beautiful but also truly inclusive<em>.</em></p><figure><img alt="Two IKEA cards with a dog image and text about pet life. Labels show keyboard navigation steps for video media: 1. Card surface (link), 2. Video controls, 3. Out." src="https://cdn-images-1.medium.com/max/1024/1*-ZlhJ74EvBiIUKli4x8cjw.png" /><figcaption>Example of keyboard navigation when the media container has a video player. 1: Card surface (link), 2: Video controls, 3: Exit</figcaption></figure><h4><strong>Compact card: Simpler by design</strong></h4><p>We also saw the need for a simpler variant – something lightweight for basic content and navigation. That’s how the Compact Card was born: a streamlined component offering a clear entry point to more detailed information but taking less screen estate.</p><figure><img alt="Three Compact Cards from IKEA’s UTSADO Collection, each titled “The life of pets at home,” showing a cat in a tent, a dog with a toy, and two cats by a pet bed — demonstrating simple, regular, and inverse background styles." src="https://cdn-images-1.medium.com/max/1024/1*zDAU3BxWjrrEZ_YCcixLmA.png" /><figcaption>The new Compact Card is a simplified variant of the standard Card component, supporting only a label and heading as text content. It is available in three styles: simple, regular, and inverse backgrounds.</figcaption></figure><h4><strong>Text overlay card: Designed for expression and saving vertical space</strong></h4><p>After several requests a trending pattern emerged among product teams – cards with text on top of an image. To ensure consistency across product and services we introduced the Text overlay card — a card version aligned with product team’s needs – fulfilling accessibility requirements for a good text contrast.</p><p>With multiple gradient overlay levels that grows with the size of the text, text contrast is no longer a limitation. This version is currently in an experimental phase, and we’re excited to announce a new sub-variant: integration with our video player component.</p><p>This addition supports evolving market needs and enhances the storytelling potential of our Cards.</p><figure><img alt="Three pet-themed IKEA cards with text overlays on dog images, each labeled “New” or “Badge.” Gradient backgrounds enhance text contrast, illustrating the Text overlay card’s support for expressive design and video integration" src="https://cdn-images-1.medium.com/max/1024/1*XHyeCo1pqROjW_IuS4Dqvg.png" /><figcaption>The ability to overlay text on images helps conserve vertical space.</figcaption></figure><h4>Rollout and adoption</h4><p>Back in October 2024, our existing card component averaged around 106,000 package downloads per month across React, Vue, and Web Components. With such widespread usage –particularly among heavy users like our global CMS for content creators, internal tools, and product teams — we anticipated that adoption of the new card components would take time.</p><p>Previously, our support of the Card component was limited to React, Vue, and Web Components. However, with the latest release, we’ve expanded to include iOS and Android. This marks a significant step towards achieving a cohesive look and feel across all platforms and services, while also simplifying future updates.</p><p>As of late August 2025, we’ve reached an adoption rate for web of over 80% for the new card component. At this scale, adoption is a gradual process –and that’s perfectly normal.</p><p>We always release an alpha version in both code and Figma (our design tool) to catch bugs early and gather feedback before the official launch. This approach is a key reason why feature releases from the design system team may take a bit longer. It’s a deliberate process, focused on quality and collaboration.</p><h4>A design system is a living organism – it evolves with its users. And we’re committed to evolving with it. <strong>The Card journey is far from over. We’ll continue refining and expanding based on your feedback.</strong></h4><h4><strong>Stay tuned for more updates in our next post!</strong></h4><p><em>Written by:</em><br><strong>Aleksandar Ilic, Senior Android Engineer<br>Ivan Sofeski, Senior Software Engineer<br>Jonatan Grönkvist, Senior Design System Designer<br></strong><em>Skapa | IKEA digital design system</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=eed0485854fa" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flat-pack-tech/ikea-a-house-full-of-cards-eed0485854fa">IKEA – a house full of cards</a> was originally published in <a href="https://medium.com/flat-pack-tech">Flat Pack Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>