type: decision
status: active
timestamp: 2026-06-20
tags: [lifestream, jsonl, auto-tracking, github-webhooks, wakatime, cloudflare-web-analytics, decisions, architecture]

Lifestream auto-event sources — three streams (GitHub webhooks + Wakatime daily + CF Web Analytics daily)

Three auto-sources feed oriz-me JSONL lifestream \ auto-tracked event sources only \u2014 GitHub webhooks via Hookdeck, Wakatime\ \ daily-summary cron, and Cloudflare Web Analytics daily-summary cron. No manual\ \ entry, no minute-grain coding capture, no per-pageview visitor capture. Reinforces\ \ the auto-only-tracking rule."

Lifestream auto-event sources — three streams

Decision

The oriz-me JSONL canonical store is fed by three auto-tracked event sources, and ONLY these three. No manual entry, no IDE-heartbeat raw stream, no per-pageview hit capture. Each source streams day-grain (or event-grain for git) JSONL lines into chirag127/oriz-me-data/events-<YYYY>.jsonl.

#SourceTriggerGrainJSONL kind
1GitHub webhooksReal-time per-eventper-eventgit
2Wakatime daily summaryDaily cron 01:00 ISTper-daycoding
3CF Web Analytics daily summaryDaily cron 01:00 ISTper-day per-sitevisitors

This locks in the auto-only-tracking posture for the lifestream itself — every event in oriz-me arrives without a human pressing “log this”.

Source 1: GitHub webhooks

GitHub repo webhook ? Hookdeck ingress (retries + replay + dead-letter) ? CF Worker route at api.oriz.in/lifestream/git ? JSONL append.

Subscribed events:

JSONL line shape:

{"ts": "2026-06-20T11:42:13Z", "kind": "git", "repo": "chirag127/blog-site", "sha": "abc1234", "message": "feat: ship", "author": "chirag127", "url": "https://github.com/chirag127/blog-site/commit/abc1234"}

Idempotent on (repo, sha) for push, (repo, pr_number) for PR, (repo, tag) for release, (repo, run_id) for workflow_run. Hookdeck replay-safe.

Source 2: Wakatime daily-summary cron

GitHub Actions schedule 0 1 * * * (01:00 IST = 19:30 UTC previous day) fetches https://wakatime.com/api/v1/users/current/summaries?start=YYYY-MM-DD&end=YYYY-MM-DD, maps to one JSONL line per day, appends.

Stored only at day-grain, not minute-grain — keeps PII low and sidesteps Wakatime’s rolling 2-week free history (per the wakatime service file) by exporting every day before it ages out.

JSONL line shape:

{"ts": "2026-06-20T18:30:00Z", "kind": "coding", "date": "2026-06-20", "total_seconds": 14823, "languages": [{"name": "TypeScript", "seconds": 9120}, {"name": "Markdown", "seconds": 3201}], "projects": [{"name": "oriz-blog-site", "seconds": 6044}, {"name": "oriz", "seconds": 8779}]}

Wakatime API token in Doppler ? GH Secrets per secrets-management-doppler.

Source 3: CF Web Analytics daily-summary cron

GitHub Actions schedule 0 1 * * * fetches Cloudflare’s GraphQL Analytics API (https://api.cloudflare.com/client/v4/graphql) for each site zone, maps to one JSONL line per (date, site), appends.

JSONL line shape:

{"ts": "2026-06-20T18:30:00Z", "kind": "visitors", "date": "2026-06-20", "site": "blog.oriz.in", "pageviews": 1142, "unique": 318, "top_paths": [{"path": "/post/foo", "pv": 412}, {"path": "/", "pv": 287}]}

Eleven sites × one line per day = 11 JSONL events / day. Negligible file growth at the JSONL canonical “~10 MB/year” envelope.

CF API token (read-only Analytics scope) in Doppler.

Why these three only

The user direction was: “ALL THREE — GitHub webhooks + Wakatime daily-summary + CF Web Analytics summary all stream to JSONL” — and nothing else. Each source covers a distinct surface:

Together they answer “what was I doing yesterday?” without any tool that requires a human to press “start timer” or “log this”. Manual non-coding time tracking lives separately in Toggl Track per

;

that source is explicitly NOT wired into the auto-only lifestream JSONL because it requires a human action.

Implications

Cross-refs


Edit on GitHub · Back to index