From 18dd1487b873096f49717848d40f2ad0834fdbef Mon Sep 17 00:00:00 2001 From: m3hrab Date: Tue, 8 Sep 2026 11:07:10 +0600 Subject: [PATCH] fix(generator): prevent month labels from overlapping on partial first weeks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub's contribution calendar almost always starts on a partial week, which could flag two 'month changed' events one column (12px) apart — not enough room for two 3-letter labels, so they rendered stacked on top of each other. Enforce a minimum 36px gap between rendered labels; a month change that's too close to the previous label is skipped rather than drawn, and picked up cleanly at the next real boundary. Verified against the worst case (a mid-week start date straddling a month boundary) — extracted label x-coordinates confirm >=36px spacing in all cases. --- .github/ISSUE_TEMPLATE/config.yml | 2 + .github/workflows/self-showcase.yml | 41 +++ CONTRIBUTING.md | 24 +- README.md | 491 ++++++++++------------------ docs/constellation-dark.svg | 44 +++ docs/constellation-light.svg | 44 +++ docs/hero-dark.svg | 44 --- docs/hero-light.svg | 44 --- src/generate-constellation.js | 93 ++++-- 9 files changed, 377 insertions(+), 450 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/workflows/self-showcase.yml create mode 100644 docs/constellation-dark.svg create mode 100644 docs/constellation-light.svg delete mode 100644 docs/hero-dark.svg delete mode 100644 docs/hero-light.svg diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..8005e32 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,2 @@ +blank_issues_enabled: false +contact_links: [] diff --git a/.github/workflows/self-showcase.yml b/.github/workflows/self-showcase.yml new file mode 100644 index 0000000..4a09a29 --- /dev/null +++ b/.github/workflows/self-showcase.yml @@ -0,0 +1,41 @@ +name: Refresh README Preview + +# Dogfoods this repo's own action: renders the maintainer's real +# contribution constellation and commits it into docs/, so the hero image +# in README.md is a genuinely live, self-updating render — not a static +# placeholder. Anyone can verify this by checking the commit history on +# docs/constellation-dark.svg. + +on: + schedule: + - cron: "0 3 * * *" # once a day + workflow_dispatch: {} + push: + branches: [main] + paths: + - "src/generate-constellation.js" + - "action.yml" + +permissions: + contents: write + +jobs: + showcase: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Generate maintainer's own constellation (dogfooding) + uses: ./ + with: + github_user: m3hrab + github_token: ${{ secrets.SHOWCASE_TOKEN }} + output_dir: docs + + - name: Commit and push if changed + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add docs/ + git diff --staged --quiet || git commit -m "chore: refresh README preview constellation" + git push diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 47e4ee7..6611c0e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -79,19 +79,29 @@ branch and reference it from a scratch workflow/repo: github_token: ${{ secrets.GITHUB_TOKEN }} ``` +### About the self-showcase workflow + +`.github/workflows/self-showcase.yml` is maintainer-only tooling — it runs +this repo's own action against the maintainer's real GitHub profile and +commits the result into `docs/`, which is what makes the hero image in +`README.md` a genuinely live render instead of a static placeholder. It +needs a `SHOWCASE_TOKEN` repository secret to run. Contributors don't need +this secret and can ignore this workflow entirely — it won't run on PRs +from forks. + ## Branch naming ``` / ``` -| Type | Use for | Example | -| ----------- | ------------------------------- | --------------------------------- | -| `feat/` | new feature | `feat/minimal-layout-option` | -| `fix/` | bug fix | `fix/light-theme-color-parsing` | -| `docs/` | docs only | `docs/inputs-table-typo` | -| `chore/` | tooling, CI, deps | `chore/bump-setup-node-v5` | -| `refactor/` | no behavior change | `refactor/extract-svg-builder` | +| Type | Use for | Example | +| ----------- | ------------------ | ------------------------------- | +| `feat/` | new feature | `feat/minimal-layout-option` | +| `fix/` | bug fix | `fix/light-theme-color-parsing` | +| `docs/` | docs only | `docs/inputs-table-typo` | +| `chore/` | tooling, CI, deps | `chore/bump-setup-node-v5` | +| `refactor/` | no behavior change | `refactor/extract-svg-builder` | Lowercase, hyphens (not underscores), 2–5 words. Issue numbers go in the PR description, not the branch name. diff --git a/README.md b/README.md index 0023088..fdf7daa 100644 --- a/README.md +++ b/README.md @@ -4,44 +4,55 @@ ### Turn your GitHub contributions into a living night sky. -**Stars for your coding days. · Glow for your streaks. · Color for your journey.** +**Stars for your coding days · Glow for your streaks · Color for your journey** -github-constellation preview +github-constellation live preview — the maintainer's real contribution history -
+↑ This is a real render of the maintainer's own contributions, refreshed daily by this repo's own Action — not a mockup. -[![Marketplace](https://img.shields.io/badge/GitHub%20Action-github--constellation-181717?logo=github\&logoColor=white)](https://github.com/marketplace/actions/github-constellation) -[![GitHub stars](https://img.shields.io/github/stars/m3hrab/github-constellation?style=flat\&logo=github\&color=gold)](https://github.com/m3hrab/github-constellation/stargazers) -[![Latest release](https://img.shields.io/github/v/release/m3hrab/github-constellation?style=flat)](https://github.com/m3hrab/github-constellation/releases) -[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) +

-
+[![Marketplace](https://img.shields.io/badge/GitHub%20Action-github--constellation-181717?logo=github&logoColor=white)](https://github.com/marketplace/actions/github-constellation) +[![GitHub stars](https://img.shields.io/github/stars/m3hrab/github-constellation?style=flat&logo=github&color=gold)](https://github.com/m3hrab/github-constellation/stargazers) +[![Latest release](https://img.shields.io/github/v/release/m3hrab/github-constellation)](https://github.com/m3hrab/github-constellation/releases) +[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) +[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md) -**A beautiful, zero-runtime-dependency GitHub Action that transforms your contribution calendar into a generative constellation.** +**A zero-runtime-dependency GitHub Action that transforms your contribution +calendar into a generative constellation.** --- -## ✨ What is this? +### Contents -Your GitHub contribution graph tells a story — but it looks like a spreadsheet. +[What is this](#-what-is-this) · [How it works](#-how-it-works) · +[Features](#-features) · [Quick Start](#-quick-start) · +[Customize](#-customize-your-sky) · [Inputs](#-inputs) · +[Gallery](#️-gallery) · [Design philosophy](#-design-philosophy) · +[Architecture](#-performance--architecture) · [Security](#-security) · +[FAQ](#-faq) · [Contributing](#-contributing) · [License](#-license) -**github-constellation** turns that same contribution history into a visual night sky. +--- -Every contribution day becomes a star. -More commits make the star brighter and larger. -Streaks become glowing constellation lines. -Recent activity shifts the color toward the newest end of the gradient. -Big coding days gently pulse like they're still alive. +## ✨ What is this? -The result is a **self-updating SVG** you can embed directly into your GitHub profile README. +Your GitHub contribution graph tells a story — but it looks like a +spreadsheet. -> **Your contribution history, visualized as a constellation.** +**github-constellation** turns that same contribution history into a night +sky. Every contribution day becomes a star. More commits make it brighter +and larger. Streaks become glowing constellation lines. Recent activity +shifts the color toward the newest end of the gradient. Your biggest days +gently pulse, like they're still alive. ---- +The result is a **self-updating SVG** you embed directly in your GitHub +profile README. -## 🌌 How it works +> Your contribution history, visualized as a constellation. + +## 🌠 How it works ```text GitHub Contributions @@ -50,10 +61,10 @@ GitHub Contributions GraphQL API │ ▼ -┌─────────────────────┐ -│ github-constellation│ -│ generator │ -└──────────┬──────────┘ +┌──────────────────────┐ +│ github-constellation │ +│ generator │ +└──────────┬────────────┘ │ ├── ⭐ Contribution days → Stars ├── 📏 Commit count → Size @@ -72,99 +83,78 @@ GitHub Contributions GitHub README ``` -Everything is generated ahead of time. - -**No client-side API calls. No JavaScript on your profile. No runtime server.** - ---- +Everything is generated ahead of time. **No client-side API calls, no +JavaScript on your profile, no runtime server** — just two static SVGs that +happen to have a CSS twinkle animation baked in. ## ⭐ Features -### Contribution → Visual mapping +### Contribution → visual mapping | GitHub data | Constellation | | ----------------- | --------------------- | -| Contribution day | ⭐ Star | +| Contribution day | ⭐ Star | | Commit count | 📏 Star size | | Contribution date | 🎨 Color | | Consecutive days | 〰️ Constellation line | | High-activity day | 💫 Pulse / twinkle | -| No contributions | · Background dust | +| No contributions | · Dim background dust | ### Built for GitHub -* 🌗 **Dark + light SVGs** generated automatically -* 🎨 **Fully customizable gradients** -* 💫 **Animated twinkle effects** for high-activity days -* 〰️ **Smooth constellation curves** connecting streaks -* 📊 **Commit-aware star sizing** -* ⚙️ **Configurable through GitHub Action inputs** -* 🔄 **Automatically regenerates every day** -* 🧵 **Zero runtime dependencies** -* 🚀 **Works directly from a GitHub repository** -* 📦 **Produces static SVG output** -* 🔐 **No external database or hosted service required** - ---- +- 🌗 Dark **and** light SVGs, generated together +- 🎨 Fully customizable gradient colors for both themes +- 💫 Animated twinkle + breathing halo on standout days +- 〰️ Smooth Catmull-Rom curves connecting streaks, not straight connectors +- 📊 Commit-aware, capped star sizing (one huge day won't flatten the rest) +- ⚙️ Every tunable exposed as an action input +- 🔄 Regenerates on whatever schedule you set +- 🧵 **Zero runtime dependencies** — one Node script using only `fs`, + `path`, and `https` +- 📦 Produces plain static SVG output +- 🔐 No external database, no hosted service, nothing to trust but your + own repo ## 🚀 Quick Start -### 1. Create a GitHub token - -Create a **classic Personal Access Token** with no scopes: - -[Create a GitHub Personal Access Token](https://github.com/settings/tokens/new?utm_source=chatgpt.com) - -Then add it to your repository: - -**Settings → Secrets and variables → Actions → New repository secret** +Three steps: add a token secret, add a workflow, push. -Use: +**1. Create a token.** +Generate a [classic Personal Access Token](https://github.com/settings/tokens/new) +— no scopes needed, since it only reads public contribution data — and add +it to your repository as a secret: ```text +Settings → Secrets and variables → Actions → New repository secret Name: CONSTELLATION_TOKEN Value: ``` -> **Why a PAT?** -> -> The workflow needs to query GitHub's GraphQL API for contribution data. -> The repository-scoped `GITHUB_TOKEN` can be restrictive when querying -> contribution information outside the current repository. +> **Why a PAT instead of the built-in `GITHUB_TOKEN`?** The built-in token +> is scoped narrowly to the repo running the workflow and isn't reliably +> able to query another user's GraphQL contribution data across every +> GitHub setup. A plain classic PAT sidesteps that entirely. See the +> [FAQ](#-faq) for more. ---- - -### 2. Add the workflow - -Create: - -```text -.github/ -└── workflows/ - └── constellation.yml -``` - -Then add: +**2. Add the workflow.** +Create `.github/workflows/constellation.yml`: ```yaml name: Update Constellation on: schedule: - - cron: "0 0 * * *" - workflow_dispatch: + - cron: "0 0 * * *" # once a day; tweak to taste + workflow_dispatch: {} permissions: contents: write jobs: generate: - name: Generate constellation runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - name: Generate constellation uses: m3hrab/github-constellation@v1 @@ -172,57 +162,31 @@ jobs: github_user: ${{ github.repository_owner }} github_token: ${{ secrets.CONSTELLATION_TOKEN }} - - name: Commit generated SVGs + - name: Commit and push if changed run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - git add dist/ - - if git diff --staged --quiet; then - echo "No constellation changes." - else - git commit -m "chore: update constellation" - git push - fi + git diff --staged --quiet || git commit -m "chore: update constellation" + git push ``` ---- - -### 3. Add it to your profile README +**3. Embed it in your profile README.** ```markdown - - - My GitHub contribution constellation + + + My GitHub contribution constellation ``` -Then run: - -**Actions → Update Constellation → Run workflow** - -That's it. - -Your contribution constellation will regenerate automatically. - ---- +Trigger it once via **Actions → Update Constellation → Run workflow**, and +you're done — it stays current on the schedule from here on. ## 🎨 Customize your sky -You don't have to use the defaults. - -For example: +You don't have to use the defaults: ```yaml - name: Generate constellation @@ -230,264 +194,153 @@ For example: with: github_user: ${{ github.repository_owner }} github_token: ${{ secrets.CONSTELLATION_TOKEN }} - commit_cap: 25 twinkle_min_commits: 12 - recent_color_dark: "#ffd166" old_color_dark: "#6c63ff" - recent_color_light: "#b86b00" old_color_light: "#4338ca" - layout: "full" ``` -### Available inputs - -| Input | Required | Default | Description | -| --------------------- | :------: | --------: | ------------------------------------------- | -| `github_user` | ✅ | — | GitHub username to visualize | -| `github_token` | ✅ | — | GitHub GraphQL API token | -| `commit_cap` | ❌ | `20` | Maximum commit count used for star scaling | -| `twinkle_min_commits` | ❌ | `10` | Minimum commits required for a pulsing star | -| `recent_color_dark` | ❌ | `#ffcf5c` | Recent-date gradient color for dark mode | -| `old_color_dark` | ❌ | `#7c6fe0` | Old-date gradient color for dark mode | -| `recent_color_light` | ❌ | `#c9820a` | Recent-date gradient color for light mode | -| `old_color_light` | ❌ | `#463c94` | Old-date gradient color for light mode | -| `output_dir` | ❌ | `dist` | Generated SVG output directory | -| `layout` | ❌ | `full` | `full` or `minimal` | - -### Layouts +## 🔧 Inputs -**`full`** +| Input | Required | Default | Description | +| --------------------- | :------: | --------- | --------------------------------------------------------------------------------------- | +| `github_user` | ✅ | — | GitHub username whose contribution calendar to render. | +| `github_token` | ✅ | — | Token with read access to the GitHub GraphQL API. See Quick Start above. | +| `commit_cap` | ❌ | `20` | Commit count at which star size/opacity growth is capped. | +| `twinkle_min_commits` | ❌ | `10` | Minimum commits in a day required for that day's star to twinkle and pulse. | +| `recent_color_dark` | ❌ | `#ffcf5c` | Hex color for the most-recent end of the gradient, dark theme. | +| `old_color_dark` | ❌ | `#7c6fe0` | Hex color for the oldest end of the gradient, dark theme. | +| `recent_color_light` | ❌ | `#c9820a` | Hex color for the most-recent end of the gradient, light theme. | +| `old_color_light` | ❌ | `#463c94` | Hex color for the oldest end of the gradient, light theme. | +| `output_dir` | ❌ | `dist` | Directory the generated SVGs are written to. | +| `layout` | ❌ | `full` | `full` (month/weekday labels + stats caption) or `minimal` (bare star grid, no chrome). | -Includes labels and the statistics caption. +**Outputs:** `dark_svg_path` and `light_svg_path` — absolute paths to the +two generated files, for later steps in your workflow to reference. -**`minimal`** +### Layouts -Just the constellation — ideal for compact profile layouts. +**`full`** — includes month/weekday labels and the stats caption (total +contributions, longest streak, current streak, busiest month). ---- +**`minimal`** — just the constellation, no chrome. Good for tight embeds +next to an avatar or in a compact profile layout. ## 🖼️ Gallery -### Dark sky +Both themes below are the maintainer's real sky, live — see +[How it works](#-how-it-works) and the workflow linked under the hero image +at the top of this README. -Dark github-constellation example + + + + + +
Dark
Dark theme constellation
Light
Light theme constellation
-### Light sky - -Light github-constellation example - -> Have a particularly beautiful constellation? -> Open a PR and add it to the gallery. - ---- +> Using github-constellation on your own profile? Open a PR adding a +> screenshot to this section — real skies are the best advertisement this +> project has. ## 🧠 Design philosophy -github-constellation intentionally keeps the visualization simple. - -It doesn't try to turn your GitHub history into a dashboard full of charts. - -Instead, it answers one question: +github-constellation intentionally keeps the visualization simple. It +doesn't try to turn your GitHub history into a dashboard full of charts — +it answers one question: > **What would my coding year look like if it were a night sky?** -That means every visual element has a purpose: - -**Stars** represent consistency. -**Size** represents effort. -**Color** represents time. -**Lines** represent momentum. -**Glow** represents exceptional days. - -The goal isn't more data. - -**It's a more memorable way to see the data you already have.** - ---- +Every visual element has exactly one job: **stars** represent consistency, +**size** represents effort, **color** represents time, **lines** represent +momentum, **glow** represents exceptional days. The goal isn't more data — +it's a more memorable way to see the data you already have. ## ⚡ Performance & architecture -github-constellation is deliberately lightweight. +The generator uses only Node.js built-ins — `fs`, `path`, `https`. There's: -The generator uses only Node.js built-ins: +- ❌ No npm dependencies +- ❌ No database +- ❌ No hosted backend +- ❌ No client-side API requests at view-time +- ❌ Nothing running except a CSS animation already baked into the SVG ```text -fs -path -https +GitHub Actions → Generate SVG → Commit to repo → GitHub README → ⭐ ``` -There are: - -* ❌ No npm dependencies -* ❌ No database -* ❌ No hosted backend -* ❌ No client-side API requests -* ❌ No external runtime service - -The workflow generates static SVG files and commits them to your repository. - -Your profile simply displays those files. - -```text -GitHub Actions - │ - ▼ -Generate SVG - │ - ▼ -Commit to repo - │ - ▼ -GitHub README - │ - ▼ - ⭐ -``` - ---- +The workflow generates static files and commits them. Your profile just +displays those files — there's nothing to keep running, scale, or pay for. ## 🔐 Security -The action only needs access to GitHub's GraphQL API to retrieve contribution information. - -Your token should be stored as a **GitHub Actions secret**: - -```text -CONSTELLATION_TOKEN -``` - -Never hard-code your token into: - -* workflow files -* source code -* README files -* commits -* issues -* pull requests - -For public contribution data, use the minimum permissions necessary. - ---- +The action only needs read access to GitHub's GraphQL API to fetch +contribution data. Store your token as a repository secret +(`CONSTELLATION_TOKEN`) — never hard-code it into workflow files, source +code, commits, issues, or pull requests. A classic PAT with no scopes is +sufficient for public contribution data; don't grant it more than that. ## ❓ FAQ -### Does it support private contributions? - -Yes, subject to what GitHub exposes through your authenticated contribution -data and your profile's private-contribution settings. - -### Can I generate a constellation for another GitHub user? - -The action accepts any `github_user` value for which the supplied token can -retrieve the required contribution data. - -However, the project is primarily designed for representing **your own -GitHub profile**. - -### Why not use `GITHUB_TOKEN`? - -The built-in token is scoped to the repository running the workflow and may -not provide the access needed for contribution queries in every setup. - -A classic PAT provides a more predictable authentication path for the -GraphQL request. - -### Does the SVG require a server? - -No. - -The SVG is generated once and stored in your repository as a static file. - -### Does the animation work on GitHub? +**Does this work with private contributions?** +Yes. The GraphQL `contributionsCollection` query returns the same data +shown on your public profile — including private contributions, if you've +enabled _Include private contributions_ in your GitHub profile settings — +using whatever token you supply. -The generated SVG contains the animation itself, so the README only needs -to reference the resulting SVG. +**Can I generate a constellation for someone else's profile, or an org's?** +The action accepts any `github_user` your token can read contribution data +for, but this is built for representing **your own** profile — only render +a sky for an account you have permission to represent. -### Can I run the generator locally? +**Why a PAT instead of the built-in `GITHUB_TOKEN`?** +The built-in token is scoped to the repo running the workflow and isn't +reliably able to query GraphQL contribution data for arbitrary accounts +across every GitHub setup (personal, organization, Enterprise). A classic +PAT provides a predictable authentication path for that request. -Yes. +**Does the SVG require a server?** +No. It's generated once per scheduled run and stored as a static file. Your +README just references it. -The generator is a regular Node.js script: +**Does the animation actually work on GitHub?** +Yes — the twinkle and glow are CSS animations baked directly into the SVG +markup, so they play wherever the SVG itself renders, no extra script +needed. -```bash -node src/generate-constellation.js -``` - -See [CONTRIBUTING.md](CONTRIBUTING.md#testing-locally) for development and -testing instructions. - ---- - -## 🛠️ Development - -Clone the repository: +**Can I run the generator locally, outside GitHub Actions?** +Yes — `src/generate-constellation.js` is a plain, dependency-free Node +script: ```bash -git clone https://github.com/m3hrab/github-constellation.git -cd github-constellation -``` - -Run the generator: - -```bash -node src/generate-constellation.js -``` - -Generated files will appear in: - -```text -dist/ -├── constellation-dark.svg -└── constellation-light.svg +GITHUB_TOKEN=xxx GITHUB_USER=octocat node src/generate-constellation.js ``` ---- +See [CONTRIBUTING.md](CONTRIBUTING.md#testing-locally) for the full local +development workflow. ## 🤝 Contributing -Ideas, bug reports, improvements, visual experiments, and gallery -submissions are welcome. - -Before opening a pull request, please read: - -* [CONTRIBUTING.md](CONTRIBUTING.md) -* [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) - -If you build something interesting with github-constellation, I'd love to -see it. - ---- +Bug reports, feature ideas, and gallery submissions are all welcome — see +[CONTRIBUTING.md](CONTRIBUTING.md) for branch naming, commit conventions, +and how to test locally. Please be excellent to each other; see the +[Code of Conduct](CODE_OF_CONDUCT.md). ## 📄 License -Released under the **MIT License**. - -See [LICENSE](LICENSE) for details. - ---- +Released under the [MIT License](LICENSE) — do whatever you want with it. ## ⭐ Star History - + - - - Star History Chart + + + Star History Chart @@ -495,11 +348,7 @@ See [LICENSE](LICENSE) for details.
-### 🌌 Your commits are more than green squares. - -**They're a story. Turn it into a constellation.** - -
+### Your commits are more than green squares. They're a story. Made with ⭐ by [m3hrab](https://github.com/m3hrab) diff --git a/docs/constellation-dark.svg b/docs/constellation-dark.svg new file mode 100644 index 0000000..aaf5ede --- /dev/null +++ b/docs/constellation-dark.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + SepOctNovDecJanFebMarAprMayJunJulAugSep + MonWedFri + + + 2025-09-10: 0 contributions2025-09-11: 0 contributions2025-09-12: 0 contributions2025-09-13: 0 contributions2025-09-14: 3 contributions2025-09-15: 4 contributions2025-09-16: 0 contributions2025-09-17: 4 contributions2025-09-18: 0 contributions2025-09-19: 0 contributions2025-09-20: 3 contributions2025-09-21: 0 contributions2025-09-22: 2 contributions2025-09-23: 0 contributions2025-09-24: 0 contributions2025-09-25: 4 contributions2025-09-26: 1 contribution2025-09-27: 0 contributions2025-09-28: 4 contributions2025-09-29: 4 contributions2025-09-30: 4 contributions2025-10-01: 4 contributions2025-10-02: 1 contribution2025-10-03: 4 contributions2025-10-04: 0 contributions2025-10-05: 1 contribution2025-10-06: 0 contributions2025-10-07: 0 contributions2025-10-08: 3 contributions2025-10-09: 0 contributions2025-10-10: 4 contributions2025-10-11: 2 contributions2025-10-12: 1 contribution2025-10-13: 1 contribution2025-10-14: 0 contributions2025-10-15: 0 contributions2025-10-16: 6 contributions2025-10-17: 3 contributions2025-10-18: 1 contribution2025-10-19: 2 contributions2025-10-20: 2 contributions2025-10-21: 0 contributions2025-10-22: 0 contributions2025-10-23: 2 contributions2025-10-24: 1 contribution2025-10-25: 4 contributions2025-10-26: 4 contributions2025-10-27: 0 contributions2025-10-28: 0 contributions2025-10-29: 0 contributions2025-10-30: 0 contributions2025-10-31: 3 contributions2025-11-01: 0 contributions2025-11-02: 6 contributions2025-11-03: 0 contributions2025-11-04: 0 contributions2025-11-05: 0 contributions2025-11-06: 3 contributions2025-11-07: 0 contributions2025-11-08: 2 contributions2025-11-09: 3 contributions2025-11-10: 3 contributions2025-11-11: 2 contributions2025-11-13: 3 contributions2025-11-14: 0 contributions2025-11-15: 2 contributions2025-11-16: 0 contributions2025-11-17: 0 contributions2025-11-18: 0 contributions2025-11-19: 7 contributions2025-11-20: 9 contributions2025-11-21: 1 contribution2025-11-22: 2 contributions2025-11-23: 8 contributions2025-11-25: 0 contributions2025-11-26: 0 contributions2025-11-27: 2 contributions2025-11-28: 0 contributions2025-11-29: 1 contribution2025-11-30: 3 contributions2025-12-01: 2 contributions2025-12-02: 0 contributions2025-12-03: 0 contributions2025-12-04: 3 contributions2025-12-05: 3 contributions2025-12-06: 4 contributions2025-12-07: 4 contributions2025-12-08: 0 contributions2025-12-10: 0 contributions2025-12-11: 0 contributions2025-12-12: 3 contributions2025-12-13: 4 contributions2025-12-14: 4 contributions2025-12-15: 2 contributions2025-12-16: 0 contributions2025-12-17: 0 contributions2025-12-18: 1 contribution2025-12-19: 4 contributions2025-12-20: 3 contributions2025-12-21: 0 contributions2025-12-22: 1 contribution2025-12-23: 0 contributions2025-12-24: 0 contributions2025-12-25: 0 contributions2025-12-26: 0 contributions2025-12-27: 1 contribution2025-12-28: 3 contributions2025-12-29: 4 contributions2025-12-30: 2 contributions2026-01-01: 4 contributions2026-01-02: 0 contributions2026-01-03: 2 contributions2026-01-04: 1 contribution2026-01-05: 4 contributions2026-01-06: 4 contributions2026-01-07: 0 contributions2026-01-08: 2 contributions2026-01-09: 0 contributions2026-01-10: 2 contributions2026-01-11: 2 contributions2026-01-12: 1 contribution2026-01-13: 0 contributions2026-01-14: 0 contributions2026-01-15: 3 contributions2026-01-16: 0 contributions2026-01-17: 0 contributions2026-01-18: 0 contributions2026-01-19: 2 contributions2026-01-20: 0 contributions2026-01-21: 1 contribution2026-01-22: 3 contributions2026-01-23: 4 contributions2026-01-24: 2 contributions2026-01-25: 0 contributions2026-01-26: 0 contributions2026-01-27: 2 contributions2026-01-28: 9 contributions2026-01-29: 0 contributions2026-01-31: 2 contributions2026-02-01: 0 contributions2026-02-02: 1 contribution2026-02-03: 0 contributions2026-02-04: 0 contributions2026-02-05: 0 contributions2026-02-06: 3 contributions2026-02-07: 0 contributions2026-02-08: 6 contributions2026-02-09: 7 contributions2026-02-10: 3 contributions2026-02-11: 0 contributions2026-02-12: 0 contributions2026-02-13: 0 contributions2026-02-14: 7 contributions2026-02-15: 0 contributions2026-02-16: 4 contributions2026-02-17: 0 contributions2026-02-18: 1 contribution2026-02-19: 0 contributions2026-02-20: 1 contribution2026-02-21: 10 contributions2026-02-22: 0 contributions2026-02-23: 0 contributions2026-02-24: 4 contributions2026-02-25: 0 contributions2026-02-26: 2 contributions2026-02-27: 0 contributions2026-02-28: 4 contributions2026-03-01: 0 contributions2026-03-02: 3 contributions2026-03-03: 0 contributions2026-03-04: 10 contributions2026-03-05: 3 contributions2026-03-06: 2 contributions2026-03-07: 0 contributions2026-03-08: 2 contributions2026-03-09: 0 contributions2026-03-10: 0 contributions2026-03-11: 0 contributions2026-03-12: 3 contributions2026-03-13: 2 contributions2026-03-14: 0 contributions2026-03-15: 7 contributions2026-03-16: 8 contributions2026-03-17: 0 contributions2026-03-18: 0 contributions2026-03-19: 2 contributions2026-03-20: 10 contributions2026-03-21: 7 contributions2026-03-22: 1 contribution2026-03-23: 3 contributions2026-03-24: 0 contributions2026-03-25: 1 contribution2026-03-26: 3 contributions2026-03-28: 1 contribution2026-03-29: 4 contributions2026-03-30: 0 contributions2026-03-31: 0 contributions2026-04-01: 3 contributions2026-04-02: 0 contributions2026-04-03: 1 contribution2026-04-04: 0 contributions2026-04-05: 0 contributions2026-04-06: 4 contributions2026-04-07: 0 contributions2026-04-08: 1 contribution2026-04-09: 1 contribution2026-04-10: 4 contributions2026-04-11: 3 contributions2026-04-12: 6 contributions2026-04-13: 0 contributions2026-04-14: 0 contributions2026-04-15: 0 contributions2026-04-16: 0 contributions2026-04-17: 1 contribution2026-04-18: 0 contributions2026-04-19: 0 contributions2026-04-20: 3 contributions2026-04-21: 4 contributions2026-04-22: 0 contributions2026-04-23: 0 contributions2026-04-24: 1 contribution2026-04-25: 4 contributions2026-04-26: 3 contributions2026-04-27: 2 contributions2026-04-29: 3 contributions2026-04-30: 0 contributions2026-05-01: 2 contributions2026-05-02: 0 contributions2026-05-03: 0 contributions2026-05-04: 1 contribution2026-05-05: 0 contributions2026-05-06: 4 contributions2026-05-07: 2 contributions2026-05-08: 0 contributions2026-05-10: 2 contributions2026-05-11: 2 contributions2026-05-12: 0 contributions2026-05-14: 4 contributions2026-05-16: 3 contributions2026-05-17: 0 contributions2026-05-18: 0 contributions2026-05-19: 10 contributions2026-05-20: 0 contributions2026-05-21: 0 contributions2026-05-22: 3 contributions2026-05-23: 0 contributions2026-05-24: 4 contributions2026-05-25: 1 contribution2026-05-26: 0 contributions2026-05-27: 0 contributions2026-05-28: 0 contributions2026-05-29: 4 contributions2026-05-30: 6 contributions2026-05-31: 0 contributions2026-06-01: 2 contributions2026-06-02: 0 contributions2026-06-03: 0 contributions2026-06-04: 0 contributions2026-06-06: 0 contributions2026-06-07: 6 contributions2026-06-08: 0 contributions2026-06-09: 3 contributions2026-06-10: 3 contributions2026-06-11: 3 contributions2026-06-12: 3 contributions2026-06-13: 2 contributions2026-06-14: 4 contributions2026-06-15: 1 contribution2026-06-16: 0 contributions2026-06-17: 0 contributions2026-06-18: 4 contributions2026-06-19: 4 contributions2026-06-20: 4 contributions2026-06-21: 1 contribution2026-06-22: 0 contributions2026-06-23: 2 contributions2026-06-24: 0 contributions2026-06-25: 3 contributions2026-06-26: 10 contributions2026-06-27: 1 contribution2026-06-28: 3 contributions2026-06-29: 1 contribution2026-06-30: 1 contribution2026-07-01: 0 contributions2026-07-02: 1 contribution2026-07-03: 7 contributions2026-07-04: 8 contributions2026-07-05: 10 contributions2026-07-06: 1 contribution2026-07-07: 0 contributions2026-07-08: 2 contributions2026-07-09: 4 contributions2026-07-10: 0 contributions2026-07-11: 0 contributions2026-07-12: 2 contributions2026-07-13: 0 contributions2026-07-14: 0 contributions2026-07-15: 4 contributions2026-07-16: 0 contributions2026-07-17: 0 contributions2026-07-18: 2 contributions2026-07-19: 0 contributions2026-07-20: 4 contributions2026-07-21: 8 contributions2026-07-22: 0 contributions2026-07-23: 1 contribution2026-07-24: 0 contributions2026-07-25: 4 contributions2026-07-26: 0 contributions2026-07-27: 3 contributions2026-07-28: 0 contributions2026-07-29: 0 contributions2026-07-30: 0 contributions2026-07-31: 0 contributions2026-08-01: 3 contributions2026-08-02: 1 contribution2026-08-03: 1 contribution2026-08-04: 0 contributions2026-08-05: 0 contributions2026-08-06: 0 contributions2026-08-07: 3 contributions2026-08-08: 0 contributions2026-08-09: 1 contribution2026-08-10: 3 contributions2026-08-11: 0 contributions2026-08-12: 3 contributions2026-08-13: 0 contributions2026-08-14: 2 contributions2026-08-15: 0 contributions2026-08-17: 1 contribution2026-08-18: 0 contributions2026-08-19: 1 contribution2026-08-20: 0 contributions2026-08-21: 0 contributions2026-08-22: 2 contributions2026-08-23: 9 contributions2026-08-25: 0 contributions2026-08-26: 0 contributions2026-08-27: 4 contributions2026-08-28: 4 contributions2026-08-29: 2 contributions2026-08-30: 0 contributions2026-08-31: 0 contributions2026-09-01: 0 contributions2026-09-02: 4 contributions2026-09-03: 0 contributions2026-09-04: 1 contribution2026-09-05: 3 contributions2026-09-06: 2 contributions2026-09-07: 3 contributions2026-09-08: 3 contributions2026-09-09: 0 contributions2026-09-10: 0 contributions2026-09-11: 0 contributions2026-09-12: 0 contributions2026-09-13: 10 contributions2026-09-14: 9 contributions2026-09-15: 4 contributions + 2025-11-12: 11 contributions2025-11-24: 11 contributions2025-12-09: 17 contributions2025-12-31: 20 contributions2026-01-30: 11 contributions2026-03-27: 11 contributions2026-04-28: 11 contributions2026-05-09: 17 contributions2026-05-13: 11 contributions2026-05-15: 11 contributions2026-06-05: 11 contributions2026-08-16: 11 contributions2026-08-24: 11 contributions + 819 contributions mapped as stars + Longest streak 7d · Current streak 3d · Busiest month May 2026 + \ No newline at end of file diff --git a/docs/constellation-light.svg b/docs/constellation-light.svg new file mode 100644 index 0000000..93d6643 --- /dev/null +++ b/docs/constellation-light.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + SepOctNovDecJanFebMarAprMayJunJulAugSep + MonWedFri + + + 2025-09-10: 0 contributions2025-09-11: 0 contributions2025-09-12: 0 contributions2025-09-13: 0 contributions2025-09-14: 3 contributions2025-09-15: 4 contributions2025-09-16: 0 contributions2025-09-17: 4 contributions2025-09-18: 0 contributions2025-09-19: 0 contributions2025-09-20: 3 contributions2025-09-21: 0 contributions2025-09-22: 2 contributions2025-09-23: 0 contributions2025-09-24: 0 contributions2025-09-25: 4 contributions2025-09-26: 1 contribution2025-09-27: 0 contributions2025-09-28: 4 contributions2025-09-29: 4 contributions2025-09-30: 4 contributions2025-10-01: 4 contributions2025-10-02: 1 contribution2025-10-03: 4 contributions2025-10-04: 0 contributions2025-10-05: 1 contribution2025-10-06: 0 contributions2025-10-07: 0 contributions2025-10-08: 3 contributions2025-10-09: 0 contributions2025-10-10: 4 contributions2025-10-11: 2 contributions2025-10-12: 1 contribution2025-10-13: 1 contribution2025-10-14: 0 contributions2025-10-15: 0 contributions2025-10-16: 6 contributions2025-10-17: 3 contributions2025-10-18: 1 contribution2025-10-19: 2 contributions2025-10-20: 2 contributions2025-10-21: 0 contributions2025-10-22: 0 contributions2025-10-23: 2 contributions2025-10-24: 1 contribution2025-10-25: 4 contributions2025-10-26: 4 contributions2025-10-27: 0 contributions2025-10-28: 0 contributions2025-10-29: 0 contributions2025-10-30: 0 contributions2025-10-31: 3 contributions2025-11-01: 0 contributions2025-11-02: 6 contributions2025-11-03: 0 contributions2025-11-04: 0 contributions2025-11-05: 0 contributions2025-11-06: 3 contributions2025-11-07: 0 contributions2025-11-08: 2 contributions2025-11-09: 3 contributions2025-11-10: 3 contributions2025-11-11: 2 contributions2025-11-13: 3 contributions2025-11-14: 0 contributions2025-11-15: 2 contributions2025-11-16: 0 contributions2025-11-17: 0 contributions2025-11-18: 0 contributions2025-11-19: 7 contributions2025-11-20: 9 contributions2025-11-21: 1 contribution2025-11-22: 2 contributions2025-11-23: 8 contributions2025-11-25: 0 contributions2025-11-26: 0 contributions2025-11-27: 2 contributions2025-11-28: 0 contributions2025-11-29: 1 contribution2025-11-30: 3 contributions2025-12-01: 2 contributions2025-12-02: 0 contributions2025-12-03: 0 contributions2025-12-04: 3 contributions2025-12-05: 3 contributions2025-12-06: 4 contributions2025-12-07: 4 contributions2025-12-08: 0 contributions2025-12-10: 0 contributions2025-12-11: 0 contributions2025-12-12: 3 contributions2025-12-13: 4 contributions2025-12-14: 4 contributions2025-12-15: 2 contributions2025-12-16: 0 contributions2025-12-17: 0 contributions2025-12-18: 1 contribution2025-12-19: 4 contributions2025-12-20: 3 contributions2025-12-21: 0 contributions2025-12-22: 1 contribution2025-12-23: 0 contributions2025-12-24: 0 contributions2025-12-25: 0 contributions2025-12-26: 0 contributions2025-12-27: 1 contribution2025-12-28: 3 contributions2025-12-29: 4 contributions2025-12-30: 2 contributions2026-01-01: 4 contributions2026-01-02: 0 contributions2026-01-03: 2 contributions2026-01-04: 1 contribution2026-01-05: 4 contributions2026-01-06: 4 contributions2026-01-07: 0 contributions2026-01-08: 2 contributions2026-01-09: 0 contributions2026-01-10: 2 contributions2026-01-11: 2 contributions2026-01-12: 1 contribution2026-01-13: 0 contributions2026-01-14: 0 contributions2026-01-15: 3 contributions2026-01-16: 0 contributions2026-01-17: 0 contributions2026-01-18: 0 contributions2026-01-19: 2 contributions2026-01-20: 0 contributions2026-01-21: 1 contribution2026-01-22: 3 contributions2026-01-23: 4 contributions2026-01-24: 2 contributions2026-01-25: 0 contributions2026-01-26: 0 contributions2026-01-27: 2 contributions2026-01-28: 9 contributions2026-01-29: 0 contributions2026-01-31: 2 contributions2026-02-01: 0 contributions2026-02-02: 1 contribution2026-02-03: 0 contributions2026-02-04: 0 contributions2026-02-05: 0 contributions2026-02-06: 3 contributions2026-02-07: 0 contributions2026-02-08: 6 contributions2026-02-09: 7 contributions2026-02-10: 3 contributions2026-02-11: 0 contributions2026-02-12: 0 contributions2026-02-13: 0 contributions2026-02-14: 7 contributions2026-02-15: 0 contributions2026-02-16: 4 contributions2026-02-17: 0 contributions2026-02-18: 1 contribution2026-02-19: 0 contributions2026-02-20: 1 contribution2026-02-21: 10 contributions2026-02-22: 0 contributions2026-02-23: 0 contributions2026-02-24: 4 contributions2026-02-25: 0 contributions2026-02-26: 2 contributions2026-02-27: 0 contributions2026-02-28: 4 contributions2026-03-01: 0 contributions2026-03-02: 3 contributions2026-03-03: 0 contributions2026-03-04: 10 contributions2026-03-05: 3 contributions2026-03-06: 2 contributions2026-03-07: 0 contributions2026-03-08: 2 contributions2026-03-09: 0 contributions2026-03-10: 0 contributions2026-03-11: 0 contributions2026-03-12: 3 contributions2026-03-13: 2 contributions2026-03-14: 0 contributions2026-03-15: 7 contributions2026-03-16: 8 contributions2026-03-17: 0 contributions2026-03-18: 0 contributions2026-03-19: 2 contributions2026-03-20: 10 contributions2026-03-21: 7 contributions2026-03-22: 1 contribution2026-03-23: 3 contributions2026-03-24: 0 contributions2026-03-25: 1 contribution2026-03-26: 3 contributions2026-03-28: 1 contribution2026-03-29: 4 contributions2026-03-30: 0 contributions2026-03-31: 0 contributions2026-04-01: 3 contributions2026-04-02: 0 contributions2026-04-03: 1 contribution2026-04-04: 0 contributions2026-04-05: 0 contributions2026-04-06: 4 contributions2026-04-07: 0 contributions2026-04-08: 1 contribution2026-04-09: 1 contribution2026-04-10: 4 contributions2026-04-11: 3 contributions2026-04-12: 6 contributions2026-04-13: 0 contributions2026-04-14: 0 contributions2026-04-15: 0 contributions2026-04-16: 0 contributions2026-04-17: 1 contribution2026-04-18: 0 contributions2026-04-19: 0 contributions2026-04-20: 3 contributions2026-04-21: 4 contributions2026-04-22: 0 contributions2026-04-23: 0 contributions2026-04-24: 1 contribution2026-04-25: 4 contributions2026-04-26: 3 contributions2026-04-27: 2 contributions2026-04-29: 3 contributions2026-04-30: 0 contributions2026-05-01: 2 contributions2026-05-02: 0 contributions2026-05-03: 0 contributions2026-05-04: 1 contribution2026-05-05: 0 contributions2026-05-06: 4 contributions2026-05-07: 2 contributions2026-05-08: 0 contributions2026-05-10: 2 contributions2026-05-11: 2 contributions2026-05-12: 0 contributions2026-05-14: 4 contributions2026-05-16: 3 contributions2026-05-17: 0 contributions2026-05-18: 0 contributions2026-05-19: 10 contributions2026-05-20: 0 contributions2026-05-21: 0 contributions2026-05-22: 3 contributions2026-05-23: 0 contributions2026-05-24: 4 contributions2026-05-25: 1 contribution2026-05-26: 0 contributions2026-05-27: 0 contributions2026-05-28: 0 contributions2026-05-29: 4 contributions2026-05-30: 6 contributions2026-05-31: 0 contributions2026-06-01: 2 contributions2026-06-02: 0 contributions2026-06-03: 0 contributions2026-06-04: 0 contributions2026-06-06: 0 contributions2026-06-07: 6 contributions2026-06-08: 0 contributions2026-06-09: 3 contributions2026-06-10: 3 contributions2026-06-11: 3 contributions2026-06-12: 3 contributions2026-06-13: 2 contributions2026-06-14: 4 contributions2026-06-15: 1 contribution2026-06-16: 0 contributions2026-06-17: 0 contributions2026-06-18: 4 contributions2026-06-19: 4 contributions2026-06-20: 4 contributions2026-06-21: 1 contribution2026-06-22: 0 contributions2026-06-23: 2 contributions2026-06-24: 0 contributions2026-06-25: 3 contributions2026-06-26: 10 contributions2026-06-27: 1 contribution2026-06-28: 3 contributions2026-06-29: 1 contribution2026-06-30: 1 contribution2026-07-01: 0 contributions2026-07-02: 1 contribution2026-07-03: 7 contributions2026-07-04: 8 contributions2026-07-05: 10 contributions2026-07-06: 1 contribution2026-07-07: 0 contributions2026-07-08: 2 contributions2026-07-09: 4 contributions2026-07-10: 0 contributions2026-07-11: 0 contributions2026-07-12: 2 contributions2026-07-13: 0 contributions2026-07-14: 0 contributions2026-07-15: 4 contributions2026-07-16: 0 contributions2026-07-17: 0 contributions2026-07-18: 2 contributions2026-07-19: 0 contributions2026-07-20: 4 contributions2026-07-21: 8 contributions2026-07-22: 0 contributions2026-07-23: 1 contribution2026-07-24: 0 contributions2026-07-25: 4 contributions2026-07-26: 0 contributions2026-07-27: 3 contributions2026-07-28: 0 contributions2026-07-29: 0 contributions2026-07-30: 0 contributions2026-07-31: 0 contributions2026-08-01: 3 contributions2026-08-02: 1 contribution2026-08-03: 1 contribution2026-08-04: 0 contributions2026-08-05: 0 contributions2026-08-06: 0 contributions2026-08-07: 3 contributions2026-08-08: 0 contributions2026-08-09: 1 contribution2026-08-10: 3 contributions2026-08-11: 0 contributions2026-08-12: 3 contributions2026-08-13: 0 contributions2026-08-14: 2 contributions2026-08-15: 0 contributions2026-08-17: 1 contribution2026-08-18: 0 contributions2026-08-19: 1 contribution2026-08-20: 0 contributions2026-08-21: 0 contributions2026-08-22: 2 contributions2026-08-23: 9 contributions2026-08-25: 0 contributions2026-08-26: 0 contributions2026-08-27: 4 contributions2026-08-28: 4 contributions2026-08-29: 2 contributions2026-08-30: 0 contributions2026-08-31: 0 contributions2026-09-01: 0 contributions2026-09-02: 4 contributions2026-09-03: 0 contributions2026-09-04: 1 contribution2026-09-05: 3 contributions2026-09-06: 2 contributions2026-09-07: 3 contributions2026-09-08: 3 contributions2026-09-09: 0 contributions2026-09-10: 0 contributions2026-09-11: 0 contributions2026-09-12: 0 contributions2026-09-13: 10 contributions2026-09-14: 9 contributions2026-09-15: 4 contributions + 2025-11-12: 11 contributions2025-11-24: 11 contributions2025-12-09: 17 contributions2025-12-31: 20 contributions2026-01-30: 11 contributions2026-03-27: 11 contributions2026-04-28: 11 contributions2026-05-09: 17 contributions2026-05-13: 11 contributions2026-05-15: 11 contributions2026-06-05: 11 contributions2026-08-16: 11 contributions2026-08-24: 11 contributions + 819 contributions mapped as stars + Longest streak 7d · Current streak 3d · Busiest month May 2026 + \ No newline at end of file diff --git a/docs/hero-dark.svg b/docs/hero-dark.svg deleted file mode 100644 index 69a6522..0000000 --- a/docs/hero-dark.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - AugSepOctNovDecJanFebMarAprMayJunJulAug - MonWedFri - - - 2025-08-31: 0 contributions2025-09-01: 0 contributions2025-09-02: 0 contributions2025-09-03: 0 contributions2025-09-04: 3 contributions2025-09-05: 4 contributions2025-09-06: 0 contributions2025-09-07: 4 contributions2025-09-08: 0 contributions2025-09-09: 0 contributions2025-09-10: 3 contributions2025-09-11: 0 contributions2025-09-12: 2 contributions2025-09-13: 0 contributions2025-09-14: 0 contributions2025-09-15: 4 contributions2025-09-16: 1 contribution2025-09-17: 0 contributions2025-09-18: 4 contributions2025-09-19: 4 contributions2025-09-20: 4 contributions2025-09-21: 4 contributions2025-09-22: 1 contribution2025-09-23: 4 contributions2025-09-24: 0 contributions2025-09-25: 1 contribution2025-09-26: 0 contributions2025-09-27: 0 contributions2025-09-28: 3 contributions2025-09-29: 0 contributions2025-09-30: 4 contributions2025-10-01: 2 contributions2025-10-02: 1 contribution2025-10-03: 1 contribution2025-10-04: 0 contributions2025-10-05: 0 contributions2025-10-06: 6 contributions2025-10-07: 3 contributions2025-10-08: 1 contribution2025-10-09: 2 contributions2025-10-10: 2 contributions2025-10-11: 0 contributions2025-10-12: 0 contributions2025-10-13: 2 contributions2025-10-14: 1 contribution2025-10-15: 4 contributions2025-10-16: 4 contributions2025-10-17: 0 contributions2025-10-18: 0 contributions2025-10-19: 0 contributions2025-10-20: 0 contributions2025-10-21: 3 contributions2025-10-22: 0 contributions2025-10-23: 6 contributions2025-10-24: 0 contributions2025-10-25: 0 contributions2025-10-26: 0 contributions2025-10-27: 3 contributions2025-10-28: 0 contributions2025-10-29: 2 contributions2025-10-30: 3 contributions2025-10-31: 3 contributions2025-11-01: 2 contributions2025-11-03: 3 contributions2025-11-04: 0 contributions2025-11-05: 2 contributions2025-11-06: 0 contributions2025-11-07: 0 contributions2025-11-08: 0 contributions2025-11-09: 7 contributions2025-11-10: 9 contributions2025-11-11: 1 contribution2025-11-12: 2 contributions2025-11-13: 8 contributions2025-11-15: 0 contributions2025-11-16: 0 contributions2025-11-17: 2 contributions2025-11-18: 0 contributions2025-11-19: 1 contribution2025-11-20: 3 contributions2025-11-21: 2 contributions2025-11-22: 0 contributions2025-11-23: 0 contributions2025-11-24: 3 contributions2025-11-25: 3 contributions2025-11-26: 4 contributions2025-11-27: 4 contributions2025-11-28: 0 contributions2025-11-30: 0 contributions2025-12-01: 0 contributions2025-12-02: 3 contributions2025-12-03: 4 contributions2025-12-04: 4 contributions2025-12-05: 2 contributions2025-12-06: 0 contributions2025-12-07: 0 contributions2025-12-08: 1 contribution2025-12-09: 4 contributions2025-12-10: 3 contributions2025-12-11: 0 contributions2025-12-12: 1 contribution2025-12-13: 0 contributions2025-12-14: 0 contributions2025-12-15: 0 contributions2025-12-16: 0 contributions2025-12-17: 1 contribution2025-12-18: 3 contributions2025-12-19: 4 contributions2025-12-20: 2 contributions2025-12-22: 4 contributions2025-12-23: 0 contributions2025-12-24: 2 contributions2025-12-25: 1 contribution2025-12-26: 4 contributions2025-12-27: 4 contributions2025-12-28: 0 contributions2025-12-29: 2 contributions2025-12-30: 0 contributions2025-12-31: 2 contributions2026-01-01: 2 contributions2026-01-02: 1 contribution2026-01-03: 0 contributions2026-01-04: 0 contributions2026-01-05: 3 contributions2026-01-06: 0 contributions2026-01-07: 0 contributions2026-01-08: 0 contributions2026-01-09: 2 contributions2026-01-10: 0 contributions2026-01-11: 1 contribution2026-01-12: 3 contributions2026-01-13: 4 contributions2026-01-14: 2 contributions2026-01-15: 0 contributions2026-01-16: 0 contributions2026-01-17: 2 contributions2026-01-18: 9 contributions2026-01-19: 0 contributions2026-01-21: 2 contributions2026-01-22: 0 contributions2026-01-23: 1 contribution2026-01-24: 0 contributions2026-01-25: 0 contributions2026-01-26: 0 contributions2026-01-27: 3 contributions2026-01-28: 0 contributions2026-01-29: 6 contributions2026-01-30: 7 contributions2026-01-31: 3 contributions2026-02-01: 0 contributions2026-02-02: 0 contributions2026-02-03: 0 contributions2026-02-04: 7 contributions2026-02-05: 0 contributions2026-02-06: 4 contributions2026-02-07: 0 contributions2026-02-08: 1 contribution2026-02-09: 0 contributions2026-02-10: 1 contribution2026-02-11: 10 contributions2026-02-12: 0 contributions2026-02-13: 0 contributions2026-02-14: 4 contributions2026-02-15: 0 contributions2026-02-16: 2 contributions2026-02-17: 0 contributions2026-02-18: 4 contributions2026-02-19: 0 contributions2026-02-20: 3 contributions2026-02-21: 0 contributions2026-02-22: 10 contributions2026-02-23: 3 contributions2026-02-24: 2 contributions2026-02-25: 0 contributions2026-02-26: 2 contributions2026-02-27: 0 contributions2026-02-28: 0 contributions2026-03-01: 0 contributions2026-03-02: 3 contributions2026-03-03: 2 contributions2026-03-04: 0 contributions2026-03-05: 7 contributions2026-03-06: 8 contributions2026-03-07: 0 contributions2026-03-08: 0 contributions2026-03-09: 2 contributions2026-03-10: 10 contributions2026-03-11: 7 contributions2026-03-12: 1 contribution2026-03-13: 3 contributions2026-03-14: 0 contributions2026-03-15: 1 contribution2026-03-16: 3 contributions2026-03-18: 1 contribution2026-03-19: 4 contributions2026-03-20: 0 contributions2026-03-21: 0 contributions2026-03-22: 3 contributions2026-03-23: 0 contributions2026-03-24: 1 contribution2026-03-25: 0 contributions2026-03-26: 0 contributions2026-03-27: 4 contributions2026-03-28: 0 contributions2026-03-29: 1 contribution2026-03-30: 1 contribution2026-03-31: 4 contributions2026-04-01: 3 contributions2026-04-02: 6 contributions2026-04-03: 0 contributions2026-04-04: 0 contributions2026-04-05: 0 contributions2026-04-06: 0 contributions2026-04-07: 1 contribution2026-04-08: 0 contributions2026-04-09: 0 contributions2026-04-10: 3 contributions2026-04-11: 4 contributions2026-04-12: 0 contributions2026-04-13: 0 contributions2026-04-14: 1 contribution2026-04-15: 4 contributions2026-04-16: 3 contributions2026-04-17: 2 contributions2026-04-19: 3 contributions2026-04-20: 0 contributions2026-04-21: 2 contributions2026-04-22: 0 contributions2026-04-23: 0 contributions2026-04-24: 1 contribution2026-04-25: 0 contributions2026-04-26: 4 contributions2026-04-27: 2 contributions2026-04-28: 0 contributions2026-04-30: 2 contributions2026-05-01: 2 contributions2026-05-02: 0 contributions2026-05-04: 4 contributions2026-05-06: 3 contributions2026-05-07: 0 contributions2026-05-08: 0 contributions2026-05-09: 10 contributions2026-05-10: 0 contributions2026-05-11: 0 contributions2026-05-12: 3 contributions2026-05-13: 0 contributions2026-05-14: 4 contributions2026-05-15: 1 contribution2026-05-16: 0 contributions2026-05-17: 0 contributions2026-05-18: 0 contributions2026-05-19: 4 contributions2026-05-20: 6 contributions2026-05-21: 0 contributions2026-05-22: 2 contributions2026-05-23: 0 contributions2026-05-24: 0 contributions2026-05-25: 0 contributions2026-05-27: 0 contributions2026-05-28: 6 contributions2026-05-29: 0 contributions2026-05-30: 3 contributions2026-05-31: 3 contributions2026-06-01: 3 contributions2026-06-02: 3 contributions2026-06-03: 2 contributions2026-06-04: 4 contributions2026-06-05: 1 contribution2026-06-06: 0 contributions2026-06-07: 0 contributions2026-06-08: 4 contributions2026-06-09: 4 contributions2026-06-10: 4 contributions2026-06-11: 1 contribution2026-06-12: 0 contributions2026-06-13: 2 contributions2026-06-14: 0 contributions2026-06-15: 3 contributions2026-06-16: 10 contributions2026-06-17: 1 contribution2026-06-18: 3 contributions2026-06-19: 1 contribution2026-06-20: 1 contribution2026-06-21: 0 contributions2026-06-22: 1 contribution2026-06-23: 7 contributions2026-06-24: 8 contributions2026-06-25: 10 contributions2026-06-26: 1 contribution2026-06-27: 0 contributions2026-06-28: 2 contributions2026-06-29: 4 contributions2026-06-30: 0 contributions2026-07-01: 0 contributions2026-07-02: 2 contributions2026-07-03: 0 contributions2026-07-04: 0 contributions2026-07-05: 4 contributions2026-07-06: 0 contributions2026-07-07: 0 contributions2026-07-08: 2 contributions2026-07-09: 0 contributions2026-07-10: 4 contributions2026-07-11: 8 contributions2026-07-12: 0 contributions2026-07-13: 1 contribution2026-07-14: 0 contributions2026-07-15: 4 contributions2026-07-16: 0 contributions2026-07-17: 3 contributions2026-07-18: 0 contributions2026-07-19: 0 contributions2026-07-20: 0 contributions2026-07-21: 0 contributions2026-07-22: 3 contributions2026-07-23: 1 contribution2026-07-24: 1 contribution2026-07-25: 0 contributions2026-07-26: 0 contributions2026-07-27: 0 contributions2026-07-28: 3 contributions2026-07-29: 0 contributions2026-07-30: 1 contribution2026-07-31: 3 contributions2026-08-01: 0 contributions2026-08-02: 3 contributions2026-08-03: 0 contributions2026-08-04: 2 contributions2026-08-05: 0 contributions2026-08-07: 1 contribution2026-08-08: 0 contributions2026-08-09: 1 contribution2026-08-10: 0 contributions2026-08-11: 0 contributions2026-08-12: 2 contributions2026-08-13: 9 contributions2026-08-15: 0 contributions2026-08-16: 0 contributions2026-08-17: 4 contributions2026-08-18: 4 contributions2026-08-19: 2 contributions2026-08-20: 0 contributions2026-08-21: 0 contributions2026-08-22: 0 contributions2026-08-23: 4 contributions2026-08-24: 0 contributions2026-08-25: 1 contribution2026-08-26: 3 contributions2026-08-27: 2 contributions2026-08-28: 3 contributions2026-08-29: 3 contributions2026-08-30: 0 contributions2026-08-31: 0 contributions2026-09-01: 0 contributions2026-09-02: 0 contributions2026-09-03: 10 contributions2026-09-04: 9 contributions2026-09-05: 4 contributions - 2025-11-02: 11 contributions2025-11-14: 11 contributions2025-11-29: 17 contributions2025-12-21: 20 contributions2026-01-20: 11 contributions2026-03-17: 11 contributions2026-04-18: 11 contributions2026-04-29: 17 contributions2026-05-03: 11 contributions2026-05-05: 11 contributions2026-05-26: 11 contributions2026-08-06: 11 contributions2026-08-14: 11 contributions - 819 contributions mapped as stars - Longest streak 7d · Current streak 3d · Busiest month Nov 2025 - \ No newline at end of file diff --git a/docs/hero-light.svg b/docs/hero-light.svg deleted file mode 100644 index d3e74e2..0000000 --- a/docs/hero-light.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - AugSepOctNovDecJanFebMarAprMayJunJulAug - MonWedFri - - - 2025-08-31: 0 contributions2025-09-01: 0 contributions2025-09-02: 0 contributions2025-09-03: 0 contributions2025-09-04: 3 contributions2025-09-05: 4 contributions2025-09-06: 0 contributions2025-09-07: 4 contributions2025-09-08: 0 contributions2025-09-09: 0 contributions2025-09-10: 3 contributions2025-09-11: 0 contributions2025-09-12: 2 contributions2025-09-13: 0 contributions2025-09-14: 0 contributions2025-09-15: 4 contributions2025-09-16: 1 contribution2025-09-17: 0 contributions2025-09-18: 4 contributions2025-09-19: 4 contributions2025-09-20: 4 contributions2025-09-21: 4 contributions2025-09-22: 1 contribution2025-09-23: 4 contributions2025-09-24: 0 contributions2025-09-25: 1 contribution2025-09-26: 0 contributions2025-09-27: 0 contributions2025-09-28: 3 contributions2025-09-29: 0 contributions2025-09-30: 4 contributions2025-10-01: 2 contributions2025-10-02: 1 contribution2025-10-03: 1 contribution2025-10-04: 0 contributions2025-10-05: 0 contributions2025-10-06: 6 contributions2025-10-07: 3 contributions2025-10-08: 1 contribution2025-10-09: 2 contributions2025-10-10: 2 contributions2025-10-11: 0 contributions2025-10-12: 0 contributions2025-10-13: 2 contributions2025-10-14: 1 contribution2025-10-15: 4 contributions2025-10-16: 4 contributions2025-10-17: 0 contributions2025-10-18: 0 contributions2025-10-19: 0 contributions2025-10-20: 0 contributions2025-10-21: 3 contributions2025-10-22: 0 contributions2025-10-23: 6 contributions2025-10-24: 0 contributions2025-10-25: 0 contributions2025-10-26: 0 contributions2025-10-27: 3 contributions2025-10-28: 0 contributions2025-10-29: 2 contributions2025-10-30: 3 contributions2025-10-31: 3 contributions2025-11-01: 2 contributions2025-11-03: 3 contributions2025-11-04: 0 contributions2025-11-05: 2 contributions2025-11-06: 0 contributions2025-11-07: 0 contributions2025-11-08: 0 contributions2025-11-09: 7 contributions2025-11-10: 9 contributions2025-11-11: 1 contribution2025-11-12: 2 contributions2025-11-13: 8 contributions2025-11-15: 0 contributions2025-11-16: 0 contributions2025-11-17: 2 contributions2025-11-18: 0 contributions2025-11-19: 1 contribution2025-11-20: 3 contributions2025-11-21: 2 contributions2025-11-22: 0 contributions2025-11-23: 0 contributions2025-11-24: 3 contributions2025-11-25: 3 contributions2025-11-26: 4 contributions2025-11-27: 4 contributions2025-11-28: 0 contributions2025-11-30: 0 contributions2025-12-01: 0 contributions2025-12-02: 3 contributions2025-12-03: 4 contributions2025-12-04: 4 contributions2025-12-05: 2 contributions2025-12-06: 0 contributions2025-12-07: 0 contributions2025-12-08: 1 contribution2025-12-09: 4 contributions2025-12-10: 3 contributions2025-12-11: 0 contributions2025-12-12: 1 contribution2025-12-13: 0 contributions2025-12-14: 0 contributions2025-12-15: 0 contributions2025-12-16: 0 contributions2025-12-17: 1 contribution2025-12-18: 3 contributions2025-12-19: 4 contributions2025-12-20: 2 contributions2025-12-22: 4 contributions2025-12-23: 0 contributions2025-12-24: 2 contributions2025-12-25: 1 contribution2025-12-26: 4 contributions2025-12-27: 4 contributions2025-12-28: 0 contributions2025-12-29: 2 contributions2025-12-30: 0 contributions2025-12-31: 2 contributions2026-01-01: 2 contributions2026-01-02: 1 contribution2026-01-03: 0 contributions2026-01-04: 0 contributions2026-01-05: 3 contributions2026-01-06: 0 contributions2026-01-07: 0 contributions2026-01-08: 0 contributions2026-01-09: 2 contributions2026-01-10: 0 contributions2026-01-11: 1 contribution2026-01-12: 3 contributions2026-01-13: 4 contributions2026-01-14: 2 contributions2026-01-15: 0 contributions2026-01-16: 0 contributions2026-01-17: 2 contributions2026-01-18: 9 contributions2026-01-19: 0 contributions2026-01-21: 2 contributions2026-01-22: 0 contributions2026-01-23: 1 contribution2026-01-24: 0 contributions2026-01-25: 0 contributions2026-01-26: 0 contributions2026-01-27: 3 contributions2026-01-28: 0 contributions2026-01-29: 6 contributions2026-01-30: 7 contributions2026-01-31: 3 contributions2026-02-01: 0 contributions2026-02-02: 0 contributions2026-02-03: 0 contributions2026-02-04: 7 contributions2026-02-05: 0 contributions2026-02-06: 4 contributions2026-02-07: 0 contributions2026-02-08: 1 contribution2026-02-09: 0 contributions2026-02-10: 1 contribution2026-02-11: 10 contributions2026-02-12: 0 contributions2026-02-13: 0 contributions2026-02-14: 4 contributions2026-02-15: 0 contributions2026-02-16: 2 contributions2026-02-17: 0 contributions2026-02-18: 4 contributions2026-02-19: 0 contributions2026-02-20: 3 contributions2026-02-21: 0 contributions2026-02-22: 10 contributions2026-02-23: 3 contributions2026-02-24: 2 contributions2026-02-25: 0 contributions2026-02-26: 2 contributions2026-02-27: 0 contributions2026-02-28: 0 contributions2026-03-01: 0 contributions2026-03-02: 3 contributions2026-03-03: 2 contributions2026-03-04: 0 contributions2026-03-05: 7 contributions2026-03-06: 8 contributions2026-03-07: 0 contributions2026-03-08: 0 contributions2026-03-09: 2 contributions2026-03-10: 10 contributions2026-03-11: 7 contributions2026-03-12: 1 contribution2026-03-13: 3 contributions2026-03-14: 0 contributions2026-03-15: 1 contribution2026-03-16: 3 contributions2026-03-18: 1 contribution2026-03-19: 4 contributions2026-03-20: 0 contributions2026-03-21: 0 contributions2026-03-22: 3 contributions2026-03-23: 0 contributions2026-03-24: 1 contribution2026-03-25: 0 contributions2026-03-26: 0 contributions2026-03-27: 4 contributions2026-03-28: 0 contributions2026-03-29: 1 contribution2026-03-30: 1 contribution2026-03-31: 4 contributions2026-04-01: 3 contributions2026-04-02: 6 contributions2026-04-03: 0 contributions2026-04-04: 0 contributions2026-04-05: 0 contributions2026-04-06: 0 contributions2026-04-07: 1 contribution2026-04-08: 0 contributions2026-04-09: 0 contributions2026-04-10: 3 contributions2026-04-11: 4 contributions2026-04-12: 0 contributions2026-04-13: 0 contributions2026-04-14: 1 contribution2026-04-15: 4 contributions2026-04-16: 3 contributions2026-04-17: 2 contributions2026-04-19: 3 contributions2026-04-20: 0 contributions2026-04-21: 2 contributions2026-04-22: 0 contributions2026-04-23: 0 contributions2026-04-24: 1 contribution2026-04-25: 0 contributions2026-04-26: 4 contributions2026-04-27: 2 contributions2026-04-28: 0 contributions2026-04-30: 2 contributions2026-05-01: 2 contributions2026-05-02: 0 contributions2026-05-04: 4 contributions2026-05-06: 3 contributions2026-05-07: 0 contributions2026-05-08: 0 contributions2026-05-09: 10 contributions2026-05-10: 0 contributions2026-05-11: 0 contributions2026-05-12: 3 contributions2026-05-13: 0 contributions2026-05-14: 4 contributions2026-05-15: 1 contribution2026-05-16: 0 contributions2026-05-17: 0 contributions2026-05-18: 0 contributions2026-05-19: 4 contributions2026-05-20: 6 contributions2026-05-21: 0 contributions2026-05-22: 2 contributions2026-05-23: 0 contributions2026-05-24: 0 contributions2026-05-25: 0 contributions2026-05-27: 0 contributions2026-05-28: 6 contributions2026-05-29: 0 contributions2026-05-30: 3 contributions2026-05-31: 3 contributions2026-06-01: 3 contributions2026-06-02: 3 contributions2026-06-03: 2 contributions2026-06-04: 4 contributions2026-06-05: 1 contribution2026-06-06: 0 contributions2026-06-07: 0 contributions2026-06-08: 4 contributions2026-06-09: 4 contributions2026-06-10: 4 contributions2026-06-11: 1 contribution2026-06-12: 0 contributions2026-06-13: 2 contributions2026-06-14: 0 contributions2026-06-15: 3 contributions2026-06-16: 10 contributions2026-06-17: 1 contribution2026-06-18: 3 contributions2026-06-19: 1 contribution2026-06-20: 1 contribution2026-06-21: 0 contributions2026-06-22: 1 contribution2026-06-23: 7 contributions2026-06-24: 8 contributions2026-06-25: 10 contributions2026-06-26: 1 contribution2026-06-27: 0 contributions2026-06-28: 2 contributions2026-06-29: 4 contributions2026-06-30: 0 contributions2026-07-01: 0 contributions2026-07-02: 2 contributions2026-07-03: 0 contributions2026-07-04: 0 contributions2026-07-05: 4 contributions2026-07-06: 0 contributions2026-07-07: 0 contributions2026-07-08: 2 contributions2026-07-09: 0 contributions2026-07-10: 4 contributions2026-07-11: 8 contributions2026-07-12: 0 contributions2026-07-13: 1 contribution2026-07-14: 0 contributions2026-07-15: 4 contributions2026-07-16: 0 contributions2026-07-17: 3 contributions2026-07-18: 0 contributions2026-07-19: 0 contributions2026-07-20: 0 contributions2026-07-21: 0 contributions2026-07-22: 3 contributions2026-07-23: 1 contribution2026-07-24: 1 contribution2026-07-25: 0 contributions2026-07-26: 0 contributions2026-07-27: 0 contributions2026-07-28: 3 contributions2026-07-29: 0 contributions2026-07-30: 1 contribution2026-07-31: 3 contributions2026-08-01: 0 contributions2026-08-02: 3 contributions2026-08-03: 0 contributions2026-08-04: 2 contributions2026-08-05: 0 contributions2026-08-07: 1 contribution2026-08-08: 0 contributions2026-08-09: 1 contribution2026-08-10: 0 contributions2026-08-11: 0 contributions2026-08-12: 2 contributions2026-08-13: 9 contributions2026-08-15: 0 contributions2026-08-16: 0 contributions2026-08-17: 4 contributions2026-08-18: 4 contributions2026-08-19: 2 contributions2026-08-20: 0 contributions2026-08-21: 0 contributions2026-08-22: 0 contributions2026-08-23: 4 contributions2026-08-24: 0 contributions2026-08-25: 1 contribution2026-08-26: 3 contributions2026-08-27: 2 contributions2026-08-28: 3 contributions2026-08-29: 3 contributions2026-08-30: 0 contributions2026-08-31: 0 contributions2026-09-01: 0 contributions2026-09-02: 0 contributions2026-09-03: 10 contributions2026-09-04: 9 contributions2026-09-05: 4 contributions - 2025-11-02: 11 contributions2025-11-14: 11 contributions2025-11-29: 17 contributions2025-12-21: 20 contributions2026-01-20: 11 contributions2026-03-17: 11 contributions2026-04-18: 11 contributions2026-04-29: 17 contributions2026-05-03: 11 contributions2026-05-05: 11 contributions2026-05-26: 11 contributions2026-08-06: 11 contributions2026-08-14: 11 contributions - 819 contributions mapped as stars - Longest streak 7d · Current streak 3d · Busiest month Nov 2025 - \ No newline at end of file diff --git a/src/generate-constellation.js b/src/generate-constellation.js index 49aed9f..a705a12 100644 --- a/src/generate-constellation.js +++ b/src/generate-constellation.js @@ -61,7 +61,9 @@ function envInt(name) { if (raw === undefined || raw === "") return DEFAULTS[name]; const n = parseInt(raw, 10); if (Number.isNaN(n)) { - console.warn(`[github-constellation] ${name}="${raw}" is not a valid integer, using default ${DEFAULTS[name]}`); + console.warn( + `[github-constellation] ${name}="${raw}" is not a valid integer, using default ${DEFAULTS[name]}`, + ); return DEFAULTS[name]; } return n; @@ -71,7 +73,9 @@ function envHex(name) { const raw = process.env[name]; if (!raw) return DEFAULTS[name]; if (!/^#?[0-9a-fA-F]{6}$/.test(raw)) { - console.warn(`[github-constellation] ${name}="${raw}" is not a valid hex color, using default ${DEFAULTS[name]}`); + console.warn( + `[github-constellation] ${name}="${raw}" is not a valid hex color, using default ${DEFAULTS[name]}`, + ); return DEFAULTS[name]; } return raw.startsWith("#") ? raw : `#${raw}`; @@ -145,7 +149,7 @@ function graphqlRequest(query, variables) { method: "POST", headers: { "Content-Type": "application/json", - "Authorization": `bearer ${GITHUB_TOKEN}`, + Authorization: `bearer ${GITHUB_TOKEN}`, "User-Agent": "github-constellation", "Content-Length": Buffer.byteLength(data), }, @@ -222,13 +226,23 @@ function blendRgbStrings(a, b) { const pa = parseRgbString(a); const pb = parseRgbString(b); return `rgb(${Math.round((pa.r + pb.r) / 2)},${Math.round( - (pa.g + pb.g) / 2 + (pa.g + pb.g) / 2, )},${Math.round((pa.b + pb.b) / 2)})`; } const MONTH_NAMES = [ - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", ]; // Row index (0=Sun..6=Sat, matching GitHub's contributionDays order) -> @@ -297,8 +311,7 @@ function buildSvg(weeks, theme, layout) { const monthLabelHeight = isMinimal ? 0 : 18; const captionHeight = isMinimal ? 0 : 42; const width = weeks.length * cellSize + paddingLeft + paddingRight; - const height = - monthLabelHeight + 7 * cellSize + paddingY * 2 + captionHeight; + const height = monthLabelHeight + 7 * cellSize + paddingY * 2 + captionHeight; const allDays = []; weeks.forEach((week, wi) => { @@ -397,13 +410,13 @@ function buildSvg(weeks, theme, layout) { const cp2y = p2.y - (p3.y - p1.y) / 6; const strokeColor = blendRgbStrings( colors.get(streak[i].date), - colors.get(streak[i + 1].date) + colors.get(streak[i + 1].date), ); curves.push({ d: `M ${p1.x.toFixed(2)} ${p1.y.toFixed(2)} C ${cp1x.toFixed( - 2 + 2, )} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed( - 2 + 2, )}, ${p2.x.toFixed(2)} ${p2.y.toFixed(2)}`, color: strokeColor, }); @@ -415,23 +428,37 @@ function buildSvg(weeks, theme, layout) { let monthLabelsSvg = ""; if (!isMinimal) { + // GitHub's contribution calendar almost always starts on a partial + // week, which can flag a "month change" one column after the very + // first label — e.g. a week starting Dec 30 gets labeled "Dec", then + // the next week (Jan 5) immediately gets labeled "Jan" just 12px to + // its right. Two 3-letter labels can't fit in 12px, so they render on + // top of each other. Enforce a minimum pixel gap between labels and + // simply skip any month change that's too close to the previous one — + // it'll still get labeled correctly whenever the *next* month change + // occurs with enough room. const monthLabels = []; let lastMonth = null; + let lastLabelX = -Infinity; + const minLabelGap = cellSize * 3; // ~3 weeks of clearance per label + weeks.forEach((week, wi) => { const firstDay = week.contributionDays[0]; if (!firstDay) return; const month = new Date(firstDay.date).getMonth(); - if (month !== lastMonth) { - monthLabels.push({ - label: MONTH_NAMES[month], - x: paddingLeft + wi * cellSize, - }); - lastMonth = month; - } + if (month === lastMonth) return; + + const x = paddingLeft + wi * cellSize; + lastMonth = month; // always advance, even if we skip rendering this one + if (x - lastLabelX < minLabelGap) return; + + monthLabels.push({ label: MONTH_NAMES[month], x }); + lastLabelX = x; }); + monthLabels.forEach((m) => { monthLabelsSvg += `${m.label}`; }); } @@ -441,10 +468,8 @@ function buildSvg(weeks, theme, layout) { Object.entries(DAY_LABELS).forEach(([row, label]) => { const y = monthLabelHeight + paddingY + Number(row) * cellSize + cellSize / 2 + 3; - dayLabelsSvg += `${label}`; }); } @@ -484,25 +509,25 @@ function buildSvg(weeks, theme, layout) { brightStarsSvg += ``; brightStarsSvg += `${title}`; } else { dimStarsSvg += `${title}`; } }); @@ -569,13 +594,13 @@ function buildSvg(weeks, theme, layout) { async function main() { console.log( - `[github-constellation] Fetching contributions for "${GITHUB_USER}"...` + `[github-constellation] Fetching contributions for "${GITHUB_USER}"...`, ); const result = await graphqlRequest(query, { userName: GITHUB_USER }); if (!result.data || !result.data.user) { throw new Error( - `GitHub API returned no user data for "${GITHUB_USER}". Check the username and that the token has access.` + `GitHub API returned no user data for "${GITHUB_USER}". Check the username and that the token has access.`, ); } @@ -603,7 +628,7 @@ async function main() { if (process.env.GITHUB_OUTPUT) { fs.appendFileSync( process.env.GITHUB_OUTPUT, - `dark_svg_path=${darkPath}\nlight_svg_path=${lightPath}\n` + `dark_svg_path=${darkPath}\nlight_svg_path=${lightPath}\n`, ); } }