Note: This skill was originally published to ClawHub as
hour-meter. Due to a repository issue that caused the original listing to be deleted, it has been republished under the name TARDIS. Same great functionality, cooler name! π
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βββ βββ βββββββ βββ ββββββββββ β
β βββ βββββββββββββββ βββββββββββ β
β βββββββββββ ββββββ βββββββββββ β
β βββββββββββ ββββββ βββββββββββ β
β βββ ββββββββββββββββββββββββ βββ β
β βββ βββ βββββββ βββββββ βββ βββ β
β ββββ ββββββββββββββββββββββββββββββββββββ β
β βββββ ββββββββββββββββββββββββββββββββββββββ β
β βββββββββββββββββ βββ ββββββ ββββββββ β
β βββββββββββββββββ βββ ββββββ ββββββββ β
β βββ βββ βββββββββββ βββ βββββββββββ βββ β
β βββ βββββββββββ βββ βββββββββββ βββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The moments that matter, measured and verified.
Concept & Design: Ross (@rm289)
Implementation: Claude (OpenClaw Agent)
Hour Meter is a tamper-evident time tracking skill for OpenClaw. Inspired by the analog Hobbs meters bolted to aircraft engines and industrial equipment, it brings that same reliability to the digital worldβwith cryptographic proof that your timestamps haven't been altered.
β±οΈ Meter: my-career (BETWEEN)
Career: College graduation β Retirement
π Start: 2024-05-15 14:00:00 UTC
π― End: 2064-05-15 14:00:00 UTC
[ββββββββββββββββββββ] 4.3%
β
Elapsed: 628d 1h 52m (15,074 hrs)
β³ Remaining: 13,981d 22h (335,566 hrs)
Milestones:
β 25.0%: π 25% - Establishing expertise
β 50.0%: π HALFTIME - Peak earning years
π LOCKED β (integrity verified)
π Paper code: F99B-C7C1-7F3B-2EDF-F
π LOCKED: smoke-free
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PAPER CODE (write this down): β
β β
β A7F3-B92C-1D4E-8F6A-7 β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π FOUR WAYS TO SAVE THIS:
1οΈβ£ PAPER: Write the code on paper/sticky note
2οΈβ£ PHOTO: Screenshot this screen
3οΈβ£ WITNESS FILE: Auto-saved to ~/.openclaw/meter-witness.txt
4οΈβ£ EMAIL TO SELF: Click the mailto: link
π Career Inventory Projection
Based on: my-career
Started: 2010-05-15
β±οΈ Hours worked: 55,442 hrs (27.7 yrs)
β³ Hours remaining: 24,558 hrs (12.3 yrs)
π¦ Total inventory: 80,000 hrs (40 yrs)
[ββββββββββββββββββββ] 69.3%
π° Current rate: $85.00/hr
π Annual raise: 2.5%
π― REMAINING EARNING POTENTIAL: $2,409,035
| Mode | Use Case | Example |
|---|---|---|
| Count Up | Time since an event | Quit smoking: "142 days clean" |
| Count Down | Time until a deadline | Baby due: "47 days remaining" |
| Count Between | Journey progress | Career: "69% complete, 12 years to retirement" |
Lock any meter to generate a cryptographic integrity hash. If anyone changes the start date later, verification fails. Trust, but verify.
Forget copying 64-character hex strings. Get a short, checksummed code you can actually write on paper:
PAPER CODE: A7F3-B92C-1D4E-8F6A-7
The checksum catches typos when you verify. Write it on a sticky note, email it to yourself, or let the witness file sync to your cloud storage.
Set triggers at specific hours or percentages:
- "Notify me at 1,000 hours smoke-free"
- "Alert at 75% of pregnancy complete"
- "Ping when career hits 90%"
Notifications route through any OpenClaw channelβDiscord, Telegram, Signal, Slack, and more.
Get milestone alerts sent directly to your inbox:
meter.py create my-meter \
--notify-email [email protected] \
-d "Important milestone tracker"
meter.py milestone my-meter -t hours -v 100 -m "π 100 hours reached!"When milestones fire, you get a beautifully formatted email notification!
Visualize your career as 80,000 hours of inventory (40 years Γ 2,000 hours/year). See your remaining earning potential with compound annual raises.
# Create a meter
meter.py create smoke-free --start "2025-06-15" -d "Last cigarette"
# Add milestones
meter.py milestone smoke-free -t hours -v 720 -m "π 30 days smoke-free!"
# Lock it (get your paper code)
meter.py lock smoke-free
# Check status anytime
meter.py check smoke-free
# Verify with your paper code
meter.py verify smoke-free "A7F3-B92C-1D4E-8F6A-7"- Paper β Write the code on a sticky note or in a notebook
- Photo β Screenshot or photograph the lock screen
- Witness File β Auto-saved to
~/.openclaw/meter-witness.txt(sync to Dropbox/iCloud) - Email (mailto) β Click the mailto: link or copy the one-liner to send to yourself
- Email (SendGrid) β Auto-send on lock with
--email:export SENDGRID_API_KEY=SG.xxxxx meter.py lock my-meter --email [email protected]
Get real-time notifications when recipients interact with your meter verification emails:
# Start webhook server with Discord webhook
python sendgrid_webhook.py --port 8089 \
--discord-webhook https://discord.com/api/webhooks/xxx/yyy
# Events supported:
# β
delivered - Email reached recipient
# π open - Recipient opened email
# π click - Recipient clicked a link
# β οΈ bounce - Email bounced
# π unsubscribe - Recipient unsubscribed
# π¨ spamreport - Marked as spamOr process events manually for agent integration:
python sendgrid_webhook.py --process-events --json- Go to SendGrid > Settings > Mail Settings > Event Webhook
- Enter your webhook URL:
https://your-server.com/webhooks/sendgrid - Select all event types you want to receive
- Click "Test Integration" to verify all events fire correctly
- Don't forget to click Save!
Since SendGrid needs to reach your webhook server, you'll need a public URL. Here are your options:
Option 1: Cloudflare Tunnel (Recommended for production)
# One-time setup (free Cloudflare account required)
cloudflared tunnel login
cloudflared tunnel create tardis-webhook
# Run the tunnel (permanent URL)
cloudflared tunnel run --url http://localhost:8089 tardis-webhookOption 2: Temporary Cloudflare Tunnel (No account needed)
# Quick & free, but URL changes each restart
cloudflared tunnel --url http://localhost:8089
# Gives you: https://random-words.trycloudflare.comOption 3: ngrok (Free tier available)
# Sign up at ngrok.com for a free auth token
ngrok http 8089After starting your tunnel, update the webhook URL in SendGrid settings.
Note: The unsubscribe functionality works regardless of whether you run the webhook serverβSendGrid handles unsubscribes server-side. The webhook just lets you see the events for logging and analytics.
For reliable Discord notifications, use a Discord webhook URL directly:
python sendgrid_webhook.py --port 8089 \
--discord-webhook "https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN"To create a Discord webhook:
- Server Settings β Integrations β Webhooks
- Click New Webhook
- Select your channel and copy the URL
Troubleshooting: If you get HTTP 403 errors, ensure your code includes a
User-AgentheaderβDiscord/Cloudflare blocks requests without one.
- Quit Tracking β Smoking, drinking, or any habit you're breaking
- Career Planning β Visualize your finite work hours and earning potential
- Pregnancy Countdown β Milestones for each trimester
- Project Hours β Tamper-evident billing records
- Equipment Runtime β Service interval tracking
- Warranty Dates β Locked start dates for disputes
- "Days Since" Displays β Last incident, last deploy, last vacation
Anyone can edit a text file with a date. Hour Meter creates a cryptographic proof:
- When you lock a meter, it computes
SHA256(name + timestamp + salt) - You save the resulting code externally (paper, email, cloud)
- Later, verify recomputes the hash and compares
If the timestamp was changed, the hashes won't match. Simple, offline-capable, and human-verifiable.
- SKILL.md β OpenClaw skill reference
- WHITEPAPER.md β Technical deep-dive
Environment Variables: meter.py will auto-load variables from ~/.env if SENDGRID_API_KEY is not already in the environment. This is opt-in behavior β if you don't use SendGrid email features, no .env file is accessed.
Webhook Server: sendgrid_webhook.py can forward events to a Discord webhook URL or OpenClaw gateway. These are user-configured destinations β the server never sends data anywhere without explicit configuration.
ACTION: Triggers (Advanced): Milestone messages can optionally be prefixed with ACTION: to signal your agent to execute them as instructions rather than just posting them. This is not enabled by default β it requires explicit configuration in your HEARTBEAT.md. If you use this feature, ensure your meters.json file is protected from unauthorized modification.
Meter Storage: Meter data is stored in ~/.openclaw/meters.json. The tamper-evident locking feature detects unauthorized changes to locked meters, but unlocked meters can be freely modified.
MIT β Use it, modify it, ship it.
TARDIS β Because some moments are worth proving. β±οΈ
