Every CI run is a dungeon encounter.
Green builds win fights. Red builds lose them. Your hero grows with you.
QuestOps adds one classic text-dungeon encounter to the end of your workflow. It reads how the job went, rolls a monster, a treasure chest or a trap, and plays it out in the job log. Your hero levels up, earns 'kens (nobody knows what for), picks up loot and keeps a streak, all saved to a branch in your own repository.
There's nothing to host, no account to make and no dependencies to install (it runs on Python's standard library and a small Node shim). It's one step in your workflow.
Contents: Live demo · Where it comes from · Add it to a workflow · How it plays · Meet the locals · Show off your hero · Learn more
This repository plays its own game on every push to main, so its data branch is a working example you can browse:
- Hall of Heroes: the leaderboard and every hero's card.
- Bestiary and reliquary: lore for every monster, item, set and spell.
- Quest log: every encounter so far.
Pull requests get a one-off encounter as a single comment that later pushes edit (comment: true), without touching the leaderboard.
QuestOps stands on the shoulders of giants. From my childhood of text adventures, MUDs, and JRPGs it borrows the short scene of a monster, a few lines of narration, dice rolls, and a role-playing character sheet.
I was once fascinated with idle RPGs and this feels like an extension as a passive fantasy experience, while allowing your technical talent to still drive outcomes. The hero advances on its own while you do work, and the game only asks that you keep merging.
The twist is that your CI pipeline is the dungeon main. Passing builds win fights, failing builds lose them, and the d20 decides the rest.
permissions:
contents: write # saves your hero to the questops-data branch
actions: read # reads how the job went
steps:
- uses: lowlydba/quest-ops@v1 # anywhere in the job, even first
- run: npm testThe encounter happens when the job finishes, after every other step, so it knows whether your tests passed. It shows up in three places:
- The job log, in full colour pixel art.
- The job summary.
- The
questops-databranch, which has a Hall of Heroes with every player's card.
- A failing run is always a loss. The monster wins, the chest bites and the trap springs.
- A passing run is usually a win.
- Your hero persists. Class and face come from your username. Levels come slowly, gear is equipped automatically, and achievements are earned over hundreds of runs.
- Re-running a job doesn't farm wins. Each commit counts once per hero.
- Bots don't quest. Dependabot and friends roll for a traveling merchant instead, who buys unused loot from a random hero's bag.
Tougher "Senior" and "Skip Level" versions turn up as you increase your level. The merchant only shows up when a bot finishes its work. The data branch carries a full bestiary and reliquary, with lore for every monster and item.
Every quest refreshes your character card and a set of shields.io style badges on the data branch. Embed them anywhere:
They're static files, so there's no server, and they're as fresh as your last build.
- Setup and configuration: inputs, permissions, the data branch, other CI systems, Docker and the CLI.
- Recipes: one leaderboard, several per repository, or one shared across repositories.
- How the game works: classes, stats, levels, loot, odds and the merchant.
- Development: running the tests and how the project is put together.