As someone deeply engaged in self-development, knowing where my time goes is crucial for tracking my growth and revealing hidden habits. What motivated this calendar originally was trying to recall what I did in a day and realising it doesn't add up to 24 hours, but rather to 20–22. I'm not particularly worried about having "unproductive" hours, but having "lost" time does matter.
Since the day I started this calendar, I have kept track of all my activities in intervals of 15 minutes. The act of tracking itself probably helped me become more productive, through the gained awareness, as can be seen by comparing the first (mostly orange-red) month with any of the latest months. Wanting to take it one step further, I made the calendar public to give myself the extra pressure that comes with knowing that professors, recruiters, or other third parties might find this page, even if I rarely share the link myself.
About the Data:
Blocks shorter than 15 minutes will not be logged. This includes short daily workouts, short language-learning sessions (current streak of days on Duolingo) or other tasks.
Some sensitive or private information, such as showering, is either not logged or reframed.
While I try to update the data in the moment, there are times when it is not possible, causing blocks to be overshadowed. The most common example of this is with Dinner/Lunch blocks, which I am sometimes unable to trace back when they overlapped with an activity I was doing both before and after (Work, Research, etc.)
calendar_view_monthCalendar
Loading calendar data...
tuneFilters
query_statsAnalytics
scheduleTotal time0hCurrent filtercategoryBlocks0Matching blockstrending_upPeak month—No data
terminalCustom Insights
A programmable console over the raw log. Write JavaScript against data (a queryable wrapper around every event), render results with out (which prints page elements, not raw dumps), and lean on stats for medians, correlations, and formatting. Pick a recipe to see it in action, then edit, save, and re-run.
Click a highlighted name in the code to swap that activity or category.
In scope: data, out, stats. Press Ctrl/⌘ + Enter to run. Start from the Activity vocabulary recipe to discover the exact names used below.
expand_moreInterface reference
data — CalendarDataset
data.blocks / data.events — day-split segments vs. events re-merged across midnight. Both are arrays sorted by start.
A block is { summary, activities, color, category, start, end, hours, dayKey, weekday, month, year, startMinutes, isContinuation, raw } — activities is the +-split label list, start/end are Dates, dayKey is "YYYY-MM-DD", weekday is 0–6 (0=Sun), month is 0–11 (0=Jan), startMinutes counts from midnight, and raw is the source event.
An event has those same fields except isContinuation and raw are replaced by spanDays (calendar days the event covers, ≥ 1).
data.days / data.calendarDays() — per-day view; each day is { dayKey, date, blocks }. calendarDays() also emits empty days for gaps in the log.
data.range — { firstDay, lastDay, totalDays }, the logged date span (gaps included).
data.activities() — every activity name, most-used first: { name, color, hours, blocks, count, days, first, last }, where blocks is the day-split count, count the merged-event count, days the number of distinct days, and first/last are Dates.
data.categories() — every colour-category, most-used first: { name, color, hours, days }.
data.withActivity(name), data.blocksOf(name), data.hoursOf(name), data.colorOf(name) — the events, blocks, total hours and representative colour for one activity.
data.has(item, name), data.hasAny(item, names) — membership tests for a block/event.
data.hasName(name), data.hasCategory(name), data.entryColor(name), data.categoryColor(name) — whether a name is a known activity/category, and its colour (or null).
data.precededBy(name) / data.followedBy(name) — timeline neighbours as [name, count] pairs, most frequent first, for "what comes before/after X" correlations.
Use Copy as Markdown under the results to share a run (optionally with its code and notes on the activities involved). Snippets run in your browser only — nothing is uploaded, and saved queries live in this browser's local storage. They read a copy of the loaded data, so you can't corrupt the calendar.