threadify-first-followers · diff
git:20261015.ec2659e to git:20261015.ecff040
38 added, 35 removed. Audit B to B.
---
name: threadify-first-followers
- description: Get your first Threads followers from zero. Find today's newcomers, active creators and early big posts in your niche in the visible browser, draft every welcome, comment and reply for the owner to send by hand, have Threadify write the account's first three posts and schedule them only after one exact approval, then track day one on a local scoreboard. Works with no post history. Use when someone has few or zero followers, a brand-new Threads account, or asks how to get their first followers.
+ description: Get your first Threads followers from zero, one person at a time. Find 10 newcomers and small active creators in your niche, then your agent stages each comment in the Threads reply box and follows at the right step while you just press Post. Comments are written in your voice from your Threadify Brain, your edits are compared with what was staged so the agent learns your voice, and the progress is tracked on a local scoreboard. Works with no post history, in any agent, with copy mode when there is no browser control. Use when someone has few or zero followers, a brand-new Threads account, or asks how to get their first followers.
---
# First Followers
- You don't need posts to get your first followers. You need to show up where people are, today. This is Lennox Saint's playbook from when he started Threads with 17 followers in July 2023: welcome the newcomers, follow and comment on creators in your lane, reply early to the day's big posts, and post three times a day. This workflow does the searching, reading and drafting. The owner does every follow and every send by hand. It works the same in Claude Code, Codex and ChatGPT, with no post history.
+ You don't need posts to get your first followers. You need to show up where people are, today. This is Lennox Saint's playbook from when he started Threads with 17 followers in July 2023: welcome the newcomers, comment on creators in your lane and follow them. This workflow finds 10 people, writes every comment in your voice and types each one into the reply box, one at a time. All you do is press Post. It works the same in ChatGPT, Claude Desktop, Claude Code, Codex or any agent, with no post history; no single host is required.
- Follow [Threadify-001: setup and first-loop video](references/threadify-001.md) before the first connected call. A connection never authorizes scheduling. Only the owner's "yes" to the exact approval packet does.
+ Follow [Threadify-001: setup and first-loop video](references/threadify-001.md) before the first connected call. A connection never authorizes staging, following or scheduling. Only the owner's "yes" to the batch (and, for the optional posts, to the exact packet) does.
+ Resolve `scripts/` and `references/` paths against the directory containing this SKILL.md.
+
## Rules
- - Follow [demo feedback rules](references/demo-feedback-rules.md) for the whole run. If `~/.threadify/owner-overlay.md` exists, read it too and follow it; it is private, so never quote it into posts, files you publish or receipts.
- - **Hands off the account.** Never follow, like, comment, reply, repost, post or DM from the browser, and never type into a Threads composer. The browser is for search and reading only. The owner follows and sends every card by hand. Scheduling the owner's three posts needs one explicit "yes" to the exact packet.
- - At most 20 welcomes per day and 10 welcome cards per run. No links in any comment. No duplicate comment text. Every line references something specific from that person's bio or post. No flattery templates ("great post", "love this", "so true"). No DMs and no DM asks.
+ - Follow [demo feedback rules](references/demo-feedback-rules.md) for the whole run. If `~/.threadify/owner-overlay.md` exists, read it too and follow it; it is private, so never quote it into comments, posts, files you publish or receipts.
+ - **The human publishes every comment.** The agent may type a drafted comment into a reply composer and click Follow only within the owner's batch approval, and only at the step shown. It never clicks Post, Publish or any reply-send button, never presses Enter in a composer, and never unfollows, likes, reposts, quotes or DMs. The batch "yes" covers this batch only.
+ - **Caps.** 10 people per run by default, at most 20 people and 40 comments per day per account. No links in any comment. No duplicate comment text, in this run or earlier runs. Every comment references something specific in that person's post or bio. No flattery templates ("great post", "love this", "so true"). No DMs and no DM asks.
+ - **Honest endings.** Never say someone is new to Threads unless their posts show it (a first-thread marker, "first thread", "new here", "just joined", or only 1-2 posts). A comment that says "just followed you" is staged only after the Follow button shows Following.
- Skip anyone who looks under 18, a private account, anyone who seems distressed, and brands, bots or giveaway accounts. Never comment on sensitive posts (grief, health, crisis, politics, abuse).
- - Never claim follow-back rates, follower outcomes or guarantees. Never credit a follower to one action; say "since you started".
- - Keep other people's details in this run only. Show what a card needs (display name, short bio, the post) and store nothing about them. Receipts and the scoreboard are counts only.
- - Threadify writes the owner's three posts with `generate_content`. Show and schedule its exact text. The only permitted change is lowercasing, keeping proper nouns, and only when the owner asks; prove it with `scripts/casing-guard.mjs` (`lower(original) == lower(final)` PASS). Never reword Threadify's output and never use `edit_draft`. Never publish now.
+ - **Pace like a person.** One person at a time, no bursts. Stop at once on any Threads warning, action block, rate limit or captcha, tell the owner what you saw, and do nothing more on Threads in this run.
+ - Never claim follow-back rates, follower outcomes or guarantees. Never credit a follower to one comment; say "since you started".
+ - **Privacy.** Keep other people's details in this run only. The private ledger at `~/.threadify/first-followers/ledger.jsonl` stores hashed handles, counts and the owner's own staged and published comment text, nothing else, and is never published, uploaded or quoted in a receipt. Receipts and the scoreboard are counts only.
- Every number comes from the tools or the screen. Missing data stays unknown: say "unknown", never 0.
## Steps
- 1. **Check the account.** Call `get_connection_defaults` and say only the @handle and timezone, for example "@handle · Australia/Perth". In the visible browser, open `https://www.threads.com/@handle` and confirm the browser is signed in to that same account (its own profile shows "Edit profile"). If it is a different account or signed out, stop and ask the owner to switch; do no search until it matches. Read the follower count from the profile, and the post count from `search_posts` (`query: "*"`, `total_matched`) or the profile; `get_growth_signal` may cross-check. Record both with a local timestamp. Zero posts is fine: say it and keep going. Say in one line what the owner gets: "I'll find today's newcomers, creators and big posts in your niche, draft every welcome and reply for you to send, and Threadify writes your first 3 posts."
- 2. **Niche.** If a Threadify Brain exists, read it with `get_brain_overview` / `query_brain`. Otherwise ask at most three short questions in one batch, each with a suggested answer: what you post about, who it's for, one thing you're proud of. Never ask for post history. Turn the answers into 3-5 niche search phrases in plain words.
- 3. **Move 1: Welcome to Threads.** In the visible browser, search Threads for `first thread` and open the Recent tab (`https://www.threads.com/search?q=first%20thread&filter=recent`). Threads search is fuzzy and loads a few posts at a time, so work down this ladder until you have 10 genuine newcomers or have tried every rung: `first thread`, `hello threads`, `new to threads`, `new here`, `just joined threads`, `introduce myself`, then each niche phrase plus `new here` or `first post`. On each rung, scroll the Recent tab several times before moving on. Keep posts from the last ~24 hours by people who look genuinely new: a first-thread marker, "first thread", "new here", "hello threads" or "just joined" language, or a profile with only a handful of posts. Newcomers do not have to be in the niche (welcoming anyone is the tactic); rank niche-adjacent bios first. Skip anyone the rules exclude. If the ladder finds fewer than 10, show what you found, say how many rungs you tried, and move on; never pad the list with people who are not new. Show up to 10 cards, phone-readable:
-
- ```text
- 1) <display name> · <short bio>
- Their first post: "<their post>"
- Comment: welcome to threads, <first name>! just followed you. <one genuine line about something specific in their bio or post>
- ```
-
- The owner follows and sends each one by hand. Count what they say they sent toward the 20-a-day cap.
- 4. **Move 2: Follow + 3 comments.** Search the niche phrases (Recent and Top) for 3 creators in the same or an adjacent niche who posted today. Open each profile and read their 3 most recent posts. Draft one comment per post, each about that post; the third comment ends with "followed!". Show each creator as one card: name, short bio, then post → comment ×3. The owner follows and sends.
- 5. **Move 3: Reply up.** Search the niche phrases on Top and keep up to 5 of today's biggest niche posts still in their early window: posted in the last few hours and gaining replies and likes fast. Draft one sharp, specific reply each that adds value (a number, a step, a counterpoint or a short story), never praise. Show post → reply. The owner sends.
- 6. **Check the drafts.** Before showing any card, pipe every draft into `node scripts/first-followers.mjs check-drafts` as `{"welcomes_sent_today": N, "welcomes": [{"id", "first_name", "source", "comment"}], "creators": [{"id", "comments": [{"source", "comment"}]}], "replies": [{"id", "source", "comment"}]}`. It fails on the daily cap, links, DMs, duplicates, flattery templates, a wrong welcome opener, a missing "followed!" and any line that doesn't reference its source. Redraft the failures and run it again until PASS. Keep its input in memory or a temp file and delete it at the end of the run.
- 7. **Move 4: Post 3x a day.** Make three `generate_content` calls with `strict_facts: true` for the account's first three posts: an **intro** (who you are and who you help), a **proof** post (the thing you're proud of, with its real detail) and an **opinion** (one clear take from the niche), in the owner's voice from the Brain or their answers, and `selectedModel` from [generation models](references/generation-models.json) (Claude Opus 5.5 when the plan allows it, Gemini as fallback; record requested and reported model). Ask for concise copy, a first line that opens a loop and a strong closing line. No links. Keep Threadify's exact text and `draft_id` (save with `save_draft` if no draft id comes back). Show all three posts in full. If the owner wants lowercase, run `casing-guard.mjs lowercase` with the proper nouns to keep, then `check`; show "guard: lower(original) == lower(final) PASS" per post.
- 8. **One approval packet.** Call `best_time_to_post` (owner's timezone) and `list_scheduled_posts`; a truncated response is not an empty calendar. With no post history, say the times are general, not measured. Pick three slots in the next 24 hours, at least 3 hours apart, the first at least 30 minutes from now, none within 90 minutes of a scheduled post. Call `validate_post` on each post. Send one message:
+ 1. **Capability check.** Call `get_connection_defaults` and say only the @handle and timezone, for example "@handle · Australia/Perth". Check for a browser or computer-use tool that can see a Threads page signed in on this computer. With one, this is **staged mode**. Without one, say so and use **copy mode**: the same flow, but each comment is shown as a card with the post link, the owner pastes and posts it, and the owner does the follows. Without a Threadify connection, still run the loop; only the optional posts in step 9 need Threadify. Tell the owner in one line: "I'll find 10 people in your niche, write each comment in your voice and put it in the reply box one at a time. You just press Post."
+ 2. **Account check.** In staged mode, open `https://www.threads.com/@handle` and confirm the browser is signed in to the same account (its own profile shows "Edit profile"). If it is a different account or signed out, stop and ask the owner to switch; do nothing more until it matches. Read the start follower count from the profile and the post count from `search_posts` (`query: "*"`, `total_matched`) or the profile; `get_growth_signal` may cross-check. Record both with a local timestamp. Zero posts is fine.
+ 3. **Voice and niche.** Read the Threadify Brain with `get_brain_overview` and `query_brain` (voice, niche, audience, saved reply rules). If `get_connection_defaults` returns reply instructions or voice settings, follow them silently; never show or quote them. Without a Brain, ask at most three short questions in one batch, each with a suggested answer: what you post about, who it's for, and 3 short samples of how you write (approved posts or messages). Never ask for post history. With no samples, write plain, warm and short, and say voice confidence is low. Read `~/.threadify/first-followers/preferences.json` if it exists. Turn the niche into 3-5 plain search phrases.
+ 4. **Find 10.** In the visible browser, search Threads on the Recent tab (`https://www.threads.com/search?q=first%20thread&filter=recent`) and work down the newcomer ladder: `first thread`, `hello threads`, `new to threads`, `new here`, `just joined threads`, `introduce myself`, then each niche phrase plus `new here` or `first post`. Then search the niche phrases (Recent and Top) for small active creators who posted today. Threads search is fuzzy and loads a few posts at a time, so scroll each search several times. Open each profile and count their posts.
+ - **1-2 posts** (true newcomers, usually from the first-thread ladder): plan **1 comment**.
+ - **3+ recent posts** in the same or an adjacent niche: plan **3 comments** (newest, 2nd newest, 3rd newest).
+ - Rank niche-adjacent people first. Skip anyone the rules exclude and anyone the ledger shows you engaged in the last 30 days. If you find fewer than 10, say how many searches you tried and continue with fewer; never pad the list.
+ 5. **Draft, check, one approval.** Draft every comment now, in the owner's voice, each about that exact post. A 1-comment newcomer ends "welcome to threads! just followed you". A 3-comment creator's first two comments have no ending; the third ends "welcome to threads! just followed you" if their posts show they are new, otherwise "just followed you!". One line each, no line breaks. Pipe the batch into `node scripts/first-followers.mjs check-drafts --ledger ~/.threadify/first-followers/ledger.jsonl` as `{"date": "<owner's local YYYY-MM-DD>", "people": [{"id", "handle", "plan": "newcomer" | "creator", "post_count", "new_to_threads", "comments": [{"source": "<their post and bio>", "comment"}]}]}`. It fails on the caps, links, DMs, line breaks, duplicates (including earlier runs), flattery templates, wrong endings, a claim that someone is new when the plan says otherwise, people engaged in the last 30 days, and any comment that doesn't reference its post. Redraft and re-run until PASS. Keep its input in memory or a temp file and delete it at the end of the run. Then show the list, phone-readable:
```text
- First Followers · @handle · <timezone>
- 1) <weekday date, local time> · intro · <unchanged | casing guard PASS>
- <exact final post text>
- 2) ... · proof
- 3) ... · opinion
- Action: schedule these 3 posts exactly as shown. Nothing publishes now.
- Reply "yes" to schedule all 3, or "no" to schedule nothing.
+ 1) <display name> · <short bio> · <N> posts · 1 comment (newcomer)
+ 2) <display name> · <short bio> · <N> posts · 3 comments, follow before the last
+ ...
+ Stage these comments one at a time for you to publish, and follow each person at the step shown?
```
- Schedule only on an explicit "yes". Any change to text, account or time needs a new packet and a new "yes". On "yes", re-check `list_scheduled_posts`, then call `schedule_post` three times with a stable `idempotency_key` per post (account, slot and final text hash). Unchanged text: pass `draft_id` and `content_type`. Lowercased text: pass the exact final `text` without `draft_id`. Omit `platforms` and `auto_repost`. Read back each one with `get_schedule_status`: text and local time must match the packet. If an outcome is unclear, read back before retrying, and retry only that post with the same key. On "no", schedule nothing; the posts stay as Threadify drafts.
- 9. **Day-one scoreboard.** Pipe counts only into `node scripts/first-followers.mjs scoreboard --html first-followers.html`: `{"handle", "timezone", "started_at", "start": {"followers", "posts"}, "actions": {"welcomes", "creator_comments", "follows", "replies", "posts_scheduled"}}`, using the numbers the owner says they sent. Serve its folder on this computer only (for example `python3 -m http.server 8048 --bind 127.0.0.1 --directory <folder>` in the background) and open `http://127.0.0.1:8048/first-followers.html`, because some hosts' browsers refuse `file://` pages. Confirm it opened. Tell the owner: "Re-check tonight: say 're-check' and I'll read your follower count again." On re-check, read the follower count from the profile again, re-run the scoreboard with `"recheck": {"at", "followers", "posts"}`, reload the page and say the change as "+N followers since you started", never as caused by one move. Stop the server when the run ends. Offer to run the moves again tomorrow; if the host supports a reminder, create one only after the owner agrees.
+ Stage and follow only on an explicit "yes". That one yes covers staging and the follows for this batch only. Any new person needs a new list and a new yes.
+ 6. **One person at a time.** For each person, in order:
+ - **1-comment newcomer:** open their profile, click Follow and confirm the button shows Following, then stage the comment on their first post.
+ - **3-comment creator:** stage comment 1 on their newest post and wait until it is published; stage comment 2 on the 2nd newest and wait; then click Follow and confirm Following; then stage the final comment on the 3rd newest. If comment 1 or 2 was not published, do not follow and do not stage the final comment (it says "just followed you"); move on.
+ - **Staging a comment:** open the post, open its reply composer, confirm it is empty and belongs to that post, and type the drafted comment as plain text in one go, with no newline. Never press Enter or click Post. Tell the owner: "Staged for <first name> (comment <n> of <total>) - press Post (or say skip, or edit: <change>)." The owner may change the text in the box before pressing Post. On "edit", clear the box, redraft, re-run `check-drafts` for that comment, and stage it again.
+ - **Verify it published.** When the owner says it's posted (or after about 2 minutes if the host can watch the page), read the post's replies for a reply from @handle and record the exact published text. Not found after one re-read, or the owner says skip: mark it skipped, leave the box alone and move on. Never retype or resend a comment whose result is unclear.
+ - Copy mode: show each comment as a card with the post link and the step ("follow them, then post this"); the owner pastes, posts and follows. Read back what they posted if any tool can see it; otherwise ask them to paste what they published, or record it as unknown.
+ 7. **Wrap-up.** Append the run to the ledger with `node scripts/first-followers.mjs record --ledger ~/.threadify/first-followers/ledger.jsonl` (`{"date", "account", "people": [{"handle", "plan", "followed", "comments": [{"staged", "published" | null}]}]}`; it hashes every handle). Read the follower count again. Then pipe the staged/published pairs into `node scripts/first-followers.mjs diff` (`{"pairs": [{"id", "staged", "published" | null}]}`) and show, in one short message: people engaged, comments published, edited and skipped, follows, followers now vs start ("+N since you started"), and the learning summary from its `headline` in plain words, for example "You shortened 6 of 10, cut emojis, and never kept 'such a cool'".
+ 8. **Learn your voice.** Preserve the staged and published variants; owner edits change voice rules only, never the hard rules. Propose at most 3 short voice rules, each backed by the same edit in at least 3 published comments ("Keep comments under 120 characters", "No emojis in comments"). With fewer, say "not enough edits to suggest a rule yet". Show each rule's exact memory text and ask: "Save these to your Threadify Brain? (yes / no / always)". On "yes" or "always", save each with `remember` (class `channel_voice`, source "First Followers edits, <date>"), then read back with `query_brain` and confirm each one is there. "always" also writes `{"save_voice_rules": "always"}` to `~/.threadify/first-followers/preferences.json`; on later runs, save proposed rules without asking, still show them and read them back, and stop saving automatically as soon as the owner says so. Never save a rule that conflicts with these rules (links, DMs, flattery, false "new to Threads" claims).
+ 9. **Scoreboard.** Pipe counts only into `node scripts/first-followers.mjs scoreboard --html first-followers.html`: `{"handle", "timezone", "started_at", "start": {"followers", "posts"}, "actions": {"people", "comments_published", "comments_edited", "comments_skipped", "follows", "posts_scheduled"}}`. Serve its folder on this computer only (for example `python3 -m http.server 8048 --bind 127.0.0.1 --directory <folder>` in the background) and open `http://127.0.0.1:8048/first-followers.html`, because some hosts' browsers refuse `file://` pages. Confirm it opened, and stop the server when the run ends.
+ 10. **Optional: your next 3 posts.** Offer once: "Want Threadify to write your next 3 posts and schedule them?" Only on yes, run [the posts step](references/posts.md): three `generate_content` posts, one approval packet and scheduling only after one exact "yes". Otherwise skip it.
+ 11. **Schedule offer.** Ask: "Want me to run this for you on a schedule?" On yes, ask what days and time suit, then follow [the schedule guide](references/schedule.md). Never create a schedule silently or before the owner picks the time.
+ 12. **Re-check tomorrow.** End with: "Re-check tomorrow: I'll see who followed back." On "re-check", read the follower count again. If this conversation still has the run's list, open each engaged profile and count the ones that show a "Follows you" badge. Otherwise (the ledger holds only hashes), read the handles on the account's own Followers list and pipe them into `node scripts/first-followers.mjs followed-back --ledger ~/.threadify/first-followers/ledger.jsonl` as `{"date": "<run date>", "followers": ["@handle", ...]}`; it hashes them in memory and returns counts only. Re-run the scoreboard with `"recheck": {"at", "followers", "posts", "followed_back"}`, reload the page and say "+N followers since you started, M of the people you engaged follow you back". Counts only.
## When something is missing
- No visible browser or not signed in: stop before Moves 1-3 and say exactly what is missing. Without a Threadify connection or generation access, still draft the cards, but never write the three posts yourself; say what is missing and the manual next step. A scheduled post is not a published post, and a drafted card is not a sent one.
+ No Threadify connection: run the loop with the owner's answers for voice, skip Brain saves and the optional posts, and say what is missing. No browser control: copy mode. Signed in to the wrong account: stop before any search. A staged comment is not a published one, a scheduled post is not a published post, and a follow is not a follow-back.