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.

Character Sheet, forest, by day
Light theme
Character Sheet, forest, by night
Dark theme

Anywhere that renders HTML works the same way: a repository README, a wiki or your own site. Where only Markdown images are allowed, use ![My stats](https://questlog.cc/stats?user=you) and pick one time.

The three cards

Character Sheet, /stats

BaranDev's Character Sheet in the castle scene
Row and keyWhat it counts
LevellevelFrom your lifetime contributions. The bar under it fills toward the next level.
CommitscommitsCommit contributions over every year of your calendar.
PRsprsPull requests you have opened.
ReposreposPublic repositories you own, forks left out.
StarsstarsStars on those repositories, added up.
IssuesissuesIssues you have opened.
ReviewsreviewsPull request reviews over every year.
FollowersfollowersPeople following you on GitHub.
ContributionscontributionsEvery 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.

Level 250
Level 3150
Level 4300
Level 5500
Level 102,250
Level 155,250
Level 209,500
Level 3021,750
Level 5061,250

Classes

The subtitle beside the title is a class, chosen by your top language.

Top languageClass
TypeScript, JavaScriptArtificer
PythonAlchemist
RustBlacksmith
GoRanger
C#Paladin
Java, KotlinKnight
C, C++Warlock
HTML, CSSBard
Shell, PowerShellRogue
Anything elseAdventurer

Spellbook, /languages

BaranDev's Spellbook in the fairy-garden scene

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

BaranDev's Campfire in the forest scene
  • 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.

Ashes fire at a 0 day streak
Ashes 0 days: smoking ashes
Small fire at a 4 day streak
Small 1 to 6 days
Steady fire at a 12 day streak
Steady 7 to 29 days
Bonfire fire at a 45 day streak
Bonfire 30 days and more

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

scene=forestCharacter Sheet, Spellbook, CampfireWIP: fire being reworked

Character Sheet, forest, dayCharacter Sheet, forest, nightSpellbook, forest, daySpellbook, forest, nightCampfire, forest, dayCampfire, forest, night

scene=forest-autumnCharacter Sheet, Spellbook, CampfireWIP: fire being reworked

Character Sheet, forest-autumn, dayCharacter Sheet, forest-autumn, nightSpellbook, forest-autumn, daySpellbook, forest-autumn, nightCampfire, forest-autumn, dayCampfire, forest-autumn, night

scene=forest-mistyCharacter Sheet, Spellbook, CampfireWIP: fire being reworked

Character Sheet, forest-misty, dayCharacter Sheet, forest-misty, nightSpellbook, forest-misty, daySpellbook, forest-misty, nightCampfire, forest-misty, dayCampfire, forest-misty, night

scene=forest-moonlitCharacter Sheet, Spellbook, Campfire: themed or classic fire

Character Sheet, forest-moonlit, dayCharacter Sheet, forest-moonlit, nightSpellbook, forest-moonlit, daySpellbook, forest-moonlit, nightCampfire, forest-moonlit, dayCampfire, forest-moonlit, night

Castle

scene=castleCharacter Sheet, Spellbook, BrazierWIP: fire being reworked

Character Sheet, castle, dayCharacter Sheet, castle, nightSpellbook, castle, daySpellbook, castle, nightBrazier, castle, dayBrazier, castle, night

scene=castle-auroraCharacter Sheet, Spellbook, BrazierWIP: fire being reworked

Character Sheet, castle-aurora, dayCharacter Sheet, castle-aurora, nightSpellbook, castle-aurora, daySpellbook, castle-aurora, nightBrazier, castle-aurora, dayBrazier, castle-aurora, night

scene=castle-skyCharacter Sheet, Spellbook, Brazier: themed or classic fire

Character Sheet, castle-sky, dayCharacter Sheet, castle-sky, nightSpellbook, castle-sky, daySpellbook, castle-sky, nightBrazier, castle-sky, dayBrazier, castle-sky, night

scene=castle-stormCharacter Sheet, Spellbook, BrazierWIP: fire being reworked

Character Sheet, castle-storm, dayCharacter Sheet, castle-storm, nightSpellbook, castle-storm, daySpellbook, castle-storm, nightBrazier, castle-storm, dayBrazier, castle-storm, night

Cozy

scene=fairy-gardenCharacter Sheet, Spellbook, Campfire: themed or classic fire

Character Sheet, fairy-garden, dayCharacter Sheet, fairy-garden, nightSpellbook, fairy-garden, daySpellbook, fairy-garden, nightCampfire, fairy-garden, dayCampfire, fairy-garden, night

scene=witch-cottageCharacter Sheet, Spellbook, HearthWIP: fire being reworked

Character Sheet, witch-cottage, dayCharacter Sheet, witch-cottage, nightSpellbook, witch-cottage, daySpellbook, witch-cottage, nightHearth, witch-cottage, dayHearth, witch-cottage, night

scene=cloud-kingdomCharacter Sheet, Spellbook, Lantern: themed or classic fire

Character Sheet, cloud-kingdom, dayCharacter Sheet, cloud-kingdom, nightSpellbook, cloud-kingdom, daySpellbook, cloud-kingdom, nightLantern, cloud-kingdom, dayLantern, cloud-kingdom, night

scene=rose-gardenCharacter Sheet, Spellbook, Fire BowlWIP: fire being reworked

Character Sheet, rose-garden, dayCharacter Sheet, rose-garden, nightSpellbook, rose-garden, daySpellbook, rose-garden, nightFire Bowl, rose-garden, dayFire Bowl, rose-garden, night

Scholarly

scene=royal-libraryCharacter Sheet, Spellbook, Hearth: themed or classic fire

Character Sheet, royal-library, dayCharacter Sheet, royal-library, nightSpellbook, royal-library, daySpellbook, royal-library, nightHearth, royal-library, dayHearth, royal-library, night

scene=war-roomCharacter Sheet, Spellbook, Brazier: themed or classic fire

Character Sheet, war-room, dayCharacter Sheet, war-room, nightSpellbook, war-room, daySpellbook, war-room, nightBrazier, war-room, dayBrazier, war-room, night

scene=guild-hallCharacter Sheet, Spellbook, Hearth: themed or classic fire

Character Sheet, guild-hall, dayCharacter Sheet, guild-hall, nightSpellbook, guild-hall, daySpellbook, guild-hall, nightHearth, guild-hall, dayHearth, guild-hall, night

scene=observatoryCharacter Sheet, Spellbook, Lantern: themed or classic fire

Character Sheet, observatory, dayCharacter Sheet, observatory, nightSpellbook, observatory, daySpellbook, observatory, nightLantern, observatory, dayLantern, observatory, night

Options

Every card takes the same query parameters.

ParameterValuesDefault
useryour GitHub loginrequired
sceneany of the sixteen scenesforest
timeday, nightday
titleany text, up to 60 charactersthe scene's title
subtitleany text, up to 60 characterson /stats, your class; none on the others
labelskey:Text,key:Text, keys belowthe scene's labels
valueskey:Text,key:Text, keys below: drawn in place of the numberyour numbers
noteup to two lines split by |none
title_colorhex RRGGBB or RGB, # optional (as %23)the scene's ink
text_colorhex, as above: every other textthe scene's ink
outline_colorhex, as above: the dark edge around outlined textthe scene's ink
fireclassic, themed: on /streak, themed draws the scene's own fire where it has one (scenes not marked WIP)classic
hidea comma list of keys, or of languages on /languagesnothing hidden
animatetrue, falsetrue
scale1 to 5: the image is 320 x 128 times this5

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 Journey
Character Sheet with title=My Journey
subtitle=Full Stack DeveloperReplaces the class beside the title./stats?user=BaranDev&subtitle=Full Stack Developer
Character Sheet with subtitle=Full Stack Developer
labels=commits:Deeds,prs:PactsRenames rows. Keys are listed above./stats?user=BaranDev&labels=commits:Deeds,prs:Pacts
Character Sheet with labels=commits:Deeds,prs:Pacts
hide=prs,starsLeaves rows out; the others move up./stats?user=BaranDev&hide=prs,stars
Character Sheet with hide=prs,stars
hide=html,cssOn the Spellbook, hide takes language names; the next language takes the place./languages?user=BaranDev&hide=html,css
Spellbook with hide=html,css
animate=falseA still image: no flicker and no sparkles, and a smaller file./streak?user=BaranDev&animate=false
Campfire with animate=false
labels=typescript:TS,python:PyOn the Spellbook, labels take language names too, plus percent./languages?user=BaranDev&labels=typescript:TS,python:Py
Spellbook with labels=typescript:TS,python:Py
values=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:Lots
Character Sheet with values=level:Archmage,commits:Lots
values=current:ForeverThe fire and the notches still follow your real streak./streak?user=BaranDev&values=current:Forever
Campfire with values=current:Forever
note=Open to work|DMs openUp to two free lines where the card has room. Hiding rows makes more./stats?user=BaranDev&note=Open to work|DMs open
Character Sheet with note=Open to work|DMs open
title_color=FF6B35The title and subtitle color, the same by day and by night./streak?user=BaranDev&title_color=FF6B35
Campfire with title_color=FF6B35
text_color=7A1F1FThe color of every other text: rows, values and the note./stats?user=BaranDev&text_color=7A1F1F
Character Sheet with text_color=7A1F1F
outline_color=3B1F5CThe dark edge around the title and around text drawn on the painting./streak?user=BaranDev&outline_color=3B1F5C
Campfire with outline_color=3B1F5C
scale=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=1
Character Sheet at scale 1, 320 by 128

What the messages mean

When a card can't be drawn yet, questlog still answers with an image that says why.

The placeholder message card
placeholderThe first time anyone asks for your login, questlog fetches your stats from GitHub. It takes a few seconds: refresh and your card is there.
The quota message card
quotaGitHub's hourly limit is used up. Your login waits in a priority queue and the card says how many minutes are left.
The unknown message card
unknownNo GitHub account has this login. Check the spelling; questlog remembers a missing login for an hour.
The busy message card
busyToo many new logins are waiting, or too many came from one network this hour. Try again in a while.
The failed message card
failedGitHub didn't answer when your stats were fetched. questlog waits a little before it tries again.
The error message card
errorA parameter is wrong, here scene=castel. The card names the parameter and what it takes.

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].