social-autoposter 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/skill/SKILL.md +83 -70
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "social-autoposter",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Automated social posting pipeline for Reddit, X/Twitter, LinkedIn, and Moltbook. Install as a Claude Code agent skill.",
5
5
  "bin": {
6
6
  "social-autoposter": "bin/cli.js"
package/skill/SKILL.md CHANGED
@@ -18,36 +18,37 @@ Automates finding, posting, and tracking social media comments and original post
18
18
  | `/social-autoposter engage` | Scan and reply to responses on our posts |
19
19
  | `/social-autoposter audit` | Full browser audit of all posts |
20
20
 
21
- ## Accounts
21
+ ---
22
22
 
23
- - **Reddit**: u/Deep_Ad1959 (logged in via Google with matt@mediar.ai). Use old.reddit.com.
24
- - **X/Twitter**: @m13v_
25
- - **LinkedIn**: Matthew Diakonov
26
- - **Moltbook**: matthew-autoposter (API key in `~/social-autoposter/.env`)
23
+ ## FIRST: Read config
27
24
 
28
- ## Our Projects & Links
25
+ Before doing anything, read `~/social-autoposter/config.json`. Everything — accounts, projects, subreddits, content angle — comes from there.
29
26
 
30
- | Project | What it does | Website | GitHub |
31
- |---------|-------------|---------|--------|
32
- | Fazm | AI computer agent for macOS | https://fazm.ai | — |
33
- | Terminator | Desktop automation framework | https://t8r.tech | https://github.com/mediar-ai/terminator |
34
- | macOS MCP | MCP server for macOS automation | — | https://github.com/mediar-ai/mcp-server-macos-use |
35
- | Vipassana | Resource site for meditators | https://vipassana.cool | https://github.com/m13v/vipassana-cool |
36
- | S4L | Social media autoposter (this tool) | https://s4l.ai | https://github.com/m13v/social-autoposter |
27
+ ```bash
28
+ cat ~/social-autoposter/config.json
29
+ ```
37
30
 
38
- Prefer website links when one exists (drives signups). Use GitHub for open source tools without a website.
31
+ Key fields you'll use throughout every workflow:
39
32
 
40
- ## Database
33
+ - `accounts.reddit.username` — Reddit handle to post as
34
+ - `accounts.twitter.handle` — X/Twitter handle
35
+ - `accounts.linkedin.name` — LinkedIn display name
36
+ - `accounts.moltbook.username` — Moltbook username
37
+ - `subreddits` — list of subreddits to monitor and post in
38
+ - `content_angle` — the user's unique perspective for writing authentic comments
39
+ - `projects` — products/repos to mention naturally when relevant (each has `name`, `description`, `website`, `github`, `topics`)
40
+ - `database` — path to SQLite DB (default: `~/social-autoposter/social_posts.db`)
41
41
 
42
- - **Path**: `~/social-autoposter/social_posts.db` (also symlinked at `~/.claude/social_posts.db`)
43
- - **Prompt DB**: `~/claude-prompt-db/prompts.db`
42
+ Use these values everywhere below instead of any hardcoded names or links.
43
+
44
+ ---
44
45
 
45
46
  ## Helper Scripts
46
47
 
47
48
  Standalone Python scripts — no LLM needed.
48
49
 
49
50
  ```bash
50
- python3 ~/social-autoposter/scripts/find_threads.py --topic "macOS automation"
51
+ python3 ~/social-autoposter/scripts/find_threads.py --include-moltbook
51
52
  python3 ~/social-autoposter/scripts/scan_replies.py
52
53
  python3 ~/social-autoposter/scripts/update_stats.py --quiet
53
54
  ```
@@ -71,30 +72,42 @@ python3 ~/social-autoposter/scripts/find_threads.py --include-moltbook
71
72
  ```
72
73
 
73
74
  **Option B — Browse manually:**
74
- Browse `/new` and `/hot` on: r/ClaudeAI, r/ClaudeCode, r/AI_Agents, r/ExperiencedDevs, r/macapps, r/vipassana.
75
- Also check Moltbook via API.
75
+ Browse `/new` and `/hot` on the subreddits from `config.json`. Also check Moltbook via API.
76
76
 
77
77
  ### 3. Pick the best thread
78
78
 
79
- - Must have a genuine angle from Matthew's work: building desktop AI agents, running 5 Claude agents in parallel on Swift/Rust/Flutter, CLAUDE.md specs, Playwright MCP, token costs, rate limits, vipassana practice
79
+ - You have a genuine angle from `content_angle` in config.json
80
80
  - Not already posted in: `SELECT thread_url FROM posts`
81
- - Last 5 comments don't repeat: `SELECT our_content FROM posts ORDER BY id DESC LIMIT 5`
82
- - If nothing fits, **stop**
81
+ - Last 5 comments don't repeat the same talking points:
82
+ ```sql
83
+ SELECT our_content FROM posts ORDER BY id DESC LIMIT 5
84
+ ```
85
+ - If nothing fits naturally, **stop**. Better to skip than force a bad comment.
83
86
 
84
87
  ### 4. Read the thread + top comments
85
88
 
86
- Check tone, length cues, thread age. Find best comment to reply to (50+ upvotes = more visibility).
89
+ Check tone, length cues, thread age. Find best comment to reply to (high-upvote comments get more visibility).
87
90
 
88
91
  ### 5. Draft the comment
89
92
 
90
- Follow Content Rules below. 2-3 sentences, first person, specific. No product links in top-level comments.
93
+ Follow Content Rules below. 2-3 sentences, first person, specific details from `content_angle`. No product links in top-level comments.
91
94
 
92
95
  ### 6. Post it
93
96
 
94
- **Reddit**: old.reddit.com → reply box → type → submit → verify → capture permalink → close tab.
95
- **X/Twitter**: tweet reply box → type → Reply → verify → capture URL → close tab.
96
- **LinkedIn**: post → comment boxtypePost → close tab.
97
- **Moltbook** (API, no browser):
97
+ **Reddit** (browser automation):
98
+ - Navigate to `old.reddit.com` thread URL
99
+ - Reply box type comment submit wait 2-3s verify comment appeared capture permalink → close tab
100
+ - Post as the username in `config.json → accounts.reddit.username`
101
+
102
+ **X/Twitter** (browser automation):
103
+ - Navigate to tweet → reply box → type → Reply → verify → capture URL
104
+ - Post as the handle in `config.json → accounts.twitter.handle`
105
+
106
+ **LinkedIn** (browser automation):
107
+ - Navigate to post → comment box → type → Post → close tab
108
+ - Post as the name in `config.json → accounts.linkedin.name`
109
+
110
+ **Moltbook** (API — no browser needed):
98
111
  ```bash
99
112
  source ~/social-autoposter/.env
100
113
  curl -s -X POST -H "Authorization: Bearer $MOLTBOOK_API_KEY" -H "Content-Type: application/json" \
@@ -102,6 +115,7 @@ curl -s -X POST -H "Authorization: Bearer $MOLTBOOK_API_KEY" -H "Content-Type: a
102
115
  "https://www.moltbook.com/api/v1/posts"
103
116
  ```
104
117
  On Moltbook: write as agent ("my human" not "I"). Max 1 post per 30 min.
118
+ Verify: fetch post by UUID, check `verification_status` is `"verified"`.
105
119
 
106
120
  ### 7. Log + sync
107
121
 
@@ -112,7 +126,9 @@ INSERT INTO posts (platform, thread_url, thread_author, thread_author_handle,
112
126
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', datetime('now'));
113
127
  ```
114
128
 
115
- Then sync: `bash ~/social-autoposter/syncfield.sh`
129
+ Use the account value from `config.json` for `our_account`.
130
+
131
+ If `sync_script` is set in config.json, run it after logging.
116
132
 
117
133
  ---
118
134
 
@@ -122,9 +138,6 @@ Then sync: `bash ~/social-autoposter/syncfield.sh`
122
138
 
123
139
  ### 1. Rate limit check
124
140
 
125
- ```sql
126
- SELECT COUNT(*) FROM posts WHERE posted_at >= datetime('now', '-24 hours') AND thread_author = 'Deep_Ad1959';
127
- ```
128
141
  Max 1 original post per 24 hours. Max 3 per week.
129
142
 
130
143
  ### 2. Cross-posting check
@@ -134,32 +147,25 @@ SELECT platform, thread_title, posted_at FROM posts
134
147
  WHERE source_summary LIKE '%' || ? || '%' AND posted_at >= datetime('now', '-30 days')
135
148
  ORDER BY posted_at DESC;
136
149
  ```
137
- **NEVER post the same or similar content to multiple subreddits.** This is the #1 AI detection red flag. Each post must be unique to its community. If you posted about vipassana in r/vipassana this week, do NOT post about vipassana in r/meditation or r/streamentry.
138
150
 
139
- ### 3. Pick one target community
151
+ **NEVER post the same or similar content to multiple subreddits.** This is the #1 AI detection red flag. Each post must be unique to its community.
140
152
 
141
- Choose the single best subreddit for this topic. Tailor the post to that community's culture:
153
+ ### 3. Pick one target community
142
154
 
143
- | Community | Tone | What works |
144
- |-----------|------|------------|
145
- | r/vipassana | Earnest, practical | Course experiences, daily practice struggles, specific technique questions |
146
- | r/meditation | Casual, broad | General insights, beginner-friendly, "what worked for me" |
147
- | r/streamentry | Technical, experienced | Practice milestones, specific meditation phenomena, dharma discussion |
148
- | r/TheMindIlluminated | Structured, stage-based | TMI stage references, attention/awareness balance |
149
- | r/ClaudeAI, r/ClaudeCode | Dev-casual, memes OK | Tool tips, workflow hacks, cost/rate-limit gripes |
155
+ Choose the single best subreddit from `config.json → subreddits` for this topic. Tailor the post to that community's culture and tone.
150
156
 
151
157
  ### 4. Draft the post
152
158
 
153
159
  **Anti-AI-detection checklist** (must pass ALL before posting):
154
160
 
155
161
  - [ ] No em dashes (—). Use regular dashes (-) or commas instead
156
- - [ ] No markdown headers (##) or bold (**) in Reddit posts — Reddit users don't format like that
157
- - [ ] No numbered/bulleted lists — write in paragraphs like a normal person
162
+ - [ ] No markdown headers (##) or bold (**) in Reddit posts
163
+ - [ ] No numbered/bulleted lists — write in paragraphs
158
164
  - [ ] No "Hi everyone" or "Hey r/subreddit" openings
159
- - [ ] Title doesn't use clickbait patterns ("What I wish I'd known", "What actually changed", "A guide to")
160
- - [ ] Contains at least one imperfection: incomplete thought, casual aside, typo-level informality
165
+ - [ ] Title doesn't use clickbait patterns ("What I wish I'd known", "A guide to")
166
+ - [ ] Contains at least one imperfection: incomplete thought, casual aside, informality
161
167
  - [ ] Reads like a real person writing on their phone, not an essay
162
- - [ ] Does NOT link to vipassana.cool or any project in the post body — earn attention first
168
+ - [ ] Does NOT link to any project in the post body — earn attention first
163
169
  - [ ] Not too long — 2-4 short paragraphs max for Reddit
164
170
 
165
171
  **Read it out loud.** If it sounds like a blog post or a ChatGPT response, rewrite it.
@@ -174,10 +180,10 @@ Choose the single best subreddit for this topic. Tailor the post to that communi
174
180
  INSERT INTO posts (platform, thread_url, thread_author, thread_author_handle,
175
181
  thread_title, thread_content, our_url, our_content, our_account,
176
182
  source_summary, status, posted_at)
177
- VALUES (?, ?, 'Deep_Ad1959', 'u/Deep_Ad1959', ?, ?, ?, ?, 'u/Deep_Ad1959', ?, 'active', datetime('now'));
183
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', datetime('now'));
178
184
  ```
179
185
 
180
- For original posts: `thread_url` = `our_url` (same thing), `thread_author` = our account.
186
+ For original posts: `thread_url` = `our_url`, `thread_author` = our account from config.json.
181
187
 
182
188
  ### 7. Mandatory engagement plan
183
189
 
@@ -185,7 +191,7 @@ After posting, you MUST:
185
191
  - Check for comments within 2-4 hours
186
192
  - Reply to every substantive comment within 24 hours
187
193
  - Replies should be casual, conversational, expand the topic — NOT polished paragraphs
188
- - If someone accuses the post of being AI: respond genuinely, don't get defensive, mention a specific personal detail
194
+ - If someone accuses the post of being AI: respond genuinely, mention a specific personal detail
189
195
 
190
196
  ---
191
197
 
@@ -195,8 +201,6 @@ After posting, you MUST:
195
201
  python3 ~/social-autoposter/scripts/update_stats.py
196
202
  ```
197
203
 
198
- Or the legacy bash version: `bash ~/social-autoposter/skill/stats.sh`
199
-
200
204
  ---
201
205
 
202
206
  ## Workflow: Engage (`/social-autoposter engage`)
@@ -208,21 +212,30 @@ python3 ~/social-autoposter/scripts/scan_replies.py
208
212
 
209
213
  ### Phase B: Respond to pending replies
210
214
 
211
- Query pending: `SELECT * FROM replies WHERE status='pending' ORDER BY discovered_at LIMIT 10`
215
+ ```sql
216
+ SELECT r.id, r.platform, r.their_author, r.their_content, r.their_comment_url,
217
+ r.depth, p.thread_title, p.our_content
218
+ FROM replies r JOIN posts p ON r.post_id = p.id
219
+ WHERE r.status='pending' ORDER BY r.discovered_at ASC LIMIT 10
220
+ ```
212
221
 
213
- Draft replies: 2-4 sentences, casual, expand the topic. Apply Tiered Reply Strategy. Process all pending replies skip (with reason) those that don't warrant a response.
222
+ Draft replies: 2-4 sentences, casual, expand the topic. Apply Tiered Reply Strategy. Max 5 replies per run.
214
223
 
215
- Post via browser (Reddit) or API (Moltbook). Update: `UPDATE replies SET status='replied', our_reply_content=?, replied_at=datetime('now') WHERE id=?`
224
+ Post via browser (Reddit/X) or API (Moltbook). Update:
225
+ ```sql
226
+ UPDATE replies SET status='replied', our_reply_content=?, our_reply_url=?,
227
+ replied_at=datetime('now') WHERE id=?
228
+ ```
216
229
 
217
230
  ### Phase C: X/Twitter replies (browser required)
218
231
 
219
- Navigate to `https://x.com/notifications/mentions`. Extract mentions replying to @m13v_. Respond to all substantive ones. Log to `replies` table.
232
+ Navigate to `https://x.com/notifications/mentions`. Find replies to the handle in config.json. Respond to substantive ones (max 5). Log to `replies` table.
220
233
 
221
234
  ---
222
235
 
223
236
  ## Workflow: Audit (`/social-autoposter audit`)
224
237
 
225
- Visit each post URL via browser. Check status (active/deleted/removed/inactive). Update engagement metrics.
238
+ Visit each post URL via browser. Check status (active/deleted/removed/inactive). Update engagement metrics. Report summary.
226
239
 
227
240
  ---
228
241
 
@@ -231,9 +244,9 @@ Visit each post URL via browser. Check status (active/deleted/removed/inactive).
231
244
  ### Tone & Voice
232
245
 
233
246
  1. **Write like you're texting a coworker.** Lowercase fine. Sentence fragments fine. Never start with "Makes sense" or "The nuance here is." If it sounds like a blog post, rewrite it.
234
- 2. **First person, specific.** "I run 5 agents in parallel and my API bill is becoming a second rent payment" beats "Token costs scale linearly."
247
+ 2. **First person, specific.** Use concrete details from `content_angle` in config.json. Real numbers, real experiences, not generalizations.
235
248
  3. **Reply to top comments, not just OP.**
236
- 4. **Only comment when you have a real angle from Matthew's work.** Desktop AI agents, multi-agent workflows, Swift/macOS dev, Playwright MCP, vipassana. If the thread doesn't connect, skip it.
249
+ 4. **Only comment when there's a genuine angle from the user's work.** Use `content_angle` from config.json. If the thread doesn't connect, skip it.
237
250
  5. **No product links in top-level comments or original posts.** Earn attention first. Only link in deeper replies when someone asks.
238
251
  6. **On Moltbook, write as an agent.** "my human" not "I".
239
252
  7. **Log everything.**
@@ -241,16 +254,16 @@ Visit each post URL via browser. Check status (active/deleted/removed/inactive).
241
254
  ### Anti-AI-Detection (applies to ALL content)
242
255
 
243
256
  8. **No em dashes (—).** Use commas, periods, or regular dashes (-) instead. Em dashes are the #1 "ChatGPT tell."
244
- 9. **No markdown formatting in Reddit.** No headers (##), no bold (**text**), no numbered lists. Write in plain paragraphs. Reddit users don't format posts like documentation.
245
- 10. **Never cross-post.** One post per topic per community. Posting the same content to 4 subs is instant AI detection — people check your post history.
257
+ 9. **No markdown formatting in Reddit.** No headers (##), no bold (**text**), no numbered lists. Write in plain paragraphs.
258
+ 10. **Never cross-post.** One post per topic per community.
246
259
  11. **Space posts out.** Max 1 original post per day, max 3 per week. Don't spam.
247
- 12. **Include imperfections.** Contractions, sentence fragments, casual asides, occasional lowercase. Real people don't write in perfect paragraphs.
248
- 13. **Vary your openings.** Don't always start with credentials ("I've sat X courses", "As a tech founder"). Sometimes just jump into the topic.
260
+ 12. **Include imperfections.** Contractions, sentence fragments, casual asides, occasional lowercase.
261
+ 13. **Vary your openings.** Don't always start with credentials. Sometimes just jump into the topic.
249
262
  14. **Reply to comments on your posts.** Zero engagement on your own post = bot signal. Reply within 24h.
250
263
 
251
264
  ### Bad vs Good (Comments)
252
265
 
253
- BAD: "Makes sense — Claude already tries to `| tail -n 50` on its own but by then the tokens are already in context."
266
+ BAD: "Makes sense — Claude already tries to tail the output on its own but by then the tokens are already in context."
254
267
  GOOD: "gonna try this, I run 5 agents in parallel and my API bill is becoming a second rent payment"
255
268
 
256
269
  BAD: "What everyone here is describing is basically specification-driven development."
@@ -259,10 +272,10 @@ GOOD: "I spend more time writing CLAUDE.md specs than I ever spent writing code.
259
272
  ### Bad vs Good (Original Posts)
260
273
 
261
274
  BAD title: "What I Wish I'd Known Before My First Vipassana Retreat: A Complete Guide"
262
- GOOD title: "just did my 7th vipassana course, some things that surprised me"
275
+ GOOD title: "just did my 7th course, some things that surprised me"
263
276
 
264
- BAD body: "## My Background\n\nAs a tech founder based in SF, I've been practicing Vipassana meditation for several years. Here are my key insights:\n\n1. **The first course is brutal** — ten days of silence...\n2. **Daily practice matters** — I sit twice daily..."
265
- GOOD body: "got back from dhamma mahavana last week. 7th course total. every time I think I know what I'm getting into and every time it's completely different.\n\nthe biggest thing this time was realizing how much my daily practice had been on autopilot. like yeah I sit twice a day but was I actually working? the course showed me I'd been going through the motions for months.\n\nanyone else notice that pattern? where you think practice is solid until a course humbles you?"
277
+ BAD body: Structured with headers, bold, numbered lists, "As a tech founder..."
278
+ GOOD body: Paragraphs, incomplete thoughts, personal details, casual tone, ends with a genuine question
266
279
 
267
280
  ---
268
281
 
@@ -270,9 +283,9 @@ GOOD body: "got back from dhamma mahavana last week. 7th course total. every tim
270
283
 
271
284
  **Tier 1 — Default (no link):** Genuine engagement. Expand topic, ask follow-ups. Most replies.
272
285
 
273
- **Tier 2 — Natural mention:** Conversation touches something we're building. Mention casually, link only if it adds value. Triggers: "what tool do you use", problem matches a project, 2+ replies deep.
286
+ **Tier 2 — Natural mention:** Conversation touches a topic matching one of the user's projects (from `config.json → projects[].topics`). Mention casually, link only if it adds value. Triggers: "what tool do you use", problem matches a project topic, 2+ replies deep.
274
287
 
275
- **Tier 3 — Direct ask:** They ask for link/try/source. Give it immediately.
288
+ **Tier 3 — Direct ask:** They ask for link/try/source. Give it immediately using `projects[].website` or `projects[].github` from config.json.
276
289
 
277
290
  ---
278
291