Drag across any chart to zoom into that span · scroll to zoom · double-click to reset. Every chart and the totals below always show the same window.
Not stacked — every line starts from zero, so the highest line is whoever sent the most in that bucket. Same buckets and same window as the chart above.
Each bar is one bucket at 100%. Buckets with no messages are left blank.
Edit milestones.json and re-run python3 visualize.py to add more.
Click one to zoom to it. Faded entries are outside the current window.
Every year of the thread. Rows outside the current window are dimmed.
Built from the local Messages database. Only timestamps and sender identities were
read — no message content. A "message" is a real message: tapbacks/reactions and
group events (renames, joins) are excluded. The thread was renamed several times and
Messages spread it across six chat rows, all of which are included; each
participant used more than one handle over the years, and the phone/email pairings
were resolved against Contacts.