The questlog wiki
How the cards work, what every number means, every option and every scene, with live examples.
Getting started
Paste this into your profile README, the repository named after your login (you/you). Change you to your login and forest to any scene. The builder writes it for you.
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://questlog.cc/stats?user=you&scene=forest&time=night">
<img alt="My Character Sheet" src="https://questlog.cc/stats?user=you&scene=forest">
</picture>Night comes for free
GitHub tells the browser whether the reader uses a light or a dark theme. The <source> line applies in dark mode and shows the night painting; everyone else gets the <img>, the day. No script, no setting.
Anywhere that renders HTML works the same way: a repository README, a wiki or your own site. Where only Markdown images are allowed, use  and pick one time.
The three cards
Character Sheet, /stats
| Row and key | What it counts |
|---|---|
Levellevel | From your lifetime contributions. The bar under it fills toward the next level. |
Commitscommits | Commit contributions over every year of your calendar. |
PRsprs | Pull requests you have opened. |
Reposrepos | Public repositories you own, forks left out. |
Starsstars | Stars on those repositories, added up. |
Issuesissues | Issues you have opened. |
Reviewsreviews | Pull request reviews over every year. |
Followersfollowers | People following you on GitHub. |
Contributionscontributions | Every contribution in your calendar, all years together. |
Levels
Reaching level L+1 takes 25 · L · (L+1) lifetime contributions, so each level costs 50 more than the one before. Everyone starts at level 1.
Classes
The subtitle beside the title is a class, chosen by your top language.
| Top language | Class |
|---|---|
| TypeScript, JavaScript | Artificer |
| Python | Alchemist |
| Rust | Blacksmith |
| Go | Ranger |
| C# | Paladin |
| Java, Kotlin | Knight |
| C, C++ | Warlock |
| HTML, CSS | Bard |
| Shell, PowerShell | Rogue |
| Anything else | Adventurer |
Spellbook, /languages
Your top five languages by amount of code across the public repositories you own (forks left out). Each row shows the language's rune, its share of all your code and a bar measured against your top language.
The fire, /streak
- Current: days in a row with at least one contribution, up to today. A day without a contribution yet today does not break it.
- Best: your longest run ever. A notch is cut for every five days of it.
- Total: all your contributions.
- The fire grows with the current streak, and its name follows the scene: Campfire in the forests and the fairy garden, Brazier on the castles and in the war room, Hearth in the witch cottage, royal library and guild hall, Lantern in the cloud kingdom and observatory, and Fire Bowl in the rose garden.
Fire tiers
The fire is drawn from your current streak. These four use a sample adventurer in the castle, where the brazier starts out cold. The notches under the numbers count the best streak.
Runes
Each language in the Spellbook gets a rune from the Elder Futhark and the Anglo-Saxon futhorc, in its own color. Any language not listed gets othala.
- Pythonperthro
- JavaScriptjera
- TypeScripttiwaz
- Javaeihwaz
- C#sowilo
- C++kaunan
- Ccalc
- PHPwunjo
- Gogebo
- Rustraido
- Rubyyr
- Kotlingar
- Swiftear
- Dartdagaz
- Shellstan
- PowerShellthurisaz
- HTMLhagalaz
- CSSalgiz
- SCSSing-square
- Jupyter Notebookingwaz
- Vueuruz
- Sveltenaudiz
- Lualaguz
- Ransuz
- Scalaberkanan
- Objective-Cior
- Perlfehu
- Haskellmannaz
- Elixirehwaz
- Dockerfilecealc
- Anything elseothala
Every scene, every variation
Sixteen scenes in four themes, each with all three cards by day and by night. Every image links to its full size.
Forest
Castle
Cozy
Scholarly
Options
Every card takes the same query parameters.
| Parameter | Values | Default |
|---|---|---|
user | your GitHub login | required |
scene | any of the sixteen scenes | forest |
time | day, night | day |
title | any text, up to 60 characters | the scene's title |
subtitle | any text, up to 60 characters | on /stats, your class; none on the others |
labels | key:Text,key:Text, keys below | the scene's labels |
values | key:Text,key:Text, keys below: drawn in place of the number | your numbers |
note | up to two lines split by | | none |
title_color | hex RRGGBB or RGB, # optional (as %23) | the scene's ink |
text_color | hex, as above: every other text | the scene's ink |
outline_color | hex, as above: the dark edge around outlined text | the scene's ink |
fire | classic, themed: on /streak, themed draws the scene's own fire where it has one (scenes not marked WIP) | classic |
hide | a comma list of keys, or of languages on /languages | nothing hidden |
animate | true, false | true |
scale | 1 to 5: the image is 320 x 128 times this | 5 |
Keys are case-insensitive. On /stats, labels and values both take level, commits, prs, repos, stars, issues, reviews, followers, contributions. On /languages, both take any language name, such as typescript, c%23 for C# or c%2B%2B for C++, and a value replaces that row's percent; labels also takes percent (the % sign) and empty (the text for an account with no languages). On /streak, both take current, best, total, and labels also takes days; a value replaces the whole value, days included. The stats and streak keys work for hide too. Up to 20 pairs per list; text that does not fit its place is trimmed. A note goes under the rows on /stats and /languages, where each line takes the place of the last language, and beside the fire on /streak.
title=My JourneyReplaces the card's title./stats?user=BaranDev&title=My Journeysubtitle=Full Stack DeveloperReplaces the class beside the title./stats?user=BaranDev&subtitle=Full Stack Developerlabels=commits:Deeds,prs:PactsRenames rows. Keys are listed above./stats?user=BaranDev&labels=commits:Deeds,prs:Pactshide=prs,starsLeaves rows out; the others move up./stats?user=BaranDev&hide=prs,starshide=html,cssOn the Spellbook, hide takes language names; the next language takes the place./languages?user=BaranDev&hide=html,cssanimate=falseA still image: no flicker and no sparkles, and a smaller file./streak?user=BaranDev&animate=falselabels=typescript:TS,python:PyOn the Spellbook, labels take language names too, plus percent./languages?user=BaranDev&labels=typescript:TS,python:Pyvalues=level:Archmage,commits:LotsDraws your text in place of a number. The XP bar still follows your real level./stats?user=BaranDev&values=level:Archmage,commits:Lotsvalues=current:ForeverThe fire and the notches still follow your real streak./streak?user=BaranDev&values=current:Forevernote=Open to work|DMs openUp to two free lines where the card has room. Hiding rows makes more./stats?user=BaranDev¬e=Open to work|DMs opentitle_color=FF6B35The title and subtitle color, the same by day and by night./streak?user=BaranDev&title_color=FF6B35text_color=7A1F1FThe color of every other text: rows, values and the note./stats?user=BaranDev&text_color=7A1F1Foutline_color=3B1F5CThe dark edge around the title and around text drawn on the painting./streak?user=BaranDev&outline_color=3B1F5Cscale=1The output size: 320 x 128 times the scale. The default, 5, is sharp on any screen; 1 is the painting at its true size./stats?user=BaranDev&scale=1What the messages mean
When a card can't be drawn yet, questlog still answers with an image that says why.
Caching and limits
- Every 12 hours. Your numbers are kept for 12 hours. After that the next view still gets a card at once, and a fresh one is fetched behind it.
- The scribe. The very first view of a login has nothing to show yet, so it shows the “scribe is inking your sheet” card for the few seconds the fetch takes.
- GitHub's hourly limit. questlog asks GitHub with one token, which has an hourly budget. When it runs out, new logins wait in a queue and the card says how many minutes are left.
- Private contributions. Only public data is shown, unless “Include private contributions on my profile” is on in your GitHub profile settings.
Self-hosting
questlog is one Docker image. With your own token, your instance can count your private contributions too.
git clone https://github.com/BaranDev/questlog-github-stats
cd questlog-github-stats
docker build -t questlog .
docker run -d -p 8080:8080 --env-file .env -v questlog-data:/data questlog.env holds a fine-grained GitHub token that can read public repositories:
GITHUB_TOKEN=github_pat_...The server listens on PORT (8080) and keeps its cache in DATA_DIR (/data). Then use your own host in the snippet.
FAQ
Does questlog need my token or access to my account?
No. It reads public profile data with its own token. You only paste an image link.
Why do my numbers differ from my profile page?
Cards show public data, refreshed every 12 hours. Private work counts only when your profile shares private contributions.
My language has no rune.
The thirty most common languages each have a rune. Every other language gets othala, in gold.
Can I use the cards outside GitHub?
Yes. They are plain PNG images, so any page or README that shows images can show them.
Can I use a different scene on each card?
Yes, every card takes its own parameters. One scene for all three makes the profile read like one place.
Is it free?
Yes, for non-commercial use such as your own profile. The code is MIT. The paintings are © Cevdet Baran Oral under CC BY-NC 4.0, so commercial use needs written permission: [email protected].