Most of the time you do not need any of it. A reader who just finished a piece tagged "cash flow" probably wants another piece tagged "cash flow," and when there are several, the most recent one is a fair guess. There is no intelligence in that. You count how many topics two posts share, and you sort by date. We have shipped enough sites to know it gets you most of the way on the first try, for nothing.
The expensive answer wins by default anyway, usually for a dull reason: nobody with the authority to choose has the time to check whether the cheap one would have done the job.
So We Wrote the Cheap One Down
It is a small plugin for Eleventy, the generator this site runs on. An editor can pin the follow-ups by hand when they have an opinion. When they do not, it fills the gap by shared topics, freshest first. A post we would rather not resurface gets a single line in its front matter, relation: off, and it leaves the suggestions. No model, no vectors, no monthly bill.
npm install @raredigits/11ty-rare-related-posts
It is on npm now, MIT-licensed, with the source on GitHub. Today it does one honest thing well. The question we find interesting is how far this plain approach stretches before it genuinely needs a model: weighting by recency, by author, by what a reader has already seen. We think there is a real product in there, and we would rather build it in the open. If you want to push it further with us, the repo is the place to start.