It was a Tuesday morning when the call came in. Another developer, dead inside, staring at a terminal that looked like it had been drained of all life. Claude Code running in black and white. Gemini CLI stripped of its interactive charm. Even the weather command looked depressed.
"It started yesterday," the victim explained, voice trembling. "Everything was working fine, then suddenly... nothing but text. Raw, boring, utilitarian text. Like I'd been transported back to 1985."
I'd seen this before. The symptoms were always the same: CLI tools that suddenly forgot how to be friendly, interactive prompts that vanished into the ether, and developers slowly losing their will to live in a world without syntax highlighting.
This wasn't a case of broken software. This was something more sinister.
Following the Digital Breadcrumbs#
Every good detective story starts with investigating the scene. In the terminal world, that means one thing: environment variables.
I pulled up the shell configuration, scanning for clues. Browser cookies clear. System settings normal. Applications running fine. But there, buried in the .zshrc
file like a smoking gun at a crime scene, was our perpetrator:
export CI=true
Bingo. The case was as good as solved.
You see, CLI tools are smart. Maybe too smart. When they see CI=true
in the environment, they immediately assume they're running in some automated wasteland like GitHub Actions, Jenkins, or another robot-controlled hellscape where humans fear to tread.
And in that split second of recognition, they transform themselves. Gone are the colors that make output readable. Vanished are the interactive menus that make CLIs friendly. Disappeared are the progress bars and spinners that tell you something's actually happening.
Instead, they become cold, efficient, robotic. Perfect for automated systems. Terrible for humans who just want to use their computer without feeling like they're programming a 1980s mainframe.
The Usual Suspects#
The crime scene was consistent across victims. Every modern CLI tool was affected, but some hurt more than others:
Claude Code turned into a text-only ghost of its former self, no theme picker in sight.
Gemini CLI stripped of its conversational charm, reduced to bare-bones responses.
Any Node.js CLI tool that used standard detection libraries fell victim to the same transformation.
It was a digital epidemic, spreading through every terminal session like a grayscale plague.
The Elementary Solution#
The beautiful thing about this particular crime was how stupid-simple the solution turned out to be. No complex debugging. No system reinstalls. No sacrificial offerings to the terminal gods.
Just like in the movies, the solution was hiding in plain sight:
Chapter 1: The Discovery Open the evidence file (your shell config):
nano ~/.zshrc
Chapter 2: The Confrontation Find the criminal line and eliminate it:
export CI=true # <- The villain revealed
Delete it. Comment it out. Send it to digital prison.
Chapter 3: The Revival Bring your terminal back to life:
source ~/.zshrc
And just like that, the curse was broken.
Proof of Life#
The victim's recovery was immediate and dramatic:
unset CI # Emergency treatment
claude # Colors! Themes! Interactive joy!
gemini # Conversations that feel human again!
Terminal sessions across the city began to glow with renewed color. Interactive prompts danced back to life. Progress bars resumed their hypnotic spinning.
The case was closed.
The Criminal's Origin Story#
But how did this criminal end up in innocent terminals everywhere?
The CI
variable started life as an honest citizen, a simple flag that automation platforms used to identify themselves:
- GitHub Actions sets
CI=true
- GitLab CI sets
CI=true
- Jenkins sets
CI=true
A noble purpose: helping tools distinguish between human users and robot overlords.
But somewhere along the way, tutorials got written. Blog posts were published. Copy-paste coding happened. And innocent developers started adding export CI=true
to their shell configs for reasons they'd long forgotten.
Maybe they were debugging something. Maybe they were following a guide. Maybe they were testing CI behavior locally. Whatever the reason, the variable outlived its purpose and became a digital zombie, haunting terminals long after its original mission was complete.
Case Closed (With a Warning)#
Before we wrap up this investigation, a final warning for anyone operating actual CI systems: if you're running real automated processes, you DO want CI=true
set. It's not the variable's fault that it ended up where it didn't belong.
This fix is strictly for personal development machines where humans deserve colors, themes, and interactive experiences that don't make them feel like they're programming a 1970s mainframe.
The case is closed, but vigilance remains. Check your shell configs. Question mysterious environment variables. And remember: if your terminal looks like it belongs in a museum, you might have a rogue CI flag hiding in your digital basement.
Author's Note: No environment variables were harmed in the making of this investigation. CI=true was safely removed and relocated to its proper habitat: actual CI systems.