A dynamically generated activity graph to show your GitHub activities of last 31 days.
The canonical deployment is now https://github-readme-activity-graph.vercel.app. Previous deployments at https://activity-graph.herokuapp.com (Heroku free tier discontinued) and https://github-readme-activity-graph.cyclic.app (Cyclic.sh shut down in early 2025) are no longer reachable. For background see issue #197.
Please refer to the updated link here
- Table of contents
- How to Use
- Use themes
- Available Themes
- Customization
- Deploy on your own Replit instance
- Deploy on your own Vercel instance
- Self-hosting on DigitalOcean App Platform
- Contributing
- Core Team 💻
- Contributors ✨
- Resources Used to build this project
- Star History
Just paste the following URL in your profile readme and you are good to go.
Pass your username in the URL
[](https://github.com/ashutosh00710/github-readme-activity-graph)username=ashutosh00710&theme=theme_name
[](https://github.com/ashutosh00710/github-readme-activity-graph)Manual Customization is also available
| Name | Preview |
|---|---|
| Default (cotton candy) | |
| react | ![]() |
| react-dark | |
| github | |
| github-compact | |
| xcode | |
| rogue | |
| merko | ![]() |
| vue | ![]() |
| tokyo-night | ![]() |
| high-contrast | ![]() |
For more themes click here
Customize the appearance of your Activity Graph however you want with URL params.
| Arguments | Description | Type of Value |
|---|---|---|
bg_color |
card's background color | hex code (without #) |
border_color |
card's border color | hex code (without #) |
color |
graph card's text color | hex code (without #) |
title_color |
graph card's title color | hex code (without #) |
line |
graph's line color | hex code (without #) |
point |
color of points on line graph | hex code (without #) |
area_color |
color of the area under the graph | hex code (without #) |
area |
shows area under the graph | boolean (default: false) |
hide_border |
makes the border of the graph transparent | boolean (default: false) |
hide_title |
sets the title to an empty string | boolean (default: false) |
custom_title |
set the title to any string | string |
theme |
name of available themes | string |
radius |
border radius of graph | number (0-16 inclusive) |
height |
height of the graph | number (200-600 inclusive) |
days |
number of to days display on graph | number between (1 - 90) [Recommended below 40] |
from |
date from which the graph starts | format YYYY-MM-DD |
to |
date where the graph will end | format YYYY-MM-DD |
grid |
show grid | boolean (default: true) |
⚠ For custom_title please make sure that you are using %20 for spaces
Example:
custom_title=This%20is%20a%20title
[](https://github.com/ashutosh00710/github-readme-activity-graph)Example:
[](https://github.com/ashutosh00710/github-readme-activity-graph)Step-by-step instructions for deploying to Replit (from UI)
- Sign in to Replit or create a new account at https://replit.com
- Click the Deploy button below
-
On the page that comes up, choose language as
Node.jsand then clickImport from GitHubButton -
Visit this link to create a new Personal Access Token
-
Scroll to the bottom and click "Generate token"
-
Wait clone done and add
Secretswith yourGithub token -
Click the green
RUNbutton on top, the console will run and at last the url will shows on the right -
Now just add the following to your profile readme and you're good to go

Step-by-step instructions for deploying to Vercel (from UI)
- Go to vercel.com.
- Click on
Log in.
- Sign in with GitHub by pressing
Continue with GitHub.
- Sign in to GitHub and allow access to all repositories if prompted.
- Fork this repo.
- Go back to your Vercel dashboard.
- To import a project, click the
Add New...button and select theProjectoption.
- Click the
Continue with GitHubbutton, search for the required Git Repository and import it by clicking theImportbutton.
- Create a personal access token (PAT) here and enable the
repopermissions (this allows access to see private repo stats).
- Add the PAT as an environment variable named
TOKEN.
- Click deploy, and you're good to go. See your domains to use the API!
Alternatively, click the button below and follow the instructions.
After the deployment is complete:
- Click the
Continue to Dashboardbutton
- In the
Settingstab, click onEnvironment Variablesand follow steps9.and10.ofFirst Method.
- Go to
Deploymentstab and redeploy the project.
Now just add the following to your profile readme and you're good to go.
This fork ships a Dockerfile and an App Platform spec so the service can run as a container on DigitalOcean (or any other container host — podman, k8s, fly.io, etc.) instead of depending on the upstream Vercel deployment. The upstream deployment is currently returning HTTP 402 because the maintainer's account is billing-locked (Ashutosh00710#257, Ashutosh00710#259). See chicks-net/www-chicks-net#371 for the full rationale.
The app is a plain Express 5 server (src/main.ts) with no Vercel-specific runtime APIs, so it runs unmodified as a long-running Node process inside the container.
If wrangling doctl commands by hand isn't your thing, there's a ready-to-use module over in fini-net/fini-infra (l7_application/activity-graph). It provisions the same apps-s-1vcpu-0.5gb container app from this repo's Dockerfile as infrastructure-as-code, and rather than pasting the GitHub PAT into the dashboard it pulls your token out of 1Password via the onepassword provider — so the secret never lands in code or version control. Check that directory's README.md and main.tf for the variables (github_repo, github_branch, http_port, region, etc.) and run a plain tofu apply (or terraform apply) to bring the app up. The manual doctl flow below does the same job; pick whichever fits your workflow.
- A DigitalOcean account
doctlinstalled and authenticated (doctl auth init)- A GitHub Personal Access Token with
read:userscope (the service uses it as a Bearer token againstapi.github.com/graphql; seesrc/fetcher.ts:46)
doctl apps create --spec .do/app.yamlApp Platform builds the image from the repo's Dockerfile, starts one apps-s-1vcpu-0.5gb instance ($5/mo, 512 MiB) in nyc, and assigns a public URL of the form activity-graph-<random>.ondigitalocean.app. Pushes to the deploy branch redeploy automatically (deploy_on_push: true).
At this point the app is live but returns the graceful "Can't fetch any contribution" error-graph SVG because TOKEN is empty.
Set the TOKEN secret via doctl (the spec declares it as type: SECRET, so the value is encrypted at rest and never appears in git):
APP_ID=$(doctl apps list --format ID,Spec.Name --no-header | awk '$2=="activity-graph"{print $1; exit}')
doctl apps update "$APP_ID" --spec .do/app.yaml \
--set-env TOKEN=<your-github-pat>Or via the App Platform dashboard: Settings → App-Level Environment Variables → Add → TOKEN = <your-pat>, type Secret.
After the redeploy, GET https://activity-graph-<random>.ondigitalocean.app/graph?username=<your-name>&theme=github-compact returns a real contribution-graph SVG.
The spec intentionally omits a domains: block so first-deploy Just Works. To add activity-graph.chicks.net (or similar) once DNS is ready, add to .do/app.yaml:
domains:
- domain: activity-graph.chicks.net
type: PRIMARYthen add a CNAME on the chicks.net side pointing at the .ondigitalocean.app hostname and run doctl apps update "$APP_ID" --spec .do/app.yaml --set-env TOKEN=<your-pat>.
- Code change on
deploybranch: App Platform redeploys automatically on push (deploy_on_push: true). - Spec change:
doctl apps update "$APP_ID" --spec .do/app.yaml --set-env TOKEN=<your-pat>. ⚠ Always pass--set-env TOKEN=...when updating from the spec — the checked-in spec keepsTOKEN's value empty (to keep the secret out of git), so omitting the flag resets the secret and breaks/graph(it returns the "Can't fetch" error-graph SVG) untilTOKENis set again. Alternatively, update the spec via the dashboard, which preserves existing secrets. - Spec validation in CI: the Validate App Spec workflow checks
.do/app.yamlon PRs. Without aDIGITALOCEAN_ACCESS_TOKENrepo secret it falls back to a YAML syntax check; with the secret it runsdoctl apps spec validate.
Please read through our contributing guidelines. Directions are included for opening issues, coding standards, and notes on development.
|
Ashutosh Dwivedi 📆 💻 📖 🤔 ⚠ |
Kshitij Srivastava 📆 💻 📖 🎨 |
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!
| Purpose | Library Name | Link |
|---|---|---|
| Graph Construction | CHARTIST.JS | https://github.com/gionkunz/chartist-js |






