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:
- Google Sheet.
- Column A: signatures.
- Column B: which one is currently live.
- Apps Script to swap it daily.
Spreadsheets are the apex predator of the Corp®rate ecosystems. You don’t fight that. You exploit it.
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.
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;
}
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:
- Which one is best?
- Who decides?
- What if we let the internet touch it?
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.
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.
Rankings: Quantifying Unhinged Energy
Top 100. Ordered by wins. No editorial input. This is what the crowd chose.
What This Was Actually About
I started with: “How do I update my email signature?”
I ended with:
- A scheduled deployment pipeline.
- A crowd‑ranked content system.
- An internal tool reachable from anywhere on Earth.
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:
- Curiosity meets time.
- APIs are exposed.
- Nobody says no fast enough.
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.
- With spite.
- Yours in utter defeat.
- No cheers, only tears.
- From the trenches.
- Warmest regards from the depths of my last nerve.
- Till our next professional rendezvous.
- If anyone cares...
- Sincerely, despite the circumstances.
- At a loss for words.
- Have the day you deserve.
- Have a Monday.
- With palpable vibes.
- Looking forward (to Friday).
- I was misinformed.
- Just put the fries in the bag.
- This could've been an email.
- This could've been a meeting.
- Per my last email…
- Thanks for coming to my TED Talk.
- I think that pretty much sums it up...
- Why are you the way that you are?
- I don’t hate it. I just don’t like it at all, and it’s terrible.
- I think you’re under-thinking it.
- Mentally I'm on my lunch break.
- Error 404: Professionalism not found!
- Ending this email like I end meetings: abruptly.
- Leaving you with more questions than answers.
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.