Skip to content

DirectorySkills

Year of activity grid: profile.html at desktop width, made in this run
Run 1Year of activity grid“Add a calendar heatmap of daily workouts to our running app's profile page. Details in brief.md, the data is runs.csv.”
Runs in
  • Claude Code
  • Codex
  • Cursor
  • Gemini CLI
  • GitHub Copilot
  • OpenCode
Generates with
Your agent's model
Tested with
Claude Code 2.1.322Claude Sonnet 5.51 real run, 12 Nov
Needs
Node 20+Chrome
Licence
Recaply licence

Year of Activity Grid

A year of daily activity as a calendar of small squares shaded by amount, with streaks, totals and keyboard reading.

$9.99once, yours to keep

Builds an activity calendar (heatmap) of the last 12 months into your own project: three stat tiles (days practised, longest streak, current streak) above a calendar of 53 week columns by 7 day rows; each day is a rounded square shaded from pale sand (none) to deep ocean blue (an hour); month names above, Mon, Wed and Fri at the side, a Less to More key below; arrow keys walk the days. Plain HTML, CSS and JavaScript, or matched to React, Next.js, Vue, Svelte, Astro or Tailwind when the project uses them. Comes with a working reference and a check that screenshots it at phone, tablet and desktop widths and flags sideways overflow, text under 12px, missing alt text and names, low contrast, no focus styles, motion that ignores reduced motion, leftover sample words and emoji icons. Use when an app tracks a daily habit or activity (practice, workouts, writing, commits, sales) and wants to show a year of it, or someone asks for a calendar heatmap, streak calendar or activity grid.

By RecaplyUpdated 12 Nov

Install Year of Activity Grid

After the download, ask your agent to add it, or run the line yourself.

Read https://recaply.co/skills/year-of-activity-grid/install.md and follow it to install the year-of-activity-grid skill from year-of-activity-grid.zip.

Paste it into your agent. It reads our install steps, finds the ZIP you downloaded and adds the skill for you.

New to skills? How to install a skill

Similar skills

All 735 skills

Who Year of Activity Grid is for

What you get

  • One HTML file with its CSS inside: no build step, no framework
  • An activity calendar (heatmap) of the last 12 months
  • Checked at phone and desktop widths

Good fit

  • When an app tracks a daily habit or activity

Not for

  • An app with a backend, sign-in or a database
  • Copying another company's site

About this skill

You say

Add a calendar heatmap of daily workouts to our running app's profile page. Details in brief.md, the data is runs.csv.

It said back

I added the running calendar as a standalone profile page. There was no existing app in the folder, so I used plain HTML, CSS and JavaScript. I couldn't integrate it into your real profile page.

I ran the skill's check at 390, 768 and 1440px before my last edit. All checks passed: no sideways overflow, no text under 12px, contrast, focus styles, reduced motion, no leftover sample words and no emoji icons. I didn't re-run it after reducing the grid height from 190px to 172px, so that last tweak is unchecked.

Show more

What it did in run 1

  1. year-of-activity-grid
  2. ls -la && cat brief.md && head -5 runs.csv && wc -l runs.csv
  3. S=.claude/skills/year-of-activity-grid && ls -R .claude | head -30 && cat $S/reference/index.html $S/reference/style.css $S/reference/script.js && node -e ' const l=require("fs").readFileSync("runs.csv","utf8").trim().split("\n").slice(1).map(x=>+x.split(",")[1]); let t=0,r=0,s=0,m=0;for(const v of l){t+=v;if(v>0){r++;s++;m=Math.max(m,s)}else s=0} console.log(t,r,m,s,l.length)'
  4. .claude/**/*
  5. node -e ' const l=require("fs").readFileSync("runs.csv","utf8").trim().split("\n").slice(1).map(x=>+x.split(",")[1]); let t=0,r=0,s=0,m=0;for(const v of l){t+=v;if(v>0){r++;s++;m=Math.max(m,s)}else s=0} console.log(t,r,m,s,l.length)'
  6. ./.claude/skills/year-of-activity-grid/reference/index.html
  7. ./.claude/skills/year-of-activity-grid/reference/style.css
  8. ./.claude/skills/year-of-activity-grid/reference/script.js
  9. mkdir -p /tmp/hmbuild && cat > /tmp/hmbuild/build.mjs <<'EOF' import fs from 'node:fs'; const dir = process.argv[2]; const rows = fs.readFileSync(dir + '/runs.csv', 'utf8').trim().split('\n').slice(1).map(l => l.split(',')); const km = rows.map(r => Math.round(+r[1] * 10) / 10); const mon = {}; rows.forEach((r, i) => { const d = new Date(r[0] + 'T00:00:00Z'); const k = d.getUTCFullYear() * 100 + d.getUTCMonth(); (mon[k] ??= { name: d.toLocaleDateString('en-GB', { month: 'long', year: 'numeric', timeZone: 'UTC' }), km: 0, n: 0 }); mon[k].km += km[i]; if (km[i] > 0) mon[k].n++; }); const tbody = Object.keys(mon).sort().map(k => <tr><th scope="row">${mon[k].name}</th><td>${mon[k].km.toLocaleString('en-GB', { minimumFractionDigits: 1, maximumFractionDigits: 1 })}</td><td>${mon[k].n}</td></tr>).join(''); let html = fs.readFileSync(dir + '/profile.template.html', 'utf8'); html = html.replace('__DATA__', JSON.stringify(km)).replace('__ROWS__', tbody).replace('__START__', rows[0][0]); fs.writeFileSync(dir + '/profile.html', html); EOF echo ok
  10. /tmp/hmbuild/build.mjs
  11. ./profile.template.html
  12. ./profile.css
  13. ./profile.js
  14. W=.; node /tmp/hmbuild/build.mjs $W && rm $W/profile.template.html && node $W/.claude/skills/year-of-activity-grid/scripts/check.mjs $W/profile.html --out /tmp/hmcheck 2>&1 | tail -40
  15. node /tmp/hmbuild/build.mjs . && rm profile.template.html && ls
  16. node .claude/skills/year-of-activity-grid/scripts/check.mjs profile.html --out /tmp/hmcheck 2>&1 | tail -40
  17. /tmp/hmcheck/1440.png
  18. /tmp/hmcheck/390.png
  19. ./profile.css
  20. Done

12 Nov 2026 · Claude Code 2.1.322 with Claude Sonnet 5.5 · 1 min 34 s · $0.29 of API use

Questions

Is Year of Activity Grid free?

No. Year of Activity Grid costs $9.99 once and stays in your Recaply account, or it comes with the Recaply plan ($19.99 a month), which opens every premium skill and prompt.

Which agents can use Year of Activity Grid?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.

What do I get when I buy Year of Activity Grid?

A ZIP of the whole skill folder (34 KB): the SKILL.md your agent follows and its 6 other files, the references, templates and scripts it uses. You download it from this page whenever you need it, and install it in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. The Recaply plan opens it too, with every other premium skill and prompt.

How do I install Year of Activity Grid?

Buy it, then download the ZIP from this page. For Claude Code, unzip it into .claude/skills/ in your project. For Codex, Cursor and Gemini CLI, unzip it and run npx skills add ./year-of-activity-grid with your agent's flag.

What do I get from Year of Activity Grid?

One HTML file with its CSS inside: no build step, no framework. An activity calendar (heatmap) of the last 12 months. Checked at phone and desktop widths.

What does Year of Activity Grid need?

Node 20+ and Chrome, and no API key. Each use costs nothing beyond your agent.

How big is Year of Activity Grid?

7 files, about 22,201 tokens in all. The SKILL.md is about 2,187 tokens, and your agent reads it only when the job fits.

What does a run cost?

Our 1 runs took 1 min 34 s to 1 min 34 s and $0.29 to $0.29 of API use each, in Claude Code with claude-sonnet-5-5. On a Claude plan, a run counts toward your usage instead.

Do I have to name Year of Activity Grid to use it?

Type /year-of-activity-grid first to make sure it loads. Without it, Claude Code may judge a small job simple enough to do without the skill.