The Challenge: Personalizing a Multi-Format Feed Without ML
Building a recommendation engine for a platform that aggregates diverse content—movies, books, games, music, and long-form posts—presents a unique challenge. Especially when the development team operates without a dedicated data science department or a sophisticated machine learning pipeline. This was the reality for the team behind a collaborative cultural curation platform, which relies on user-submitted recommendations. Their journey to create an effective personalization engine involved two significant overhauls of their feed ranking algorithm within approximately one year.
The initial goal was simple: move beyond a purely chronological feed. The first iteration of the ranking algorithm aimed to introduce some level of relevance. However, it soon became apparent that this approach, while solving the immediate problem of staleness, fell short of delivering genuine personalization. Users were not seeing content that truly resonated with their individual tastes. This realization prompted a deeper investigation into what constitutes "user taste" and how it could be more accurately modeled and surfaced in the feed.
Generation 1: The Weighted SQL Ranker
The first generation of the feed ranking algorithm was built on a familiar PHP and MySQL stack. The core of this system was a weighted SQL ranker. This meant that various attributes of content—such as recency, popularity (likes, comments), and potentially user-defined categories—were assigned numerical weights directly within SQL queries. The system would then sum these weighted scores to produce a ranking for each item in the feed.
While this approach effectively broke free from the chronological constraint, its personalization capabilities were limited. The system treated all users and all content types with a relatively uniform scoring mechanism. "User taste" was implicitly defined by a combination of general popularity and recency, rather than by an individual user's specific preferences. This led to a feed that felt somewhat generic, failing to capture the nuances of what individual users found compelling. The complexity of managing and iterating on these weights within SQL also presented limitations for fine-tuning and experimentation.
The team discovered that this SQL-centric approach, while straightforward to implement initially, lacked the flexibility to adapt to more complex user behavior or content relationships. It was akin to trying to play a symphony using only a few basic chords; it produced sound, but lacked depth and richness. The failure of this first iteration was not in its functionality, but in its fundamental misunderstanding of what true personalization entails.

Generation 2: The Narrative Affinity Model
Recognizing the shortcomings of the first generation, the team embarked on a complete re-architecture. The second generation moved away from SQL-based scoring and embraced a more sophisticated concept: the narrative affinity model. This shift involved rethinking "user taste" not just as a collection of preferences for categories or topics, but as a narrative—a story of a user's engagement with content over time.
This new model aimed to understand how users interact with different types of content and how these interactions form a pattern. Instead of relying on static weights in SQL, the scoring logic was moved into the application code (PHP). This provided much greater flexibility to implement more dynamic and context-aware scoring. The concept of "narrative affinity" suggests that a user's liking for a particular book might be related to their liking for a specific film director, or a certain genre of music, creating a web of interconnected preferences.
Key to this evolution was the introduction of a layer of post-ranking business rules. After the initial affinity scores were calculated, these rules could be applied to further refine the feed. This allowed the team to incorporate editorial decisions, promote specific types of content, or ensure a diverse mix of recommendations, all without altering the core affinity calculation. This hybrid approach—combining algorithmic affinity with business logic—proved to be a powerful combination.
Testing and Calibration Without a Data Science Team
One of the most significant achievements of this project was the successful testing and calibration of a complex feed ranking system without access to traditional data science tools or an ML pipeline. The team developed a pragmatic approach to validation.
They focused on A/B testing variations of the algorithm, measuring key user engagement metrics such as click-through rates, time spent on platform, and content interaction rates. Crucially, they established clear, measurable goals for each iteration. Instead of relying on abstract metrics, they looked for tangible improvements in user behavior. For instance, they might have set a goal for the new algorithm to increase the average number of items a user interacted with per session by 15%.
Calibration involved iterative refinement. The team would deploy a new algorithm variant, observe the results, analyze user feedback (both direct and indirect through behavior), and then make adjustments. This process was more akin to a craftsman tuning an instrument than a data scientist running complex models. They used proxy metrics and qualitative feedback to guide their quantitative adjustments. For example, if users were consistently ignoring recommendations in a particular category, they would investigate and adjust the affinity calculations or business rules related to that category.
The absence of an ML pipeline forced a focus on the underlying principles of recommendation systems and user psychology. It required a deep understanding of their specific user base and content catalog. This hands-on, iterative approach, grounded in application code and direct user observation, allowed them to build a system that, while not using ML, achieved a level of personalization previously out of reach.
The Takeaway: Iteration and Core Principles Trump ML Hype
The evolution of this platform's recommendation feed underscores a critical point: sophisticated personalization does not always require a full-blown machine learning infrastructure. By deeply understanding their users and content, and by adopting a flexible, iterative development process, the team was able to move from a basic, chronological feed to a nuanced narrative affinity model. The migration from a weighted SQL ranker to application-level scoring, augmented by business rules, demonstrates a practical path toward more effective recommendations.
This journey highlights the importance of defining what "user taste" truly means within the context of a specific platform. For this collaborative cultural curation service, taste was not just about genre or popularity, but about the interwoven narrative of a user's engagement. The success of their testing methodology, relying on A/B tests and direct metrics rather than complex statistical models, offers a valuable blueprint for other teams with similar resource constraints. Ultimately, the project serves as a testament to the power of focused iteration and a deep understanding of core recommendation principles.
