From Email Signature to Global Infrastructure // SCOPE CREEP

>> NODE: ctrlaltcorp.dev

>> AUTHOR: HOTCHIP

>> TIME: [20260109-0900]

I asked how to change my email signature. This is what happened instead.

This Should Have Taken Thirty Seconds

All I wanted was to update my email signature. Google has hidden this behind a settings page that feels less like a UI and more like an archaeological site. Non‑resizable window. HTML editor pretending it isn’t one. Everything about it says: don’t touch this again.

So naturally, I touched it.

It was a Friday. Tax season lull. Brain still warm. Curiosity met time and nobody intervened.

The First Bad Idea (The Good Kind)

If I have to touch this UI, I’m not doing it repeatedly. So I asked a different question: what if my signature updated itself?

Not something inspirational. Not a quote. Just a rotating list of increasingly unhinged sign‑offs. A small reminder that tools can still be bent, even here.

The plan:

Spreadsheets are the apex predator of the Corp®rate ecosystems. You don’t fight that. You exploit it.

Google Sheet with Column A (signatures) and Column B (TRUE/FALSE)

Apps Script: JavaScript, But Wet

Apps Script is JavaScript if JavaScript were trapped in a municipal swimming pool. Pull the sheet. Find the active row. Replace that text inside the Gmail signature. Mark the new one as active. Schedule it.

It worked immediately. Which is never a good sign.

The Secret Menu (Because of Course)


function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('🤫')
    .addItem('New Sig', 'updateSignature')
    .addToUi();
}
    

This adds a custom menu. No reason. No explanation. Just a little side door for people who know.

Google Sheets custom menu dropdown

Text Is a Liar

Replacing signature text by value works exactly once. Then Gmail reflows the HTML. Smart quotes appear. Line breaks unionize. The string you thought you owned quietly changes shape.

So instead of trusting text, I trusted state. Column B became the source of truth. The row marked TRUE is the one currently deployed. That’s the key used for replacement.

Is it brittle? Yes. Is it good enough for something that exists mostly as a joke? Also yes.

The Moment of Replacement


if (oldSigText !== "" && currentGmailSig.includes(oldSigText)) {
  updatedSignature = currentGmailSig.replace(oldSigText, newSigText);
} else {
  console.error("Sig out of sync");
  return;
}
    
Gmail signature settings with swapped line highlighted

Now There Was Data (This Was a Mistake)

At this point, the system worked. Which meant I now had a list.

And lists invite questions like:

This is how you accidentally schedule more work for yourself.

“I’ll Just Throw a Site Together”

Terminal. Muscle memory.

git init
firebase init
    

Firestore. Static hosting. Client‑side JavaScript. Nothing fancy. Two signatures appear. You click the more unhinged one. Wins and losses increment. Repeat forever.

I had built a global email‑signature colosseum.

Voting page with two signatures side by side

Migrating From Spreadsheets to the Actual Internet

Export CSV. Write a Node script. Push everything into Firestore. This is the point of no return.

The Part Where It Became Real


const newItem = {
  name: name,
  wins: 0,
  losses: 0,
};
await itemsCollection.add(newItem);
    

Once this ran, the joke had infrastructure.

Voting, By Vibes Alone

No auth. No rate limits. No safety rails. Just clicks and consequences.

Transactional Chaos


await db.runTransaction(async (transaction) => {
  transaction.update(winnerRef, { wins: increment(1) });
  transaction.update(loserRef, { losses: increment(1) });
});
    

This is not secure. It is sincere.

Firestore console showing wins incrementing

Rankings: Quantifying Unhinged Energy

Top 100. Ordered by wins. No editorial input. This is what the crowd chose.

Rankings page with counts

What This Was Actually About

I started with: “How do I update my email signature?”

I ended with:

All because the official UI made the simple thing painful and the interesting thing possible.

This Is the Correct Amount of Over‑Engineering

This isn’t about jokes. It’s about taking one square inch back from software that assumes you’ll never push back.

It’s about what happens when:

I can delete this tomorrow. That’s not a failure state. That’s the point.

The Ones That Made the Cut

Not everything belongs in rotation. Some are too loud. Some are just references. Some are trying too hard to be the joke. The ones below fit the tone of the project: flat, dry, slightly resigned, and just unprofessional enough to matter.

These are the signatures that feel like they wandered in on their own.

They read like conclusions, not punchlines. They don’t ask for attention. They don’t ask the reader to laugh. They just end the conversation.

Post Mortem

Sometimes the best thing you can do with a tool is make it do something it was never meant to do. Sometimes that thing is useful. Sometimes it’s just funny. Either way, it reminds you the system isn’t magic, it’s just waiting for someone bored enough to poke it.

 >> END OF TRANSMISSION 

- HotChip

If I had to, I could clean out my desk in five seconds, and nobody would ever know that I’d ever been here.