More selected projects

Watching You

This project is intended to act as a model for the way social media displays content.  When a user shows interest in a piece, the program takes note and seeks to cater to you by showing you similar pieces in the future.

produced by: Richard Rattner


Watching You is a piece that presents a model of online and social media marketing demonstrating how when users show interest in content, content of that type is more heavily weighted when a new content is shown.  Watching You shows a rapid succession of article thumbnails, dates, and headlines giving the user just enough time to parse and react to what they see before switching to the next article.  Every ten articles the user's interests are revaluated, and the next set of ten articles is decided on and shown to the user.  This continues until a category of article is exhausted, at which point the program thanks users for their input into social media marketing.

Concept and background research

Watching You is inspired by how social media presents content, and draws on that in a few major ways. 

Some of the major topics I wanted to hit upon was the sheer volume of content presented to users, the often subtle ways it analyzes the user’s interest to determine how it curates that content, and the way that this process can create an echo chamber.

To model the pace and volume of content of social media presents its users, I wanted to show a large amount of content with just enough information to give users an idea as to what the content is about.  To do this, I decided that I would show users an article headline, thumbnail, and publishing date for 2.5 seconds, before switching to another one.  This allows for a large library of articles that won’t have to repeat in a single sitting.  The articles are decided upon in sets of ten, with the next ten being decided on where the user’s interest in the first ten lie.

I wanted a similar feeling to how social media collects data, so I decided to use faceOSC to track the user’s eyebrows as they react to the headlines they see.  Often eyebrow movement is not something people actively think about, mirroring users not realizing that they’ve indicated interest in certain topics on social media.  The program looks for when the user’s eyebrows are raised higher than they are on average, and when they are takes note of the article that they were looking at, and weights that category of article more heavily in the next set of ten articles that the user is shown.

The final thing I wanted to present was how social media can create an echo chamber for users.  For example, if the user consistently indicates interest in just political articles, they will find their feed consists of more and more political articles.  This is representative of how users indicating interest in only one perspective of a debate or argument in social media news will result in them finding largely content that agrees with that perspective, regardless of the ratio of content that agrees with that perspective to content that disagrees with it.


This project uses a custom "newsArticle," class that stores a headline string, a date string, a thumbnail ofImage, and a bool to indicate if the current article has been read.  The program generates 5 lists of 50 articles, each list representing a different article type.

Users will see an article headline, thumbnail, and date every 2.5 seconds.  The articles the users see are decided in sets of ten.  Once those ten are exhausted, the program looks at which articles the user was interested in.

To detect user interest, the program reads data from faceOSC to detect when the user's eyebrows are raised.  It does this by constantly recording the user's eyebrow height and calculating an average eyebrow height.  When the users eyebrows are higher than this average the program will record the category of the article currently being displayed.

Once it's time to generate a list of new articles, the program first runs a check to make sure there are enough articles to generate a new list.  If there are not, it displays a message thanking the user for engaging with the program.  If there are, then it looks at which categories the user was interested in.  If there is an even amount of interest across all categories, then the program will randomly select what articles go into the next list.  This is also the method used to generate the initial list.

If there's not an even number, then the program takes the ratio of article category interest and applies the highest whole number multiplier it can to that set that still gives a total under 10.  The program then adds that many articles of those types to the list.  If this does not add up to ten, the program looks to see if there was an article type that there was more interest in than all the other types, and if there was adds articles of that type until the list contains 10 articles.  If there was not a clear article type that was more popular than all the others, random articles will be added to the list (which also allows for more article types to show up if the user isn't interested in what they see).

At this point the list is complete, and sent to the user.

Additionally, whenever an article is added, it is chosen at random from that category from among the articles that have not been shown yet, allowing for users to see different articles each time they boot up the program.


Future development

The biggest thing I'd like to implement in this project is real-world articles.  Initially I attempted to do this within this iteration of the project, but ran into issues (text formatting, image sizing, buffer issues) and decided to dedicate my time to the program's algorithm using placeholder articles, which is less elegant but better than nice formatting in a program that doesn't work as intended.

The ideal way to incorporate this would be to read data from the internet to get article headlines, thumbnails, and dates.  This would allow the program to be relevant regardless of when used.  To do this I would switch the articles from arrays to vectors to allow for dynamic sizing, and would add an element checking to make sure the vector hadn't gotten too large to support.

A half measure would be to hardcode in a library of article headlines, thumbnails, and dates, which would plant the program at a specific point in time, but allow for more consistent behavior.  I would also change how the randomness is applied.  At present the program cycles through the article array for the chosen topic at random whenever a new article is added.  Instead, I would randomize the list during Setup, making for a slightly slower startup, but overall faster runtime, as instead of circling through the list at random looking for an unused article the program could just increment through the list one by one.  It would also make the checks to prevent out of bounds errors simpler and easier for others to parse.

One additional aspect I'd like to add is subcategories, such as rightwing and leftwing politics, negative celebrity news and positive celebrity news, critical humor and "wholesome," humor.  This would allow more nuance and show perspective instead of just article type, furthering the idea of the echo chamber.

Self Evaluation

I think that this project largely does what it sets out to do, which is draw attention to how social media curates content for its users.  I think the parallels drawn work well, and that it encourages users to think about how social media might be curating content for them.

I am a little disappointed that placeholder library had to be used, but am confident in the decision of prioritizing the algorithm over using real world articles, as I believe that the placeholders still get the point across, and the real world articles with a less consistent program would have undermined the project's message.

I also would have liked to add the subcategories element, but the complexity they would add wasn't workable within the timeframe.

That being said, I think the concept is good, and the current implementation expresses the intended message well.


The appearance was largely inspired by how sites like google or facebook display news, as shown in this post’s thumbnail.

The Face OSC program was taken from Kyle McDonald's Face OSC program at

The OSC messaging code is based off of the example code provided by Dr. Papathedorou.

The fonts are from and