GitHub Personal Stats GitHub

The heat ring

The window it covers, the shape it takes, how it is scaled, and what sits in the middle.

Heat Ring

The dashboard and streak cards draw the current streak as a ring, where each node is one day and its depth is that day's contribution count. The ring covers exactly the days the number in its centre reports, so the two never disagree.

Everything below is optional. The defaults need no configuration.

Window

The window decides how many days the ring covers. streak follows the current streak, so every node is an active day. A fixed window covers a set number of days ending on the latest one, including quiet days.

--heat-window streak (default)
A 117 day streak

117 active days, one node each

--heat-window 30
A fixed window of 30 days

30 days, quiet ones in grey

--heat-limit 30
A streak capped at 30 days

The last 30 days of a 117 day streak

A streak is uncapped by default. --heat-limit caps how many days the ring draws without changing the streak itself, which is useful once a streak grows past the point where the ring stays informative. The date line under the ring always describes what the ring covers, not the whole streak.

Centre label

Three counts are available, and a template places them:

PlaceholderMeaning
{X}Days inside the window with at least one contribution
{Y}Days the window covers, which is the number of nodes on the ring
{Z}The current streak in full, before any limit shortens the ring

The default template depends on the window: {Y} for a streak, where all three counts are the same number, and {X}/last {Y} for a fixed window.

default, streak
Streak label
default, fixed
Active days over window
--heat-label "{X}/{Y}/{Z}"
Three counts
--heat-label "{X} of {Y} โ†’ {Z}"
Custom arrow template

A template is free text, so any separator works. Longer text is set at a smaller size to stay inside the ring; keep templates short if you want the count to stay prominent.

Shape

Radial ticks read well while they stay separable. Past roughly a hundred days they overlap into a furred edge, so the ring switches to arcs and averages neighbouring days into bands wide enough to see. segmented does this automatically and is the default.

--heat-shape ticks, 30 days
Ticks at 30 days

Clean and countable

ticks, 117 days
Ticks at 117 days

Crowded

arcs, 117 days
One arc per day at 117 days

One arc per day, under two pixels each

bands, 117 days
Averaged bands at 117 days

Days averaged into readable bands

ValueBehaviour
segmentedTicks up to the threshold, averaged bands beyond it (default)
ticksAlways one radial tick per day
arcsAlways one arc per day, however thin
bandsAlways averaged arcs

--heat-threshold moves where segmented switches over. It defaults to 100 days; --heat-threshold 87 switches at 87 instead.

Scale

The scale maps a day's contribution count onto the four colour stops. Contribution counts are usually heavy-tailed โ€” many ordinary days and a few large ones โ€” and each scale handles that tail differently.

--heat-scale linear (default)
Linear scale

Faithful to the raw counts, so a few big days dominate and ordinary days stay pale

sqrt
Square root scale

Keeps ordinary days visible while big days still stand out

log
Logarithmic scale

Compresses hard, so almost everything reads as busy

quantile
Quantile scale

Splits the window into four equal shares, giving the most contrast and the least relation to raw counts

Pick linear when you want the ring to be literal about volume. Pick sqrt when your busiest days are many times larger than your typical ones and the ring looks washed out.

Colour

heat-orange is the default. Six palettes are built in:

heat-orange
Heat orange
github-blue
GitHub blue
forest
Forest
violet
Violet
crimson
Crimson
graphite
Graphite

--heat-color also takes colours directly. One hex value becomes the busiest stop and the other three are derived from it in OkLab, which keeps the hue instead of fading towards grey; on a dark card the derivation runs the other way, as described under Themes. Four hex values, quietest first, are used exactly as given on every theme.

--heat-color "#8250df"
Ramp derived from one colour
--heat-color "#dbe9d5,#a3cf9a,#5aa04f,#1f6f2f"
Four explicit stops

Option reference

OptionDefaultAccepts
--heat-windowstreakstreak or a day count
--heat-limitnonea day count, or none
--heat-shapesegmentedsegmented, ticks, arcs, bands
--heat-threshold100a day count
--heat-scalelinearlinear, sqrt, log, quantile
--heat-colorheat-orangea palette name, one hex value, or four hex values
--heat-labelper windowfree text with {X}, {Y}, {Z}

Pass them through the Action the same way as any other option:

options: --user your-github-login --heat-window 60 --heat-scale sqrt --heat-color github-blue --heat-label "{X}/last {Y}"

Behaviour worth knowing