Melkweg.nl discovery page

Melkweg is one of the best known music venues in Amsterdam. They pride themselves on being at the intersection of popular- and underground culture. Giving their audience the chance to hear new music and expose them to artists they might otherwise not have heard is at the heart of what they do.

When starting this project we took a look at the old Melkweg website, which focused for the most part on browsing a list of concerts to find the artists you were looking for. When talking to the client and their audience however, we found that specific artists are only part of the reason people visit Melkweg. Some go because their friends do, while others just want to hear some good music and don’t really care which artist is performing. For those people, a text heavy list riddled with artists was definitely not the best experience.

So we decided exploration should take center stage. The chronological agenda view takes a backseat to that which is internally dubbed ‘the discovery page’, but what regular users experience as the homepage. Since motivating users to explore music they might not—or only vaguely—know is so important, relevant audio or video should never be more than a click away. Almost all events are enriched with audio snippets from Spotify or Soundcloud, and videos from Youtube.

Curating the experience

Every visit should bring you something new. Therefore we developed a simple but effective algorithm which:

// Construct score
	// Factor published
	// Only counts the first week after publishing: the more recently published, the higher the score.
	$factor_published = number_format(self::INSPIRATION_FACTOR_PUBLISHED, 2, '.', ',');
	$days_since_published = "DATEDIFF('{$today->format('Y-m-d')}', DATE(IF($event_table.published IS NOT NULL, $event_table.published, $event_table.created)))";
	$days_since_published = "IF($days_since_published < $pl, $pl - $days_since_published, 1)";
	$score_published = "POW($factor_published, $days_since_published)";
	// Factor weight
	// Higher weight = higher score.
	$factor_weight = number_format(self::INSPIRATION_FACTOR_WEIGHT, 2, '.', ',');
	$score_weight = "POW($factor_weight, {$event_table}.weight)";
	// Factor date
	// Events get more relevance when the date is drawing nearer.
	$date_expr = "DATEDIFF($event_table.humanized_date, '{$today->format('Y-m-d')}')";
	$score_date = "1 + (1/($date_expr+1))";
	// Total score
	$total_score_expr = "($score_weight) * ($score_date) * ($score_published)";
Fig 1. The ranking algorithm for Melkweg discovery page.

Of course hardcore music lovers aren’t left behind. The agenda is straightforward, and makes it easy to search for specific artists, see what club-nights are on, or keep up with just announced concerts.

Melkweg.nl agenda page
Fig 2. Search and filter the agenda to your personal taste

Incremental improvements

Melkweg.nl is not about ‘disrupting’ what a pop venue website should be. We didn’t try new things because we’re bored with the status quo. What we’re looking for is the best way to connect people to concerts that interest them, and ones they don’t even know they’re looking for. It’s a constant conversation with both the client and their audience. With small incremental updates we try to bring more focus to the parts that work, while eliminating the features that don’t.

After more than three years, the site isn’t bloated with unneeded features. It is actually still being improved upon, which makes this a great project for me to work on.