Install
openclaw skills install tardisTrack elapsed time from a set epoch with tamper-evident locking. Like an analog Hobbs meter but digital. Use for tracking uptime, service hours, time since events, sobriety counters, project duration, equipment runtime. Supports create, lock (seal), check, verify against external hash, list, and export operations.
openclaw skills install tardisLife 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-meterlisting 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