{"id":"f59008fe-c1cd-4ad0-98aa-6bde6998aca1","shortId":"YQqZSV","kind":"skill","title":"github-monitor","tagline":"Monitor your GitHub repos for new projects and significant updates. Generates Reddit + Twitter draft posts for approval before publishing. Triggers on \"check my github\", \"github monitor\", \"new repos\", or any GitHub monitoring request.","description":"# GitHub Monitor Skill\n\nMonitor your public GitHub repos. When new repos appear or significant updates happen, generate social media drafts and send for approval.\n\n---\n\n## Configuration\n\nSet your GitHub username at the top of your state file or as an env var:\n\n```bash\nexport GITHUB_USERNAME=\"yourusername\"\n```\n\n---\n\n## Core Principle\n\n**Product is content.** Don't fabricate stories. Translate \"what I built\" into social posts.\n\n---\n\n## Detection Logic\n\n### 1. Fetch Current Repos\n\n```bash\n# New repos (sorted by creation date)\ngh api /users/$GITHUB_USERNAME/repos?sort=created&per_page=10\n\n# Recently updated repos (sorted by push date)\ngh api /users/$GITHUB_USERNAME/repos?sort=pushed&per_page=10\n```\n\n### 2. Compare Against State\n\nRead `memory/github-monitor-state.json` and compare.\n\n### 3. Trigger Conditions (any one triggers a draft)\n\n| Condition | How to Detect |\n|-----------|---------------|\n| New public repo | `created_at` newer than any known repo |\n| Significant update | `pushed_at` changed AND >= 3 new commits since last check |\n| Star milestone | Stars crossed 10, 50, 100, 500, 1000 |\n\n### 4. Gather Content for Draft\n\n```bash\n# Read README\ngh api /repos/$GITHUB_USERNAME/{repo}/readme --jq .content | base64 -d\n\n# Recent commits\ngh api /repos/$GITHUB_USERNAME/{repo}/commits?per_page=5\n\n# Repo metadata (description, language, stars, forks)\ngh api /repos/$GITHUB_USERNAME/{repo}\n```\n\n---\n\n## Draft Generation Rules\n\n### Voice & Tone\n\n- First-person perspective\n- Authentic, technical, no hype\n- Show the work, not the dream\n\n### Banned Words\n\nNEVER use: Revolutionize, Supercharge, Game-changer, 10x, Viral, Hacks, Disrupt, Groundbreaking, Revolutionary, Mind-blowing\n\n### Reddit Draft\n\n**Target subreddits:** r/SideProject, r/coolgithubprojects (pick based on repo type)\n\n**Format:**\n```\nTitle: [Concise, descriptive — what it does]\n\nBody:\n## The Problem\n[1-2 sentences: what pain point this solves]\n\n## What I Built\n[2-3 sentences: what the repo does, key features]\n\n## How It Works\n[Brief technical overview, stack/approach]\n\n## What I Learned\n[1-2 genuine takeaways from building this]\n\nGitHub: https://github.com/{username}/{repo}\n\nHappy to answer questions!\n```\n\n### Twitter Draft\n\n**Format:** 1-3 tweets, concise and punchy.\n\n```\nTweet 1: [Hook — what problem + what I built]\nTweet 2: [Key technical detail or interesting finding]\nTweet 3: [Link + invitation to check it out]\n\nGitHub: https://github.com/{username}/{repo}\n```\n\nKeep each tweet under 280 chars. Natural flow.\n\n---\n\n## Approval Flow\n\n### Send Draft to User\n\n```\nNew project detected!\n\n{repo_name}\n{description}\n\n--- Reddit Draft (r/{subreddit}) ---\n{reddit_draft}\n\n--- Twitter Draft ---\n{twitter_draft}\n\nReply \"post\" to publish both, or tell me what to change.\n```\n\n### User Responses\n\n| User says | Action |\n|-----------|--------|\n| \"post\" / \"send\" / \"go\" | Publish to Reddit + Twitter |\n| \"reddit only\" | Publish Reddit only |\n| \"twitter only\" | Publish Twitter only |\n| \"change X to Y\" | Revise draft and re-send |\n| No reply | Do nothing. NEVER auto-post. |\n\n---\n\n## Publishing\n\n### Reddit\n\nUse AppleScript Chrome automation (see `reddit-cultivate` skill):\n\n1. Get modhash from `/api/me.json`\n2. POST to `/api/submit` with:\n   - `sr`: subreddit name\n   - `kind`: \"self\"\n   - `title`: post title\n   - `text`: post body (markdown)\n   - `uh`: modhash\n\n### Twitter\n\nUse Twikit:\n\n```bash\ncd ~/crawlee-social-scraper  # or wherever your Twikit setup lives\nsource venv/bin/activate\npython3 -c \"\nimport asyncio\nfrom twikit import Client\n\nasync def post():\n    client = Client('en-US')\n    client.load_cookies('twitter_cookies.json')\n    await client.create_tweet(text='''TWEET_TEXT_HERE''')\n\nasyncio.run(post())\n\"\n```\n\n### After Publishing\n\n1. Record published URLs in `memory/github-monitor-state.json` under `posted_repos`\n2. Log to daily memory file `memory/YYYY-MM-DD.md`\n3. Report back: \"Published! Reddit: [url] | Twitter: [url]\"\n\n---\n\n## State File\n\nLocation: `memory/github-monitor-state.json`\n\n```json\n{\n  \"github_username\": \"yourusername\",\n  \"last_checked\": \"2026-01-01T09:00:00Z\",\n  \"known_repos\": {\n    \"repo_name\": {\n      \"created_at\": \"2026-01-01T16:37:12Z\",\n      \"last_pushed_at\": \"2026-01-01T17:58:31Z\",\n      \"last_known_commits\": 5,\n      \"stars\": 1\n    }\n  },\n  \"posted_repos\": [\"repo_name\"],\n  \"star_milestones_notified\": {\n    \"repo_name\": [10]\n  }\n}\n```\n\n---\n\n## First Run Behavior\n\nOn the very first run (when `last_checked` is null):\n\n1. Fetch all public repos\n2. Record them ALL in `known_repos` (baseline snapshot)\n3. Do NOT trigger any notifications\n4. Reply: \"First sync complete. Recorded {N} public repos. Will notify you of new repos and significant updates going forward.\"\n\n---\n\n## Cron Schedule\n\nRuns 3x daily: 09:00, 15:00, 21:00 (your local time)\n\nIf nothing new: reply `HEARTBEAT_OK` (no notification).\n\n---\n\n## Star Milestones\n\nWhen a repo crosses a milestone, send a celebratory notification:\n\n```\nYour repo {repo_name} just hit {milestone} stars!\n\nCurrent: {stars} stars | {forks} forks\n\nWant me to draft a \"milestone update\" post?\n```\n\nMilestones: 10, 50, 100, 500, 1000, 5000, 10000","tags":["github","monitor","claude","agent","skills","phy041","agent-skills","ai-agents","automation","founder","indie-hacker","openclaw"],"capabilities":["skill","source-phy041","skill-github-monitor","topic-agent-skills","topic-ai-agents","topic-automation","topic-claude","topic-founder","topic-indie-hacker","topic-openclaw","topic-social-media"],"categories":["claude-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/PHY041/claude-agent-skills/github-monitor","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add PHY041/claude-agent-skills","source_repo":"https://github.com/PHY041/claude-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 13 github stars · SKILL.md body (5,113 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-04-22T13:03:32.144Z","embedding":null,"createdAt":"2026-04-19T00:41:09.630Z","updatedAt":"2026-04-22T13:03:32.144Z","lastSeenAt":"2026-04-22T13:03:32.144Z","tsv":"'-01':568,569,580,581,589,590 '-2':292,322 '-3':303,340 '/api/me.json':469 '/api/submit':473 '/commits':217 '/crawlee-social-scraper':494 '/readme':204 '/repos':200,213,229 '/users':114,131 '00':571,669,671,673 '00z':572 '09':668 '1':101,291,321,339,346,465,533,599,623 '10':121,138,185,609,719 '100':187,721 '1000':189,723 '10000':725 '10x':261 '12z':584 '15':670 '2':139,302,354,470,542,628 '2026':567,579,588 '21':672 '280':377 '3':147,175,362,549,637 '31z':593 '37':583 '3x':666 '4':190,643 '5':220,597 '50':186,720 '500':188,722 '5000':724 '58':592 'action':418 'answer':334 'api':113,130,199,212,228 'appear':48 'applescript':457 'approv':20,60,381 'async':511 'asyncio':506 'asyncio.run':529 'authent':242 'auto':452 'auto-post':451 'autom':459 'await':522 'back':551 'ban':252 'base':277 'base64':207 'baselin':635 'bash':78,105,195,492 'behavior':612 'blow':269 'bodi':288,485 'brief':314 'build':326 'built':95,301,352 'c':504 'cd':493 'celebratori':695 'chang':173,413,436 'changer':260 'char':378 'check':25,180,366,566,620 'chrome':458 'client':510,514,515 'client.create':523 'client.load':519 'commit':177,210,596 'compar':140,146 'complet':647 'concis':283,342 'condit':149,155 'configur':61 'content':87,192,206 'cooki':520 'core':83 'creat':118,162,577 'creation':110 'cron':663 'cross':184,690 'cultiv':463 'current':103,705 'd':208 'daili':545,667 'date':111,128 'def':512 'descript':223,284,392 'detail':357 'detect':99,158,389 'disrupt':264 'draft':17,56,154,194,233,271,337,384,394,398,400,402,441,713 'dream':251 'en':517 'en-us':516 'env':76 'export':79 'fabric':90 'featur':310 'fetch':102,624 'file':72,547,558 'find':360 'first':239,610,616,645 'first-person':238 'flow':380,382 'fork':226,708,709 'format':281,338 'forward':662 'game':259 'game-chang':258 'gather':191 'generat':14,53,234 'genuin':323 'get':466 'gh':112,129,198,211,227 'github':2,6,27,28,34,37,43,64,80,115,132,201,214,230,328,369,562 'github-monitor':1 'github.com':329,370 'go':421,661 'groundbreak':265 'hack':263 'happen':52 'happi':332 'heartbeat':681 'hit':702 'hook':347 'hype':245 'import':505,509 'interest':359 'invit':364 'jq':205 'json':561 'keep':373 'key':309,355 'kind':478 'known':167,573,595,633 'languag':224 'last':179,565,585,594,619 'learn':320 'link':363 'live':500 'local':675 'locat':559 'log':543 'logic':100 'markdown':486 'media':55 'memori':546 'memory/github-monitor-state.json':144,538,560 'memory/yyyy-mm-dd.md':548 'metadata':222 'mileston':182,605,686,692,703,715,718 'mind':268 'mind-blow':267 'modhash':467,488 'monitor':3,4,29,35,38,40 'n':649 'name':391,477,576,603,608,700 'natur':379 'never':254,450 'new':9,30,46,106,159,176,387,656,679 'newer':164 'noth':449,678 'notif':642,684,696 'notifi':606,653 'null':622 'ok':682 'one':151 'overview':316 'page':120,137,219 'pain':295 'per':119,136,218 'person':240 'perspect':241 'pick':276 'point':296 'post':18,98,404,419,453,471,481,484,513,530,540,600,717 'principl':84 'problem':290,349 'product':85 'project':10,388 'public':42,160,626,650 'publish':22,406,422,428,433,454,532,535,552 'punchi':344 'push':127,135,171,586 'python3':503 'question':335 'r':395 'r/coolgithubprojects':275 'r/sideproject':274 're':444 're-send':443 'read':143,196 'readm':197 'recent':122,209 'record':534,629,648 'reddit':15,270,393,397,424,426,429,455,462,553 'reddit-cultiv':461 'repli':403,447,644,680 'repo':7,31,44,47,104,107,124,161,168,203,216,221,232,279,307,331,372,390,541,574,575,601,602,607,627,634,651,657,689,698,699 'report':550 'request':36 'respons':415 'revis':440 'revolution':256 'revolutionari':266 'rule':235 'run':611,617,665 'say':417 'schedul':664 'see':460 'self':479 'send':58,383,420,445,693 'sentenc':293,304 'set':62 'setup':499 'show':246 'signific':12,50,169,659 'sinc':178 'skill':39,464 'skill-github-monitor' 'snapshot':636 'social':54,97 'solv':298 'sort':108,117,125,134 'sourc':501 'source-phy041' 'sr':475 'stack/approach':317 'star':181,183,225,598,604,685,704,706,707 'state':71,142,557 'stori':91 'subreddit':273,396,476 'supercharg':257 'sync':646 't09':570 't16':582 't17':591 'takeaway':324 'target':272 'technic':243,315,356 'tell':409 'text':483,525,527 'time':676 'titl':282,480,482 'tone':237 'top':68 'topic-agent-skills' 'topic-ai-agents' 'topic-automation' 'topic-claude' 'topic-founder' 'topic-indie-hacker' 'topic-openclaw' 'topic-social-media' 'translat':92 'trigger':23,148,152,640 'tweet':341,345,353,361,375,524,526 'twikit':491,498,508 'twitter':16,336,399,401,425,431,434,489,555 'twitter_cookies.json':521 'type':280 'uh':487 'updat':13,51,123,170,660,716 'url':536,554,556 'us':518 'use':255,456,490 'user':386,414,416 'usernam':65,81,202,215,231,330,371,563 'username/repos':116,133 'var':77 'venv/bin/activate':502 'viral':262 'voic':236 'want':710 'wherev':496 'word':253 'work':248,313 'x':437 'y':439 'yourusernam':82,564","prices":[{"id":"192848c9-7874-4c1e-aaab-a6887e3b7693","listingId":"f59008fe-c1cd-4ad0-98aa-6bde6998aca1","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"PHY041","category":"claude-agent-skills","install_from":"skills.sh"},"createdAt":"2026-04-19T00:41:09.630Z"}],"sources":[{"listingId":"f59008fe-c1cd-4ad0-98aa-6bde6998aca1","source":"github","sourceId":"PHY041/claude-agent-skills/github-monitor","sourceUrl":"https://github.com/PHY041/claude-agent-skills/tree/main/skills/github-monitor","isPrimary":false,"firstSeenAt":"2026-04-19T00:41:09.630Z","lastSeenAt":"2026-04-22T13:03:32.144Z"}],"details":{"listingId":"f59008fe-c1cd-4ad0-98aa-6bde6998aca1","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"PHY041","slug":"github-monitor","github":{"repo":"PHY041/claude-agent-skills","stars":13,"topics":["agent-skills","ai-agents","automation","claude","founder","indie-hacker","openclaw","social-media"],"license":null,"html_url":"https://github.com/PHY041/claude-agent-skills","pushed_at":"2026-02-24T15:25:20Z","description":"Collection of Claude Code Agent Skills for founders, indie hackers, and growth engineers","skill_md_sha":"009b6f277415ca28728bf92d32834ba535e1ef1b","skill_md_path":"skills/github-monitor/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/PHY041/claude-agent-skills/tree/main/skills/github-monitor"},"layout":"multi","source":"github","category":"claude-agent-skills","frontmatter":{"name":"github-monitor","description":"Monitor your GitHub repos for new projects and significant updates. Generates Reddit + Twitter draft posts for approval before publishing. Triggers on \"check my github\", \"github monitor\", \"new repos\", or any GitHub monitoring request."},"skills_sh_url":"https://skills.sh/PHY041/claude-agent-skills/github-monitor"},"updatedAt":"2026-04-22T13:03:32.144Z"}}