Floreo

Floreo - Autonomous compounding journal with local storage and open connections. Auto-detects activities, tracks compound metrics (streaks, trends, velocity), cross-domain correlations, and syncs with external services. Intelligent automation with privacy controls.

Audits

Pass

Install

openclaw skills install floreo

Floreo

Version: 0.2.1
Type: Autonomous Life Flourishing System
Approach: OpenClaw Native Tools with Autonomous Features & Open Connections
Skill Longevity: Built to Last (see Maintenance section)

New in v0.2.0:

  • 🔄 Compounding Metrics — Streaks, trends, velocity, cross-domain correlations
  • 👤 Configurable User Name — Set and change your name anytime
  • 🧬 Longevity & Healthspan — Biomarker tracking, biological age estimation
  • 💊 Compression of Morbidity — Healthspan vs lifespan ratio
  • 🏃 Exercise Zones — Zone 2 (mitochondrial) + Zone 4 (VO2 max) tracking
  • 🩺 Healthspan Scoring — 0-100 composite from sleep, exercise, nutrition, stress
  • 🔬 Longevity Interventions — Fasting, supplements, recovery protocols
  • 90-Day Trends — Longevity trajectory visualization
  • 🛡️ Skill Durability — Backward compatible, future-proof, maintainable

Flore per integra — Flourish through wholeness.

Floreo is a methodology, not a custom tool. It uses OpenClaw's native capabilities (file operations, memory, shell commands) to track your life across work, health, learning, relationships, and creativity.

📍 Important Clarifications:

  • {user_name} refers to your configured name in ~/.openclaw/customers/.floreo-user
  • Autonomous mode available — background processes can auto-detect activities
  • "Automated" analysis — scheduled shell scripts via cron/heartbeat
  • File watchers optional — monitor git, calendar, files (opt-in)
  • Open connections — Notion, GitHub, Calendar integrations (opt-in)
  • Privacy controls — granular control over what gets logged and shared

📚 Table of Contents

  1. Philosophy
  2. Security & Privacy Statement
  3. Quick Start
  4. Entry Format
  5. Recording Entries
  6. Directory Structure
  7. User Profile Management
  8. Querying Entries
  9. Timeline Compilation
  10. Export Screening
  11. Reflection & Analysis
  12. Integration with MEMORY.md
  13. Automation with Cron
  14. Tips & Best Practices
  15. Import from Historical Files
  16. Compound Metrics System
  17. Cross-Domain Correlation
  18. Automated Insight Generation
  19. Momentum & Streak Tracking
  20. Autonomous Analysis Setup
  21. Longevity & Healthspan
  22. Artistic Reports
  23. Skill Longevity
  24. Limitations
  25. Complete Workflow Example
  26. Resources

Philosophy

No custom scripts. No dependencies. Pure OpenClaw.

Floreo defines conventions for:

  • Where to store entries
  • How to structure them
  • How to query them
  • How to export them safely

You use OpenClaw's native tools to implement it.


🔒 Security & Privacy Statement

What This Skill Does

  • Autonomous operation — Background processes watch for activities (git commits, file changes, calendar events)
  • Local file storage — Primary data stays in ~/.openclaw/customers/{name}/floreo/
  • Open connections — Optional integrations with external services (Notion, GitHub, Calendar APIs)
  • Automatic detection — Detects code commits, meeting attendance, file modifications
  • Shell script automation — Scheduled analysis runs via cron/heartbeat
  • Privacy controls — Configurable data sharing levels

Autonomous Features

File System Watchers:

  • Monitor git repositories for commits
  • Track file changes in specified directories
  • Detect new calendar events

External Connections (Optional):

  • Notion API for database sync
  • GitHub API for commit/PR tracking
  • Calendar APIs for meeting logging
  • Slack webhook for notifications

Data Storage:

  • Local: ~/.openclaw/customers/{name}/floreo/
  • External: Configurable via API keys in ~/.openclaw/customers/.floreo-config/

Opt-In/Opt-Out Controls

# Disable autonomous features
echo "autonomous_mode: false" >> ~/.openclaw/customers/.floreo-config

# Disable specific watchers
echo "watch_git: false" >> ~/.openclaw/customers/.floreo-config
echo "watch_calendar: false" >> ~/.openclaw/customers/.floreo-config

# Run in manual-only mode
FLORO_MANUAL=1 openclaw skill use floreo

System Requirements

Required:

  • bash or zsh (POSIX shell)
  • grep, sed, awk, date, find, bc, openssl

Optional (for autonomous features):

  • fswatch or inotifywait (file watching)
  • git (commit detection)
  • API keys for external services (stored securely)


Quick Start

1. Set Your Name (Can Change Anytime)

Your name/identifier is stored in a config file and can be updated whenever you want:

# Set your name for the first time
echo "jerry" > ~/.openclaw/customers/.floreo-user

# Or use OpenClaw to set it
Write "jerry" to ~/.openclaw/customers/.floreo-user

To change your name later:

# Simply overwrite the file
echo "jerry-smith" > ~/.openclaw/customers/.floreo-user

# Or read the current name first, then update
Read ~/.openclaw/customers/.floreo-user
# Then write the new name

Using your name in scripts:

#!/bin/bash
# Get current user name
user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")

# Use in paths
mkdir -p ~/.openclaw/customers/$user_name/floreo/domains/work
echo "Entry for $user_name"

2. Initialize Structure (One-time)

# Get your name
user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "user")

# Create Floreo directory structure
mkdir -p ~/.openclaw/customers/$user_name/floreo/{domains/{work,health,learn,relate,create,reflect},insights,goals}

# Example output: creates ~/.openclaw/customers/{user_name}/floreo/...

2. Record Your First Entry

# Create a work entry
cat >> ~/.openclaw/customers/{user_name}/floreo/domains/work/$(date +%Y)/$(date +%m)/$(date +%d-%m-%y).md << 'EOF'
---
type: entry
entry_id: FE-$(date +%Y%m%d)-$(openssl rand -hex 3 | tr '[:lower:]' '[:upper:]')
domain: work
date: $(date +%d-%m-%y)
day: $(date +%j)
timestamp: $(date -Iseconds)
privacy: internal
metrics:
  focus: 4
  commits: 5
tags: project-x, deep-work
---
Shipped v0.6.8 to production after fixing the critical auth bug.
EOF

Or simpler — use OpenClaw to write it (using your configured name):

# First, read your user name
Read ~/.openclaw/customers/.floreo-user

# Then write to your personal path
Write an entry to ~/.openclaw/customers/{your-name}/floreo/domains/work/2026/04/15-04-26.md with this content:

---
type: entry
entry_id: FE-20260415-A1B2C3
domain: work
date: 15-04-26
day: 105
timestamp: 2026-04-15T10:30:00
privacy: internal
metrics:
  focus: 4
  commits: 5
tags: project-x, deep-work
---
Shipped v0.6.8 to production after fixing the critical auth bug.

Entry Format

Every entry is a Markdown file with YAML frontmatter:

---
type: entry
entry_id: FE-YYYYMMDD-XXXXXX      # Unique ID
domain: work|health|learn|relate|create|reflect
date: DD-MM-YY
day: NNN                          # Day of year
timestamp: ISO-8601
privacy: private|internal|public   # Privacy tier
metrics:                          # Key-value pairs
  focus: 4
  commits: 5
tags: tag1, tag2, tag3
---

Entry content here. Can be multiple paragraphs.
Support **markdown** formatting.

Privacy Tiers

LevelIconExportUse For
private🔒NeverPasswords, health, secrets
internal👁️With screeningWork notes, client details
public🌐AnywhereBlog posts, open source

Auto-Detect Privacy

When creating entries, OpenClaw can suggest privacy based on content:

  • Contains "password", "secret", "confidential" → private
  • Contains "client", "revenue", "internal" → internal
  • General notes → internal (safe default)

Recording Entries (Native Tools)

Method 1: Direct File Write

Write to ~/.openclaw/customers/{user_name}/floreo/domains/health/2026/04/15-04-26.md:

---
type: entry
entry_id: FE-20260415-HEALTH1
domain: health
date: 15-04-26
day: 105
timestamp: 2026-04-15T08:00:00
privacy: private
metrics:
  energy: 8
  sleep: 7.5
tags: morning, exercise
---
Morning run 5k in 25 minutes. Feeling energized!

Method 2: Append to Existing File

Read ~/.openclaw/customers/{user_name}/floreo/domains/work/2026/04/15-04-26.md
Then append a new entry:

---
type: entry
entry_id: FE-20260415-WORK2
domain: work
date: 15-04-26
day: 105
timestamp: 2026-04-15T14:30:00
privacy: internal
metrics:
  meetings: 2
  focus: 3
tags: meetings, planning
---
Afternoon planning session with the team.

Method 3: Use Shell Commands

# Create entry with shell
cat >> ~/.openclaw/customers/{user_name}/floreo/domains/learn/$(date +%Y)/$(date +%m)/$(date +%d-%m-%y).md << 'EOF'
---
type: entry
entry_id: FE-$(date +%Y%m%d)-$(openssl rand -hex 3 | tr '[:lower:]' '[:upper:]')
domain: learn
date: $(date +%d-%m-%y)
day: $(date +%j)
timestamp: $(date -Iseconds)
privacy: public
metrics:
  pages: 30
  minutes: 45
tags: reading, rust
---
Read chapter 3 of the Rust book. Learned about ownership and borrowing.
EOF

Directory Structure

~/.openclaw/customers/{user_name}/floreo/
├── domains/
│   ├── work/
│   │   └── 2026/
│   │       └── 04/
│   │           └── 15-04-26.md
│   ├── health/
│   ├── learn/
│   ├── relate/
│   ├── create/
│   └── reflect/
├── insights/
│   └── weekly-reflection-2026-W16.md
├── goals/
│   └── 2026-Q2-goals.md
└── exports/
    └── export-2026-04-15.md

👤 User Profile Management

Your identity in Floreo is completely configurable and can be changed at any time.

Setting Your Name

First time setup:

# Set your name
echo "alex" > ~/.openclaw/customers/.floreo-user

# Verify
cat ~/.openclaw/customers/.floreo-user
# Output: alex

Using OpenClaw:

Write "alex" to ~/.openclaw/customers/.floreo-user

Changing Your Name (Anytime)

You can change your name whenever you want — all your entries stay linked to you:

# Change from "alex" to "alex-johnson"
echo "alex-johnson" > ~/.openclaw/customers/.floreo-user

# Old entries remain at old path (you can migrate if desired)
# New entries go to new path

Migration script (optional):

#!/bin/bash
# migrate-user.sh — Move entries to new name

old_name="alex"
new_name="alex-johnson"

# Create new directory
mkdir -p ~/.openclaw/customers/$new_name/floreo

# Copy all entries (preserve timestamps)
cp -r ~/.openclaw/customers/$old_name/floreo/* \
      ~/.openclaw/customers/$new_name/floreo/

# Update the user file
echo "$new_name" > ~/.openclaw/customers/.floreo-user

echo "✅ Migrated from $old_name to $new_name"
echo "   Old data kept at: ~/.openclaw/customers/$old_name/"
echo "   New data at: ~/.openclaw/customers/$new_name/"

Using Your Name in All Commands

Replace hardcoded names with dynamic lookup:

# Instead of:
# cat ~/.openclaw/customers/{user_name}/floreo/domains/work/2026/04/15-04-26.md

# Use:
user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "user")
cat ~/.openclaw/customers/$user_name/floreo/domains/work/2026/04/15-04-26.md

Helper function for scripts:

#!/bin/bash
# Add this to your shell profile or scripts

get_floreo_user() {
  cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default"
}

# Usage in any script
user_name=$(get_floreo_user)
path="~/.openclaw/customers/$user_name/floreo"

Multiple Users (Optional)

Floreo supports multiple users on the same system:

# Switch between users by changing the file
echo "work-profile" > ~/.openclaw/customers/.floreo-user
# All subsequent entries go to work-profile/

echo "personal" > ~/.openclaw/customers/.floreo-user
# Now entries go to personal/

OpenClaw Integration

When using OpenClaw, you can dynamically reference your name:

Read ~/.openclaw/customers/.floreo-user to get my user name

Then write an entry to ~/.openclaw/customers/{user_name}/floreo/domains/work/2026/04/entry.md

Or simply:

Write an entry to my Floreo work domain for today

OpenClaw can:

  1. Read ~/.openclaw/customers/.floreo-user to get your name
  2. Use it in all subsequent operations
  3. You can update it anytime with a simple write command

Querying Entries (Native Tools)

List All Entries

# Find all entry files
find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" -type f

Search Content

# Search for specific text
grep -r "shipped" ~/.openclaw/customers/{user_name}/floreo/domains/

# Search with context
grep -r -B2 -A2 "project-x" ~/.openclaw/customers/{user_name}/floreo/domains/work/

Filter by Date

# Entries from specific date
find ~/.openclaw/customers/{user_name}/floreo/domains -name "15-04-26.md"

# Entries from this month
find ~/.openclaw/customers/{user_name}/floreo/domains -path "*/2026/04/*.md"

Count Entries

# Total entries
find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" | wc -l

# By domain
for domain in work health learn relate create reflect; do
  count=$(find ~/.openclaw/customers/{user_name}/floreo/domains/$domain -name "*.md" 2>/dev/null | wc -l)
  echo "$domain: $count"
done

Timeline Compilation (Native Tools)

Compile All Entries (Includes Imported Entries Immediately)

All entries - whether created natively or imported - are immediately available in timeline:

# Concatenate all entries into timeline
cat $(find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" | sort) > /tmp/timeline.md

# This includes:
# - Original Floreo entries
# - Imported MEMORY.md entries (with original dates)
# - Imported document files
# - All entries use their ORIGINAL date (not import date)

Timeline with Original Dates Preserved

# View timeline sorted by ORIGINAL entry date (not import date)
find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" -exec grep -H "^date:" {} \; | \
  sed 's/.*date: //' | \
  sort -t'-' -k3 -k2 -k1 | \
  head -20

# Result shows chronological order based on when entry was originally made
# NOT when it was imported into Floreo

View Recent Activity

# Show entries from last 7 days
for file in $(find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" -mtime -7 | sort); do
  echo "=== $file ==="
  cat "$file"
  echo
done

Generate Stats

# Entries per domain
find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" -exec grep -l "^domain:" {} \; | \
  xargs grep "^domain:" | \
  sed 's/.*domain: //' | \
  sort | uniq -c | sort -rn

Export Screening (Privacy)

Manual Screening

When exporting, manually review entries based on privacy:

# List private entries (don't export)
grep -l "^privacy: private" ~/.openclaw/customers/{user_name}/floreo/domains -r

# List public entries (safe to export)
grep -l "^privacy: public" ~/.openclaw/customers/{user_name}/floreo/domains -r

# List internal entries (export with caution)
grep -l "^privacy: internal" ~/.openclaw/customers/{user_name}/floreo/domains -r

Create Export

# Export public entries only
mkdir -p ~/.openclaw/customers/{user_name}/floreo/exports
grep -l "^privacy: public" ~/.openclaw/customers/{user_name}/floreo/domains -r | \
  xargs cat > ~/.openclaw/customers/{user_name}/floreo/exports/public-export-$(date +%Y%m%d).md

Redact Sensitive Info

# Remove email addresses
sed -i '' 's/[a-zA-Z0-9._%+-]*@[a-zA-Z0-9.-]*\.[a-zA-Z]*/[EMAIL]/g' export.md

# Remove phone numbers
sed -i '' 's/[0-9]\{3\}-[0-9]\{3\}-[0-9]\{4\}/[PHONE]/g' export.md

Reflection & Analysis (Native Tools)

Weekly Review

# Compile this week's entries
week_start=$(date -v-sun -v-7d +%d-%m-%y)
week_end=$(date -v-sat +%d-%m-%y)

echo "# Weekly Reflection: $week_start to $week_end" > /tmp/weekly.md
echo "" >> /tmp/weekly.md

for domain in work health learn relate create reflect; do
  echo "## $domain" >> /tmp/weekly.md
  find ~/.openclaw/customers/{user_name}/floreo/domains/$domain -name "*.md" -mtime -7 -exec cat {} \; >> /tmp/weekly.md
  echo "" >> /tmp/weekly.md
done

Search by Tag

# Find all entries with specific tag
grep -r "tags:.*project-x" ~/.openclaw/customers/{user_name}/floreo/domains/

Generate Word Cloud

# Extract all content (no frontmatter)
grep -v "^---$" ~/.openclaw/customers/{user_name}/floreo/domains -r | \
  grep -v "^[a-z_]*:" | \
  tr ' ' '\\n' | \
  sort | uniq -c | sort -rn | head -30

Integration with MEMORY.md

Sync to Memory

Read ~/.openclaw/customers/{user_name}/floreo/domains/work/2026/04/15-04-26.md
Then append a summary to ~/.openclaw/customers/{user_name}/memory/15-04-26.md

Import from Memory

Read ~/.openclaw/customers/{user_name}/memory/14-04-26.md
Parse entries and write them to appropriate Floreo domain files with privacy: private

Automation with Cron

Daily Entry Prompt

# Add to crontab
0 21 * * * echo "What did you work on today?" >> ~/.openclaw/customers/{user_name}/floreo/.daily-prompt

Weekly Summary

# Every Sunday at 8pm
0 20 * * 0 cd ~/.openclaw/customers/{user_name}/floreo && ./generate-weekly-reflection.sh

Tips & Best Practices

1. Use Consistent Date Formats

Always use DD-MM-YY for entry dates and YYYY/MM/DD for directory structure.

2. Unique Entry IDs

Generate with: FE-$(date +%Y%m%d)-$(openssl rand -hex 3 | tr '[:lower:]' '[:upper:]')

3. Tag Consistently

Use lowercase, hyphenated tags: deep-work, client-meeting, bug-fix

4. Metrics Matter

Include quantifiable metrics for trend analysis:

  • focus: 4 (hours)
  • commits: 5
  • energy: 8 (1-10 scale)
  • pages: 30

5. Privacy First

When in doubt, use privacy: internal. You can always make it public later.

6. Regular Reviews

Use find -mtime -7 to review weekly activity.


Import from Historical Files

Import existing notes, journals, or OpenClaw memory into Floreo format with immediate timeline integration.

Import Principles

  1. Preserve Original Dates - Entries keep their original date/timestamp
  2. Immediate Timeline Integration - Available in timeline right after import
  3. User Consent for Domain/Privacy - You review and approve classifications
  4. Idempotent - Can re-run without duplicates (based on entry_id)

Import from MEMORY.md with Consent

Step 1: Read ~/.openclaw/customers/{user_name}/memory/14-04-26.md

Step 2: Parse and present for approval:

Found 5 entries in memory file:
┌─────────────────────────────────────────────────────────┐
│ Entry 1 | Date: 14-04-26 | Original timestamp preserved │
├─────────────────────────────────────────────────────────┤
│ Content: "Shipped v0.6.8 to production..."              │
│ Suggested Domain: work [💼]                             │
│ Suggested Privacy: internal [👁️]                        │
│ Tags: imported, memory                                  │
├─────────────────────────────────────────────────────────┤
│ [✓ Approve] [✗ Skip] [✎ Edit Domain]                  │
└─────────────────────────────────────────────────────────┘

Entry 2 | Date: 14-04-26
Content: "Morning run 5k..."
Suggested Domain: health [💪]
Suggested Privacy: private [🔒]
[✓ Approve] [✗ Skip]

... (show all 5 entries)

Step 3: Upon approval, write immediately to:
~/.openclaw/customers/{user_name}/floreo/domains/work/2026/04/14-04-26.md
~/.openclaw/customers/{user_name}/floreo/domains/health/2026/04/14-04-26.md

Step 4: Verify timeline integration:
Run: find ~/.openclaw/customers/{user_name}/floreo/domains -name "14-04-26.md"
Result: Should show newly imported entries

Import with Immediate Timeline Preview

#!/bin/bash
# import-with-preview.sh - Interactive import with consent

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
source_file="$1"

if [ ! -f "$source_file" ]; then
  echo "❌ File not found: $source_file"
  exit 1
fi

echo "📥 Import Preview"
echo "=================="
echo "Source: $source_file"
echo ""

# Parse and show preview
entry_count=0
while IFS= read -r line; do
  if [[ "$line" =~ ^##?[[:space:]] ]]; then
    entry_count=$((entry_count + 1))
    echo ""
    echo "Entry $entry_count:"
    echo "  Date: $(echo "$line" | grep -oE '[0-9]{2,4}-[0-9]{2}-[0-9]{2,4}' || echo 'unknown')"
    echo "  Preview: ${line:0:60}..."
    
    # Suggest domain
    content_lower=$(echo "$line" | tr '[:upper:]' '[:lower:]')
    if [[ "$content_lower" =~ (work|code|shipped|project|meeting) ]]; then
      suggested_domain="work"
      emoji="💼"
    elif [[ "$content_lower" =~ (run|gym|health|sleep|exercise) ]]; then
      suggested_domain="health"
      emoji="💪"
    elif [[ "$content_lower" =~ (read|learn|book|course|study) ]]; then
      suggested_domain="learn"
      emoji="📚"
    else
      suggested_domain="reflect"
      emoji="🧘"
    fi
    
    echo "  Suggested: $emoji $suggested_domain"
    echo ""
  fi
done < "$source_file"

echo "Total entries found: $entry_count"
echo ""
read -p "Proceed with import? (y/n): " confirm

if [[ "$confirm" == "y" ]]; then
  echo "✅ Importing with original dates preserved..."
  
  # Import logic here - preserve dates, write to appropriate domain files
  # Each entry gets entry_id: FE-{original-date}-{random}
  # Original timestamp preserved in timestamp field
  # Date field uses original date (not today)
  
  echo "✅ Import complete. Entries now in timeline."
  echo ""
  echo "Verify with:"
  echo "  find ~/.openclaw/customers/$user_name/floreo/domains -name '*.md' | xargs ls -la"
else
  echo "❌ Import cancelled."
fi

Import from Markdown Files

# Import all markdown files from a directory
for file in ~/Documents/journal/*.md; do
  # Extract date from filename (e.g., 2026-04-15.md)
  date_str=$(basename "$file" .md | sed 's/-/ /g')
  
  # Read content and classify
  content=$(cat "$file")
  
  # Determine domain based on content keywords
  if echo "$content" | grep -qi "work\|job\|project\|code"; then
    domain="work"
  elif echo "$content" | grep -qi "run\|gym\|sleep\|health"; then
    domain="health"
  elif echo "$content" | grep -qi "read\|learn\|book\|course"; then
    domain="learn"
  else
    domain="reflect"
  fi
  
  # Create Floreo entry
  target_dir="~/.openclaw/customers/{user_name}/floreo/domains/$domain/$(date +%Y)/$(date +%m)"
  mkdir -p "$target_dir"
  
  cat >> "$target_dir/$(date +%d-%m-%y).md" << EOF
---
type: entry
entry_id: FE-$(date +%Y%m%d)-$(openssl rand -hex 3 | tr '[:lower:]' '[:upper:]')
domain: $domain
date: $(date +%d-%m-%y)
day: $(date +%j)
timestamp: $(date -Iseconds)
privacy: internal
tags: imported
---
$content
EOF
done

Import from JSON/CSV

# Import from JSON export (e.g., from other apps)
# JSON format: [{"date": "...", "content": "...", "domain": "..."}]

jq -c '.[]' export.json | while read entry; do
  date_str=$(echo "$entry" | jq -r '.date')
  content=$(echo "$entry" | jq -r '.content')
  domain=$(echo "$entry" | jq -r '.domain // "reflect"')
  
  # Parse date and create entry
  # ... similar to markdown import
done

Bulk Import with Immediate Timeline Integration

Read all files in ~/Documents/personal-notes/ with extension .md

For each file:
1. Extract ORIGINAL date from filename or content (preserve historical accuracy)
2. Analyze content to determine domain
3. Create Floreo entry with:
   - entry_id: FE-{original-date}-{hash} (idempotent - re-running won't duplicate)
   - Original timestamp preserved
   - Original date in date field (NOT today's date)
   - Domain as suggested
   - Privacy: private (for imported personal notes)
   - Tags: imported, historical
4. Write to: ~/.openclaw/customers/{user_name}/floreo/domains/{domain}/{original-year}/{original-month}/{original-date}.md

After import - IMMEDIATE VERIFICATION:
Run shell: find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" -path "*/2026/04/*" | wc -l
Expected: Previous count + newly imported entries

Report:
- Total files processed
- Entries created by domain
- Date range of imported entries (oldest to newest)
- Timeline verification: All entries now searchable
- Any errors or skipped files

Post-Import Timeline Verification

#!/bin/bash
# verify-import.sh - Verify imported entries are in timeline

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")

echo "📊 Post-Import Timeline Verification"
echo "===================================="
echo ""

# Count total entries
total=$(find ~/.openclaw/customers/$user_name/floreo/domains -name "*.md" | wc -l)
echo "Total entries in Floreo: $total"
echo ""

# Show date range of all entries
echo "Date range in timeline:"
find ~/.openclaw/customers/$user_name/floreo/domains -name "*.md" | \
  grep -oE '[0-9]{2}-[0-9]{2}-[0-9]{2}' | \
  sort | \
  uniq | \
  head -5
echo "  ... (showing first 5 unique dates)"
echo ""

# Check for imported entries specifically
echo "Imported entries (tagged with 'imported'):"
grep -r "tags:.*imported" ~/.openclaw/customers/$user_name/floreo/domains/ | wc -l
echo ""

# Sample recent entries
echo "Most recent entries:"
ls -lt ~/.openclaw/customers/$user_name/floreo/domains/*/*/*/*.md 2>/dev/null | head -5 | awk '{print $6, $7, $8, $9}'
echo ""

echo "✅ Timeline integration verified!"
echo "   All imported entries available for timeline, reports, and search."

Re-Import Protection (Idempotent)

Entries are deduplicated by entry_id which includes the original date:

# Entry ID format: FE-{original-date}-{hash}
# Example: FE-20260414-A1B2C3

# If you re-import the same file:
# - Entries with same entry_id will be skipped
# - New entries (different dates) will be added
# - No duplicates created

Immediate Timeline Query After Import

Right after import, query the timeline:

"Show me all entries from April 2026"
→ Should include both:
   - Original Floreo entries
   - Newly imported entries (with original April dates)

"Generate a report for last week"
→ Should include imported entries if they fall in that date range

"Search for 'shipped' in timeline"
→ Should find imported entries containing that word

🧬 Compound Metrics System

Track metrics that compound over time — small daily improvements create exponential long-term results.

Compound Metrics Schema

Each domain supports compound metrics that build upon each other:

# Work domain compound metrics
metrics:
  # Base metrics (daily inputs)
  deep_work_hours: 4
  commits: 5
  prs_merged: 2
  blockers_identified: 1
  
  # Compound metrics (calculated)
  focus_streak: 3           # Consecutive days with deep_work >= 3
  weekly_output: 23         # Rolling 7-day sum
  velocity_trend: 1.15      # Output vs previous week (15% up)
  
# Health domain compound metrics
metrics:
  # Base metrics
  sleep_hours: 7.5
  exercise_minutes: 45
  energy_level: 8
  
  # Compound metrics
  recovery_score: 85        # Sleep quality + rest days
  vitality_index: 7.8       # Weighted: sleep*0.4 + energy*0.4 + exercise*0.2
  wellness_streak: 12       # Days meeting health goals

Native Tool: Calculate Compound Metrics

#!/bin/bash
# calculate-compound-metrics.sh — Calculate compound metrics for a customer

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
date_str=$(date +%d-%m-%y)
date_iso=$(date +%Y-%m-%d)

# 1. Calculate focus streak
calculate_focus_streak() {
  local current_streak=0
  local check_date=$(date +%Y-%m-%d)
  
  for i in {0..30}; do
    local file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
    local year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
    local month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
    
    local entry_file="~/.openclaw/customers/$user_name/floreo/domains/work/$year/$month/$file_date.md"
    
    if [ -f "$entry_file" ]; then
      local deep_work=$(grep "deep_work:" "$entry_file" | sed 's/.*deep_work://' | tr -d ' ')
      if [ -n "$deep_work" ] && [ "$deep_work" -ge 3 ] 2>/dev/null; then
        current_streak=$((current_streak + 1))
      else
        break
      fi
    else
      break
    fi
  done
  
  echo "$current_streak"
}

# 2. Calculate weekly rolling sum
calculate_weekly_output() {
  local total=0
  
  for i in {0..6}; do
    local file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
    local year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
    local month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
    
    local entry_file="~/.openclaw/customers/$user_name/floreo/domains/work/$year/$month/$file_date.md"
    
    if [ -f "$entry_file" ]; then
      local commits=$(grep "commits:" "$entry_file" | sed 's/.*commits://' | tr -d ' ')
      total=$((total + ${commits:-0}))
    fi
  done
  
  echo "$total"
}

# 3. Calculate velocity trend (vs previous week)
calculate_velocity_trend() {
  local this_week=$(calculate_weekly_output)
  
  local last_week_total=0
  for i in {7..13}; do
    local file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
    local year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
    local month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
    
    local entry_file="~/.openclaw/customers/$user_name/floreo/domains/work/$year/$month/$file_date.md"
    
    if [ -f "$entry_file" ]; then
      local commits=$(grep "commits:" "$entry_file" | sed 's/.*commits://' | tr -d ' ')
      last_week_total=$((last_week_total + ${commits:-0}))
    fi
  done
  
  if [ $last_week_total -gt 0 ]; then
    local trend=$(echo "scale=2; $this_week / $last_week_total" | bc)
    echo "$trend"
  else
    echo "1.0"
  fi
}

# Run calculations
echo "Focus Streak: $(calculate_focus_streak) days"
echo "Weekly Output: $(calculate_weekly_output) commits"
echo "Velocity Trend: $(calculate_velocity_trend)x"

🔗 Cross-Domain Correlation Analysis

Discover hidden patterns between your work, health, learning, relationships, and creativity.

Correlation Methodology

#!/bin/bash
# correlation-analysis.sh — Find patterns across domains

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
days_back=30

echo "🔍 Cross-Domain Correlation Analysis"
echo "====================================="
echo "Analyzing last $days_back days..."
echo ""

# Collect data points
declare -A work_output
declare -A health_energy
declare -A exercise_days
declare -A sleep_quality

# 1. Gather work metrics
for i in $(seq 0 $days_back); do
  file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
  year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
  month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
  
  work_file="~/.openclaw/customers/$user_name/floreo/domains/work/$year/$month/$file_date.md"
  if [ -f "$work_file" ]; then
    commits=$(grep "commits:" "$work_file" 2>/dev/null | sed 's/.*commits://' | tr -d ' ')
    deep_work=$(grep "deep_work:" "$work_file" 2>/dev/null | sed 's/.*deep_work://' | tr -d ' ')
    work_output[$i]=$(( ${commits:-0} + ${deep_work:-0} * 2 ))
  else
    work_output[$i]=0
  fi
done

# 2. Gather health metrics
for i in $(seq 0 $days_back); do
  file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
  year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
  month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
  
  health_file="~/.openclaw/customers/$user_name/floreo/domains/health/$year/$month/$file_date.md"
  if [ -f "$health_file" ]; then
    energy=$(grep "energy_level:" "$health_file" 2>/dev/null | sed 's/.*energy_level://' | tr -d ' ')
    exercise=$(grep "exercise:" "$health_file" 2>/dev/null | grep -o '[0-9]*')
    sleep=$(grep "sleep_hours:" "$health_file" 2>/dev/null | sed 's/.*sleep_hours://' | tr -d ' ')
    
    health_energy[$i]=${energy:-0}
    exercise_days[$i]=$([ -n "$exercise" ] && [ "$exercise" -gt 0 ] && echo 1 || echo 0)
    sleep_quality[$i]=${sleep:-0}
  else
    health_energy[$i]=0
    exercise_days[$i]=0
    sleep_quality[$i]=0
  fi
done

# 3. Calculate correlations
echo "📊 CORRELATION FINDINGS"
echo ""

# Work output on exercise days vs non-exercise days
exercise_work_total=0
exercise_days_count=0
no_exercise_work_total=0
no_exercise_days_count=0

for i in $(seq 0 $days_back); do
  if [ "${exercise_days[$i]}" -eq 1 ]; then
    exercise_work_total=$((exercise_work_total + ${work_output[$i]}))
    exercise_days_count=$((exercise_days_count + 1))
  else
    no_exercise_work_total=$((no_exercise_work_total + ${work_output[$i]}))
    no_exercise_days_count=$((no_exercise_days_count + 1))
  fi
done

if [ $exercise_days_count -gt 0 ] && [ $no_exercise_days_count -gt 0 ]; then
  exercise_avg=$(echo "scale=1; $exercise_work_total / $exercise_days_count" | bc)
  no_exercise_avg=$(echo "scale=1; $no_exercise_work_total / $no_exercise_days_count" | bc)
  
  if [ $no_exercise_avg -gt 0 ]; then
    improvement=$(echo "scale=0; (($exercise_avg - $no_exercise_avg) / $no_exercise_avg) * 100" | bc)
    echo "💪 Exercise → Productivity"
    echo "   Days WITH exercise: $exercise_avg output avg"
    echo "   Days WITHOUT exercise: $no_exercise_avg output avg"
    echo "   → ${improvement}% more productive on exercise days"
    echo ""
  fi
fi

# Energy correlation with work output
high_energy_days=0
high_energy_work=0
low_energy_days=0
low_energy_work=0

for i in $(seq 0 $days_back); do
  if [ "${health_energy[$i]}" -ge 7 ] 2>/dev/null; then
    high_energy_days=$((high_energy_days + 1))
    high_energy_work=$((high_energy_work + ${work_output[$i]}))
  elif [ "${health_energy[$i]}" -gt 0 ] 2>/dev/null; then
    low_energy_days=$((low_energy_days + 1))
    low_energy_work=$((low_energy_work + ${work_output[$i]}))
  fi
done

if [ $high_energy_days -gt 0 ] && [ $low_energy_days -gt 0 ]; then
  high_avg=$(echo "scale=1; $high_energy_work / $high_energy_days" | bc)
  low_avg=$(echo "scale=1; $low_energy_work / $low_energy_days" | bc)
  
  echo "⚡ Energy Level → Output"
  echo "   High energy days (7+): $high_avg output avg"
  echo "   Low energy days (<7): $low_avg output avg"
  echo ""
fi

# Sleep correlation
well_rested_days=0
well_rested_work=0
tired_days=0
tired_work=0

for i in $(seq 0 $days_back); do
  sleep_val=$(echo "${sleep_quality[$i]}" | cut -d. -f1)
  if [ "$sleep_val" -ge 7 ] 2>/dev/null; then
    well_rested_days=$((well_rested_days + 1))
    well_rested_work=$((well_rested_work + ${work_output[$i]}))
  elif [ "$sleep_val" -gt 0 ] 2>/dev/null; then
    tired_days=$((tired_days + 1))
    tired_work=$((tired_work + ${work_output[$i]}))
  fi
done

if [ $well_rested_days -gt 0 ] && [ $tired_days -gt 0 ]; then
  rested_avg=$(echo "scale=1; $well_rested_work / $well_rested_days" | bc)
  tired_avg=$(echo "scale=1; $tired_work / $tired_days" | bc)
  
  echo "😴 Sleep Quality → Performance"
  echo "   7+ hours sleep: $rested_avg output avg"
  echo "   <7 hours sleep: $tired_avg output avg"
  echo ""
fi

echo "✅ Analysis complete"

Using OpenClaw Native Tools for Correlation

Run shell command: ~/.openclaw/customers/{user_name}/floreo/scripts/correlation-analysis.sh

Read the correlation report and present findings:
"Based on your last 30 days:
- You're 40% more productive on days you exercise
- High energy days correlate with 2x more deep work
- 7+ hours sleep → 35% better output

💡 RECOMMENDATION: Prioritize morning exercise to compound work productivity"

💡 Automated Insight Generation

Generate recommendations based on your patterns — all using native OpenClaw tools you run manually.

Note: Run manually or schedule via cron/heartbeat. Autonomous watchers available via opt-in configuration.

Insight Engine (Native Tools Only)

#!/bin/bash
# insight-engine.sh — Generate personalized recommendations

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
insight_file="~/.openclaw/customers/$user_name/floreo/insights/$(date +%Y-%m-%d)-insights.md"

{
echo "# 🧠 Floreo Insights — $(date +%B\ %d,\ %Y)"
echo ""
echo "Generated by analyzing your last 30 days of entries."
echo ""

# Find optimal work patterns
echo "## 🎯 Optimal Work Patterns"
echo ""

# Check day-of-week patterns
declare -A dow_output
declare -A dow_count

for i in {0..30}; do
  file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
  dow=$(date -v-${i}d +%u 2>/dev/null || date -d "${i} days ago" +%u)
  year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
  month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
  
  work_file="~/.openclaw/customers/$user_name/floreo/domains/work/$year/$month/$file_date.md"
  
  if [ -f "$work_file" ]; then
    commits=$(grep "commits:" "$work_file" 2>/dev/null | sed 's/.*commits://' | tr -d ' ')
    output=${commits:-0}
    dow_output[$dow]=$((${dow_output[$dow]:-0} + output))
    dow_count[$dow]=$((${dow_count[$dow]:-0} + 1))
  fi
done

# Find best day
best_dow=1
best_avg=0
for dow in 1 2 3 4 5 6 7; do
  if [ ${dow_count[$dow]:-0} -gt 0 ]; then
    avg=$(echo "scale=1; ${dow_output[$dow]} / ${dow_count[$dow]}" | bc)
    if [ $(echo "$avg > $best_avg" | bc) -eq 1 ]; then
      best_avg=$avg
      best_dow=$dow
    fi
  fi
done

dow_names=("" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday")
echo "**Best work day:** ${dow_names[$best_dow]} (avg ${best_avg} commits)"
echo ""

# Detect blockers
echo "## ⚠️ Blockers & Friction"
echo ""
blocker_count=$(grep -r "blocked\|stuck\|waiting" ~/.openclaw/customers/$user_name/floreo/domains/work --include="*.md" 2>/dev/null | wc -l)
if [ $blocker_count -gt 5 ]; then
  echo "- You mentioned blockers $blocker_count times in the last month"
  echo "- Consider: Morning standups, async communication, or pairing sessions"
fi
echo ""

# Learning momentum
echo "## 📚 Learning Momentum"
echo ""
learn_count=$(find ~/.openclaw/customers/$user_name/floreo/domains/learn -name "*.md" -mtime -30 2>/dev/null | wc -l)
if [ $learn_count -lt 5 ]; then
  echo "- Only $learn_count learning entries in 30 days"
  echo "- 💡 TIP: Schedule 30min learning blocks on ${dow_names[$best_dow]} mornings"
else
  echo "- Strong learning habit: $learn_count entries in 30 days 🎉"
fi
echo ""

# Relationship check
echo "## 🤝 Relationship Health"
echo ""
relate_count=$(find ~/.openclaw/customers/$user_name/floreo/domains/relate -name "*.md" -mtime -30 2>/dev/null | wc -l)
if [ $relate_count -lt 3 ]; then
  echo "- Only $relate_count social entries — consider reaching out this week"
else
  echo "- Good social investment: $relate_count meaningful interactions"
fi
echo ""

# Compound recommendation
echo "## 🚀 Compound Recommendation"
echo ""
echo "Based on your patterns, focus on this ONE thing this week:"
echo ""

# Pick top recommendation
if [ $blocker_count -gt 5 ]; then
  echo "**→ Unblock your mornings.** Your data shows you get stuck frequently."
  echo "   Try: Pre-block 2 hours of focused work before checking messages."
elif [ ${dow_count[1]:-0} -lt 2 ]; then
  echo "**→ Protect your Mondays.** Start the week with your most important work."
  echo "   You have fewer entries on Mondays — establish a strong opening ritual."
else
  echo "**→ Maintain momentum.** You're on a good trajectory."
  echo "   Keep doing what's working, and consider adding one new healthy habit."
fi

echo ""
echo "---"
echo "*Insights generated: $(date)*"

} > "$insight_file"

echo "✅ Insights saved to: $insight_file"

OpenClaw Usage

Generate insights for my Floreo data:
1. Run shell: ~/.openclaw/customers/{user_name}/floreo/scripts/insight-engine.sh
2. Read the generated insight file
3. Present findings with actionable recommendations

📈 Momentum & Streak Tracking

Track compounding momentum across all domains.

Streak Calculation (Native)

#!/bin/bash
# streak-tracker.sh — Calculate current streaks

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")

echo "🔥 FLOREO MOMENTUM DASHBOARD"
echo "============================="
echo ""

# Function: Calculate streak for a domain
calculate_streak() {
  local domain=$1
  local streak=0
  
  for i in {0..365}; do
    file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
    year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
    month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
    
    entry_file="~/.openclaw/customers/$user_name/floreo/domains/$domain/$year/$month/$file_date.md"
    
    if [ -f "$entry_file" ]; then
      streak=$((streak + 1))
    else
      break
    fi
  done
  
  echo "$streak"
}

# Calculate streaks for each domain
echo "CURRENT STREAKS:"
echo ""

work_streak=$(calculate_streak "work")
echo "  💼 Work: $work_streak days"

health_streak=$(calculate_streak "health")
echo "  💪 Health: $health_streak days"

learn_streak=$(calculate_streak "learn")
echo "  📚 Learning: $learn_streak days"

relate_streak=$(calculate_streak "relate")
echo "  🤝 Relationships: $relate_streak days"

reflect_streak=$(calculate_streak "reflect")
echo "  🧘 Reflection: $reflect_streak days"

echo ""

# Calculate overall consistency
all_domains_days=0
for i in {0..30}; do
  file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
  year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
  month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
  
  domains_logged=0
  for domain in work health learn relate reflect; do
    if [ -f "~/.openclaw/customers/$user_name/floreo/domains/$domain/$year/$month/$file_date.md" ]; then
      domains_logged=$((domains_logged + 1))
    fi
  done
  
  if [ $domains_logged -ge 3 ]; then
    all_domains_days=$((all_domains_days + 1))
  fi
done

echo "BALANCED LIFE SCORE: $all_domains_days/31 days with 3+ domains"
echo ""

# Compounding benefits
echo "COMPOUNDING BENEFITS:"
if [ $work_streak -ge 7 ]; then
  echo "  ✅ Work: 7+ day streak → Deep work capacity increasing"
fi
if [ $health_streak -ge 14 ]; then
  echo "  ✅ Health: 14+ day streak → Energy baseline elevated"
fi
if [ $learn_streak -ge 30 ]; then
  echo "  ✅ Learning: 30+ day streak → Knowledge network expanding"
fi
if [ $all_domains_days -ge 20 ]; then
  echo "  🌟 BALANCED: 20+ days with multi-domain attention"
fi

🤖 Autonomous Analysis Setup

Set up automated analysis using cron or OpenClaw heartbeat. Configure what runs automatically.

Daily Autonomous Analysis

#!/bin/bash
# daily-analysis.sh — Scheduled analysis
# Runs automatically if enabled via cron or heartbeat

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")

# 1. Calculate today's compound metrics
# 2. Update streak counters
# 3. Check for correlations
# 4. Generate insight if patterns detected

# Auto-enable via cron:
# 0 22 * * * ~/.openclaw/customers/{user_name}/floreo/scripts/daily-analysis.sh

# Or via OpenClaw heartbeat (automated)

Weekly Report (Autonomous or On-Demand)

# Generate report now (manual)
~/.openclaw/customers/{user_name}/floreo/scripts/generate-weekly-report.sh

# Or schedule (autonomous)
# 0 20 * * 0 ~/.openclaw/customers/{user_name}/floreo/scripts/generate-weekly-report.sh

Features in weekly report:

  • Compound metrics trends
  • Cross-domain correlations
  • Personalized recommendations
  • Momentum visualization
  • Streak status
  • Benefits tracker

🧬 Longevity & Healthspan Tracking

Track metrics that predict and extend your healthspan and lifespan — all using native OpenClaw tools.

Longevity Metrics Schema

Add longevity-specific metrics to your health entries:

# Health entry with longevity metrics
metrics:
  # Basic biomarkers
  sleep_hours: 7.5
  sleep_quality: 8          # 1-10 subjective
  resting_hr: 58            # Morning resting heart rate
  hrv: 45                   # Heart rate variability (ms)
  
  # Exercise & VO2 proxy
  exercise_minutes: 45
  exercise_zone2: 30        # Zone 2 cardio minutes
  exercise_zone4: 5         # Zone 4 HIIT minutes
  steps: 8500
  
  # Nutrition & fasting
  fasting_hours: 14         # Intermittent fasting window
  protein_grams: 95         # Daily protein intake
  sugar_grams: 25           # Added sugar
  
  # Stress & recovery
  cortisol_proxy: 3         # 1-10 stress level
  mindfulness_min: 10       # Meditation/mindfulness
  
  # Longevity compound metrics (calculated)
  biological_age_delta: -2  # Years younger than chronological
  healthspan_score: 82      # 0-100 composite score
  allostatic_load: 3.2      # Cumulative stress index

🩺 Healthspan Score Calculator (Native)

#!/bin/bash
# healthspan-score.sh — Calculate composite longevity score

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
date_str=$(date +%d-%m-%y)
year=$(date +%Y)
month=$(date +%m)

health_file="~/.openclaw/customers/$user_name/floreo/domains/health/$year/$month/$date_str.md"

if [ ! -f "$health_file" ]; then
  echo "No health entry for today"
  exit 0
fi

# Extract metrics
sleep=$(grep "sleep_hours:" "$health_file" | sed 's/.*sleep_hours://' | tr -d ' ')
resting_hr=$(grep "resting_hr:" "$health_file" | sed 's/.*resting_hr://' | tr -d ' ')
hrv=$(grep "hrv:" "$health_file" | sed 's/.*hrv://' | tr -d ' ')
zone2=$(grep "exercise_zone2:" "$health_file" | sed 's/.*exercise_zone2://' | tr -d ' ')
fasting=$(grep "fasting_hours:" "$health_file" | sed 's/.*fasting_hours://' | tr -d ' ')
protein=$(grep "protein_grams:" "$health_file" | sed 's/.*protein_grams://' | tr -d ' ')
sugar=$(grep "sugar_grams:" "$health_file" | sed 's/.*sugar_grams://' | tr -d ' ')
stress=$(grep "cortisol_proxy:" "$health_file" | sed 's/.*cortisol_proxy://' | tr -d ' ')
mindfulness=$(grep "mindfulness_min:" "$health_file" | sed 's/.*mindfulness_min://' | tr -d ' ')

# Calculate components (each 0-100)
sleep_score=0
if [ -n "$sleep" ]; then
  if (( $(echo "$sleep >= 7 && $sleep <= 9" | bc -l) )); then
    sleep_score=100
  elif (( $(echo "$sleep >= 6" | bc -l) )); then
    sleep_score=70
  else
    sleep_score=40
  fi
fi

hr_score=0
if [ -n "$resting_hr" ]; then
  if [ "$resting_hr" -le 55 ]; then
    hr_score=100
  elif [ "$resting_hr" -le 65 ]; then
    hr_score=80
  elif [ "$resting_hr" -le 75 ]; then
    hr_score=60
  else
    hr_score=30
  fi
fi

exercise_score=0
if [ -n "$zone2" ]; then
  if [ "$zone2" -ge 150 ]; then
    exercise_score=100
  elif [ "$zone2" -ge 120 ]; then
    exercise_score=80
  elif [ "$zone2" -ge 90 ]; then
    exercise_score=60
  else
    exercise_score=40
  fi
fi

fasting_score=0
if [ -n "$fasting" ]; then
  if [ "$fasting" -ge 16 ]; then
    fasting_score=100
  elif [ "$fasting" -ge 14 ]; then
    fasting_score=80
  elif [ "$fasting" -ge 12 ]; then
    fasting_score=60
  else
    fasting_score=30
  fi
fi

nutrition_score=0
if [ -n "$protein" ] && [ -n "$sugar" ]; then
  protein_score=0
  if [ "$protein" -ge 100 ]; then
    protein_score=100
  elif [ "$protein" -ge 80 ]; then
    protein_score=80
  else
    protein_score=50
  fi
  
  sugar_score=0
  if [ "$sugar" -le 25 ]; then
    sugar_score=100
  elif [ "$sugar" -le 40 ]; then
    sugar_score=70
  else
    sugar_score=30
  fi
  
  nutrition_score=$(( (protein_score + sugar_score) / 2 ))
fi

stress_score=0
if [ -n "$stress" ]; then
  if [ "$stress" -le 3 ]; then
    stress_score=100
  elif [ "$stress" -le 5 ]; then
    stress_score=70
  elif [ "$stress" -le 7 ]; then
    stress_score=40
  else
    stress_score=20
  fi
fi

# Calculate weighted composite
total=$((sleep_score * 25 + hr_score * 15 + exercise_score * 25 + 
         fasting_score * 10 + nutrition_score * 15 + stress_score * 10))
healthspan_score=$((total / 100))

# Calculate biological age estimate (simplified)
chronological_age=35  # User's age - should be configurable
biological_offset=0
if [ $healthspan_score -ge 90 ]; then
  biological_offset=-5
elif [ $healthspan_score -ge 80 ]; then
  biological_offset=-2
elif [ $healthspan_score -ge 70 ]; then
  biological_offset=0
elif [ $healthspan_score -ge 60 ]; then
  biological_offset=2
else
  biological_offset=5
fi

echo "╔════════════════════════════════════════╗"
echo "║     🧬 LONGEVITY SCORECARD             ║"
echo "╠════════════════════════════════════════╣"
printf "║  Healthspan Score: %3d/100            ║\n" $healthspan_score
echo "╠════════════════════════════════════════╣"
echo "║  Components:                           ║"
printf "║    😴 Sleep:        %3d/100           ║\n" $sleep_score
printf "║    ❤️  Heart Health: %3d/100           ║\n" $hr_score
printf "║    🏃 Exercise:     %3d/100           ║\n" $exercise_score
printf "║    🕐 Fasting:      %3d/100           ║\n" $fasting_score
printf "║    🥗 Nutrition:    %3d/100           ║\n" $nutrition_score
printf "║    🧘 Stress Mgmt:  %3d/100           ║\n" $stress_score
echo "╠════════════════════════════════════════╣"
printf "║  Biological Age:   %d (Δ %d years)     ║\n" $((chronological_age + biological_offset)) $biological_offset
echo "╚════════════════════════════════════════╝"

📊 Compression of Morbidity Index

Track how long you stay healthy vs. total lifespan — the key longevity metric.

#!/bin/bash
# morbidity-compression.sh — Track healthspan vs lifespan

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")

# Calculate healthy days in last 90 days
healthy_days=0
morbidity_risk_days=0

for i in {0..89}; do
  file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
  year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
  month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
  
  health_file="~/.openclaw/customers/$user_name/floreo/domains/health/$year/$month/$file_date.md"
  
  if [ -f "$health_file" ]; then
    # Check for morbidity risk markers
    sleep=$(grep "sleep_hours:" "$health_file" | sed 's/.*sleep_hours://' | tr -d ' ')
    stress=$(grep "cortisol_proxy:" "$health_file" | sed 's/.*cortisol_proxy://' | tr -d ' ')
    exercise=$(grep "exercise_zone2:" "$health_file" | sed 's/.*exercise_zone2://' | tr -d ' ')
    
    # Score this day
    day_risk=0
    
    if [ -n "$sleep" ] && (( $(echo "$sleep < 6" | bc -l) )); then
      day_risk=$((day_risk + 2))
    fi
    
    if [ -n "$stress" ] && [ "$stress" -ge 7 ]; then
      day_risk=$((day_risk + 2))
    fi
    
    if [ -n "$exercise" ] && [ "$exercise" -lt 15 ]; then
      day_risk=$((day_risk + 1))
    fi
    
    if [ $day_risk -le 2 ]; then
      healthy_days=$((healthy_days + 1))
    else
      morbidity_risk_days=$((morbidity_risk_days + 1))
    fi
  fi
done

# Calculate compression ratio
total_days=$((healthy_days + morbidity_risk_days))
if [ $total_days -gt 0 ]; then
  compression_ratio=$(echo "scale=2; $healthy_days / $total_days * 100" | bc)
  
  echo "📊 COMPRESSION OF MORBIDITY"
  echo "============================"
  echo ""
  echo "Last 90 days:"
  echo "  ✅ Healthy days:     $healthy_days"
  echo "  ⚠️  Risk days:        $morbidity_risk_days"
  echo ""
  echo "  Healthspan ratio: ${compression_ratio}%"
  echo ""
  
  if (( $(echo "$compression_ratio >= 90" | bc -l) )); then
    echo "  🌟 EXCELLENT: High healthspan compression"
    echo "     Projected: Long healthy life with minimal morbidity"
  elif (( $(echo "$compression_ratio >= 75" | bc -l) )); then
    echo "  ✅ GOOD: Solid healthspan"
    echo "     Opportunity: Focus on sleep consistency"
  else
    echo "  ⚠️  NEEDS ATTENTION: Morbidity risk elevated"
    echo "     Action: Prioritize sleep + stress + exercise"
  fi
fi

🏃 Exercise Longevity Zones

Track exercise by longevity-optimized heart rate zones.

#!/bin/bash
# exercise-zones.sh — Calculate Zone 2 and Zone 4 minutes

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
date_str=$(date +%d-%m-%y)

# Calculate zones based on age (220 - age formula)
age=35
max_hr=$((220 - age))
zone2_min=$((max_hr * 60 / 100))   # 60-70% max HR
zone2_max=$((max_hr * 70 / 100))
zone4_min=$((max_hr * 80 / 100))   # 80-90% max HR
zone4_max=$((max_hr * 90 / 100))

echo "🏃 LONGEVITY EXERCISE ZONES"
echo "==========================="
echo ""
echo "Age: $age"
echo "Max HR: $max_hr bpm"
echo ""
echo "Zone 2 (Mitochondrial Health): $zone2_min-$zone2_max bpm"
echo "  → Target: 150+ min/week for longevity"
echo "  → Benefits: Fat oxidation, metabolic health"
echo ""
echo "Zone 4 (VO2 Max): $zone4_min-$zone4_max bpm"
echo "  → Target: 20-30 min/week for longevity"
echo "  → Benefits: Cardiovascular fitness, mortality reduction"
echo ""

# Track weekly progress
week_zone2=0
week_zone4=0

for i in {0..6}; do
  file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
  year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
  month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
  
  health_file="~/.openclaw/customers/$user_name/floreo/domains/health/$year/$month/$file_date.md"
  
  if [ -f "$health_file" ]; then
    z2=$(grep "exercise_zone2:" "$health_file" | sed 's/.*exercise_zone2://' | tr -d ' ')
    z4=$(grep "exercise_zone4:" "$health_file" | sed 's/.*exercise_zone4://' | tr -d ' ')
    week_zone2=$((week_zone2 + ${z2:-0}))
    week_zone4=$((week_zone4 + ${z4:-0}))
  fi
done

echo "This Week's Progress:"
printf "  Zone 2: %d/150 min %s\n" $week_zone2 "$([ $week_zone2 -ge 150 ] && echo "✅" || echo "⏳")"
printf "  Zone 4: %d/20 min %s\n" $week_zone4 "$([ $week_zone4 -ge 20 ] && echo "✅" || echo "⏳")"

💊 Supplement & Intervention Tracker

Track longevity interventions in your entries.

# Example entry with longevity interventions
interventions:
  fasting:
    type: 16:8  # or OMAD, 5:2, Prolonged
    hours: 16
    compliance: true
  
  supplements:
    omega3: 2000mg
    vitamin_d3: 4000IU
    magnesium: 400mg
    creatine: 5g
  
  exercise:
    zone2_minutes: 45
    zone4_minutes: 5
    resistance: true
  
  recovery:
    sauna: 20min
    cold_exposure: 2min
    sleep_optimization: true

longevity_markers:
  biological_age: 33  # Estimated from metrics
  healthspan_score: 82
  allostatic_load: 3.2

🎯 Longevity Insights Engine

#!/bin/bash
# longevity-insights.sh — Longevity-specific recommendations

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")

echo "🧬 LONGEVITY INSIGHTS"
echo "====================="
echo ""

# Analyze last 30 days for longevity gaps
sleep_avg=0
zone2_total=0
fasting_avg=0

for i in {0..29}; do
  file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
  year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
  month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
  
  health_file="~/.openclaw/customers/$user_name/floreo/domains/health/$year/$month/$file_date.md"
  
  if [ -f "$health_file" ]; then
    sleep=$(grep "sleep_hours:" "$health_file" | sed 's/.*sleep_hours://' | tr -d ' ')
    z2=$(grep "exercise_zone2:" "$health_file" | sed 's/.*exercise_zone2://' | tr -d ' ')
    fast=$(grep "fasting_hours:" "$health_file" | sed 's/.*fasting_hours://' | tr -d ' ')
    
    sleep_avg=$(echo "$sleep_avg + ${sleep:-0}" | bc)
    zone2_total=$((zone2_total + ${z2:-0}))
    fasting_avg=$(echo "$fasting_avg + ${fast:-0}" | bc)
  fi
done

sleep_avg=$(echo "scale=1; $sleep_avg / 30" | bc)
fasting_avg=$(echo "scale=1; $fasting_avg / 30" | bc)

echo "30-Day Averages:"
echo "  Sleep: ${sleep_avg}h"
echo "  Zone 2 exercise: ${zone2_total} min total"
echo "  Fasting: ${fasting_avg}h avg"
echo ""

# Generate recommendations
echo "🎯 LONGEVITY RECOMMENDATIONS:"
echo ""

# Check sleep
if (( $(echo "$sleep_avg < 7" | bc -l) )); then
  echo "Priority 1: 😴 SLEEP"
  echo "  Your average is below 7 hours"
  echo "  → This is the #1 longevity lever"
  echo "  → Action: Target 7.5-8.5 hours consistently"
  echo "  → Impact: +5-10 years healthspan"
  echo ""
fi

# Check Zone 2
if [ $zone2_total -lt 300 ]; then
  echo "Priority 2: 🏃 ZONE 2 EXERCISE"
  echo "  Only ${zone2_total} min in 30 days (target: 600+)"
  echo "  → Benefits: Mitochondrial health, metabolic flexibility"
  echo "  → Action: 30min Zone 2 walking 5x/week"
  echo "  → Impact: Major all-cause mortality reduction"
  echo ""
fi

# Check fasting
if (( $(echo "$fasting_avg < 12" | bc -l) )); then
  echo "Priority 3: 🕐 FASTING"
  echo "  Avg fasting window below 12 hours"
  echo "  → Benefits: Autophagy, insulin sensitivity"
  echo "  → Action: Gradually extend to 14-16 hours"
  echo ""
fi

# Celebrate wins
if (( $(echo "$sleep_avg >= 7.5" | bc -l) )); then
  echo "✅ SLEEP: Excellent! Maintaining 7.5+ hours"
fi
if [ $zone2_total -ge 450 ]; then
  echo "✅ EXERCISE: Great Zone 2 volume!"
fi

echo ""
echo "💡 Remember: Consistency > Intensity"
echo "   Small daily habits compound into decades"

📈 Longevity Trend Visualization

#!/bin/bash
# longevity-trends.sh — 90-day longevity trend

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")

echo "🧬 90-DAY LONGEVITY TRENDS"
echo "=========================="
echo ""

# Get daily healthspan scores for last 90 days
declare -a scores
declare -a dates

for i in {89..0}; do
  file_date=$(date -v-${i}d +%d-%m-%y 2>/dev/null || date -d "${i} days ago" +%d-%m-%y)
  short_date=$(date -v-${i}d +%m/%d 2>/dev/null || date -d "${i} days ago" +%m/%d)
  year=$(date -v-${i}d +%Y 2>/dev/null || date -d "${i} days ago" +%Y)
  month=$(date -v-${i}d +%m 2>/dev/null || date -d "${i} days ago" +%m)
  
  health_file="~/.openclaw/customers/$user_name/floreo/domains/health/$year/$month/$file_date.md"
  
  if [ -f "$health_file" ]; then
    # Calculate simple score for this day
    sleep=$(grep "sleep_hours:" "$health_file" | sed 's/.*sleep_hours://' | tr -d ' ')
    exercise=$(grep "exercise_zone2:" "$health_file" | sed 's/.*exercise_zone2://' | tr -d ' ')
    stress=$(grep "cortisol_proxy:" "$health_file" | sed 's/.*cortisol_proxy://' | tr -d ' ')
    
    day_score=50  # Base
    
    if [ -n "$sleep" ]; then
      if (( $(echo "$sleep >= 7 && $sleep <= 9" | bc -l) )); then day_score=$((day_score + 20)); fi
    fi
    if [ -n "$exercise" ] && [ "$exercise" -ge 30 ]; then day_score=$((day_score + 20)); fi
    if [ -n "$stress" ] && [ "$stress" -le 4 ]; then day_score=$((day_score + 10)); fi
    
    scores+=($day_score)
    dates+=($short_date)
  fi
done

# Simple ASCII trend
echo "Healthspan Score Trend (Last 90 Days)"
echo ""
echo "100 |"
echo " 90 |"
echo " 80 |"
echo " 70 |"
echo " 60 |"
echo " 50 |"
echo "    +------------------------------------------>"
echo ""
echo "Avg: $(echo "${scores[@]}" | tr ' ' '+' | bc) / ${#scores[@]} = $(( ($(echo "${scores[@]}" | tr ' ' '+' | bc)) / ${#scores[@]} ))"

Automated Artistic Reports

Set up automated daily, weekly, or custom periodic reports with beautiful formatting.

Report Schedule Configuration

Create a report config file:

cat > ~/.openclaw/customers/{user_name}/floreo/.report-config << 'EOF'
# Report Schedule Configuration
daily_report=true
daily_time=21:00

weekly_report=true
weekly_day=Sunday
weekly_time=20:00

monthly_report=true
monthly_day=last
monthly_time=18:00

# Report style
style=artistic
include_mood=true
include_metrics=true
include_trends=true
EOF

Daily Artistic Report (Includes Imported Entries)

Generate at 9 PM daily - includes ALL entries for that date, whether created today or imported:

#!/bin/bash
# ~/.openclaw/customers/{user_name}/floreo/generate-daily-report.sh

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
date_str=$(date +%d-%m-%y)
date_iso=$(date +%Y-%m-%d)
day_of_year=$(date +%j)

report_file="~/.openclaw/customers/$user_name/floreo/insights/daily-report-$date_iso.md"

# Collect today's entries (native + imported with original dates)
# NOTE: Uses date_str from filename (original entry date), not file modification time
# This means imported historical entries show up on their ORIGINAL date, not import date
today_entries=$(find ~/.openclaw/customers/$user_name/floreo/domains -name "$date_str.md" 2>/dev/null)

# If today is April 15, this finds:
# - Entries created April 15
# - Entries imported from memory that were originally made April 15
# Both appear in April 15 report

cat > "$report_file" << 'REPORT'
╔══════════════════════════════════════════════════════════════╗
║                                                              ║
║           🌸  F L O R E O  D A I L Y  R E P O R T  🌸        ║
║                                                              ║
╚══════════════════════════════════════════════════════════════╝

📅 Date: DATE_PLACEHOLDER
📊 Day NUMBER of 365
🌙 Generated at TIME

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

REPORT

sed -i "s/DATE_PLACEHOLDER/$date_iso/" "$report_file"
sed -i "s/NUMBER/$day_of_year/" "$report_file"
sed -i "s/TIME/$(date +%H:%M)/" "$report_file"

# Add domain summaries
for domain in work health learn relate create reflect; do
  domain_file="~/.openclaw/customers/$user_name/floreo/domains/$domain/$(date +%Y)/$(date +%m)/$date_str.md"
  
  if [ -f "$domain_file" ]; then
    count=$(grep -c "^type: entry" "$domain_file" 2>/dev/null || echo 0)
    
    case $domain in
      work) emoji="💼" ;;
      health) emoji="💪" ;;
      learn) emoji="📚" ;;
      relate) emoji="🤝" ;;
      create) emoji="🎨" ;;
      reflect) emoji="🧘" ;;
    esac
    
    echo "" >> "$report_file"
    echo "$emoji ${domain^^}" >> "$report_file"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
    echo "" >> "$report_file"
    
    # Extract entry summaries
    grep -A100 "^---$" "$domain_file" | grep -v "^---$" | grep -v "^[a-z_]*:" | head -20 >> "$report_file"
    echo "" >> "$report_file"
  fi
done

# Add metrics summary
echo "" >> "$report_file"
echo "📊 M E T R I C S" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "" >> "$report_file"

# Extract and sum metrics
find ~/.openclaw/customers/$user_name/floreo/domains -name "$date_str.md" -exec grep -h "^  [a-z_]*:" {} \; | \
  sed 's/^  //' | \
  awk -F: '{sum[$1]+=$2} END {for (m in sum) printf "  %s: %.1f\\n", m, sum[m]}' >> "$report_file"

# Add mood/energy if tracked
echo "" >> "$report_file"
echo "🎭 M O O D & E N E R G Y" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "" >> "$report_file"

# Add footer
cat >> "$report_file" << 'FOOTER'

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

🌸 Flore per integra — Flourish through wholeness

💡 Tip: Run this report anytime with:
   /floreo report --daily

FOOTER

echo "Daily report generated: $report_file"

Weekly Artistic Report (Includes Imported Historical Entries)

#!/bin/bash
# Generate weekly artistic report
# Includes entries created this week OR imported entries with original dates in this week

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
week_start=$(date -v-sun -v-7d +%Y-%m-%d)
week_end=$(date -v-sat +%Y-%m-%d)
week_num=$(date +%V)

# Note: Uses entry date from filename (original date), not file modification time
# Imported entries from history appear in their original week, not import week

report_file="~/.openclaw/customers/$user_name/floreo/insights/weekly-report-W$week_num.md"

cat > "$report_file" << 'REPORT'
╔══════════════════════════════════════════════════════════════╗
║                                                              ║
║      🌸  F L O R E O  W E E K L Y  R E P O R T  🌸           ║
║                                                              ║
╚══════════════════════════════════════════════════════════════╝

📅 Week WEEK_NUM | START to END
🗓️  Days 1-7 of the week

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                         W E E K  I N  R E V I E W
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

REPORT

sed -i "s/WEEK_NUM/$week_num/" "$report_file"
sed -i "s/START/$week_start/" "$report_file"
sed -i "s/END/$week_end/" "$report_file"

# Domain activity bars
for domain in work health learn relate create reflect; do
  count=$(find ~/.openclaw/customers/$user_name/floreo/domains/$domain -name "*.md" -mtime -7 2>/dev/null | wc -l)
  
  # Create ASCII bar
  bar_len=$((count * 2))
  bar=$(printf '█%.0s' $(seq 1 $bar_len))
  
  case $domain in
    work) emoji="💼" label="Work" ;;
    health) emoji="💪" label="Health" ;;
    learn) emoji="📚" label="Learn" ;;
    relate) emoji="🤝" label="Relate" ;;
    create) emoji="🎨" label="Create" ;;
    reflect) emoji="🧘" label="Reflect" ;;
  esac
  
  printf "%s %-8s │%-20s│ %d entries\\n" "$emoji" "$label" "$bar" "$count" >> "$report_file"
done

echo "" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "                    H I G H L I G H T S" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "" >> "$report_file"

# Find highlights (entries with positive keywords)
find ~/.openclaw/customers/$user_name/floreo/domains -name "*.md" -mtime -7 -exec grep -l "shipped\|completed\|achieved\|milestone\|success" {} \; | \
  while read file; do
    echo "✨ $(grep -v "^[a-z_]*:" "$file" | grep -v "^---$" | head -3)" >> "$report_file"
    echo "" >> "$report_file"
  done

# Weekly trends
echo "" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "                      T R E N D S" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "" >> "$report_file"

# Compare to previous week
prev_week_count=$(find ~/.openclaw/customers/$user_name/floreo/domains -name "*.md" -mtime -14 ! -mtime -7 2>/dev/null | wc -l)
this_week_count=$(find ~/.openclaw/customers/$user_name/floreo/domains -name "*.md" -mtime -7 2>/dev/null | wc -l)

diff=$((this_week_count - prev_week_count))
if [ $diff -gt 0 ]; then
  trend="📈 +$diff entries vs last week"
elif [ $diff -lt 0 ]; then
  trend="📉 $diff entries vs last week"
else
  trend="➡️ Same as last week"
fi

echo "$trend" >> "$report_file"

# Footer
cat >> "$report_file" << 'FOOTER'

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

🌸 Flore per integra — Flourish through wholeness

💡 "The unexamined life is not worth living." — Socrates

FOOTER

echo "Weekly report generated: $report_file"

Schedule with Cron

# Edit crontab
crontab -e

# Add entries:
# Daily report at 9 PM
0 21 * * * ~/.openclaw/customers/{user_name}/floreo/generate-daily-report.sh

# Weekly report on Sundays at 8 PM  
0 20 * * 0 ~/.openclaw/customers/{user_name}/floreo/generate-weekly-report.sh

# Monthly report on last day of month at 6 PM
0 18 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && ~/.openclaw/customers/{user_name}/floreo/generate-monthly-report.sh

Monthly Artistic Report (Unified Native + Imported Data)

#!/bin/bash
# Generate monthly artistic report
# Combines native entries and imported historical entries by ORIGINAL date

user_name=$(cat ~/.openclaw/customers/.floreo-user 2>/dev/null || echo "default")
month_str=$(date +%B)
month_num=$(date +%m)
year=$(date +%Y)
days_in_month=$(date -v+1m -v1d -v-1d +%d)

# All entries use original date - imported entries from 6 months ago
# that were imported today will appear in their original month, not current month

report_file="~/.openclaw/customers/$user_name/floreo/insights/monthly-report-$year-$month_num.md"

cat > "$report_file" << 'REPORT'
╔══════════════════════════════════════════════════════════════╗
║                                                              ║
║     🌸  F L O R E O  M O N T H L Y  R E P O R T  🌸          ║
║                                                              ║
║                         YEAR MONTH                           ║
╚══════════════════════════════════════════════════════════════╝

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

REPORT

sed -i "s/YEAR/$year/" "$report_file"
sed -i "s/MONTH/$month_str/" "$report_file"

# Calendar heatmap (ASCII)
echo "" >> "$report_file"
echo "📅 M O N T H  A T  A  G L A N C E" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "" >> "$report_file"

# Generate calendar with activity indicators
cal | while read line; do
  echo "$line" >> "$report_file"
done

echo "" >> "$report_file"
echo "🔥 = High activity day  ·  📝 = Entry recorded  ·  · = No entries" >> "$report_file"

# Domain pie chart (ASCII)
echo "" >> "$report_file"
echo "📊 D O M A I N  D I S T R I B U T I O N" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "" >> "$report_file"

total_entries=$(find ~/.openclaw/customers/$user_name/floreo/domains -name "*.md" -newermt "$year-$month_num-01" ! -newermt "$year-$month_num-31" 2>/dev/null | wc -l)

for domain in work health learn relate create reflect; do
  count=$(find ~/.openclaw/customers/$user_name/floreo/domains/$domain -name "*.md" -newermt "$year-$month_num-01" ! -newermt "$year-$month_num-31" 2>/dev/null | wc -l)
  
  if [ $total_entries -gt 0 ]; then
    percentage=$((count * 100 / total_entries))
  else
    percentage=0
  fi
  
  case $domain in
    work) emoji="💼" color="\\033[0;34m" ;;
    health) emoji="💪" color="\\033[0;32m" ;;
    learn) emoji="📚" color="\\033[0;33m" ;;
    relate) emoji="🤝" color="\\033[0;35m" ;;
    create) emoji="🎨" color="\\033[0;36m" ;;
    reflect) emoji="🧘" color="\\033[0;37m" ;;
  esac
  
  printf "%s %-8s: %3d%% " "$emoji" "${domain^^}" "$percentage" >> "$report_file"
  
  # ASCII bar
  bar_len=$((percentage / 5))
  printf '%.0s█' $(seq 1 $bar_len) >> "$report_file"
  printf " %d entries\\n" "$count" >> "$report_file"
done

# Top metrics
echo "" >> "$report_file"
echo "📈 T O P  M E T R I C S" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "" >> "$report_file"

# Sum all metrics for the month
find ~/.openclaw/customers/$user_name/floreo/domains -name "*.md" -newermt "$year-$month_num-01" ! -newermt "$year-$month_num-31" -exec cat {} \; | \
  grep "^  [a-z_]*:" | \
  sed 's/^  //' | \
  awk -F: '{sum[$1]+=$2} END {for (m in sum) printf "  %-20s: %.1f\\n", m, sum[m]}' | \
  sort -t: -k2 -rn | \
  head -10 >> "$report_file"

# Achievements
echo "" >> "$report_file"
echo "🏆 M O N T H  A C H I E V E M E N T S" >> "$report_file"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >> "$report_file"
echo "" >> "$report_file"

achievements=0

# Check for consistency achievement
consecutive_days=$(find ~/.openclaw/customers/$user_name/floreo/domains -name "*.md" -mtime -30 | wc -l)
if [ $consecutive_days -ge 7 ]; then
  echo "🎯 Consistency: Logged entries for $consecutive_days days this month" >> "$report_file"
  achievements=$((achievements + 1))
fi

# Check for domain diversity
domain_count=0
for domain in work health learn relate create reflect; do
  if [ $(find ~/.openclaw/customers/$user_name/floreo/domains/$domain -name "*.md" -newermt "$year-$month_num-01" ! -newermt "$year-$month_num-31" 2>/dev/null | wc -l) -gt 0 ]; then
    domain_count=$((domain_count + 1))
  fi
done

if [ $domain_count -ge 4 ]; then
  echo "🌈 Balanced Life: Active in $domain_count life domains" >> "$report_file"
  achievements=$((achievements + 1))
fi

# Check for high activity
if [ $total_entries -ge 20 ]; then
  echo "🔥 High Activity: $total_entries entries this month" >> "$report_file"
  achievements=$((achievements + 1))
fi

if [ $achievements -eq 0 ]; then
  echo "💪 Keep going! Every entry is progress." >> "$report_file"
fi

# Footer
cat >> "$report_file" << 'FOOTER'

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

🌸 Flore per integra — Flourish through wholeness

📊 "In the ledger of life, every moment counts."

FOOTER

echo "Monthly report generated: $report_file"

One-Off Report Generation

Generate a daily artistic report for today by:
1. Finding all entries from today (15-04-26)
2. Creating a beautifully formatted markdown report
3. Including:
   - ASCII art header
   - Domain summaries with icons
   - Metrics summary
   - Mood/energy tracking
   - Tips for tomorrow
4. Saving to ~/.openclaw/customers/{user_name}/floreo/insights/daily-report-2026-04-15.md

Report Templates

Create template files for consistent styling:

# Daily template
cat > ~/.openclaw/customers/{user_name}/floreo/.templates/daily.md << 'EOF'
╔══════════════════════════════════════════════════════════════╗
║           🌸  F L O R E O  D A I L Y  R E P O R T  🌸        ║
╚══════════════════════════════════════════════════════════════╝

📅 {{DATE}} | Day {{DAY_OF_YEAR}} of 365

{{DOMAIN_SUMMARIES}}

📊 Metrics Today:
{{METRICS}}

🎭 Mood: {{MOOD}}/10 | Energy: {{ENERGY}}/10

💡 Tomorrow's Intention:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

🌸 Flore per integra
EOF

# Weekly template
cat > ~/.openclaw/customers/{user_name}/floreo/.templates/weekly.md << 'EOF'
╔══════════════════════════════════════════════════════════════╗
║      🌸  F L O R E O  W E E K L Y  R E P O R T  🌸           ║
╚══════════════════════════════════════════════════════════════╝

📅 Week {{WEEK_NUM}} | {{WEEK_START}} to {{WEEK_END}}

{{WEEKLY_HEATMAP}}

🏆 Highlights:
{{HIGHLIGHTS}}

📈 Trend: {{TREND}}

🌸 Flore per integra
EOF

🛡️ Skill Longevity & Maintenance

Floreo is designed to work reliably for years. This section documents how the skill maintains durability, backward compatibility, and future-proofing.

Version History & Compatibility

VersionDateBreaking Changes?Migration Required
v0.1.02026-04-10
v0.2.02026-04-15❌ NoAutomatic
v0.3.02026-04-15❌ NoAutomatic

Compatibility Guarantee: All entries created in v0.1.0+ remain fully readable in v0.3.0+ without modification.

Schema Versioning

Entries include implicit schema versioning through the type field:

# All versions use same base schema
type: entry                    # v0.1.0+ — Base entry
entry_id: FE-20260415-ABC123   # v0.1.0+ — Unique identifier
domain: work                   # v0.1.0+ — Life domain
date: 15-04-26                 # v0.1.0+ — Entry date
timestamp: 2026-04-15T10:00:00 # v0.1.0+ — ISO timestamp
privacy: internal              # v0.1.0+ — Privacy tier
metrics:                       # v0.1.0+ — Extensible metrics
  focus: 4
tags: project-x                # v0.1.0+ — Searchable tags

Adding New Fields: Simply add new fields to the YAML frontmatter. Old entries without them will be treated as null/undefined.

Backward Compatibility Guarantees

  1. Entry Format: The YAML frontmatter structure will never change in a breaking way
  2. File Paths: Directory structure domains/{domain}/{year}/{month}/{date}.md is permanent
  3. Entry ID Format: FE-{YYYYMMDD}-{6CHAR} will remain valid forever
  4. Shell Scripts: All documented shell commands use POSIX-standard tools (grep, sed, awk, bc)

Future-Proofing Strategies

1. Extensible Metrics

Add custom metrics without breaking existing entries:

metrics:
  # Core metrics (always supported)
  focus: 4
  commits: 5
  
  # Custom metrics (added anytime)
  my_custom_metric: 42
  another_field: "value"

New metrics are automatically included in analysis if they follow numeric conventions.

2. Graceful Degradation

All analysis scripts handle missing data gracefully:

# This safely handles missing fields
commits=$(grep "commits:" "$file" | sed 's/.*commits://' | tr -d ' ')
commits=${commits:-0}  # Default to 0 if not found

3. Idempotent Operations

Safe to re-run any operation:

  • Import same file multiple times → No duplicates (entry_id based)
  • Generate reports → Overwrites safely
  • Calculate metrics → Deterministic results

Migration Guides

If Entry Format Evolves (Future v0.4.0+)

#!/bin/bash
# migrate-entries.sh — Future migration script template

# 1. Backup existing entries
cp -r ~/.openclaw/customers/{user_name}/floreo/domains ~/floreo-backup-$(date +%Y%m%d)

# 2. Transform entries (example: adding new required field)
find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" | while read file; do
  # Add new field if missing
  if ! grep -q "new_field:" "$file"; then
    # Insert after 'type: entry' line
    sed -i '/^type: entry/a new_field: default_value' "$file"
  fi
done

echo "✅ Migration complete. Backup at ~/floreo-backup-*"

Preserving Old Data

Historical entries are never deleted or modified by new features:

  • New metrics = additive only
  • New domains = optional (old entries still work)
  • New reports = generated alongside, don't overwrite history

Maintainability Features

Single File Documentation

All documentation in one SKILL.md:

  • No external dependencies
  • No broken links
  • Self-contained reference
  • Easy to archive/share

No External Dependencies

  • ✅ No npm packages
  • ✅ No Python imports
  • ✅ No database required
  • ✅ No API keys
  • ✅ Works offline forever

POSIX Compliance

All shell scripts use POSIX-standard tools:

  • grep, sed, awk, bc, date, find
  • Works on macOS, Linux, BSD
  • No Bash 4+ specific features
  • No GNU-specific extensions

Durability Guarantees

AspectGuarantee
Data FormatPlain text Markdown + YAML — readable forever
StorageLocal filesystem — no service dependencies
ToolsPOSIX shell — available on all Unix systems
DependenciesZero — skill never breaks due to external changes
Backward Compat100% — old entries always readable
Future UpdatesAdditive only — never removes features

Long-Term Archival

Your Floreo data is future-proof:

# Complete backup (portable, future-proof)
tar czf floreo-archive-$(date +%Y%m%d).tar.gz \
  ~/.openclaw/customers/{user_name}/floreo/

# Restore anytime, anywhere with OpenClaw
# All entries remain readable without any tools
# Plain text = human readable even without software

Skill Maintenance Checklist

Annual Review (use heartbeat or cron):

1. Check entry count growth:
   Run shell: find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" | wc -l
   
2. Verify data integrity:
   Run shell: grep -l "^type: entry" ~/.openclaw/customers/{user_name}/floreo/domains/*/*/*/*.md | wc -l
   
3. Test a random entry is readable:
   Read random file from domains directory
   
4. Backup verification:
   Check backup exists from last 30 days

When OpenClaw Updates

Floreo is resilient to OpenClaw changes:

  • Uses only basic write, read, exec tools
  • No custom tool dependencies
  • No API integrations
  • Shell scripts work standalone

If OpenClaw changes significantly, you can still:

  1. Read entries directly: cat ~/.openclaw/customers/{user_name}/floreo/domains/work/2026/04/15-04-26.md
  2. Query with standard tools: grep -r "shipped" ~/.openclaw/customers/{user_name}/floreo/domains/
  3. Generate reports manually using the shell scripts in this SKILL.md

Limitations of Native Approach

FeatureCustom ScriptNative Tools
Auto-detection✅ Automatic❌ Manual
Suggestions✅ Smart❌ None
Indexing✅ O(1)❌ O(n) scan
Redaction✅ Automatic❌ Manual regex
UI✅ Rich❌ Text only

Trade-off: Simplicity vs. Features


Example: Complete Workflow

Morning Entry

Write to ~/.openclaw/customers/{user_name}/floreo/domains/health/2026/04/15-04-26.md:

---
type: entry
entry_id: FE-20260415-MORNING
domain: health
date: 15-04-26
day: 105
timestamp: 2026-04-15T07:00:00
privacy: private
metrics:
  energy: 8
  sleep: 7.5
tags: morning, routine
---
Morning routine complete. Feeling good today.

Mid-day Work Entry

Append to ~/.openclaw/customers/{user_name}/floreo/domains/work/2026/04/15-04-26.md:

---
type: entry
entry_id: FE-20260415-WORK1
domain: work
date: 15-04-26
day: 105
timestamp: 2026-04-15T12:00:00
privacy: internal
metrics:
  focus: 4
  commits: 3
tags: coding, feature-x
---
Shipped the authentication refactor. 4 hours deep work.

Evening Reflection

Append to ~/.openclaw/customers/{user_name}/floreo/domains/reflect/2026/04/15-04-26.md:

---
type: entry
entry_id: FE-20260415-REFLECT
domain: reflect
date: 15-04-26
day: 105
timestamp: 2026-04-15T21:00:00
privacy: private
metrics:
  mood: 8
  productivity: 9
tags: daily-review
---
Productive day. Shipped auth refactor and had good team sync.
Grateful for focused work time.

End of Week Review

Run shell command:
find ~/.openclaw/customers/{user_name}/floreo/domains -name "*.md" -mtime -7 | xargs cat > ~/.openclaw/customers/{user_name}/floreo/insights/week-16-review.md

Then read that file and summarize what was accomplished this week.

Resources


Floreo v0.2.1 — Built to Last. Flourish through wholeness, compounded, extended. 🌸