Quilt.

See every day you showed up.

Any CSV, stitched into a year of squares. Quilt turns a spreadsheet of dated events into the GitHub contribution grid you already know how to read. One command, one image, no account and no server.

Workout minutes, 2024 Mon Wed Fri Jan Feb Mar Apr May Jun Jul 2024-01-01: 10 2024-01-02: 4 2024-01-03: 35 2024-01-04: 38 2024-01-05: 33 2024-01-06: 6 2024-01-07: 5 2024-01-08: 36 2024-01-09: 37 2024-01-10: 15 2024-01-11: 0 2024-01-12: 4 2024-01-13: 26 2024-01-14: 15 2024-01-15: 9 2024-01-16: 10 2024-01-17: 37 2024-01-18: 44 2024-01-19: 38 2024-01-20: 13 2024-01-21: 36 2024-01-22: 0 2024-01-23: 40 2024-01-24: 44 2024-01-25: 21 2024-01-26: 30 2024-01-27: 16 2024-01-28: 0 2024-01-29: 0 2024-01-30: 37 2024-01-31: 32 2024-02-01: 0 2024-02-02: 0 2024-02-03: 5 2024-02-04: 27 2024-02-05: 22 2024-02-06: 32 2024-02-07: 43 2024-02-08: 36 2024-02-09: 21 2024-02-10: 23 2024-02-11: 38 2024-02-12: 0 2024-02-13: 6 2024-02-14: 0 2024-02-15: 43 2024-02-16: 45 2024-02-17: 37 2024-02-18: 0 2024-02-19: 0 2024-02-20: 25 2024-02-21: 0 2024-02-22: 30 2024-02-23: 40 2024-02-24: 4 2024-02-25: 19 2024-02-26: 16 2024-02-27: 32 2024-02-28: 29 2024-02-29: 18 2024-03-01: 0 2024-03-02: 0 2024-03-03: 0 2024-03-04: 27 2024-03-05: 0 2024-03-06: 0 2024-03-07: 15 2024-03-08: 12 2024-03-09: 43 2024-03-10: 32 2024-03-11: 0 2024-03-12: 19 2024-03-13: 27 2024-03-14: 40 2024-03-15: 9 2024-03-16: 0 2024-03-17: 40 2024-03-18: 0 2024-03-19: 0 2024-03-20: 44 2024-03-21: 0 2024-03-22: 26 2024-03-23: 31 2024-03-24: 0 2024-03-25: 5 2024-03-26: 0 2024-03-27: 8 2024-03-28: 4 2024-03-29: 37 2024-03-30: 7 2024-03-31: 0 2024-04-01: 0 2024-04-02: 14 2024-04-03: 0 2024-04-04: 17 2024-04-05: 0 2024-04-06: 0 2024-04-07: 8 2024-04-08: 0 2024-04-09: 0 2024-04-10: 31 2024-04-11: 10 2024-04-12: 22 2024-04-13: 0 2024-04-14: 45 2024-04-15: 2 2024-04-16: 34 2024-04-17: 45 2024-04-18: 2 2024-04-19: 0 2024-04-20: 42 2024-04-21: 0 2024-04-22: 0 2024-04-23: 24 2024-04-24: 0 2024-04-25: 15 2024-04-26: 33 2024-04-27: 15 2024-04-28: 0 2024-04-29: 0 2024-04-30: 0 2024-05-01: 16 2024-05-02: 0 2024-05-03: 0 2024-05-04: 34 2024-05-05: 2 2024-05-06: 0 2024-05-07: 0 2024-05-08: 13 2024-05-09: 0 2024-05-10: 0 2024-05-11: 23 2024-05-12: 0 2024-05-13: 15 2024-05-14: 31 2024-05-15: 14 2024-05-16: 40 2024-05-17: 0 2024-05-18: 42 2024-05-19: 42 2024-05-20: 43 2024-05-21: 25 2024-05-22: 0 2024-05-23: 0 2024-05-24: 12 2024-05-25: 41 2024-05-26: 26 2024-05-27: 6 2024-05-28: 0 2024-05-29: 9 2024-05-30: 38 2024-05-31: 0 2024-06-01: 0 2024-06-02: 39 2024-06-03: 0 2024-06-04: 0 2024-06-05: 36 2024-06-06: 2 2024-06-07: 42 2024-06-08: 9 2024-06-09: 13 2024-06-10: 0 2024-06-11: 17 2024-06-12: 33 2024-06-13: 38 2024-06-14: 35 2024-06-15: 9 2024-06-16: 23 2024-06-17: 0 2024-06-18: 0 2024-06-19: 0 2024-06-20: 33 2024-06-21: 10 2024-06-22: 2 2024-06-23: 0 2024-06-24: 0 2024-06-25: 0 2024-06-26: 0 2024-06-27: 10 2024-06-28: 8 2024-06-29: 21 2024-06-30: 0 2024-07-01: 31 2024-07-02: 0 2024-07-03: 36 2024-07-04: 13 2024-07-05: 7 2024-07-06: 36 2024-07-07: 5 2024-07-08: 40 2024-07-09: 0 2024-07-10: 0 2024-07-11: 18 2024-07-12: 35 2024-07-13: 0 2024-07-14: 16 2024-07-15: 0 2024-07-16: 0 2024-07-17: 0 2024-07-18: 36 Less More
Real output from habit-heatmap workouts.csv -o heatmap.svg --value-col minutes

Why people use it

Install and run

1. Install (Python 3.9 or newer)

# from GitHub; add the [png] extra for PNG output
pip install "git+https://github.com/ctkrug/habit-heatmap.git"

2. Point it at a CSV with a date column

habit-heatmap workouts.csv -o heatmap.svg \
  --value-col minutes \
  --theme blue \
  --label "Workouts"

3. Or use it as a library

from habit_heatmap import load_events, render_svg

counts = load_events("events.csv", value_col="minutes")
svg = render_svg(counts, theme="blue", label="Workouts")

What Quilt does

Quilt is a small Python tool that reads a CSV of dated events and draws a contribution heatmap: a calendar grid where each square is one day and darker squares mean a busier day. It is the GitHub contribution graph, no longer tied to commits and pointed at whatever you track. If your data has a date column, Quilt can chart it.

The input is any CSV with a date column. Each row counts as one event on its date, so a plain list of dates already becomes a streak grid. When a numeric column matters, name it with --value-col and Quilt sums that column per day instead of counting rows, so thirty minutes of exercise reads darker than five. Dates can be bare (2024-03-01), slash-separated, or full ISO 8601 timestamps, and the --tz option rebuckets timestamps into your own timezone before it counts them, which matters when an app logs everything in UTC.

The default output is an SVG string with no runtime dependencies, which is why the core installs as pure Python. SVG embeds directly in Markdown, a README, or a web page and scales without going fuzzy. When you need a raster file instead, name an output ending in .png and Quilt renders one through the optional cairosvg extra. Both paths share the same grid: month labels across the top, weekday labels down the side, a legend below, and a tooltip on every day.

Because the command line is a thin wrapper over two functions, load_events and render_svg, you can skip files entirely. load_events_from_rows takes an iterable of dictionaries straight from a database query or an API response, so Quilt fits into a script or a dashboard as easily as it runs at a terminal.

Questions

What file format does Quilt need?

A CSV with a header row and at least a date column. The date column defaults to date; use --date-col if yours is named something else. A numeric value column is optional.

Can I make a GitHub-style graph from my git history?

Yes. Export commit dates with git log --pretty=format:'%ad' --date=short, add a date header, and run Quilt on the result. The cookbook in the repo has the exact commands.

Do I need anything installed for PNG output?

Only for PNG. The SVG path is pure Python with no dependencies. PNG export pulls in cairosvg through the [png] extra, which needs the system cairo library.

Does it upload my data anywhere?

No. Quilt is a local command line tool. It reads your CSV and writes an image file. There is no account, no server, and no network call.

Can I change the colors?

Pick one of five built-in themes with --theme, or register your own five-color tuple in habit_heatmap.colors.THEMES and pass its name.