Skip to content

Write anything onyour GitHub graph.

Type a word. Watch it turn green. Download the script that draws it on your profile. It's the trick from my contribution graph video.

Runs in your browser. Nothing gets sent anywhere.

Make your art

Letters, numbers and ! ? . - : ' ( ) *. Type <3 for a heart.

1,050 contributions in 2025
JanFebMarAprMayJunJulAugSepOctNovDecMonWedFri
Move it
Paint squares

Pick a colour, then drag on the graph.

GitHub shades each square against your busiest day. Already commit a lot? Go darker, or your real work will out-green the art.

Get the script

105 squares · 1,050 commits · about 2 minutes to run

  1. 1. Make a new private repo on GitHub.

  2. 2. Run these in a terminal.

    $ git clone https://github.com/YOUR_USERNAME/goGreen.git
    $ cd goGreen
    $ git config user.email # must be an email on your GitHub account
    $ npm init -y
    $ npm pkg set type=module
    $ npm i jsonfile moment simple-git
    # move the index.js you downloaded into this folder, then:
    $ node index.js
  3. 3. Grab the script. It does the commits and the push.

    Read it first
    // goGreen: draws "FENRIR :)" on your 2025 GitHub contribution graph.
    // Made with fenriryt.me/tools/graph-art. Same trick as the video: commit to past dates, GitHub colours them in.
    //
    // Run it inside a repo you cloned from GitHub:
    //   npm init -y && npm pkg set type=module && npm i jsonfile moment simple-git
    //   node index.js
    
    import jsonfile from "jsonfile";
    import moment from "moment";
    import { simpleGit } from "simple-git";
    
    const path = "./data.json";
    const git = simpleGit();
    
    // Top-left square of the 2025 graph: the Sunday on or before Jan 1.
    const START = "2024-12-29";
    
    // [x = week, y = day (0 is Sunday), commits]. More commits, darker green.
    const ART = [
      [5, 0, 10], [5, 1, 10], [5, 2, 10], [5, 3, 10], [5, 4, 10], [5, 5, 10], [5, 6, 10], [6, 0, 10],
      [6, 3, 10], [7, 0, 10], [7, 3, 10], [8, 0, 10], [8, 3, 10], [9, 0, 10], [11, 0, 10], [11, 1, 10],
      [11, 2, 10], [11, 3, 10], [11, 4, 10], [11, 5, 10], [11, 6, 10], [12, 0, 10], [12, 3, 10], [12, 6, 10],
      [13, 0, 10], [13, 3, 10], [13, 6, 10], [14, 0, 10], [14, 3, 10], [14, 6, 10], [15, 0, 10], [15, 6, 10],
      [17, 0, 10], [17, 1, 10], [17, 2, 10], [17, 3, 10], [17, 4, 10], [17, 5, 10], [17, 6, 10], [18, 2, 10],
      [19, 3, 10], [20, 4, 10], [21, 0, 10], [21, 1, 10], [21, 2, 10], [21, 3, 10], [21, 4, 10], [21, 5, 10],
      [21, 6, 10], [23, 0, 10], [23, 1, 10], [23, 2, 10], [23, 3, 10], [23, 4, 10], [23, 5, 10], [23, 6, 10],
      [24, 0, 10], [24, 3, 10], [25, 0, 10], [25, 3, 10], [25, 4, 10], [26, 0, 10], [26, 3, 10], [26, 5, 10],
      [27, 1, 10], [27, 2, 10], [27, 6, 10], [29, 0, 10], [29, 6, 10], [30, 0, 10], [30, 1, 10], [30, 2, 10],
      [30, 3, 10], [30, 4, 10], [30, 5, 10], [30, 6, 10], [31, 0, 10], [31, 6, 10], [33, 0, 10], [33, 1, 10],
      [33, 2, 10], [33, 3, 10], [33, 4, 10], [33, 5, 10], [33, 6, 10], [34, 0, 10], [34, 3, 10], [35, 0, 10],
      [35, 3, 10], [35, 4, 10], [36, 0, 10], [36, 3, 10], [36, 5, 10], [37, 1, 10], [37, 2, 10], [37, 6, 10],
      [43, 2, 10], [43, 5, 10], [45, 0, 10], [45, 6, 10], [46, 1, 10], [46, 2, 10], [46, 3, 10], [46, 4, 10],
      [46, 5, 10],
    ];
    
    let count = 0;
    const TOTAL = 1050;
    
    const markCommit = async (x, y) => {
      // Noon UTC, so no timezone on Earth pushes it into the next square.
      const date = moment.utc(START).add(x, "w").add(y, "d").hour(12).format();
      const data = { date, count: ++count };
      await jsonfile.writeFile(path, data);
      await git.add([path]).commit(date, { "--date": date });
    };
    
    const drawGraph = async () => {
      for (const [x, y, commits] of ART) {
        for (let i = 0; i < commits; i++) await markCommit(x, y);
        process.stdout.write(`\r${count} / ${TOTAL} commits`);
      }
      console.log("\nPushing...");
      await git.push(["-u", "origin", "HEAD"]);
      console.log("Done. Open your profile and click 2025 next to the graph.");
    };
    
    drawGraph().catch((err) => {
      console.error("\n" + err.message);
      process.exit(1);
    });
    
  4. 4. Make private squares count.

    GitHub → Settings → Public profile → tick Include private contributions on my profile. Without it, the art doesn't show on your profile.

Show it off

Post on X

The link opens this page with your word already in, and shows your art as the preview on Discord and X.

Before you blame the script.

Grey squares?
Your git email isn't on your GitHub account. Run git config user.email and fix it before you run the script.
Only seeing half of it?
The default graph shows the last 12 months. Click the year on the right of your graph to see the whole thing.
Nothing yet?
GitHub can take a few minutes to colour things in.
Regret it?
Delete the repo. The squares leave with it.

Disclaimer: this is for fun and for learning how git dates work.

HACK GITHUB CONTRIBUTION GRAPH! video thumbnail

Hack GitHub contribution graph!

The video this tool came from, with 169K views.

Green squares are easy. Stars are not.

StarSwap gets your repos real stars from real developers. You star theirs, they star yours.

Swap stars on StarSwap