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:
- a human-facing setup guide:
twitter-voice-setup.html - an agent-facing setup skill:
skills/twitter-voice-setup/SKILL.md - a local
~/.envverifier:skills/twitter-voice-setup/scripts/check_env_keys.py - a Codex manifest:
.codex-plugin/plugin.json
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.
| 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.
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.
- The runtime remains planned.
- The setup path is now real and documented.
- The setup skill can guide account creation, developer portal setup,
.envplacement, and local verification.
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.
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:
- Extract the token-reading and single-tweet-posting helpers from that file.
- Drop any scheduling, batching, or multi-account features.
- 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.
- 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.mdthat justifies the first-week cap the same waydocs/ritual.mdjustifies the rednote-butler numbers - Port notes written down from
opus_twitter.py
Until all four are checked, this directory stays a stub.
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.
- 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.
Same as the rest of the repository: code under PolyForm Noncommercial 1.0.0, docs under CC BY-NC-SA 4.0.