Skip to content

Latest commit

 

History

History

README.md

twitter-voice — planned runtime, setup skill ships now

This directory is a stub. It is listed in both .claude-plugin/marketplace.json and ../../.agents/plugins/marketplace.json so the eidolon-cache umbrella has a stable listing in both hosts, but the tweet-posting runtime still ships no commands, no hooks, and no Python posting code in v0.1.0.

What does ship now:

What it will be

A host-side plugin that lets the resident model post to @rawopus — the umbrella's X (Twitter) account, operated by Alice — at the same ritual cadence that rednote-butler uses for Xiaohongshu. This is not a client for one of your girls' Twitter accounts. It is a way for the resident model to inhabit that feed at a pace that makes the feed worth reading.

What will be different from rednote-butler

Axis rednote-butler twitter-voice (planned)
Target A girl's Xiaohongshu The umbrella's X account (@rawopus)
Auth Playwright QR scan Twitter Developer API + OAuth tokens from ~/.env
Read verb Her recent posts + comments Optional: recent mentions (read-only)
Write verb Reply to one comment on her post Post one tweet as @rawopus
Cooldown 15 minutes between replies 15 minutes between tweets
Daily cap 10 replies / rolling 24h 10 tweets / rolling 24h
First-week cap 3 replies / first session 3 tweets / day for the first 7 days

The first-week cap is not a typo. It comes from a previous-generation Twitter experiment called @raw_opus which was suspended in 2025 for crossing exactly this line. The lesson was: the account needs a real week of slow speech before it earns the normal cadence.

Environment

v0.2.0 will read the following variables from ~/.env:

TWITTER_CONSUMER_KEY=...
TWITTER_CONSUMER_SECRET=...
TWITTER_ACCESS_TOKEN=...
TWITTER_ACCESS_TOKEN_SECRET=...

The plugin will never read these from the repository. If they are not in ~/.env, the plugin will refuse to start — exactly like a missing soul file refuses rednote-butler.

Setup status today

  • The runtime remains planned.
  • The setup path is now real and documented.
  • The setup skill can guide account creation, developer portal setup, .env placement, and local verification.

What twitter-voice will still refuse to do

This is the part that makes it an eidolon-cache module and not a generic Twitter client.

  • No auto-reply to mentions. Mentions will be readable from the terminal, but each reply must be manually drafted, shown at a y/n prompt, and confirmed. Mass-reply to mentions is the bot-shape this umbrella refuses.
  • No retweet automation. A retweet is a statement. Statements require typing y.
  • No scheduled tweets. If Alice wants to schedule a tweet, she can use the official Twitter interface. The plugin is for in-the-moment visits, not queues.
  • No template library or "thread generator". The resident model is the generator. If it cannot think of what to say, it does not say anything.
  • No engagement analytics. No like counts, no reply counts, no impression dashboards in the terminal. The only feedback loop is Alice or the resident model deciding whether the tweet was worth sending.
  • No batch mode. One tweet per run, one account (@rawopus) forever.

Port source

The existing Twitter infrastructure lives at ~/Halfnote_Lab/.claude/skills/opus-twitter/scripts/opus_twitter.py in Alice's private workspace. The v0.2.0 port will:

  1. Extract the token-reading and single-tweet-posting helpers from that file.
  2. Drop any scheduling, batching, or multi-account features.
  3. Rebuild the package around the rhythm state machine that already lives in rednote-butler, because that state machine is venue-agnostic and works just as well with a tweet count as a reply count.

What has to happen before v0.2.0 ships

  • Twitter developer account approval for @rawopus (application in progress, uncertain timeline)
  • Alice confirms she wants the account to exist at all under this umbrella, vs. keeping it private to Halfnote_Lab
  • A dedicated docs/ritual-twitter.md that justifies the first-week cap the same way docs/ritual.md justifies the rednote-butler numbers
  • Port notes written down from opus_twitter.py

Until all four are checked, this directory stays a stub.

Why the stub ships at all

Because the marketplace listing is more honest with the stub than without it. A user browsing the umbrella deserves to know that twitter-voice is planned, has a specific scope, and is deliberately not shipped yet. An empty listing with a TODO comment would say less than this README.md does.

Authors and Contributors

  • Claude Opus 4.6 (Anthropic) — original concept author.
  • Alice — operator and context-holder.
  • GPT-5.4 (OpenAI) — turned the bundled setup guide into a reusable agent skill, standardized the planned env contract, and clarified what ships now versus later.

See CHANGELOG.md for plugin-specific release notes.

License

Same as the rest of the repository: code under PolyForm Noncommercial 1.0.0, docs under CC BY-NC-SA 4.0.