# Whimsical Pi Agent extension with colorful rotating working messages, playful status phrases, and non-repeating colors

> Source: <https://gist.github.com/deepakness/cebf2c46c4c3158f6a4484bd2a058f6d>
> Published: 2026-08-12 11:54:45+00:00

| /** | |
| * Whimsical working messages for Pi Agent. | |
| * | |
| * Rotates colorful, playful status phrases every two seconds while Pi is | |
| * thinking. Colors and phrases are randomized without immediately repeating | |
| * either the previous phrase or the previous color. | |
| */ | |
| import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; | |
| const messages = [ | |
| // Short | |
| "Schlepping...", | |
| "Combobulating...", | |
| "Doing...", | |
| "Channelling...", | |
| "Vibing...", | |
| "Concocting...", | |
| "Spelunking...", | |
| "Transmuting...", | |
| "Imagining...", | |
| "Pontificating...", | |
| "Whirring...", | |
| "Cogitating...", | |
| "Honking...", | |
| "Flibbertigibbeting...", | |
| "Noodling...", | |
| "Percolating...", | |
| "Ruminating...", | |
| "Simmering...", | |
| "Marinating...", | |
| "Fermenting...", | |
| "Gestating...", | |
| "Hatching...", | |
| "Brewing...", | |
| "Steeping...", | |
| "Contemplating...", | |
| "Musing...", | |
| "Pondering...", | |
| "Mulling...", | |
| "Daydreaming...", | |
| "Woolgathering...", | |
| "Dithering...", | |
| "Faffing...", | |
| "Puttering...", | |
| "Tinkering...", | |
| "Fiddling...", | |
| "Noodging...", | |
| "Finagling...", | |
| "Wrangling...", | |
| "Jiggling...", | |
| "Wiggling...", | |
| "Shimmying...", | |
| "Galumphing...", | |
| "Perambulating...", | |
| "Meandering...", | |
| "Traipsing...", | |
| "Moseying...", | |
| "Sauntering...", | |
| "Ambling...", | |
| "Pottering...", | |
| "Bumbling...", | |
| "Futzing...", | |
| "Schmalzing...", | |
| "Kerfuffling...", | |
| "Bamboozling...", | |
| "Discombobulating...", | |
| "Recombobulating...", | |
| "Unbefuddling...", | |
| "Defenestrating...", | |
| "Confabulating...", | |
| "Persnicketing...", | |
| "Flummoxing...", | |
| "Befuddling...", | |
| "Snorkeling...", | |
| "Yodeling...", | |
| "Zigzagging...", | |
| "Ricocheting...", | |
| "Somersaulting...", | |
| "Pirouetting...", | |
| "Canoodling...", | |
| "Schmoozing...", | |
| "Kibbitzing...", | |
| "Skedaddling...", | |
| "Scampering...", | |
| "Skittering...", | |
| "Sashaying...", | |
| "Swashbuckling...", | |
| "Oscillating...", | |
| "Undulating...", | |
| "Pulsating...", | |
| "Effervescing...", | |
| "Fizzing...", | |
| "Bubbling...", | |
| "Perplexing...", | |
| "Mystifying...", | |
| "Enchanting...", | |
| "Bewitching...", | |
| "Beguiling...", | |
| "Mesmerizing...", | |
| "Bedazzling...", | |
| "Sparkling...", | |
| "Glittering...", | |
| "Scintillating...", | |
| "Coruscating...", | |
| "Phosphorescing...", | |
| "Luminescing...", | |
| "Sublimating...", | |
| "Synthesizing...", | |
| "Amalgamating...", | |
| "Procrastinating...", | |
| "Dillydallying...", | |
| "Lollygagging...", | |
| "Dawdling...", | |
| "Malingering...", | |
| "Skulking...", | |
| "Lurking...", | |
| "Sleuthing...", | |
| "Rummaging...", | |
| "Fossicking...", | |
| "Foraging...", | |
| "Scavenging...", | |
| "Absquatulating...", | |
| "Vamoosing...", | |
| "Absconding...", | |
| "Grooving...", | |
| "Jamming...", | |
| "Improvising...", | |
| "Extemporizing...", | |
| "Freestyling...", | |
| "Frolicking...", | |
| "Gamboling...", | |
| "Blorping...", | |
| "Flonking...", | |
| "Snurfling...", | |
| "Whomping...", | |
| "Zorping...", | |
| "Biffing...", | |
| "Splunging...", | |
| "Thwacking...", | |
| "Gonkulating...", | |
| "Splorfing...", | |
| "Wibbling...", | |
| "Wobbling...", | |
| "Squonking...", | |
| "Plonking...", | |
| "Bonking...", | |
| "Zonking...", | |
| "Flumping...", | |
| "Clomping...", | |
| "Squelching...", | |
| "Schlurping...", | |
| "Glurping...", | |
| "Burbling...", | |
| "Gurgling...", | |
| "Splooshing...", | |
| "Whooshing...", | |
| "Swooshing...", | |
| "Kerplunking...", | |
| "Thunking...", | |
| "Clunking...", | |
| "Clanking...", | |
| "Rattling...", | |
| "Jostling...", | |
| "Rustling...", | |
| "Bustling...", | |
| "Hustling...", | |
| "Miffing...", | |
| "Boffing...", | |
| "Snazzifying...", | |
| "Pizzazzing...", | |
| "Razzmatazzing...", | |
| "Bedoodling...", | |
| "Doodling...", | |
| "Scribbling...", | |
| "Squiggling...", | |
| "Wriggling...", | |
| "Niggling...", | |
| "Higgling...", | |
| "Piggling...", | |
| "Figgling...", | |
| "Gibbering...", | |
| "Jabbering...", | |
| "Blathering...", | |
| "Blithering...", | |
| "Withering...", | |
| "Slithering...", | |
| "Tethering...", | |
| "Feathering...", | |
| "Weathering...", | |
| "Leathering...", | |
| "Heathering...", | |
| "Smoldering...", | |
| "Moldering...", | |
| "Shouldering...", | |
| "Bouldering...", | |
| "Tottering...", | |
| "Teetering...", | |
| "Tittering...", | |
| "Flittering...", | |
| "Jittering...", | |
| "Frittering...", | |
| "Twittering...", | |
| "Nattering...", | |
| "Chattering...", | |
| "Clattering...", | |
| "Splattering...", | |
| "Battering...", | |
| "Scattering...", | |
| "Shattering...", | |
| "Flattering...", | |
| "Pattering...", | |
| "Tattering...", | |
| "Mattering...", | |
| "Yammering...", | |
| "Hammering...", | |
| "Stammering...", | |
| "Clamoring...", | |
| "Glamoring...", | |
| "Enamoring...", | |
| "Shimmering...", | |
| "Glimmering...", | |
| "Brimming...", | |
| "Skimming...", | |
| "Trimming...", | |
| "Primming...", | |
| "Whimming...", | |
| "Humming...", | |
| "Strumming...", | |
| "Thrumming...", | |
| "Drumming...", | |
| "Plumbing...", | |
| "Thumbing...", | |
| "Numbing...", | |
| "Fumbling...", | |
| "Grumbling...", | |
| "Mumbling...", | |
| "Rumbling...", | |
| "Stumbling...", | |
| "Tumbling...", | |
| "Crumbling...", | |
| "Jumbling...", | |
| "Humbling...", | |
| "Bungling...", | |
| "Jungling...", | |
| "Mangling...", | |
| "Wangling...", | |
| "Dangling...", | |
| "Tangling...", | |
| "Jangling...", | |
| "Angling...", | |
| "Struggling...", | |
| "Mingling...", | |
| "Tingling...", | |
| "Jingling...", | |
| "Singling...", | |
| "Ringling...", | |
| "Kingling...", | |
| // Long | |
| "Consulting the void...", | |
| "Asking the electrons...", | |
| "Bribing the compiler...", | |
| "Negotiating with entropy...", | |
| "Whispering to the bits...", | |
| "Tickling the stack...", | |
| "Massaging the heap...", | |
| "Appeasing the garbage collector...", | |
| "Summoning semicolons...", | |
| "Herding pointers...", | |
| "Untangling spaghetti...", | |
| "Polishing the algorithms...", | |
| "Waxing philosophical...", | |
| "Consulting ancient scrolls...", | |
| "Reading tea leaves...", | |
| "Shaking the magic 8-ball...", | |
| "Sacrificing to the demo gods...", | |
| "Warming up the hamsters...", | |
| "Spinning up the squirrels...", | |
| "Caffeinating...", | |
| "Existentially questioning...", | |
| "Having a little think...", | |
| "Stroking chin thoughtfully...", | |
| "Squinting at the problem...", | |
| "Staring into the abyss...", | |
| "Abyss staring back...", | |
| "Achieving enlightenment...", | |
| "Transcending mere computation...", | |
| "Ascending to a higher plane...", | |
| "Communing with the machine spirit...", | |
| "Performing arcane rituals...", | |
| "Invoking elder functions...", | |
| "Consulting the oracle...", | |
| "Divining the answer...", | |
| "Scrying the codebase...", | |
| "Dowsing for bugs...", | |
| "Rearranging deck chairs...", | |
| "Shuffling bits around...", | |
| "Aligning the chakras...", | |
| "Reticulating splines...", | |
| "Reversing the polarity...", | |
| "Calibrating the flux capacitor...", | |
| "Charging the crystals...", | |
| "Tuning the vibrations...", | |
| "Adjusting the cosmic frequency...", | |
| "Waiting for a sign...", | |
| "Hoping for the best...", | |
| "Manifesting solutions...", | |
| "Willing it into existence...", | |
| "Believing really hard...", | |
| "Politely asking the CPU...", | |
| "Bribing the runtime...", | |
| "Flirting with the database...", | |
| "Sweet-talking the API...", | |
| "Negotiating with deadlines...", | |
| "Having words with the cache...", | |
| "Reasoning with the memory...", | |
| "Pleading with the logs...", | |
| "Bargaining with fate...", | |
| "Making offerings to the CI...", | |
| "Praying to the uptime gods...", | |
| "Consulting the rubber duck...", | |
| "Interrogating the stack trace...", | |
| "Cross-examining the debugger...", | |
| "Petitioning the kernel...", | |
| "Lobbying the scheduler...", | |
| "Schmoozing the network...", | |
| "Buttering up the firewall...", | |
| "Wining and dining the servers...", | |
| "Taking the bytes out for lunch...", | |
| "Giving the code a pep talk...", | |
| "Reading the room...", | |
| "Checking under the hood...", | |
| "Kicking the tires...", | |
| "Shaking loose the cobwebs...", | |
| "Dusting off the neurons...", | |
| "Greasing the gears...", | |
| "Oiling the cogs...", | |
| "Winding up the clockwork...", | |
| "Stoking the furnace...", | |
| "Feeding the machine...", | |
| "Watering the logic tree...", | |
| "Pruning the decision branches...", | |
| "Harvesting the outputs...", | |
| "Planting computational seeds...", | |
| "Nurturing the algorithm...", | |
| "Raising the exceptions...", | |
| "Taming wild pointers...", | |
| "Herding cats in memory...", | |
| "Teaching old code new tricks...", | |
| "Whispering sweet nothings to the compiler...", | |
| "Serenading the syntax...", | |
| "Dancing with dependencies...", | |
| "Waltzing through the codebase...", | |
| "Tangoing with type errors...", | |
| "Doing the deployment dance...", | |
| "Having a moment of clarity...", | |
| "Experiencing a flash of insight...", | |
| "Channeling the ancient developers...", | |
| "Receiving transmissions from the cloud...", | |
| "Asking the hamsters to run faster...", | |
| "Convincing the pixels to cooperate...", | |
| "Teaching electrons new tricks...", | |
| "Bribing the byte fairies...", | |
| "Whispering passwords to the void...", | |
| "Negotiating with cosmic rays...", | |
| "Flattering the floating points...", | |
| "Seducing the semicolons...", | |
| "Wooing the while loops...", | |
| "Charming the curly braces...", | |
| "Hypnotizing the hash tables...", | |
| "Mesmerizing the memory banks...", | |
| "Enchanting the error handlers...", | |
| "Bewitching the boolean logic...", | |
| "Spellbinding the stack frames...", | |
| "Hexing the hexadecimals...", | |
| "Jinxing the JSON parsers...", | |
| "Cursing the cache misses...", | |
| "Blessing the build process...", | |
| "Anointing the algorithms...", | |
| "Consecrating the callbacks...", | |
| "Sanctifying the source code...", | |
| "Exorcising the exceptions...", | |
| "Purifying the parameters...", | |
| "Cleansing the closures...", | |
| "Baptizing the binary...", | |
| "Absolving the abstractions...", | |
| "Redeeming the recursion...", | |
| "Forgiving the for loops...", | |
| "Pardoning the pointers...", | |
| "Liberating the lambdas...", | |
| "Emancipating the enums...", | |
| "Freeing the functions...", | |
| "Releasing the references...", | |
| "Unbinding the variables...", | |
| "Untying the type knots...", | |
| "Unraveling the regex...", | |
| "Decoding the mysteries...", | |
| "Cracking the conundrums...", | |
| "Solving the riddles of RAM...", | |
| "Unlocking the secrets of silicon...", | |
| "Discovering hidden semicolons...", | |
| "Unearthing buried bugs...", | |
| "Excavating ancient APIs...", | |
| "Archeologically analyzing the architecture...", | |
| "Fossil hunting in the functions...", | |
| "Spelunking through the stack...", | |
| "Scuba diving in the data...", | |
| "Snorkeling through the streams...", | |
| "Parasailing past the parameters...", | |
| "Hang gliding through the heap...", | |
| "Bungee jumping into the backend...", | |
| "Skydiving through the source...", | |
| "Surfing the syntax waves...", | |
| "Skateboarding down the stack trace...", | |
| "Snowboarding through the schemas...", | |
| "Mountain climbing the modules...", | |
| "Hiking through the headers...", | |
| "Trekking through the trees...", | |
| "Backpacking through the binaries...", | |
| "Camping in the codebase...", | |
| "Glamping in the globals...", | |
| "Picnicking with the processes...", | |
| "Barbecuing the bugs...", | |
| "Roasting the race conditions...", | |
| "Grilling the glitches...", | |
| "Sautéing the syntax errors...", | |
| "Flambéing the failures...", | |
| "Caramelizing the callbacks...", | |
| "Braising the breakpoints...", | |
| "Poaching the pointers...", | |
| "Blanching the branches...", | |
| "Searing the segments...", | |
| "Smoking the subroutines...", | |
| "Curing the code smells...", | |
| "Pickling the packages...", | |
| "Preserving the protocols...", | |
| "Canning the constants...", | |
| "Bottling the buffers...", | |
| "Jarring the JavaScript...", | |
| "Decanting the data structures...", | |
| "Aerating the arrays...", | |
| "Letting the logic breathe...", | |
| "Aging the algorithms gracefully...", | |
| "Maturing the methods...", | |
| "Ripening the results...", | |
| "Seasoning the solutions...", | |
| "Spicing up the specs...", | |
| "Garnishing the getters...", | |
| "Plating the output nicely...", | |
| "Presenting with pizzazz...", | |
| "Adding a dash of elegance...", | |
| "Sprinkling some magic dust...", | |
| "Drizzling debug sauce...", | |
| "Folding in the features...", | |
| "Whisking the widgets...", | |
| "Kneading the namespaces...", | |
| "Rolling out the runtime...", | |
| "Proofing the promises...", | |
| "Letting the dough rise...", | |
| "Baking at 350 kilobytes...", | |
| "Frosting the functions...", | |
| "Decorating the deployment...", | |
| "Icing the interfaces...", | |
| "Glazing the graphics...", | |
| "Topping with tests...", | |
| "Cherry-picking the commits...", | |
| ]; | |
| type Color = readonly [number, number, number]; | |
| type Style = { | |
| color: Color; | |
| ornaments: readonly string[]; | |
| ornamentColor: Color; | |
| }; | |
| // Bright, terminal-friendly colors inspired by the reference screenshots. | |
| const styles: readonly Style[] = [ | |
| { color: [255, 126, 190], ornaments: ["✧", "☆", "✦"], ornamentColor: [255, 126, 190] }, | |
| { color: [255, 205, 45], ornaments: ["✦", "★", "✧"], ornamentColor: [0, 207, 255] }, | |
| { color: [0, 207, 255], ornaments: ["✦", "★", "✧"], ornamentColor: [255, 205, 45] }, | |
| { color: [137, 230, 44], ornaments: ["☆", "✧", "✦"], ornamentColor: [137, 230, 44] }, | |
| { color: [205, 145, 255], ornaments: ["✦", "✧", "★"], ornamentColor: [205, 145, 255] }, | |
| { color: [255, 99, 71], ornaments: ["❯", "✦", "❮"], ornamentColor: [255, 180, 80] }, | |
| { color: [64, 224, 208], ornaments: ["·", "✧", "·"], ornamentColor: [64, 224, 208] }, | |
| { color: [255, 160, 122], ornaments: ["☼", "✦", "☼"], ornamentColor: [255, 160, 122] }, | |
| { color: [170, 255, 195], ornaments: ["⋆", "☆", "⋆"], ornamentColor: [170, 255, 195] }, | |
| { color: [255, 105, 180], ornaments: ["❀", "✧", "❀"], ornamentColor: [255, 215, 0] }, | |
| ]; | |
| function pick<T>(items: readonly T[]): T { | |
| return items[Math.floor(Math.random() * items.length)]; | |
| } | |
| function ansi(color: Color, text: string): string { | |
| return `\x1b[38;2;${color[0]};${color[1]};${color[2]}m${text}\x1b[39m`; | |
| } | |
| let lastMessage = ""; | |
| let lastStyleIndex = -1; | |
| function pickRandom(): string { | |
| let styleIndex = Math.floor(Math.random() * styles.length); | |
| while (styleIndex === lastStyleIndex && styles.length > 1) { | |
| styleIndex = Math.floor(Math.random() * styles.length); | |
| } | |
| lastStyleIndex = styleIndex; | |
| const style = styles[styleIndex]; | |
| const left = `${pick(style.ornaments)} ${pick(style.ornaments)} `; | |
| const right = ` ${pick(style.ornaments)}`; | |
| let message = messages[Math.floor(Math.random() * messages.length)]; | |
| // Avoid showing the same phrase twice in a row. | |
| while (message === lastMessage && messages.length > 1) { | |
| message = messages[Math.floor(Math.random() * messages.length)]; | |
| } | |
| lastMessage = message; | |
| return `${ansi(style.ornamentColor, left)}${ansi(style.color, message)}${ansi( | |
| style.ornamentColor, | |
| right, | |
| )}`; | |
| } | |
| export default function (pi: ExtensionAPI) { | |
| let messageTimer: ReturnType<typeof setInterval> | undefined; | |
| function stopChangingMessages(ctx: { ui: { setWorkingMessage: (message?: string) => void } }) { | |
| if (messageTimer) { | |
| clearInterval(messageTimer); | |
| messageTimer = undefined; | |
| } | |
| ctx.ui.setWorkingMessage(); | |
| } | |
| pi.on("turn_start", async (_event, ctx) => { | |
| // Change the phrase and color every second while Pi is working. | |
| if (messageTimer) clearInterval(messageTimer); | |
| ctx.ui.setWorkingMessage(pickRandom()); | |
| messageTimer = setInterval(() => { | |
| ctx.ui.setWorkingMessage(pickRandom()); | |
| }, 2000); | |
| }); | |
| pi.on("turn_end", async (_event, ctx) => { | |
| stopChangingMessages(ctx); | |
| }); | |
| pi.on("session_shutdown", async (_event, ctx) => { | |
| stopChangingMessages(ctx); | |
| }); | |
| } |
