Install
openclaw skills install cyber-girlfriendBuild or customize an owner-only proactive companion system with a cyber-girlfriend persona, configurable guardrails, lightweight relationship memory, and op...
openclaw skills install cyber-girlfriendUse 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:
On OpenClaw, treat the system as two layers:
Live cron jobs own behavior delivery
morning, afternoon, evening, night, heartbeat, and any custom labels are all valid examples, not fixed limits.scripts/companion_ping.py owns state and context
Keep these responsibilities separate. Do not turn the state script back into a campaign/orchestration script.
Produce these parts unless the user asks for a subset:
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:
delivery.channel / delivery.owner_target / delivery.account).morningafternooneveningnightheartbeat--mark-sent.For a detailed setup conversation, starter cron blueprint, copy-pasteable live cron templates, and profile decision flow, read:
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.
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:
Use lightweight heuristics, not opaque lore dumps.
Track:
service, clingy, curious, teasing, wrapupsecure, light_touch, present, slightly_needy, misses_himRead references/share-sources.md.
For X-based sharing on OpenClaw:
companion_ping.py consume cache rather than scrape live itselfIf 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 <mode> --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 <mode> --config ... --mark-sentAny 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.
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.signal
level: none | medium | highkind: e.g. none | cron_issue | gateway_unhealthyblend: e.g. none | soft_service_note | service_reportshould_mention: booleanoperational.guidance
mention_briefly: booleanavoid_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.
When implementing this skill for a user:
operational.signal and operational.guidanceBefore calling the skill publishable, confirm: