Github Readme Streak Stats
Display your total contributions, current streak,
and longest streak on your GitHub profile README
## ⚡ Quick setup
### Option 1: Web Deployment
1. Copy-paste the markdown below into your GitHub profile README
2. Replace the value after `?user=` with your GitHub username
```md
[](https://git.io/streak-stats)
```
#### Next Steps
- Check out the [Demo Site](https://streak-stats.demolab.com) or [Options](https://github.com/DenverCoder1/github-readme-streak-stats?tab=readme-ov-file#-options) below for available customizations.
- It is recommended to self-host the project more better reliability. See [Deploying it on your own](https://github.com/DenverCoder1/github-readme-streak-stats?tab=readme-ov-file#-deploying-it-on-your-own) for more details.
[![][hspace]](#) [][herokudeploy] [][verceldeploy]
### Option 2: GitHub Actions
GitHub Actions can generate a static SVG in your profile repository so your README does not depend on the public hosted endpoint. If you need private contribution data, add a custom token to Repository Secrets using the steps below.
Adding a Custom Token to Repository Secrets
1. Visit [this link](https://github.com/settings/tokens/new?description=GitHub%20Readme%20Streak%20Stats) to create a new Personal Access Token (no scopes required)
2. Scroll to the bottom and click **"Generate token"**
3. Visit your profile repository settings (Secrets and Variables > Actions) `https://github.com/[YOUR USERNAME]/[YOUR USERNAME]/settings/secrets/actions`
4. Click "New Repository Secret" and create a secret with a custom name (eg. `STREAK_STATS_TOKEN`) and your token from step 2 as the value.
5. Replace `${{ secrets.GITHUB_TOKEN }}` in the yml file below with `${{ secrets.STREAK_STATS_TOKEN }}` (using the custom name you gave the secret).
#### 1. Create the workflow file
Create a folder in your repo named `.github` and within it a folder named `workflows` and add a file `/.github/workflows/streak-stats.yml` in your profile repo (`USERNAME/USERNAME`):
```yaml
name: Update streak stats
on:
schedule:
- cron: "0 3 * * *" # Run every day at 03:00
push:
paths:
- ".github/workflows/streak-stats.yml" # Run any time this file is modified
workflow_dispatch: # Run manually from the Actions tab
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v7
- name: Generate streak stats
uses: DenverCoder1/github-readme-streak-stats@v1
with:
options: user=${{ github.repository_owner }}&theme=default&disable_animations=true
path: profile/streak.svg
- name: Commit streak stats
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add profile/streak.svg
git commit -m "Update streak stats" || exit 0
git push
```
#### 2. Show the generated stats in your README
Add this to your profile `README.md` file where you want the stats to appear:
```html
```
If you are using a fork, replace `DenverCoder1` with the account or organization that hosts your fork.
For private contributions, you will need a Personal Access Token (PAT):
1. [Create a Personal Access Token](https://github.com/settings/tokens) (PAT) with the repo scope.
2. Do not use the PAT directly in the workflow file; store it in the repository's GitHub Actions secrets (`Settings` > `Secrets and variables` > `Actions` -> `New repository secret`). Give it a descriptive name, such as `STREAK_STATS_TOKEN`.
3. Update your workflow file to use the token with the name you specified:
```yaml
- name: Generate streak stats
uses: DenverCoder1/github-readme-streak-stats@v1
with:
options: user=${{ github.repository_owner }}&theme=default&disable_animations=true
path: profile/streak.svg
token: ${{ secrets.STREAK_STATS_TOKEN }}
```
#### Next Steps
- Check out the [Options](https://github.com/DenverCoder1/github-readme-streak-stats?tab=readme-ov-file#-options) below for available customizations.
## ⚙ Demo Site
Here you can customize your Streak Stats card with a live preview.
[](http://streak-stats.demolab.com/demo/)
## 🔧 Options
The `user` field is the only required option. All other fields are optional.
If the `theme` parameter is specified, any color customizations specified will be applied on top of the theme, overriding the theme's values.
| Parameter | Details | Example |
| :------------------------: | :----------------------------------------------: | :------------------------------------------------------------------------------------------------: |
| `user` | GitHub username to show stats for | `DenverCoder1` |
| `theme` | The theme to apply (Default: `default`) | `dark`, `radical`, etc. [🎨➜](./docs/themes.md) |
| `hide_border` | Make the border transparent (Default: `false`) | `true` or `false` |
| `border_radius` | Set the roundness of the edges (Default: `4.5`) | Number `0` (sharp corners) to `248` (ellipse) |
| `background` | Background color (eg. `f2f2f2`, `35,d22,00f`) | **hex code** without `#`, **css color**, or gradient in the form `angle,start_color,...,end_color` |
| `border` | Border color | **hex code** without `#` or **css color** |
| `stroke` | Stroke line color between sections | **hex code** without `#` or **css color** |
| `ring` | Color of the ring around the current streak | **hex code** without `#` or **css color** |
| `fire` | Color of the fire in the ring | **hex code** without `#` or **css color** |
| `currStreakNum` | Current streak number | **hex code** without `#` or **css color** |
| `sideNums` | Total and longest streak numbers | **hex code** without `#` or **css color** |
| `currStreakLabel` | Current streak label | **hex code** without `#` or **css color** |
| `sideLabels` | Total and longest streak labels | **hex code** without `#` or **css color** |
| `dates` | Date range text color | **hex code** without `#` or **css color** |
| `excludeDaysLabel` | Excluded days of the week text color | **hex code** without `#` or **css color** |
| `date_format` | Date format pattern or empty for locale format | See note below on [📅 Date Formats](#-date-formats) |
| `locale` | Locale for labels and numbers (Default: `en`) | ISO 639-1 code - See [🗪 Locales](#-locales) |
| `timezone` | Timezone used to determine the current day | IANA timezone identifier, eg. `Asia/Kolkata` |
| `short_numbers` | Use short numbers (e.g. 1.5k instead of 1,500) | `true` or `false` |
| `type` | Output format (Default: `svg`) | Current options: `svg`, `png` or `json` |
| `mode` | Streak mode (Default: `daily`) | `daily` (contribute daily) or `weekly` (contribute once per Sun-Sat week) |
| `exclude_days` | List of days of the week to exclude from streaks | Comma-separated list of day abbreviations (Sun, Mon, Tue, Wed, Thu, Fri, Sat) e.g. `Sun,Sat` |
| `disable_animations` | Disable SVG animations (Default: `false`) | `true` or `false` |
| `card_width` | Width of the card in pixels (Default: `495`) | Positive integer, minimum width is 100px per column |
| `card_height` | Height of the card in pixels (Default: `195`) | Positive integer, minimum height is 170px |
| `hide_total_contributions` | Hide the total contributions (Default: `false`) | `true` or `false` |
| `hide_current_streak` | Hide the current streak (Default: `false`) | `true` or `false` |
| `hide_longest_streak` | Hide the longest streak (Default: `false`) | `true` or `false` |
| `starting_year` | Starting year of contributions | Integer, must be `2005` or later, eg. `2017`. By default, your account creation year is used. |
### 🖌 Themes
To enable a theme, append `&theme=` followed by the theme name to the end of the source URL:
```md
[](https://git.io/streak-stats)
```
| Theme | Preview |
| :------------: | :-----------------------------------------------------------: |
| `default` |  |
| `dark` |  |
| `highcontrast` |  |
| More themes! | **🎨 [See a list of all available themes](./docs/themes.md)** |
**If you have come up with a new theme you'd like to share with others, please see [Issue #32](https://github.com/DenverCoder1/github-readme-streak-stats/issues/32) for more information on how to contribute.**
### 🗪 Locales
The following are the locales that have labels translated in Streak Stats. The `locale` query parameter accepts any ISO language or locale code, see [here](https://gist.github.com/DenverCoder1/f61147ba26bfcf7c3bf605af7d3382d5) for a list of valid locales. The locale provided will be used for the date format and number format even if translations are not yet available.
en - English
 | am - አማርኛ
 | ar - العربية
 | as - অসমীয়া
 | bho - भोजपुरी
 |
bn - বাংলা
 | ca - català
 | ceb - Cebuano
 | da - dansk
 | de - Deutsch
 |
el - Ελληνικά
 | es - español
 | et - eesti
 | fa - فارسی
 | fi - suomi
 |
fil - Filipino
 | fil_PH - Filipino (Pilipinas)
 | fr - français
 | gu - ગુજરાતી
 | he - עברית
 |
hi - हिन्दी
 | hu - magyar
 | id - Indonesia
 | it - italiano
 | ja - 日本語
 |
jv - Jawa
 | kk - қазақ тілі
 | kn - ಕನ್ನಡ
 | ko - 한국어
 | mai - मैथिली
 |
mal - മലയാളം
 | mi - Māori
 | mr - मराठी
 | ms - Melayu
 | ms_ID - Melayu (Indonesia)
 |
my - မြန်မာ
 | ne - नेपाली
 | nl - Nederlands
 | no - norsk
 | pa - ਪੰਜਾਬੀ
 |
pl - polski
 | ps - پښتو
 | pt - português
 | pt_BR - português (Brasil)
 | ro - română
 |
ru - русский
 | sa - संस्कृत भाषा
 | sd_PK - سنڌي (پاڪستان)
 | sr_Cyrl - српски (ћирилица)
 | sr_Latn - srpski (latinica)
 |
su - Basa Sunda
 | sv - svenska
 | sw - Kiswahili
 | ta - தமிழ்
 | tcy - Tulu
 |
te - తెలుగు
 | th - ไทย
 | tr - Türkçe
 | uk - українська
 | ur_PK - اردو (پاکستان)
 |
vi - Tiếng Việt
 | yo - Èdè Yorùbá
 | zh_Hans - 中文(简体)
 | zh_Hant - 中文(繁體)
 | bg - български
 |
ht - créole haïtien
 | hy - հայերեն
 | rw - Kinyarwanda
 | | |
**If you would like to help translate the Streak Stats cards, please see [Issue #236](https://github.com/DenverCoder1/github-readme-streak-stats/issues/236) for more information.**
### 📅 Date Formats
If `date_format` is not provided or is empty, the PHP Intl library is used to determine the date format based on the locale specified in the `locale` query parameter.
A custom date format can be specified by passing a string to the `date_format` parameter.
The required format is to use format string characters from [PHP's date function](https://www.php.net/manual/en/datetime.format.php) with brackets around the part representing the year.
When the contribution year is equal to the current year, the characters in brackets will be omitted.
**Examples:**
| Date Format | Result |
| :-----------------: | :-----------------------------------------------------------------------------: |
| d F[, Y]
| "2020-04-14" => "14 April, 2020"
"2024-04-14" => "14 April"
|
| j/n/Y
| "2020-04-14" => "14/4/2020"
"2024-04-14" => "14/4/2024"
|
| [Y.]n.j
| "2020-04-14" => "2020.4.14"
"2024-04-14" => "4.14"
|
| M j[, Y]
| "2020-04-14" => "Apr 14, 2020"
"2024-04-14" => "Apr 14"
|
### Example
```md
[](https://git.io/streak-stats)
```
## ℹ️ How these stats are calculated
This tool uses the contribution graphs on your GitHub profile to calculate which days you have contributed.
To include contributions in private repositories, turn on the setting for "Private contributions" from the dropdown menu above the contribution graph on your profile page.
Contributions include commits, pull requests, and issues that you create in standalone repositories.
The longest streak is the highest number of consecutive days on which you have made at least one contribution.
The current streak is the number of consecutive days ending with the current day on which you have made at least one contribution. If you have made a contribution today, it will be counted towards the current streak, however, if you have not made a contribution today, the streak will only count days before today so that your streak will not be zero.
> [!NOTE]
> You may need to wait up to 24 hours for new contributions to show up ([Learn how contributions are counted](https://docs.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile))
## 📤 Deploying it on your own
It is preferable to either use [GitHub Actions](https://github.com/DenverCoder1/github-readme-streak-stats?tab=readme-ov-file#option-2-github-actions), or host the files on your own server which takes less than 2 minutes to set up.
Doing this can lead to better uptime and more control over customization (you can modify the code for your usage).
You can deploy the PHP files on any website server with PHP installed including Heroku and Vercel.
The Inkscape dependency is required for PNG rendering, as well as Segoe UI font for the intended rendering. If using Heroku, the buildpacks will install these for you automatically.
### Deploy to Vercel
Vercel is the recommended option for hosting the files since it is **free** and easy to set up. Watch the video below or expand the instructions to learn how to deploy to Vercel.
> [!NOTE]
> PNG mode is not supported since Inkscape will not be installed but the default SVG mode will work.
### 📺 [Click here for a video tutorial on how to self-host on Vercel](https://www.youtube.com/watch?v=maoXtlb8t44)
Instructions for deploying to Vercel (Free)
### Step-by-step instructions for deploying to Vercel
#### Option 1: Deploy to Vercel quickly with the Deploy button (recommended)
> [!IMPORTANT]
> Make sure that you host the **`vercel`** branch as otherwise you'll get a 404 error from Vercel. You can set the `vercel` branch as default after forking the repo.
1. Click the Deploy button below
[![][hspace]](#) [][verceldeploy]
2. Create your repository by filling in a Repository Name and clicking "Create"
3. Visit [this link](https://github.com/settings/tokens/new?description=GitHub%20Readme%20Streak%20Stats) to create a new Personal Access Token (no scopes required)
4. Scroll to the bottom and click **"Generate token"**
5. **Add the token** as a Config Var with the key `TOKEN`:

6. Click **"Deploy"** at the end of the form
7. Once the app is deployed, click the screenshot of your app or continue to the dashboard to find your domain to use in place of `streak-stats.demolab.com`

#### Option 2: Deploy to Vercel manually
1. Sign in to **Vercel** or create a new account at
2. Use the following command to clone the repository: `git clone https://github.com/DenverCoder1/github-readme-streak-stats.git`. If you plan to make changes, you can also fork the repository and clone your fork instead. If you do not have Git installed, you can download it from .
3. Navigate to the cloned repository's directory using the command `cd github-readme-streak-stats`
4. Switch to the "vercel" branch using the command `git checkout vercel`
5. Make sure you have the Vercel CLI (Command Line Interface) installed on your system. If not, you can download it from .
6. Run the command `vercel` and follow the prompts to link your Vercel account and choose a project name
7. After successful deployment, your app will be available at `.vercel.app`
8. Open [this link](https://github.com/settings/tokens/new?description=GitHub%20Readme%20Streak%20Stats) to create a new Personal Access Token on GitHub. You don't need to select any scopes for the token.
9. Scroll to the bottom of the page and click on **"Generate token"**
10. Visit the Vercel dashboard at and select your project. Then, click on **"Settings"** and choose **"Environment Variables"**.
11. Add a new environment variable with the key `TOKEN` and the value as the token you generated in step 9, then save your changes
12. (Optional) You can also set the `WHITELIST` environment variable to restrict which GitHub usernames can be accessed through the service. Provide the usernames as a comma-separated list, for example: `user1,user2,user3`. If the variable is not set, information can be requested for any GitHub user.
13. To apply the new environment variable(s), you need to redeploy the app. Run `vercel --prod` to deploy the app to production.

> ⚠️ **Note**
> To set up automatic Vercel deployments from GitHub, make sure to turn **off** "Include source files outside of the Root Directory" in the General settings and use `vercel` as the production branch in the Git settings.
### Deploy on Heroku
Heroku is another great option for hosting the files. All features are supported on Heroku and it is where the default domain is hosted. Heroku is not free, however, and you will need to pay between \$5 and \$7 per month to keep the app running. Expand the instructions below to learn how to deploy to Heroku.
Instructions for deploying to Heroku (Paid)
### Step-by-step instructions for deploying to Heroku
1. Sign in to **Heroku** or create a new account at
2. Visit [this link](https://github.com/settings/tokens/new?description=GitHub%20Readme%20Streak%20Stats) to create a new Personal Access Token (no scopes required)
3. Scroll to the bottom and click **"Generate token"**
4. Click the Deploy button below
[![][hspace]](#) [][herokudeploy]
5. **Add the token** as a Config Var with the key `TOKEN`:

6. (Optional) You can also set the `WHITELIST` Config Var to restrict which GitHub usernames can be accessed through the service. Provide the usernames as a comma-separated list, for example: `user1,user2,user3`. If the variable is not set, information can be requested for any GitHub user.
7. Click **"Deploy App"** at the end of the form
8. Once the app is deployed, you can use `.herokuapp.com` in place of `streak-stats.demolab.com`
### Deploy on your own
You can transfer the files to any webserver using FTP or other means, then refer to [CONTRIBUTING.md](/CONTRIBUTING.md) for installation steps.
### 🐳 Docker
Docker is a great option for self-hosting with full control over your environment. All features are supported including PNG rendering with Inkscape. Expand the instructions below to learn how to deploy with Docker.
Instructions for deploying with Docker
### Step-by-step instructions for deploying with Docker
1. Clone the repository:
```bash
git clone https://github.com/DenverCoder1/github-readme-streak-stats.git
cd github-readme-streak-stats
```
2. Visit https://github.com/settings/tokens/new?description=GitHub%20Readme%20Streak%20Stats to create a new Personal Access Token (no scopes required)
3. Scroll to the bottom and click "Generate token"
4. Build the Docker image:
```bash
docker build -t streak-stats .
```
5. Run the container with your GitHub token:
```bash
docker run -d -p 8080:80 -e TOKEN=your_github_token_here streak-stats
```
6. You can also optionally set the `WHITELIST` environment variable to restrict which GitHub usernames can be accessed through the service. If the `WHITELIST` variable is not set, information can be requested for any GitHub user.
Provide the usernames as a comma-separated list, for example:
```bash
docker run -d -p 8080:80 -e TOKEN=your_github_token_here -e WHITELIST=user1,user2,user3 streak-stats
```
7. Visit http://localhost:8080 to access your self-hosted instance
[hspace]: https://user-images.githubusercontent.com/20955511/136058102-b79570bc-4912-4369-b664-064a0ada8588.png
[verceldeploy]: https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FDenverCoder1%2Fgithub-readme-streak-stats%2Ftree%2Fvercel&env=TOKEN&envDescription=GitHub%20Personal%20Access%20Token%20(no%20scopes%20required)&envLink=https%3A%2F%2Fgithub.com%2Fsettings%2Ftokens%2Fnew%3Fdescription%3DGitHub%2520Readme%2520Streak%2520Stats&project-name=streak-stats&repository-name=github-readme-streak-stats
[herokudeploy]: https://heroku.com/deploy?template=https://github.com/DenverCoder1/github-readme-streak-stats/tree/main
## 🤗 Contributing
Contributions are welcome! Feel free to [open an issue](https://github.com/DenverCoder1/github-readme-streak-stats/issues/new/choose) or submit a [pull request](https://github.com/DenverCoder1/github-readme-streak-stats/compare) if you have a way to improve this project.
Make sure your request is meaningful and you have tested the app locally before submitting a pull request.
Refer to [CONTRIBUTING.md](/CONTRIBUTING.md) for more details on contributing, installing requirements, and running the application.
## 🙋♂️ Support
💙 If you like this project, give it a ⭐ and share it with friends!
[☕ Buy me a coffee](https://ko-fi.com/jlawrence)
---
Made with ❤️ and PHP