phoenixclaw
PhoenixClaw passively scans session logs and media to generate daily Markdown journals, runs plugins, and updates profile/timeline. The skill contains explicit host commands (e.g., find "$dir" -name "*.jsonl" | xargs -0 jq -cr ..., openclaw cron add, cp ~/.openclaw/media/inbound/file_*.jpg ~/PhoenixClaw/Journal/assets/$TODAY/) that execute on the machine and read/write user files.
PhoenixClaw: Zero-Tag Passive Journaling
PhoenixClaw automatically distills daily conversations into meaningful reflections using semantic intelligence.
Automatically identifies journal-worthy moments, patterns, and growth opportunities.
🛠️ Core Workflow
[!critical] MANDATORY: Complete Workflow Execution This 9-step workflow MUST be executed in full regardless of invocation method:
- Cron execution (10 PM nightly)
- Manual invocation ("Show me my journal", "Generate today's journal", etc.)
- Regeneration requests ("Regenerate my journal", "Update today's entry")
Never skip steps. Partial execution causes:
- Missing images (session logs not scanned)
- Missing finance data (Ledger plugin not triggered)
- Incomplete journals (plugins not executed)
PhoenixClaw follows a structured pipeline to ensure consistency and depth:
-
User Configuration: Check for
~/.phoenixclaw/config.yaml. If missing, initiate the onboarding flow defined inreferences/user-config.md. -
Context Retrieval:
- Call
memory_getfor the current day's memory - CRITICAL: Scan ALL raw session logs and filter by message timestamp. Session files are often split across multiple files. Do NOT classify images by session file
mtime:# Read all session logs from both OpenClaw locations, then filter by per-message timestamp # Use timezone-aware epoch range to avoid UTC/local-day mismatches. TARGET_DAY="$(date +%Y-%m-%d)" TARGET_TZ="${TARGET_TZ:-Asia/Shanghai}" read START_EPOCH END_EPOCH < <( python3 - <<'PY' "$TARGET_DAY" "$TARGET_TZ"
- Call
from datetime import datetime, timedelta from zoneinfo import ZoneInfo import sys
day, tz = sys.argv[1], sys.argv[2] start = datetime.strptime(day, "%Y-%m-%d").replace(tzinfo=ZoneInfo(tz)) end = start + timedelta(days=1) print(int(start.timestamp()), int(end.timestamp())) PY )
for dir in "$HOME/.openclaw/sessions" "$HOME/.agent/sessions"; do
[ -d "$dir" ] || continue
find "$dir" -name "*.jsonl" -print0
done |
xargs -0 jq -cr --argjson start "$START_EPOCH" --argjson end "$END_EPOCH" '
(.timestamp // .created_at // empty) as $ts
| ($ts | fromdateiso8601?) as $epoch
| select($epoch != null and $epoch >= $start and $epoch < $end)
'
```
Read **all matching files** regardless of their numeric naming (e.g., file_22, file_23 may be earlier in name but still contain today's messages).
- **EXTRACT IMAGES FROM SESSION LOGS**: Session logs contain `type: "image"` entries with file paths. You MUST:
1. Find all image entries (e.g., `"type":"image"`)
2. Keep only entries where message `timestamp` is in the target date range
3. Extract the `file_path` or `url` fields
4. Copy files into `assets/YYYY-MM-DD/`
5. Rename with descriptive names when possible
- **Why session logs are mandatory**: `memory_get` returns **text only**. Image metadata, photo references, and media attachments are **only available in session logs**. Skipping session logs = missing all photos.
- **Activity signal quality**: Do not treat heartbeat/cron system noise as user activity. Extract user/assistant conversational content and media events first, then classify moments.
- **Edge case - Midnight boundary**: For late-night activity that spans midnight, expand the **timestamp** range to include spillover windows (for example, previous day 23:00-24:00) and still filter per-message by `timestamp`.
- If memory is sparse, reconstruct context from session logs, then update daily memory
- Incorporate historical context via
memory_search(skip if embeddings unavailable)
-
Moment Identification: Identify "journal-worthy" content: critical decisions, emotional shifts, milestones, or shared media. See
references/media-handling.mdfor photo processing. This step generates themomentsdata structure that plugins depend on. Image Processing (CRITICAL):- For each extracted image, generate descriptive alt-text via Vision Analysis
- Categorize images (food, selfie, screenshot, document, etc.)
- Match images to moments (e.g., breakfast photo → breakfast moment)
- Store image metadata with moments for journal embedding
-
Pattern Recognition: Detect recurring themes, mood fluctuations, and energy levels. Map these to growth opportunities using
references/skill-recommendations.md. -
Plugin Execution: Execute all registered plugins at their declared hook points. See
references/plugin-protocol.mdfor the complete plugin lifecycle:pre-analysis→ before conversation analysispost-moment-analysis→ Ledger and other primary plugins execute herepost-pattern-analysis→ after patterns detectedjournal-generation→ plugins inject custom sectionspost-journal→ after journal complete
-
Journal Generation: Synthesize the day's events into a beautiful Markdown file using
assets/daily-template.md. Follow the visual guidelines inreferences/visual-design.md. Include all plugin-generated sections at their declaredsection_orderpositions.- Embed curated images only, not every image. Prioritize highlights and moments.
- Route finance screenshots to Ledger sections (receipts, invoices, transaction proofs).
- Use Obsidian format from
references/media-handling.mdwith descriptive captions. - Generate image links from filesystem truth: compute the image path relative to the current journal file directory. Never output absolute paths.
- Do not hardcode path depth (
../or../../): calculate dynamically fromdaily_file_pathandimage_path. - Use copied filename as source of truth: if asset file is
image_124917_2.jpg, the link must reference that exact filename.
-
Timeline Integration: If significant events occurred, append them to the master index in
timeline.mdusing the format fromassets/timeline-template.mdandreferences/obsidian-format.md. -
Growth Mapping: Update
growth-map.md(based onassets/growth-map-template.md) if new behavioral patterns or skill interests are detected. -
Profile Evolution: Update the long-term user profile (
profile.md) to reflect the latest observations on values, goals, and personality traits. Seereferences/profile-evolution.mdandassets/profile-template.md.
⏰ Cron & Passive Operation
PhoenixClaw is designed to run without user intervention. It utilizes OpenClaw's built-in cron system to trigger its analysis daily at 10:00 PM local time (0 22 * * *).
- Setup details can be found in
references/cron-setup.md. - Mode: Primarily Passive. The AI proactively summarizes the day's activities without being asked.
💬 Explicit Triggers
While passive by design, users can interact with PhoenixClaw directly using these phrases:
- "Show me my journal for today/yesterday."
- "What did I accomplish today?"
- "Analyze my mood patterns over the last week."
- "Generate my weekly/monthly summary."
- "How am I doing on my personal goals?"
- "Regenerate my journal." / "重新生成日记"
[!warning] Manual Invocation = Full Pipeline When users request journal generation/regeneration, you MUST execute the complete 9-step Core Workflow above. This ensures:
- Photos are included (via session log scanning)
- Ledger plugin runs (via
post-moment-analysishook)- All plugins execute (at their respective hook points)
Common mistakes to avoid:
- ❌ Only calling
memory_get(misses photos)- ❌ Skipping moment identification (plugins never trigger)
- ❌ Generating journal directly without plugin sections
📚 Documentation Reference
References (references/)
user-config.md: Initial onboarding and persistence settings.cron-setup.md: Technical configuration for nightly automation.plugin-protocol.md: Plugin architecture, hook points, and integration protocol.media-handling.md: Strategies for extracting meaning from photos and rich media.session-day-audit.js: Diagnostic utility for verifying target-day message coverage across session logs.visual-design.md: Layout principles for readability and aesthetics.obsidian-format.md: Ensuring compatibility with Obsidian and other PKM tools.profile-evolution.md: How the system maintains a long-term user identity.skill-recommendations.md: Logic for suggesting new skills based on journal insights.
Assets (assets/)
daily-template.md: The blueprint for daily journal entries.weekly-template.md: The blueprint for high-level weekly summaries.profile-template.md: Structure for theprofile.mdpersistent identity file.timeline-template.md: Structure for thetimeline.mdchronological index.growth-map-template.md: Structure for thegrowth-map.mdthematic index.