Life event tracker with three modes, milestone notifications, and tamper-evident verification.
> ClawHub Note: This skill is published as TARDIS on ClawHub after the original hour-meter listing was lost due to a repository sync issue.
# Quit smoking tracker
meter.py create smoke-free --start "2025-06-15T08:00:00Z" -d "Last cigarette"
meter.py milestone smoke-free -t hours -v 720 -m "🎉 30 days smoke-free!"
meter.py lock smoke-free # → Gives you paper code to save
# Baby due date
meter.py create baby --start "2026-01-15" --end "2026-10-15" --mode down -d "Baby arriving!"
meter.py milestone baby -t percent -v 33 -m "👶 First trimester complete!"
# Career span
meter.py create career --start "1998-05-15" --end "2038-05-15" -d "40-year career"
meter.py milestone career -t percent -v 50 -m "📊 Halfway through career!"
meter.py career --meter career --rate 85 --raise-pct 2.5
When you lock a meter, you get a paper code — a short, checksummed code you can write on paper:
╔══════════════════════════════════════════════════════════════╗
║ PAPER CODE (write this down): ║
║ 318B-3229-C523-2F9C-V ║
╚══════════════════════════════════════════════════════════════╝
1️⃣ PAPER — Write the code on paper/sticky note
2️⃣ PHOTO — Screenshot or photograph the lock screen
3️⃣ WITNESS FILE — Auto-saved to ~/.openclaw/meter-witness.txt
4️⃣ EMAIL TO SELF — Click the mailto: link or copy the one-liner
🔒 my-meter | Code: XXXX-XXXX-XXXX-XXXX-C | Locked: 2026-02-025️⃣ SENDGRID EMAIL — Auto-send verification email on lock
# Set your SendGrid API key
export SENDGRID_API_KEY=SG.xxxxx
export SENDGRID_FROM_EMAIL=verified@yourdomain.com
# Lock and email in one command
meter.py lock my-meter --email you@example.com
# With paper code (catches typos!)
meter.py verify my-meter "318B-3229-C523-2F9C-V"
# → ✅ VERIFIED! Paper code matches.
# → ⚠️ CHECKSUM ERROR! (if you have a typo)
# → ❌ MISMATCH! (if tampered)
meter.py milestone <name> --type hours --value 1000 --message "1000 hours!"
meter.py milestone <name> --type percent --value 50 --message "Halfway!"
meter.py check-milestones # JSON output for automation
Get milestone notifications sent directly to your email:
# Create meter with email notifications
meter.py create my-meter \
--notify-email you@example.com \
--from-email verified@yourdomain.com \
-d "My tracked event"
# Add milestones as usual
meter.py milestone my-meter -t hours -v 24 -m "🎉 24 hours complete!"
# When check-milestones runs and a milestone fires, email is sent automatically
meter.py check-milestones
# → Triggers milestone AND sends email notification
Email includes:
Requires SENDGRID_API_KEY environment variable.
Recommended: HEARTBEAT (~30 min resolution)
HEARTBEAT.md: Run meter.py check-milestones and notify triggeredMilestones post their message text to the configured notification channel when triggered:
# Posts the message when milestone fires
meter.py milestone my-meter -t hours -v 24 -m "🎉 24 hours complete!"
Configure in HEARTBEAT.md:
- Run meter.py check-milestones and post triggered milestone messages to the configured channel
> Advanced: Milestone messages prefixed with ACTION: can optionally be treated as agent instructions by your heartbeat config. This is an opt-in feature — see README.md for security considerations.
Alternative: CRON (precise timing)
Rule of thumb: If 30-minute resolution is acceptable, use heartbeat. Save cron for precision timing.
meter.py create <name> [--start T] [--end T] [--mode up|down|between] [-d DESC]
meter.py lock <name> # Seal + get paper code
meter.py verify <name> <code> # Verify paper code
meter.py check <name> # Status + progress
meter.py milestone <name> -t hours|percent -v N -m "..."
meter.py check-milestones # All milestones (JSON)
meter.py witness [--show] [--path] # Witness file
meter.py list # All meters
meter.py career [--meter M] [--rate R] [--raise-pct P]
meter.py export [name] # JSON export
Receive real-time notifications when recipients open, click, bounce, or unsubscribe from your meter verification emails.
# Start webhook server with Discord webhook (recommended)
python sendgrid_webhook.py --port 8089 --discord-webhook https://discord.com/api/webhooks/xxx/yyy
# Or process events manually (for agent to post)
python sendgrid_webhook.py --process-events
python sendgrid_webhook.py --process-events --json
--discord-webhook or set DISCORD_WEBHOOK_URL env varhttps://your-domain.com/webhooks/sendgridSENDGRID_WEBHOOK_PUBLIC_KEY| Event | Emoji | Description |
|---|---|---|
| ------- | ------- | ------------- |
| delivered | ✅ | Email reached recipient |
| open | 👀 | Recipient opened email |
| click | 🔗 | Recipient clicked a link |
| bounce | ⚠️ | Email bounced |
| unsubscribe | 🔕 | Recipient unsubscribed |
| spamreport | 🚨 | Marked as spam |
SENDGRID_WEBHOOK_PUBLIC_KEY # For signature verification (optional)
SENDGRID_WEBHOOK_MAX_AGE_SECONDS # Max timestamp age (default: 300)
WEBHOOK_PORT # Server port (default: 8089)
DISCORD_WEBHOOK_URL # Discord webhook URL
WEBHOOK_LOG_FILE # Log file path
Career as finite inventory: 40 years × 2,000 hrs/year = 80,000 hours.
meter.py career --hours-worked 56000 --rate 85 --raise-pct 2.5
# → 12.3 years remaining, $2.4M earning potential
共 1 个版本