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.
- package/package.json +1 -1
- package/skill/SKILL.md +83 -70
package/package.json
CHANGED
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
|
-
|
|
21
|
+
---
|
|
22
22
|
|
|
23
|
-
|
|
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
|
-
|
|
25
|
+
Before doing anything, read `~/social-autoposter/config.json`. Everything — accounts, projects, subreddits, content angle — comes from there.
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
31
|
+
Key fields you'll use throughout every workflow:
|
|
39
32
|
|
|
40
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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 --
|
|
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
|
|
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
|
-
-
|
|
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
|
|
82
|
-
|
|
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 (
|
|
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
|
|
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
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
153
|
+
### 3. Pick one target community
|
|
142
154
|
|
|
143
|
-
|
|
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
|
|
157
|
-
- [ ] No numbered/bulleted lists — write in paragraphs
|
|
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", "
|
|
160
|
-
- [ ] Contains at least one imperfection: incomplete thought, casual aside,
|
|
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
|
|
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 (?, ?,
|
|
183
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', datetime('now'));
|
|
178
184
|
```
|
|
179
185
|
|
|
180
|
-
For original posts: `thread_url` = `our_url
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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:
|
|
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`.
|
|
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.**
|
|
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
|
|
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.
|
|
245
|
-
10. **Never cross-post.** One post per topic per community.
|
|
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.
|
|
248
|
-
13. **Vary your openings.** Don't always start with credentials
|
|
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
|
|
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
|
|
275
|
+
GOOD title: "just did my 7th course, some things that surprised me"
|
|
263
276
|
|
|
264
|
-
BAD body:
|
|
265
|
-
GOOD body:
|
|
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
|
|
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
|
|