{"slug": "six-articles-200-views-so-i-read-the-feed-s-source-code", "title": "Six articles, 200 views. So I read the feed's source code.", "summary": "A developer who published six articles on DEV.to over two months received only about 200 total views, prompting an investigation into the platform's feed algorithm. By reading the open-source Forem code, the developer found that the relevance score is a product of multiple factors, with zero comments scoring 0.15 and two comments scoring 0.66, and that the age factor drops sharply after day seven. The developer concluded that the writing never got a real test due to the algorithm's design.", "body_md": "Six articles in two months. About 200 views. Total.\n\nHere is the full table, because a postmortem without numbers is just a mood:\n\n| # | Article | Views | Reactions | Comments |\n|---|---|---|---|---|\n| 1 | Coding agents should not hold write credentials | 58 | 1 | 5 |\n| 2 | Agent workflows need an impact boundary | 26 | 0 | 0 |\n| 3 | Blocked is not failed: agents need boundary feedback | 31 | 1 | 0 |\n| 4 | A write is not just a write | 38 | 0 | 1 |\n| 5 | The reasoning was right, but the world shifted | 29 | 1 | 2 |\n| 6 | The write was safe. The context was not. | <25 | 1 | 0 |\n\n**A series is supposed to compound. Each part should bring readers to the next one. Mine did the opposite.**\n\nThe posts have not been live for the same amount of time, so this is not a controlled comparison. But no later part shows a clear sign of inheriting an audience from the one before. Two months in, the most-read article is still the first.\n\nThe comfortable explanation is that the articles are bad.\n\nMaybe. A few readers did leave substantive comments, and another author picked up one of the terms from the series. That was encouraging, but two hundred views is far too small a sample to separate writing quality from distribution.\n\nThe honest version is narrower:\n\nThe writing never got a real test.\n\nAnother explanation is that quiet, conceptual titles do not work in a feed. That is not enough either. [\"your agent can think. it can't remember.\"](https://dev.to/ghostbuild/your-agent-can-think-it-cant-remember-5e1o) had 144 reactions when I checked, so this kind of title can work.\n\nThat does not mean my specific titles worked. So I stopped guessing and looked at the platform.\n\ndev.to runs on Forem, and Forem is open source. Part of the logic behind its personalized feed is public. The repository contains [the query builder](https://github.com/forem/forem/blob/main/app/services/articles/feeds/variant_query.rb), [the feed variants](https://github.com/forem/forem/blob/main/config/feed-variants/20240701-variant-c.json), and [the checked-in experiment mix](https://github.com/forem/forem/blob/main/config/field_test.yml).\n\nI write about systems that make decisions from rules, state, and context. Then I sent six articles into another rule-driven system without reading its rules once.\n\nSo I read them.\n\nOne caveat before the numbers. The checked-in experiment config assigns 70 percent to one variant and 10 percent to each of three others, but that does not prove which exact configuration every DEV reader saw when my articles were published.\n\nThe irony of quoting potentially stale config in a series about stale state is not lost on me. Treat these numbers as a public model of the feed, not as a live production trace.\n\nThe relevance score is a product, not a sum. The query builder multiplies the configured factors, which means that one value near zero can sharply pull the candidate score down even when the others are strong.\n\nFor signed-in readers, discovery is also time sensitive in this variant. The age factor is 1.0 on publication day, 0.2 on day seven, and 0.02 on day eight. Candidates can still be considered for about two weeks, but the first days carry most of the weight of this factor.\n\nDiscussion on the article is another factor. Zero comments score 0.15 on that component, while two comments score 0.66. That makes the comments component about 4.4 times larger, but it does not mean that the article becomes 4.4 times more visible. The final ordering also uses a feed-success score, a clickbait penalty, and a small random term.\n\nThe feed is personal too. In the 70-percent public variant, the same article gets a factor of 1.0 for a signed-in reader who follows the author and 0.01 for one who does not. User-specific factors are skipped for anonymous readers, so the same article can rank very differently for different people.\n\nReactions, tag matches, language, and recommendation signals also take part in the calculation. No single factor explains the feed, but several weak ones can combine.\n\nThe code does not explain the table, but it makes one mistake in my process easier to see.\n\nI had almost no existing audience. Several posts drew no discussion, and for the others I do not know whether the comments arrived early enough to matter. Most of the time, I had no repeatable distribution process. I published, waited, and started writing the next part.\n\nThe few times I joined related discussions were also the times the work reached the right readers.\n\nThe feed does not have to reject an article. In this public model, silence can simply become another multiplier.\n\nThe best discussions around my work did not happen under my own articles. They started under other people's posts, where I showed up as a reader with something relevant to add.\n\nThat is not a ranking insight. It is a simpler one: I got more from joining an existing conversation than from pressing publish and waiting. My process mostly stopped at publish.\n\nThe title lesson is mine too. For an unknown author, the title carries most of the first impression. One of my weakest entrances was \"Agent workflows need an impact boundary.\"\n\nIt gives the conclusion before it gives a stranger the problem.\n\nArticle five, [\"The reasoning was right, but the world shifted\"](https://dev.to/davidloibner/the-reasoning-was-right-but-the-world-shifted-3ngk), argues that an agent must not act on a world it never actually checked.\n\nArticle six, [\"The write was safe. The context was not.\"](https://dev.to/davidloibner/the-agent-should-not-choose-its-own-state-view-12hl), makes a related point about the context an agent reasons from.\n\n**Both are about AI agents. They also turned out to be about me on dev.to.**\n\nThe writing may have been fine, but it never reached enough readers to know. I had not read the context I was publishing into, so the reasoning could have been right while the world it shipped into was still a guess.\n\nI still do not know exactly why these six articles stayed small. The writing may be part of it, the titles may be part of it, and starting with almost no audience certainly did not help.\n\nReading the code did not settle any of that. It made one mistake clear:\n\nI had measured views. I had not measured distribution.\n\nI wrote six connected ideas and expected the series label to distribute them.\n\n**I did not give each article its own entrance, and I also treated publish as the end of the work.**\n\nA series is supposed to compound.\n\n**Mine kept asking every article to find its first reader again.**\n\nI know now that publishing is not enough. I still do not know how to do the rest without taking time away from the writing.", "url": "https://wpnews.pro/news/six-articles-200-views-so-i-read-the-feed-s-source-code", "canonical_source": "https://dev.to/davidloibner/six-articles-200-views-so-i-read-the-feeds-source-code-4ek8", "published_at": "2026-07-29 13:15:04+00:00", "updated_at": "2026-07-29 13:38:04.226817+00:00", "lang": "en", "topics": ["developer-tools"], "entities": ["DEV.to", "Forem"], "alternates": {"html": "https://wpnews.pro/news/six-articles-200-views-so-i-read-the-feed-s-source-code", "markdown": "https://wpnews.pro/news/six-articles-200-views-so-i-read-the-feed-s-source-code.md", "text": "https://wpnews.pro/news/six-articles-200-views-so-i-read-the-feed-s-source-code.txt", "jsonld": "https://wpnews.pro/news/six-articles-200-views-so-i-read-the-feed-s-source-code.jsonld"}}