{"id":912,"date":"2026-08-16T20:19:30","date_gmt":"2026-08-17T00:19:30","guid":{"rendered":"https:\/\/blog.listentolocal.org\/?p=907"},"modified":"2026-08-17T00:32:00","modified_gmt":"2026-08-17T00:32:00","slug":"introducing-listentolocal","status":"publish","type":"post","link":"https:\/\/dougturnbull.org\/index.php\/2026\/08\/16\/introducing-listentolocal\/","title":{"rendered":"Introducing ListenToLocal"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Localify is now ListenToLocal \u2014 a soon-to-be-launched, community-driven home for local music discovery.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Earlier this year, we wrote that\u00a0<a href=\"https:\/\/dougturnbull.org\/index.php\/2026\/06\/05\/localify-is-dead-long-live-local-music\/\" data-type=\"link\" data-id=\"https:\/\/dougturnbull.org\/index.php\/2026\/06\/05\/localify-is-dead-long-live-local-music\/\">Localify was dead<\/a>. What we meant was that the idea behind it \u2014 using music recommendations to help people find local music shows \u2014 <a href=\"https:\/\/dougturnbull.org\/index.php\/2025\/09\/10\/where-did-all-the-small-music-venues-go\/\" data-type=\"link\" data-id=\"https:\/\/blog.listentolocal.org\/index.php\/2025\/09\/10\/where-did-all-the-small-music-venues-go\/\">remains an important goal<\/a>, but our app desperately needed a rebuild and a rebrand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we started over. Since January, we&#8217;ve merged 99 pull requests across a new API, a new web app, a new recommendation engine, and a new data scraping system. Here&#8217;s what that work actually consisted of, in six pieces.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-dark-gray-color has-text-color has-link-color wp-elements-b0727e8d0d1d4ead39e16c429482d901\">Local Artists: Figuring out where a band is actually from<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Recommending local music means knowing which artists&nbsp;<em>are<\/em>&nbsp;local, and no single service will tell you. We pull from Spotify, Last.fm, MusicBrainz, Wikipedia, Bandcamp, SoundCloud, Deezer, Setlist.fm, Pollstar and RateYourMusic, then reconcile the results.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Every fact carries its source, so conflicting claims can be ranked rather than overwritten<\/li>\n\n\n\n<li>Admin tools to merge duplicate artists, venues, events and cities \u2014 the same band arrives spelled four ways<\/li>\n\n\n\n<li>Scrapers that notice when a source starts rate-limiting and back off on their own, instead of hammering it until it blocks us<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-dark-gray-color has-text-color has-link-color wp-elements-e93e59703ee50704ac5946661fb79f65\">Live Music: Event data, down to the start time<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A recommendation is useless if the details are wrong. Much of our year went into getting event data right \u2014 and into the unglamorous edge cases that decide whether someone shows up at the correct hour.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Events pulled from venue calendars, artist tour pages, and local newsletters, with a language model reading the messy ones<\/li>\n\n\n\n<li><strong>Fans can photograph a gig poster<\/strong>,&nbsp;and we&#8217;ll read the lineup and date off it, then add it to our event recommendations<\/li>\n\n\n\n<li>Times rendered in the&nbsp;<em>venue&#8217;s<\/em>&nbsp;timezone, so a 9pm show reads as 9pm whoever is looking<\/li>\n\n\n\n<li>Full festival support \u2014 lineups, stages, per-set schedules<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-dark-gray-color has-text-color has-link-color wp-elements-7700a41fad28576f05388d9a489541c4\">Recommendation: Tuned to stay local<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tell us a few genres and artists you like, and we rank the musicians near you against that. The model is trained on listening patterns, but it only ever recommends artists from the city you&#8217;re looking at.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Match scores are catalog-wide percentiles, so 85% means the same thing in Ithaca as in Nashville<\/li>\n\n\n\n<li>Every recommendation shows its reasoning \u2014 the artists you already like that it&#8217;s drawing from<\/li>\n\n\n\n<li>Open a festival and see its lineup ranked for you, whether you know two of the acts or none of them<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-dark-gray-color has-text-color has-link-color wp-elements-27e69fe9c3d357f1bca655d5e84cadd9\">Community: A scene knows itself better than a scraper does<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Automated data is a starting point, not the truth. Anyone signed in can correct us, and low-stakes fixes go live immediately rather than waiting on us.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add tags, similar artists, an artist&#8217;s hometown, a missing start time, a link to a band&#8217;s Bandcamp<\/li>\n\n\n\n<li>Higher-stakes edits queue for review, where duplicate suggestions group together \u2014 &#8220;eleven people told us this&#8221;<\/li>\n\n\n\n<li>Contributors build trust over time, and regulars stop being queued<\/li>\n\n\n\n<li>A &#8220;report an issue&#8221; link on every page, because sometimes the fix isn&#8217;t obvious but the error is<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-dark-gray-color has-text-color has-link-color wp-elements-dae6f2e4f8595c62b0e610d4ae1d8596\">Social: Going out is something you do with people<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Seeing that three friends are already going to a show is a better reason to buy a ticket than any algorithm. We built that carefully: you share nothing until you choose to.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Private by default, with friend codes and QR links so you can connect without being searchable<\/li>\n\n\n\n<li>&#8220;<strong>Friends going<\/strong>&#8221; and &#8220;friends who like this artist&#8221; on events and artist pages<\/li>\n\n\n\n<li>Spotify playlists for any city, venue or festival \u2014 one top track per local artist, no login needed<\/li>\n\n\n\n<li><strong>Local Music Wednesdays<\/strong>, a weekly email with a couple of shows worth your evening<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Behind the scenes<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-dark-gray-color has-text-color has-link-color wp-elements-af1061ac075f0e79ecbe477d57b12b73\">Dashboard: The part nobody sees<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most of a project like this is infrastructure that only matters when it fails. It gets a section because it&#8217;s where a surprising share of the work went.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An operations dashboard showing scraper health, source cooldowns and data-quality reports<\/li>\n\n\n\n<li>Managed database backups and scheduled refreshes of the expensive precomputed tables<\/li>\n\n\n\n<li>Containerized services with separate staging and production deploys, so changes get tested before you see them<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-dark-gray-color has-text-color has-link-color wp-elements-a35a77c564ff478901d64bb13eeb3b4d\">Come help<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ListenToLocal.org is a not-for-profit, academic project. There&#8217;s no growth target and nothing to sell you \u2014 the goal is that more people go to more small shows, and that the artists playing them find an audience.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The most useful thing you can do is tell us where we&#8217;re wrong. Every page takes corrections, and every correction makes the recommendations better for whoever looks next.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">See you at a show.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Doug<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Localify is now ListenToLocal \u2014 a soon-to-be-launched, community-driven home for local music discovery. Earlier this year, we wrote that\u00a0Localify was[&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":913,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-912","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/posts\/912","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/comments?post=912"}],"version-history":[{"count":3,"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/posts\/912\/revisions"}],"predecessor-version":[{"id":916,"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/posts\/912\/revisions\/916"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/media\/913"}],"wp:attachment":[{"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/media?parent=912"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/categories?post=912"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dougturnbull.org\/index.php\/wp-json\/wp\/v2\/tags?post=912"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}