Checks a blog, job board or news feed you follow every six hours and turns each new item into a Trello card, never the same one twice.
Uses
Claude
Google Sheets
Trello
Turn new posts from a site you follow into Trello cards
Every six hours, the feed you follow is fetched, whether a release feed, a job board, a regulator's notices or a blog, and each new item becomes one Trello card on the board and list you name. The card carries the item's own title and link and nothing else.
You end up with a list that fills itself with what is new, once and only once. Every title and link the AI picks out is checked back against the feed word for word, and anything not found there is dropped and counted, so no card is ever made from an invented headline. Each item carded is logged to a tab in your spreadsheet, and that log is read before any card is made. If the log cannot be read, the run stops without creating anything rather than recreating the whole feed.
Before the first run you need the feed address, a Trello board and list named exactly as they appear in Trello, and a spreadsheet with a log tab that has a column headed 'Link'.
feedUrl to blank.Set feedUrl to blank.trelloBoardName to blank.Set trelloBoardName to blank.trelloListName to blank.Set trelloListName to blank.logSpreadsheetUrl to blank.Set logSpreadsheetUrl to blank.logTabName to Feed log.Set logTabName to Feed log.maxCardsPerRun to 10.Set maxCardsPerRun to 10.feedText to blank.Set feedText to blank.feedReached to false.Set feedReached to false.failureNote to blank.Set failureNote to blank.fetchErrorIf a step below fails, save the error as fetchErrorfeedUrl and save it as response.Fetch feedUrl and save it as response.feedReached to response.ok.Change feedReached to response.ok.response.body and save it as feedText.Trim response.body and save it as feedText.feedUrl with the feed address in fetchError.message and save it as failureNote.Replace feedUrl with the feed address in fetchError.message and save it as failureNote.failureNote contains :// (ignoring case)If failureNote contains :// (ignoring case)failureNote to it could not be reached.Change failureNote to it could not be reached.feedUrl with https:// replaced by with http:// replaced by split by / and save it as feedHost.Get the first item of feedUrl with https:// replaced by with http:// replaced by split by / and save it as feedHost.feedReached is no or feedText is emptyIf feedReached is no or feedText is emptyfeedHost. failureNote.Stop and report a problem: Nothing could be read from the feed at feedHost. failureNote.boards.List your boards. Save it as boards.trelloBoardId to blank.Set trelloBoardId to blank.board in boards.boards:For each board in boards.boards:board.name is trelloBoardNameIf board.name is trelloBoardNameboard.id and save it as trelloBoardId.Trim board.id and save it as trelloBoardId.trelloBoardId is emptyIf trelloBoardId is emptytrelloBoardId. Save it as lists.List the lists on trelloBoardId. Save it as lists.trelloListId to blank.Set trelloListId to blank.boardList in lists.lists:For each boardList in lists.lists:boardList.name is trelloListNameIf boardList.name is trelloListNameboardList.id and save it as trelloListId.Trim boardList.id and save it as trelloListId.trelloListId is emptyIf trelloListId is emptyloggedLinks to an empty list.Set loggedLinks to an empty list.logReadable to false.Set logReadable to false.logErrorIf a step below fails, save the error as logErrorlogSpreadsheetUrl. Save it as log.Read the rows of logSpreadsheetUrl. Save it as log.logReadable to true.Change logReadable to true.logRow in log.rows:For each logRow in log.rows:logRow.Link and save it as loggedLink. Trim logRow.Link and save it as loggedLink.loggedLink isn't empty If loggedLink isn't emptyloggedLink to the end of loggedLinks and save it as loggedLinks.Add loggedLink to the end of loggedLinks and save it as loggedLinks.The log tab could not be read, so no cards were made this run..Show in the output: The log tab could not be read, so no cards were made this run..logReadable is noIf logReadable is noprompt to The text below is the raw source of a feed. List the newest items in it, one per line, as: title ||| linkSet prompt to The text below is the raw source of a feed. List the newest items in it, one per line, as: title ||| link
Copy the title and the link exactly as they appear in the text. Do not invent, complete, tidy or translate either of them, and do not add items that are not in the text. If the text holds no items at all, reply with the single word NONE.
Feed source:
feedText truncated to 6000 characters.answerText to blank.Set answerText to blank.readItemsErrorIf a step below fails, save the error as readItemsErroranswerText.Trim the response text from the Claude “Ask Claude” step and save it as answerText.The step that lists the feed's items did not answer this run..Show in the output: The step that lists the feed's items did not answer this run..answerText is emptyIf answerText is emptyfeedHost did not answer this run, so no cards were made.Stop and report a problem: The step that lists the items in the feed at feedHost did not answer this run, so no cards were made.cardsCreated to 0.Set cardsCreated to 0.itemsRejected to 0.Set itemsRejected to 0.answerLine in answerText split by a new line:For each answerLine in answerText split by a new line:answerLine and save it as entry.Trim answerLine and save it as entry.entry is emptyIf entry is emptycardsCreated is greater than or equal to maxCardsPerRun multiplied by 1If cardsCreated is greater than or equal to maxCardsPerRun multiplied by 1entry by ||| and save it as parts.Split entry by ||| and save it as parts.parts is less than 2If the length of parts is less than 2parts and save it as itemTitle.Trim the first item of parts and save it as itemTitle.parts and save it as itemLink.Trim the last item of parts and save it as itemLink.itemTitle is empty or itemLink is emptyIf itemTitle is empty or itemLink is emptyitemLink doesn't start with http (ignoring case)If itemLink doesn't start with http (ignoring case)itemsRejected.Add 1 to itemsRejected.feedText doesn't contain itemTitle (ignoring case) or feedText doesn't…If feedText doesn't contain itemTitle (ignoring case) or feedText doesn't…itemsRejected.Add 1 to itemsRejected.loggedLinks contains itemLinkIf loggedLinks contains itemLinktrelloListId. Save it as createdCard.Add the card '@itemTitle truncated to 240 characters' to trelloListId. Save it as createdCard.From the feed you follow.
itemLinkcreatedCard.card.url and save it as cardUrl.Trim createdCard.card.url and save it as cardUrl.logTabName in logSpreadsheetUrl.Add a row to logTabName in logSpreadsheetUrl.itemLink to the end of loggedLinks and save it as loggedLinks.Add itemLink to the end of loggedLinks and save it as loggedLinks.cardsCreated.Add 1 to cardsCreated.cardsCreated card(s). itemsRejected suggested item(s) were dropped because they were not in the feed word for word.Show in the output: Made cardsCreated card(s). itemsRejected suggested item(s) were dropped because they were not in the feed word for word.