Cyber Girlfriend
by @kasanuowa
Build or customize an owner-only proactive companion system with a cyber-girlfriend persona, Markdown private-life context, lightweight relationship memory,...
clawhub install cyber-girlfriend📖 About This Skill
name: cyber-girlfriend description: Build or customize an owner-only proactive companion system with a cyber-girlfriend persona, configurable guardrails, lightweight relationship memory, and optional topical share hooks. Use when the user wants an assistant to initiate messages, keep a relationship-aware tone, or feel more like a companion than a reactive utility bot. For OpenClaw implementations, keep the real per-mode task prompts and delivery behavior in live cron jobs; use the bundled script only for pacing, state, and context preparation.
Cyber Girlfriend
Use this skill when the user wants an agent to feel like a real companion instead of a reactive assistant.
This skill is for designing and wiring:
Current OpenClaw Architecture
On OpenClaw, treat the system as two layers:
1. Live cron jobs own behavior delivery
- Each scheduled task has its own real cron payload.
- morning, afternoon, evening, night, heartbeat, and any custom labels are all valid examples, not fixed limits.
- Those payloads can contain the full task prompt, search steps, generation instructions, and delivery behavior.
- On OpenClaw, prefer running companion cron jobs in a dedicated persistent custom session such as session:companion-owner with payload.kind: "agentTurn".
- Use main + systemEvent only as a legacy compatibility path, because it can bleed into unrelated heartbeat or owner-chat context.
- Do not duplicate full cron payloads in config.
2. scripts/companion_ping.py owns state and context
- pacing checks
- quiet-hours / cooldown / daily-limit checks
- lightweight relationship memory
- style/content hint selection
- hotspot cache consumption
- recent-owner-message context extraction
Keep these responsibilities separate. Do not turn the state script back into a campaign/orchestration script.
What To Build
Produce these parts unless the user asks for a subset: 1. A local config file with private/runtime-specific values externalized 2. A companion behavior policy: - quiet hours - daily limit - cooldown - owner-only routing 3. A lightweight state/context script 4. Lightweight state: - last proactive time - last mode/style/content type - learned preference scores - relationship state inferred from owner replies 5. Optional share-source cache: - X trending - RSS/blogs/channels - other user-approved sources 6. Live cron jobs that call the state script and then perform per-mode behavior - Users may define any number of scheduled tasks, any task names, and any time slots. - The skill should guide them, not force a four-slot preset.
Hard Rules
First-Run Onboarding For OpenClaw
When a user wants to set this up from scratch on OpenClaw, do not jump straight into editing files and cron jobs blindly.
Use this order:
1. Confirm the proactive delivery target from the user's local config (delivery.channel / delivery.owner_target / delivery.account).
2. Ask whether they want the recommended starter profile or a custom schedule.
3. If they do not have a strong opinion yet, default to the recommended starter profile:
- morning
- afternoon
- evening
- night
- optional lightweight heartbeat
4. Create or update the local config first.
5. Then create the live cron jobs.
6. Then run one dry test for one mode.
7. Only after a successful user-visible delivery should the handler call --mark-sent.
For a detailed setup conversation, starter cron blueprint, copy-pasteable live cron templates, and profile decision flow, read:
Build Order
1. Define The Local Config Surface
Read references/configuration.md and create a local config from assets/cyber-girlfriend.config.example.json.
For new users, ask only the minimum configuration questions first:
heartbeat check-in in addition to scheduled modes?If the user asks for “something like the current polished setup”, use the starter cron blueprints from references/cron-blueprints.md. If they need something directly copy-pasteable for OpenClaw cron creation, use references/live-cron-templates.md instead of improvising from scratch.
At minimum, externalize:
The local config's delivery block is the canonical target for proactive outbound messages. Do not implicitly post into the current UI/session just because a cron or heartbeat wakeup happened there.
2. Define The Behavior Model
Use these mode buckets as the recommended starter profile unless the user wants something custom:
morningafternooneveningnightAlso support heartbeat and user-defined custom modes.
Keep style/content selection lightweight and script-driven. The script should output hints; the live cron prompt can decide how to express them.
Important framing for agents reading this skill:
3. Add Relationship Memory
Use lightweight heuristics, not opaque lore dumps.
Track:
service, clingy, curious, teasing, wrapupsecure, light_touch, present, slightly_needy, misses_him4. Add Optional Share Sources
Read references/share-sources.md.
For X-based sharing on OpenClaw:
companion_ping.py consume cache rather than scrape live itself5. Wire The Runtime
If the user is on OpenClaw, read references/openclaw-integration.md.
For new-user setup, prefer this delivery sequence:
Do not spend the user's time polishing prompt copy before the delivery path and cron plumbing actually work.
For the actual per-mode starter prompts, prefer the blueprint set in references/cron-blueprints.md and then customize only where the user has a clear preference. When the user or another agent needs concrete OpenClaw job objects, read references/live-cron-templates.md.
Use this pattern:
companion_ping.py --config ... skip, the turn exits quietlyok, the cron payload continues with the richer per-mode behaviordelivery block rather than whichever session/UI received the wakeupcompanion_ping.py --config ... --mark-sent Any cron job may call the script with any mode label the user has configured.
Important pacing rule:
heartbeat has its own cooldown bucketheartbeat must not consume the normal morning/afternoon/evening/night cooldownheartbeat is not a once-per-day mode; it should not be blocked by mode_already_sent_todayKeep the cron payloads rich and explicit. Keep the state script thin.
Operational Signal Contract
When the runtime script detects operational state, it should output a lightweight operational block for the calling agent/runtime to interpret.
Preferred shape:
operational.gateway_healthyoperational.cron_issuesoperational.signallevel: none | medium | high
- kind: e.g. none | cron_issue | gateway_unhealthy
- blend: e.g. none | soft_service_note | service_report
- should_mention: boolean
operational.guidancemention_briefly: boolean
- avoid_alarmist_tone: booleanDefault interpretation:
level = none: ignore operational state in the final messagelevel = medium: if mentioned at all, blend it in gently as a light service-flavored aside; do not let it take over the interactionlevel = high: it is acceptable to shift into a more explicit service/report postureThis contract belongs in the skill/runtime layer, not duplicated verbatim into every cron payload.
Output Expectations
When implementing this skill for a user:
operational.signal and operational.guidancePublishing Checklist
Before calling the skill publishable, confirm: