# Medium

Stories from the team building Medium. - Medium

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## How we think about text classification in the LLM era

DevFeed: [How we think about text classification in the LLM era](<https://devfeed.tech/articles/how-we-think-about-text-classification-in-the-llm-era-20322.md>)

Original publisher: [Read original article](<https://medium.engineering/how-we-think-about-text-classification-in-the-llm-era-89a185f79b68?source=rss----2817475205d3---4>)

Author: Raphael Montaud

Published: 2026-08-19T20:00:37Z

Content type: article

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [Machine Learning & Artificial Intelligence](<https://devfeed.tech/topics/machine-learning-artificial-intelligence.md>), [Model Development](<https://devfeed.tech/topics/model-development.md>), [LLM Techniques](<https://devfeed.tech/topics/llm-techniques.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [AI Inference](<https://devfeed.tech/topics/ai-inference.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [classification](<https://devfeed.tech/tags/classification.md>), [inference](<https://devfeed.tech/tags/inference.md>), [llm](<https://devfeed.tech/tags/llm.md>), [llms](<https://devfeed.tech/tags/llms.md>), [machine-learning](<https://devfeed.tech/tags/machine-learning.md>), [model](<https://devfeed.tech/tags/model.md>), [models](<https://devfeed.tech/tags/models.md>), [recommendation-system](<https://devfeed.tech/tags/recommendation-system.md>), [text-classification](<https://devfeed.tech/tags/text-classification.md>)

### AI overview

Medium explains how it is evaluating LLM-based text classification for updating its aging NSFW model while retaining task-specific machine-learning models. The article states that Snowflake LLM tools were used for inference only and that Medium's user data was not used to train the models.

### Source excerpt

Why we think LLMs can be useful and why we will not replace all of our models with themContext At Medium, we have many Machine Learning models that we use to label stories automatically. These affect what stories we recommend to readers. Here's some examples: a few of our text classification models. All diagrams and charts made by the authorSome Clarifications on our Machine Learning policy Before we go deep on this project, I just wanted to clarify a few things about how we stand regarding AI in general. Medium has been training internal models with user and post data for a long time now. We train models with specific tasks. For example, models that power our recommendations algorithm, or text classification models like the ones presented in this story. All in the goal to improve our product. With the LLM approach I describe in this story, we ARE NOT sharing these models with other companies. And we ARE NOT allowing anyone to train on our users' data and content. Here we used Snowflake LLM tools for inference only (no LLM training was done here) and they are actually hosting all of the models inside their own infrastructure and guarantee that they are not using any of this for training. Shoutout to the Snowflake team for making it so easy and safe to use LLMs on our data! If you want to read more about Medium's stance on AI, I definitely recommend giving these a read: Default No to AI Training on Your Stories Finally, an internet standard for writers' rights vs. AI companies We want your feedback: How can writers use AI to tell human stories? Problem During our roadmap planning we decided that our NSFW model was out of date and it was time to revamp it. This model labels stories as "Not Safe for Work" if they have sexually explicit content, lots of profanity, or basically anything you wouldn't want to read on your big monitor in the middle of an open space! As you can imagine it's a pretty important model. We really need it to make sure our most "interesting" conte

## How we built the new Table of Contents feature

DevFeed: [How we built the new Table of Contents feature](<https://devfeed.tech/articles/how-we-built-the-new-table-of-contents-feature-20320.md>)

Original publisher: [Read original article](<https://medium.engineering/how-we-built-the-new-table-of-contents-feature-c3825d8c279d?source=rss----2817475205d3---4>)

Author: Scott Batson

Published: 2026-07-23T14:28:55Z

Content type: article

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [Chrome extension](<https://devfeed.tech/topics/chrome-extension.md>), [data](<https://devfeed.tech/topics/data.md>), [Usability](<https://devfeed.tech/topics/usability.md>), [Code](<https://devfeed.tech/topics/code.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [chrome-extension](<https://devfeed.tech/tags/chrome-extension.md>), [code](<https://devfeed.tech/tags/code.md>), [extension](<https://devfeed.tech/tags/extension.md>), [feature](<https://devfeed.tech/tags/feature.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [programming](<https://devfeed.tech/tags/programming.md>), [software-development](<https://devfeed.tech/tags/software-development.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [usability](<https://devfeed.tech/tags/usability.md>), [web-development](<https://devfeed.tech/tags/web-development.md>)

### AI overview

The article explains how Medium built a dynamic Table of Contents feature for its editor. It compares the approach of an existing Chrome extension, which inserts a static list into a post, with Medium's approach of generating the table of contents from the post body at render time so revisions remain reflected automatically.

### Source excerpt

How a feature goes from idea to prototype to shipped For years, there's been this really popular Chrome extension for adding a table of contents to your Medium stories. Props to Vinicius De Antoni for writing a popular chrome extension all those years go. The extension was so popular, we even wrote about it in our Medium Handbook. How to make a table of contents for your Medium story The fact that it was so popular was a signal to me. There was a decent size of our user base that wanted this feature. So, at first I set out to just copy it. The Chrome extension extends the popup menu we have in the editor to add a new option. Just a styled button on the existing list. const inject = () => { const tooltipToggleMenu = document.querySelector( "[data-action=inline-menu]", ); const tooltip = document.querySelector(".inlineTooltip"); const tooltipMenu = document.querySelector(".inlineTooltip-menu"); const addEmbedButton = document.querySelector( ".inlineTooltip-menu [title='Add an embed']", ); if (!tooltip || !tooltipToggleMenu || !tooltipMenu || !addEmbedButton) { return; } tooltip.style.width = "auto"; const toCButton = document.querySelector("[data-action='inline-menu-toc']"); if (toCButton) { return; } const handleAddToCClick = (e) => { const container = document.querySelector(".is-selected"); tooltipToggleMenu.click(); container.innerHTML = generate().join("
"); setTimeout(() => { simulateKeydown(container, 13); }, 0); }; const addToCButton = addEmbedButton.cloneNode(true); const title = "Add a Table of Contents"; addToCButton.setAttribute("title", title); addToCButton.setAttribute("aria-label", title); addToCButton.setAttribute("data-action", "inline-menu-toc"); addToCButton.setAttribute( "data-action-value", "Generate a table of contents", ); addToCButton.setAttribute("data-default-value", "Table of contents"); addToCButton.innerHTML = "⋮"; addToCButton.style.color = "rgb(26, 137, 23)"; addToCButton.style.border = "1px solid"; addToCButton.style.fontWeight = "bo

## Outcomes we want to see from AI at Medium Engineering

DevFeed: [Outcomes we want to see from AI at Medium Engineering](<https://devfeed.tech/articles/outcomes-we-want-to-see-from-ai-at-medium-engineering-20325.md>)

Original publisher: [Read original article](<https://medium.engineering/outcomes-we-want-to-see-from-ai-at-medium-engineering-10891d52a19f?source=rss----2817475205d3---4>)

Author: Jacob Bennett

Published: 2026-05-26T15:33:52Z

Content type: article

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Code quality](<https://devfeed.tech/topics/code-quality.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Code review](<https://devfeed.tech/topics/code-review.md>), [migration](<https://devfeed.tech/topics/migration.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [ai-agent](<https://devfeed.tech/tags/ai-agent.md>), [code-quality](<https://devfeed.tech/tags/code-quality.md>), [migration](<https://devfeed.tech/tags/migration.md>), [review](<https://devfeed.tech/tags/review.md>), [software-development](<https://devfeed.tech/tags/software-development.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This Medium Engineering article describes the outcomes Medium wants from AI adoption: reducing repetitive work, improving test coverage and maintainability, accelerating learning across unfamiliar parts of the stack, enabling broader technical contributions, and supporting more rigorous planning and risk reduction.

### Source excerpt

This was originally written and published by Christophe Spy (Director of Engineering, Medium) as an internal Medium Eng post. Desired outcomes (what "good" looks like) 🙏🏻 These are the kinds of changes we want to see if AI is going well at Medium. Less drudgery, more leverage Engineers use AI to remove repetitive, low-leverage work (e.g. tedious refactors, boilerplate, large test suites), not just to ship more tickets. We see examples like: "We took a part of the codebase that was basically untestable and, with AI, made it testable and added meaningful coverage in days instead of months." "We cleaned up a legacy area we had been afraid to touch for years, using AI for the mechanical work." Faster learning and broader technical range Engineers use AI to ramp on new languages, frameworks, and parts of the stack much more quickly. Engineers can explore unfamiliar areas safely by asking AI to explain tradeoffs, pitfalls, risks, and how the system uses this areas of the code. We see fewer cases where work stalls or we avoid implementing things because "nobody knows this code anymore". Frontend/mobile engineers are able to make safe, reviewable backend changes with AI's help (plus a review from a backend engineer). Teams can ship more end-to-end features without long handoffs. Higher technical ambition, not just more speed Teams take on work that used to be "too expensive": Meaningful test coverage in critical areas. Pieces of M2 migration or other large refactors. Structural cost savings. Incident/action items evolve from "add an alert" to "Let's improve tests here". Engineers use AI pre-work to explore edge cases and tradeoffs (design rigor). Better planning, reasoning, and risk reduction: Engineers use AI to think through complex scenarios before building, exploring edge cases, stress-testing assumptions, and comparing multiple approaches, and better understand the pros and cons of each approach Design docs become more rigorous as AI is used to challenge thinking and l

## How we improved image download sizes on Medium with just four characters

DevFeed: [How we improved image download sizes on Medium with just four characters](<https://devfeed.tech/articles/how-we-improved-image-download-sizes-on-medium-with-just-four-characters-20321.md>)

Original publisher: [Read original article](<https://medium.engineering/how-we-improved-image-download-sizes-on-medium-with-just-four-characters-9621b0ebb291?source=rss----2817475205d3---4>)

Author: Scott Batson

Published: 2026-05-18T15:29:29Z

Content type: article

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [Web Development](<https://devfeed.tech/topics/web-development.md>), [HTML](<https://devfeed.tech/topics/html.md>), [Image](<https://devfeed.tech/topics/image.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [Server-side rendering](<https://devfeed.tech/topics/server-side-rendering.md>), [Angular](<https://devfeed.tech/topics/angular.md>), [Ember](<https://devfeed.tech/topics/ember.md>), [Single-page application (SPA)](<https://devfeed.tech/topics/spa.md>)

Tags: [angular](<https://devfeed.tech/tags/angular.md>), [html](<https://devfeed.tech/tags/html.md>), [image](<https://devfeed.tech/tags/image.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [programming](<https://devfeed.tech/tags/programming.md>), [render](<https://devfeed.tech/tags/render.md>), [server-side-rendering](<https://devfeed.tech/tags/server-side-rendering.md>), [technology](<https://devfeed.tech/tags/technology.md>), [time](<https://devfeed.tech/tags/time.md>), [web-development](<https://devfeed.tech/tags/web-development.md>)

### AI overview

The article explains how modern HTML image features, including <picture> and srcset, can select images based on browser capabilities, screen dimensions, file types, layout, and color-scheme preferences. It contrasts these features with older JavaScript-based approaches to serving optimized images.

### Source excerpt

HTML images just got better, with the subtlest change to your codebasePhoto by Adi Suyatno I know what you're thinking. Scott, I landed on Medium on a small but not mobile-small display and the download chunk related to images in my home feed was like 7% smaller. First of all, thank you for noticing. Second, what if I told you that you too can improve your total asset download size by adding just four characters to your code base? Sounds too good to be true, right? Well, I'm here to tell you, it's true... after I explain how we got here. The history of images on the web As a web developer, you've probably spent a lot of time thinking about and fighting with images. According to the HTTP Archive, even in today's modern landscape of "JavaScript everywhere" the majority of most website's transfer size is images. We've moved away from the "hero image on every page" ethos, but still we're an image-heavy internet. When I was getting my start in web development in 2010ish, we were still adapting to a "mobile-friendly" world. The majority of the web was built on WordPress. We didn't have a way back then to dynamically load an optimized image. 3G connections were the primary speed in the US for viewing the internet, so the practice was images "need to work on mobile" regardless of the user's device. For those of us writing Angular and Ember (because React wasn't a thing yet), you had to legitimately render the correct src based on context you could get from JavaScript. {{#if browserSmal}} <img src="image-high-res.jpg" /> {{else}} <img src="image-med-res.jpg" /> {{/if}} This is back when we wrote handlebars for our markup and the web was filling up with SPAs with no server-side-rendering. We did it this way because HTML lacked a way for specifying how we wanted to optimize images. Then in 2012, RICG introduced 2 new specs for image optimization, with 2 different use cases: <picture> elements and srcset. Picture Elements I love the <picture> element. It gives us a lot of control

## Making AI Write Android Code Our Way: A Practical Guide to Agent Skills

DevFeed: [Making AI Write Android Code Our Way: A Practical Guide to Agent Skills](<https://devfeed.tech/articles/making-ai-write-android-code-our-way-a-practical-guide-to-agent-skills-20323.md>)

Original publisher: [Read original article](<https://medium.engineering/making-ai-write-android-code-our-way-a-practical-guide-to-agent-skills-4e7b085d8e50?source=rss----2817475205d3---4>)

Author: Pierrick CAEN

Published: 2026-03-17T08:25:04Z

Content type: tutorial

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [Android skills](<https://devfeed.tech/topics/android-skills.md>), [Agent Skills](<https://devfeed.tech/topics/agent-skills.md>), [AI Agent](<https://devfeed.tech/topics/ai-agent.md>), [cursor](<https://devfeed.tech/topics/cursor.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>)

Tags: [agent](<https://devfeed.tech/tags/agent.md>), [agent-skills](<https://devfeed.tech/tags/agent-skills.md>), [ai](<https://devfeed.tech/tags/ai.md>), [ai-coding](<https://devfeed.tech/tags/ai-coding.md>), [android](<https://devfeed.tech/tags/android.md>), [coding](<https://devfeed.tech/tags/coding.md>), [cursor](<https://devfeed.tech/tags/cursor.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [skills](<https://devfeed.tech/tags/skills.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>)

### AI overview

A Medium Android team describes how it uses AGENTS.md and reusable agent skills to encode project architecture, coding conventions, testing practices, and workflows for AI-assisted Kotlin development. The article focuses on making generated code follow the team's established patterns.

### Source excerpt

Generated by DALL-E Turning knowledge into reusable AI agent instructions for a small, fast-moving team. We're a small Android team at Medium, just a handful of engineers maintaining and evolving the Medium Android app. Our codebase follows Clean Architecture with Kotlin, Jetpack Compose, Hilt, Apollo GraphQL, and a growing number of feature modules. Like most Android teams, we have strong opinions about how code should be structured: where ViewModels get their data, how analytics events flow, how feature flags are checked, what a "new screen" looks like from Fragment to preview function. The problem? Those opinions lived in PR review comments, Slack threads, and the heads of engineers who'd been around long enough to know the patterns. When AI coding assistants arrived, they could generate Kotlin code but not our Kotlin code. The output was generic. It missed our conventions, our component library, our testing style. Six months ago we started using Cursor as our companion IDE. What changed the game wasn't Cursor itself, it was skills and AGENTS.md: a way to encode our team's playbook so the AI follows it every time. This post walks through what we built, how we structured it, and what impact it's had. The Foundation: AGENTS.md as Project Context Before skills, we wrote an AGENTS.md file at the root of our Android project. Think of it as a README for the AI, a document that's automatically loaded into context whenever any Agents works on our code. Our AGENTS.md covers: Architecture overview: Module structure (data, domain, design, feature modules), layer responsibilities Key patterns: How we do dependency injection (Hilt), state management (StateFlow + SharedFlow), navigation (centralized Router), repository pattern (Apollo + Result<T>) Conventions: Compose best practices, ViewModel patterns, testing strategy Common commands: Gradle tasks for building, testing, and running Detekt This gives Agent baseline awareness of our project. When it generates a ViewModel, it a

## We're Hiring a Principal Backend Engineer to Shape the Future of Medium

DevFeed: [We're Hiring a Principal Backend Engineer to Shape the Future of Medium](<https://devfeed.tech/articles/we-re-hiring-a-principal-backend-engineer-to-shape-the-future-of-medium-20326.md>)

Original publisher: [Read original article](<https://medium.engineering/were-hiring-a-principal-backend-engineer-to-shape-the-future-of-medium-a0d7896b3717?source=rss----2817475205d3---4>)

Author: Michael Margolis

Published: 2025-10-22T17:19:00Z

Content type: article

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [Back end](<https://devfeed.tech/topics/backend.md>), [systems](<https://devfeed.tech/topics/systems.md>), [Code](<https://devfeed.tech/topics/code.md>), [debugging](<https://devfeed.tech/topics/debugging.md>)

Tags: [architecture](<https://devfeed.tech/tags/architecture.md>), [backend](<https://devfeed.tech/tags/backend.md>), [backend-development](<https://devfeed.tech/tags/backend-development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [hiring](<https://devfeed.tech/tags/hiring.md>), [medium](<https://devfeed.tech/tags/medium.md>), [remote](<https://devfeed.tech/tags/remote.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [us](<https://devfeed.tech/tags/us.md>)

### AI overview

Medium is recruiting a Principal Backend Engineer to lead the evolution of its core backend, which supports reading, writing, and discovery. The role includes modernizing the codebase, setting engineering standards, mentoring, and hands-on systems work, and is fully remote in the US.

### Source excerpt

When I joined Medium, it was because I still believe in the internet as a place for ideas. Not noise, not outrage, but content that connects people through shared curiosity. Medium's mission is to deepen understanding and spread ideas that matter. We're building the best place for reading and writing online: A space that rewards clarity, authenticity, and craft over clickbait and engagement hacks. That vision only works if the technology beneath it is as thoughtful as the writing above it. That's where you come in. Yes, you! Photo by Yannick Pulver on UnsplashThe Role We are starting the search for a Principal Backend Engineer at Medium, our most senior IC level and a leadership position at the company. In this role, you will lead the evolution of Medium's core backend, the systems that power reading, writing, and discovery for millions of users every day. This is a deeply hands-on, high-impact role. You'll help craft the strategy for where we want to be as an engineering organization on the backend, and be accountable for the quality, standards, and evolution of the Medium backend platform. You will: Partner with engineering, design, data, and executive leadership to define and deliver the future of Medium. Make our platform not just reliable, but genuinely delightful to build on. Modernize a large, living codebase so our teams can move faster and ship with confidence. Lead through influence by setting standards, reviewing critical code and designs, and mentoring engineers across teams. Shape how we build, ensuring our architecture, practices, and systems are strong, scalable, and aligned with Medium's long-term goals. Balance vision with execution by building, debugging, and refining systems yourself to model technical excellence and thoughtful engineering craft. And you can do this work wherever you do your best thinking, whether that's a home office, a beachside Airbnb, a rainy coastal cabin in the Pacific Northwest, or your favorite café with great Wi-Fi and ev

## Medium Android App -- Migrating from Apollo Kotlin 3 to 4: Lessons Learned

DevFeed: [Medium Android App -- Migrating from Apollo Kotlin 3 to 4: Lessons Learned](<https://devfeed.tech/articles/medium-android-app-migrating-from-apollo-kotlin-3-to-4-lessons-learned-20324.md>)

Original publisher: [Read original article](<https://medium.engineering/medium-android-app-migrating-from-apollo-kotlin-3-to-4-lessons-learned-ff8d0d861cdb?source=rss----2817475205d3---4>)

Author: Pierrick CAEN

Published: 2025-10-06T08:18:42Z

Content type: tutorial

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [GraphQL](<https://devfeed.tech/topics/graphql.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Android](<https://devfeed.tech/topics/android.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Cache](<https://devfeed.tech/topics/cache.md>), [IntelliJ IDEA](<https://devfeed.tech/topics/intellij-idea.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [apollo-client](<https://devfeed.tech/tags/apollo-client.md>), [cache](<https://devfeed.tech/tags/cache.md>), [error-handling](<https://devfeed.tech/tags/error-handling.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [gradle-plugin](<https://devfeed.tech/tags/gradle-plugin.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [intellij](<https://devfeed.tech/tags/intellij.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [migration](<https://devfeed.tech/tags/migration.md>)

### AI overview

This article describes Medium's migration of its Android app from Apollo Kotlin 3 to 4. It explains the app's use of Apollo's normalized cache, CacheFirst fetching, and watch() for UI updates, then covers identifier changes, revised exception handling, and cache-miss errors encountered during the migration.

### Source excerpt

Photo by Mario Verduzco on UnsplashMedium Android App -- Migrating from Apollo Kotlin 3 to 4: Lessons Learned In this post, I'll share my experience migrating the Medium Android app from Apollo Kotlin version 3 to version 4, including the challenges I encountered and how I solved them to improve our GraphQL implementation. Understanding Our Apollo Cache Implementation Before diving into the migration, it's important to understand how we use Apollo's cache in the Medium Android app. Our app relies heavily on Apollo's normalized cache for several critical purposes: Performance Optimization: We use FetchPolicy.CacheFirst as our default strategy, which means we always try to serve data from the cache first before making network requests. This significantly reduces loading times and provides a smooth user experience, especially when users navigate between screens that display similar content. Real-time Updates: We use Apollo's watch() functionality extensively to observe cache changes and automatically update our UI when data changes. This is particularly useful for features like: Live clap counts on posts Real-time follower updates Post viewed updates and more... Starting the Migration The initial plan was straightforward: update Apollo Kotlin from version 3 to 4. The IntelliJ plugin made this process seem simple at first glance. Key Changes in Apollo Kotlin 4 Group id / plugin id / package name: Apollo Kotlin 4 uses a new identifier (com.apollographql.apollo) for its maven group id, Gradle plugin id, and package name. This change from com.apollographql.apollo3 allows running version 4 alongside version 3 if needed. Source: Apollo Kotlin Migration Guide - Group id / plugin id / package name Exception handling: Apollo 4 has a new way of handling exceptions. Instead of throwing exceptions directly, they're now passed through ApolloResponse. Source: Apollo Kotlin Migration Guide -- Fetch errors do not throw ApolloCompositeException: In Apollo Kotlin 3, when both cache and netw

## Engineering stories behind the Medium Daily Digest Algorithm: Part 2

DevFeed: [Engineering stories behind the Medium Daily Digest Algorithm: Part 2](<https://devfeed.tech/articles/engineering-stories-behind-the-medium-daily-digest-algorithm-part-2-20318.md>)

Original publisher: [Read original article](<https://medium.engineering/engineering-stories-behind-the-medium-daily-digest-algorithm-part-2-c977ad0b134f?source=rss----2817475205d3---4>)

Author: Raphael Montaud

Published: 2025-08-28T11:31:36Z

Content type: article

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [Algorithm](<https://devfeed.tech/topics/algorithm.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Databases](<https://devfeed.tech/topics/databases.md>)

Tags: [algorithm](<https://devfeed.tech/tags/algorithm.md>), [bloom-filter](<https://devfeed.tech/tags/bloom-filter.md>), [database](<https://devfeed.tech/tags/database.md>), [dynamodb](<https://devfeed.tech/tags/dynamodb.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [migration](<https://devfeed.tech/tags/migration.md>), [recommendation-system](<https://devfeed.tech/tags/recommendation-system.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>)

### AI overview

Medium explains how it reduced the cost and maintenance burden of filtering for its Daily Digest by replacing Bloom Filters with user-based direct database queries. The article is part of a four-part series about incremental improvements to the recommendation algorithm.

### Source excerpt

How we made our filtering 10x cheaper by removing our Bloom Filters Bloom Filters are great tools to make fast and cheap filtering. They also come with plenty of problems and can easily get expensive and cumbersome. We switched to user-based direct database queries, which made our filtering cheaper and easy to maintain. Here's the full breakdown of that migration. Intro: This is a 4-part series breaking down improvements to the algorithm behind the Medium's Daily Digest over the past year. When we started this work, the Digest was suboptimal -- and since it's a huge distribution surface, reaching millions of readers every day, we started working on incremental improvements.By the end of these projects, the digest was 10% more likely to convert users to paying members, less expensive to run, more flexible and easier to maintain and it's now providing higher quality recommendations for all our users, including our "power readers".This is told through the lens of our engineering team tackling a series of challenges one by one. Medium has a small team but we operate on a big scale. We're working our way through some technical debt and at the same time, striving to provide the best experience for our readers. This is the source of many interesting challenges.I hope this series helps you understand how the recommendations algorithm work and can help others who are facing similar technical challenges. This is probably the most technical story in the series, but I will keep it as simple as possible and hopefully this is interesting for non-technical readers too. Some Concepts Here's a little cheat sheet with some concepts you may need to follow along with this story You may need this to understand the rest of this postBloom Filters at Medium A lot of the filters I mention in this series are backed by Bloom Filters (I've described some of those filtering rules in Part 1 if you haven't read it already). We use Bloom filters to remove stories we think won't interest readers fro

## Engineering stories behind the Medium Daily Digest Algorithm: Part 1

DevFeed: [Engineering stories behind the Medium Daily Digest Algorithm: Part 1](<https://devfeed.tech/articles/engineering-stories-behind-the-medium-daily-digest-algorithm-part-1-20317.md>)

Original publisher: [Read original article](<https://medium.engineering/engineering-stories-behind-the-medium-daily-digest-algorithm-part-1-909a7ca5e807?source=rss----2817475205d3---4>)

Author: Raphael Montaud

Published: 2025-08-26T11:31:37Z

Content type: article

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [recommendation systems](<https://devfeed.tech/topics/recommendation-systems.md>), [Machine learning](<https://devfeed.tech/topics/machine-learning.md>), [Algorithms](<https://devfeed.tech/topics/algorithms.md>)

Tags: [algorithm](<https://devfeed.tech/tags/algorithm.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [machine-learning](<https://devfeed.tech/tags/machine-learning.md>), [model](<https://devfeed.tech/tags/model.md>), [recommendation-system](<https://devfeed.tech/tags/recommendation-system.md>), [recommendations](<https://devfeed.tech/tags/recommendations.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [technical](<https://devfeed.tech/tags/technical.md>)

### AI overview

This engineering article begins a four-part series about improving Medium's Daily Digest recommendation algorithm. It describes a mismatch between recommendations in the Digest and the homepage feed, despite both using the same algorithm, model, and features, and introduces an investigation into differences in filtering.

### Source excerpt

How we made our email story recommendations better In this Part 1, you'll understand how we improved one of the main ways our users are exposed to our product and how that led to a massive 7% increase on the average reading time for the digest users. Intro: This is a 4-part series breaking down improvements to the algorithm behind the Medium's Daily Digest over the past year. When we started this work, the Digest was suboptimal -- and since it's a huge distribution surface, reaching millions of readers every day, we started working on incremental improvements.By the end of these projects, the digest was 10% more likely to convert users to paying members, less expensive to run, more flexible and easier to maintain and it's now providing higher quality recommendations for all our users, including our "power readers".This is told through the lens of our engineering team tackling a series of challenges one by one. Medium has a small team but we operate on a big scale. We're working our way through some technical debt and at the same time, striving to provide the best experience for our readers. This is the source of many interesting challenges.I hope this series helps you understand how the recommendations algorithm work and can help others who are facing similar technical challenges.Some Concepts Here's a little cheat sheet with some concepts you may need to follow along with this story You may need this to understand the rest of this postThe Discovery A little while back, Leigh, our Machine Learning Engineer and model training guru, started noticing something weird. The recommended stories in his digest were consistently not great matches for his reading profile. At the same time, the recommended stories in his homepage feed (what we call the "For You" feed) were consistently very well targeted. This was a bit puzzling and unexpected. Those two recommendation surfaces rely on exactly the same algorithm. We source stories the same way, and we rank them using the same mo

## Engineering stories behind the Medium Daily Digest Algorithm: Part 4

DevFeed: [Engineering stories behind the Medium Daily Digest Algorithm: Part 4](<https://devfeed.tech/articles/engineering-stories-behind-the-medium-daily-digest-algorithm-part-4-20319.md>)

Original publisher: [Read original article](<https://medium.engineering/engineering-stories-behind-the-medium-daily-digest-algorithm-part-4-ec7136f21acd?source=rss----2817475205d3---4>)

Author: Raphael Montaud

Published: 2025-08-25T18:31:30Z

Content type: article

Language: en

Sources: [Medium](<https://devfeed.tech/sources/medium.md>)

Topics: [Algorithm](<https://devfeed.tech/topics/algorithm.md>), [data](<https://devfeed.tech/topics/data.md>)

Tags: [algorithm](<https://devfeed.tech/tags/algorithm.md>), [daily](<https://devfeed.tech/tags/daily.md>), [database](<https://devfeed.tech/tags/database.md>), [improvements](<https://devfeed.tech/tags/improvements.md>), [issue](<https://devfeed.tech/tags/issue.md>), [machine-learning](<https://devfeed.tech/tags/machine-learning.md>), [programming](<https://devfeed.tech/tags/programming.md>), [recommendation-system](<https://devfeed.tech/tags/recommendation-system.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [technical](<https://devfeed.tech/tags/technical.md>)

### AI overview

This engineering article examines how Medium investigated repetitive Daily Digest recommendations reported by power users and made incremental improvements to the underlying algorithm. The series reports that the work improved conversion to paying memberships by 10%, reduced operating costs, and made the system more flexible and maintainable.

### Source excerpt

Cross-Digest diversification In this part 4, we'll see how we went from investigating a few complaints from digest power users to improving our digest recommendations across the board. Intro: This is a 4-part series breaking down improvements to the algorithm behind the Medium's Daily Digest over the past year. When we started this work, the Digest was suboptimal -- and since it's a huge distribution surface, reaching millions of readers every day, we started working on incremental improvements.By the end of these projects, the digest was 10% more likely to convert users to paying members, less expensive to run, more flexible and easier to maintain and it's now providing higher quality recommendations for all our users, including our "power readers".This is told through the lens of our engineering team tackling a series of challenges one by one. Medium has a small team but we operate on a big scale. We're working our way through some technical debt and at the same time, striving to provide the best experience for our readers. This is the source of many interesting challenges.I hope this series helps you understand how the recommendations algorithm work and can help others who are facing similar technical challenges.Some Concepts Here's a little cheat sheet with some concepts you may need to follow along this story You may need this to understand the rest of this postUser Complaints After we shipped all the changes mentioned in the previous installments of this series, we started seeing some support tickets coming in related to the digest: User complaints that started off our investigation I think we should appreciate the level of thoughtfulness our users put in those support tickets. We review those carefully and we take pride in reading and answering every support tickets. Those were forwarded to the recommendation team and we immediately thought that maybe we oversteered to much when we removed some of the filtering rules for the digest. User digests were too repet