<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: binbuilds0</title>
    <description>The latest articles on DEV Community by binbuilds0 (@binbuilds0).</description>
    <link>https://dev.to/binbuilds0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4168541%2F99faff9c-e26e-4fe7-840c-937b6471a84f.jpg</url>
      <title>DEV Community: binbuilds0</title>
      <link>https://dev.to/binbuilds0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/binbuilds0"/>
    <language>en</language>
    <item>
      <title>First-hire job posts are the best buying signal nobody tracks (with this week's data)</title>
      <dc:creator>binbuilds0</dc:creator>
      <pubDate>Fri, 09 Oct 2026 10:56:54 +0000</pubDate>
      <link>https://dev.to/binbuilds0/first-hire-job-posts-are-the-best-buying-signal-nobody-tracks-with-this-weeks-data-15jk</link>
      <guid>https://dev.to/binbuilds0/first-hire-job-posts-are-the-best-buying-signal-nobody-tracks-with-this-weeks-data-15jk</guid>
      <description>&lt;p&gt;&lt;em&gt;Updated October 9, 2026. Data pulled from &lt;a href="https://roledawn.com/weekly-list/sample" rel="noopener noreferrer"&gt;roledawn.com/weekly-list/sample&lt;/a&gt; on October 9, 2026 at 08:00 UTC.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; a company posting its &lt;em&gt;first&lt;/em&gt; role in a team (its first SDR, first account executive, first RevOps hire) is telling you it's about to set up that function from nothing, and the person it hires will be picking tools and vendors in their first weeks. The job post is public, dated, and usually explains what the new hire has to fix. That makes it a better reason to reach out than a funding announcement or a generic "growing team" signal, and you can find these posts by hand with a few search operators and the public job board APIs.&lt;/p&gt;

&lt;p&gt;Disclosure up front: the numbers below come from RoleDawn, a hiring-signals tool I built. The manual method later in the post needs nothing from me.&lt;/p&gt;

&lt;h2&gt;
  
  
  This week's numbers
&lt;/h2&gt;

&lt;p&gt;In the 7 days up to October 9, 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;115 companies&lt;/strong&gt; started hiring for a sales role (SDR/BDR, account executive or RevOps) in a role family that hadn't been seen on their careers page before.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15 of those job posts&lt;/strong&gt; explicitly call the role "founding" or "first".&lt;/li&gt;
&lt;li&gt;Of the top 20 on the list: &lt;strong&gt;7&lt;/strong&gt; were new SDR/BDR teams, &lt;strong&gt;7&lt;/strong&gt; new AE / sales teams, &lt;strong&gt;6&lt;/strong&gt; new RevOps teams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of the founding roles posted that week, each linked from the sample page to the company's own job post:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Role posted&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Replo&lt;/td&gt;
&lt;td&gt;Founding GTM&lt;/td&gt;
&lt;td&gt;San Francisco&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Luxor Technology&lt;/td&gt;
&lt;td&gt;Founding Account Executive&lt;/td&gt;
&lt;td&gt;US, San Francisco&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coperniq&lt;/td&gt;
&lt;td&gt;Founding BDR&lt;/td&gt;
&lt;td&gt;Remote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LightSource&lt;/td&gt;
&lt;td&gt;Founding BDR&lt;/td&gt;
&lt;td&gt;San Francisco&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dataleap&lt;/td&gt;
&lt;td&gt;Founding Sales (Munich Office)&lt;/td&gt;
&lt;td&gt;Munich&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Featherless AI&lt;/td&gt;
&lt;td&gt;Founding Account Executive (AI Cloud)&lt;/td&gt;
&lt;td&gt;Remote (US &amp;amp; Canada) and others&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One caveat. A "first" is only as good as how long you've watched a careers page. If a tracked board shows a new family, that's observed; if the board was added recently, it's an inference, labelled "Likely new team · inferred" on the sample page. This week, 11 of the 15 founding/first posts were inferred, with the word "founding" doing the work. You'll hit the same problem by hand, which is why step 3 below exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a first hire beats most other signals
&lt;/h2&gt;

&lt;p&gt;Think about what has to happen around a first SDR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone approved a headcount for a function that doesn't exist yet. That's a decision about where the next dollar goes.&lt;/li&gt;
&lt;li&gt;The new hire needs a CRM set up properly, a contact data source, a sequencing tool, call recording, maybe a dialer. Most of that isn't there yet, because there was no one to use it.&lt;/li&gt;
&lt;li&gt;The post itself usually says what success looks like ("build our outbound motion from zero", "own the first pipeline"). That's your opening line, written by the buyer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A funding round, by contrast, is seen by everyone on the same day and says nothing about which team gets the money. A 16th AE is backfill; the stack is already chosen.&lt;/p&gt;

&lt;p&gt;The same logic works outside sales: a first security engineer or first data engineer means tooling decisions are coming. Map "the team that buys my product" to "the first hire in that team" and you have your trigger.&lt;/p&gt;

&lt;p&gt;A job post isn't proof of budget. It's proof of intent, with a date on it. Qualify the account the way you normally would.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to find first-hire posts by hand
&lt;/h2&gt;

&lt;p&gt;This takes 20 to 30 minutes a week once you've done it once.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Pick your role family and its title variants
&lt;/h3&gt;

&lt;p&gt;Write down the 5 to 10 titles that mean "the team I sell to". For sales tooling: &lt;code&gt;SDR&lt;/code&gt;, &lt;code&gt;BDR&lt;/code&gt;, &lt;code&gt;Sales Development&lt;/code&gt;, &lt;code&gt;Business Development Representative&lt;/code&gt;, &lt;code&gt;Account Executive&lt;/code&gt;, &lt;code&gt;Founding AE&lt;/code&gt;, &lt;code&gt;GTM&lt;/code&gt;, &lt;code&gt;Revenue Operations&lt;/code&gt;. Include the "founding" and "first" variants explicitly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Search the job boards directly, not LinkedIn
&lt;/h3&gt;

&lt;p&gt;Most startups host their careers page on an applicant tracking system with public, indexable job pages. Search those domains with Google, set &lt;strong&gt;Tools → Any time → Past week&lt;/strong&gt;, and work through queries like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;site:job-boards.greenhouse.io "founding account executive"
site:boards.greenhouse.io "first sales hire"
site:jobs.lever.co "founding" ("BDR" OR "SDR")
site:jobs.ashbyhq.com "founding GTM"
site:jobs.ashbyhq.com "first" "revenue operations"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap in your own titles. Keep every hit in a sheet with: company, title, post URL, date found.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Check it's really the first one
&lt;/h3&gt;

&lt;p&gt;A title saying "founding" is a strong hint. For everything else, look at the company's whole board and see whether anyone else in that family is already listed. Greenhouse, Lever and Ashby all publish public job board APIs (&lt;a href="https://developers.greenhouse.io/job-board.html" rel="noopener noreferrer"&gt;Greenhouse&lt;/a&gt;, &lt;a href="https://github.com/lever/postings-api" rel="noopener noreferrer"&gt;Lever&lt;/a&gt;, &lt;a href="https://developers.ashbyhq.com/docs/public-job-posting-api" rel="noopener noreferrer"&gt;Ashby&lt;/a&gt;), so this is one request per company:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// node check.mjs ashby posthog   (Node 18+, no dependencies)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;board&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;greenhouse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://boards-api.greenhouse.io/v1/boards/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;board&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/jobs`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lever&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://api.lever.co/v0/postings/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;board&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?mode=json`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ashby&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://api.ashbyhq.com/posting-api/job-board/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;board&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ats&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\b(&lt;/span&gt;&lt;span class="sr"&gt;sdr|bdr|sales development|business development|account executive|revenue operations|revops|gtm&lt;/span&gt;&lt;span class="se"&gt;)\b&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; open roles, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; in sales:`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; -&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One sales role on a board of 25 is a first-hire candidate. Five sales roles means the team exists. The board token is the last part of the careers URL (&lt;code&gt;jobs.ashbyhq.com/posthog&lt;/code&gt; → &lt;code&gt;posthog&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Save the output each week. A family that was empty last week and has a role this week is your observed "first", the same thing the tracked list above calls "New on their board".&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Read the post and write one line
&lt;/h3&gt;

&lt;p&gt;Find the sentence that says what the hire has to achieve and reference it. One of the suggested openers on the October 7 sample page, based on Luxor Technology's post:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Noticed you're hiring your first sales person to build pipeline across engineering orgs drowning in pull requests and AI companies needing sandboxed compute.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's specific because the job post did the research for you. Read the post before you send anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Reach out to the right person, at the right time
&lt;/h3&gt;

&lt;p&gt;Before the hire starts, the founder or hiring manager owns the decision; after, the new hire usually does. The post date tells you how fresh the signal is: a two-month-old "founding AE" post is a different conversation from a two-day-old one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The weekly routine
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run your 5 saved searches with the past-week filter.&lt;/li&gt;
&lt;li&gt;Check each new company's board with the script.&lt;/li&gt;
&lt;li&gt;Add confirmed firsts to the sheet with the post URL and one line.&lt;/li&gt;
&lt;li&gt;Re-check last week's boards to catch families that just appeared.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. The slow part is step 4: re-checking every board, every week, once your list runs into the hundreds.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://roledawn.com" rel="noopener noreferrer"&gt;RoleDawn&lt;/a&gt; to automate this: it reads public careers pages every day and sends the companies that just started hiring the team you sell to, each linked to the original post.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>sales</category>
      <category>startup</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Save a ChatGPT conversation as a clean PDF — no extension, nothing uploaded</title>
      <dc:creator>binbuilds0</dc:creator>
      <pubDate>Thu, 08 Oct 2026 10:45:26 +0000</pubDate>
      <link>https://dev.to/binbuilds0/save-a-chatgpt-conversation-as-a-clean-pdf-no-extension-nothing-uploaded-113</link>
      <guid>https://dev.to/binbuilds0/save-a-chatgpt-conversation-as-a-clean-pdf-no-extension-nothing-uploaded-113</guid>
      <description>&lt;p&gt;&lt;em&gt;Updated October 7, 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; open the conversation in ChatGPT, press &lt;strong&gt;Ctrl+A&lt;/strong&gt; then &lt;strong&gt;Ctrl+C&lt;/strong&gt; (Cmd on a Mac), paste it into a browser-only converter such as &lt;a href="https://pressleaf.roledawn.com/tools/chat-to-pdf" rel="noopener noreferrer"&gt;Chat to PDF&lt;/a&gt;, and press &lt;strong&gt;Save as PDF&lt;/strong&gt;. You get the whole chat with every message labelled, and code blocks, tables and formulas intact. No extension, no account, and the conversation never leaves your browser.&lt;/p&gt;

&lt;p&gt;The same works for Claude. Below: why the obvious options fall short, the steps, and how the tool is built so it can't upload anything (it's &lt;a href="https://github.com/binbuilds0/chat-to-pdf" rel="noopener noreferrer"&gt;open source&lt;/a&gt; if you'd rather read the code first).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's wrong with the built-in options?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ctrl+P on the chat page.&lt;/strong&gt; You get the sidebar, the message box, and whatever the page layout does to print. Wide code blocks are clipped at the page edge instead of wrapping, and the result looks like a screenshot of an app rather than a document.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT's Export data.&lt;/strong&gt; Under &lt;strong&gt;Settings → Data controls → Export data&lt;/strong&gt;, ChatGPT emails you a ZIP of your entire history. &lt;a href="https://help.openai.com/en/articles/7260999-how-do-i-export-my-chatgpt-history-and-data" rel="noopener noreferrer"&gt;OpenAI's help article&lt;/a&gt; says the download link expires 24 hours after you receive it. Inside are &lt;code&gt;conversations.json&lt;/code&gt; and &lt;code&gt;chat.html&lt;/code&gt;: data files, not a PDF of the one chat you wanted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share-link-to-PDF websites.&lt;/strong&gt; Paste a share link, get a PDF. To do that, their server fetches the conversation for you. OpenAI's Terms of Use don't allow automatically or programmatically extracting data or output from the service, and Anthropic's Consumer Terms forbid crawling or scraping theirs. It also means a third party now has a copy of your chat.&lt;/p&gt;

&lt;p&gt;So the approach here is: you copy the conversation yourself, and everything after that happens in your own browser tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by step
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the conversation&lt;/strong&gt; in ChatGPT (or open its share link).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select and copy it.&lt;/strong&gt; Click inside the conversation, press &lt;strong&gt;Ctrl+A&lt;/strong&gt;, then &lt;strong&gt;Ctrl+C&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste it&lt;/strong&gt; into &lt;a href="https://pressleaf.roledawn.com/tools/chat-to-pdf" rel="noopener noreferrer"&gt;pressleaf.roledawn.com/tools/chat-to-pdf&lt;/a&gt;. The preview shows each message labelled "You" or "ChatGPT". The sidebar, buttons and input box are dropped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the title.&lt;/strong&gt; It's filled in from your first message and becomes the file name. Pick Letter or A4 if you care.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Press Save as PDF&lt;/strong&gt;, then choose &lt;strong&gt;Save as PDF&lt;/strong&gt; as the destination in the print dialog.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Want Markdown instead? &lt;strong&gt;Download Markdown&lt;/strong&gt; gives you &lt;code&gt;## You&lt;/code&gt; / &lt;code&gt;## ChatGPT&lt;/code&gt; sections with the original TeX for any math.&lt;/p&gt;

&lt;h3&gt;
  
  
  Already have the official export?
&lt;/h3&gt;

&lt;p&gt;Open &lt;code&gt;conversations.json&lt;/code&gt; (or ChatGPT's &lt;code&gt;chat.html&lt;/code&gt;) from the ZIP with &lt;strong&gt;Open a file&lt;/strong&gt;. You get a searchable list of every conversation; pick one and save it. For ChatGPT exports, the tool walks the message tree from the conversation's current node back to the root, so you get the branch you were actually looking at, not the regenerated answers you abandoned. Claude's &lt;code&gt;conversations.json&lt;/code&gt; works the same way (&lt;a href="https://support.anthropic.com/en/articles/9450526-how-can-i-export-my-claude-ai-data" rel="noopener noreferrer"&gt;Anthropic's export instructions&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes through intact
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code blocks&lt;/strong&gt; keep indentation and the language name. In the PDF, long lines wrap instead of being cut off at the margin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables&lt;/strong&gt; keep their columns, and on a table that spans pages the header row repeats on each page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Math.&lt;/strong&gt; ChatGPT and Claude write formulas as TeX (&lt;code&gt;$…$&lt;/code&gt;, &lt;code&gt;\[…\]&lt;/code&gt;, &lt;code&gt;$$…$$&lt;/code&gt;). Those are rendered as real formulas. Prices like "$5 and $10" are left alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any script.&lt;/strong&gt; The PDF is made by your browser's print engine with your system fonts, so Chinese, Japanese and Arabic print correctly, and the text stays selectable and searchable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How "nothing uploaded" is enforced, not just promised
&lt;/h2&gt;

&lt;p&gt;This is the part I care about most, and the part you can verify yourself in DevTools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The page can't make network requests.&lt;/strong&gt; It ships with this Content-Security-Policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default-src 'none'; script-src 'self'; connect-src 'none'; form-action 'none'; ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;connect-src 'none'&lt;/code&gt; makes the browser block every &lt;code&gt;fetch&lt;/code&gt;, XHR, WebSocket and beacon from the page. Even if the script wanted to send your conversation somewhere, the browser would refuse. Open the Network tab while you paste: nothing goes out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pasted HTML is sanitized before it's displayed.&lt;/strong&gt; When you copy from the chat page, the clipboard holds HTML. The tool reads &lt;code&gt;text/html&lt;/code&gt; from the paste event, finds the turns (ChatGPT marks them with &lt;code&gt;data-message-author-role&lt;/code&gt;), and passes every message through an allowlist sanitizer: known document tags only, no &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt;, no event handlers, no &lt;code&gt;javascript:&lt;/code&gt; links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Math is converted locally.&lt;/strong&gt; TeX is turned into MathML in the browser with &lt;a href="https://temml.org/" rel="noopener noreferrer"&gt;Temml&lt;/a&gt;, so there's no call to a rendering service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The PDF is the browser's print engine.&lt;/strong&gt; No PDF library, no server. The print stylesheet does the work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.doc&lt;/span&gt; &lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pre-wrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;overflow-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.doc&lt;/span&gt; &lt;span class="nt"&gt;thead&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;table-header-group&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.doc&lt;/span&gt; &lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.doc&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.who&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;break-inside&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;avoid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.who&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;break-after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;avoid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pre-wrap&lt;/code&gt; is what stops code from being clipped, &lt;code&gt;table-header-group&lt;/code&gt; repeats table headers across pages, and &lt;code&gt;break-after: avoid&lt;/code&gt; keeps a "ChatGPT" label from being stranded at the bottom of a page away from its answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Splitting plain text into turns
&lt;/h2&gt;

&lt;p&gt;If you paste plain text instead (from a notes app, say), there's no DOM to read. The parser looks for the markers ChatGPT and Claude put in copied text and in common Markdown exports: &lt;code&gt;You said:&lt;/code&gt; / &lt;code&gt;ChatGPT said:&lt;/code&gt;, &lt;code&gt;## You&lt;/code&gt; / &lt;code&gt;## Claude&lt;/code&gt;, and &lt;code&gt;User:&lt;/code&gt; / &lt;code&gt;Assistant:&lt;/code&gt;. Lines inside fenced code blocks are skipped, so a code sample that happens to contain &lt;code&gt;You said:&lt;/code&gt; doesn't split the conversation in half. If there aren't at least one user turn and one assistant turn, it keeps the text as one clean block rather than guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It doesn't open share links. Open the link yourself and copy the page.&lt;/li&gt;
&lt;li&gt;Images in &lt;code&gt;conversations.json&lt;/code&gt; exports show as &lt;code&gt;[image]&lt;/code&gt;, because the JSON only references uploaded files.&lt;/li&gt;
&lt;li&gt;Canvas documents and tool output that isn't part of the visible message text aren't included.&lt;/li&gt;
&lt;li&gt;You click once more in the print dialog to save. That's the price of using the browser's own engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Run it locally
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/binbuilds0/chat-to-pdf.git
&lt;span class="nb"&gt;cd &lt;/span&gt;chat-to-pdf
&lt;span class="c"&gt;# open index.html in your browser; dist/ is prebuilt&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;test&lt;/span&gt;   &lt;span class="c"&gt;# if you want to run the tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's MIT licensed. If you have a pasted chat that doesn't split correctly, an issue with a trimmed HTML sample is the most useful bug report I can get.&lt;/p&gt;

&lt;p&gt;I'm also working on Pressleaf, a Chrome extension that does this in one click on the chat page itself and handles any web page too. But for the occasional chat, the copy-paste page above is all you need.&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>pdf</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to import your Pocket export into Notion (and keep your tags)</title>
      <dc:creator>binbuilds0</dc:creator>
      <pubDate>Wed, 07 Oct 2026 10:37:40 +0000</pubDate>
      <link>https://dev.to/binbuilds0/how-to-import-your-pocket-export-into-notion-and-keep-your-tags-1i89</link>
      <guid>https://dev.to/binbuilds0/how-to-import-your-pocket-export-into-notion-and-keep-your-tags-1i89</guid>
      <description>&lt;p&gt;&lt;em&gt;Updated October 7, 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; convert the Pocket export into a Notion-friendly CSV first, then use Notion's built-in CSV import. Drop your Pocket file (the &lt;code&gt;.csv&lt;/code&gt;, or &lt;code&gt;ril_export.html&lt;/code&gt; from older exports) into a free in-browser converter, download the CSV, and in Notion go to &lt;strong&gt;Settings → Import → CSV&lt;/strong&gt;. Every saved link becomes a database page with Title, URL, Tags, Saved date and Status. Then switch the Tags property to Multi-select and your Pocket tags come back as real tags.&lt;/p&gt;

&lt;p&gt;That's the whole thing. The rest of this post is why the conversion step matters, the exact Notion clicks, and what you can't get back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just drop the Pocket CSV into Notion?
&lt;/h2&gt;

&lt;p&gt;You can. Notion will import it. It just won't be very useful.&lt;/p&gt;

&lt;p&gt;Pocket's CSV export has five columns: &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;time_added&lt;/code&gt;, &lt;code&gt;tags&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;. Two of them fight Notion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;time_added&lt;/code&gt; is a Unix timestamp.&lt;/strong&gt; You get a number column full of values like &lt;code&gt;1700000000&lt;/code&gt; instead of a date you can sort or filter by.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tags&lt;/code&gt; uses a vertical bar as the separator.&lt;/strong&gt; An item tagged &lt;code&gt;reading|ai|longform&lt;/code&gt; lands in Notion as one tag called &lt;code&gt;reading|ai|longform&lt;/code&gt;. Notion's Multi-select splits on commas, not bars.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you have the older HTML export (&lt;code&gt;ril_export.html&lt;/code&gt;), Notion imports it as one page full of links, not a database. The "Unread" and "Read Archive" headings that told you what you'd finished are just headings.&lt;/p&gt;

&lt;p&gt;So the fix is a small rewrite before you import:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;In the Pocket export&lt;/th&gt;
&lt;th&gt;In the Notion CSV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;tags&lt;/code&gt; (`reading\&lt;/td&gt;
&lt;td&gt;ai`)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;time_added&lt;/code&gt; (&lt;code&gt;1700000000&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Saved date (&lt;code&gt;November 14, 2023 10:13 PM&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;status&lt;/code&gt; (&lt;code&gt;unread&lt;/code&gt; / &lt;code&gt;archive&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Status (&lt;code&gt;Unread&lt;/code&gt; / &lt;code&gt;Archived&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The date format isn't random. It's the same format Notion writes in its own CSV exports, so Notion recognises it when you set the property type to Date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: find your export file
&lt;/h2&gt;

&lt;p&gt;Pocket sent the export as a &lt;code&gt;.zip&lt;/code&gt;. Unzip it. Inside is a CSV, usually named something like &lt;code&gt;part_000000.csv&lt;/code&gt;. If you exported years ago, you might have &lt;code&gt;ril_export.html&lt;/code&gt; instead. Both work.&lt;/p&gt;

&lt;p&gt;If you never exported: Mozilla shut Pocket down on July 8, 2025 and the export window closed on October 8, 2025, after which the data was deleted (&lt;a href="https://blog.mozilla.org/en/mozilla/building-whats-next/" rel="noopener noreferrer"&gt;Mozilla's announcement&lt;/a&gt;). There's no way to get it now. Before giving up, search your Downloads folder and your email for the export link: if you requested it before the deadline, the file you got still works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: convert it
&lt;/h2&gt;

&lt;p&gt;I wrote a small, free converter for this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Online: &lt;a href="https://fullclip.roledawn.com/tools/pocket-to-notion" rel="noopener noreferrer"&gt;fullclip.roledawn.com/tools/pocket-to-notion&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source (MIT, a single HTML page you can open offline): &lt;a href="https://github.com/binbuilds0/pocket-to-notion" rel="noopener noreferrer"&gt;github.com/binbuilds0/pocket-to-notion&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop the file on the page and click &lt;strong&gt;Download Notion CSV&lt;/strong&gt;. It runs entirely in your browser. The page's Content-Security-Policy has &lt;code&gt;connect-src 'none'&lt;/code&gt;, which means the browser itself blocks any network request from it, so your reading history can't be uploaded even by accident. If you'd rather not trust a hosted page at all, clone the repo and open &lt;code&gt;index.html&lt;/code&gt; from disk.&lt;/p&gt;

&lt;p&gt;A few things it takes care of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates.&lt;/strong&gt; If you saved the same URL twice, it keeps the first one and tells you how many it skipped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big libraries.&lt;/strong&gt; Notion accepts CSV files up to 5 MB on the Free plan and 50 MB on paid plans (&lt;a href="https://www.notion.com/help/import-data-into-notion" rel="noopener noreferrer"&gt;Notion's import docs&lt;/a&gt;). If your CSV would go past about 4.5 MB, the converter splits it into numbered parts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commas inside tags.&lt;/strong&gt; Since Notion splits Multi-select on commas, a tag like &lt;code&gt;books, fiction&lt;/code&gt; would become two tags. Those commas get replaced with spaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instapaper.&lt;/strong&gt; Same tool, same output. Instapaper folders other than Unread and Archive are kept as tags, so you don't lose that grouping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You also get a Markdown checklist of every link grouped by Unread and Archived, if you'd rather keep the list in Obsidian or a plain notes file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: import into Notion
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In Notion, open &lt;strong&gt;Settings → Import → CSV&lt;/strong&gt;. Or type &lt;code&gt;/csv&lt;/code&gt; on any page.&lt;/li&gt;
&lt;li&gt;Pick the CSV. Notion creates a new database: one page per row, one property per column.&lt;/li&gt;
&lt;li&gt;Fix the property types. Click the &lt;strong&gt;Tags&lt;/strong&gt; column header, change the type to &lt;strong&gt;Multi-select&lt;/strong&gt;. The comma-separated values become separate tags. Set &lt;strong&gt;Saved date&lt;/strong&gt; to &lt;strong&gt;Date&lt;/strong&gt; and &lt;strong&gt;Status&lt;/strong&gt; to &lt;strong&gt;Select&lt;/strong&gt; if Notion didn't guess them.&lt;/li&gt;
&lt;li&gt;If you got several parts, import part 1 first. Then open the new database, click &lt;strong&gt;•••&lt;/strong&gt; in the top right, choose &lt;strong&gt;Merge with CSV&lt;/strong&gt;, and add the other parts one at a time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One warning from Notion's own docs: imports add rows, they don't update existing ones. If you merge the same file twice you get every link twice. Merge each part once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: make it useful
&lt;/h2&gt;

&lt;p&gt;A database of 2,000 links is only better than a CSV if you can find things. A few setups that help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;board view grouped by Status&lt;/strong&gt;, so Unread is a column you can actually work through.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;filter on Tags&lt;/strong&gt; for each topic you care about, saved as separate views.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort by Saved date, oldest first&lt;/strong&gt; on the Unread view. Old saves are usually either still great or obviously dead, and both are fast to decide on.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you can't get back
&lt;/h2&gt;

&lt;p&gt;Be clear-eyed about this part. A CSV holds links and properties. Notion's import can't fetch the articles, so you get a list, not your reading library. The export itself is a list of links, not saved article text.&lt;/p&gt;

&lt;p&gt;Highlights aren't in the converted file. And if a site has since gone offline or moved behind a paywall, the link is all you have.&lt;/p&gt;

&lt;p&gt;For the handful of articles you actually want to keep, the reliable fix is to open each one and save the full page into Notion with a web clipper. That's what I'm building Fullclip for: it's a Chrome web clipper for Notion that saves the whole article (text, images, tables and code blocks) into the same kind of database. You don't need it for the import above; the converter works on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pocket export files: &lt;code&gt;.csv&lt;/code&gt; (newer) or &lt;code&gt;ril_export.html&lt;/code&gt; (older)&lt;/li&gt;
&lt;li&gt;Notion import: Settings → Import → CSV, or &lt;code&gt;/csv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add to an existing database: ••• → Merge with CSV&lt;/li&gt;
&lt;li&gt;Notion file limit: 5 MB per file (Free), 50 MB (paid)&lt;/li&gt;
&lt;li&gt;Tags property type: Multi-select&lt;/li&gt;
&lt;li&gt;Article text included: no&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your export doesn't convert the way you expect, open an issue on the &lt;a href="https://github.com/binbuilds0/pocket-to-notion" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; with a trimmed sample (strip anything private) and I'll take a look.&lt;/p&gt;

</description>
      <category>notion</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
