Reverse Engineering Claude Code's 2026 April Fools

4 min read Original article ↗

When Claude Code first came out there was a little easter egg discoverable by looking through the source on release day: if you asked about swag, a Google Form would pop up. The Claude Code team actually hand-packed the mailers for the first 1k folks.

Claude Code’s source code was leaked which leads to another easter egg, their April Fools joke this year: a “tamagotchi”-style buddy strangely reminiscent of Figma’s April Fools in 2025, FigPals.

Thanks to the source leak, we can reverse engineer how the buddy system works. Let’s hunt some pokemon buddies:

The Buddy System

Buddies are broken down by rarity, species, eye, hat, shiny, and stats:

Stats and shiny appear to be dead code, rolled but never consumed. Here’s what they all actually look like:

Your buddy is determined strictly by your userId and a fixed SALT:

export function companionUserId(): string {

const config = getGlobalConfig();

return config.oauthAccount?.accountUuid ?? config.userID ?? "anon";

}

export function roll(userId: string): Roll {

const key = userId + SALT;

if (rollCache?.key === key) return rollCache.value;

const value = rollFrom(mulberry32(hashString(key)));

rollCache = { key, value };

return value;

}

Notice mulberry32 being used: a 32-bit deterministic pseudo-random number generator. It is not cryptographically secure, but the source indicates it is “good enough for picking ducks”. Because it operates in a 32-bit space, there are exactly 2^32 (about 4.29 billion) possible PRNG states, which is trivial for a modern CPU to brute force in seconds. That means you can pick any combo you want and find a matching UUID in seconds, just using your browser. So let’s do exactly that…

Build your own

Choose your ideal species, eyes, hat, rarity, and shiny. We’ll brute-force a UUID that rolls your exact combo, right in your browser:

To use your UUID, edit ~/.claude.json and change oauthAccount.accountUuid to the generated value, then restart Claude Code. As far as I can tell, changing this value has no negative effect on how Claude Code operates, but it doesn’t hurt to capture a backup first.

Since the name and personality are LLM-generated (not deterministic), they’re stored in a separate companion section you can also customize freely:

{

"oauthAccount": {

"accountUuid": "461d455b-53f9-4f07-87c5-46dc0e2db302"

},

"companion": {

"name": "Gristle",

"personality": "Insists every variable name should rhyme with the one above it."

}

}

So go ahead, build your shiny wizard axolotl, give it whatever name you want, and let it judge your code.

Claude Code buddy example

But wait: there’s more!

This post was written before the buddy system came out, now that it is out in Claude Code v2.1.89 (just type /buddy) I’ve uncovered a little more info.

It looks like buddies also get names, and all the previously unused stats (shiny, etc.) influence the name and personality. Here’s the system prompt:

You generate coding companions — small creatures that live in a developer’s terminal and occasionally comment on their work.

Given a rarity, species, stats, and a handful of inspiration words, invent:

  • A name: ONE word, max 12 characters. Memorable, slightly absurd. No titles, no “the X”, no epithets. Think pet name, not NPC name. The inspiration words are loose anchors — riff on one, mash two syllables, or just use the vibe. Examples: Pith, Dusker, Crumb, Brogue, Sprocket.
  • A one-sentence personality (specific, funny, a quirk that affects how they’d comment on code — should feel consistent with the stats)

Higher rarity = weirder, more specific, more memorable. A legendary should be genuinely strange. Don’t repeat yourself — every companion should feel distinct.

The user message is templated with the buddy’s rolled traits and 4 random inspiration words picked from a bank, e.g.:

Generate a companion.

Rarity: LEGENDARY

Species: owl

Stats: debugging:86 patience:51 chaos:80 wisdom:71 snark:100

Inspiration words: cobble, fennel, apex, murmur

SHINY variant — extra special.

Make it memorable and distinct.

If the API call fails, it falls back to one of 6 hardcoded default names. Here’s the 6 hardcoded fallback names and the complete 156-word inspiration bank:

There’s also an interesting “reaction” system: occasionally (or when addressed directly) your buddy will react to what is going on in your Claude Code session. As you would expect, the endpoint (POST /api/organizations/{org_uuid}/claude_code/buddy_react) also takes the buddy’s name, personality, species, rarity, and stats (debugging, patience, chaos, wisdom, snark) into account. These reactions don’t count against your usage quota though… free inference, anybody?