$npx -y skills add PHY041/claude-agent-skills --skill github-monitorMonitor 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.
| 1 | # GitHub Monitor Skill |
| 2 | |
| 3 | Monitor your public GitHub repos. When new repos appear or significant updates happen, generate social media drafts and send for approval. |
| 4 | |
| 5 | --- |
| 6 | |
| 7 | ## Configuration |
| 8 | |
| 9 | Set your GitHub username at the top of your state file or as an env var: |
| 10 | |
| 11 | ```bash |
| 12 | export GITHUB_USERNAME="yourusername" |
| 13 | ``` |
| 14 | |
| 15 | --- |
| 16 | |
| 17 | ## Core Principle |
| 18 | |
| 19 | **Product is content.** Don't fabricate stories. Translate "what I built" into social posts. |
| 20 | |
| 21 | --- |
| 22 | |
| 23 | ## Detection Logic |
| 24 | |
| 25 | ### 1. Fetch Current Repos |
| 26 | |
| 27 | ```bash |
| 28 | # New repos (sorted by creation date) |
| 29 | gh api /users/$GITHUB_USERNAME/repos?sort=created&per_page=10 |
| 30 | |
| 31 | # Recently updated repos (sorted by push date) |
| 32 | gh api /users/$GITHUB_USERNAME/repos?sort=pushed&per_page=10 |
| 33 | ``` |
| 34 | |
| 35 | ### 2. Compare Against State |
| 36 | |
| 37 | Read `memory/github-monitor-state.json` and compare. |
| 38 | |
| 39 | ### 3. Trigger Conditions (any one triggers a draft) |
| 40 | |
| 41 | | Condition | How to Detect | |
| 42 | |-----------|---------------| |
| 43 | | New public repo | `created_at` newer than any known repo | |
| 44 | | Significant update | `pushed_at` changed AND >= 3 new commits since last check | |
| 45 | | Star milestone | Stars crossed 10, 50, 100, 500, 1000 | |
| 46 | |
| 47 | ### 4. Gather Content for Draft |
| 48 | |
| 49 | ```bash |
| 50 | # Read README |
| 51 | gh api /repos/$GITHUB_USERNAME/{repo}/readme --jq .content | base64 -d |
| 52 | |
| 53 | # Recent commits |
| 54 | gh api /repos/$GITHUB_USERNAME/{repo}/commits?per_page=5 |
| 55 | |
| 56 | # Repo metadata (description, language, stars, forks) |
| 57 | gh api /repos/$GITHUB_USERNAME/{repo} |
| 58 | ``` |
| 59 | |
| 60 | --- |
| 61 | |
| 62 | ## Draft Generation Rules |
| 63 | |
| 64 | ### Voice & Tone |
| 65 | |
| 66 | - First-person perspective |
| 67 | - Authentic, technical, no hype |
| 68 | - Show the work, not the dream |
| 69 | |
| 70 | ### Banned Words |
| 71 | |
| 72 | NEVER use: Revolutionize, Supercharge, Game-changer, 10x, Viral, Hacks, Disrupt, Groundbreaking, Revolutionary, Mind-blowing |
| 73 | |
| 74 | ### Reddit Draft |
| 75 | |
| 76 | **Target subreddits:** r/SideProject, r/coolgithubprojects (pick based on repo type) |
| 77 | |
| 78 | **Format:** |
| 79 | ``` |
| 80 | Title: [Concise, descriptive — what it does] |
| 81 | |
| 82 | Body: |
| 83 | ## The Problem |
| 84 | [1-2 sentences: what pain point this solves] |
| 85 | |
| 86 | ## What I Built |
| 87 | [2-3 sentences: what the repo does, key features] |
| 88 | |
| 89 | ## How It Works |
| 90 | [Brief technical overview, stack/approach] |
| 91 | |
| 92 | ## What I Learned |
| 93 | [1-2 genuine takeaways from building this] |
| 94 | |
| 95 | GitHub: https://github.com/{username}/{repo} |
| 96 | |
| 97 | Happy to answer questions! |
| 98 | ``` |
| 99 | |
| 100 | ### Twitter Draft |
| 101 | |
| 102 | **Format:** 1-3 tweets, concise and punchy. |
| 103 | |
| 104 | ``` |
| 105 | Tweet 1: [Hook — what problem + what I built] |
| 106 | Tweet 2: [Key technical detail or interesting finding] |
| 107 | Tweet 3: [Link + invitation to check it out] |
| 108 | |
| 109 | GitHub: https://github.com/{username}/{repo} |
| 110 | ``` |
| 111 | |
| 112 | Keep each tweet under 280 chars. Natural flow. |
| 113 | |
| 114 | --- |
| 115 | |
| 116 | ## Approval Flow |
| 117 | |
| 118 | ### Send Draft to User |
| 119 | |
| 120 | ``` |
| 121 | New project detected! |
| 122 | |
| 123 | {repo_name} |
| 124 | {description} |
| 125 | |
| 126 | --- Reddit Draft (r/{subreddit}) --- |
| 127 | {reddit_draft} |
| 128 | |
| 129 | --- Twitter Draft --- |
| 130 | {twitter_draft} |
| 131 | |
| 132 | Reply "post" to publish both, or tell me what to change. |
| 133 | ``` |
| 134 | |
| 135 | ### User Responses |
| 136 | |
| 137 | | User says | Action | |
| 138 | |-----------|--------| |
| 139 | | "post" / "send" / "go" | Publish to Reddit + Twitter | |
| 140 | | "reddit only" | Publish Reddit only | |
| 141 | | "twitter only" | Publish Twitter only | |
| 142 | | "change X to Y" | Revise draft and re-send | |
| 143 | | No reply | Do nothing. NEVER auto-post. | |
| 144 | |
| 145 | --- |
| 146 | |
| 147 | ## Publishing |
| 148 | |
| 149 | |
| 150 | |
| 151 | Use AppleScript Chrome automation (see `reddit-cultivate` skill): |
| 152 | |
| 153 | 1. Get modhash from `/api/me.json` |
| 154 | 2. POST to `/api/submit` with: |
| 155 | - `sr`: subreddit name |
| 156 | - `kind`: "self" |
| 157 | - `title`: post title |
| 158 | - `text`: post body (markdown) |
| 159 | - `uh`: modhash |
| 160 | |
| 161 | |
| 162 | |
| 163 | Use Twikit: |
| 164 | |
| 165 | ```bash |
| 166 | cd ~/crawlee-social-scraper # or wherever your Twikit setup lives |
| 167 | source venv/bin/activate |
| 168 | python3 -c " |
| 169 | import asyncio |
| 170 | from twikit import Client |
| 171 | |
| 172 | async def post(): |
| 173 | client = Client('en-US') |
| 174 | client.load_cookies('twitter_cookies.json') |
| 175 | await client.create_tweet(text='''TWEET_TEXT_HERE''') |
| 176 | |
| 177 | asyncio.run(post()) |
| 178 | " |
| 179 | ``` |
| 180 | |
| 181 | ### After Publishing |
| 182 | |
| 183 | 1. Record published URLs in `memory/github-monitor-state.json` under `posted_repos` |
| 184 | 2. Log to daily memory file `memory/YYYY-MM-DD.md` |
| 185 | 3. Report back: "Published! Reddit: [url] | Twitter: [url]" |
| 186 | |
| 187 | --- |
| 188 | |
| 189 | ## State File |
| 190 | |
| 191 | Location: `memory/github-monitor-state.json` |
| 192 | |
| 193 | ```json |
| 194 | { |
| 195 | "github_username": "yourusername", |
| 196 | "last_checked": "2026-01-01T09:00:00Z", |
| 197 | "known_repos": { |
| 198 | "repo_name": { |
| 199 | "created_at": "2026-01-01T16:37:12Z", |
| 200 | "last_pushed_at": "2026-01-01T17:58:31Z", |
| 201 | "last_known_commits": 5, |
| 202 | "stars": 1 |
| 203 | } |
| 204 | }, |
| 205 | "posted_repos": ["repo_name"], |
| 206 | "star_miles |