<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom">
  <channel>
    <title>Fight With Tools by AramZS</title>
    <description>A site discussing how to imagine, build, analyze and use cool code and web tools. Better websites, better stories, better developers. Technology won&apos;t save the world, but you can.</description>
    <link>https://aramzs.github.io/</link>
    <atom:link href="https://aramzs.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 13 Apr 2026 12:44:46 -0400</pubDate>
    <lastBuildDate>Mon, 13 Apr 2026 12:44:46 -0400</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Here&apos;s how I know more people read my personal blog via RSS then any other platform</title>
        <description>&lt;p&gt;I want people to read my RSS feeds. but I also want to know how what my RSS readership is without breaching their privacy. RSS feed readership measurement is an… imperfect affair. Because it is a service that people generally charge for (or &lt;a href=&quot;https://feedburner.google.com/&quot;&gt;require you to give up audience data for&lt;/a&gt;) it isn’t well documented. Here’s how I did it.&lt;/p&gt;

&lt;p&gt;I’m a big proponent of setting up fast, small, flat websites on the cheap. That means using free hosting and building services as much as possible. The goal &lt;a href=&quot;https://aramzs.github.io/build-a-website/#/&quot;&gt;is to put the tools for crafting the web in the hands of as many people as possible&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;RSS feeds present a set of unique problems for measurement which is why many companies, including big ones, don’t do much to try and measure them.&lt;/p&gt;

&lt;p&gt;The first big problem is that the big RSS readers cache your feed so they don’t have to ping it constantly. This means that requests to your RSS feed URLs aren’t really representative of the amount of readers you have.&lt;/p&gt;

&lt;p&gt;Also a lot of RSS readers will cache the &lt;em&gt;inside&lt;/em&gt; of the feed, so not just text but images will often get baked into the caching of a reader so that more complex reading applications don’t have to over-request your site. This is one of the big challenges of measuring podcast downloads as well, iTunes and Spotify will absolutely save local copies of your file and only the introduction &lt;a href=&quot;https://analytics.podtrac.com/&quot;&gt;of an intermediary service capable of authoring agreements with all the major players&lt;/a&gt; have kept podcast measurement fairly reliable and kept all entities involved agreeing on the same numbers.&lt;/p&gt;

&lt;p&gt;As far as I can tell, only Feedburner came close to being the Podtrac of text RSS feeds and since then, no one has really emerged as the one true agreed upon analytics provider for feeds that feed services will ping. I think that’s good actually. &lt;em&gt;One True&lt;/em&gt; services are generally a recipe for disaster.&lt;/p&gt;

&lt;p&gt;By an apparent unwritten agreement, &lt;a href=&quot;https://darekkay.com/blog/rss-subscriber-count/&quot;&gt;major feed services will tell you about the readership of your feed in the header of their requests apparently, this is visible in server logs as Darek Kay discovered in 2021&lt;/a&gt;. Though this isn’t particularly standardized (requests don’t seem to share a format) it seems useful… &lt;strong&gt;if you can get your server’s logged requests and generate reports based on them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you are building fast, cheap, free-hosted sites like mine however, that is not an option. Also, I’m too lazy to futz around in server logs right now, even if I had them at hand.&lt;/p&gt;

&lt;p&gt;So I wanted to try some stuff. I tried sending up an SVG that had analytics embedded in it. That did not work. I didn’t bother with an old time pixel since I knew that trying to have an image on a server whose logs I did control wasn’t the solution I wanted, even if it worked.&lt;/p&gt;

&lt;p&gt;Instead I looked at the feeds I read and realized something.&lt;/p&gt;

&lt;p&gt;There are videos in there. All those videos are handled like modern videos mostly are, embeds via iframes.&lt;/p&gt;

&lt;p&gt;Now, iframes are not technically allowed in feeds, but the modern blog will tend to use them a lot for stuff like video, social media embeds, etc… anyway and it looks to me like most feedreaders will render them!&lt;/p&gt;

&lt;p&gt;This is great! Now I can deploy an iframe and a page with analytics running on it and see if it works and… it does!&lt;/p&gt;

&lt;p&gt;So I put together an HTML page:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;lang=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;charset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Private Feed Tracker&lt;span class=&quot;nt&quot;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
		  &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;nl&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;border-box&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

		  &lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;nl&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;nl&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;nl&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;hidden&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;nl&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#03092c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

		 &lt;span class=&quot;nt&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;nl&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;nl&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;nl&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;data-domain=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;aramzs.xyz&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://plausible.io/js/plausible.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Hi! This image is loaded in an iframe on my RSS feed as a way to try and measure how many people are reading me through RSS. The tracking is privacy respecting and your data will not be sold. I&apos;m just curious.  --&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/feed-img.svg&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;width=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;50&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;height=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;50&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Site logo&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can see, I’ve created a standalone HTML page on &lt;a href=&quot;https://aramzs.xyz/&quot;&gt;my personal blog site&lt;/a&gt; that includes a simple call to my privacy-focused analytics provider &lt;a href=&quot;https://plausible.io&quot;&gt;Plausible&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then my RSS NJK template gets the iframe that loads this file added to the end of every article’s content block:&lt;/p&gt;

&lt;div class=&quot;language-liquid highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;set postContent = post.templateContent + &apos;&amp;lt;br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;iframe width=&quot;50&quot; height=&quot;50&quot; src=&quot;/some-url-with-that-html&quot; title=&quot;Privacy-respecting tracker for feed readers&quot; frameborder=&quot;0&quot; allow=&quot;web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&apos; | htmlToAbsoluteUrls(absolutePostUrl)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And yeah, this works! Now maybe some services cache iFrames as well, and so what I’m really getting isn’t my full readership but a baseline of minimum-measurable-readers. This is very possible, but even the baseline is an exciting number to be able to get access to without enlisting anything other than my normal analytics provider!&lt;/p&gt;

&lt;p&gt;It’s possible they’re getting pre-loaded in some contexts; but I suspect most applications won’t load iframes in a post until the post is opened by the user. It is also possible that this is &lt;strong&gt;only&lt;/strong&gt; getting loaded &lt;em&gt;because it is a visible image&lt;/em&gt;, but I didn’t test out a 1x1 version to verify. I didn’t want to seem sneaky here, I want to make it obvious that an asset is loading from my site.&lt;/p&gt;

&lt;p&gt;I think this is a pretty reasonable number to work with!&lt;/p&gt;

&lt;p&gt;And look at my past 28 days! It turns out that I am getting more traffic on my RSS posts than on any other individual page.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/uploads/rss-stats-in-context.png&quot; alt=&quot;Overall stats of pageviews per page on my site&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And when I break it out as a source it constitutes over a third of my traffic.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/uploads/rss-stats.png&quot; alt=&quot;Stats on RSS as a standalone source&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is super exciting to me! I want people to consume the two RSS feeds I produce for &lt;a href=&quot;https://aramzs.xyz&quot;&gt;aramzs.xyz&lt;/a&gt;. It looks like they are!&lt;/p&gt;

&lt;h2 id=&quot;some-interesting-information&quot;&gt;Some Interesting Information&lt;/h2&gt;

&lt;p&gt;I specifically use Plausible as my analytics provider because it is non-invasive, quick, and privacy preserving. I don’t want detailed user data, or even anything other than the most generic data about users. But I do like having referrer data and when I looked at Top Sources I was surprised to see a whole bunch of sites.&lt;/p&gt;

&lt;p&gt;I am not sure what exactly is happening there, or how to figure out more information with my current setup, but I assume some of these are people flowing from those sites into my RSS feed when their browser has something that renders the feed directly. The presence of &lt;a href=&quot;https://www.inoreader.com/&quot;&gt;Inoreader&lt;/a&gt; makes me realize that readers will also show up as referrers in this process. I think this means that a bunch of these sites are running their own white-labeled in-house RSS readers for their employees or users, which is really cool!&lt;/p&gt;

&lt;h2 id=&quot;what-is-next&quot;&gt;What is next?&lt;/h2&gt;

&lt;p&gt;I have two RSS feeds for two very different purposes, one supplies my own writing, the other is an amplifeed of articles I want to amplify (like a retweet!). I might give those two different iFrames to see how the different feeds perform separately.&lt;/p&gt;

&lt;p&gt;I would also like to know which specific articles are getting loaded by readers, it would be nice to combine into my metrics, but I just don’t think that’s possible with my current setup. What I might try is some link-decoration to track the article names/urls as setting up alternative URLs is just not desirable. I’ll have to see if that works or causes issues (since I know some applications and browsers will intercede against or strip out link decoration).&lt;/p&gt;

&lt;p&gt;If you’ve tried this or have had some experience with this sort of thing, &lt;a href=&quot;https://chronotope.aramzs.xyz/&quot;&gt;hit me up on BlueSky&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Wed, 25 Jun 2025 14:30:00 -0400</pubDate>
        <link>https://aramzs.github.io/open-source/2025/06/25/rss-is-the-way-most-people-read-my-blog.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/open-source/2025/06/25/rss-is-the-way-most-people-read-my-blog.html</guid>
        
        <category>code</category>
        
        <category>rss</category>
        
        <category>analytics</category>
        
        <category>metrics</category>
        
        <category>privacy</category>
        
        
        <category>open-source</category>
        
      </item>
    
      <item>
        <title>Comment on the IAB Tech Lab&apos;s Global Privacy Platform (GPP)</title>
        <description>&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://iabtechlab.com/wp-content/uploads/2022/06/global_privacy_platform_rfc_june_2022.pdf&quot; title=&quot;IAB Tech Lab&apos;s Global Privacy Platform (GPP) PDF&quot; alt=&quot;IAB Tech Lab&apos;s Global Privacy Platform (GPP) PDF&quot; target=&quot;_blank&quot;&gt;Global Privacy Platform&lt;/a&gt; is intended to absorb the functionality of TCF and expand on it, as a consent-string-based privacy solution. While GPP expands the scope that the system can cover it does not resolve any of the intrinsic problems of the TCF approach. The result is a compounding of a deeply flawed system that, while it improves on the underlying concepts, does not resolve the core issues and therefore seems likely to face significant challenge from regulators and privacy advocates.&lt;/p&gt;

&lt;p&gt;While this is a standing issue of TCF, it is extremely troubling that GPP seems like it wants to push the boulder down the road, creating adoption costs, compliance work, and additional technical overhead only to be eventually abandoned for not addressing most regulatory concerns. This would be less of a concern if GPP showed any way that it could be hooked into better solutions, or clear paths towards transformation into a system that would meet compliance expectations. However, GPP–in this draft–does not do that.&lt;/p&gt;

&lt;p&gt;While a publisher-based perspective doesn’t have leverage to turn this ship, I recommend against the IAB moving forward on the specification as it currently stands without a fundamental shift in methodology. If there was ever a time to significantly change our approach on consent management, it is now. GPP is not that change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;#system-assessment&quot;&gt;System Assessment&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;&lt;a href=&quot;#api-layering-for-gpps-technical-system&quot;&gt;API Layering for GPP’s Technical System&lt;/a&gt;&lt;/p&gt;

        &lt;ul&gt;
          &lt;li&gt;&lt;a href=&quot;#addeventlistener&quot;&gt;addEventListener&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;&lt;a href=&quot;#notes-on-accountability-and-signal-integrity&quot;&gt;Notes on Accountability and Signal Integrity&lt;/a&gt;&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;&lt;a href=&quot;#gpp-s-api&quot;&gt;GPP’s API&lt;/a&gt;&lt;/p&gt;

        &lt;ul&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#postmessage&quot;&gt;postMessage&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#stub-code&quot;&gt;Stub Code&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#cmpid&quot;&gt;cmpId&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#manifest-issues&quot;&gt;Manifest Issues&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#the-global-vendor-list&quot;&gt;The Global Vendor List&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#the-registry-api&quot;&gt;The Registry API&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#mobile-sdks&quot;&gt;Mobile SDKs&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;&lt;a href=&quot;#consent-string-creation-and-management&quot;&gt;Consent String Creation and Management&lt;/a&gt;&lt;/p&gt;

        &lt;ul&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#vendor-consents&quot;&gt;Vendor Consents&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;p&gt;&lt;a href=&quot;#a-note-on-the-consent-string-and-server-to-server-operations&quot;&gt;A note on the Consent String and Server to Server operations&lt;/a&gt;&lt;/p&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;#gpp-principles&quot;&gt;GPP Principles&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#a-note-on-ui&quot;&gt;A Note on UI&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;#notes-on-compliance-issues-and-gpps-relation-to-eu-court-findings&quot;&gt;Notes on Compliance Issues and GPP’s Relation to EU Court Findings&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;#ways-forward&quot;&gt;Ways Forward&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;system-assessment&quot;&gt;System Assessment&lt;/h2&gt;

&lt;p&gt;The Global Privacy Platform can be looked at as a four part system.&lt;/p&gt;

&lt;p&gt;The first part is composed of the interactions with previous compliance APIs, including TCF and USPAPI. This has its own flaws, outside of the flaws of the underlying systems which will not be discussed on their own here.&lt;/p&gt;

&lt;p&gt;The second part is the Accountability Platform (AP). While the AP is technically a different set of standards, it is both intended to interact with the GPP and is a fundamental part of supporting the concept of the GPP as an answer to the open legal challenges TCF faces.&lt;/p&gt;

&lt;p&gt;The third part is the GPP API, this system is the technical means by which a user’s consent can be signaled and transmitted. GPP offers some new functionality over the TCF system on which it is modeled, but is mostly derived from TCF, as stated in the proposal: “this RFC builds so heavily upon TCF v2.0 technical design.&lt;/p&gt;

&lt;p&gt;The fourth part of the system is the Consent String. This also has some technical improvements and changes over TCF but is identified by the proposal itself as being heavily derived from the TCF2 approach.&lt;/p&gt;

&lt;p&gt;This section breaks down analysis and criticism over each section of the GPP proposal.&lt;/p&gt;

&lt;h3 id=&quot;api-layering-for-gpps-technical-system&quot;&gt;API Layering for GPP’s Technical System&lt;/h3&gt;

&lt;p&gt;Where GPP is intended to interact with OpenRTB, I agree with the authors that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ext.gpp&lt;/code&gt; is the correct placement. Placing it on the user object would be confusing and the authors are correct to avoid it.&lt;/p&gt;

&lt;p&gt;The GPP proposal would layer over existing APIs. This means that the specification expects that there would be at least 2 APIs preexisting on the page along with GPP instead of being supplanted (TCFv2 and USPrivacy). This is natural as a first step for deployment, I don’t want any gaps in coverage and can’t assume upgraders will do so evenly. However, the spec does not describe any future progression past this point. It is generally undesirable to have to maintain a growing list of window level objects, especially since the specification allows for the concept that other APIs might grow &lt;em&gt;underneath&lt;/em&gt; GPP, creating situations where individual APIs multiply and increase complexity of compliance.&lt;/p&gt;

&lt;p&gt;The system also creates a replica command API, to quote the spec:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;a call to __gpp(‘iabtcfeuv2.getTCData’,myfunction) will be translated by the CMP to __tcfapi(‘getTCData’,2,myfunction).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My hope is that this is conceived as a path towards the eventual depreciation of underlying APIs. However, the spec does not make this clear and it is an unnecessary ballooning of on-page code to handle.&lt;/p&gt;

&lt;p&gt;Even as a path towards depreciation of TCF and the other underlying APIs it seems overcautious. Systems could attempt to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__gpp&lt;/code&gt; commands first with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getSection&lt;/code&gt; argument and, if either the on page object or the command doesn’t work, they could then fall back to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__tcf&lt;/code&gt;. In fact, almost every system is likely to do something very much like this anyway. It’s a great deal of unnecessary overhead on the publisher and CMP that will then almost certainly be replicated on the side of other systems. Additional complexity and code like this is undesirable and the spec does not seem to make sufficient arguments for its inclusion.&lt;/p&gt;

&lt;p&gt;This additional complexity also makes the existing flows for the __gpp-level generic commands less clear. The most prominent example is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;addEventListener&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;addeventlistener&quot;&gt;addEventListener&lt;/h4&gt;

&lt;p&gt;Is it expected that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;addEventListener&lt;/code&gt; will also be applied to all the underlying APIs so that every API, _gpp, __tcf, __uspapi, and others on page, will trigger the callback? If __gpp commands that can also apply to underlying APIs are intended to be generic instead of GPP-only this signature is poorly designed and should be reconsidered. Any commands intended to be generic should follow the pattern of the API-specific commands with a format like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;all.addEventListener&lt;/code&gt; or some other prefix that makes clear its intended execution.&lt;/p&gt;

&lt;p&gt;“&lt;em&gt;The addEventListener command returns an EventListener object immediately. It will then call the callback function every time the CMP detects a change (see events below).&lt;/em&gt;” should be rephrased for clarity. Suggested: “&lt;em&gt;The addEventListener command returns an EventListener object immediately. The GPP script will then call the callback function and return a new EventListener object every time the CMP detects a change (see events below).&lt;/em&gt;”&lt;/p&gt;

&lt;h3 id=&quot;notes-on-accountability-and-signal-integrity&quot;&gt;Notes on Accountability and Signal Integrity&lt;/h3&gt;

&lt;p&gt;It is unclear if the Accountability Platform has made significant progress since the last RFC for it. At that time and on review of the accountability approach it was clear the proposals in that space are interesting for after-the-fact auditing. Some of the other proposals are interesting from the perspective of attempting to secure the bidstream data from alteration. None of the proposals seem to address the core problem at the heart of TCF and now GPP, which is that they do not create enforcement mechanisms to force particular data to flow or not flow; they do not guarantee that a single platform would be compliant with a consent signal as received; and they do little to secure the ad tech ecosystem against abuses by buy-side operators, such as misinformation or malware operators, anymore than the existing system does.&lt;/p&gt;

&lt;p&gt;Further, the accountability systems do not empower users or organizations that might represent users, be they activist coalitions or individuals seeking to exercise their full rights under privacy regulations, to act to protect themselves.&lt;/p&gt;

&lt;p&gt;Finally, an audit system as proposed means that bad actors are not held credible during a transaction, but after the fact. Existing reports of non-compliant actors in the ad tech ecosystem indicate that there is willingness, capability, and profitability for bad actors to manipulate the bidstream. This would just as easily extend to logs. The 2021 Accountability RFC suggests real-time hooks for accountability and it seems those should be a clear priority over non-real-time attempts at accountability and maintaining signal integrity.&lt;/p&gt;

&lt;p&gt;While there might be some proposals, perhaps even stemming from those linked in the GPP RFC, that could solidify signal integrity of the GPP signal, the current presentation of solutions does not appear to do so. At the current state of the associated proposals there are no sufficient accountability or signal integrity guarantees.&lt;/p&gt;

&lt;h3 id=&quot;gpps-api&quot;&gt;GPP’s API&lt;/h3&gt;

&lt;p&gt;TCF2’s current state is faced with considerable objections from the EU courts. The fact that the GPP API seems to do very little other than replicate it is discouraging.&lt;/p&gt;

&lt;p&gt;Promise operations on-page are a fingerprinting vector, as timing around the response could be used as part of a set of properties that could identify the user. This is an existing problem with TCF and promises are an existing browser-level privacy issue. However, it may be worthwhile to discuss, since GPP is a privacy-related technology, requiring some level of noise in promise return time. While this might be outside of the scope of the GPP specification, I think it would be worthwhile for the IAB to investigate both in terms of risk and the feasibility of avoiding that risk.&lt;/p&gt;

&lt;h4 id=&quot;postmessage&quot;&gt;postMessage&lt;/h4&gt;

&lt;p&gt;There is no clear statement as to how or if postMessage use is intended to be extended &lt;a href=&quot;https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#using-postmessage&quot;&gt;from the IAB’s TCF2 API&lt;/a&gt; to GPP. Without notice otherwise, I assume so. postMessage is increasingly at risk for this use, FencedFrames may render it useless. Cross-domain operations with GPP should be explored more in depth in the specification.&lt;/p&gt;

&lt;h4 id=&quot;stub-code&quot;&gt;Stub Code&lt;/h4&gt;

&lt;p&gt;I recommend that additional information be added to the spec for the _gpp “stub code”. In the wild under TCF this code is often lacking. Bad implementation causes compliance issues. Many CMPs do not have the stub as part of the default implementation. A stand-alone section should outline the expectations around stub code in more detail.&lt;/p&gt;

&lt;h4 id=&quot;cmpid&quot;&gt;cmpId&lt;/h4&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmpId&lt;/code&gt; is another carry over from TCF that is generally undesirable. It creates the problem of a centralized list of CMPs, over which gatekeeping can occur. That centralized list is also an obstacle for new entrants. And it is unclear why it is needed in any of the API responses? &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmpId&lt;/code&gt; may be 0 in some responses, as noted by the specification. If the concern is allowing downstream or upstream systems to note a bad actor CMP, why would that system not just fake the CMP ID? What is this number intended to protect or accomplish? It seems like an addition of complexity, data, and oversight to no clear end.&lt;/p&gt;

&lt;h4 id=&quot;manifest-issues&quot;&gt;Manifest Issues&lt;/h4&gt;

&lt;p&gt;The documentation of the Manifest is extremely unclear and requires additional details. Is it expected that every participant would have a manifest including CMPs and Publishers? Published as a JSON or on a simple web page by whom? Where? To what end? Is the manifest expected to just be within the API or the GPP string? Is it expected to be encoded? How is it expected to be used? The specification needs to answer these questions.&lt;/p&gt;

&lt;p&gt;Both the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dataUses&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;possibleStates&lt;/code&gt; are poorly documented in this specification. The final specification should be clearer about the intent and use of these fields. They are getting their values from the preceding tables but it is unclear what their use is. Presumably regulatory requirements are understood by all parties? If so why would these fields ever differ between participants? Why would they differ between publishers or CMPs? If so, how are readers of the manifest expected to take that information and use it?&lt;/p&gt;

&lt;h4 id=&quot;the-global-vendor-list&quot;&gt;The Global Vendor List&lt;/h4&gt;

&lt;p&gt;The Manifest lists a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gvlUrl&lt;/code&gt; property, GVL presumably indicates the “Global Vendor List”, an IAB-maintained list. Does that mean that property will always be the GVL for the particular compliance framework? Or is it intended that it could be filled by one of the other vendor lists the spec notes.&lt;/p&gt;

&lt;p&gt;As the specification notes, some vendors are on more than one Vendor List. Some vendors are on only one Vendor List. Should the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gvlUrl&lt;/code&gt; be an array to support multiple lists? The GPP specification suggests that all build on the IAB’s Global Vendor List… but the IAB has not gotten even some major advertising systems to sign on to their TCF2 list, which contains a mere 1,142 vendors at last check, a miniscule number compared to the count of overall ad tech operators. As a result it isn’t uncommon for sites to need to reference both the IAB’s list and Google’s ATP list under TCF. Major ad tech vendors have also failed to sign the LSPA. This seems unlikely to change under GPP but this is not acknowledged. Suggesting everyone use the IAB’s GVL is clearly unrealistic. There does not appear to be effective solutions designed for this problem beyond the already insufficient solutions in TCF2, which are overly complex and require significant transmission of data that can max out headers and URLs for ad requests. The discussion about the GPP Identifier in the specification is not a sufficient answer to these questions.&lt;/p&gt;

&lt;h4 id=&quot;the-registry-api&quot;&gt;The Registry API&lt;/h4&gt;

&lt;p&gt;The Registry API discussion appears to be an extension of the GVL conversation above it. Beyond the existing functionality of the GVL being questionable, if the specification proposes that there might be use of other vendor lists and the capability to point to them as the primary vendor list in the use of the specification, it should go further and propose a common format, API, and method of access that can be expected by any list that is intended to interact with the GPP and Accountability system. These and future vendor lists are, of course, not bound by any IAB suggestions, but it is ludicrous to propose that vendors might be identified by significantly different IDs across different CMPs or maybe even different GPP calls, without specifying the format by which those vendor lists might be accessed to resolve those IDs. A finalized specification should include the expected format for Vendor Lists and the expected access methods.&lt;/p&gt;

&lt;p&gt;Without specific information about the expected format of vendor lists why wouldn’t bad actors simply specify different vendor lists that are harder to access or audit.&lt;/p&gt;

&lt;h4 id=&quot;mobile-sdks&quot;&gt;Mobile SDKs&lt;/h4&gt;

&lt;p&gt;It seems that there is likely to be a great deal of overlap between existing TCF key values in the app and new GPP key values. It’s hard to tell right now since “A full list of all the names will be published in the final specification.” GPP should create more documentation around how the existing values might overlap, what could be an eventual path towards depreciation of replica values, and how that can be minimized. Attaching more and more consent data to users in the app will significantly increase the risk of it becoming a fingerprinting vector, especially when dealing with uneven depreciation of fields, and should be avoided.&lt;/p&gt;

&lt;h3 id=&quot;consent-string-creation-and-management&quot;&gt;Consent String Creation and Management&lt;/h3&gt;

&lt;p&gt;Much of the consent string generation process is replicated wholesale from TCF, including its problems and concerning processes, many of which are already well-detailed by the EU’s courts. This is highly concerning and seems to indicate that work on GPP should be paused.&lt;/p&gt;

&lt;p&gt;Putting that aside for now, GPP has brought forward some useful innovations. After technical testing it appears that the approach of Fibonacci Encoding does not require much additional code and executes quickly. In running an initial test using the most popular encoding algorithm I found that this required less than 2kbs of additional code and was able to execute at a speed ranging from sub-millisecond to 2ms, both server and client side. There are indications that encoding can be handled even faster and with less code. I found this way forward highly effective for compression of data in the way the GPP RFC proposes.&lt;/p&gt;

&lt;p&gt;One of the subsections handles Legitimate Interest. It seems clear from recent EU court cases that this is not possible to claim against a users’ consent and as a methodology it does not seem likely to be replicated by future privacy laws. It should be noted as depreciated or perhaps fully removed from the spec. This also opens up the question of what happens to depreciated data uses or states, which it might be useful to explore in the spec.&lt;/p&gt;

&lt;p&gt;Finally, I really appreciate the un-encoded iteration of the USPrivacy String attached to the end of the GPP string. I believe that the USPrivacy approach represents a clear, transparent, and easy for users to understand methodology that I wish was more broadly applied.&lt;/p&gt;

&lt;h4 id=&quot;vendor-consents&quot;&gt;Vendor Consents&lt;/h4&gt;

&lt;p&gt;At the end of the day however, GPP, even with the improvements like Fibonacci Encoding, represents an unbound string that could theoretically expand forever, getting larger and more difficult to manage as the number of privacy laws and vendors increase. Per-vendor consents represent significant problems: the EU courts have challenged them, they are the biggest source of consent string bloat, vendor registry and identification issues plague both TCF and this proposal. It seems impossible to continue with this process, and unrealistic to expect users to dig into those nuances.&lt;/p&gt;

&lt;p&gt;So many problems that GPP faces would be resolved by removing this concept. Vendor consents do not reflect regulator or user expectations for a system like GPP. They encourage the creation of dark patterns and bad UX. Worse they increase the fingerprinting risk for users and the overhead for transmission for publishers and all participants.&lt;/p&gt;

&lt;h4 id=&quot;a-note-on-the-consent-string-and-server-to-server-operations&quot;&gt;A note on the Consent String and Server to Server operations&lt;/h4&gt;

&lt;p&gt;Server to Server operations are not fully explored in this specification beyond use of OpenRTB. However, consent states apply to all sorts of other data transactions including the growing use of 2nd party data trading and clean rooms for targeting. It would be useful for the specification to include a section that addresses how, if at all, it might be used in these contexts.&lt;/p&gt;

&lt;h2 id=&quot;gpp-principles&quot;&gt;GPP Principles&lt;/h2&gt;

&lt;p&gt;I generally agree with the GPP principles. I’m especially interested in the ideas around converging regional- and country-level laws into standard compliance signals (“jurisdictional overlap”) that understand rights as overlapping and capable of being commonly represented. I think these are good principles. However, they do not seem to broadly inform the specification.&lt;/p&gt;

&lt;p&gt;The existing GDPR purposes are just added to by the CCPA purpose instead of specifying some sort of overlap or understanding of the CCPA’s opt out as a compounding of other signals or–more usefully–visa versa. In fact the generalized opt-out specified by the USP API is so much more useful because of its generalness it has become a way to specify privacy in other situations. It would be great to see a deeper exploration of the GPP principles in the GPP specification; especially when leveraging a concept like jurisdictional overlap could result in significant simplification.&lt;/p&gt;

&lt;h3 id=&quot;a-note-on-ui&quot;&gt;A Note on UI&lt;/h3&gt;

&lt;p&gt;The GPP specification does not explore the user interfaces that might support it. In the case of a privacy tool that is irresponsible, especially considering the IAB is facing legal action over encouraging ineffective and misleading user experiences through TCF’s design. Without express guidance around UI, participants have to assume that systems will default to the TCF UI recommendations and patterns. These UIs are not as effective as they should be, are perpetually under challenge in courts and the loose rules around them allow the creation of outright anti-user designs. The GPP should not repeat the mistakes of TCF here and make clear specific user flows, especially where the API identifies interactions with specific screens as it extends from TCF.&lt;/p&gt;

&lt;h2 id=&quot;notes-on-compliance-issues-and-gpps-relation-to-eu-court-findings&quot;&gt;Notes on Compliance Issues and GPP’s Relation to EU Court Findings&lt;/h2&gt;

&lt;p&gt;GPP does not appear to address any of the standing objections by EU courts around TCF. In fact the specification makes it very clear that it is pulling from TCF wherever possible, repeating many of its mistakes. It is hard to see any entity getting behind adoption of GPP while the fundamental underlying assumptions of TCF which it replicates continue to be under threat of being declared illegal.&lt;/p&gt;

&lt;p&gt;It was my hope that GPP would represent a progression, a resolution of some of the problems TCF presents for compliance.&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;GPP’s transmission of consent strings downstream still presents a fingerprinting risk through their complexity. GPP does not provide active enforcement mechanisms. The system does not do anything meaningful to assure that individual users’ choices are respected throughout the ecosystem.&lt;/p&gt;

&lt;p&gt;GPP’s continuation of vendor-level consents is overwhelmingly complex, unfair to users, and creates unnecessary technical complications. It also encourages difficult or bad user interfaces in order to handle compliance on top of GPP; ones that would seem to be only more complex than TCF.&lt;/p&gt;

&lt;p&gt;With the potential for endless expansion, both on-interface and on-string, is unbound and could grow infinitely over time. This also compounds the risk of the GPP string being useful in fingerprinting users, and perhaps even becoming a fingerprint in-and-of-itself.&lt;/p&gt;

&lt;p&gt;Considering the objections that TCF faces, an attempt to present GPP as an evolution of TCF that would address TCF’s problems–when it does not truely address those problems–is a threat to the continuing existence of Open RTB. The real time bidding ecosystem is desperately in need of an effective consent system.&lt;/p&gt;

&lt;p&gt;Without a reliable consent system RTB may be declared fully illegal by regulators, lawmakers or courts. GPP is not a reliable or effective consent system and pretending otherwise only puts the entire ecosystem at further risk.&lt;/p&gt;

&lt;h2 id=&quot;ways-forward&quot;&gt;Ways Forward&lt;/h2&gt;

&lt;p&gt;It is time to go back to the drawing board on the parts of GPP that replicate the flaws of TCF.&lt;/p&gt;

&lt;p&gt;GPP should consider enforcement mechanisms, real time hooks, active script control on the page, and active protection of users who do not consent to tracking. It is within GPP’s scope to build and standardize such systems.&lt;/p&gt;

&lt;p&gt;GPP should remove the concept of vendor-level consents. Expecting vendor-level consents is not consistent with user behavior and, while I previously had no data to back that assumption up, years of TCF shows vendor-level consent to be pointless. No significant number of users is going to go through even the smaller list of over one thousand ad tech entities and make specific consents for one of them outside of their choice for the other. That is even less likely should vendor lists expand to encompass more and more vendors, which is likely to happen as additional ad tech operations become relevant to privacy regulators. It’s time for the IAB Tech Lab to drop vendor-level consents. Anything less would give us an insufficient specification.&lt;/p&gt;

&lt;p&gt;The IAB’s work on the USPrivacy API should be taking the lead here: simple, human-readable, privacy signals. The IAB Tech Lab’s excellent work on understanding jurisdictional overlap can be used to support simpler, better and more straightforward privacy strings that operate along those lines.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Cover image is “portrait of a confused person at a computer” generated by &lt;a href=&quot;https://www.midjourney.com/app/&quot;&gt;Midjourney&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 02 Sep 2022 10:00:00 -0400</pubDate>
        <link>https://aramzs.github.io/web-standards/2022/09/02/global-privacy-platform-review.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/web-standards/2022/09/02/global-privacy-platform-review.html</guid>
        
        <category>ad-tech</category>
        
        <category>privacy</category>
        
        <category>IAB</category>
        
        <category>IAB Tech Lab</category>
        
        <category>compliance</category>
        
        <category>APIs</category>
        
        
        <category>web-standards</category>
        
      </item>
    
      <item>
        <title>Topics API Review</title>
        <description>&lt;p&gt;With the &lt;a href=&quot;https://github.com/patcg-individual-drafts/topics&quot;&gt;Topics API&lt;/a&gt; now in &lt;a href=&quot;https://developer.chrome.com/en/docs/privacy-sandbox/topics-experiment/&quot;&gt;origin tests&lt;/a&gt;, it has been interesting to see just how the web gets categorized. I do see a lot of potential in the technology and I can’t argue with the privacy promise being a significant improvement over third party cookies. The biggest issue with Topics is how it will exist within the larger network of advertising technology entities and the market mechanics of the ecosystem.&lt;/p&gt;

&lt;p&gt;Topics might provide useful transitional technology to move off third party cookies and create privacy improvements, but the ad tech marketplace provides a clear history of such technologies becoming used in problematic ways: to enrich middlemen, confuse and mislead buyers, and disempower the site owners on which the associated ads would be run.&lt;/p&gt;

&lt;h2 id=&quot;qualities-of-concern&quot;&gt;Qualities of Concern&lt;/h2&gt;

&lt;p&gt;I make some assumptions in this assessment that may be less common among others examining Topics API.&lt;/p&gt;

&lt;p&gt;1: &lt;strong&gt;Topics will become the system of highest trust&lt;/strong&gt;. Trust between participants in the ad tech ecosystem is extremely low. At the same time, almost all participants are seeking the “surest thing” within ad tech. Or at least the capacity to represent themselves as providing the “surest thing” to buyers. This includes metrics, anti-fraud and, perhaps most of all, tracking. While other systems operate mostly on a closed basis and provide tracking and tagging of users through black box systems of decreasing (if ever successful) accuracy, Topics would provide a transparent system of user categorization, based on open source technology, created through insights generated though a browser’s full access into users’ history online. As buyers flock towards accuracy, Topics will–if released to all Chrome users–quickly become the most desired dimension of user tracking. &lt;em&gt;I therefore assume buyers will assign Topics high value.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;2: &lt;strong&gt;Inevitable Commoditization of Topics within Blackbox Systems&lt;/strong&gt;. Because Topics will become the most trusted property for defining users, Topics will quickly become integrated in multiple other systems where it will become mixed with other signals as part of a way to keep these systems’ proprietary user signals competitive with Topics. Pressure to activate Topics will become increasingly high as requests by buyers’ for this targeting are paired with 3rd party ad tech systems’ pressure to activate them as well. Ad tech intermediaries will consider the ability to collect Topics to be of high value, and the wider variety of Topics the better. &lt;em&gt;It is inevitable that the launch of Topics will be followed by the emergence of a market in closed-source Topics prediction and Shadow Topics that will become of high value because of the borrowed trust from the browser system.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;3: &lt;strong&gt;Sites will bend towards optimizing for Topics&lt;/strong&gt;. Because Topics will be of high value for ad pricing and ad tech intermediaries will consider access to a variety of Topics to be of high value, I believe that their entry into the ecosystem will inevitably push to alter the web publishing ecosystem back towards single-topic-per-domain sites with narrow focus. Small, focused sites that can acquire large audiences will find ecosystem-level advantages over large general-focus sites and gain high value CPMs through arbitrage. This is not the first time the advertising ecosystem has encouraged this exact change and it was not advantageous long-term in the past, not to mention: potentially misleading users, encouraging spammy sites, and forcing sites into configurations that will become extremely disadvantageous after third-party cookies are entirely eliminated. Some sites will debundle into networks of topically focused sites in order to acquire users with the particular Topics that mark them as high CPM opportunities. Only the general news sites that are already part of a large ranging network of smaller Topically-focused properties with which they share an internal ad tech domain will see the monetary benefits of Topics without altering their behavior. Other large general coverage sites will be forced to load a large variety of third party scripts to participate effectively in Topics and will lose any potential gains to ad tech tax, performance decreases, and arbitrage behavior. In any case &lt;em&gt;this will replicate and worsen the phenomenon of ad systems deforming the behavior of publishers.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;privilege-of-large-scope-systems&quot;&gt;Privilege of Large Scope Systems&lt;/h2&gt;

&lt;p&gt;I believe that the objections to FLoC on the basis of creating an even playing field for all systems that query the API were incorrect. If there is to be any access to these types of tracking terms, as decided by a browser, privileging that access to only those systems with the widest scope of domains on which they have a presence replicates, solidifies and may even worsen the worst behavior of the ad tech ecosystem. It will further discourage new entrants and competition while solidifying the status of current ad tech participants who run scripts across a wide range of domains. If large ad tech participants are the only participants to have broad access to Topics, the privacy risks are just as great, if not greater, because of their capacity to record a wide variety of user behavior. Solidifying the ecosystem around these participants also increases privacy risk as it empowers them to further attempt to breach users’ privacy using their preexisting massive tracking apparatus and capacity to join data with other systems through data purchases and corporate mergers. At the same time it lacks the capacity to keep such ad tech systems honest by giving other participants the capacity to check big systems’ Topics reporting with their own.&lt;/p&gt;

&lt;p&gt;However, broad access to Topics gives an opportunity for smaller participants to act competitively on the open market and potentially refuse to participate with large ad tech systems that wish to mix Topics into proprietary black-box targeting. If, as I assume, Topics becomes the user property of highest value, then sites willing to transmit Topics in clear text will be able to avoid the market dynamics that pressure them to implement third party scripts, by making the highest value property available directly to the buyer.&lt;/p&gt;

&lt;p&gt;There has been some discussion of a large-scope publisher consortium to share and retransmit Topics, but this does not solve the problem of running such a script on non-publisher sites where users are likely to obtain valuable topics (like advertisers’ pages). Further, the costs involved in running such a system would seem to inevitably force it into replicating the exact undesirable models of behavior publishers would see from other participants, in order to compete and cover costs.&lt;/p&gt;

&lt;h2 id=&quot;large-multi-topic-reputable-domains&quot;&gt;Large, Multi-topic, Reputable domains&lt;/h2&gt;

&lt;p&gt;Large general topic news and information sites will not contribute meaningfully to the generation of high-value user Topics. Considering that Topics will be considered high value and mixed into black box ad tech systems, a shadow market of Topics prediction will almost certainly arise and be given value. This market will generate Shadow Topics on the basis of particular domains seeing Topics commonly held by multiple users over multiple Topics generation epochs. This will mean that Shadow Topics will be more likely to appear within predictive ad tech systems (especially the blackbox systems that claim to pass along Topics, who can treat predicted and actual topics the same) on small topically-focused sites. The result will disadvantage large generally-focused sites from participating within the Shadow Topic ecosystem and disadvantage them in CPMs. It will also increase incentives for dishonest user categorization by ad tech ecosystem middlemen who maintain these Shadow Topic systems.&lt;/p&gt;

&lt;h2 id=&quot;arbitrage-and-drive-to-the-bottom-pricing&quot;&gt;Arbitrage and “Drive to the Bottom” Pricing&lt;/h2&gt;

&lt;p&gt;The per-domain classification process that Topics currently uses will generate significant incentives in user valuation towards driving users towards topically focused sites and therefore attaching Topics to them. This will further increase those sites that see common participation among users in high value topics incentive to participate in a Shadow Topic ecosystem which will reward them with high CPMs. This will replicate, worsen, and calcify the current system of ad arbitrage to the advantage of sites that can be spun up quickly, generate content that will focus users into specific Topics, send those users through a funnel of well-known Topic sites, buy a great deal of traffic, and then resell that traffic on their own site for high CPMs. This will drive CPMs down on reputable sites while encouraging the creation of low-quality but topically focused sites. It will also force large general-coverage sites to spend more money on arbitraging users with specific Topics, paying to have them come to the reputable site to sell ads against them and also to increase bids on the reputable site by training predictive systems systems to include high value Topics for a domain in that domain’s Shadow Topics. This is a cycle that already exists because of third party cookies and does not advantage users, buyers, legitimate operators of ad tech or the health of the web. If Topics replicates it as is and does not provide a way to curtail this cycle (which I cannot see it doing in its current format) then it is reinforcing one of the very negative outcomes of third party cookies I had hoped to see ended.&lt;/p&gt;

&lt;h2 id=&quot;ad-safety-risk&quot;&gt;Ad Safety Risk&lt;/h2&gt;

&lt;p&gt;While the limited set of Topics is relatively unlikely to trigger negative targeting, it is easy to see a future expanded Topics set where a Topic will cause a user to be negatively targeted in a way that could be dangerous. Even among the current topic set there are risks. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;243. News&lt;/code&gt; could become a negative targeting vector for buyers who wish to spread misinformation. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;140. Software&lt;/code&gt; could become a positive targeting vector for crypto currency scams. While these are dangers intrinsic to any tagging system, including contextual, an inability to block specific Topics could leave a site vulnerable to malicious buyers who would pay higher sums for highly accurate Topics, while the pressure from good buyers will leave legitimate publishers with little choice but to participate. All user-based tracking presents this risk, but the inevitable buyer preference for Topics increases this pressure.&lt;/p&gt;

&lt;h2 id=&quot;sites-who-cannot-exclude-a-low-value-topic-will-be-at-a-disadvantage&quot;&gt;Sites who Cannot Exclude a Low Value Topic will be at a Disadvantage&lt;/h2&gt;

&lt;p&gt;Sites may find themselves commonly attracting users with low value Topics, or potentially seeing an attack by user agents who intentionally acquire low value Topics and go to the site in order to train ad tech middlemen running Shadow Topic systems to believe that the site attracts low-valued Topics traffic. These sites will find themselves having to choose between the pressure of buyers and buy-side systems who want Topics and turning it off entirely. This risks the entire Topics ecosystem as some high value sites may find it more advantageous to turn off the Topics system. Alternatively, sites may find themselves unable to withdraw from Topics due to market pressure and see their CPM values slowly drop with no clear solution. It is clear that individual domains should have the capability to have more nuanced options than Topics being active or inactive. Sites should have the capability to block any Topics-consumer operating on their domain from receiving specific Topic terms.&lt;/p&gt;

&lt;h2 id=&quot;privacy-promise&quot;&gt;Privacy Promise&lt;/h2&gt;

&lt;p&gt;Outside of the larger ecosystem impact I foresee Topics could have, user privacy here is well preserved. I have been impressed by the privacy improvements and believe that Topics presents a privacy improvement over both FLoC and third party cookies. Obviously some users will not want to be tracked at all, and others will continue to find the idea of being ‘followed’ by interest-based advertising unsettling. Topics is not perfect for privacy for these reasons and I’m sure for others that more focused privacy advocates may discover. Implied decisionmaking on the basis of Topics and their ability to contribute towards more indirect algorithmic redlining and discrimination is still a risk. However, I recognize that there is some privacy risk that has been determined to be desirable in exchange for the wider functioning and profitability of the web, especially in a time of transition.&lt;/p&gt;

&lt;p&gt;Additionally there will be periods of higher and lower risk for Topics use. It may be worthwhile for Chrome, or any implementer, to consider agreeing on block-out dates for Topics epochs. It would be wise to define sensitive periods where any additional user tracking has a higher risk of being used maliciously and the need for user privacy has an increased societal weight, like elections.&lt;/p&gt;

&lt;h2 id=&quot;a-high-risk-of-reversal-on-performance&quot;&gt;A High Risk of Reversal on Performance&lt;/h2&gt;

&lt;p&gt;The past few years have seen an increasing focus on site performance, in part led by Google’s introduction of Core Web Vitals as a Search Optimization signal. Increased performance has benefited the users of the web and digital publishers. Because Topics assignments are only visible to those systems that are on the page when a Topic is assigned, it is likely to reverse the recent trend towards moving ad tech systems to small-script or no-script approaches that keep third parties’ scripts off domains. Because of the high desirability of Topics and the high desirability of Topics-mixed products every ad tech system will want to have a script on-page and they will want to participate in as many domains as possible. This is not a desirable outcome for users or site performance.&lt;/p&gt;

&lt;h2 id=&quot;assessment&quot;&gt;Assessment:&lt;/h2&gt;

&lt;p&gt;At this time I do not find Topics a desirable proposal. While I have made some suggestions here that could lead to improvement, perhaps drastic, I believe that Topics’ capacity to impact the larger ad tech ecosystem in a negative way and to solidify some of the existing problems within that ecosystem, presents a high risk to the health of the web, even looking at Topics as a temporary measure. There was significant feedback on FLoC from privacy advocates around the question of access, but Topics particular approach to limiting access means that the pressures and mechanics of the ad tech ecosystem would damage improvements in privacy that Topics’ current construction around limiting access could create. If this system were to go forward it is more desirable that Topics be broadly accessible. Especially because doing otherwise will inevitably become a false privacy promise when ad tech systems will predict and trade in Topics information the same way they have with other user data. This type of access limitation is fundamentally not maintainable when the rest of the ad tech ecosystem comes into play, even if accuracy is lower. Privacy for users is further threatened by how Topics is likely to be rolled into the larger ecosystem.&lt;/p&gt;

&lt;p&gt;While this assessment is generally negative on Topics, it is not intended to be a discouraging one. Topics does show many interesting properties and I would like to see this style of browser mediation of advertising potentially built upon further in privacy-preserving ways. With the addition of more nuanced controls given to domain-owners/publishers, I see a potential compromise in the future of such systems. As long as users can make the choice of if they trust their browser with these operations, there is potential to create a smooth offramp from third party cookies towards better privacy across the web with these methods.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Cover image is “people being categorized” generated by &lt;a href=&quot;https://www.midjourney.com/app/&quot;&gt;Midjourney&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 04 Aug 2022 13:00:00 -0400</pubDate>
        <link>https://aramzs.github.io/web-standards/2022/08/04/topics-api-review.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/web-standards/2022/08/04/topics-api-review.html</guid>
        
        <category>ad-tech</category>
        
        <category>privacy</category>
        
        <category>Google</category>
        
        <category>Privacy Sandbox</category>
        
        
        <category>web-standards</category>
        
      </item>
    
      <item>
        <title>On the Characteristics of an Effective Consent Signal</title>
        <description>&lt;p&gt;What follows is the written copy of my comments to the California Privacy Protection Agency. I spoke to the CPPA on behalf of The Washington Post about privacy law and rights to opt out.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Hello, I am Aram Zucker-Scharff, the Lead Privacy Engineer for The Washington Post and Senior Solutions Engineer for our Zeus advertising technology group, which serves over 100 news sites. I also co-chair the W3C’s Community Group focused on Private Ad Technology and contribute to other groups to speak on issues relating to the intersection of business, privacy and advertising. I led and lead The Washington Post’s technical work around complying with California Privacy regulations. Today I’m speaking on behalf of The Washington Post.&lt;/p&gt;

&lt;p&gt;The Washington Post was able to seamlessly roll out CCPA compliance for our California customers. When it became clear that the United States Privacy API (or USP API), as defined by the Interactive Advertising Bureau (the IAB), would become the industry standard for publishers and advertising systems we were quick to adopt it. It is encouraging that a user with a little technical experience can interact with and understand the output of the USP API in clear text.&lt;/p&gt;

&lt;p&gt;The idea of the technical signal warrants further exploration as it could have an adverse effect on businesses. Advertising is one of the main streams of revenue at The Washington Post. In the world of digital display advertising we count load times and the time to first-ad-shown in milliseconds, and have found that every millisecond counts, and adding extra loading time can have significant cost implications. Handling multiple technical signals, not having a single standard and instead processing multiple such signals, any of which could be built on technology that itself introduces a delay, would be a significant burden for publishers. It would mean extra code on page, engineering hours to build and maintain that code, and–depending on the shape of that technology–additional delay as we waited on a response from the system.&lt;/p&gt;

&lt;p&gt;This is why it was crucial for me to be involved with the group that created the Global Privacy Control. So many of the potential pitfalls and problems that could come out of a technology-based control were avoided in its creation. It does not require complex negotiation with an API, it does not deliver a Promise–a technical concept in Javascript which would cause us to anticipate a delay in response–and it does not require complex calculation or decoding.&lt;/p&gt;

&lt;p&gt;When the GPC specification was ready it was easy and straightforward for us to implement it.  The entire change that was needed to support GPC on The Washington Post was 7 lines of code, less than One Hundred and Sixty Characters.&lt;/p&gt;

&lt;p&gt;I’m prepared to show the actual code we have actively on our website to make clear the low lift for implementation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/AramZS/aramzs.github.io/blob/master/_includes/GPC-Compliance-Code.png?raw=true&quot; alt=&quot;7 lines of code to get GPC implemented&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When this code runs it sets the response in our systems to follow the user’s opt-out preference and is picked up by every relevant piece of ad and tracking technology on the page and either alters their behavior or is passed downstream the same as a manual opt out process.&lt;/p&gt;

&lt;p&gt;The Washington Post takes these 7 lines of code and has them integrated into our CCPA compliance mechanism that processes user status with the USP API. This happens on every applicable page of our website. Once this code runs and processes the signal it is available for any other system that might need to know about a user opt out. The setting of the USP API in this way passes the signal to all downstream providers who then can comply with it. This code easily alters the state of the toggle we provide for California users, to display that they have selected Do Not Sell mode, making it visible that the user has selected it. We think of it as a robot for clicking that toggle.&lt;/p&gt;

&lt;p&gt;With GPC, the opt out process actually occurs even faster than it would normally.  Of the ways we handle compliance, GPC, in our engineering experience, has proven the fastest and most straightforward. We can also see the GPC HTTP header on any request where the user has it on and make a decision about how to handle it before the page even loads.&lt;/p&gt;

&lt;p&gt;Our experience shows it is important to have clear, fast and transparent ways for a user to opt out and for a site to receive that opt out.&lt;/p&gt;

&lt;p&gt;Because the user’s privacy setting and the GPC signal itself are available on every page it can be easy to note to the user it is detected, and we have a variety of options to act on that: we can restrict particular technologies, display the user’s opt out status, and make privacy-compliant ad calls as close to instantly as we can get.&lt;/p&gt;

&lt;p&gt;Our hope in speaking here is to make clear our experience implementing California privacy law and the ease of use of the Global Privacy Control for opt-out. As rulemaking is being considered we think that what we have described is the required characteristics for a technologically appropriate signal: fast, clear, and easily integrated into existing practices. We believe these properties make GPC a signal in the best interest of our readers, ourselves as a publisher, and the ad technologies we collaborate with; one that can be used to understand an opt out under CPRA; and we wanted to make our experience of early adoption clear and urge continued support of this methodology.&lt;/p&gt;

&lt;p&gt;We appreciate the opportunity to speak here.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I wrote this on behalf of The Washington Post, who is my employer, and it is published here with their permission and review.&lt;/em&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 05 May 2022 16:00:00 -0400</pubDate>
        <link>https://aramzs.github.io/written-for-the-washington-post/2022/05/05/comments-to-california-privacy-protection-agency.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/written-for-the-washington-post/2022/05/05/comments-to-california-privacy-protection-agency.html</guid>
        
        <category>ad-tech</category>
        
        <category>privacy</category>
        
        <category>CCPA</category>
        
        <category>CA</category>
        
        <category>California</category>
        
        
        <category>written-for-the-washington-post</category>
        
      </item>
    
      <item>
        <title>The third-party cookie delay: nothing changes fast, but still it changes</title>
        <description>&lt;p&gt;Google &lt;a href=&quot;https://blog.google/products/chrome/updated-timeline-privacy-sandbox-milestones/&quot;&gt;recently announced&lt;/a&gt; they are delaying their plan to disable third-party cookies in Chrome, along with their Privacy Sandbox initiative. It’s tempting to look at this as a reprieve, a little extra time to relax and move post-cookie efforts into low gear, hoping the additional time will be enough to find better solutions. However, it’s important to recognize that nothing has really changed.&lt;/p&gt;

&lt;p&gt;The end of third-party cookies is &lt;a href=&quot;https://www.adexchanger.com/content-studio/google-quietly-drops-new-privacy-sandbox-guidance-clamps-down-on-workarounds-for-cross-site-identity-and-tracking/&quot;&gt;still advancing&lt;/a&gt;, and all the reasons for that happening are still valid and very much real. &lt;a href=&quot;https://www.pewresearch.org/fact-tank/2020/04/14/half-of-americans-have-decided-not-to-use-a-product-or-service-because-of-privacy-concerns/&quot;&gt;Readers are still concerned about being tracked&lt;/a&gt; and having their data leaked into an uncontrolled ad tech marketplace. They still look to publishers to act on their behalf. Buyers also continue to &lt;a href=&quot;https://qz.com/2000490/the-death-of-third-party-cookies-will-reshape-digital-advertising/#:~:text=Stephan%20Pretorius%2C%20chief,matters%2C%E2%80%9D%20he%20said.&quot;&gt;question the efficacy&lt;/a&gt; of the current 3p-data-driven marketplace. Regulators &lt;a href=&quot;https://digiday.com/marketing/californias-attorney-general-backs-call-for-global-privacy-control-adoption-with-fresh-enforcement-letters-to-companies/&quot;&gt;still seek to protect user data&lt;/a&gt;. Technology is still being transformed by engineering-based privacy efforts, and an increasing number of companies — with Apple leading the charge — are marketing themselves and their products on privacy quality.&lt;/p&gt;

&lt;p&gt;For forward-looking publishers, nothing has changed. It still benefits us to act as strongly as possible on behalf of privacy-seeking readership by leaning into privacy. The deadline may have moved, but &lt;a href=&quot;https://privacysandbox.com/timeline/&quot;&gt;the future is still an increasingly private one&lt;/a&gt; and the market, as ever, favors early adopters.&lt;/p&gt;

&lt;p&gt;Until the end of third-party cookies, there are plenty of old technologies we can’t compete without, as well as new ones that seek to build a platform for advertising, free of third-party cookies. Zeus Technology isn’t waiting. We will continue to innovate, test and collaborate with partners in the ad tech ecosystem who bring performance, both in eCPMs and speed on-page, on behalf of our customers. Through Zeus, our publishers will find both the resources to maintain their momentum through the end of 3p’s status quo, and the runway to continue to operate and expand via experimentation in the &lt;em&gt;future&lt;/em&gt; of ad tech.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://blog.zeustechnology.com/the-third-party-cookie-delay-nothing-changes-fast-but-still-it-changes-ccca0d05105e&quot;&gt;I originally wrote this on behalf of The Washington Post for their Zeus Technology Blog. The original post can be found here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 12 Aug 2021 18:20:00 -0400</pubDate>
        <link>https://aramzs.github.io/written-for-the-washington-post/2021/08/12/the-third-party-cookie-delay-still-it-changes.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/written-for-the-washington-post/2021/08/12/the-third-party-cookie-delay-still-it-changes.html</guid>
        
        <category>ad-tech</category>
        
        <category>privacy</category>
        
        
        <category>written-for-the-washington-post</category>
        
      </item>
    
      <item>
        <title>The Web is For People Not Just Professionals</title>
        <description>&lt;p&gt;A really great post by Jeremy Keith:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You can choose to make it really complicated. Convince yourself that “the modern web” is inherently complex and convoluted. But then look at what makes it complex and convoluted: toolchains, build tools, pipelines, frameworks, libraries, and abstractions. Please try to remember that none of those things are required to make a website.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;This [the web] is for everyone. Not just for everyone to consume, but for everyone to make.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read the rest: &lt;a href=&quot;https://adactio.com/journal/18337&quot;&gt;“Foundations”&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 06 Aug 2021 16:05:00 -0400</pubDate>
        <link>https://aramzs.github.io/read/2021/08/06/the-web-is-for-people-not-just-professionals.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/read/2021/08/06/the-web-is-for-people-not-just-professionals.html</guid>
        
        <category>tech</category>
        
        <category>standards</category>
        
        
        <category>read</category>
        
      </item>
    
      <item>
        <title>How Spotify asks listeners to hack its algorithm</title>
        <description>&lt;p&gt;I listen to a lot of music and one of the things I noticed over the years is that I got stuck in a rut. Listening to the same things over and over again and not really picking up anything new. A problem with algorithmic recommendations, of music, or anything really, is that they can trap you with more and more specificity, narrowing around your interests instead of broadening horizons.&lt;/p&gt;

&lt;p&gt;This narrowing has become even more difficult to escape now that my entire music experience is filtered through a streaming service, there’s no longer any time to trip over a song on the radio or even stumble over a recommendation on a pirating site. Even if someone was going to lend me a CD, I don’t have anything to play it anymore. Taking a single recommendation often isn’t enough to break out of the effect of my overall listening pattern. If I do nothing but passively consume music via a streaming service, I’ll likely never be pushed to the edge, much less out, of my comfort zone.&lt;/p&gt;

&lt;p&gt;This problem isn’t just one of music recommendations. Only, I think there’s a solution that leverages the algorithmic recommendation process to broaden, instead of limit, us and we can see it already in Spotify.&lt;/p&gt;

&lt;h2 id=&quot;the-sweet-escape&quot;&gt;The Sweet Escape&lt;/h2&gt;

&lt;p&gt;A brief guide to breaking your way out of your musical comfort zone.&lt;/p&gt;

&lt;h3 id=&quot;leveraging-organic-encounters&quot;&gt;Leveraging Organic encounters&lt;/h3&gt;

&lt;p&gt;In the world of the web, the term “organic” is used for a piece of content we find through actively searching for it, when it comes to music there is a similar process. I’m always fast on the Shazam trigger if I hear a song I like in a restaurant, movie or film. In the days I went outside (because we weren’t in a pandemic) I’d find a lot of very different songs that way. I also like Sofar Sounds concerts, I go in not knowing what music I’m going to get and potentially find something very different to enjoy.&lt;/p&gt;

&lt;p&gt;Once I get a song I like, that doesn’t really sound like anything else to which I listen, the first thing I do is head to the artist’s &lt;strong&gt;About&lt;/strong&gt; page on Spotify. From there I can follow links to &lt;strong&gt;Discovered On&lt;/strong&gt;, a set of playlists that include the artist. While one song isn’t enough to escape the reinforcement of listening to the same music on loop, a whole new playlist of similar music starts to open things up.&lt;/p&gt;

&lt;p&gt;A good example is the time I stumbled across &lt;a href=&quot;https://open.spotify.com/artist/0ZCO8oVkMj897cKgFH7fRW?si=gkUElgaORjqoibYnq_TgQg&quot;&gt;Los Ángeles Azules&lt;/a&gt;’ “Amor A Primera Vista” in a restaurant. Their About page led me to a Spotify-created playlist around &lt;a href=&quot;https://open.spotify.com/playlist/37i9dQZF1DWTmGGCbcoQhY?si=6EbUBPTUSFe2em1AClt7xA&quot;&gt;Cumbia Sonidera&lt;/a&gt; and checking through their Fans Also Like page let me dive into some similar bands.&lt;/p&gt;

&lt;h3 id=&quot;stealing-from-friends&quot;&gt;Stealing from Friends&lt;/h3&gt;

&lt;p&gt;As you dig into these different playlists, you’ll find that listening impacts your Discovery playlist, which uses similar algorithmic tools to generate suggestions. If you go wild in your journeys outside your comfort zone you may find it becomes a little less useful.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://media1.tenor.com/images/f2688dbd3ace6baed89be514193dfba7/tenor.gif?itemid=14993711&quot; alt=&quot;Breaking my grove by breaking my Discover playlist&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’m &lt;a href=&quot;https://twitter.com/Chronotope/status/1000748313963089921&quot;&gt;pretty sure I’ve broken my Discover playlist&lt;/a&gt; because it seems to often be filled with stuff I don’t particularly like. One time it was filled with &lt;a href=&quot;https://twitter.com/Chronotope/status/982376399766999041&quot;&gt;bitcoin rap about “lambos”,&lt;/a&gt; which was the worst. If I’m looking for an antidote, but with nothing particular in mind, I also look for new music by finding other people’s Discovery playlists in the Friend Activity feed. Now I have a folder entirely composed of other people’s Discovery playlists. It’s great because some of my friends have better and sometimes very different musical tastes than I. Hopping into a friend’s Discover playlist is a lot of fun, as it puts you outside your comfort zone, and is also a great exercise in listening to entirely different kinds of music.&lt;/p&gt;

&lt;p&gt;Occasionally there will be something great in my Discovery playlist, even now, so you can &lt;a href=&quot;https://open.spotify.com/playlist/37i9dQZEVXcEWUzYxxxhEC?si=Fipy_U5nSGKKuYtoi4HQXw&quot;&gt;make mine the first you explore&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This just scratches the surface of how you can dig into the algorithm for more musical variety.&lt;/p&gt;

&lt;h3 id=&quot;using-the-relationship-graph&quot;&gt;Using the Relationship Graph&lt;/h3&gt;

&lt;p&gt;Every Noise at Once is an algorithmic attempt to categorize music by genre and then place those genres and the bands that play them in relationship to each other. The &lt;a href=&quot;http://everynoise.com/EverynoiseIntro.pdf&quot;&gt;project emerged from trying to understand what a musical genre even is and how one could even recommend songs on that basis&lt;/a&gt; and is part of a system that was purchased by Spotify to help run the recommendation system you encounter in their app today.&lt;/p&gt;

&lt;p&gt;Here’s what the ENaO graph looks like for Classic Rock, one example of a genre I frequency listen to:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/AramZS/aramzs.github.io/blob/master/_includes/classicrock-band-space.PNG?raw=true&quot; alt=&quot;Every Noise at Once Band Cloud for Classic Rock&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;http://everynoise.com/EverynoiseIntro.pdf&quot;&gt;the description of how this algorithmic sorting came to be&lt;/a&gt; engineer Glenn McDonald notes:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The approach allows us (or our customers) to seed, and then organically grow, a new genre or style from essentially any inspiration. In a couple peculiar cases, we’ve gathered an initial artist list, let the computers give us some songs, and only then listened to those songs to find out what kind of music we were even talking about.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By creating a system which can organically enter into a genre and essentially reverse engineer it, Spotify has a tool that lets me easily break out of any musical bubble and find my way–&lt;a href=&quot;https://bit.ly/32hN4vJ&quot;&gt;wikipedia-effect-style&lt;/a&gt;–into entirely new universes of music.&lt;/p&gt;

&lt;p&gt;ENaO brings forth the ability to see the relationship graph of a genre. Here’s Classic Rock’s closely related genres (based on how listeners act, not on any historical reasoning).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/AramZS/aramzs.github.io/blob/master/_includes/classic-rock-sound-space.PNG?raw=true&quot; alt=&quot;Musical Genres by Closeness of type to Classic Rock&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now if I want to make a small move, say I want to still get some of the sound of classic rock but move away from the core music of the genre I might choose to move towards psychedelic rock, traditional folk, or art rock. The position tells me a little about the genre in relation to Classic Rock: “down is more organic, up is more mechanical and electric; left is denser and more atmospheric, right is spikier and bouncier.” But ENaO gives me another option, the inverse graph:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/AramZS/aramzs.github.io/blob/master/_includes/classic-rock-inverse-sound.PNG?raw=true&quot; alt=&quot;Musical Genres by Inverse of type to Classic Rock&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, if I’m feeling like I really want to flip my listening on my head I can pick something totally opposite of my normal genre. Perhaps Fluxwork or some Montreal Indie?&lt;/p&gt;

&lt;p&gt;From the Map area of ENaO I can expand the playlists I might explore based on a particular genre. The map shows a set of bands that I can try exploring individually. I can also head to one of the playlist links:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;playlist&lt;/code&gt; sends me to “The Sounds of [Genre]” playlists on Spotify. When I stumble across an interesting genre I will often save the Sounds Of playlist for later when I’m in the mood to explore it a bit deeper. As a result I have a &lt;a href=&quot;https://open.spotify.com/playlist/1ga7kXhbcB4tsOfpZqP7UX?si=erThuQAVTlSKKmxMCTNAPw&quot;&gt;whole&lt;/a&gt; &lt;a href=&quot;https://open.spotify.com/playlist/5m9ErLc15dYYCGzvrcVy8q?si=MUdGuOlGTBm1D2XkSCrC_A&quot;&gt;bunch&lt;/a&gt; &lt;a href=&quot;https://open.spotify.com/playlist/5INg0fRsoA1uYyyJwliHGS?si=GZvBDr6MQfSMHZ89zY5SjQ&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;https://open.spotify.com/playlist/1qpcTBjAx26Xiw6ZClVVGm?si=rbc7JlryRWuiwJ8OCkassA&quot;&gt;these&lt;/a&gt; &lt;a href=&quot;https://open.spotify.com/playlist/1qpcTBjAx26Xiw6ZClVVGm?si=SdUteV0sRgW7JsXEU2bmQg&quot;&gt;playlists&lt;/a&gt; which essentially act as up-to-date overviews to the genre I can dive into at any time.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;intro&lt;/code&gt; is essentially an ‘introduction’ to this genre with music that represents the core sound and is most popular among listeners of the genre.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pulse&lt;/code&gt; is an interesting look at which songs listeners of this genre currently prefer.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;edge&lt;/code&gt; is a fun one that shows you songs that people who like this genre currently enjoy outside the genre itself. It’s another great tool for pulling yourself out of a listening rut.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I might go to one or all of those playlists depending on how curious I am in order to find new music and save it to my liked songs.&lt;/p&gt;

&lt;h2 id=&quot;dont-stop-the-music&quot;&gt;Don’t Stop the Music&lt;/h2&gt;

&lt;p&gt;Once I find a song or genre I like, of course not every related song is my cup of tea, in the same way I like some classic rock bands, but not others. This is the part where I can “hack” the algorithm to help me develop an ear for a particular genre without knowing much about it. This is especially useful for me when I, an English-speaker, explore non-English genres. Here’s how it works:&lt;/p&gt;

&lt;p&gt;My neighborhood Vietnamese restaurant plays really great Thai music. Of course, I didn’t know what type of music it was or even what language it was in when I first heard it, I had to Shazam it. The nature of exploring music this way is sort of naive so please excuse any factual errors to follow. Over the course of one dinner I had a few songs that I could explore. “&lt;a href=&quot;https://open.spotify.com/album/4qTYvKGgpzAv8RZ7xlriKb?highlight=spotify:track:2PVLzzBM6KslHNMtxBYV3A&quot;&gt;โคตรเลวในดวงใจ&lt;/a&gt;” by Takkatan Chollada is classified as Thai pop country. “&lt;a href=&quot;https://open.spotify.com/track/1CxiMGrvmnbLjaetq7SKhN?si=io8zyGfeRnuDTWbZtlYUEQ&quot;&gt;เสียเวลาว่ะ&lt;/a&gt;” by electric.neon.lamp is in Thai pop indie playlists while “&lt;a href=&quot;https://open.spotify.com/track/0vUIzJuMzRAiPUn9xTyAzi?si=hRhlmYGgRbmdYIN5CJDxmw&quot;&gt;เสพติดความเจ็บปวด&lt;/a&gt;” by The Yers appears to be Thai pop rock. These are assumptions I make by looking at the &lt;strong&gt;Discovered On&lt;/strong&gt; playlists and translating the names.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/AramZS/aramzs.github.io/blob/master/_includes/spotify-yers-about-page.png?raw=true&quot; alt=&quot;Playlists on which The Yers appear&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Judging on these three songs it looks like I would enjoy Thai Pop music. Now I can throw these songs together into a playlist. When I create a Spotify playlist around songs from a new genre, it only takes a few entries before I can scroll to the bottom and use the &lt;em&gt;Recommended Songs&lt;/em&gt; area.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/AramZS/aramzs.github.io/blob/master/_includes/thai-pop-recommended.png?raw=true&quot; alt=&quot;Playlist recommendations for more Thai pop songs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By hopping into that section and listening further for what I enjoy, I can pretty quickly develop a playlist of my favorite parts of this genre I’m newly exploring, without knowing a lot except the particular sound that appeals to me.&lt;/p&gt;

&lt;p&gt;This is sort of similar to the framework of Pandora, but is far more interesting because your seeding of the playlist can be a lot more focused and the way Spotify handles it gives you more transparency and control.&lt;/p&gt;

&lt;h3 id=&quot;getting-a-taste&quot;&gt;Getting a Taste&lt;/h3&gt;

&lt;p&gt;Once I do this for long enough, I start to develop a better ear for the subtleties of a specific genre. I may not have the tools of a music academic, so excuse my lack of proper terminology, but I will start to hear particular sounds or auditory themes that I groove to. I start by adding those into the playlist, but when I can start to differentiate the sub-genres by ear there comes a time to subdivide.&lt;/p&gt;

&lt;p&gt;When I started, I saw all three of those songs above as “Thai Pop”, but by looking at what playlists they are in and listening to them and any of the recommended songs I enjoy, I start to get a sense of what differentiates them.&lt;/p&gt;

&lt;p&gt;I’ll act on my new understanding of those differences by splitting the playlist into the three genres of Thai music that I perceive. Thai Pop, Thai Rock, and Luk thung (please excuse my ignorance as there is not a lot easily translatable or in English about most non-English music genres, but a rough description of this genre–as I understand it–is Thai Folk Country music. I highly recommend the &lt;a href=&quot;https://en.wikipedia.org/wiki/Luk_thung&quot;&gt;Luk thung Wikipedia article&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id=&quot;every-day-im-shuffling&quot;&gt;Every Day I’m Shuffling&lt;/h2&gt;

&lt;p&gt;The key to this process is the Recommended Songs list at the end of every playlist. It’s a particularly fascinating piece of the user interface for Spotify. The section represents a radically different way of interacting with a recommendation algorithm, one that differs from other social platforms. It is the difference between being directed by the algorithm as a subject vs you directing the algorithm as a tool.&lt;/p&gt;

&lt;p&gt;McDonald (still a few years from his employer being acquired by Spotify and this Recommendation mechanic becoming part of the app) states the core approach that creates this difference:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The point of the map, as with the genres, is not to resolve disputes but to invite you to explore music. It is an attempt – however uneven, idiosyncratic, and incomplete – to embrace this new state of the world, in which nearly all of humanity’s recorded music is streamable or downloadable, and give you a way to find out what you don’t know you don’t know.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All it takes is a few small changes in the user experience to make an algorithm that is a tool for exploration, expanding your view instead of narrowing it. I’m not saying that Spotify or this approach is perfect, but it is worlds different from using an algorithmically sorted platform like Facebook or Twitter because, with the exception of a few auto-generated playlists, Spotify has made the choice to give users the tools to “hack” the algorithm to explore new things, instead of trapping them in an ever narrowing funnel from the initial preferences they had when they started.&lt;/p&gt;

&lt;h2 id=&quot;editors-note---podcasts&quot;&gt;Editor’s Note - Podcasts&lt;/h2&gt;

&lt;p&gt;It’s worth noting that I wrote this before a well-earned explosion of controversy around Spotify royalty rates and podcasts. The podcasts question is especially interesting because all this awesome stuff that works well with music doesn’t work at all for podcasts (podcast recommendations seem to be a mystery in comparison). It’s a whole other essay, but I wonder if part of the problem is trying to run a whole new type of content without any of the tools that make Spotify, as an experience for music fans, work.&lt;/p&gt;

&lt;p&gt;You should read more about what’s going on here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.theguardian.com/technology/2020/nov/03/spotify-artists-promote-music-exchange-cut-royalty-rates-payola-algorithm?CMP=share_btn_tw&quot;&gt;Spotify to let artists promote music for cut in royalty rates&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.cnn.com/2020/10/29/media/spotify-earnings-joe-rogan/index.html&quot;&gt;‘The Joe Rogan Experience,’ a podcast that has sparked outrage, is a huge hit for Spotify&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://techcrunch.com/2020/10/28/joe-rogan-alex-jones-and-spotifys-illusion-of-neutrality/&quot;&gt;Joe Rogan, Alex Jones and Spotify’s illusion of neutrality&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.buzzfeednews.com/article/janelytvynenko/spotify-defends-alex-jones-joe-rogan-podcast&quot;&gt;Spotify Is Defending Alex Jones’ Appearance On “The Joe Rogan Experience”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.hollywoodreporter.com/news/justice-at-spotify-campaign-calls-for-increased-royalty-rates-more-transparency&quot;&gt;‘Justice At Spotify’ Campaign Calls for Increased Royalty Rates, More Transparency&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.theverge.com/2020/11/6/21552822/spotify-podcast-subscription-service-survey&quot;&gt;Spotify hints at subscription podcast service&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://thebaffler.com/salvos/the-problem-with-muzak-pelly&quot;&gt;The Problem with Muzak&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 09 Nov 2020 10:05:00 -0500</pubDate>
        <link>https://aramzs.github.io/fun/2020/11/09/spotify-asks-listeners-to-hack-its-algorithm.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/fun/2020/11/09/spotify-asks-listeners-to-hack-its-algorithm.html</guid>
        
        <category>tech</category>
        
        <category>music</category>
        
        
        <category>fun</category>
        
      </item>
    
      <item>
        <title>&quot;It is indefensible to lack morals in software&quot;</title>
        <description>&lt;p&gt;A great interview in VICE today with an engineer who quit GitHub over their ICE contract.&lt;/p&gt;

&lt;p&gt;Sophie Haskins:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It certainly frustrates me how apolitical tech is. It’s so individualistic and siloed. It’s unacceptable. The idea of tech for its own sake, and tech on its own terms makes me angry to no end.&lt;/p&gt;

  &lt;p&gt;Technology should be tools to help people, to enable humans. Even beyond moral questions, many engineers just make bad technology because they don’t think about humans when they’re making it. They’re obsessed with the technical details— but you have to start to realize your actions have consequences. It is indefensible to lack morals in software when we have such a huge impact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read the rest: “&lt;a href=&quot;https://www.vice.com/en_us/article/7x5an4/why-i-quit-github&quot;&gt;Why I Quit GitHub&lt;/a&gt;”&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://www.behance.net/gallery/31621339/GitHub-Octocats-Animation&quot;&gt;“GitHub Octocats Animation” &lt;/a&gt;by Shauna Keating is licensed under &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/?ref=ccsearch&amp;amp;atype=rich&quot;&gt;CC BY-NC-ND 4.0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 08 Nov 2019 17:05:00 -0500</pubDate>
        <link>https://aramzs.github.io/read/2019/11/08/indefensible-to-lack-morals-in-software.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/read/2019/11/08/indefensible-to-lack-morals-in-software.html</guid>
        
        <category>tech</category>
        
        
        <category>read</category>
        
      </item>
    
      <item>
        <title>A Presentation to Watch - Mike Monteiro: Let&apos;s Destroy Silicon Valley</title>
        <description>&lt;p&gt;A presentation on our responsibility of designers and by association technologists to change the world. This is a great presentation by Mike Monteiro which is well worth watching.&lt;/p&gt;

&lt;video src=&quot;https://github.com/AramZS/aramzs.github.io/blob/master/_includes/LetsDestroySiliconValley.mp4?raw=true&quot; controls=&quot;&quot; controlslist=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;/video&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;br /&gt;
The presentation appears to have occurred at &lt;a href=&quot;https://twitter.com/jointfutures&quot;&gt;Joint Futures&lt;/a&gt; recently.&lt;/p&gt;

&lt;p&gt;via: &lt;a href=&quot;https://twitter.com/JanKorsanke/status/1184534571951575040&quot;&gt;https://twitter.com/JanKorsanke/status/1184534571951575040&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 16 Oct 2019 15:55:00 -0400</pubDate>
        <link>https://aramzs.github.io/presentations/2019/10/16/a-presentation-to-watch-mike-monteiro-lets-destroy-silicon-valley.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/presentations/2019/10/16/a-presentation-to-watch-mike-monteiro-lets-destroy-silicon-valley.html</guid>
        
        <category>tech</category>
        
        
        <category>presentations</category>
        
      </item>
    
      <item>
        <title>The Ad Performance and Safety Protocol: Cleaner, better, safer ad experiences on iOS </title>
        <description>&lt;p&gt;The Washington Post is taking a proactive approach to digital display advertising issues with a new project that is set to fix bad code, while saving brands from code errors and cross-platform bugs in ad code. The Ad Performance and Safety Protocol (APSP) focuses on accidentally harmful ad behaviors to ensure a better user experience for all readers on The Post’s Classic iOS App.&lt;/p&gt;

&lt;p&gt;Ad safety has become a major issue for publishers over the last few years. Most solutions that have approached the issue have done so with a fundamentally reactive mindset. The assumption is that the majority of ad problems experienced by users are malicious actors in the landscape. This approach is one that is needed, but it does make an incorrect assumption: that users’ bad experiences with ads are only found in malicious events.&lt;/p&gt;

&lt;p&gt;While malicious events stand out to users and need to be secured, bad performing advertisements is a highly common experience users have with ads. The advertising technology landscape is filled with badly performant, slow, and malfunctioning advertisement code. While the largest impact this has is on slowing websites down, the issue became far more urgent for our Classic App when we determined users were experiencing two major problems at a high frequency. The first was a flaw in a common iOS package that was causing video to accidentally pop out of the ad frame. The second was a common script used to build ad animations that had a flaw causing an impact on iOS device performance. After testing and review, the iOS and RED teams at The Washington Post determined a fundamentally different approach was in order.&lt;/p&gt;

&lt;p&gt;To supplement our existing anti-fraud and anti-malicious-ad measures, we needed a proactive approach that worked with ad code to alter it for better performance. The solution was the Ad Performance and Safety Protocol, a set of checks and responses that actively scanned ad code coming into the app and determined a way to increase ad performance and decrease cross-platform bugs that were causing a worse ad experience for users.&lt;/p&gt;

&lt;p&gt;Changes to HTML specification a few years ago encouraged developers to replace common gif-style animation with background video elements. These elements are intended to be part of the ad’s overall presentation but a bug in some of the underlying standard code used to display ads in iOS can cause these videos to ‘pop out’. This is not an experience we or users want and because the video is intended to be background animation it is usually unbranded and strange to users. We resolve this issue with proactive code insertion.&lt;/p&gt;

&lt;p&gt;Additionally, a few very common ad scripts used by auto-generating design tools have issues we have diagnosed as causing infinite looping of code functions. These excessively overuse device CPU long after they have completed doing anything for the ad itself. APSP will stop these loops at the point we have decided to no longer allow any type of ad animation, when the scripts no longer have any use for the ad. This should have no impact on well-implemented analytics and viewability tools within the ads themselves.&lt;/p&gt;

&lt;p&gt;We have deployed this solution successfully, intervening in ads that would otherwise have negatively impacted reader devices and improving system performance for over a third of ads displayed. The result is faster ads, a better user experience and a safer overall environment for Washington Post iOS users.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://washpost.engineering/the-ad-performance-and-safety-protocol-cleaner-better-safer-ad-experiences-on-ios-a5d474468957&quot;&gt;I originally wrote this on behalf of The Washington Post for their Engineering Blog. The original post can be found here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;“Safety Key” by Got Credit is licensed with CC BY 2.0. To view a copy of this license, visit https://creativecommons.org/licenses/by/2.0/&lt;/p&gt;
</description>
        <pubDate>Wed, 28 Aug 2019 18:20:00 -0400</pubDate>
        <link>https://aramzs.github.io/written-for-the-washington-post/2019/08/28/the-ad-performance-and-safety-protocol-cleaner-better-safer-ad-experiences-on-ios.html</link>
        <guid isPermaLink="true">https://aramzs.github.io/written-for-the-washington-post/2019/08/28/the-ad-performance-and-safety-protocol-cleaner-better-safer-ad-experiences-on-ios.html</guid>
        
        <category>ad-tech</category>
        
        <category>interventions</category>
        
        
        <category>written-for-the-washington-post</category>
        
      </item>
    
  </channel>
</rss>
