User guide

Git Profile Awaken draws your GitHub activity as the System window from a LitRPG: ranks from E to EX measured against real GitHub players, a level, a job class, titles you earn, twenty-five achievements, and your last year of contributions played as a small game. Pick one of ten README layouts and the Action arranges everything for you. This guide covers setting it up, every option, and what to do when something looks wrong.

How it works#

There are two ways to use it.

The GitHub Action (recommended). A workflow in your profile repository runs once a night. It reads your GitHub data, draws every widget as an SVG in both a dark and a light version, saves them in your repository, and rewrites one marked block of your README. Nothing depends on an outside server, the images load instantly, and you get the widgets that need more data (commit hours, achievements based on them).

The hosted endpoint. You paste image URLs into your README and a server draws each widget when someone views it. It is quicker to try, but the first view of a new profile waits for a few seconds of GitHub queries, and commit hours are not available.

Set up the Action#

You need your profile repository: the public repository named exactly like your username (for example octocat/octocat). Its README is what GitHub shows on your profile page. Create it if you do not have one.

1. Add awaken.json#

At the root of the profile repository:

{
  "username": "YOUR_USERNAME",
  "layout": "default",
  "theme": "solo_leveling",
  "activity": "arise",
  "title": "auto",
  "timezone": "Asia/Ho_Chi_Minh"
}

The configurator on the website writes this file for you.

2. Add the workflow#

Create .github/workflows/awaken.yml:

name: Awaken

on:
  schedule:
    - cron: "10 17 * * *"
  workflow_dispatch:
  push:
    branches: [main]
    paths: [awaken.json]

permissions:
  contents: write

concurrency:
  group: awaken
  cancel-in-progress: true

jobs:
  awaken:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: billtruong003/git-profile-awaken@main

The workflow runs every night, whenever you change awaken.json, and whenever you start it by hand from the Actions tab.

3. Mark where the widgets go#

Put these two lines in your README.md, where the widgets should appear:

<!-- AWAKEN:START -->
<!-- AWAKEN:END -->

Everything between them is replaced on each run, so do not edit inside the block. If the markers are missing, the block is added at the end of the README.

4. Run it once#

Open the Actions tab of your profile repository, pick Awaken, and press Run workflow. After about half a minute an awaken/ folder and the filled README block appear in a new commit.

Run it at night#

GitHub schedules are written in UTC. The nightly run should start a few minutes after midnight in your timezone, so that the daily quest and the streak see a finished day.

Your timezoneCron for 00:10 local time
UTC−8 (Los Angeles, winter)10 8 * * *
UTC−5 (New York, winter)10 5 * * *
UTC (London, winter)10 0 * * *
UTC+1 (Berlin, winter)10 23 * * *
UTC+5:30 (India)40 18 * * *
UTC+7 (Vietnam, Thailand)10 17 * * *
UTC+8 (Singapore, China)10 16 * * *
UTC+9 (Japan, Korea)10 15 * * *

The configurator works this out from the timezone you pick. GitHub may start scheduled runs a few minutes late when it is busy; that is normal.

Set timezone in awaken.json to the same zone. It decides which hour each commit counts in, when the daily quest resets, and which day "today" is.

Configuration reference#

FieldDefaultWhat it does
usernamethe repository ownerWhose profile to draw.
themesolo_levelingOne of the themes.
titleautoThe title shown under your name, by achievement id. auto picks your highest-tier achievement.
activityarisearise or raid. See Activity.
iconsruneSkill icons: rune draws one rune per class; brand uses language logos where one exists.
motionfullfull loops the glow, pulse and flicker; calm plays each entrance once and stops; none draws still images.
timezoneUTCAn IANA zone such as Europe/Berlin or Asia/Tokyo.
hourstrueRead your commit times. Needed for Hunting Hours, Night Owl and Early Bird. Turn it off to make runs faster.
layoutdefaultHow the README block is arranged. See Layouts.
bentoWith "layout": "bento": your own rows, e.g. [["hunter"], ["bio", "career", "web"], ["activity", "oracle"]]. Up to 10 rows of 1 to 4 widgets; each row is scaled to fill the width, so three tiles in a row draw smaller.
widgetsOnly with "layout": "custom": which widgets to draw, in README order. Giving widgets without a layout means custom, as in v2.
socials[]Up to 12 { "type", "url", "label" } links for Guild Contacts. type is a simple-icons slug (youtube, x, discord, linkedin…) or website, email, codepen, link.
bannerauto{ "lines": [...], "style": "auto" }. Up to 6 lines of 70 characters. style is typewriter, glitch, system, or auto (the layout decides). Without lines the banner greets you with your class and level.
bio{}role, focus, location (60 characters each) and about (220).
arsenalyour languagesUp to 24 technologies for the Arsenal inventory, by name or slug ("Unity", "nextjs", "PostgreSQL"). 602 logos; anything else becomes a monogram.
spotlightpinnedRepositories for Repo Spotlight, "name" or "owner/name". Empty means your pinned repositories.
feeds[]Up to 4 RSS or Atom feeds for the Quest Board: a blog, or a YouTube channel (https://www.youtube.com/feeds/videos.xml?channel_id=…).
quotesbuiltinThe Oracle Scroll's quote of the day: builtin (famous lines about software), dry (40 dry developer jokes), or a list mixing those names with your own { "text", "author" }, e.g. ["dry", { "text": "…", "author": "Me" }].
career[]Up to 6 { "role", "org", "years", "current" } entries for the Career Log.
cvYour résumé: a file in the profile repository ("cv.pdf") or an https:// link. Adds the CV link and a download rune.
outDirawakenThe folder for the SVGs.
readmeREADME.mdThe file whose block gets replaced. null leaves your README alone.

Mistakes in awaken.json stop the run with a message that lists every problem at once, for example "theme" must be one of: ….

Viewers who turned on reduced motion in their operating system always see still images, whatever motion says.

Layouts#

Set "layout" in awaken.json. Zero-config layouts work with only your username. The others draw their extra widgets once you fill in the fields they use; until then those widgets are left out, so nothing shows empty.

LayoutNeedsWhat it shows
defaultnothingLevel Up (on days something changed), hunter card, rank ladder, stat web and skills, the year, quest and log, spotlight (your pinned repositories), oracle and daily quest, runes.
classicnothingHunter card, status window, quest and skills, log and combat, runes.
statsnothingStatus window, rank ladder, combat and hours, achievements, runes.
activitynothingARISE and Dungeon Raid, daily quest and log, hunter card.
bentonothingOne image on a grid: card, ladder and web, skills, quest and today, the year, log, combat and hours.
bento_compactnothingOne image: card, ladder and today, the year.
minimalsocialsBanner, hunter card, contacts.
showcasesocialsGlitch banner, the year, Level Up, spotlight, contacts.
dashboardbio, feedsBanner, bio and skills, quest and log, today and your latest posts, the year.
portfoliobio, career, cv, socials, arsenalGlitch banner, bio and career, arsenal, spotlight, contacts, CV.
customwidgetsYour own list, in order.

Full-width widgets get a line each, half-width ones pair up, runes and contacts go four to a line. Spotlight cards, contacts and the CV are links. The Bento layouts are one SVG: spacing is exact on every screen, but the whole block is one link.

Widgets#

IdWidthShows
hunterfullHunter rank with your top share, level, class, equipped title, the six stats.
statusfullLevel, overall rank and top share, the rank ladder, the six stats with the value for the next rank, and the stat web.
ladderfullE to EX on a log scale of the top share, with you and each stat marked.
webhalfThe six stats as a web on the percentile scale, with rings where A, S, SSS and EX begin.
levelupfullWhat changed since the last run: level, ranks, achievement tiers. Only on days something changed.
bannerfullA typewriter, glitch or system banner.
contactsruneOne linked card per entry in socials.
arsenalfullEquipped: your top languages. Inventory: your arsenal, on shelves by kind.
spotlighthalfOne linked card per spotlight repository (up to 4).
biohalfRole, focus, base, class and a short about.
careerhalfYour career log, with the CV link.
cvruneA linked download rune for your résumé.
boardhalfThe latest posts from your feeds.
oraclehalfA quote of the day.
arise, raidfullOne activity style regardless of activity (the Activity layout shows both).
achievementsfullYour equipped title and all twenty-five achievements with their tiers.
activityfullYour last year as ARISE or Dungeon Raid.
questhalfYour most recently pushed repository as the active quest.
skillshalfYour top languages by code size.
contributionhalfThe year's total, daily average, current and best streak, and the last 16 weeks.
combathalfPull requests merged into other people's repositories, pull request accuracy, reviews, repositories opened, active days, best day, organizations.
hourshalfA 24-hour clock of your commit times, and contributions per weekday.
dailyhalfToday's daily quest, or the Penalty Zone after a day without contributions.
runesruneOne card per stat.

Stats, ranks and level#

Ranks are percentiles. We sampled 1,080 regular GitHub players at random (accounts with 10 or more contributions in the past year, out of 5,484 active ones) and fitted each stat. Your rank says where you stand among them, and the widgets show it as a top share: TOP 2.0% means 2% of regular players have more.

RankEDCBASSSSSSEX
From the top60%40%25%13%6%2%0.5%0.05%

Ranks from A up carry effects that grow with the tier: A glows, S pulses, SS shimmers, SSS burns, EX adds a prism and sparks. The rank ladder carries the same effects on each segment.

StatCounts
STRCommits, every year since you joined
AGIPull requests you opened
INTIssues you opened
VITRepositories you committed to in the last year
LUKStars on your repositories
CHAFollowers

Under each stat a thin bar shows how far you are through the rank, and the value that reaches the next one. Your overall rank ranks your combined score among the same players: each stat's percentile becomes a z-score, weighted (STR counts double, AGI and LUK one and a half times), and the mean is placed among the sampled players. Someone far ahead on one stat is not capped at the top of the ladder.

Your level comes from EXP, which every kind of contribution adds to: commits, pull requests (more if they were merged into someone else's project), reviews, issues, active repositories, stars and followers. Each level needs a little more EXP than the one before.

Activity#

ARISE. A violet wave sweeps across your last 53 weeks. Every day with at least one contribution rises as a shadow knight as the wave passes. Days with ten or more contributions rise as glowing marshals, the elites of your army.

Dungeon Raid. Your year is a dungeon. Each day with contributions holds a monster: a slime for 1–3, an imp for 4–9, a demon for 10 or more. A hunter clears the dungeon week by week. Your busiest week is the boss room; when the hunter reaches it, the boss HP bar drains and the room is cleared.

Achievements and titles#

Every achievement has three tiers. Tier I unlocks its title; set "title" to the achievement's id to wear it.

IdAchievementTiers
relentlessRelentless100 / 1,000 / 5,000 commits
unbrokenUnbrokenbest streak of 7 / 30 / 100 days
night-owlNight Owl20 / 30 / 45 % of commits between 22:00 and 05:00
early-birdEarly Bird15 / 25 / 40 % of commits between 05:00 and 09:00
weekend-warriorWeekend Warrior20 / 30 / 45 % of contributions on Saturday and Sunday
gate-openerGate Opener5 / 20 / 50 repositories created in the last year
raiderRaider1 / 10 / 50 pull requests merged into other people's repositories
flawlessFlawless80 / 90 / 100 % of your pull requests merged (from 10 pull requests)
healerHealer10 / 50 / 200 reviews
polyglotPolyglot3 / 5 / 8 languages making up at least 1% of your code
star-collectorStar Collector10 / 100 / 1,000 stars
beaconBeacon10 / 100 / 1,000 followers
guild-hopperGuild Hoppermember of 1 / 3 / 7 organizations
veteranVeteran1 / 3 / 5 years on GitHub
berserkerBerserker10 / 30 / 60 contributions in one day
diligentDiligent50 / 150 / 300 active days in the last year
pull-sharkPull Shark2 / 16 / 128 pull requests merged
quickdrawQuickdraw1 / 5 / 25 pull requests or issues closed within 5 minutes of opening (last 100 of each)
yoloYOLO1 / 10 / 50 pull requests merged without a review (last 100)
daily-grinderDaily Grinder7 / 30 / 100 perfect days (every daily quest cleared)
perfect-weekPerfect Week7 / 14 / 30 perfect days in a row
quest-hunterQuest Hunter50 / 250 / 1,000 daily quests cleared
boss-slayerBoss Slayer1 / 10 / 50 weekly bosses defeated
escape-artistEscape Artist3 / 10 / 25 escapes from the Penalty Zone the next day
collectorCollector4 / 7 / 10 kinds of daily quest cleared

The daily quest titles count from your first Action run: their history lives in awaken/player.json, so nothing before that run is counted, and the hosted endpoint shows them as needing the Action. Pull Shark, Quickdraw and YOLO are inspired by GitHub's own badges but judged by this project; GitHub has no API for its badges.

If you ask for a title you have not earned yet, the widgets show your best earned title instead and the run log says so.

The daily quest and the Penalty Zone#

Every day has three easy quests, in your timezone: make one contribution (always, it is your streak) and two more drawn from the pool below. The draw is different every day and for every player, and the same on every run.

QuestCleared with
Land 3 contributions3 contributions that day
Commit to any repository1 commit
Commit to 2 repositoriescommits in 2 repositories
Beat your daily averageat least your average per day over the year (2 or more)
Star a repository you like1 star given
Open an issue1 issue: a bug, an idea, a question
Keep a 3-day streakcontributions on 3 days in a row
Keep MP at 1414 contributions over the last 14 days
Weekend raid (Saturday and Sunday only)2 contributions

The nightly run happens just after midnight, so the widget grades the day that just ended (CLEARED 2 / 3) and lists today's quests underneath. Clear all three and it reads Quest Complete. The weekly boss falls when you have been active on 4 days of the week (Monday to Sunday).

A day with no contributions sends you to the Penalty Zone: the widget turns red, counts the days you have spent there, and shows how to get out (one contribution).

Today never breaks your streak while it is still going on; the streak only resets once a day ends without a contribution.

Themes#

System: solo_leveling (the default), shadow_monarch, red_gate, frost_elf, demon_castle, hunter_association, daylight.

Cultivation (Tu Tiên): jade_sect, crimson_sect, celestial_gold, ink_wash (light in both modes).

Editor: cyberpunk, dracula, tokyonight, monokai, gruvbox, nord, synthwave, matrix.

Games: hollow_knight, genshin_anemo, genshin_geo, genshin_electro, elden_ring, nier, bloodborne, valorant, hextech, retrowave, abyssal, infernal.

Themes change the panels, text, frame and accent colors. Rank colors stay the same in every theme, so an S is always gold. Some themes come with their own light version; the rest use their dark version in both modes.

Private contributions#

The workflow's built-in token can read your public activity. To count private repositories:

  1. Create a fine-grained personal access token with read-only access to the repositories you want counted (Contents and Metadata: read).

  2. In your profile repository, add it under Settings → Secrets and variables → Actions as AWAKEN_TOKEN.

  3. Pass it to the step:

    - uses: billtruong003/git-profile-awaken@main
      with:
        token: ${{ secrets.AWAKEN_TOKEN }}
    

Your private repository names are never drawn on the widgets, but the active quest uses your most recently pushed repository; if that one is private and you do not want its name shown, use "layout": "custom" and leave quest out of widgets.

Hosted endpoint#

Each widget is also available as an image URL:

![Status](https://git-profile-awaken.vercel.app/api?username=YOUR_USERNAME&widget=status&theme=solo_leveling)
ParameterValues
usernameRequired.
widgetAny widget id, bento, or rune-str … rune-cha. Old links with widget=stat&target=STR and widget=skill still work. Widgets that draw awaken.json data or run history (levelup, spotlight, contacts, bio, career, cv, board) need the Action.
layoutWith widget=bento: bento (default) or bento_compact.
themeAny theme id.
modedark (default) or light.
activity, icons, motion, title, timezoneAs in awaken.json.

The server keeps every profile it has drawn and refreshes it each night, so after the first view the images load straight away. The very first view of a new profile can take a few seconds; if GitHub shows a broken image the first time, reload the page.

Troubleshooting#

The workflow fails with "Permission denied" or "403" when pushing. The workflow needs permissions: contents: write. Also check Settings → Actions → General → Workflow permissions in the profile repository.

The images on my profile did not change after a run. GitHub caches README images for a while. Open the SVG file in the repository to see the new version; the profile follows within a few minutes to an hour.

Commits are missing. GitHub counts a commit for you only when its author email is one of the emails on your account. Add the email you commit with under Settings → Emails. The active quest counts every commit in its repository, so it can show more than your contribution graph.

My title is not the one I chose. You have not reached tier I of that achievement yet. The run log names the title it used instead.

Hunting Hours says commit hours are off. Set "hours": true.

The run says my awaken.json has problems. The message lists each field and the values it accepts.

A widget from my layout is missing. It needs data you have not given yet (for example socials for contacts, feeds for the Quest Board), or, for Level Up, nothing changed since the last run. The run log lists the files it wrote.

An Arsenal item shows two letters instead of a logo. There is no logo for it in the catalog (several brands ask icon sets to remove theirs). The run log names those items.

Edit this page on GitHub