{"id":"5d68aa9b-00e2-4bf8-bf19-25a3c741968c","shortId":"bNuhyy","kind":"skill","title":"newsletter-digest","tagline":"Aggregates RSS feeds from the past week, synthesizes the top stories using Gemini, and publishes a newsletter digest to Ghost CMS. Optionally outputs formatted Markdown for Substack or any other platform. Use when asked to generate a newsletter, create a weekly digest, summarize ","description":"# Newsletter Digest\n\nAggregate content from RSS feeds, synthesize the week's top stories with Gemini, and publish a digest to Ghost CMS. Supports weekly digests, topic-focused roundups, and curated picks formats.\n\n## Writing Style\n\nApply to all generated digest content:\n\n- Active voice only\n- Short sentences, one idea per sentence\n- No em dashes — use a period or comma instead\n- No semicolons\n- No markdown or asterisks in the final newsletter body\n- No hashtags\n\nBanned words — do not use any of these in the digest:\nincredible, amazing, leveraging, synergize, game-changing, game changer, delve, harness, unlock, groundbreaking, cutting-edge, remarkable, paradigm, revolutionize, disruptive, transformative, thrilled, excited to share, powerful, innovative, comprehensive, actionable, crucial, vital, pivotal, elucidate, utilize, dive deep, tapestry, illuminate, revolutionize\n\n## CRITICAL RULE\n\nEvery claim, statistic, and summary in the digest must come from the fetched articles. Never fabricate data points, quotes, or facts. If a source article has no meaningful content, skip it.\n\n---\n\n## Step 1: Check Setup\n\n**1a. Verify feeds are configured**\n\nCheck if `feeds.json` exists in the skill directory:\n\n```bash\nls /Users/ksd/Desktop/Varnan_skills/newsletter-digest/feeds.json 2>/dev/null\n```\n\nIf missing, ask the user: \"Which RSS feeds should I monitor? Share a list of URLs and I'll create feeds.json.\"\n\nThe format is:\n```json\n[\n  { \"url\": \"https://example.com/feed\", \"name\": \"Source Name\" },\n  { \"url\": \"https://another.com/rss\", \"name\": \"Another Source\" }\n]\n```\n\n**1b. Verify required environment variables**\n\nCheck that these are set:\n- `GEMINI_API_KEY` (required): for synthesis\n- `GHOST_URL` and `GHOST_ADMIN_KEY` (required for Ghost publishing, optional if output-only)\n\nIf GEMINI_API_KEY is missing, stop and ask the user to set it.\n\nGHOST config is optional. If not set, the skill outputs formatted Markdown instead of publishing.\n\n**1c. Verify script dependencies**\n\n```bash\nls /Users/ksd/Desktop/Varnan_skills/newsletter-digest/node_modules 2>/dev/null | head -1\n```\n\nIf missing:\n\n```bash\ncd /Users/ksd/Desktop/Varnan_skills/newsletter-digest && npm install\n```\n\n---\n\n## Step 2: Fetch and Parse Feeds\n\nRun the fetch script:\n\n```bash\nnode /Users/ksd/Desktop/Varnan_skills/newsletter-digest/scripts/fetch-feeds.js\n```\n\nThe script:\n- Reads `feeds.json` for the list of feeds\n- Fetches each feed using `rss-parser`\n- Filters items published in the last 7 days\n- Deduplicates by URL\n- Sorts by publish date, newest first\n- Saves results to `/tmp/newsletter-digest-articles.json`\n\nIf the script errors on a specific feed, it logs a warning and continues. One bad feed does not stop the run.\n\nAfter the script completes, verify the output:\n\n```bash\nnode -e \"\nconst fs = require('fs');\nconst data = JSON.parse(fs.readFileSync('/tmp/newsletter-digest-articles.json', 'utf8'));\nconsole.log('Total articles:', data.articles.length);\nconsole.log('From feeds:', data.feedsSummary.map(f => f.name + ': ' + f.count).join(', '));\nconsole.log('Date range:', data.dateRange.from, 'to', data.dateRange.to);\n\"\n```\n\nIf fewer than 3 articles are found, warn the user and ask if they want to extend the date range to 14 days. Pass `--days=14` to the script to widen the window.\n\n---\n\n## Step 3: Read Format Rules\n\nRead `references/digest-format.md` in full before generating any content. Internalize:\n- Three digest formats (Weekly Roundup, Topic Deep Dive, Curated Picks) and when to use each\n- Section structure and length requirements per format\n- Attribution rules (every claim links to a source)\n- Tone and voice guidelines\n\nRead `references/output-template.md` and select the template matching the requested format.\n\nIf the user did not specify a format, default to Weekly Roundup.\n\n---\n\n## Step 4: Synthesize with Gemini\n\nRead `/tmp/newsletter-digest-articles.json` and build a synthesis prompt.\n\n**Prompt structure:**\n\n```\nYou are a newsletter editor writing a digest of this week's top stories.\n\nSources (use ONLY these — do not invent facts):\n[For each article: Title | Source | Date | Summary]\n\nTask:\nWrite a [FORMAT] digest following this structure:\n[Paste the selected template from references/output-template.md]\n\nRules:\n- Every claim, statistic, and quote must come from the sources above\n- Write in active voice, short sentences, contractions allowed\n- Do not use: incredible, amazing, leveraging, game-changing, delve, groundbreaking, cutting-edge, revolutionize\n- No em dashes, no semicolons, no hashtags\n- Include [Source: Name](URL) attribution after each major claim\n- Output plain text with HTML heading tags only (no markdown asterisks)\n```\n\nCall Gemini with this prompt. Target model: `gemini-2.0-flash` or the latest available.\n\nIf the response contains any banned words or invented statistics not present in the source articles, regenerate with a stricter prompt.\n\n---\n\n## Step 5: Self-QA\n\nRun every check before presenting. Fix violations first.\n\n- [ ] Every claim, statistic, and quote traces to a source article\n- [ ] No banned words in any section\n- [ ] No em dashes in the text\n- [ ] No semicolons in the text\n- [ ] Every section has at least one source attribution with URL\n- [ ] Word count is within the format's target range (see references/digest-format.md)\n- [ ] No section repeated the same story twice\n- [ ] Title is specific (includes the date range or issue number, not just \"Weekly Digest\")\n- [ ] HTML output is valid (no unclosed tags if Ghost publishing)\n\nFix all violations before presenting to the user.\n\n---\n\n## Step 6: Format and Preview\n\nPresent the digest to the user in this order:\n\n1. **Title** — Issue date range or topic\n2. **Digest content** — Full formatted text\n3. **Source list** — All articles used, with URLs\n4. **Word count and article count**\n\nAsk: \"Ready to publish to Ghost as a draft, or would you like to edit first?\"\n\n---\n\n## Step 7: Publish to Ghost or Output\n\n**If GHOST_URL and GHOST_ADMIN_KEY are set and user confirms:**\n\nRun the publish script:\n\n```bash\nnode /Users/ksd/Desktop/Varnan_skills/newsletter-digest/scripts/ghost-publish.js \\\n  --title \"DIGEST_TITLE\" \\\n  --status \"draft\"\n```\n\nThe script reads `/tmp/newsletter-digest-output.json` (written by the agent in Step 6) and posts to Ghost.\n\nAfter posting, the script returns the Ghost admin URL for the draft. Present this to the user: \"Draft saved at: [URL]. Review and publish from your Ghost dashboard.\"\n\nIf the user wants to publish immediately, pass `--status \"published\"` to the script.\n\n**If Ghost is not configured or user says \"output only\":**\n\nOutput the digest in three formats:\n\n1. **HTML** — ready to paste into any CMS\n2. **Markdown** — for Substack, Notion, or Hashnode\n3. **Plain text** — for email clients\n\nAdd: \"Substack does not offer a public API. Copy the Markdown version into your Substack editor directly.\"\n\n---\n\n## Notes on Substack\n\nSubstack has no public API. Programmatic posting is not possible without reverse-engineering internal endpoints, which violates their terms. The skill outputs a formatted Markdown digest ready to paste into the Substack editor. This is the correct approach.","tags":["newsletter","digest","opendirectory","varnan-tech","agent-skills","gtm","hermes-agent","openclaw-skills","skills","technical-seo"],"capabilities":["skill","source-varnan-tech","skill-newsletter-digest","topic-agent-skills","topic-gtm","topic-hermes-agent","topic-openclaw-skills","topic-skills","topic-technical-seo"],"categories":["opendirectory"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Varnan-Tech/opendirectory/newsletter-digest","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Varnan-Tech/opendirectory","source_repo":"https://github.com/Varnan-Tech/opendirectory","install_from":"skills.sh"}},"qualityScore":"0.511","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 123 github stars · SKILL.md body (7,140 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T00:55:50.944Z","embedding":null,"createdAt":"2026-04-18T22:18:33.026Z","updatedAt":"2026-05-02T00:55:50.944Z","lastSeenAt":"2026-05-02T00:55:50.944Z","tsv":"'-1':333 '-2.0':681 '/dev/null':223,331 '/feed':252 '/rss':259 '/tmp/newsletter-digest-articles.json':390,431,560 '/tmp/newsletter-digest-output.json':899 '/users/ksd/desktop/varnan_skills/newsletter-digest':338 '/users/ksd/desktop/varnan_skills/newsletter-digest/feeds.json':221 '/users/ksd/desktop/varnan_skills/newsletter-digest/node_modules':329 '/users/ksd/desktop/varnan_skills/newsletter-digest/scripts/fetch-feeds.js':353 '/users/ksd/desktop/varnan_skills/newsletter-digest/scripts/ghost-publish.js':890 '1':203,822,968 '14':472,476 '1a':206 '1b':263 '1c':323 '2':222,330,342,829,976 '3':454,485,835,983 '4':555,843 '5':709 '6':809,906 '7':376,866 'action':158 'activ':88,625 'add':989 'admin':283,877,918 'agent':903 'aggreg':4,49 'allow':630 'amaz':131,635 'anoth':261 'another.com':258 'another.com/rss':257 'api':274,296,996,1013 'appli':82 'approach':1047 'articl':184,195,435,455,592,702,730,839,847 'ask':37,226,302,462,849 'asterisk':111,672 'attribut':520,657,755 'avail':686 'bad':406 'ban':119,692,732 'bash':219,327,336,351,420,888 'bodi':116 'build':562 'call':673 'cd':337 'chang':136,639 'changer':138 'check':204,211,268,715 'claim':172,523,613,661,722 'client':988 'cms':24,68,975 'come':180,618 'comma':104 'complet':416 'comprehens':157 'config':309 'configur':210,956 'confirm':883 'console.log':433,437,445 'const':423,427 'contain':690 'content':50,87,199,496,831 'continu':404 'contract':629 'copi':997 'correct':1046 'count':759,845,848 'creat':42,243 'critic':169 'crucial':159 'curat':77,506 'cut':144,643 'cutting-edg':143,642 'dash':99,648,739 'dashboard':938 'data':187,428 'data.articles.length':436 'data.daterange.from':448 'data.daterange.to':450 'data.feedssummary.map':440 'date':384,446,469,595,781,825 'day':377,473,475 'dedupl':378 'deep':165,504 'default':550 'delv':139,640 'depend':326 'digest':3,21,45,48,65,71,86,129,178,499,575,601,789,815,830,892,964,1035 'direct':1005 'directori':218 'disrupt':149 'dive':164,505 'draft':857,895,922,928 'e':422 'edg':145,644 'edit':863 'editor':572,1004,1042 'elucid':162 'em':98,647,738 'email':987 'endpoint':1024 'engin':1022 'environ':266 'error':394 'everi':171,522,612,714,721,748 'example.com':251 'example.com/feed':250 'excit':152 'exist':214 'extend':467 'f':441 'f.count':443 'f.name':442 'fabric':186 'fact':191,589 'feed':6,53,208,231,346,362,365,398,407,439 'feeds.json':213,244,357 'fetch':183,343,349,363 'fewer':452 'filter':370 'final':114 'first':386,720,864 'fix':718,800 'flash':682 'focus':74 'follow':602 'format':27,79,246,318,487,500,519,541,549,600,763,810,833,967,1033 'found':457 'fs':424,426 'fs.readfilesync':430 'full':492,832 'game':135,137,638 'game-chang':134,637 'gemini':16,61,273,295,558,674,680 'generat':39,85,494 'ghost':23,67,279,282,287,308,798,854,869,873,876,910,917,937,953 'groundbreak':142,641 'guidelin':531 'har':140 'hashnod':982 'hashtag':118,652 'head':332,667 'html':666,790,969 'idea':94 'illumin':167 'immedi':945 'includ':653,779 'incred':130,634 'innov':156 'instal':340 'instead':105,320 'intern':497,1023 'invent':588,695 'issu':784,824 'item':371 'join':444 'json':248 'json.parse':429 'key':275,284,297,878 'last':375 'latest':685 'least':752 'length':516 'leverag':132,636 'like':861 'link':524 'list':237,360,837 'll':242 'log':400 'ls':220,328 'major':660 'markdown':28,109,319,671,977,999,1034 'match':538 'meaning':198 'miss':225,299,335 'model':679 'monitor':234 'must':179,617 'name':253,255,260,655 'never':185 'newest':385 'newslett':2,20,41,47,115,571 'newsletter-digest':1 'node':352,421,889 'note':1006 'notion':980 'npm':339 'number':785 'offer':993 'one':93,405,753 'option':25,289,311 'order':821 'output':26,292,317,419,662,791,871,960,962,1031 'output-on':291 'paradigm':147 'pars':345 'parser':369 'pass':474,946 'past':9,605,972,1038 'per':95,518 'period':102 'pick':78,507 'pivot':161 'plain':663,984 'platform':34 'point':188 'possibl':1018 'post':908,912,1015 'power':155 'present':698,717,804,813,923 'preview':812 'programmat':1014 'prompt':565,566,677,707 'public':995,1012 'publish':18,63,288,322,372,383,799,852,867,886,934,944,948 'qa':712 'quot':189,616,725 'rang':447,470,766,782,826 'read':356,486,489,532,559,898 'readi':850,970,1036 'references/digest-format.md':490,768 'references/output-template.md':533,610 'regener':703 'remark':146 'repeat':771 'request':540 'requir':265,276,285,425,517 'respons':689 'result':388 'return':915 'revers':1021 'reverse-engin':1020 'review':932 'revolution':148,168,645 'roundup':75,502,553 'rss':5,52,230,368 'rss-parser':367 'rule':170,488,521,611 'run':347,412,713,884 'save':387,929 'say':959 'script':325,350,355,393,415,479,887,897,914,951 'section':513,736,749,770 'see':767 'select':535,607 'self':711 'self-qa':710 'semicolon':107,650,744 'sentenc':92,96,628 'set':272,306,314,880 'setup':205 'share':154,235 'short':91,627 'skill':217,316,1030 'skill-newsletter-digest' 'skip':200 'sort':381 'sourc':194,254,262,527,582,594,621,654,701,729,754,836 'source-varnan-tech' 'specif':397,778 'specifi':547 'statist':173,614,696,723 'status':894,947 'step':202,341,484,554,708,808,865,905 'stop':300,410 'stori':14,59,581,774 'stricter':706 'structur':514,567,604 'style':81 'substack':30,979,990,1003,1008,1009,1041 'summar':46 'summari':175,596 'support':69 'synerg':133 'synthes':11,54,556 'synthesi':278,564 'tag':668,796 'tapestri':166 'target':678,765 'task':597 'templat':537,608 'term':1028 'text':664,742,747,834,985 'three':498,966 'thrill':151 'titl':593,776,823,891,893 'tone':528 'top':13,58,580 'topic':73,503,828 'topic-agent-skills' 'topic-focus':72 'topic-gtm' 'topic-hermes-agent' 'topic-openclaw-skills' 'topic-skills' 'topic-technical-seo' 'total':434 'trace':726 'transform':150 'twice':775 'unclos':795 'unlock':141 'url':239,249,256,280,380,656,757,842,874,919,931 'use':15,35,100,123,366,511,583,633,840 'user':228,304,460,544,807,818,882,927,941,958 'utf8':432 'util':163 'valid':793 'variabl':267 'verifi':207,264,324,417 'version':1000 'violat':719,802,1026 'vital':160 'voic':89,530,626 'want':465,942 'warn':402,458 'week':10,44,56,70,501,552,578,788 'widen':481 'window':483 'within':761 'without':1019 'word':120,693,733,758,844 'would':859 'write':80,573,598,623 'written':900","prices":[{"id":"ffb73e4c-f4e4-4c5e-90ad-b6f001328b21","listingId":"5d68aa9b-00e2-4bf8-bf19-25a3c741968c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Varnan-Tech","category":"opendirectory","install_from":"skills.sh"},"createdAt":"2026-04-18T22:18:33.026Z"}],"sources":[{"listingId":"5d68aa9b-00e2-4bf8-bf19-25a3c741968c","source":"github","sourceId":"Varnan-Tech/opendirectory/newsletter-digest","sourceUrl":"https://github.com/Varnan-Tech/opendirectory/tree/main/skills/newsletter-digest","isPrimary":false,"firstSeenAt":"2026-04-18T22:18:33.026Z","lastSeenAt":"2026-05-02T00:55:50.944Z"}],"details":{"listingId":"5d68aa9b-00e2-4bf8-bf19-25a3c741968c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Varnan-Tech","slug":"newsletter-digest","github":{"repo":"Varnan-Tech/opendirectory","stars":123,"topics":["agent-skills","gtm","hermes-agent","openclaw-skills","skills","technical-seo"],"license":null,"html_url":"https://github.com/Varnan-Tech/opendirectory","pushed_at":"2026-04-30T18:54:05Z","description":" AI Agent Skills built for GTM, Technical Marketing, and growth automation.","skill_md_sha":"a90d47373ff4f55831969f28ef3e3e733bb237a2","skill_md_path":"skills/newsletter-digest/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Varnan-Tech/opendirectory/tree/main/skills/newsletter-digest"},"layout":"multi","source":"github","category":"opendirectory","frontmatter":{"name":"newsletter-digest","description":"Aggregates RSS feeds from the past week, synthesizes the top stories using Gemini, and publishes a newsletter digest to Ghost CMS. Optionally outputs formatted Markdown for Substack or any other platform. Use when asked to generate a newsletter, create a weekly digest, summarize RSS feeds, compile top stories for a newsletter, or publish a digest to Ghost. Trigger when a user mentions newsletter digest, weekly roundup, RSS digest, compile top stories, or publish to Ghost.","compatibility":"[claude-code, gemini-cli, github-copilot]"},"skills_sh_url":"https://skills.sh/Varnan-Tech/opendirectory/newsletter-digest"},"updatedAt":"2026-05-02T00:55:50.944Z"}}