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