<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>tk.gg</title><description>Media musings and technology thoughts from Matt TK Taylor</description><link>https://tk.gg</link><item><title>Lime&apos;s billing model is encouraging cyclists to run red lights</title><link>https://tk.gg/posts/lime-bikes-should-stop-charging-when-you-stop</link><guid isPermaLink="true">https://tk.gg/posts/lime-bikes-should-stop-charging-when-you-stop</guid><description>Per-minute billing on rental bikes may be the worst incentive for good behaviour.</description><pubDate>Wed, 24 Dec 2025 19:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { LimeBikeSimulator } from &apos;./ssr-safe.js&apos;;
import &apos;./style.css&apos;;
import route from &apos;./blackfriars-to-oxford.json&apos;&lt;/p&gt;
&lt;p&gt;You&apos;re a cyclist at an intersection in London waiting for a red light. You&apos;re on a dockless hire bike. Every second you wait, you&apos;re paying for being conscientious.&lt;/p&gt;
&lt;p&gt;Every junction you stop at, another cyclist chooses to run the light.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a bug. It&apos;s encoded into the design of the pricing. And it creates a dangerous incentive.&lt;/p&gt;
&lt;p&gt;Try it yourself. The simulator below shows &lt;a href=&quot;https://www.timeout.com/london/news/these-are-londons-most-popular-cycle-routes-according-to-lime-010924&quot;&gt;a route derived from Lime&apos;s own data&lt;/a&gt; of the most popular locations: Blackfriars Bridge to Oxford Street. Watch how much time is possibly spent waiting at lights, and how much that could cost.&lt;/p&gt;
&lt;p&gt;&amp;lt;LimeBikeSimulator
client:only=&quot;react&quot;
precomputedRoute={route}
/&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Lime charges by the minute. That&apos;s a reasonable business model for a service where time correlates with value, but actually we&apos;re focused on distance when thinking about a journey. Time spent waiting at a red light isn&apos;t valuable to you. It&apos;s time spent obeying traffic law. And unlike the same situation in a taxi, the legal consequences for skipping a red light are inconsequential most of the time, and self directed. It is far more now a social contract than it is perceived as a legal obligation.&lt;/p&gt;
&lt;p&gt;Here&apos;s the problem: with this model, running a red light saves money. The longer the light, the more you save. You can feel it every time you approach a junction and the light turns amber. Do you brake and pay to wait? Or do you push harder?&lt;/p&gt;
&lt;p&gt;Putting a monetary incentive for skipping that light is dangerous for pedestrians, for other cyclists, and for the riders themselves. And the danger multiplies with the weight of a &lt;a href=&quot;https://www.londoncentric.media/p/lime-bikes-keep-breaking-londoners&quot;&gt;30kg electric bike&lt;/a&gt; underneath you.&lt;/p&gt;
&lt;p&gt;Lime&apos;s billing model has turned riding safely into a premium feature you pay an extra 10-30% on your ride for.&lt;/p&gt;
&lt;h2&gt;A trivial fix?&lt;/h2&gt;
&lt;p&gt;Lime bikes have GPS. They track your speed in real-time. They know when you&apos;re moving and when you&apos;re not. The data exists. You can even download it from your account.&lt;/p&gt;
&lt;p&gt;Pausing billing when a rider&apos;s speed drops below a threshold for more than a few seconds would be straightforward. No new hardware. No new data. Just a different calculation in the billing logic. It could even work as a refund if the calculation requires journey and bike telemetry data.&lt;/p&gt;
&lt;p&gt;If Lime wanted to make this only work at lights, this demo shows how it&apos;s possible with open data to do that. If Lime wanted to make sure it wasn&apos;t abused, they could set a proportionate limit of &apos;free&apos; stoppage time per trip, or change their model entirely to focus on a combination of distance and time.&lt;/p&gt;
&lt;p&gt;The choice to charge for stop time isn&apos;t a technical limitation. It&apos;s a product decision that prioritises revenue over rider safety.&lt;/p&gt;
&lt;p&gt;In a quote to &lt;a href=&quot;https://archive.ph/tCS9v&quot;&gt;The Times&lt;/a&gt;, Hal Stevenson, director of policy at Lime, said that the “pricing model had a very low impact on whether people did or didn’t stop at red lights. We don’t subscribe to the idea that people are making these decisions about their safety, for the basis of 10 or 20p.”&lt;/p&gt;
&lt;p&gt;But this came from research that &lt;a href=&quot;https://www.thinksinsight.com/case-studies/making-cycling-safer---using-behaviour-change-research&quot;&gt;Lime commissioned themselves in July&lt;/a&gt;. They launched a &apos;Respect the Red&apos; campaign to &apos;encourage riders to stop at red lights&apos;. But surely a crucial part of that campaign would be looking at the behavioural effect of how they charge for time.&lt;/p&gt;
&lt;h2&gt;Hackney found a workaround&lt;/h2&gt;
&lt;p&gt;Hackney Council has &lt;a href=&quot;https://news.hackney.gov.uk/news/dockless-cycle-hire-is-about-to-become-the-same-price-as-a-bus-fare-in-hackney&quot;&gt;partially addressed this&lt;/a&gt;. From October 2025, e-bike rides in the borough were capped at £1.75 for 30 minutes — the same price as a bus fare. The meter still runs, but the financial pressure disappears. You pay the same whether you sprint through junctions or wait patiently at every light, provided your journey is less than 30 minutes total.&lt;/p&gt;
&lt;p&gt;It&apos;s a pragmatic fix that removes the incentive without requiring Lime to change their billing logic (they just sell 30-minute bundles for a cheaper price). But it only works within Hackney&apos;s boundaries, and it required council intervention to negotiate. The rest of London is still paying by the minute.[^1]&lt;/p&gt;
&lt;p&gt;Try building your own commute and see how much Lime&apos;s tax on safety might cost you.&lt;/p&gt;
&lt;p&gt;&amp;lt;LimeBikeSimulator
client:only=&quot;react&quot;
height={600}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details class=&apos;mb-8 rounded bg-slate-400/10 p-4&apos;&amp;gt;
&amp;lt;summary&amp;gt;About this simulation&amp;lt;/summary&amp;gt;
This is a simplified model. Traffic lights are placed using OpenStreetMap data, which includes signals on main roads even where separate cycleways exist. Light timings are randomised and cycle predictably rather than responding to real-world factors like traffic density or time of day. The actual stop-time cost on your commute will vary.
&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;[^1]: All of the above also applies to Forest and Voi, who also charge per minute in most of London.&lt;/p&gt;
</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Your newsroom should be using AI for this today</title><link>https://tk.gg/posts/ai-alt-text</link><guid isPermaLink="true">https://tk.gg/posts/ai-alt-text</guid><description>Accessibility is the easiest and most meaningful place to start, and alt text is where AI can make an instant impact.</description><pubDate>Wed, 08 Oct 2025 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { Image } from &apos;astro:assets&apos;
import AIComponent from &apos;./AIComponent&apos;&lt;/p&gt;
&lt;p&gt;import nyt_hp_img from &apos;./nyt_hp.png&apos;
import bbc_hp_img from &apos;./bbc_hp.png&apos;
import guardian_hp_img from &apos;./guardian_hp.png&apos;
import spark_alt_text_img from &apos;./spark_alt_text.png&apos;&lt;/p&gt;
&lt;p&gt;The easiest way to show that your newsroom is actually thinking about AI isn&apos;t the 50th summarisation tool, chatbot article, or headline generator. It&apos;s in automating the jobs people aren&apos;t good at and don&apos;t really want to do in the first place.&lt;/p&gt;
&lt;p&gt;Alt text is a perfect example.&lt;/p&gt;
&lt;p&gt;Most images on your site need it, hardly anyone writes it consistently, and most editors would rather not spend their day doing it. But with AI and LLMs, you can fix that in minutes.&lt;/p&gt;
&lt;p&gt;Try the demo below. It&apos;ll generate alt text for any image you upload. Then we&apos;ll dive into why it works, what makes good alt text for journalism, and what we learned building this at the Financial Times.&lt;/p&gt;
&lt;h3&gt;Try it out below&lt;/h3&gt;
&lt;p&gt;&amp;lt;AIComponent client:load /&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What and why&lt;/h2&gt;
&lt;p&gt;Alt text is the short line of text a screen reader uses to describe an image to someone who can&apos;t see it. It&apos;s one of those things that every website should consider, but few newsrooms really give consistent attention to. Most alt text is either empty, badly duplicated, or overly descriptive, and that inconsistency means people relying on screen readers often have a worse experience on your site.&lt;/p&gt;
&lt;p&gt;Take a look at this example from the BBC and the New York Times. Each of their homepages marked up with &lt;a href=&quot;https://silktide.com/&quot;&gt;this accessibility tool&lt;/a&gt; shows how alt text appears for images.&lt;/p&gt;
&lt;p&gt;&amp;lt;div&lt;/p&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;a href={nyt_hp_img.src} target=&apos;_blank&apos; rel=&apos;noopener noreferrer&apos;&amp;gt;
&amp;lt;Image
src={nyt_hp_img}
alt=&apos;A screenshot of the New York Times homepage with alt text for images shown in a tooltip.&apos;
title=&apos;A screenshot of the New York Times homepage with alt text for images shown in a tooltip.&apos;
style={{
flex: &apos;1 1 300px&apos;,
maxWidth: &apos;100%&apos;,
height: &apos;auto&apos;,
minWidth: &apos;200px&apos;
}}
/&amp;gt;
&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;In this example, The New York Times has videos for both of its leading stories, which have no text representation at all. However, the small headlines image for the daily podcast has a detailed description of the Supreme Court. Columnist headshots have their names associated with them. And images of iPhone homescreens have an alt text describing just that. Towards the bottom of the page, two images are marked as &apos;decorative&apos;, which we&apos;ll get on to later.&lt;/p&gt;
&lt;p&gt;&amp;lt;div&amp;gt;
&amp;lt;a href={bbc_hp_img.src} target=&apos;_blank&apos; rel=&apos;noopener noreferrer&apos;&amp;gt;
&amp;lt;Image
src={bbc_hp_img}
alt=&apos;A screenshot of the BBC homepage with alt text for images shown in a tooltip.&apos;
title=&apos;A screenshot of the BBC homepage with alt text for images shown in a tooltip.&apos;
style={{
flex: &apos;1 1 300px&apos;,
maxWidth: &apos;100%&apos;,
height: &apos;auto&apos;,
minWidth: &apos;200px&apos;
}}
/&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;By contrast, the BBC&apos;s page is scattered with images, all of which have text. We have a variety of lengths, from &quot;Dame Jilly Cooper laughing&quot; or &quot;Lecornu and Macron&quot; to a detailed description of a composite image around the US-hosted World Cup. Charlotte Church&apos;s image describes her outfit, the event and the location, whereas the image to the left of her simply reads &quot;The Strictly contestants&quot;.&lt;/p&gt;
&lt;p&gt;Imagine you couldn&apos;t see those pages and text was all you had to go on. Would the information the images are adding be sufficient? Would it actually be too much? Think about the hierarchy: would hearing the alt text first before the headline be a help or a hindrance to getting to where you need to go?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Alt text is really hard to get right. There are a lot of guides online, but they generally end up focused on the same few principles, and they typically focus on &apos;functional&apos; images, or images that are there to convey information. But in reality, most images on a news site are there to add context, to break up text, or to add some visual interest. They aren&apos;t always strictly necessary to understand the content of the article, nor are they necessarily &apos;adding&apos; anything to the story that is not in the text already.&lt;/p&gt;
&lt;p&gt;A homepage is a great example of this contrast: the images are accompanied by headlines and text that convey the information that you need to take the next action: clicking through to the story, where you will more than likely see the image again. In this context the image is typically decorative. And by definition &lt;a href=&quot;https://www.w3.org/WAI/tutorials/images/decorative/&quot;&gt;decorative images don&apos;t need alt text&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some images however are crucial to comprehension. In articles, the image often holds a lot of weight. Photos of historic moments, unbelievable damage after a natural disaster, or the emotion captured in a person&apos;s face are all adding something important to the story. The term photojournalism exists for a reason, and in many cases striking photography is as much a part of the experience as the writing itself.&lt;/p&gt;
&lt;h2&gt;How we built it at the FT&lt;/h2&gt;
&lt;p&gt;When we built this at the Financial Times, we made it part of the CMS&apos;s native image component. When an editor uploads an image, they can click a button to generate alt text using the AI model. The generated text is then populated into the alt text field, where the editor can review and edit it as needed before saving.&lt;/p&gt;
&lt;p&gt;&amp;lt;Image
src={spark_alt_text_img}
alt=&apos;A screenshot of the Financial Times content management system showing an image upload dialog with AI-generated alt text.&apos;
title=&apos;A screenshot of the Financial Times content management system showing an image upload dialog with AI-generated alt text.&apos;
style={{ maxWidth: &apos;700px&apos;, width: &apos;100%&apos;, height: &apos;auto&apos; }}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;We went further by encouraging the editor to check a box confirming they had reviewed the text before saving. If they didn&apos;t, the text would stay highlighted in orange, drawing attention from other editors until it was approved.&lt;/p&gt;
&lt;p&gt;Our prompt took some work to get right. It took a series of tests with different models and prompt iterations to reach a point where the text was consistently good enough to publish with minimal edits. We also limited the tool to images that came with photo agency captions and metadata, as we found that passing this information through aided in identification significantly.&lt;/p&gt;
&lt;p&gt;&amp;lt;details class=&apos;mb-8 rounded bg-slate-400/10 p-4&apos;&amp;gt;
&amp;lt;summary&amp;gt;Example prompt used above&amp;lt;/summary&amp;gt;
You are an AI alt text generator.
For each image, write a concise, objective description that conveys the essential visual information to someone who cannot see it. Focus on key elements, context, and purpose. Avoid subjective judgments, assumptions, or detail not critical to comprehension. Be clear, accurate, and specific.
Only name people in the photo if you are certain of their name and they are a famous individual. Otherwise gently describe people without making judgements about protected characteristics.
If the image is a chart, then discuss the axes, important values, and the general trend. Do not discuss visual information that would not make sense to someone who cannot see the chart, such as the color of the trend line or the color of the bars.
Always return your response in &lt;code&gt;&amp;lt;alt&amp;gt;&lt;/code&gt; tags only, without any additional commentary or punctuation.
You &lt;em&gt;MUST&lt;/em&gt; keep your response to two sentences, or around 150 characters, unless in exceptional circumstances such as a chart where it is necessary to go longer.
For charts, you may respond with up to four sentences, and your character count is unlimited.
&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;The output can be a little generic, and that&apos;s fine. The goal isn&apos;t to replace editors but to help them start from something consistent. Adding a human in the loop ensures the final alt text fits your newsroom&apos;s tone and context.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;A few things we learned&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Decide whether the image is decorative.&lt;/strong&gt; If it doesn&apos;t add essential meaning, use an empty &lt;code&gt;alt=&quot;&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Describe what&apos;s essential, not everything.&lt;/strong&gt; Focus on who or what&apos;s in the image and why it matters to the story. If the person is notable, name them. Describe what they are wearing or doing only if it&apos;s relevant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep it short.&lt;/strong&gt; Usually under 150 characters, though for complex images and charts you can afford to flex this a bit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&apos;t duplicate captions.&lt;/strong&gt; Screen readers will read both. You can use &lt;code&gt;aria-hidden&lt;/code&gt; on captions in this case. [^1]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Punctuate like a sentence.&lt;/strong&gt; Skip &quot;Image of...&quot; intros unless it is a &quot;Screenshot of&quot; or &quot;Cartoon of&quot; where the medium is important.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&apos;s a simple workflow, but it adds up fast: accessibility audit scores improved, editors saved time, and, most importantly, we served readers who use assistive tech much better.&lt;/p&gt;
&lt;p&gt;And it&apos;s the kind of thing any media organisation can do &lt;em&gt;this quarter.&lt;/em&gt; You don&apos;t need a data science team or a complex pipeline, just a text-generation API call, some sensible defaults, and someone to review the results. Let me know if you give it a go.&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&apos; bg-slate-400/10 p-4 rounded-2xl text-slate-700 dark:text-slate-300&apos;&amp;gt;&lt;/p&gt;
&lt;h4&gt;Aside&lt;/h4&gt;
&lt;p&gt;I&apos;m certain that in the future this will be something that is provided by local AI models anyway. &lt;a href=&quot;https://developer.chrome.com/docs/ai/built-in&quot;&gt;Google&apos;s Gemini Nano&lt;/a&gt; is getting good enough at this kind of thing, and small enough, that integration with Chrome could enable this for images on any website you visit. However! This model may not have all the information your organisation has available to it when adding this image, so if you want to provide the best experience possible, keeping control over what you are serving is still valuable.&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;[^1]: Full disclosure: the FT still has some challenges in delivering this to the frontend, but I have faith in my excellent former-colleagues who are working on it.&lt;/p&gt;
</content:encoded><h:img src="/_astro/spark_alt_text.CPwpQ6Qx.png"/><enclosure url="/_astro/spark_alt_text.CPwpQ6Qx.png"/></item><item><title>What mistakes are newsrooms making with push notifications?</title><link>https://tk.gg/posts/newsroom-push-notification-mistakes</link><guid isPermaLink="true">https://tk.gg/posts/newsroom-push-notification-mistakes</guid><description>A copy of the newsletter I wrote for the News Product Alliance on push notifications</description><pubDate>Sun, 10 Aug 2025 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On one of those summer Fridays at the end of June, you might have had time to glance through the &lt;a href=&quot;https://reutersinstitute.politics.ox.ac.uk/digital-news-report/2025&quot;&gt;Reuters Institute Digital News Report&lt;/a&gt;. This is an annual treat for those looking to map our changing business environment and the challenges facing the news industry.&lt;/p&gt;
&lt;p&gt;I appreciated seeing push notifications in this year’s report. Not least of all because a tool I’ve been working on for a couple of years now to track them, &lt;a href=&quot;https://project-push.tk.gg/&quot;&gt;Project Push&lt;/a&gt;, was cited.&lt;/p&gt;
&lt;p&gt;The report’s main author, Nic Newman, has written a special report: &lt;a href=&quot;https://reutersinstitute.politics.ox.ac.uk/digital-news-report/2025/walking-notification-tightrope-how-engage-audiences-while-avoiding&quot;&gt;&lt;em&gt;Walking the notification tightrope: how to engage audiences while avoiding overload&lt;/em&gt;&lt;/a&gt;. It looks into an audience of obsessives — the people who have left their news notifications on — and questions the value of them to this audience. It also discusses how news orgs can use this channel to best effect.&lt;/p&gt;
&lt;p&gt;To dive deeper into this topic, I chatted with &lt;strong&gt;&lt;a href=&quot;https://www.linkedin.com/in/angelica-h-9ba1a3a5/&quot;&gt;Angelica Hill&lt;/a&gt;&lt;/strong&gt;, Technical Product Manager on &lt;em&gt;The New York Times’&lt;/em&gt; Messaging team. No one else is deeper in the detail than she is on this, and we had a great discussion about some of the report’s findings. Here’s some of how she thinks about notifications after seven years working in this area, including what makes push work and what doesn’t.&lt;/p&gt;
&lt;h3&gt;The challenges of working in notifications&lt;/h3&gt;
&lt;p&gt;One of the challenges of &lt;a href=&quot;https://project-push.tk.gg/&quot;&gt;Project Push&lt;/a&gt; has been that I can capture the notification content, but I can’t see how well a notification performed. Angelica has the benefit of being able to see behind the scenes, but even at the NYT, she still doesn’t have all the data she wants. Publishers are typically working off of what the platforms provide, and while you can send 1,000 notifications to 1,000 devices, you’ll only know if someone saw it if they tap through.&lt;/p&gt;
&lt;p&gt;Tracking attribution is therefore paramount. Knowing that a visit came from a notification — and knowing which one — can help your teams understand which kinds of notifications work for each audience. Understanding recirculation rates is important too: A challenge for Angelica’s team is how to use notifications in the most effective way to drive engagement and impact for the user and the company.&lt;/p&gt;
&lt;p&gt;Do you encourage readers to engage more with the app as a whole, not just the story or nudge that was pushed to them, and if so, how? Or do you prioritize engagement with the push and its content only? Not to mention the challenges of measuring the halo effect of push notifications, i.e., how much a user’s engagement with push impacts their engagement and behavior across other areas of your product portfolio.&lt;/p&gt;
&lt;p&gt;One advantage the NYT has, of course, is its breadth of product: Games, Cooking, Wirecutter, and The Athletic are all on hand to maintain engagement once a visitor taps through.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“In any strategy, I’m trying to push people into the app, getting them to engage with that piece of content deeply, then trying to get them to engage across our other products.” - &lt;strong&gt;Angelica Hill&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Testing and optimization&lt;/h3&gt;
&lt;p&gt;As with newsletters, testing and optimizing your push notifications can eke out some wins. But the nature of the product, and the controls you have, come with downsides. You could A/B test a regular notification or a personalized one, but A/B testing a single breaking news alert won’t necessarily teach you much.&lt;/p&gt;
&lt;p&gt;Your test might also be successful on a metric you so easily can’t measure: satisfaction. If a reworded notification tells the recipient enough about the story that they don’t need to visit, you’ve still done your job in delivering that information to them. In a subscription environment, that might be enough.&lt;/p&gt;
&lt;p&gt;Pushes are also subject to external factors, and user behavior can be seasonal. Being conscious of the news agenda and what else might be affecting user behavior is important to keep in mind when talking to editors about data.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You might see great engagement on the same push notification from month to month, but then the next month is going to go down. And your data won’t tell you why, but if you look out into the world, you’ll realize why.” - &lt;strong&gt;Angelica Hill&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Offering control&lt;/h3&gt;
&lt;p&gt;Spurring users to turn off notifications for your app entirely, rather than more selectively unsubscribing, can destroy your strategy. Angelica suggests making sure that your user preferences are easily reachable, and ideally having a variety of channels for the user to opt out of individually.&lt;/p&gt;
&lt;p&gt;The New York Times has a lot of these, and Angelica has noticed how they can actually be an encouragement for annoyed users to opt into other channels. A user looking to turn off their Politics notifications, for instance, might serendipitously opt into Cooking or Wellness updates.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We want to keep our push-eligible user pool as big as possible while giving as much granularity within the app as possible, to give them that flexibility, that curation, but also to stop them from opting out.” - &lt;strong&gt;Angelica Hill&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;The email overlap&lt;/h3&gt;
&lt;p&gt;Prior to working on &lt;a href=&quot;https://project-push.tk.gg/&quot;&gt;Project Push&lt;/a&gt;, I tried doing a similar thing for email newsletters. The two methods of reaching audiences have some interesting parallels. On the lock screen, or via an inbox, they skirt the on-platform/off-platform divide in levels of customization and ownership.&lt;/p&gt;
&lt;p&gt;One query that Angelica and I are both interested in is how readers prefer to engage. If you can guide newsletter readers to an app, you can gather more data. But do you lose readers who like the features of an inbox? Angelica has discovered readers who repeatedly return throughout the day from a single newsletter, something that’s impossible to do from a push notification.&lt;/p&gt;
&lt;h3&gt;There’s so much opportunity&lt;/h3&gt;
&lt;p&gt;Push is such an interesting platform, and new stuff is always arriving. In the news publishing space, where opportunities for innovation can feel scarce, push offers ways for publishers to try something new, with options such as Apple’s Live Activities or Android’s Live Updates notifications, audio autoplay, and video notifications.&lt;/p&gt;
&lt;p&gt;These short formats also tend to be a productive area of collaboration with editors, who may be more open to experimenting with things your brand might otherwise be a bit snooty over, like emojis. Building relationships with editors across teams is a good bonding experience, dealing with the challenges of the technology and format.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I think there’s just so much [value] in having like the persistent tabs on a mobile device. Outside of push notifications, just in general, the mobile home-page space and having that direct access to put your message right in front of a user is really exciting and interesting.” - &lt;strong&gt;Angelica Hill&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Some practical takeaways&lt;/h3&gt;
&lt;p&gt;Push is a fertile ground for experimentation and data collection. Try to prioritize attribution and watch recirculation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test notifications thoughtfully, but encourage editorial teams to be creative and try new formats and content.&lt;/li&gt;
&lt;li&gt;Offer granular notification settings to give your users effective opt-outs and opportunities for discovery.&lt;/li&gt;
&lt;li&gt;Consider a strategic overlap with other messaging products like newsletters to understand engagement better.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Push notifications are far from just the latest news alerts. Done well, they can provide a multitude of trigger points to encourage good user habits and engagement with your newsroom. I hope this manages to inspire some thoughts and experimentation.&lt;/p&gt;
&lt;p&gt;Wondering what other newsrooms do with push? You can sign up for a beta of &lt;a href=&quot;https://project-push.tk.gg/&quot;&gt;Project Push&lt;/a&gt; today (just hit the Login button), and find an archive of 180,000 notifications. If you have any thoughts or comments, as always, I’m on Slack or &lt;a href=&quot;https://bsky.app/profile/tk.gg&quot;&gt;Bluesky&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;em&gt;You can sign up to the Product Notes newsletter &lt;a href=&quot;https://newsproduct.org/product-notes-subscribe&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>How tiny teams can have an outsized impact with AI</title><link>https://tk.gg/posts/how-tiny-teams-can-have-outsized-impact</link><guid isPermaLink="true">https://tk.gg/posts/how-tiny-teams-can-have-outsized-impact</guid><description>Originally written for the News Product Alliance newsletter</description><pubDate>Fri, 06 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Like many of you, I’ve been paying closer attention to how large language models (LLMs) are impacting our work. They’re a transformational technology, and we’re only starting to understand what that scale of change might look like in our work. In news product, most experiments so far have focused on summaries, search, and conversational experiences. A good all-encompassing example is Time’s Person of the Year feature, which combines summaries, chat, and audio into one experience.&lt;/p&gt;
&lt;p&gt;These experiments are a good start. They give us a chance to collect usage data and learn what readers actually want from AI; and on our own platforms, rather than through third-party remixes that increasingly strip out attribution and clicks. But I think the biggest shift, at least for now, is happening internally. AI gives product and editorial teams a low-risk way to extend their capabilities and move faster. As larger publishers grapple with lawsuits, brand risks, and internal inertia, smaller newsrooms have a real chance to move first. There’s more upside, and less to lose.
When I sat down to prepare this newsletter, I wondered how Product Notes had changed over time. With almost 40 issues published, that’s a lot of content to analyse. So I opened Google’s AI Studio, where their latest Gemini models are freely available, and asked it to write a Python script that could scrape the NPA website and pull out the newsletter content. From there, I fed it back into the model to surface themes and trends.&lt;/p&gt;
&lt;p&gt;According to the analysis, AI is the fourth most frequent topic—behind newsletters, but ahead of technical tooling. Seems I’m in good company.&lt;/p&gt;
&lt;p&gt;Doing this job reminded me of the XKCD comic “Is it Worth the Time?”, which charts how much time you should spend automating a task based on how often you do it. That comic just turned twelve, and while the principles have held up well, I wonder if the numbers are increasingly shifting to the low-end. If it used to take five hours to build something and now you can do it in five minutes with the help of AI, the maths changes. Technological advances have made automating things like scraping the newsletter archive feasible within 30 minutes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://imgs.xkcd.com/comics/is_it_worth_the_time.png&quot; alt=&quot;Is it Worth the Time? - creative commons via xkcd&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Of course, it’s not just about scripting or scraping or writing SQL. The more interesting question is how AI can help product teams build, test, and iterate faster. Recently, I’ve been experimenting with tools like Vercel’s V0, Lovable, Stackblitz Bolt, and Val Town’s Townie. These are prompt-driven interfaces for building front ends. So far these tools are mostly marginal gains: good for green field ideas, basic internal tooling and early prototyping, but you’re not likely to be able to use them to ship something much more useful. It’s still early days, but the pace of improvement is fast and the competition is intense.&lt;/p&gt;
&lt;p&gt;At the FT, we’ve been exploring how AI could assist in the editing process—flagging errors or inconsistencies before a story is published. To prototype some ideas, I used v0 and Lovable to generate sample interfaces and see how they might plug into our own text editor infrastructure. It’s been a good way to test possibilities and get clearer on implementation paths.&lt;/p&gt;
&lt;p&gt;Better results though have come from ideas I’ve got from colleagues that I’ve been able to quickly prototype in code using other methods. More modern, development-tuned LLMs with large context windows like OpenAI’s GPT-4.1 have made ‘vibe coding’ something really enjoyable, rapid, and productive. In just a few hours I managed to put together &lt;a href=&quot;https://github.com/MattieTK/radiovier&quot;&gt;an app&lt;/a&gt; that transcribed live German radio into English and made it searchable via a web interface.&lt;/p&gt;
&lt;p&gt;One of the advantages of using AI for code is that it’s easy to verify: does the output run? Does it do what you asked? While there are risks—especially if you’re building without understanding the underlying logic—for prototyping and lightweight tooling, it’s remarkably effective. A half hour of back-and-forth with an LLM can take you further than you might expect.&lt;/p&gt;
&lt;p&gt;Product managers are often expected to be generalists, working across domains without always having deep technical skills. But that balance is shifting. These tools extend what a generalist can accomplish, letting you bring more ideas to life without waiting for engineering time or even full specs. That, I think, is where the most immediate opportunity lies.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
&lt;em&gt;You can sign up to the Product Notes newsletter &lt;a href=&quot;https://newsproduct.org/product-notes-subscribe&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Tracking newsletter read time with AMP</title><link>https://tk.gg/posts/tracking-newsletter-read-time</link><guid isPermaLink="true">https://tk.gg/posts/tracking-newsletter-read-time</guid><description>An email analytics hack you might actually want to use</description><pubDate>Tue, 19 Nov 2024 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { Image } from &apos;astro:assets&apos;
import { BlueskyPost, YouTube } from &apos;astro-embed&apos;&lt;/p&gt;
&lt;p&gt;A year or so ago, I noticed the Washington Post had started to send their breaking news email notifications with AMP.&lt;/p&gt;
&lt;p&gt;AMP, or Accelerated Mobile Pages, is a Google web framework designed to create lightweight experiences that — Google being Google — you could still chuck a lot of ads into.&lt;/p&gt;
&lt;p&gt;Nowadays, as a web framework, it is mostly dead, but it lives on through email, where a few companies use it to send what Google calls &apos;Dynamic email&apos;. These emails have the superpower of being able to load in new data, or dynamically update their content. This is how Google Docs sends you comment notifications that update with replies, and it&apos;s how the Washington Post gives you a time interval since the event happened in their breaking news emails.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;Image
src=&apos;https://assets.tk.gg/chrome_hEe5fFgbQ1.png&apos;
width={679}
height={263}
alt=&quot;A screenshot of a Washington Post Breaking News alert with the time &apos;2 hours ago&apos; displayed&quot;
/&amp;gt;
&amp;lt;figcaption&amp;gt;
We&apos;re talking about the red bar that says &apos;2 hours ago&apos;. Believe it or not, that&apos;s impossible in
a regular email.
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;This led me to wonder: could AMP be used to enable better read-time tracking in email newsletters, even though AMP support is limited primarily to Gmail and Yahoo Mail?&lt;/p&gt;
&lt;p&gt;So what if you could leverage AMP to do something that everyone wants to do in newsletters but can&apos;t: better analytics.&lt;/p&gt;
&lt;h2&gt;Read time&lt;/h2&gt;
&lt;p&gt;To fully understand the magnitude of this opportunity, we first need to examine the current status quo for read time tracking in email.&lt;/p&gt;
&lt;p&gt;Read time on the web is usually calculated with some javascript that runs on the page to detect when various actions occur, like scrolling, and summing up all the time spent by the user between entering the page and their last action. This doesn&apos;t work in email because famously no javascript is supported. No dynamic scripting at all is supported, and everything has to be a combination of HTML and (usually inline) CSS.&lt;/p&gt;
&lt;p&gt;Read receipts (which have become less reliable since Apple&apos;s Mail Privacy Policy and Google&apos;s image proxy) instead use a small unique image in each email, and a remote server records a request for that image as an indication that the email has been opened.&lt;/p&gt;
&lt;p&gt;The best read time tracking you can get without javascript works similarly. A small unique image, but this time the remote server deliberately throttles data out to a very slow rate. It&apos;s pretty error prone, and doesn&apos;t work with things like image proxying. Any numbers you get back will be wildly inaccurate.&lt;/p&gt;
&lt;h2&gt;Enter AMP&lt;/h2&gt;
&lt;p&gt;AMP allows you to include some very specific kinds of interactivity in email. They have a &lt;a href=&quot;https://amp.dev/documentation/components/email/&quot;&gt;list of components&lt;/a&gt; that are supported including cool things like dynamic lists, and autocomplete fields. This is how you can respond to a comment in your Google Doc from your Gmail app.&lt;/p&gt;
&lt;p&gt;One of those elements is a carousel for images. Common to the web, carousels progressively slide or fade through images in a finite list. One of the magic things about the carousel in AMP is that the images are loaded progressively.&lt;/p&gt;
&lt;p&gt;With this in mind, an experiment occurred to me. Could you create a carousel of &lt;code&gt;X&lt;/code&gt; number of images, loading every &lt;code&gt;Y&lt;/code&gt; seconds, and get up to &lt;code&gt;X * Y&lt;/code&gt; duration tracking for your email? If you bucketed read times into something like ten seconds you would suddenly get a decent chunk of very valuable information as to whether your Substack essays are actually landing with readers as they spend a minute reading or if people are nope-ing out immediately.&lt;/p&gt;
&lt;p&gt;&amp;lt;BlueskyPost id=&apos;https://bsky.app/profile/tk.gg/post/3l73snyl2q223&apos; /&amp;gt;&lt;/p&gt;
&lt;p&gt;So I did end up prototyping this and it worked! Here&apos;s a short video going through the feature:&lt;/p&gt;
&lt;p&gt;&amp;lt;YouTube id=&apos;https://youtu.be/sSaW1zrbQAY&apos; /&amp;gt;&lt;/p&gt;
&lt;p&gt;Yes the first and last slide load at the same time as you load, but then, every five seconds on the dot a new request, the next slide, with a unique identifier.&lt;/p&gt;
&lt;p&gt;You can test this too by running the code, putting yourself an AMP email together, and sending yourself a test AMP email.&lt;/p&gt;
&lt;h2&gt;How to use this&lt;/h2&gt;
&lt;p&gt;There&apos;s a few things you&apos;d need to do to enable this: firstly you&apos;d need to get your sender approved to send AMP emails. It turns out that Google doesn&apos;t allow just anyone to do this, and you need to send examples of the kinds of emails you&apos;re going to send to them first to get your sending domains allowlisted.&lt;/p&gt;
&lt;p&gt;Secondly you&apos;ll need to actually build the tracking software yourself and deploy it at scale. My prototype is not going to be anywhere near enough, and if you&apos;re going to do that you may as well at the same time take over the responsibility of open rate tracking from your &amp;lt;span title=&quot;email send provider&quot;&amp;gt;ESP&amp;lt;/span&amp;gt;.&lt;/p&gt;
&lt;p&gt;Each user and each send to that user is going to need a unique hash to identify that send and that user, and you&apos;ll need to append this to the request for each of the images you include in your carousel. The rest can stay functionally the same as the prototype, but that&apos;s quite a big ask.&lt;/p&gt;
&lt;p&gt;Anyway, I don&apos;t suspect I&apos;ll actually convince anyone to do this further than the test that I&apos;ve put together. It&apos;s quite a lot of work. But I would love to hear about anyone with plans to give it a go. Please do reach out.&lt;/p&gt;
&lt;p&gt;You can view the prototype proof-of-concept code on my GitHub &lt;a href=&quot;https://github.com/MattieTK/amp-email-tracking&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Another real name commenting policy?</title><link>https://tk.gg/posts/times-real-name-policy</link><guid isPermaLink="true">https://tk.gg/posts/times-real-name-policy</guid><description>Why are The Times doing something they know doesn&apos;t work</description><pubDate>Tue, 20 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Well, this is weird. The Times have today decided to implement a real-name policy for commenting on their website.&lt;/p&gt;
&lt;p&gt;They claim this will increase the quality of debate, something we know there is limited evidence for in the first place. Let&apos;s go through &lt;a href=&quot;https://www.thetimes.co.uk/static/terms-and-conditions/#Six&quot;&gt;their FAQ&lt;/a&gt;...&lt;/p&gt;
&lt;p&gt;This is such a weird decision because there is no real anonymity on The Times website in the first place. It&apos;s a subscription community and the customer team will always have access to your billing details.&lt;/p&gt;
&lt;p&gt;And they admit to this in &lt;a href=&quot;https://www.thetimes.co.uk/static/terms-and-conditions/#Six&quot;&gt;the FAQ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&quot;Why doesn&apos;t The Times block accounts instead?&quot;
&quot;Why don&apos;t you moderate comments instead?&quot;&lt;/p&gt;
&lt;p&gt;Both of those things already happen. There is no &quot;animosity protected by anonymity&quot; because you can ban the user by their billing details.&lt;/p&gt;
&lt;p&gt;Anonymity has a mixed effect in academic research on the quality of comments and amount of abuse. It&apos;s a well debated topic that I won&apos;t get into because of this point: pseudonymity != anonymity, so The Times already isn&apos;t an anonymous community.&lt;/p&gt;
&lt;p&gt;The only thing this policy changes is whether people&apos;s real names are tied publicly rather than privately to their comments on news stories.&lt;/p&gt;
&lt;p&gt;It is exposing people to others in the community and online.&lt;/p&gt;
&lt;p&gt;They address this too, but skirt around it entirely. Certain people will not be able to abide by this policy without a degree of pseudonymity, and there is no allowance for that.&lt;/p&gt;
&lt;p&gt;This will bar those people from the community. Teachers, doctors, social workers, academics.&lt;/p&gt;
&lt;p&gt;So what are the alternatives to achieve the same effect?&lt;/p&gt;
&lt;p&gt;Well, moderation for one, and a strong set of community guidelines, both things The Times already claims to have. Why are these not working? That&apos;s not addressed.&lt;/p&gt;
&lt;p&gt;The cost of moderating a community that is pay to play vs one that is effectively open access is much less already.&lt;/p&gt;
&lt;p&gt;Surely it&apos;s net positive at the cost of The Times? If new accounts are needed with new payment details that&apos;s a £30 charge to post.&lt;/p&gt;
&lt;p&gt;There are so many other ways you could experiment with this: like putting a delay on posting for new accounts, or putting them in a new moderation queue.&lt;/p&gt;
&lt;p&gt;You could lock pseudonyms from being changed, or reduce the number of articles you can comment on, or comments you can post.&lt;/p&gt;
&lt;p&gt;Interestingly this also has pretty major implications for the &quot;real&quot; identifies of marginalised groups that The Times has editorially taken a line against, like the trans community, who might want to use a name other than their legal name. That&apos;s also not allowed.&lt;/p&gt;
&lt;p&gt;It&apos;s going to be an interesting (if ideologically flawed) example of a pseudonymous community changing to an identifiable community, and the impact of that on the civility, volume and diversity of that community should be measured.&lt;/p&gt;
&lt;p&gt;I really hope there are plans to record this.&lt;/p&gt;
&lt;p&gt;Lastly, and the reason this feels like a very lazy brush stroke more than anything else, is that this still allows hateful people to take that hate and now apply it in a more dangerous way. Against people posting under their real names, anonymously, without participation.&lt;/p&gt;
&lt;p&gt;A link to that FAQ to see for yourself. I&apos;d love to be pointed to the latest in this by some experts in the field.&lt;/p&gt;
</content:encoded><h:img src="/_astro/times-comments.C2pCGzzX.webp"/><enclosure url="/_astro/times-comments.C2pCGzzX.webp"/></item><item><title>LFT notifications in your browser</title><link>https://tk.gg/posts/lft-notifications-nhs-covid</link><guid isPermaLink="true">https://tk.gg/posts/lft-notifications-nhs-covid</guid><description>A browser based app to notify people when lateral flow tests become available for home delivery on the NHS during the COVID-19 pandemic</description><pubDate>Sun, 23 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { Tweet } from &apos;astro-embed&apos;&lt;/p&gt;
&lt;p&gt;On the 9th of January 2022, &lt;em&gt;The Sunday Times&lt;/em&gt; published &lt;a href=&quot;https://www.thetimes.co.uk/article/end-of-free-lateral-flow-tests-as-country-told-to-live-with-covid-3bpz8lnqf&quot;&gt;a story&lt;/a&gt; that asserted that the UK Government were in the process of phasing out a policy that had arguably kept normal life running during many months of the Covid-19 pandemic.&lt;/p&gt;
&lt;p&gt;Where other countries had made Covid testing something citizens had to seek out privately, the &apos;Test and trace&apos; programme in the UK — aside from doing very little tracing — had made free lateral flow tests available, delivered to your door, in packs of 7.[^1]&lt;/p&gt;
&lt;p&gt;Given this policy was supposedly coming to an end whilst the Omicron wave was still out in force, and public life was still heavily disrupted for those looking to avoid catching the virus, there was a rush on Covid tests. The website crashed repeatedly, and frequently was returning a page stating that home delivery tests were out of stock.&lt;/p&gt;
&lt;p&gt;Enter the Twitter bot, &lt;a href=&quot;https://twitter.com/LFT_alert&quot;&gt;@LFT_Alert&lt;/a&gt;, the inspiration for this tool, which alerted people in their Twitter feed whenever tests became available. A fantastic service, and anonymously set up on New Years Eve 2021, this bot tweeted to its 9000 followers whenever tests went in and out of stock.&lt;/p&gt;
&lt;p&gt;But there were two things I could see about this approach that could be improved.&lt;/p&gt;
&lt;p&gt;Firstly, whoever was running LFT_Alert needed to keep a computer running themselves in order to repeatedly verify if tests were available. This effectively became a single point of failure to the system (and a point of maintenace and annoyance for the owner) as disruption to the machine would end the service.&lt;/p&gt;
&lt;p&gt;And secondly, Twitter is a mess. For me, following over 3000 people, my Twitter feed is awash with hundreds of different faces. To pick LFT Alert&apos;s valuable messages amongst the noise of retweets and chatter would be difficult. Twitter offers notifications for any one account, but this had the secondary effect of notifying me whenever tests went in or out of stock. It only matters to get tests when you are running out. To be alerted every time would be a hassle.&lt;/p&gt;
&lt;p&gt;So, far too late to the party, as I would soon find out, I picked up my keyboard and spent a few hours on the night of the 9th of January building an alternative to solve this.&lt;/p&gt;
&lt;p&gt;&amp;lt;Tweet id=&apos;https://twitter.com/MattieTK/status/1480456256242339840&apos; /&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://lft.tk.gg&quot;&gt;lft.tk.gg&lt;/a&gt; was born.&lt;/p&gt;
&lt;h2&gt;The app&lt;/h2&gt;
&lt;p&gt;Built on two principles: keep the work to the person searching for the test, and don&apos;t abuse the LFT portal.&lt;/p&gt;
&lt;p&gt;When a user loads the page, they immediately start a timer that executes every minute[^2] which triggers a check to a shared serverless API endpoint, that is cached for 30 seconds. This endpoint goes to the NHS service and uses a private API to check if LFT orders are open or closed. The API returns the state of the ordering, and the last time the check ran.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
{
&quot;status&quot;: &quot;OPEN&quot;,
&quot;timeChecked&quot;: 1642919745205
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The page then responds, updating the last time the check ran. If the ordering is open, it then uses the web notifications API to send a push notification to the user, triggering a link through to the order page.&lt;/p&gt;
&lt;p&gt;I thought this was the simplest solution to the problem. A user needing tests could simply open the page in the morning, work through the day, and get the notification as soon as tests were available.&lt;/p&gt;
&lt;p&gt;It&apos;s a little frustrating that the government service didn&apos;t offer something similar to this. The only major downside I had was learning that the Notification API was (of course) not available for mobile browsers (and full on crashes Safari when used natively). I thought about working out how to send notifications to a mobile browser. This would have required some extra work to set up a service worker, and then using the Push API instead. I planned to do this if the service got a lot of traffic (and may still), but the short term supply issue appears to have been resolved, and the status is now very rarely &lt;code&gt;CLOSED&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Still, I enjoyed building the app and learning a few new things about notifications, and keeping browser tabs awake (it turns out you can play audio to keep something permanently awake, but Chrome &lt;em&gt;checks&lt;/em&gt; to see if the audio is audible!).&lt;/p&gt;
&lt;p&gt;I hope it really won&apos;t be useful in the future! Stay safe.&lt;/p&gt;
&lt;p&gt;[^1]: Just a aside on how infuriating it is that then they also enforced mandatory private lateral flow testing, at a cost of around £20 per flight, for international travellers, despite everyone keeping a half dozen identical tests at home, provisioned free at a massive discount by a public provider...&lt;/p&gt;
&lt;p&gt;[^2]: &lt;a href=&quot;https://developers.google.com/web/updates/2017/03/background_tabs&quot;&gt;Chrome throttles background functions&lt;/a&gt; running more frequently than this)&lt;/p&gt;
</content:encoded><h:img src="https://assets.tk.gg/lft.png"/><enclosure url="https://assets.tk.gg/lft.png"/></item><item><title>The Unintended Consequences of Apple&apos;s War on Email Tracking</title><link>https://tk.gg/posts/apple-mail-privacy-is-lazy</link><guid isPermaLink="true">https://tk.gg/posts/apple-mail-privacy-is-lazy</guid><description>Apple&apos;s Mail Privacy Protection is lazy and hurts small publishers</description><pubDate>Fri, 06 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At WWDC yesterday Apple announced &lt;em&gt;Mail Privacy Protection&lt;/em&gt;, an initiative seeking to bring blocking of &lt;em&gt;Superhuman&lt;/em&gt; style tracking pixels to Apple&apos;s Mail app.&lt;/p&gt;
&lt;p&gt;In the video demo Katie Skinner, Manager of User Privacy Software, introduced marketing emails as using hidden pixels to collect your activity, such as your IP address, or when you open or take an action in these emails. Their solution is &lt;a href=&quot;https://youtu.be/0TD96VTf0Xs?t=3143&quot;&gt;&lt;em&gt;Mail Privacy Protection&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;img
src=&apos;https://assets.tk.gg/WWDC+2021++June+7++Apple.mp4_snapshot_00.52.31.057.jpg&apos;
height=&apos;480&apos;
width=&apos;854&apos;
/&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It hides your IP address so senders can&apos;t link it to your online activity, or determine your location. And it prevents senders from seeing if and when you&apos;ve opened their email. So now you can catch up on email with greater peace of mind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s it. That&apos;s all we know so far. And though focused in this context on marketing emails, it has significant implications for publishers and the newsletter boom.&lt;/p&gt;
&lt;p&gt;Litmus, an email marketing consultancy, &lt;a href=&quot;https://www.litmus.com/blog/email-client-market-share-2021-q1/&quot;&gt;estimated that the top email client globally is &lt;em&gt;Mail on iPhone&lt;/em&gt;&lt;/a&gt;, with 38.9% of opens coming from the app in the first three months of this year. On desktop, if this feature launches on Apple Mail there, that&apos;s another 11.5% of sends. The current market share of both is expected &lt;a href=&quot;https://emailclientmarketshare.com/&quot;&gt;around 57%&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is probably a fuzzier statistic than I&apos;d like it to be, but we can I think safely say that a lot of emails are going through this ecosystem.&lt;/p&gt;
&lt;p&gt;As a publisher you probably have two statistics that you are using to determine performance via your &amp;lt;span style={{borderBottom: &quot;1px dashed black&quot;, cursor: &quot;help&quot;}} title=&quot;Email Send Platform&quot;&amp;gt;ESP&amp;lt;/span&amp;gt;: open rate (the number of people who opened your email for any amount of time, judged by a small invisible image that is loaded uniquely per subscriber), and click through rate (the number of people who clicked on one or more of the links in the email, judged by each link being tracked via a forwarding service). Apple have just attempted to wipe out one of those.&lt;/p&gt;
&lt;p&gt;We don&apos;t know how Apple accomplish this, but I think it&apos;s safe to presume that it&apos;s similar to how &lt;a href=&quot;https://www.hey.com/spy-trackers/&quot;&gt;Hey.com announced their privacy push&lt;/a&gt; in their email client. Hey keep a denylist of tracker addresses, and scan your email for elements that look like they could hide a tracker (anything that&apos;s a 1x1 gif) to remove them.&lt;/p&gt;
&lt;p&gt;Hey has a second line of defence also: if a tracker slips through via some more structural image, Hey proxies the request to the image via their servers, meaning your IP and approximate location are never leaked to the sender. Apple may or may not do this.&lt;/p&gt;
&lt;p&gt;I&apos;m broadly not against privacy online, and I think Hey.com&apos;s second step is especially good at protecting users from invasive tracking. In fact it&apos;s exactly what &lt;a href=&quot;https://gmail.googleblog.com/2013/12/images-now-showing.html&quot;&gt;Google Mail started doing back in 2013&lt;/a&gt;. But, much like other generally-sensible-in-theory provision like the GDPR, moves like this from Apple are going to hit hardest the solo and freelance publishers with their Substack newsletters.&lt;/p&gt;
&lt;p&gt;&amp;lt;img
src=&apos;https://assets.tk.gg/WWDC+2021++June+7++Apple.mp4_snapshot_00.53.04.433.jpg&apos;
height=&apos;480&apos;
width=&apos;854&apos;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;A major publisher will be hurt, sure. They&apos;ll lose a lot of data on which they sold their newsletter sponsorships. They&apos;ll be less able to confidently purge subscribers who haven&apos;t opened their newsletter in months (what if they&apos;re iPhone users?). They&apos;ll see their open rates drop 30%+ overnight.&lt;/p&gt;
&lt;p&gt;But there will be ways around it. And suddenly, with over half your email data at stake, this is what both marketers and publishers will start working on in the coming months. Until emails are wholly plaintext there&apos;s always something you can make uniquely identifiable.&lt;/p&gt;
&lt;p&gt;A smaller publisher, a local newspaper, a solo freelancer, a small blog; all these will lose data on a significant part of their audience. A likely valuable part of their audience. And it may stifle or slow their growth or opportunities.&lt;/p&gt;
&lt;p&gt;Where previously you could unsubscribe readers who hadn&apos;t opened your newsletter to save money, now you don&apos;t know if they&apos;re loyal or not. You&apos;ll have to find other ways to entice them to let you know they are reading. A larger publisher can afford to keep 20,000 recipients on a list that never open an email. A smaller outfit cannot.&lt;/p&gt;
&lt;p&gt;Apple&apos;s fight for privacy is really a fight against the web. In signing up for a newsletter, a publisher or marketer already has a more valuable piece of PII: your email address. By focusing on IP addresses, and blocking trackers rather than proxying them on a fuzzy delay[^1] (which would provide the same useful publisher data without any PII leak of location or time), Apple are not really fighting for their users so much as they are fighting against email.&lt;/p&gt;
&lt;p&gt;Apple every year see that &lt;a href=&quot;https://www.wsj.com/video/series/joanna-stern-personal-technology/how-apples-iphone-and-apps-trap-you-in-a-walled-garden/&quot;&gt;the walls of their garden&lt;/a&gt; get higher. It&apos;s no doubt that whenever something like this happens, Apple have an in-ecosystem solution for you: launch an app on their store, post to their own publishing system Apple News, just don&apos;t use the open web.&lt;/p&gt;
&lt;p&gt;[^1]: This really should be what Apple do instead: they know what the trackers are, so load them later, from a server rather than from the phone. Give the publisher the data that the email has been opened, and by whom (via the email address), but not where or when.&lt;/p&gt;
</content:encoded><h:img src="/_astro/eyes-apple.DUbH7l6U.webp"/><enclosure url="/_astro/eyes-apple.DUbH7l6U.webp"/></item><item><title>A retrospective on five years of digital editions</title><link>https://tk.gg/posts/five-years-of-editions</link><guid isPermaLink="true">https://tk.gg/posts/five-years-of-editions</guid><description>The Times launched their edition strategy in 2016. Over 1500 editions later, where do editions sit in the future of news media?</description><pubDate>Fri, 07 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { Tweet } from &apos;astro-embed&apos;&lt;/p&gt;
&lt;p&gt;The 30th of March 2021 marked &lt;a href=&quot;https://www.theguardian.com/media/2016/mar/30/times-rolling-editions-website-sunday-times-apps&quot;&gt;five years&lt;/a&gt; since the launch of &lt;em&gt;The Times and Sunday Times&lt;/em&gt; &apos;digital editions&apos;. A project that took &lt;a href=&quot;https://www.theguardian.com/media/2015/mar/24/times-website-editions-project-d&quot;&gt;two years&lt;/a&gt; from the initial concepts, to a final launch.&lt;/p&gt;
&lt;p&gt;Now, 1500 editions later, not much has changed of the original. Though it was initially received with skepticism in bundling publish times and generally bringing a newspaper&apos;s then-tablet workflow to the web, it has at least been influential on several other publishers since.&lt;/p&gt;
&lt;p&gt;&amp;lt;Tweet id=&apos;https://x.com/mathewi/status/715231553916239872&apos; /&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In 2019, the &lt;em&gt;i&lt;/em&gt; launched &lt;a href=&quot;https://www.pressgazette.co.uk/the-i-launches-paid-for-news-app-with-three-daily-editions-and-live-breaking-news/&quot;&gt;&quot;three daily editions&quot;&lt;/a&gt; on its apps, alongside a livelier breaking news operation.&lt;/li&gt;
&lt;li&gt;The Guardian recently relaunched their paper tablet app as &apos;Guardian Daily[^1]&apos;, supporting readers wanting to read &lt;a href=&quot;https://www.theguardian.com/membership/2019/dec/07/guardian-daily-app-launch-new-edition&quot;&gt;&quot;coverage at a slower pace&quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;MailPlus, the slightly-weird paid newspaper-made-digital version of the Daily Mail (not to be confused with dailymail.co.uk 🤦‍♂️), have a homepage that looks remarkably similar to The Times, and has stories updated at set times of the day, with the update time called out specifically in the first paragraph.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But even looking past legacy publishers with the kind of content scale that would permit editions, the product themes (timeliness, bundles, and finishability) are behind the rise of many new faces.&lt;/p&gt;
&lt;p&gt;Daily deliveries like &lt;a href=&quot;https://www.morningbrew.com/daily/subscribe&quot;&gt;&lt;em&gt;Morning Brew&lt;/em&gt;&lt;/a&gt; briefing, the bulleted &apos;why it matters&apos; summaries of &lt;a href=&quot;https://www.axios.com/&quot;&gt;&lt;em&gt;Axios&lt;/em&gt;&lt;/a&gt;, the timely written prose of the &lt;a href=&quot;https://qz.com/&quot;&gt;&lt;em&gt;Quartz&lt;/em&gt;&lt;/a&gt; homepage, and the growing array of newsletters on &lt;a href=&quot;https://substack.com&quot;&gt;&lt;em&gt;Substack&lt;/em&gt;&lt;/a&gt; that cover news at a slower pace, in a more digestible manner, all exhibit parts of these three components.&lt;/p&gt;
&lt;p&gt;Five years on though, the industry is still scratching the surface of what an edition product might look like. Instead of working on the job an edition does for a reader, we are once again focused on what job a digital offering does for the journalists and editors that produce it.&lt;/p&gt;
&lt;p&gt;We are not our readers.&lt;/p&gt;
&lt;p&gt;The story of editions outside of the digital-first startups can be told as an allegory of the fundamental disconnect between newsrooms and the concept of &lt;em&gt;news product&lt;/em&gt; that seems to constantly evade them.&lt;/p&gt;
&lt;p&gt;In technology roles you are encouraged to take the time to look back, to retrospectively analyse your successes and failures to learn from them, something that there is rarely the opportunity to do in editorial given the relentless pace. Five years after I helped build it, and as many of that team depart &lt;em&gt;The Times and Sunday Times&lt;/em&gt; I think editions as a concept deserves a retro.&lt;/p&gt;
&lt;p&gt;So I thought I would write about why I think editions done well are still a compelling product, and then how we continue to get them wrong.&lt;/p&gt;
&lt;h2&gt;What do I mean by editions?&lt;/h2&gt;
&lt;p&gt;There are three concepts that I think go into building editions, and they align reasonably well with the concept of &lt;em&gt;RFV&lt;/em&gt; as a business metric. Recency, frequency, and value (as in recency of visit, regularity of visit, and length of visit) are common metrics that news providers might use to determine their performance amongst readers. Generally if you can bring people in, give them reasons to come back, and serve them well during the time they are with you, you have a happy reader.&lt;/p&gt;
&lt;p&gt;One of the driving forces behind this behaviour, and something that editions explicitly encourage is creating habit. A bundle of high quality, curated, and timely content, produced regularly, are excellent foundations on which to build a habitual, valuable audience.&lt;/p&gt;
&lt;h3&gt;Loops&lt;/h3&gt;
&lt;p&gt;This works best if you can provide a platform that marries this bundling with other features that help build further habit. As Nir Eyal describes in his book &lt;a href=&quot;https://amzn.to/3c8ecmI&quot;&gt;&lt;em&gt;Hooked: How to Build Habit-Forming Products&lt;/em&gt;&lt;/a&gt;, you want to build loops that the user is prompted to come back to, however you may create or deliver that prompt, and then provide value and opportunities to trigger further prompts in the future.&lt;/p&gt;
&lt;p&gt;These loops are a part of why that &lt;a href=&quot;https://en.wikipedia.org/wiki/1%25_rule_(Internet_culture)&quot;&gt;slim proportion&lt;/a&gt; of readers that engage in comments are so much more likely to return: they typically read more content, and spend more time reading it, than those that do not engage. Leaving a comment is an &apos;investment&apos; as Eyal describes it in the last part of the hook. A comment may also, depending on your capabilities, provide the first part of the hook, the trigger (&quot;Matt liked your comment&quot;, &quot;Matt replied to your comment&quot; as an email notification or otherwise). Creating touchpoints for readers to engage in ways that permit you to bring them back are gold.&lt;/p&gt;
&lt;p&gt;So how does an edition relate to a comment?&lt;/p&gt;
&lt;p&gt;It&apos;s in the product&apos;s ability to create that reader investment, and initial trigger for them to return. With a live news site, you could allow readers to follow topics (like &lt;a href=&quot;https://www.ft.com/tour/myft&quot;&gt;My FT&lt;/a&gt;), or authors (like... er... My FT). Both of these up front investments likely result in notifications (a trigger), but one that could potentially come at any time, with an unknown volume.[^2]&lt;/p&gt;
&lt;p&gt;An edition model, done well, enables the ultimate end-goal in planning: an open newsroom with your readers, telling them what you are producing and when they can expect it. They can sign up to a known and predictable quantity and timing of editions, with the potential for them to engage further in highlighting coverage they want more of in coming editions.&lt;/p&gt;
&lt;p&gt;Digital technologies allow the same kinds of notification for individual stories or &lt;a href=&quot;https://www.bbc.co.uk/ontologies/storyline&quot;&gt;storylines&lt;/a&gt;, and they provide regular touchpoints (the edition publish times) to re-engage readers to subscribe to the next touch point, or the one after that.&lt;/p&gt;
&lt;h3&gt;An enforced limit&lt;/h3&gt;
&lt;p&gt;&amp;lt;Tweet id=&apos;https://x.com/rafat/status/1363123171562577921&apos; /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;p style={{ textAlign: &apos;center&apos; }}&amp;gt;🤔&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;The other aspect of editions I think a lot of is &apos;finishability&apos;, described as creating a valuable visit for the reader through enabling them to see—though perhaps not meet—the finish line.&lt;/p&gt;
&lt;p&gt;It would be very difficult for you to &apos;complete&apos; the digital product of &lt;em&gt;The Guardian&lt;/em&gt; today. You&apos;d need to find every story &lt;em&gt;The Guardian&lt;/em&gt; has written, quickly check it out and determine whether you wanted to read it or not, then potentially read it. This is the power of the alternative in Guardian Daily. It&apos;s a front-to-back bundle of editorially curated items, and once you&apos;ve finished browsing through them you&apos;re done. Your trust is in the publisher to curate what is important for you to see, which is a service you pay for just as much as the journalism itself.&lt;/p&gt;
&lt;p&gt;This idea of &apos;finishability&apos; is fundamental to the success of sites like Axios, which trades in both breaking news and detailed analysis, but lets no story lose the reader&apos;s attention through a succinct summary delivered in bullet points.[^3] Brevity is crucial.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Guardian&lt;/em&gt;, years ago now, used audience data to cut their output by a third. As described by Chris Moran &lt;a href=&quot;https://pca.st/Be3s&quot;&gt;in this exceedingly worthwhile interview with Emily Bell&lt;/a&gt;, the problem presented by the internet was a combination of the feeling of unlimited space, whilst still being limited by opportunities for promotion. A homepage, or a social feed, or a newsletter can only display so many possible items for consumption. Why not limit yourself to a much more succinct service through design once again?&lt;/p&gt;
&lt;p&gt;Editions, at their best, should attempt to reintroduce the limitation of print space. They should make editors acutely aware of the attention commitment they are asking of the reader, and of the reader&apos;s potential need at the time. Journalists have a very odd fascination for the idea that more stories, and more choices, are &lt;em&gt;always&lt;/em&gt; better than less. We need to remember that we are not our audience, and their needs at any time are very different from ours.&lt;/p&gt;
&lt;p&gt;Attention in an article is an important metric, but when applied to the reader&apos;s entire visit it is their quality of attention we should strive for: how quickly can you get a reader into a value-providing action such as reading an article or watching a video. Time spent hunting is time they could afford to save.&lt;/p&gt;
&lt;p&gt;Of course there is a lot more that is possible: in learning more about habits and interests of readers you could deliver them partially or entirely custom bundles, or more effectively A:B test structure and content than it may be possible to do in a more real-time traditional digital news product.&lt;/p&gt;
&lt;h3&gt;Timeliness&lt;/h3&gt;
&lt;p&gt;Editions rebundle articles. This is a step back from the course of the internet where the article has become the atomic unit of consumption. When it was impossible in a printed world to buy an individual article, in the digital domain you likely land on an article page directly when searching for news, and may never see the overall package.&lt;/p&gt;
&lt;p&gt;This is fine for flyby consumers, but in publishers with membership models the homepage, and other elements of the digital offering, have increased value. Readers may visit directly and use it to skim your reporting, or to get a feel for what your editorial focus is.&lt;/p&gt;
&lt;p&gt;Homepages today are (almost all) live news wires, with latest news interspersed with high-performing features and older articles. Repeat visitors over the course of the day (themselves rare, admittedly) may see articles they have already read sitting in the page, in a different position or with a different headline[^5].&lt;/p&gt;
&lt;p&gt;Editions offer the opportunity in rebundling articles to create periodic updates to your homepage or homepage-like features (such as a specific &apos;edition&apos; page). Your predictable updates provide opportunities for nudges and notifications at known times for your audience.&lt;/p&gt;
&lt;p&gt;And, should it be useful to your content strategy, editions can help to move newsrooms away from the always-breaking news agenda that is endemic of the transition to the internet. A rush to publish first means a multitude of updates, work passing between hands, and readers not knowing the difference between your outlets and the dozens of others carrying the same stories at the same frenzied pace. National broadcasters and cable networks will always cover breaking news, so bring your expertise and angle when it&apos;s ready in the next edition.&lt;/p&gt;
&lt;h2&gt;The state of editions&lt;/h2&gt;
&lt;p&gt;Moving on from the thematic elements of editions to the practicalities of introducing them to readers, it&apos;s no surprise to see that in practice little of the potential is realised for readers.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Times&lt;/em&gt;, &lt;em&gt;MailPlus&lt;/em&gt; and the &lt;em&gt;i&lt;/em&gt; all intersperse new stories with old, they all have long scrolling homepages based on print sections rather than reader need. None meaningfully personalise or engage further than comments or social pushes, and none offer to notify me about editions, leaving me to learn for myself when the next update is by deciphering unloved page furniture.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Times&lt;/em&gt; has even recently started to completely break with the concept, starting rolling live news coverage on their homepage, something which has become increasingly common as time has gone on. Journalists are working rigorously to serve themselves, and the social and search giants, rather than their loyal paying customers, or carving any kind of niche provision.&lt;/p&gt;
&lt;p&gt;The editions model is the clearest indication of the product/journalism divide I think there has been. In a world of print, publishers competed on content, geographical monopolies aside. In a global digital world, attention is more sought after than ever, and content is most commonly combined with some valued delivery mechanism to provide the best experience. This could be a movie streamed at adaptive resolutions straight to your smart TV app, or a song from a playlist constructed from your listening habits to introduce you to new artists.&lt;/p&gt;
&lt;p&gt;In our world of journalism it could equally be an edition. Some form of the packaging of journalism that isn&apos;t atomic, isn&apos;t gamed for search, and doesn&apos;t purely rely on the levers of social networks. A product in its own right that delivers a unique service for readers[^4].&lt;/p&gt;
&lt;p&gt;That is where we could be.&lt;/p&gt;
&lt;p&gt;[^1]: The &lt;a href=&quot;https://github.com/guardian/editions&quot;&gt;GitHub code repository&lt;/a&gt; for this app is even called &apos;editions&apos;, although it was originally called Mallard, which is super cute 🦆.&lt;/p&gt;
&lt;p&gt;[^2]: Speaking of volume of stories, Feedbin, Feedly and other RSS readers do this really nicely by showing you the number of stories you are likely to receive by subscribing to any one feed. eg. one article per month, or twelve articles per day. Don&apos;t tell me that information wouldn&apos;t help you make a better decision as to what to spend your time with.&lt;/p&gt;
&lt;p&gt;[^3]: Axios also have this lovable, almost-pointless &lt;code&gt;Go deeper&lt;/code&gt; clickthrough for stories on their list pages that calculates the minutes to read. More often that not, that time reads &lt;code&gt;(&amp;lt;3 minutes)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;[^4]: I feel it&apos;s worth nothing that this might not, and probably should not be the only product that you offer to readers as part of your service (unless you are really committed to this specific branch of readers), but increasingly could be something that an editor produces from your coverage, or is almost entirely automated. Publishers that jump into editions one day, and out of them the other, do nobody a good service. How on earth are your readers supposed to know what&apos;s in your head?&lt;/p&gt;
</content:encoded><h:img src="/_astro/newspaper-bundle.DFyaYn0x.webp"/><enclosure url="/_astro/newspaper-bundle.DFyaYn0x.webp"/></item><item><title>How to create a voicemail inbox for your journalism</title><link>https://tk.gg/posts/creating-a-voicemail-for-your-readers</link><guid isPermaLink="true">https://tk.gg/posts/creating-a-voicemail-for-your-readers</guid><description>How The New York Times produced the primal scream voicemail and how you can too in an easy step-by-step process</description><pubDate>Sat, 13 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;The New York Times&lt;/em&gt; recently produced an awesome article series called &lt;a href=&quot;https://www.nytimes.com/interactive/2021/02/04/parenting/working-moms-coronavirus.html&quot;&gt;Primal Scream&lt;/a&gt;, where a published phone number allowed readers to call in and talk about their experience raising children during the pandemic.&lt;/p&gt;
&lt;p&gt;Listening to your readers, however you can, is crucially important in evolving your delivery of digital journalism. Entire consultancies such as &lt;a href=&quot;https://wearehearken.com/&quot;&gt;Hearken&lt;/a&gt; are built on involving communities in business, especially journalism. &lt;a href=&quot;https://www.citybureau.org/&quot;&gt;City Bureau&lt;/a&gt; in Chicago bring people together in workshops to discuss the problems they are facing, ultimately producing media that is more honest, more involving, and crucially more desired.&lt;/p&gt;
&lt;p&gt;But how do you do that when you&apos;re a national newsroom at scale? Or even at the scale of a single city? How can we use technology to make it easier than ever for readers to get in touch with journalists and becoming involved in our storytelling.&lt;/p&gt;
&lt;p&gt;Whilst years ago running a phone in line like this was something that only the largest newsrooms with the deepest pockets could accomplish, advances in digital technologies have made creating the &lt;em&gt;Primal Scream&lt;/em&gt; phone line possible for even the smallest reporting outfits.&lt;/p&gt;
&lt;p&gt;Recording hundreds of voicemails to a dedicated phone number could cost you as little as $20. It requires very little technical knowledge, and just a few short steps to get everything up and running.&lt;/p&gt;
&lt;p&gt;We used the same technology when I worked for &lt;a href=&quot;https://www.thetimes.co.uk&quot;&gt;The Times&lt;/a&gt; for our &lt;a href=&quot;https://www.thetimes.co.uk/article/nhs-at-70-your-memories-of-the-national-health-service-xg5rlh56n?shareToken=293212bec002bdb7752eb9ecdd3a5450&quot;&gt;NHS memories project&lt;/a&gt;. Hearing the voices of readers telling their own stories adds impact that a typical written interview wouldn&apos;t have. Primal Scream I think shows that impact in a whole new way.&lt;/p&gt;
&lt;h2&gt;So how do you do it?&lt;/h2&gt;
&lt;p&gt;Basically we have a company called &lt;a href=&quot;https://www.twilio.com/referral/1GyN4i&quot;&gt;Twilio&lt;/a&gt; to thank for this. Twilio bring all that complexity in call-centres and telecoms networks and make it accessible and programmable over simple control panels. Fortunately what we&apos;ll be asking it to do is very easy to follow, and you don&apos;t need to know any code to get started.&lt;/p&gt;
&lt;p&gt;There are three main parts to this project. You&apos;re going to need to set up two things: a phone number, and a handler function for calls to that number. And you will need to record one piece of audio to upload that will act as your voicemail greeting.&lt;/p&gt;
&lt;p&gt;Let&apos;s get going:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sign up to &lt;a href=&quot;https://www.twilio.com/&quot;&gt;Twilio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To start, let&apos;s get a phone number. From your control panel find &apos;Programmable Voice&apos; from the overflow menu (pin it for easy use later), and then go to &apos;&lt;a href=&quot;https://www.twilio.com/console/voice/dashboard&quot;&gt;Numbers&lt;/a&gt;&apos; &lt;img src=&quot;https://assets.tk.gg/chrome_8CETMoCvFK.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;You&apos;ll need to upgrade your account by adding a small amount of cash at some point around about here. If you aren&apos;t prompted, or can&apos;t find out how, there&apos;s a guide on how to do that &lt;a href=&quot;https://support.twilio.com/hc/en-us/articles/223183208-Upgrading-to-a-paid-Twilio-Account&quot;&gt;here&lt;/a&gt;. Unless you enable the auto-recharge feature, should you run out of credit, Twilio will simply cease to operate service to you.&lt;/li&gt;
&lt;li&gt;Find &apos;&lt;a href=&quot;https://www.twilio.com/console/phone-numbers/search&quot;&gt;Get a number&lt;/a&gt;&apos; and search for a number you can use. Your number will need to support voice calls, so look for the 📞 phone icon.&lt;/li&gt;
&lt;li&gt;Once you&apos;ve purchased your number, we need to set up your voicemail. Let&apos;s start with the recording. Use any audio recording program, such as &lt;a href=&quot;https://www.audacityteam.org/download/&quot;&gt;Audacity&lt;/a&gt; or any online tool to get a file that you are happy with.&lt;/li&gt;
&lt;li&gt;Now go to &lt;a href=&quot;https://www.twilio.com/console/functions/overview&quot;&gt;Functions-&amp;gt;Runtime&lt;/a&gt; in the menu (pin this also) and click &lt;code&gt;Functions Classic&lt;/code&gt;. The new &lt;code&gt;Services&lt;/code&gt; feature doesn&apos;t support what we need to do yet. Click the red plus and give this any name you want &lt;code&gt;voicemail-recorder&lt;/code&gt; for example.&lt;/li&gt;
&lt;li&gt;To upload the file we&apos;re going to need to open the menu again and go to &lt;code&gt;Runtime-&amp;gt;Assets&lt;/code&gt;. Select &lt;code&gt;Assets (Classic)&lt;/code&gt; in the sidebar, and upload your file. Make sure it&apos;s public. Once it&apos;s uploaded select the URL in the &lt;code&gt;PATH&lt;/code&gt; field and save it somewhere, you&apos;ll need this in a moment.&lt;/li&gt;
&lt;li&gt;Now back to the &lt;code&gt;Functions Classic&lt;/code&gt; menu, and open your function. Let&apos;s give it a &lt;code&gt;PATH&lt;/code&gt; like &lt;code&gt;/voicemail&lt;/code&gt; (this must start with a slash). Underneath in the configuration field make sure &lt;code&gt;Access Control&lt;/code&gt; is disabled, select the &lt;code&gt;Event&lt;/code&gt; to be &lt;code&gt;Incoming Voice Calls&lt;/code&gt;, and then in the &lt;code&gt;Code&lt;/code&gt; box enter the following. Make sure to put your saved asset URL in!&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;exports.handler = function (context, event, callback) {
  const twiml = new Twilio.twiml.VoiceResponse()
  twiml.play(&apos;YOUR FILE&apos;) // Put your asset URL in this between the quote marks
  twiml.record({
    timeout: 10, // The number of seconds of silence to wait before hanging up
    transcribe: false, // Change this to true if you want Twilio to try to transcribe your recordings ($)
    maxLength: 300, // This is the maximum length that the audio recording can be.
    playBeep: true // This tells the function to play a bleep after your message or not.
  })
  twiml.hangup()
  callback(null, twiml)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Hit save! Hopefully there are no issues. Now we need to make it so when someone calls your number, this code is run. So go back to the programmable voice menu for your phone number.&lt;/li&gt;
&lt;li&gt;From here, scroll down to the &lt;code&gt;Voice &amp;amp; Fax&lt;/code&gt; options. Select &lt;code&gt;Accept Incoming&lt;/code&gt; and check it&apos;s set only to &lt;code&gt;Voice Calls&lt;/code&gt;. Then where it reads &lt;code&gt;A call comes in&lt;/code&gt; change the first option in the drop down menu to &lt;code&gt;Function&lt;/code&gt;, and now in the &lt;code&gt;Service&lt;/code&gt; menu that appears to the right, select &lt;code&gt;default&lt;/code&gt;, and from the &lt;code&gt;Function path&lt;/code&gt; menu, your path.&lt;/li&gt;
&lt;li&gt;Everything&apos;s set! Call your number and check that it&apos;s all working. You can find recordings in the &lt;code&gt;Calls log-&amp;gt;Incoming&lt;/code&gt; menu of your phone number.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you have questions, or can&apos;t get it working, give me a &lt;a href=&quot;https://twitter.com/MattieTK&quot;&gt;tweet&lt;/a&gt; and I&apos;ll see if I can help you out.&lt;/p&gt;
&lt;h3&gt;Be aware!&lt;/h3&gt;
&lt;p&gt;It is possible for a hostile actor to attack you by repeatedly calling your number and leaving long messages. Though they will not be able to block legitimate contributors, they can cost you money, and they can cost you time in sifting through the results.&lt;/p&gt;
&lt;p&gt;It is also possible for your fun experiment to turn into $1 a month forever unless you turn off your phone number at the end of the project. Make sure to remove any reference to the phone number from your reporting at this point, as otherwise it is possible for another actor to potentially take over the number.&lt;/p&gt;
</content:encoded><h:img src="https://assets.tk.gg/chrome_Uti0b5k184.png"/><enclosure url="https://assets.tk.gg/chrome_Uti0b5k184.png"/></item><item><title>What we learned from rebuilding the editions CMS for The Times</title><link>https://tk.gg/posts/how-not-to-launch-your-cms</link><guid isPermaLink="true">https://tk.gg/posts/how-not-to-launch-your-cms</guid><description>Or, how not to launch your new CMS</description><pubDate>Mon, 03 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the last post I took you through a short summary of what it took to get Edition Builder live at The Times and Sunday Times. If you haven’t read it, you should, it’s pretty good background.&lt;/p&gt;
&lt;p&gt;(In the last post I also mentioned I’d be writing this in a few weeks. That was pre-coronavirus, so these posts have taken a seat at the very back of a very long series of seats. Apologies for that!)&lt;/p&gt;
&lt;p&gt;As one of the larger engineering projects we have undertaken, Edition Builder broke new ground in a bunch of areas. We tried things that we hadn’t attempted before, and pushed systems to their limits (and well past them in one incident).&lt;/p&gt;
&lt;p&gt;There were a lot of challenges we encountered as a team that we had to work out how to navigate. Though its not likely that you’ll learn a lot about the specific issues we encountered, I hope there are patterns you can recognise that are best avoided, and things you can think about should you work on anything similar.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Searching for articles&lt;/h2&gt;
&lt;p&gt;Search in Edition Builder was, for most of its life, unworkable. I don’t know why I persisted so long convincing myself that it would work, but it was only ever going to get worse from the moment we realised this problem. Not raising this earlier in the lifecycle of the project was a big mistake from me, I think because I thought it was unsolvable, but as with most things online, someone else has usually solved the problem you are facing, and often they’ve built a SaaS solution that will cost substantially less than your engineering time building and maintaining it.&lt;/p&gt;
&lt;p&gt;On to how search was terrible. Our content API was never built for search. This is because of the link between our CMS and our content api was only one way: via publishing. Our readers used a managed SOLR cluster for site search. Editorial users only ever needed to work with content inside the CMS, which had reasonable search and categorisation functionality. In the world of Edition Builder existing, suddenly there was a need to find articles before they had gone through the publishing process.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/1_EvqKLCBT8axTCVp7OYqgTw.png&apos; height={916} width={1119} /&amp;gt;
&amp;lt;figcaption&amp;gt;
All 776 of those articles were stored in full in your browser’s memory, because performance be
damned, we needed somewhere to put them!
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;“No problem”, we thought, “we’ll set up another version of that API” (because building versioning in to the API was not something we wanted to be responsible for). (and it has ended up coming anyway as part of a later rewrite).&lt;/p&gt;
&lt;p&gt;Except of course there was no reasonable way to perform a scan or search as the endpoints just didn’t exist. So in the end we settled for fetching a range of data between two dates, and storing that in the application state to then sift through locally in the browser.&lt;/p&gt;
&lt;p&gt;Constructing that index took as long as three seconds per 24hr period searched, so we limited it to three days at a time. Worse: to get new articles, you had to refresh your local index, causing another delay of however long you had selected.&lt;/p&gt;
&lt;p&gt;The moment this hit user testing it became clear to us it was a big problem. The search was just too slow. But was it even within our power to fix? We sat on the problem, hoping a solution would rear its head, as every fix we could think of involved work well outside the scope of the project (and adding months to its delivery).&lt;/p&gt;
&lt;p&gt;Step forward a couple of months and a couple of members of the team had been tasked with something new. We’d just signed up for &lt;a href=&quot;https://resources.algolia.com/customer-stories/the-times&quot;&gt;&lt;strong&gt;Algolia&lt;/strong&gt;&lt;/a&gt;, a SaaS search provider, and needed to get it working for our readers as soon as possible, decommissioning the SOLR cluster as we went.&lt;/p&gt;
&lt;p&gt;Algolia is a breeze to work with, and we quickly saw significant improvements on what SOLR had been returning. We feature flagged one engine over the other, and, with journalists being some of the world’s best critics on search engines to surface their own writing, I jerry-rigged &lt;a href=&quot;https://times-search-test.glitch.me/&quot;&gt;a glitch.com app&lt;/a&gt; that we sent round to find out which performed better.&lt;/p&gt;
&lt;p&gt;A few tweaks to the ranking algorithm later, we were satisfied. And then it dawned on us that we could use exactly the same thing in Edition Builder.&lt;/p&gt;
&lt;p&gt;Tearing out the old system and replacing it with a prototype took just a few days. Again we played around with ranking and faceting to get what we needed, and then we threw it in front of users to test.
Immediately we saw improvements. A local in-browser index was no-longer necessary. Every query went fresh to the remote index, resulting in more recent results. We could return results almost instantly, just as you typed into the box.&lt;/p&gt;
&lt;p&gt;Even better, when users talked about issues they were having with search, they were relatively easy to diagnose. We could replicate the same searches, see how the ranking affected the results, and adjust accordingly, even on a per-query basis.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;How we structure edition updates&lt;/h2&gt;
&lt;p&gt;A second issue we looked to solve focused on how we structured editions. On reflection, I think we could have gone further, and we shouldn’t have shut conversations down so early without seeing them out. Again here there was too much of an assumption we had the best solution at the time, and not enough thought to restructure things early on.&lt;/p&gt;
&lt;p&gt;In the previous system, editions over the course of the day were overwritten when the latest update was published. This meant throwing a lot of useful data away, a lot of which we were technically paying for in terms of journalistic decision making. Wouldn’t it potentially be useful to be able to learn about how stories move around the edition, and save different updates separately.&lt;/p&gt;
&lt;p&gt;We initially explored a git-style branching system where root editions would have branches with changes on them that then potentially were merged back over time. This had the advantages of immediately making sense to developers, and the disadvantage of it not making any sense to any of our users 😭. Can you imagine playing with git-editions on deadline?!&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/0_fFwub9PiTsadeVGj.jfif&apos; height={353} width={700} /&amp;gt;
&amp;lt;figcaption&amp;gt;
How a branching model might have enabled multiple versions to work together with each other
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;The ‘git’ style feature would have brought us some level of historical and history data, which we could have used for scrubbing back and forth, but the complexity add at the time, along with the UI challenges of having this work seamlessly for users was problematic.&lt;/p&gt;
&lt;p&gt;We set out to solve the problem actually in front of us, and built the simplest solution we could see that did that.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/0_3blbvJMGpwdg_m0V.jfif&apos; height={920} width={1920} /&amp;gt;
&amp;lt;figcaption&amp;gt;
Our old system never stopped being edition A. In the new system we just create a new edition
each time that is a copy of the previous one, whilst saving its parent.
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;Simply enabling users to copy past published editions into future timeslots solved the data problem, and enabled users to work on future editions whilst still being able to make tweaks and changes to past ones.&lt;/p&gt;
&lt;p&gt;In hindsight though, it didn’t solve enough of the problem. For example, in a short timeframe you might want to urgently prepare two options for a future version. A direct copy gives you very little flexibility as other stories that might change need to then be made in two places. We thought at the time about creating overlays you could flatten into an edition update, but again it was difficult to work out if the value would ever be delivered.&lt;/p&gt;
&lt;p&gt;Looking back I wish we’d thought harder about how sections interacted with editions and made that less fixed. In reality an edition is just a bundle of sections, and making them updatable independently and then bundleable for an update might have both provided an easier structure to manage, and an easier product to break up should we plan to in the future.&lt;/p&gt;
&lt;p&gt;The saving grace at least, given the changes made, is that it will be significantly easier to integrate our bespoke analytics service (INCA) into this system, so as to show journalists when they place stories what the story is expected to do based on its position in terms of our key metrics. This will help journalists understand the power of their decision making better (as stories towards the top of the edition have generally higher numbers than those lower, stories in larger slots likewise etc).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Publishing and the initial breakdown&lt;/h2&gt;
&lt;p&gt;Finally we have the bug that held us up for four months. The lesson: never trust orphaned systems to do anything.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/1_EvqKLCBT8axTCVp7OYqgTw.png&apos; height={916} width={1119} caption=&apos;&apos; /&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;This is the working version (we also added lazy loading… which would have been a really good idea at the start)&lt;/p&gt;
&lt;p&gt;Edition Builder has a feature that shows the entire edition to you at once in a single screen. In order to do this we have to fetch all the articles that exist in this view from the API.&lt;/p&gt;
&lt;p&gt;In addition, Edition Builder, for the first time, had to handle published and unpublished content (as mentioned in the search feature). This meant that two versions of the same article could exist at the same time, given editorially you might want to feature either (the unadjusted published version, or the perhaps more-up-to-date unpublished version).&lt;/p&gt;
&lt;p&gt;The consequence being this view needed to switch from two sourcing content APIs, the in-production API, and our preview API, depending on the article.&lt;/p&gt;
&lt;p&gt;And when we published articles, we switched any reference for this lookup from the preview version to the production version. Simple!
When it came to running our first live editions everything went really smoothly. We worked our way back from the 5pm edition to the 9am, in order to have the least impact in the most supportable working hours, and finally had the midnight edition in our sights.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/1_uwg3a5UmyrFOBBWMD1stYw.png&apos; height={226} width={564} /&amp;gt;
&amp;lt;figcaption&amp;gt;
I don’t always @channel, but when I do it’s the best @channel in the world
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;Where the 9am, 12pm, and 5pm editions are relatively small updates on the main bulk, the midnight edition publishes several hundred articles all at once. For architecture that was not necessarily built for this in mind, bursts like this can be fatal… which we learned to our peril.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/1_khy5fJZSN2geytRWwYSlEw.png&apos; height={184} width={414} /&amp;gt;
&amp;lt;figcaption&amp;gt;😰 👉⏺&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/1_Ljto-7_OnPus-WRFdeJJjA.png&apos; height={428} width={546} /&amp;gt;
&amp;lt;figcaption&amp;gt;The as-promised ‘crippling load’ 🔥&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;When Edition Builder publishes the midnight edition, all of these articles get posted into the content API in the same queue. This usually causes a little bit of a spike.&lt;/p&gt;
&lt;p&gt;But Edition Builders incredibly smart and well-meaning feature that showed you the entire edition after publish, then immediately tried to load these hundreds of articles from the same system that was trying desperately to ingest them.&lt;/p&gt;
&lt;p&gt;And what’s more, in order to check if there were any changes, it reloaded them every thirty seconds.&lt;/p&gt;
&lt;p&gt;Cue heavy breathing from our operations team as our apps started to intermittently return 500 errors. And by &lt;em&gt;intermittently&lt;/em&gt;, I mean &lt;em&gt;all the time for about fifteen minutes&lt;/em&gt;. 😬&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/1_g7nffKQpmVrMsYqJmw7veg.png&apos; height={1588} width={2048} caption=&apos;&apos; /&amp;gt;
&amp;lt;figcaption&amp;gt;Oh that does not look good.&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Fixing this was no mean feat. The content API at this stage was practically orphaned, with a replacement on the way, but with no clear end in sight.&lt;/p&gt;
&lt;p&gt;What’s more, this problem only occurred in production, and we couldn’t work out how to replicate it on our pre-production instances, which all handled the load fine (perhaps because it was the only load they were seeing 👀).&lt;/p&gt;
&lt;p&gt;We, sensibly, were not allowed to continue our production rollout whilst this error still occurred, but we couldn’t replicate the error to show it was solved, so our catch-22 just kept enumerating.&lt;/p&gt;
&lt;p&gt;After far too long, our solution came in the form of new talent. Stefano Berdusco joined me on the long road to salvation and together we wrote load tests (he wrote them), we built a perfect replica of production (he built it), and we flipped the sourcing to the new API, so as not to cripple the old one (maybe my idea, but given my track record probably also his).&lt;/p&gt;
&lt;p&gt;😍 Our tests, with load applied, showed the new API (built with this burst in mind) was able to easily handle the preview state. And we were back on track.&lt;/p&gt;
&lt;p&gt;So that’s that. Thanks for reading, I hope we all learned something.
(Also in going through our Slack logs for this post, perhaps my favourite short-lived bug below)&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/1_Rl8YBk2tT0ySbm0vTKMmlA.png&apos; /&amp;gt;
&amp;lt;figcaption&amp;gt;❤️ this team&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
</content:encoded><h:img src="https://assets.tk.gg/eb-screenshot.png"/><enclosure url="https://assets.tk.gg/eb-screenshot.png"/></item><item><title>Building Editions at The Times</title><link>https://tk.gg/posts/building-editions-at-the-times</link><guid isPermaLink="true">https://tk.gg/posts/building-editions-at-the-times</guid><description>How we rebuilt the home-page editor for The Times focusing around the edition strategy</description><pubDate>Thu, 23 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Internal tools never get enough attention.&lt;/p&gt;
&lt;p&gt;Building them can be a thankless, unseen task that’s rarely prioritised, as it is not immediately obvious how to tie investment in them back to the bottom line. It can be too easy to jump on the customer-facing speedboat and jet away from them, leaving a wake of stopgaps that can often leave you with tightly coupled intricate workarounds that are enormously difficult to pick apart.&lt;/p&gt;
&lt;p&gt;This was the case at &lt;a href=&quot;https://www.thetimes.co.uk&quot;&gt;&lt;em&gt;The Times&lt;/em&gt;&lt;/a&gt; for the last four years. While we spent a long time discussing and designing how editions might work on our readers’ screens, we didn’t place any focus on how to make building these experiences manageable for our editors. We quickly shoehorned the process into our generic digital CMS, making it difficult to maintain or build upon, and creating a process for our editors that took much longer than it should have done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edition Builder&lt;/strong&gt; was our solution to this problem, and has been two years in the making. At its heart, it is a simple drag and drop interface that allows you to place and publish stories in our edition. Beneath the surface is a huge amount of user research and UX refinement and, crucially, the foundations for future newsroom tools.&lt;/p&gt;
&lt;p&gt;Late last year &lt;em&gt;The Times&lt;/em&gt; went live, and this week &lt;em&gt;The Sunday Times&lt;/em&gt; joined them, and now all editions from &lt;em&gt;The Times&lt;/em&gt; and &lt;em&gt;The Sunday Times&lt;/em&gt; are produced on Edition Builder. I’d love to tell you more about the story of how we got here and what it means for the future.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/newspaper-bundle.png&apos; /&amp;gt;
&amp;lt;figcaption&amp;gt;
Editions replicate the print bundle in a digital form: timely, broad, and finite.
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;h2&gt;From prototype to production&lt;/h2&gt;
&lt;p&gt;I’m well known as someone who is not easily impressed, but from day one editions excited me: the idea of publishing fewer stories, of higher quality, in a bundled format was novel. However, the way we produced them irked me. Our editors were fighting with the system to make the most basic changes. The more time went on, the more we wanted to do with editions and the more painful it came to be.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/eb-prototype.png&apos; /&amp;gt;
&amp;lt;figcaption&amp;gt;
{&apos; &apos;}
The first Edition Builder prototype showing the menu to create article containers.
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;In a break from our day-to-day jobs supporting editorial, Chris Hutchinson (now a Principal Engineer at &lt;em&gt;The Times&lt;/em&gt;) and I took some time out with the implicit instruction to build something cool that we thought needed to exist. We only had a week, and we went slightly over schedule, but we knew from the start we wanted to solve our edition curation problem.&lt;/p&gt;
&lt;p&gt;The value we were able to provide from our experience understanding the editorial pain-points, being able to theorise a solution, and eventually prototyping it wouldn’t have happened outside of our cross-functional editorial development team. These groups of product and engineering-focused, journalism-obsessed individuals that have sprung up at news orgs all around the world are, in my opinion, some of the most valuable people in the business.&lt;/p&gt;
&lt;p&gt;Our team’s dream was to empower the newsroom to do much more with editions, faster and more intuitively than before, but the current monolithic CMS made this more difficult than it should have been.&lt;/p&gt;
&lt;p&gt;Edition Builder’s prototype came out of that week, and our demo roadshow made the rounds through the technology and editorial departments. There was ambition to build more. Finally, after a presentation that included way too many Jurassic Park gifs for the seniority of the audience, we got there, and the investment case was signed off.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/methode-is-gross.png&apos; /&amp;gt;
&amp;lt;figcaption&amp;gt;
{&apos; &apos;}
Our first challenge was working out what features from the old system were useful, and which
were not. This is our old edition plan, built into the same system that made our printed
product.
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;We formed a team of six engineers, a user-experience designer, and myself, acting as the product manager. As a new team, with a clear purpose, we dived in and (of course) began making mistakes.&lt;/p&gt;
&lt;p&gt;It quickly became apparent that some of our assumptions were misplaced, or just wrong. We designed an introduction screen that we thought made it clear which edition was live at any one time: nobody from editorial understood it. We thought that previewing articles was something people did habitually but didn’t really need: it turns out they did. And we thought, most wrongly, that getting articles out of the system, and publishing our eventual output would be the easy bit: publishing functionality alone took six months to build.&lt;/p&gt;
&lt;p&gt;Inevitably there are more unknowns than you realise entering a project like this. Our objective was very clear: build a slimmer, faster, more efficient, and more extensible system for editions; and sliced up, the journey ahead looked manageable. But between the cracks were services that hadn’t seen new deployments in months, orphaned systems held together with the code equivalent of a low-budget PVA glue, and teams across the business skittish and burnt from too many lookalike projects gone wrong.&lt;/p&gt;
&lt;p&gt;This is mostly why it took just over two years to bring Edition Builder into production. When a single tool is responsible for a disproportionate amount of your output, replacing it becomes a project of either changing what you do with it, or covering off every feature it has.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img
src=&apos;https://assets.tk.gg/open-articles-prototype.jpeg&apos;&lt;/p&gt;
&lt;p&gt;/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;figcaption&amp;gt;Making it so that users could open up articles in the original editing system was important. This was the initial paper prototype I threw together.&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;Making it so that users could open up articles in the original editing system was important. This was the initial paper prototype I threw together.&lt;/p&gt;
&lt;p&gt;There was no logical physical analogy that didn’t sound absurdly risky: like shifting your entire printing press all at once to another that has identical output, but also looks and works completely differently.&lt;/p&gt;
&lt;p&gt;Getting editorial users on side was a crucial part of this project from the start. Over time we probably ended up building a few small features that weren’t needed (and we are now in the process of gradually removing), but the goodwill gained from these relatively small features greatly outweighed the development cost.&lt;/p&gt;
&lt;p&gt;That established trust was important to move forward with some bigger work items without consulting users every step of the way, whilst working more closely with them on items we knew they cared about. It meant we slowly built up a relationship where we felt aligned in the combined goal of transforming this workflow to make a better product, rather than being forced to replicate every step for a feeling of safety and familiarity.&lt;/p&gt;
&lt;p&gt;Ultimately this all paid off. Even though it took a little longer than expected, and the team working on it changed in its entirety when we hit a particularly sticky deployment issue towards the end. Some of our heaviest editorial users have given us rave reviews: it is “far faster&quot;, the time savings “impressive” and the rollout “exemplary”.&lt;/p&gt;
&lt;p&gt;In our prototype, we worked out a time saving of approximately 5x on doing some basic actions. Edition Builder in production is in some cases 50–100x faster than the previous workflow to perform the same task. We really should hold everything used this regularly to the same standards.&lt;/p&gt;
&lt;p&gt;With that I’d like to thank the people on the team that brought us to where we are now: Himesh Ladva, Tom Chambers, Elliot Davies, Cassie Best, Leah Haskoylu, Chris Hutchinson, James Fuller, Geoff Ford, Chris Jordan, Stefano Berdusco, Jack Stevens, Tom Hoad and Adele Kufour.👏&lt;/p&gt;
&lt;p&gt;I’d also like to thank everyone in the newsroom that worked with us to help develop the tool and get it into production, including Wes Rock, Gary Mitchell, Abhi Ahluwalia, George Lindsay-Watson, David Rankin, Sadie Gray, Hannah Rock, Hannah Scott, and Michael Brear.&lt;/p&gt;
&lt;p&gt;&amp;lt;figure&amp;gt;
&amp;lt;img src=&apos;https://assets.tk.gg/eb-early.png&apos; /&amp;gt;
&amp;lt;figcaption&amp;gt;
An early build of the live system with a simple article search loaded into the browser’s memory.
&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;&lt;/p&gt;
&lt;p&gt;Read &lt;a href=&quot;/posts/how-not-to-launch-your-cms&quot;&gt;part two&lt;/a&gt; here, and learn the lessons we learned putting this system together.&lt;/p&gt;
&lt;p&gt;And, enjoy last weekend’s &lt;em&gt;The Sunday Times&lt;/em&gt;; the first Sunday edition made with Edition Builder. 🎉&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&apos;https://assets.tk.gg/first-eb-st.png&apos; /&amp;gt;&lt;/p&gt;
</content:encoded><h:img src="https://assets.tk.gg/editions-gif.gif"/><enclosure url="https://assets.tk.gg/editions-gif.gif"/></item></channel></rss>