<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Apricot Blog</title>
<link>https://blog.theapricot.io/index.html</link>
<atom:link href="https://blog.theapricot.io/index.xml" rel="self" type="application/rss+xml"/>
<description>All about Apricot, the AI service that prioritizes and summarizes your content subscriptions to help you focus on the things that matter.</description>
<generator>quarto-1.2.222</generator>
<lastBuildDate>Fri, 16 Jun 2023 05:00:00 GMT</lastBuildDate>
<item>
  <title>How to add HTTP headers to a Quarto blog on Netlify</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/quarto-headers/index.html</link>
  <description><![CDATA[ 




<p>A little break today from the usual Apricot fare.</p>
<p>I recently learned about the security risk of <a href="https://en.wikipedia.org/wiki/Clickjacking">click-jacking</a>, which is a way to embed somebody else’s web content under a transparent overlay to trick users into doing things they shouldn’t. Somebody could embed the content on this blog, for example, on another website with transparent links overlaid that download malicious code.</p>
<p>To be honest, I don’t know how much of a risk this really is, but the 80% solution is super easy (in theory) and doesn’t seem like it can hurt.</p>
<div class="callout-warning callout callout-style-default callout-captioned">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-caption-container flex-fill">
Warning
</div>
</div>
<div class="callout-body-container callout-body">
<p>I am not a security expert and this post is not about security; please do not treat it as a reference for security best-practices.</p>
</div>
</div>
<section id="a-solution-in-theory" class="level1">
<h1>A solution, in theory</h1>
<p>One way to prevent your web content from being embedded on another site in a <em>frame</em> specifically is to include the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options"><code>X-Frame-Options</code></a> header in the HTTP response, with the policy set to <code>DENY</code> or <code>SAMEORIGIN</code>. I prefer <code>DENY</code> because I don’t think I’ll ever need to embed my own blog content, but it seems like <code>SAMEORIGIN</code> is more common.</p>
<p>OK, simple enough, but how to make this happen?</p>
</section>
<section id="a-fly-in-the-ointment" class="level1">
<h1>A fly in the ointment</h1>
<p>This blog is built with the <a href="https://quarto.org/">Quarto</a> framework and published on Netlify.</p>
<p>Let’s start with Netlify, because that’s there the HTTP response header is ultimately going to be served from. Netlify’s <a href="https://docs.netlify.com/routing/headers/">Custom Headers</a> page says we just need to include a file <code>_headers</code> in our publish directory and even gives an example for the clickjacking problem:</p>
<div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode ini code-with-copy"><code class="sourceCode ini"><span id="cb1-1"><span class="dt" style="color: #AD0000;">/*</span></span>
<span id="cb1-2"><span class="dt" style="color: #AD0000;">  X-Frame-Options: DENY</span></span>
<span id="cb1-3"><span class="dt" style="color: #AD0000;">  X-XSS-Protection: 1; mode</span><span class="ot" style="color: #003B4F;">=</span><span class="st" style="color: #20794D;">block</span></span></code></pre></div>
<p>OK, now back to Quarto, where we find the fly in the ointment.<sup>1</sup> We need to get this file into our publish directory (by default this is called <code>_site</code>). But we can’t just put the file into the <code>_site</code> directory because Quarto deletes it every time it renders the source.</p>
<p>The Quarto docs do have a page about <a href="https://quarto.org/docs/websites/website-tools.html">headers</a>, but they’re HTML headers, not HTTP, so that’s no help.</p>
</section>
<section id="the-solution-for-real" class="level1">
<h1>The solution, for real</h1>
<p>Instead, we need to refer to Quarto’s <a href="https://quarto.org/docs/websites/website-tools.html#site-resources">site resources</a> page, which shows how to include files like <code>_headers</code> (or other things like images) in the <code>_site</code> directory after rendering.</p>
<p>In the root directory of our project we have a config file called <code>_quarto.yml</code>. In the <code>project</code> field of that file we list <code>_headers</code> as a resource, which tells Quarto to copy the <code>_headers</code> file over every time it renders.</p>
<div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode yaml code-with-copy"><code class="sourceCode yaml"><span id="cb2-1"><span class="fu" style="color: #4758AB;">project</span><span class="kw" style="color: #003B4F;">:</span></span>
<span id="cb2-2"><span class="at" style="color: #657422;">  </span><span class="fu" style="color: #4758AB;">type</span><span class="kw" style="color: #003B4F;">:</span><span class="at" style="color: #657422;"> website</span></span>
<span id="cb2-3"><span class="at" style="color: #657422;">  </span><span class="fu" style="color: #4758AB;">resources</span><span class="kw" style="color: #003B4F;">:</span></span>
<span id="cb2-4"><span class="at" style="color: #657422;">   </span><span class="kw" style="color: #003B4F;">-</span><span class="at" style="color: #657422;"> </span><span class="st" style="color: #20794D;">"_headers"</span></span></code></pre></div>
<p>So just leave the <code>_headers</code> file in the root directory. Render the changes and publish to Netlify and we’re good to go.</p>
<div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb3-1"><span class="ex" style="color: null;">$</span> quarto render</span>
<span id="cb3-2"><span class="ex" style="color: null;">$</span> quarto publish <span class="at" style="color: #657422;">--no-render</span> netlify</span></code></pre></div>
<p>To verify, open the dev tools in your favorite browser and go to the network tab. Open (or refresh) your blog and click on the top entry, which should be the page itself (not a secondary resource). To the right, you should see a section for Response Headers, and you should see the new <code>X-Frame-Options</code> entry.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/quarto-headers/dev_tools_verification.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">Confirmed, there’s the <code>X-Frame-Options</code> header, toward the bottom of the image, set to <code>DENY</code> attempts to embed this blog’s content in any frame.</figcaption><p></p>
</figure>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>I love Quarto and can’t recommend it enough for technical writing of almost any kind, but for web and blog applications the documentation can be a bit thin.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>Apricot Tech</category>
  <guid>https://blog.theapricot.io/posts/quarto-headers/index.html</guid>
  <pubDate>Fri, 16 Jun 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/quarto-headers/dev_tools_verification.png" medium="image" type="image/png" height="129" width="144"/>
</item>
<item>
  <title>Long live (feed) search!</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/long-live-search/index.html</link>
  <description><![CDATA[ 




<p>Search has taken quite a beating in the past few months at the hands of large language model AI. The common refrain goes something like <em>we don’t want pages of web links, we want an answer to our question</em>.</p>
<p>True enough, but search isn’t just about question answering.</p>
<p><strong>What if you want to add a feed to your Apricot list?</strong> Search turns out to be the perfect tool for that even though it’s not a question. The ability to search for a feed by name does two things.</p>
<ol type="1">
<li><p>It means you don’t need to copy and paste feed links from other platforms.</p></li>
<li><p>It reveals the true awesomeness of finding and following related content from <em>different</em> platforms.</p></li>
</ol>
<section id="the-power-of-cross-platform-search" class="level1">
<h1>The power of cross-platform search</h1>
<p>Let’s say, for example, we want to follow the new Star Trek TV show, so we open the Apricot app, go to the <a href="https://app.theapricot.io/addfeed">Add feed</a>, and search for “Star Trek”. We see something like this:</p>
<p><img src="https://blog.theapricot.io/posts/long-live-search/Screenshot from 2023-06-12 15-29-03.png" class="img-fluid"></p>
<p>Apricot searches <em>all</em> platforms for Star Trek, so in addition to the TV show results, we also see two Spotify podcasts. In fact, if it weren’t for the ongoing Reddit blackout, we would also see several related subreddits.</p>
<p><strong>We can follow all of these feeds in Apricot, and geek out on as much Star Trek content as we can take.</strong> We just click the <i class="bi bi-plus-circle-fill"></i> icon to the right of each feed we want to follow and watch the icon change to an orange check mark. It should look something like this:</p>
<p><img src="https://blog.theapricot.io/posts/long-live-search/Screenshot from 2023-06-12 15-56-54.png" class="img-fluid"></p>
<p>Now we’ll see both the TV show episodes and podcast episodes in our Apricot feed—super cool!</p>
</section>
<section id="looking-up-the-road" class="level1">
<h1>Looking up the road</h1>
<p>If you’re a Star Trek fan, you probably already noticed a problem: the upcoming show isn’t actually in our results list. That would be <em>Star Trek: Strange New Worlds</em>. Let’s add the word “strange” to our query:</p>
<p><img src="https://blog.theapricot.io/posts/long-live-search/Screenshot from 2023-06-13 10-18-03.png" class="img-fluid"></p>
<p>Ah, there it is.</p>
<p>One of the weaknesses with Apricot’s first version of search is that the query has to be pretty close to the true feed title. Looking ahead, we’ll be working on fixing this with fuzzy searches that tolerate partial matches and typos better, plus some other biggies:</p>
<ul>
<li><p>A one-line description of each search result. Today, you can click on each result to see the feed in the original platform, but we know that’s not ideal.</p></li>
<li><p>A bigger set of feeds to search from. The more feeds our users add to Apricot, the better the search results will be for everybody.</p></li>
<li><p>AI-generated feed suggestions, when you don’t have a specific feed in mind.</p></li>
<li><p>Other languages besides English. Apricot search works ok for non-English feed names, but it’s really optimized for English.</p></li>
</ul>
<p>Try it out and let us know what you think! Stay tuned for more updates and another blog post on the technical details of our search implementation.</p>


</section>

 ]]></description>
  <category>New Feature</category>
  <category>User Guide</category>
  <guid>https://blog.theapricot.io/posts/long-live-search/index.html</guid>
  <pubDate>Mon, 12 Jun 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/long-live-search/Screenshot from 2023-06-12 15-29-03.png" medium="image" type="image/png" height="91" width="144"/>
</item>
<item>
  <title>ChatGPT vs. Bard: A realistic comparison</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/chatgpt-vs-bard/index.html</link>
  <description><![CDATA[ 




<p><a href="https://theapricot.io">Apricot</a> is an “AI-powered” product in a few ways. Most directly, the Apricot app uses a large language model (LLM) service for on-demand content summaries. Behind the scenes, I use LLM chat bots to write drafts of both new code and marketing content, like LinkedIn posts and Tweets.</p>
<p>So far, I’ve used ChatGPT for this (GPT-3.5 for the API, GPT-4 in the chat window), but Google made Bard <a href="https://www.theverge.com/2023/5/10/23718066/google-bard-ai-features-waitlist-dark-mode-visual-search-io">generally available this week</a> and upgraded it to use its new PaLM 2 LLM and the hype men came out in predictable force.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://twitter.com/rezkhere/status/1656765644317024257"><img src="https://blog.theapricot.io/posts/chatgpt-vs-bard/hype_tweet.png" class="img-fluid figure-img"></a></p>
<p></p><figcaption class="figure-caption">A Bard hype tweet. One example of many.</figcaption><p></p>
</figure>
</div>
<p>Many of the examples in these hype tweets don’t stand up to scrutiny, in terms of being meaningful for everyday use.</p>
<ul>
<li><p>Sure, Bard can export code directly to Google Colab, but Ctrl-C, Ctrl-V into a notebook isn’t <em>that</em> hard either.</p></li>
<li><p>Yes, Bard can get yesterday’s stock returns, but so can Yahoo Finance.</p></li>
<li><p>Sometimes the examples just don’t replicate. I asked Bard for specific SEO tips for Apricot’s landing page and it gave generic suggestions. Fine, but nothing special.</p></li>
<li><p>Voice prompts are probably very helpful to some people, but not a deciding factor for most.</p></li>
</ul>
<p>I don’t want to fall behind the pack, though, so <strong>let’s put Bard to the test vs.&nbsp;ChatGPT for my actual Apricot-related use cases.</strong></p>
<section id="some-context" class="level1">
<h1>Some context</h1>
<p>This is not a scientific study, clearly. Once upon a time, I enjoyed doing controlled, in-depth, technical comparisons of ML models, but those days are past. In this post, I’m going to take about an hour to explore a few use cases, make a decision, and move on to the rest of my long to-do list.</p>
</section>
<section id="the-competitors" class="level1">
<h1>The competitors</h1>
<ul>
<li><p>OpenAI ChatGPT, with the GPT-4 model, in the chat window at <a href="https://chat.openai.com/">https://chat.openai.com/</a>. I pay about $20/month for this.</p></li>
<li><p>Google Bard, in the chat window at <a href="https://bard.google.com/">https://bard.google.com/</a>. I’m not sure what the model is under the hood, so minus 1 point for Google. But it’s free, so plus 1 point and we’re back to even.</p></li>
</ul>
</section>
<section id="challenge-and-results" class="level1">
<h1>Challenge and Results</h1>
<section id="summarize-long-form-content" class="level2">
<h2 class="anchored" data-anchor-id="summarize-long-form-content">1. Summarize long-form content</h2>
<p>Benn Stancil writes a great data science <a href="https://benn.substack.com/">newsletter</a> but his headlines are super vague. Take Stancil’s post <a href="https://benn.substack.com/p/the-new-philosophers">The new philosophers</a> as an example—I have no idea what’s its about from the title alone. Let’s ask our AI assistants to summarize the content, so we know if it’s worth our time to read.</p>
<p>My prompt to each system is the same as the Apricot App’s prompt for on-demand user-facing summaries:<sup>1</sup></p>
<blockquote class="blockquote">
<p>Summarize the following content in one sentence: “““{text}”””</p>
</blockquote>
<p>ChatGPT says: <img src="https://blog.theapricot.io/posts/chatgpt-vs-bard/chatgpt_summary.png" class="img-fluid"></p>
<p>Bard says:</p>
<p>Well, hang on a sec…Bard truncates the input, and it’s not obvious where. Let’s hope Stancil didn’t save the punchline for the very end…Kinda surprising, to be honest, when <a href="https://twitter.com/AnthropicAI/status/1656700154190389248">other tools are expanding the context window</a> dramatically.</p>
<p>At any rate, Bard’s answer is:</p>
<p><img src="https://blog.theapricot.io/posts/chatgpt-vs-bard/bard_summary.png" class="img-fluid"></p>
<p><strong>Side note:</strong> the <em>View other drafts</em> option is intriguing but I’m not sure it makes sense, from a product perspective. Wouldn’t it be better to iterate with a new prompt if I don’t like the response? I don’t have the patience to read three answers every time I use the tool.</p>
<p><strong>Winner: ChatGPT</strong></p>
<p>Bard’s summary is <em>too</em> terse; it conveys very little information. ChatGPT, on the other hand, captures explicitly that the next evolution of the data management tools will be about AI specifically and could be a fundamental, discontinuous change.</p>
</section>
<section id="write-a-python-function" class="level2">
<h2 class="anchored" data-anchor-id="write-a-python-function">2. Write a Python function</h2>
<p>Users coming to Apricot <a href="feedly-to-apricot">from an RSS reader</a> can import their feeds in bulk with an <a href="https://en.wikipedia.org/wiki/OPML">OPML file</a>. When I set out to build this feature, I didn’t know much about OPML so I asked ChatGPT to write the core parsing code.</p>
<blockquote class="blockquote">
<p>Write a Python function to parse an OPML file.</p>
</blockquote>
<p>ChatGPT’s answer:</p>
<div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;">import</span> xml.etree.ElementTree <span class="im" style="color: #00769E;">as</span> ET</span>
<span id="cb1-2"></span>
<span id="cb1-3"><span class="kw" style="color: #003B4F;">def</span> parse_opml(file_path):</span>
<span id="cb1-4">    <span class="co" style="color: #5E5E5E;"># Parse the OPML file</span></span>
<span id="cb1-5">    tree <span class="op" style="color: #5E5E5E;">=</span> ET.parse(file_path)</span>
<span id="cb1-6">    root <span class="op" style="color: #5E5E5E;">=</span> tree.getroot()</span>
<span id="cb1-7">    </span>
<span id="cb1-8">    <span class="co" style="color: #5E5E5E;"># OPML should have a 'body' child, which contains 'outline' elements</span></span>
<span id="cb1-9">    body <span class="op" style="color: #5E5E5E;">=</span> root.find(<span class="st" style="color: #20794D;">'body'</span>)</span>
<span id="cb1-10"></span>
<span id="cb1-11">    outlines <span class="op" style="color: #5E5E5E;">=</span> []</span>
<span id="cb1-12"></span>
<span id="cb1-13">    <span class="cf" style="color: #003B4F;">for</span> outline <span class="kw" style="color: #003B4F;">in</span> body.findall(<span class="st" style="color: #20794D;">'outline'</span>):</span>
<span id="cb1-14">        <span class="co" style="color: #5E5E5E;"># Each outline should have 'text' attribute</span></span>
<span id="cb1-15">        text <span class="op" style="color: #5E5E5E;">=</span> outline.get(<span class="st" style="color: #20794D;">'text'</span>, <span class="st" style="color: #20794D;">''</span>)</span>
<span id="cb1-16">        </span>
<span id="cb1-17">        <span class="co" style="color: #5E5E5E;"># Append it to our list</span></span>
<span id="cb1-18">        outlines.append(text)</span>
<span id="cb1-19"></span>
<span id="cb1-20">    <span class="cf" style="color: #003B4F;">return</span> outlines</span></code></pre></div>
<p>Bard’s code:</p>
<div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="kw" style="color: #003B4F;">def</span> parse_opml(filename):</span>
<span id="cb2-2">  <span class="co" style="color: #5E5E5E;">"""Parses an OPML file.</span></span>
<span id="cb2-3"></span>
<span id="cb2-4"><span class="co" style="color: #5E5E5E;">  Args:</span></span>
<span id="cb2-5"><span class="co" style="color: #5E5E5E;">    filename: The path to the OPML file.</span></span>
<span id="cb2-6"></span>
<span id="cb2-7"><span class="co" style="color: #5E5E5E;">  Returns:</span></span>
<span id="cb2-8"><span class="co" style="color: #5E5E5E;">    A list of dictionaries, where each dictionary represents an outline item.</span></span>
<span id="cb2-9"><span class="co" style="color: #5E5E5E;">  """</span></span>
<span id="cb2-10"></span>
<span id="cb2-11">  <span class="cf" style="color: #003B4F;">with</span> <span class="bu" style="color: null;">open</span>(filename, <span class="st" style="color: #20794D;">'r'</span>) <span class="im" style="color: #00769E;">as</span> f:</span>
<span id="cb2-12">    xml <span class="op" style="color: #5E5E5E;">=</span> f.read()</span>
<span id="cb2-13"></span>
<span id="cb2-14">  <span class="co" style="color: #5E5E5E;"># Parse the XML into a tree.</span></span>
<span id="cb2-15">  tree <span class="op" style="color: #5E5E5E;">=</span> ET.fromstring(xml)</span>
<span id="cb2-16"></span>
<span id="cb2-17">  <span class="co" style="color: #5E5E5E;"># Get the outline items.</span></span>
<span id="cb2-18">  outline_items <span class="op" style="color: #5E5E5E;">=</span> []</span>
<span id="cb2-19">  <span class="cf" style="color: #003B4F;">for</span> outline_item <span class="kw" style="color: #003B4F;">in</span> tree.findall(<span class="st" style="color: #20794D;">'outline'</span>):</span>
<span id="cb2-20">    outline_item_dict <span class="op" style="color: #5E5E5E;">=</span> {}</span>
<span id="cb2-21">    outline_item_dict[<span class="st" style="color: #20794D;">'title'</span>] <span class="op" style="color: #5E5E5E;">=</span> outline_item.find(<span class="st" style="color: #20794D;">'title'</span>).text</span>
<span id="cb2-22">    outline_item_dict[<span class="st" style="color: #20794D;">'url'</span>] <span class="op" style="color: #5E5E5E;">=</span> outline_item.find(<span class="st" style="color: #20794D;">'xmlUrl'</span>).text</span>
<span id="cb2-23">    outline_items.append(outline_item_dict)</span>
<span id="cb2-24"></span>
<span id="cb2-25">  <span class="cf" style="color: #003B4F;">return</span> outline_items</span></code></pre></div>
<p>OK, this is not the biggest thing, but <strong>why on earth does Bard use indentation with 2 spaces instead of the standard 4?</strong> This drove me up the wall, so I tried all sorts of prompts to get Bard to use indentation with 4 spaces but they all failed. There must be some sort of post-processing thing going on, but that’s strange because <a href="https://google.github.io/styleguide/pyguide.html">Google’s official style guide</a> says to use 4 spaces.</p>
<p>Moving on.</p>
<p>Frankly, both of these code snippets are pretty bad. ChatGPT’s code only extracts the <code>text</code> field of each entry in the OPML file, but there’s typically other important stuff like URLs.</p>
<p>Bard’s code looks better at first glance because it does try to extract multiple fields (<code>title</code> and <code>xmlUrl</code>) from each entry. But it fails to run because it uses the <code>ElementTree</code> class without importing it first. Once that’s fixed, it runs but returns an empty list because it fails to understand that the <code>findall</code> method only searches direct children of the current node, but the individual <code>outline</code> elements are nested two levels deep.</p>
<p>It’s no surprise that the code isn’t perfect on the first pass; <strong>what matters is how quick and easy it is to iterate to a good version.</strong> For ChatGPT, I extended the conversation to say</p>
<blockquote class="blockquote">
<p>Please extract all fields from each <code>outline</code> element of the input file into a Python <code>dict</code>.</p>
</blockquote>
<p>and it updated the code to an elegant, correct answer.</p>
<p>For Bard, I replied</p>
<blockquote class="blockquote">
<p>Please update the code to parse <code>outline</code> elements in the body of the input document.</p>
</blockquote>
<p>and it did fix the known problem. But the new code still doesn’t work because it fails to recognize that for OPML <code>outline</code> elements, the data is stored as tag attributes, not encapsulated text. Sigh. 😞</p>
<p><strong>Winner: ChatGPT</strong></p>
</section>
<section id="social-media-marketing-tactics" class="level2">
<h2 class="anchored" data-anchor-id="social-media-marketing-tactics">3. Social media marketing tactics</h2>
<p>As a bootstrapped, solo project, Apricot has relied so far on social media and content marketing. It’s about time to make a <a href="https://news.ycombinator.com/show">Show Hacker News</a> post, which—done well—can generate a big spike in traffic and sign-ups. Let’s ask our AI assistants to how to make the post successful.</p>
<p>Bard first this time:</p>
<p><img src="https://blog.theapricot.io/posts/chatgpt-vs-bard/bard_showhn.png" class="img-fluid"></p>
<p>And now ChatGPT, with the same prompt:</p>
<p><img src="https://blog.theapricot.io/posts/chatgpt-vs-bard/chatgpt_showhn.png" class="img-fluid"></p>
<p>Unlike the code challenge, this time both answers feel pretty good! 🥳</p>
<p>Both LLMs include tips about both content and logistics, as requested, both seem to understand the Hacker News culture, and both give good, “correct” advice. My only complaint is that both are very generic. Compare to <a href="https://www.indiehackers.com/post/how-to-hack-hacker-news-and-consistently-hit-the-front-page-56b4a04e12">this post</a> on Indie Hackers, which gives a very specific recipe for posting successfully on Hacker News<sup>2</sup>.</p>
<p><strong>Winner: tie</strong></p>
</section>
<section id="write-a-customized-tweet" class="level2">
<h2 class="anchored" data-anchor-id="write-a-customized-tweet">4. Write a customized Tweet</h2>
<p>Continuing in the same vein, I often use ChatGPT to write first drafts of Apricot marketing content. The difference with this challenge is that the content needs to be about Apricot specifically or even a particular blog post topic. This time I’ll use a bit of prompt engineering to get the tone I want.</p>
<p>Let’s do Bard first again:</p>
<p><img src="https://blog.theapricot.io/posts/chatgpt-vs-bard/bard_tweet_v1.png" class="img-fluid"></p>
<p>Yikes! I didn’t think this would be a particularly sensitive request. Let’s click that <em>Regenerate drafts</em> button a few times…</p>
<p><img src="https://blog.theapricot.io/posts/chatgpt-vs-bard/bard_tweet_v2.png" class="img-fluid"></p>
<p>And now ChatGPT:</p>
<p><img src="https://blog.theapricot.io/posts/chatgpt-vs-bard/chatgpt_tweet.png" class="img-fluid"></p>
<p>Looks great, but it doesn’t fit within the character limit! I had to remove the hashtags to make it fit.</p>
<p><strong>Winner: tie</strong></p>
<p>I like ChatGPT’s emojis and hashtags but Bard’s text-only version is a fair response to my guidance of a “direct, no-spam” brand. Bard refused to answer at all at first, but ChatGPT’s response was too long. Both tweets are live, so you can vote yourself. 😀</p>
<p><a href="https://twitter.com/ReadTheApricot/status/1657455819741450240">Bard tweet</a></p>
<p><a href="https://twitter.com/ReadTheApricot/status/1657456242766274565">ChatGPT tweet</a></p>
</section>
</section>
<section id="and-the-overall-winner-is." class="level1">
<h1>And the overall winner is….</h1>
<p>ChatGPT.</p>
<p>ChatGPT beat Bard pretty convincingly in summarization and Python coding. That’s worth $20/month to me, at least for now, despite the fact that they tied in Tweet and marketing tactics generation.</p>
<p>I’m happy there’s competition and I suspect Bard will improve quickly—I look forward to re-doing this test again soon!</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>The text of the article goes in the <code>{text}</code> slot, of course.↩︎</p></li>
<li id="fn2"><p>In short, use a tool (like Apricot!) to find news articles in your area of expertise as soon as they’re published and post them quickly.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>Artificial Intelligence</category>
  <guid>https://blog.theapricot.io/posts/chatgpt-vs-bard/index.html</guid>
  <pubDate>Sat, 13 May 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/chatgpt-vs-bard/ai_chess_match.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>How to install the Apricot app on iOS</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/install-on-ios/index.html</link>
  <description><![CDATA[ 




<div class="quarto-video"><iframe src="https://www.youtube.com/embed/bLkjsmF1A7c" width="380" height="600”" title="How to install Apricot on Android" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<p><a href="https://app.theapricot.io">Apricot</a> is a web app, built to run in a browser like Safari. The big advantage of this is that Apricot can run on any device and browser, with a single code base. The downside, though, is that you have to <em>remember</em> to open Apricot.</p>
<p>Guess what? Apricot can <em>also</em> be installed to your iPhone’s home screen, just like a native app. Now you don’t need to remember about Apricot; when it’s time to find a TV show to watch or a podcast to listen to, or just to check the news in the morning over coffee…Apricot is right there on your home screen.</p>
<section id="how-to-install-apricot" class="level1">
<h1>How to install Apricot</h1>
<p>Here are the steps to install Apricot on iOS with Safari. Check out the video above for a visual demo of me going through the steps on my own phone.</p>
<ol type="1">
<li><p>Open Safari</p></li>
<li><p>Navigate to the Apricot app, either <a href="https://app.theapricot.io">directly</a> or via the <a href="https://theapricot.io">landing page</a>. No need to login (although it’s ok if you do).</p></li>
<li><p>Press the <em>share</em> button in the middle of the Safari control bar at the bottom of the screen. It looks like this:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/install-on-ios/ios_share_FILL0_wght400_GRAD0_opsz48.svg" class="img-fluid figure-img"></p>
</figure>
</div></li>
<li><p>Scroll down until you see the item that says <em>Add to home screen</em></p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/install-on-ios/add_to_home_screen.jpg" class="img-fluid figure-img" width="400"></p>
</figure>
</div></li>
<li><p>Press <em>Add</em> in the top right. And voilà, there’s the icon for the Apricot app, on our home screen.</p></li>
</ol>
</section>
<section id="some-caveats-im-afraid" class="level1">
<h1>Some caveats, I’m afraid</h1>
<ul>
<li><p>You’ll have to log in again in the app version of Apricot, even if you’re already logged in in the Safari version.</p></li>
<li><p>You’ll have to use a Google account to log in to the app version of Apricot; the email address option doesn’t work. I know it’s annoying, but I think it’s an inherent limitation of iOS and I don’t see any way around it.</p></li>
</ul>
</section>
<section id="feedback-welcome" class="level1">
<h1>Feedback welcome</h1>
<p>Everybody’s set up is a little different, so don’t be afraid to reach out and let me know how it goes for you.</p>
<p>Send feedback to <a href="mailto:support@theapricot.io">support@theapricot.io</a> or fill out <a href="https://docs.google.com/forms/u/1/d/e/1FAIpQLScw4hVizNdB11cClfBoAkEFGLIUjQaHcn6dzcKQ-S81-NXOxg/viewform?usp=sf_link">the feedback form</a>.</p>


</section>

 ]]></description>
  <category>User Guide</category>
  <guid>https://blog.theapricot.io/posts/install-on-ios/index.html</guid>
  <pubDate>Wed, 10 May 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/install-on-ios/ios_logos.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>How to install the Apricot app on Android</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/install-on-android/index.html</link>
  <description><![CDATA[ 




<div class="quarto-video"><iframe src="https://www.youtube.com/embed/rmwzQVWF7xc" width="320" height="600”" title="How to install Apricot on Android" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<p><a href="https://app.theapricot.io">Apricot</a> is a web app, built to run in a browser like Chrome or Firefox. The big advantage of this is that Apricot can run on any device and browser, with a single code base. The downside, though, is that you have to <em>remember</em> to open Apricot.</p>
<p>Guess what? Apricot can <em>also</em> be installed to your Android phone’s home screen, just like a native app. Now you don’t need to remember about Apricot; when it’s time to find a TV show to watch or a podcast to listen to, or just to check the news in the morning over coffee…Apricot is right there on your home screen.</p>
<section id="how-to-install-apricot" class="level1">
<h1>How to install Apricot</h1>
<p>Here are the steps to install Apricot on Android with Chrome. Check out the video above for a visual demo of me going through the steps on my own phone.</p>
<ol type="1">
<li><p>Open Chrome</p></li>
<li><p>Navigate to Apricot, either <a href="https://app.theapricot.io">directly</a> or via the <a href="https://theapricot.io">landing page</a>.</p></li>
<li><p>Click Chrome’s triple dot icon in the top right (I called this the “settings” menu in the video, which isn’t quite right, but I don’t know what else to call it).</p></li>
<li><p>About three quarters of the way down you’ll see an option to <em>Install App</em>. Press that.</p></li>
<li><p>In the window that pops up press <em>Install</em> to confirm your choice.</p></li>
<li><p>Wait a few seconds until the system confirms installation is complete.</p></li>
<li><p>Close the browser. The Apricot icon will appear on the home screen. Move it to wherever you like, just like any other app. Press to open Apricot. Voilà!</p></li>
</ol>
</section>
<section id="a-couple-notes" class="level1">
<h1>A couple notes</h1>
<ul>
<li><p>You don’t need to be logged in to install Apricot to the home screen.</p></li>
<li><p>Sometimes a pop-up will appear when you first open Apricot in Chrome that asks if you want to install it. This is in fact the easiest way to do it, but sometimes it doesn’t appear. If it doesn’t, that’s ok, just follow the video or instructions above.</p></li>
<li><p>Every browser is different; let me know how installation goes for you, especially if you have trouble. Send feedback to <a href="mailto:support@theapricot.io">support@theapricot.io</a> or fill out <a href="https://docs.google.com/forms/u/1/d/e/1FAIpQLScw4hVizNdB11cClfBoAkEFGLIUjQaHcn6dzcKQ-S81-NXOxg/viewform?usp=sf_link">the feedback form</a>.</p></li>
</ul>


</section>

 ]]></description>
  <category>User Guide</category>
  <guid>https://blog.theapricot.io/posts/install-on-android/index.html</guid>
  <pubDate>Tue, 09 May 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/install-on-android/home_screen.png" medium="image" type="image/png" height="103" width="144"/>
</item>
<item>
  <title>Power browsing: how to hide images in Apricot</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/how-to-disable-images/index.html</link>
  <description><![CDATA[ 




<div class="quarto-video"><iframe src="https://www.youtube.com/embed/8cvAda3HNHw" width="320" height="600”" title="Power Browsing: How to Hide Images in Apricot" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<section id="how-to-enable-and-disable-images" class="level1">
<h1>How to enable and disable images</h1>
<p>Most content platforms—even podcasts—include an image with each item. I recently enabled <a href="https://app.theapricot.io">Apricot</a> to show these images in feeds because they often add a lot of information about individual items.</p>
<p>Many Reddit posts, for example, are just like “What is this bug?” with an attached photo. Without the image, you have to click and wait for the Reddit page (or app) to load, which takes several seconds. With the image in Apricot, you can decide instantly whether it’s worth your time to click and contribute to the thread.</p>
<p>The problem is that images take up a lot of screen real estate, especially on a phone, which makes it hard to scroll through many items quickly. If you have lots of feeds or feeds with many items, (e.g.&nbsp;HackerNews), it can feel like images just get in the way.</p>
<p>Fortunately, Apricot enables both browsing “modes”. Turn images on or off:</p>
<ul>
<li><p>Go to the settings page (click the <i class="bi bi-gear"></i> icon in the nav tray)</p></li>
<li><p>Look for the <em>App Settings</em> section at the top of the page.</p></li>
<li><p>Check or un-check the box next to the “Show images” line.</p></li>
</ul>
<p>That’s it! Happy browsing!</p>


</section>

 ]]></description>
  <category>User Guide</category>
  <guid>https://blog.theapricot.io/posts/how-to-disable-images/index.html</guid>
  <pubDate>Mon, 08 May 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/how-to-disable-images/app_screenshot_small.png" medium="image" type="image/png" height="267" width="144"/>
</item>
<item>
  <title>Goldilocks and the three ways to browse Apricot</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/goldilocks-browsing/index.html</link>
  <description><![CDATA[ 




<p>Once you’ve signed up for Apricot and added some feeds, how to get the most value from the app? There are three common use cases when browsing for content; we’ve built a browsing mode to serve each one.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0;">
<iframe src="https://www.loom.com/embed/c6910319459b4581b62e01e483354b03" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;">
</iframe>
</div>
<section id="use-case-1-stay-in-the-loop" class="level1">
<h1>Use case 1: stay in the loop</h1>
<p>The simplest and most common use case for Apricot is to scan what’s new across all your feeds, what I’ve called “staying in the loop” in a previous post. The goal is simply to see all items from all feeds, in one interleaved list.</p>
<p>This is the foundational purpose of Apricot so it gets a whole page to itself: click the <i class="bi-newspaper"></i> icon in the nav bar. This is Apricot’s home page, in fact, so usually you’ll already be on this page when you open the app.</p>
</section>
<section id="use-case-2-binge-mode" class="level1">
<h1>Use case 2: binge mode</h1>
<p>Sometimes we want to know what the latest content is from one specific feed.</p>
<p>For me, this usually happens when I discover a new Substack newsletter or Spotify podcast and I want to binge that content without distractions from other feeds. It’s also really useful for educational feeds, even if you’re not bingeing. When it’s time for me to study Spanish, for example, I want to know if there are any new videos from the <a href="https://www.youtube.com/channel/UCAL4AMMMXKxHDu3FqZV6CbQ">Easy Spanish YouTube channel</a>.</p>
<p>For this use case, click the <i class="bi-folder2-open"></i> icon in the nav bar to see the list of your feeds, then click the name of the feed you want to browse.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/goldilocks-browsing/feeds_list.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">My list of feeds. Click “Easy Spanish” to see items from only that feed.</figcaption><p></p>
</figure>
</div>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/goldilocks-browsing/single_feed.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">After clicking on my Easy Spanish feed, I see all the videos from that YouTube channel, and nothing else.</figcaption><p></p>
</figure>
</div>
</section>
<section id="use-case-3-contextual-browsing" class="level1">
<h1>Use case 3: contextual browsing</h1>
<p>At certain times of the day, I want to find good content on a particular <em>type</em> of platform, but not limited to a specific feed.</p>
<p>When driving, for example, I want to listen to a Spotify podcast. After dinner, I want to watch a TV show. Sunday morning, I like to read long-form Substack newsletters over coffee.</p>
<p>To browse content from a specific platform, go to the feeds list again (<i class="bi-folder2-open"></i>), then click any platform. You’ll items from feeds from that platform, but nothing else.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/goldilocks-browsing/platform_list.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">After clicking “Spotify” in my feeds list, I get a list of episodes from all of my various Spotify podcasts, in a single list.</figcaption><p></p>
</figure>
</div>


</section>

 ]]></description>
  <category>User Guide</category>
  <guid>https://blog.theapricot.io/posts/goldilocks-browsing/index.html</guid>
  <pubDate>Tue, 02 May 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/goldilocks-browsing/feeds_list.png" medium="image" type="image/png" height="92" width="144"/>
</item>
<item>
  <title>Follow your favorite TV shows with Apricot</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/following-tv-shows/index.html</link>
  <description><![CDATA[ 




<p>Figuring out what to watch on TV has to be one of the most persistent and annoying content aggregation problems.</p>
<ul>
<li><p>Tired of flipping back and forth between Netflix, Hulu, HBO Max, Apple TV, Peacock, Disney+, PrimeTV, Paramount, etc. to figure out what’s new?</p></li>
<li><p>Can’t find anything interesting to watch?</p></li>
<li><p>Not sure when your favorite show is coming back for a new season?</p></li>
<li><p>Only want to watch episodes with certain topics or guests?</p></li>
</ul>
<p>Apricot to the rescue! Now you can follow your favorite TV shows—from any streaming platform—directly in Apricot, alongside the podcasts, newsletters, subreddits, and blogs you already follow.</p>
<p>Read on to see how it works and why you should give it a shot.</p>
<section id="how-it-works" class="level1">
<h1>How it works</h1>
<section id="sign-up-or-log-in" class="level2">
<h2 class="anchored" data-anchor-id="sign-up-or-log-in">1. Sign up or log in</h2>
<p>First things first, head over to the <a href="https://app.theapricot.io">Apricot app</a> in any web browser on your phone or laptop. If you haven’t signed up yet, it’s one click with your Google account, or just put your email address in to get a (passwordless) login link.</p>
</section>
<section id="add-a-tv-show-to-your-apricot-feeds" class="level2">
<h2 class="anchored" data-anchor-id="add-a-tv-show-to-your-apricot-feeds">2. Add a TV show to your Apricot feeds</h2>
<p>Now click the <i class="bi bi-plus-circle"></i> icon in the nav bar to head to the Add Feed page. In the input text field at the top, type the name of a show you want to follow. Unlike the other platforms, no need to copy and paste a URL—just type the name of the show.</p>
<p>For this demo, let’s add Ted Lasso.</p>
<p><img src="https://blog.theapricot.io/posts/following-tv-shows/add_tv_show.png" class="img-fluid"></p>
<p>Click submit and Apricot will redirect to your feeds list; you should see Ted Lasso in the list. Yep, there it is! 😎</p>
<p><img src="https://blog.theapricot.io/posts/following-tv-shows/feed_list.png" class="img-fluid"></p>
</section>
<section id="check-apricot-for-new-episodes-or-to-choose-what-to-watch" class="level2">
<h2 class="anchored" data-anchor-id="check-apricot-for-new-episodes-or-to-choose-what-to-watch">3. Check Apricot for new episodes or to choose what to watch</h2>
<p>There are a few ways to browse TV show episodes on Apricot, depending on what you’re trying to do.</p>
<h3 class="anchored">
I’m really into Ted Lasso, just show me the list of Ted Lasso episodes.
</h3>
<p>Click any feed in the feeds list to see only items from that feed. In this case, clicking Ted Lasso will show all Ted Lasso episodes and only Ted Lasso episodes.</p>
<h3 class="anchored">
I’m sitting in front of the TV after dinner and I don’t know what to watch. Help me find something.
</h3>
<p>Click the word “Television” in the feeds list and Apricot will show episodes from all the TV shows you follow, in one combined feed. No need to switch back and forth between different TV apps to see what’s new. 🥳</p>
<p>Look at that—Ted Lasso has a new episode from yesterday!</p>
<p><img src="https://blog.theapricot.io/posts/following-tv-shows/episode_list.png" class="img-fluid"></p>
<h3 class="anchored">
I’m not sure when the next season of my favorite show is back on the air.
</h3>
<p>Go to the items page (the <i class="bi bi-newspaper"></i> icon in the nav bar) to see items from all of your feeds. Episodes from your TV shows will be mixed in with everything else: podcast episodes, subreddit posts, newsletter and blog posts, and YouTube videos. This feed updates every hour, so you’ll see right away as soon as one of your shows posts a new episode.</p>
<p>Look, there’s Ted Lasso in the list!</p>
<p><img src="https://blog.theapricot.io/posts/following-tv-shows/all_items.png" class="img-fluid"></p>
</section>
<section id="click-an-episode-to-see-details" class="level2">
<h2 class="anchored" data-anchor-id="click-an-episode-to-see-details">4. Click an episode to see details</h2>
<p>Unlike other platforms on Apricot, there isn’t a <em>ton</em> of extra value in clicking the individual episode links—Apricot doesn’t (yet) deep link into streaming TV apps.</p>
<p>What it does do is open the episode page on <a href="https://www.tvmaze.com/">TVmaze</a>, which gives more details about the episode, like guest cast and a crowd-sourced rating.</p>
<p>Let’s click that Ted Lasso episode that we’re so obsessed with:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://www.tvmaze.com/episodes/2490072/ted-lasso-3x07-the-strings-that-bind-us"><img src="https://blog.theapricot.io/posts/following-tv-shows/tvmaze_page.png" class="img-fluid figure-img"></a></p>
</figure>
</div>
<p>Why TVmaze? Because they provide the underlying API that Apricot uses to get updates about show episodes. Credit and kudos to them!</p>
</section>
</section>
<section id="how-it-doesnt-work" class="level1">
<h1>How it <em>doesn’t</em> work</h1>
<p>Following TV shows on Apricot doesn’t make sense for <em>all</em> use cases.</p>
<p>In general, Apricot’s goal is to help you stay in the loop with new content as it’s published. So it doesn’t really make sense to follow old TV shows on Apricot. You <em>can</em>, but it’s not going to be worth much.</p>
<p>Apricot also doesn’t help to alert you about episodes <em>before</em> they air, so it’s not great for network TV shows unless there’s an accompanying streaming version you can watch later (e.g.&nbsp;The Late Show with Stephen Colbert is also available streaming online).</p>
<p>And it’s of limited usefulness with shows on Netflix, which tends to dump whole seasons at once. Apricot will help you to know when the season drops, but that’s about it.</p>
</section>
<section id="let-me-know-what-you-think" class="level1">
<h1>Let me know what you think!</h1>
<p>I’m really excited about this feature, even though it has absolutely nothing to with AI. Let me know how it goes for you and what other features you’d like to see in Apricot. 🙌</p>
<p>-Brian</p>


</section>

 ]]></description>
  <category>New Feature</category>
  <category>User Guide</category>
  <guid>https://blog.theapricot.io/posts/following-tv-shows/index.html</guid>
  <pubDate>Thu, 27 Apr 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/following-tv-shows/tv_wall_small.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Launched: AI-powered summarization for RSS and Reddit</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/extending-summarization/index.html</link>
  <description><![CDATA[ 




<p><a href="https://app.theapricot.io/">Apricot</a>’s <a href="https://chat.openai.com/chat">ChatGPT</a>-powered <a href="https://blog.theapricot.io/posts/introducing-summarization/">summarization for Substack</a> newsletters has revolutionized content discovery. Apricot’s article summaries let users see past clickbait headlines so they can make better decisions about what content to spend time on. Following the success of Substack summarization, I’m thrilled to announce that AI-powered summaries are now enabled for all RSS and subreddit feeds on Apricot!</p>
<section id="how-to-generate-summaries" class="level1">
<h1>How to generate summaries</h1>
<p>Any item in Apricot that has the &nbsp;<i class="bi bi-card-text"></i>&nbsp; icon in the top right can be summarized. Click or press the icon to generate the summary. Click it again to make the summary go away. It’s easier to just show you—check out this quick video.</p>
<div style="position: relative; padding-bottom: 100%; height: 0;">
<iframe src="https://www.loom.com/embed/c7a5803c5d6a4047b78d901b64085c03" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;">
</iframe>
</div>
</section>
<section id="why-bother-some-examples" class="level1">
<h1>Why bother? Some examples</h1>
<p>Let’s look at a couple examples to get a sense for how Apricot’s summarization works and how it helps. First, an example from the <a href="https://news.ycombinator.com/">Hacker News</a> front page.<sup>1</sup></p>
<p><img src="https://blog.theapricot.io/posts/extending-summarization/hacker_news_summary.png" class="img-fluid"></p>
<p>The first item in this screenshot is <em>Nearly all apps of generative AI are a net negative for society</em>. This is a “hot-take” title whose goal is to persuade you to click by arousing strong emotion without revealing the true take-home message.<sup>2</sup></p>
<p>Apricot’s summary shows the author’s true fear is “fake content”, which is a much narrower concern than what the title suggests. Don’t know about you, but I’m not gonna bother clicking that one.</p>
<p>The second item in this screenshot does <em>not</em> have the &nbsp;<i class="bi bi-card-text"></i>&nbsp; icon, which means Apricot can’t generate a summary. This happens when an item simply doesn’t have enough content, which is common with link- or image-only posts on Reddit.</p>
<p>Here’s another screenshot from a Reddit feed, namely <a href="reddit-movies">r/movies</a>.</p>
<p><img src="https://blog.theapricot.io/posts/extending-summarization/reddt_summary.png" class="img-fluid"></p>
<p>The second item—<em>Girl With the Dragon Tattoo, did you notice….</em>—is pure clickbait. Apricot’s summary tells us what the content is really about: the user discovered a hidden scream in the movie. I’m actually intrigued by that—<em>more</em> than I am by the author’s own title—so I’ll click and learn more.</p>
</section>
<section id="limitations" class="level1">
<h1>Limitations</h1>
<p>Summarization is super powerful but there are <del>some</del> <em>many</em> caveats.</p>
<section id="all-about-the-content" class="level2">
<h2 class="anchored" data-anchor-id="all-about-the-content">All about the content</h2>
<p>As I mentioned above, many RSS and subreddit items don’t have enough content to justify summarization. Apricot does not crawl underlying links or comments, so often there’s just nothing.</p>
</section>
<section id="balancing-values" class="level2">
<h2 class="anchored" data-anchor-id="balancing-values">Balancing values</h2>
<p>Summarization creates tension between two of our core values. On one hand, we want to see through clickbait, but on the other hand, a perfect summary would mean you never read original content, which is bad for multiple reasons. Apricot’s compromise is to limit summaries to one sentence. The summary gives the reader an accurate gist, but they still need to open the original content for details.</p>
</section>
<section id="spotify-and-youtube-are-coming" class="level2">
<h2 class="anchored" data-anchor-id="spotify-and-youtube-are-coming">Spotify and YouTube are coming</h2>
<p>We have not yet enabled summarization for Spotify podcasts or YouTube videos. We’re working on summarizing transcripts of the audio from these sources.</p>
</section>
<section id="chatgpts-not-perfect" class="level2">
<h2 class="anchored" data-anchor-id="chatgpts-not-perfect">ChatGPT’s not perfect</h2>
<p>Lastly and probably most importantly, Apricot’s summaries are auto-generated by ChatGPT, which is a probabilistic tool prone to errors and hallucinations. <strong>Please do not rely on Apricot summaries for high-stakes tasks.</strong> When in doubt, just click through to the original source.</p>
</section>
</section>
<section id="testing-in-prod" class="level1">
<h1>Testing in prod</h1>
<p>RSS feeds are total chaos compared to the predictable schema and formatting of Substack newsletters. In my internal testing, I’ve been happy with Apricot and ChatGPT’s ability to handle all sorts of inputs, but I can’t possibly cover all corner cases myself. So, please don’t hesitate to <a href="https://docs.google.com/forms/d/e/1FAIpQLScw4hVizNdB11cClfBoAkEFGLIUjQaHcn6dzcKQ-S81-NXOxg/viewform?usp=sf_link">send feedback</a> if you see anything that looks buggy. I’m particularly interested in the quality of Apricot’s summaries, especially for non-English content.</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>To add this feed to Apricot, use this link: <a href="https://hnrss.org/frontpage">https://hnrss.org/frontpage</a>↩︎</p></li>
<li id="fn2"><p>Is there a proper taxonomy of the types of clickbait?↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>New Feature</category>
  <category>Artificial Intelligence</category>
  <guid>https://blog.theapricot.io/posts/extending-summarization/index.html</guid>
  <pubDate>Mon, 24 Apr 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/extending-summarization/apricot_jam_jar.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>How to switch from Feedly to Apricot</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/feedly-to-apricot/index.html</link>
  <description><![CDATA[ 




<p>Feedly is one of the most popular RSS readers but its recent focus seems to have shifted toward enterprise customers. Features like “Market Intel”, “Threat Intel”, and “Consumer Insights” get top billing while the user experience has become cluttered and confusing, centered around a dashboard that feels like tedious work.</p>
<p>Apricot’s mission is different. Our goal is to help everyday users stay in the loop in a more enjoyable, stress-free way. Apricot combines the content richness of an RSS reader with the engaging feel of a social media feed, while using AI-powered tools to help you see through clickbait headlines and prioritize the most relevant items.</p>
<p>Ready to make the switch? Follow along to export your feeds in bulk from Feedly and import them to Apricot.</p>
<section id="export-your-feeds-from-feedly" class="level1">
<h1>Export your feeds from Feedly</h1>
<ol type="1">
<li><p>Open Feedly in a web browser and log in.</p></li>
<li><p>Go to the “Organize Feeds” page. Click the gear icon to the right of your feed list.</p>
<p><img src="https://blog.theapricot.io/posts/feedly-to-apricot/feedly_feed_list_annotated.png" class="img-fluid"></p></li>
<li><p>Go to the “Export OPML” page. This one is a bit hidden. Click the arrow icon on the top right of the page, <em>next</em> to the “Import OPML” button.</p>
<p><img src="https://blog.theapricot.io/posts/feedly-to-apricot/feedly_organize_feeds_annotated.png" class="img-fluid"></p></li>
<li><p>Click the big green DOWNLOAD YOUR FEEDLY OPML button and save the output file.</p>
<p><img src="https://blog.theapricot.io/posts/feedly-to-apricot/feedly_OPML_export.png" class="img-fluid"></p></li>
</ol>
</section>
<section id="import-your-feeds-into-apricot" class="level1">
<h1>Import your feeds into Apricot</h1>
<ol type="1">
<li><p>Open Apricot, at <a href="https://app.theapricot.io">https://app.theapricot.io</a>.</p></li>
<li><p>Log in or sign up using either a Google account or your email. No password needed.</p></li>
<li><p>Click the <i class="bi-gear"></i> Settings icon in the nav bar to go to the settings page.</p>
<p><img src="https://blog.theapricot.io/posts/feedly-to-apricot/apricot_items_page_annotated.png" class="img-fluid"></p></li>
<li><p>Click the button under “Import feeds from OPML file” and select the file you exported from Feedly.</p>
<p><img src="https://blog.theapricot.io/posts/feedly-to-apricot/import_feeds_screenshot.png" class="img-fluid"></p></li>
<li><p>Apricot will start working as soon as you select the file. It takes a few moments to fetch and validate each feed, so be patient. When Apricot is done you’ll see a pop-up window that lists any issues we found during the import.</p></li>
</ol>
</section>
<section id="wrapping-up" class="level1">
<h1>Wrapping up</h1>
<p>Once your feeds are imported, Apricot redirects to the <i class="bi-folder2-open"></i> Feeds page, just to confirm your feeds were imported successfully. From there, click on any individual feed to browse, or click the <i class="bi-newspaper"></i> Items page to see items from all of your feeds interleaved in one place.</p>
<p>OPML import is a new feature for Apricot, so don’t hesitate to <a href="https://docs.google.com/forms/d/e/1FAIpQLScw4hVizNdB11cClfBoAkEFGLIUjQaHcn6dzcKQ-S81-NXOxg/viewform">send feedback</a> if you run into trouble or have suggestions.</p>
<p>Thanks for trying Apricot!</p>


</section>

 ]]></description>
  <category>User Guide</category>
  <category>RSS</category>
  <guid>https://blog.theapricot.io/posts/feedly-to-apricot/index.html</guid>
  <pubDate>Sat, 15 Apr 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/feedly-to-apricot/import_feeds_screenshot.png" medium="image" type="image/png" height="42" width="144"/>
</item>
<item>
  <title>Staying in the loop: a voyage of discovery</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/staying-in-the-loop/index.html</link>
  <description><![CDATA[ 




<p>What is it about social media that makes it so hard to quit?</p>
<p>With all of the problems social media has with mental health, clickbait, toxicity, extremism, privacy, etc., it seems like we should have abandoned it a long time ago. But we haven’t. Why not?</p>
<p>My theory is that social media is indispensable because it has become the way that we <strong>stay in the loop</strong>.</p>
<section id="staying-in-the-loop" class="level1">
<h1>Staying in the loop</h1>
<p>It’s one of those things that’s easy to spot but tough to define. ChatGPT defines <em>staying in the loop</em> as:</p>
<blockquote class="blockquote">
<p>to remain informed or up-to-date about current events, developments, or ongoing conversations, typically in a specific field or context. It often implies actively following news, updates, or discussions to maintain awareness and not be [<em>sic</em>] left out of important information or decisions.</p>
</blockquote>
<p>It’s tempting to equate it with geopolitical current events, but that’s not what I think most people are really interested in. For most of us, it’s more about things like:</p>
<ul>
<li><p>seeing the latest photos of the grand-kids,</p></li>
<li><p>reading/watching/listening to trusted commentators <em>digest</em> news and trends,</p></li>
<li><p>discovering hot new shows to watch on TV,</p></li>
<li><p>keeping a finger on the pulse of trends in our profession, and</p></li>
<li><p>seeing job posts, real estate listings, or for-sale ads as soon as they’re published.</p></li>
</ul>
<p>Why do we feel such <del>FOMO</del> a strong desire to stay in the loop? That’s above my pay grade, but I suspect it mostly comes down to two reasons: participating in a shared social context and quickly identifying risks and opportunities.</p>
</section>
<section id="whats-not-in-the-loop" class="level1">
<h1>What’s not in the loop</h1>
<p>Because the idea of staying in the loop is fuzzy, it’s also helpful to delineate what’s <em>not</em> part of staying in the loop.</p>
<ul>
<li><p>Content itself</p></li>
<li><p>Search</p></li>
<li><p>Real-time communication</p></li>
</ul>
</section>
<section id="a-brief-history-of-staying-in-the-loop" class="level1">
<h1>A brief history of staying in the loop</h1>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/staying-in-the-loop/evolution.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">The evolution of how we stay in the loop.</figcaption><p></p>
</figure>
</div>
<p>The tried and true method to keep up-to-date with things is, of course, <strong>talking directly to other people</strong>. It’s a fundamental part of our existence.</p>
<p>Many people who grew up before the internet stay in the loop with <strong>the morning newspaper, the evening news on network TV, and maybe a radio show</strong> on the drive home from the office. Each of these outlets is a single company with one editorial team, curating the items they think will matter to their audience across a wide range of subjects.</p>
<p>With the rise of the internet, we began to seek content from a broader variety of sources. <strong>RSS readers</strong> were born to help us keep track of our favorite sources and to avoid having to click all around the web. RSS readers require extra work from the reader, though, for little benefit. They quickly fell into a niche market.</p>
<p>Instead, it was <strong>social media</strong> that took the world by storm in the late 2000s, quickly becoming the dominant way to stay in the loop for almost <em>everything</em>. No need to belabor this point—almost everybody on the planet knows how pervasive social media is.</p>
<p>Surprisingly, the humble <strong>email newsletter</strong> also made a noteworthy comeback. Now, every content platform wants us to subscribe and follow not only on social media but in our inbox as well, so they can bombard us with messages they know we can’t ignore.</p>
</section>
<section id="staying-in-the-loop-about-staying-in-the-loop" class="level1">
<h1>Staying in the loop about staying in the loop</h1>
<p>I’m not alone in realizing the value of helping users stay in the loop. Spotify recently overhauled the home page of its app to emphasize <em>discovery</em>. In a great interview on the <a href="https://open.spotify.com/episode/7ltKofbjPUkboTYWvwe8hc">Decoder podcast</a>, Spotify exec Gustav Söderström laid out the reasons for the change:</p>
<blockquote class="blockquote">
<p>When we ask users what they love…what they really say is, “The more new things you show me, the more new things I find, the more I’m going to like this product”… Discovery is kind of the lifeblood of Spotify. If you take that lens, then you should expect us to try to do everything to improve discovery.</p>
</blockquote>
<p>Substack also <a href="https://on.substack.com/p/introducing-notes">announced just this week</a> that it’s going in a similar direction, adding a product called Notes. Their rationale:</p>
<blockquote class="blockquote">
<p>…Notes is designed to drive discovery across Substack…Our goal is to foster conversations that inspire, enlighten, and entertain, while giving writers a powerful growth channel as these interactions find new audiences.</p>
</blockquote>
<p>Reddit’s <a href="https://www.redditinc.com/blog/new-features-aimed-at-making-reddit-easier-to-use-an-update-on-our-product-priorities-focused-on-simplification?x-craft-preview=N0RQ0GHlDi&amp;token=3yVz4pTIE4kPqPK1hoRVqgzStkGRFX6P">product updates</a> in March also seemed oriented toward discovery, with new feeds specifically for reading and watching videos and a more streamlined interface to make it “easier for people to find relevant content”.</p>
<p>You get the point.</p>
</section>
<section id="the-next-revolution" class="level1">
<h1>The next revolution</h1>
<p>All of these efforts face an insurmountable obstacle: they only help you to discover content on their <em>own</em> platform. A key part of staying in the loop, though, is finding the relevant stuff <em>across</em> the web. And that’s exactly where Apricot comes in.</p>
<p>Apricot’s <em>only</em> mission is to help you stay in the loop. Follow content from a variety of text, audio, and video platforms, interleaved into one personalized feed. State-of-the-art AI prioritizes the most relevant content and summarizes content to help you see through clickbait headlines. And, coming soon, a Discover page of our own, to help you find things you didn’t even know you were looking for!</p>
<p>Check it out—discover Apricot at <a href="https://app.theapricot.io">https://app.theapricot.io</a> and stay in the loop!</p>


</section>

 ]]></description>
  <guid>https://blog.theapricot.io/posts/staying-in-the-loop/index.html</guid>
  <pubDate>Fri, 07 Apr 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/staying-in-the-loop/evolution.png" medium="image" type="image/png" height="66" width="144"/>
</item>
<item>
  <title>Apricot’s game-changer: X-ray vision for clickbait</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/introducing-summarization/index.html</link>
  <description><![CDATA[ 




<p>Apricot’s mission is to help you cut through the noise and discover the most valuable content. Today, <a href="https://app.theapricot.io/">Apricot</a> is taking a big step toward that goal by enabling you to summarize articles with the click of a button using <a href="https://chat.openai.com/chat">ChatGPT</a>. It’s a small feature, but it just might revolutionize the way you browse for content!</p>
<section id="attention-is-all-you-need1" class="level1">
<h1>Attention is all you need<sup>1</sup></h1>
<p>The attention economy has even the most reputable publications resorting to clickbait headlines. Here’s a classic, from <a href="https://adamgrant.substack.com/p/if-you-do-this-your-emails-might">Adam Grant’s</a> Substack newsletter, which I’ve subscribed to in Apricot:</p>
<blockquote class="blockquote">
<p>If You Do This, Your Emails Might Be Rude</p>
</blockquote>
<p>By now, you know not to give in immediately to the curiosity—do WHAT?—but unless you click, you still don’t know if it’s worth the time or not.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/introducing-summarization/grant_clickbait.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">An Apricot feed with mysterious headlines from a few different Substack newsletters. Some are clickbait, some are just vague. How to know what’s worth opening?</figcaption><p></p>
</figure>
</div>
<p>It’s not just clickbait, though. Many writers don’t bother with descriptive titles, especially for newsletters, which the authors know are going to your high-attention email inbox.</p>
<p>The other headlines in my Apricot screenshot belong more to this category:</p>
<blockquote class="blockquote">
<p>The public imagination</p>
</blockquote>
<blockquote class="blockquote">
<p>Adam Sandler and then some</p>
</blockquote>
<blockquote class="blockquote">
<p>Scare the rich</p>
</blockquote>
<p>With Apricot, you can subscribe directly to Substack newsletters and keep them out of your inbox. But then how do you know whether to open content like this?</p>
</section>
<section id="summarize-with-apricot" class="level1">
<h1>Summarize with Apricot</h1>
<p>Check out the &nbsp;<i class="bi bi-card-text"></i>&nbsp; icon to the right of each item in the Apricot screenshot. When you click that button, Apricot shows a succinct, one-sentence summary of the article.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/introducing-summarization/grant_summarized.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">Apricot to the rescue! One-sentence summaries of Substack articles give us a much better sense of which items are worth reading in full.</figcaption><p></p>
</figure>
</div>
<p>In this example, it looks like the Adam Grant article is pretty obvious stuff—don’t write cold emails that ask a stranger to jump on a call immediately, etc. I’m gonna skip that one, thanks. The <a href="https://www.understandably.com/p/adam-sandler-and-more">Bill Murphy, Jr.&nbsp;piece</a>, on the other hand, looks interesting. I don’t care too much about Adam Sandler, but an Italian orange-throwing festival? <em>Now</em> you’ve got my attention.</p>
<p>The <em>Stuff You Should Know</em> episode does not have the &nbsp;<i class="bi bi-card-text"></i>&nbsp; icon next to it. For now, summarization is only enabled for Substack newsletters, but it should be enabled for the other platforms soon.</p>
</section>
<section id="how-it-works" class="level1">
<h1>How it works</h1>
<p><del>Magic</del> ChatGPT.</p>
<p>As of today, Apricot uses the GPT-3.5-turbo model.</p>
<p>The input to the model is the concatenation of the article title, subtitle, and full text, truncated to fit within the model’s context length constraint. The prompt simply asks ChatGPT to summarize the text in one sentence. No fancy <del>spells</del> prompt engineering at this point.</p>
</section>
<section id="whats-the-catch" class="level1">
<h1>What’s the catch?</h1>
<p><img src="https://blog.theapricot.io/posts/introducing-summarization/caveats_meme.jpg" class="img-fluid"></p>
<p>I’m super excited about this new feature, but I’ll also be the first to admit that there are lots of rough edges.</p>
<ul>
<li><p>Most importantly, ChatGPT is not perfect. With complex articles, it can lose track of the main ideas. With very short articles, it might hallucinate. So <strong>don’t rely heavily on these summaries for high-stakes applications</strong>. Seriously, I can’t stress that enough. When in doubt, just click the item and read the source.</p></li>
<li><p>Apricot does not currently have a way to get the full text of pay-walled articles. Sometimes there’s enough material in the title, subtitle, and teaser, but this is the kind of situation that can lead ChatGPT to hallucinate. To minimize this, Apricot will just decline to summarize if there’s not enough content.</p></li>
<li><p>The ChatGPT API is slow. It usually takes several seconds, so please have patience. The good news is that each item only needs to be summarized once across all Apricot users; subsequent requests are just database queries for the stored summary, so they’re much faster.</p></li>
</ul>
</section>
<section id="all-your-feedback-are-belong-to-us" class="level1">
<h1>All your feedback are belong to us!</h1>
<p>I’m confident our new ChatGPT-powered summarization feature will change the way you browse content. As always, I’d love to hear your feedback, so please don’t hesitate to <a href="https://docs.google.com/forms/d/e/1FAIpQLScw4hVizNdB11cClfBoAkEFGLIUjQaHcn6dzcKQ-S81-NXOxg/viewform?usp=sf_link">reach out</a> and share your thoughts.</p>
<p>Happy summarizing!</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>It’s a machine learning “joke”. If you don’t get it, don’t worry, it’s not that funny.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>New Feature</category>
  <category>Artificial Intelligence</category>
  <guid>https://blog.theapricot.io/posts/introducing-summarization/index.html</guid>
  <pubDate>Fri, 31 Mar 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/introducing-summarization/grant_summarized.png" medium="image" type="image/png" height="111" width="144"/>
</item>
<item>
  <title>Getting started with Apricot</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/getting-started/index.html</link>
  <description><![CDATA[ 




<p>Apricot replicates the look and feel of a social media platform as much as possible. While social media platforms have many problems, one thing they tend to do well is an elegant, joyful user interface.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0;">
<iframe src="https://www.loom.com/embed/3d73e150ddd04811905e227f731cbbef" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;">
</iframe>
</div>
<section id="sign-up" class="level1">
<h1>1. Sign up</h1>
<p><a href="https://app.theapricot.io/login">Sign up</a> for Apricot with an email address or a Google account. No password is required for the former—you’ll get an email with a magic link that confirms your address and logs you in for the first time.</p>
</section>
<section id="add-feeds" class="level1">
<h1>2. Add feeds</h1>
<p>After you sign up, Apricot will send you directly to the <a href="https://app.theapricot.io/addfeed">Add Feeds</a> <i class="bi bi-plus-circle"></i> page.</p>
<p>The first order of business is to add feeds to follow, just as you would add people to follow on a social media platform. The difference is that with Apricot, your subscriptions come from different platforms, namely Spotify, YouTube, Substack, and Reddit. You can also add RSS feeds.</p>
<p>To get started, add a few of the listed popular feeds (don’t worry, you can remove them later) by pressing the gray plus icon to the right. Later, once you’re settled in, you can come back and add other feeds by pasting their links into the top part of the page.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/getting-started/app.theapricot.io_addfeed(Pixel 5)_google-pixel5-s-mh.png" class="img-fluid figure-img" width="500"></p>
<p></p><figcaption class="figure-caption">The <em>Add Feeds</em> page. Try adding some of the popular feeds, then click the <em>Items</em> icon.</figcaption><p></p>
</figure>
</div>
<p>Got a couple of feeds added? Great, now click the <i class="bi-newspaper"></i> icon in the nav bar to browse the content from your feeds.</p>
</section>
<section id="browse" class="level1">
<h1>3. Browse</h1>
<p>Apricot’s <a href="https://app.theapricot.io/items">Items</a> <i class="bi-newspaper"></i> page is where the magic happens—think of it like your main feed on Twitter, LinkedIn, or Facebook. Apricot automatically imports items from all the feeds you’ve subscribed to and lists them here, as they come in.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/getting-started/app.theapricot.io_items(Pixel 5)_google-pixel5-sor-mh.png" class="img-fluid figure-img" width="500"></p>
<p></p><figcaption class="figure-caption">The items page.</figcaption><p></p>
</figure>
</div>
<p>There are four things you can do on the Items page.</p>
<ul>
<li><p><strong>Open an item</strong> by clicking the text of the item. In the example image above, let’s say we want to listen to the <em>Stuff You Should Know</em> podcast episode about semantic satiation. Clicking the text will open the Spotify app or website directly to that episode’s page.</p></li>
<li><p><strong>Bookmark an item</strong> by swiping right (on mobile) or clicking the bookmark icon (on desktop). Bookmarking is useful to save items permanently or temporarily, e.g.&nbsp;as a “to read” list. In the latter, case, swipe left to un-bookmark after you’ve read/listened to/watched the item.</p></li>
<li><p><strong>Go to a feed page</strong> by clicking the title of an item. A feed’s page shows only items from that feed.</p></li>
<li><p><strong>Scroll down</strong> to see more items.</p></li>
</ul>
<section id="chronological-vs-algorithmic-sort" class="level2">
<h2 class="anchored" data-anchor-id="chronological-vs-algorithmic-sort">Chronological vs algorithmic sort</h2>
<p>By default, Apricot sorts items chronologically. This works well to start but can be frustrating if your feeds have different frequencies. Imagine, for example, you follow the <a href="https://www.youtube.com/@PracticalEngineeringChannel">Practical Engineering</a> YouTube channel, which publishes a new video once every couple of weeks, and the <a href="https://news.ycombinator.com/">Hacker News</a> front page, which has new content every few minutes. In a chronological sort, it’s easy to miss the low-frequency items.</p>
<p>To make sure you see high-value content, Apricot has a personalized algorithmic sort. To enable, go to the <a href="https://app.theapricot.io/settings">Settings</a> <i class="bi-gear"></i> page and check the box that says <em>Personalized sort</em>.</p>
</section>
</section>
<section id="install-apricot-on-the-home-screen" class="level1">
<h1>4. Install Apricot on the home screen</h1>
<p>Apricot runs in the browser but is designed to look and feel like a native app. Like an Android or iOS app, Apricot can be installed on your phone’s home screen.</p>
<p>Most browsers will show a pop-up when you first navigate to Apricot that asks if you want to install Apricot on your home screen. If you miss the pop-up, not to worry, there is a button in most browsers’ settings to install a web app. In Chrome on Android, for example, look for the <em>Install app</em> option in the settings menu.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/getting-started/Screenshot_20230323-122516_google-pixel5-sortasage-mh.png" class="img-fluid figure-img" width="500"></p>
<p></p><figcaption class="figure-caption">How to install Apricot from Chrome on your Android home screen.</figcaption><p></p>
</figure>
</div>
</section>
<section id="thats-it" class="level1">
<h1>That’s it!</h1>
<p>That’s all there is to it. Please give it a spin and <a href="https://docs.google.com/forms/d/e/1FAIpQLScw4hVizNdB11cClfBoAkEFGLIUjQaHcn6dzcKQ-S81-NXOxg/viewform?usp=sf_link">let us know</a> what you think. Feature requests, questions, comments—we’re happy to hear it all.</p>
<p>Happy browsing!</p>


</section>

 ]]></description>
  <category>User Guide</category>
  <guid>https://blog.theapricot.io/posts/getting-started/index.html</guid>
  <pubDate>Thu, 23 Mar 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/getting-started/cherry_blossom_small.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Welcome to Apricot</title>
  <dc:creator>Brian Kent</dc:creator>
  <link>https://blog.theapricot.io/posts/hello-world/index.html</link>
  <description><![CDATA[ 




<p>Hello world, welcome to the Apricot blog! Allow me to introduce <a href="https://app.theapricot.io">Apricot</a> and share a bit of the back story.</p>
<section id="social-media-killed-the-rss-star" class="level1">
<h1>Social media killed the RSS star</h1>
<p>For the past 15 years, I have been a data scientist, focused on machine learning and AI. Data science is a field that moves very quickly and it’s important but hard to stay up to date with things like new software, courses, conferences, papers, job postings, etc.</p>
<p>Once upon a time, I used an RSS reader to try to keep tabs on things. When <a href="https://techcrunch.com/2013/07/06/google-reader-is-gone-but-why-is-everybody-building-their-own/">Google Reader died</a>, I—and many other data scientists—came to rely on Twitter to stay in the loop professionally.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/hello-world/jeremy_howard_quarto_tweet.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">This blog is built with <a href="https://quarto.org/">Quarto</a>, which I discovered serendipitously thanks to this tweet. Discovery of “unknown unknowns” is one of the good things social media does well.</figcaption><p></p>
</figure>
</div>
<p>For a time, the social media revolution worked well. The mobile-first, scroll-based UI was much simpler than dashboard-style RSS readers. People posted links to content on all sorts of platforms, not just blogs. The platforms’ ranking algorithms introduced us to things we wouldn’t have otherwise seen. Personal commentary added color, trustworthiness, and a sense of connectedness. It was puppies and rainbows, for a time.</p>
</section>
<section id="social-media-is-bad" class="level1">
<h1>Social media is bad</h1>
<p>You know the sad end of the story; social media evolved into a toxic dumpster fire. Now, the good stuff is drowned out by clickbait, trolls, bots, and harassment. Driven by ads-based business models, social media platforms <a href="https://www.bloomberg.com/news/articles/2023-03-13/zuckerberg-was-warned-on-social-media-addiction-filing-shows">keep users addicted</a> and <a href="https://www.forbes.com/sites/kateoflahertyuk/2021/05/08/all-the-ways-facebook-tracks-you-and-how-to-stop-it">track users</a> across the web. Plus, it’s clear now that a handful of loud influencer voices does not truly represent a vibrant community.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/hello-world/https:/substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c49cc1-56e5-497c-ab69-d301a00857b8_1047x897.png" class="img-fluid figure-img"></p>
<p></p><figcaption class="figure-caption">Social media usage is strongly associated with depression. Correlation isn’t causation, but a growing consensus says the relationship is causal. From <a href="https://jonathanhaidt.substack.com/p/social-media-mental-illness-epidemic">Jonathan Haidt</a>, citing Haidt and Twenge, who used data from Kelly, et al (2019).</figcaption><p></p>
</figure>
</div>
</section>
<section id="moving-past-social-media" class="level1">
<h1>Moving past social media</h1>
<p>Apricot’s premise is that <strong>we can un-bundle social media, keep the good bits and throw out the toxic junk</strong>.</p>
<p>What’s the good stuff? Great question—glad you asked. Here’s <strong>what we should keep</strong> in the next evolution of media browsing:</p>
<ul>
<li><p>The user decides what sources make up their feed.</p></li>
<li><p>Content from all sorts of web platforms.</p></li>
<li><p>The user decides: smart ranking to see the most relevant items first, OR simple chronological order.</p></li>
<li><p>Links that open in the original content platforms.</p></li>
<li><p>A mobile-first design philosophy.</p></li>
</ul>
<p>On the flip side, <strong>let’s get rid of</strong>:</p>
<ul>
<li><p>The ads-based business model that drives user addiction, mental health problems, and privacy violations.</p></li>
<li><p>Harassment from bots, trolls, and other random internet strangers. I never want to have that sickening feeling while watching an army of trolls on the attack.</p></li>
</ul>
</section>
<section id="apricot-in-a-nutshell" class="level1">
<h1>Apricot in a nutshell</h1>
<p>Apricot lets you subscribe to content from various platforms on the web: YouTube, Substack, Reddit, Spotify (podcasts), and any RSS feed. Add your favorite sources and Apricot will import all the items from those sources as they’re published, sorting them so the best stuff is at the top. Like social media, you simply scroll to see more items. No enterprise dashboards here, browsing shouldn’t feel like work. Click items to read/list/watch on the original platform. Bookmark items to save for later. That’s it—super simple!</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://blog.theapricot.io/posts/hello-world/iphone13blue_portrait.png" class="img-fluid figure-img" width="400"></p>
<p></p><figcaption class="figure-caption">Apricot’s personalized feed for a hypothetical user.</figcaption><p></p>
</figure>
</div>
</section>
<section id="where-were-heading" class="level1">
<h1>Where we’re heading</h1>
<p>Today’s Apricot checks most of the boxes, but there’s a lot of room to grow. More content sources, better discovery of “unknown unknowns”, contextual item ranking, summarization of long-form content with state-of-the-art language models—everything’s on the table, as long as it stays true to our core principle of keeping control in the hands of the user.</p>
<p>Sign up at <a href="https://app.theapricot.io">https://app.theapricot.io</a> and check it out. Please don’t hesitate to send us feature requests and feedback—it’s early days, so your input will make a big difference!</p>


</section>

 ]]></description>
  <guid>https://blog.theapricot.io/posts/hello-world/index.html</guid>
  <pubDate>Thu, 16 Mar 2023 05:00:00 GMT</pubDate>
  <media:content url="https://blog.theapricot.io/posts/hello-world/AdobeStock_566000558_small.png" medium="image" type="image/png" height="96" width="144"/>
</item>
</channel>
</rss>
