Reads every article you list, writes a summary and the key points, and files each one as a page in your Notion database.
Uses
ClaudeNotion
Turn your reading list into Notion notes
Give it a list of article links, one per line, and the name of a Notion database, and run it. Each article is fetched and read, and the AI writes it up for whatever you are reading for: a short summary paragraph, up to six key points and a link back to the original. Each write-up is filed as a page in that database, titled with the article's own title.
Nothing is ever overwritten. The titles already in the database are read first, and an article that is there is left alone, so re-running after adding two more links files only those two. A duplicate link, an address that will not load, or a page that serves a paywall or cookie wall instead of the article is reported and skipped rather than filed as an empty note.
The database is found by name, so it must be shared with your Notion integration and named exactly as you give it.
articleLinks to blank.Set articleLinks to blank.notionDatabaseName to blank.Set notionDatabaseName to blank.readingFocus to General reading. Capture what the article argues, what it bases that on, and what is worth remembering a month from now..Set readingFocus to General reading. Capture what the article argues, what it bases that on, and what is worth remembering a month from now..titlePropertyName to Name.Set titlePropertyName to Name.pageCharacterLimit to 18000.Set pageCharacterLimit to 18000.notionDatabaseName lowercase and save it as wantedDatabaseName.Make notionDatabaseName lowercase and save it as wantedDatabaseName.databaseMatches.List databases. Save it as databaseMatches.notionDatabaseId to blank.Set notionDatabaseId to blank.databaseEntry in databaseMatches.databases:For each databaseEntry in databaseMatches.databases:databaseEntryErrorIf a step below fails, save the error as databaseEntryErrordatabaseEntry.name lowercase and save it as entryName.Make databaseEntry.name lowercase and save it as entryName.entryName is wantedDatabaseName and notionDatabaseId is emptyIf entryName is wantedDatabaseName and notionDatabaseId is emptydatabaseEntry.id and save it as notionDatabaseId.Trim databaseEntry.id and save it as notionDatabaseId.Ignored a Notion database with no readable name or id..Show in the output: Ignored a Notion database with no readable name or id..notionDatabaseId is emptyIf notionDatabaseId is emptyexistingPages to {results:[]}.Set existingPages to {results:[]}.existingPagesErrorIf a step below fails, save the error as existingPagesErrornotionDatabaseId. Save it as existingPages.Find pages in notionDatabaseId. Save it as existingPages.existingPagesError.message.Show in the output: Could not read what is already in '@notionDatabaseName', so an article you have already filed may be filed again - existingPagesError.message.filedTitles to "Set filedTitles to
.existingPage in existingPages.results:For each existingPage in existingPages.results:existingTitleErrorIf a step below fails, save the error as existingTitleErrorexistingPage.title lowercase and save it as existingTitle.Make existingPage.title lowercase and save it as existingTitle.existingTitle isn't emptyIf existingTitle isn't emptyfiledTitles to filedTitles@existingTitleChange filedTitles to filedTitles@existingTitle
.Ignored a page in the database with no readable title..Show in the output: Ignored a page in the database with no readable title..notesFiled to 0.Set notesFiled to 0.readLinks to "Set readLinks to
.articleEntry in articleLinks with "For each articleEntry in articleLinks with
replaced by , split by ,:articleEntry and save it as articleUrl.Trim articleEntry and save it as articleUrl.articleUrl is emptyIf articleUrl is emptyarticleUrl doesn't start with http (ignoring case) or articleUrl doesn't…If articleUrl doesn't start with http (ignoring case) or articleUrl doesn't…readLinks contains articleUrlIf readLinks contains articleUrlarticleUrl because the same address is listed more than once.Show in the output: Skipped articleUrl because the same address is listed more than once.readLinks to readLinks@articleUrlChange readLinks to readLinks@articleUrl
.pageSource to blank.Set pageSource to blank.pageReached to false.Set pageReached to false.fetchErrorIf a step below fails, save the error as fetchErrorarticleUrl and save it as pageResponse.Fetch articleUrl and save it as pageResponse.pageReached to pageResponse.ok.Change pageReached to pageResponse.ok.pageResponse.body and save it as pageSource.Trim pageResponse.body and save it as pageSource.fetchError.message with articleUrl replaced by the article address.Show in the output: Could not open the article - fetchError.message with articleUrl replaced by the article address.pageReached isn't yes or pageSource is emptyIf pageReached isn't yes or pageSource is emptyarticleUrl because it did not return a readable page.Show in the output: Skipped articleUrl because it did not return a readable page.pageSource to pageCharacterLimit characters (keeping words whole) and save it as articleExcerpt.Shorten pageSource to pageCharacterLimit characters (keeping words whole) and save it as articleExcerpt.readingPrompt to You are writing one reading note about a single article, for someone who wants to remember what it said without opening it again.Set readingPrompt to You are writing one reading note about a single article, for someone who wants to remember what it said without opening it again.
What this reader is reading for:
readingFocus
Reply with plain lines and nothing else. No labels, no numbering, no bullet characters, no blank lines, no introduction and no closing summary.
Line 1: the article's own title, as written on the page. If the page has no clear title, write a short one naming the subject.
Line 2: the whole article summarised in three or four sentences, all on one line. Say what it argues and what it bases that on, not what it is 'about'.
Every line after that: one key point worth remembering, at most six of them, each a full sentence that stands on its own. Keep the specific numbers, names and claims - a point nobody could disagree with is not worth writing down.
Use only what is on the page below. If the page is a paywall notice, a cookie banner, a login screen or an error page rather than the article itself, reply with the single word SKIP and nothing else.
Article address: articleUrl
The page follows as raw HTML. Read the visible article text; ignore navigation, script blocks, style blocks and tracking tags.
articleExcerpt.readingNote to blank.Set readingNote to blank.summaryErrorIf a step below fails, save the error as summaryErrorreadingPrompt. Save it as reading.Ask Claude: readingPrompt. Save it as reading.
Maximum response length: 1200reading.response_text and save it as readingNote.Trim reading.response_text and save it as readingNote.articleUrl - summaryError.message.Show in the output: Could not summarise articleUrl - summaryError.message.readingNote is emptyIf readingNote is emptyarticleUrl, so nothing was filed for it.Show in the output: No reading note came back for articleUrl, so nothing was filed for it.readingNote in uppercase is SKIPIf readingNote in uppercase is SKIParticleUrl because that address served a paywall, cookie or error page rather than the article.Show in the output: Skipped articleUrl because that address served a paywall, cookie or error page rather than the article.noteLines to an empty list.Set noteLines to an empty list.replyLine in readingNote split by a new line:For each replyLine in readingNote split by a new line:replyLine and save it as cleanLine.Trim replyLine and save it as cleanLine.cleanLine isn't emptyIf cleanLine isn't emptycleanLine to the end of noteLines and save it as noteLines.Add cleanLine to the end of noteLines and save it as noteLines.noteLines is less than 2If the length of noteLines is less than 2articleUrl came back without both a title and a summary, so nothing was filed for it.Show in the output: The reading note for articleUrl came back without both a title and a summary, so nothing was filed for it.noteLines[0] to 190 characters (keeping words whole) and save it as articleTitle.Shorten noteLines[0] to 190 characters (keeping words whole) and save it as articleTitle.noteLines[1] to 1800 characters (keeping words whole) and save it as articleSummary.Shorten noteLines[1] to 1800 characters (keeping words whole) and save it as articleSummary.filedTitles contains articleTitle in lowercaseIf filedTitles contains articleTitle in lowercasekeyPointBlocks to an empty list.Set keyPointBlocks to an empty list.noteLineNumber to 0.Set noteLineNumber to 0.noteLine in noteLines:For each noteLine in noteLines:noteLineNumber is greater than or equal to 2 and the length of keyPointBlocks…If noteLineNumber is greater than or equal to 2 and the length of keyPointBlocks…keyPointBlocks and save it as keyPointBlocks.Add a record of object, type, and bulleted list item to the end of keyPointBlocks and save it as keyPointBlocks.noteLineNumber.Add 1 to noteLineNumber.notePageBlocks to [a record of object, type, and paragraph].Set notePageBlocks to [a record of object, type, and paragraph].keyPointBlocks isn't emptyIf keyPointBlocks isn't emptyobject:block,type:heading_3,heading_3:{rich_text:[{type:text,text:{content:Key points}}]}} to the end of notePageBlocks and save it as notePageBlocks.Add {object:block,type:heading_3,heading_3:{rich_text:[{type:text,text:{content:Key points}}]}} to the end of notePageBlocks and save it as notePageBlocks.notePageBlocks and keyPointBlocks into one list and save it as notePageBlocks.Combine notePageBlocks and keyPointBlocks into one list and save it as notePageBlocks.notePageBlocks and save it as notePageBlocks.Add a record of object, type, and paragraph to the end of notePageBlocks and save it as notePageBlocks.notePageFiled to false.Set notePageFiled to false.fileErrorIf a step below fails, save the error as fileErrorarticleTitle in notionDatabaseId.Create the page articleTitle in notionDatabaseId.notePageFiled to true.Change notePageFiled to true.fileError.message.Show in the output: Could not file '@articleTitle' in Notion - fileError.message.notePageFiled is yesIf notePageFiled is yesnotesFiled.Add 1 to notesFiled.filedTitles to filedTitles@articleTitle in lowercaseChange filedTitles to filedTitles@articleTitle in lowercase
.notesFiled.Show in the output: New reading notes filed in '@notionDatabaseName': notesFiled.