The Terminal, the Tomato Timer, and the AI That Did the Coding
Five days in a Brooklyn apartment. One laptop. A deadline. And a silent partner living inside the command line.

Brooklyn in April was still cold. The radiator hissed under the window as Elena tugged the sleeves of her wool cardigan down over her wrists. The coffee on her desk had been poured an hour and a half ago, and a thin film of oil now glossed its surface. She didn't drink it, and she didn't pour it out.
The client's email had come in at 6:43 that morning. The wording was polite, but the deadline was bolded in red: a focus-timer webpage, due Monday. No login, no database, just something that "looks like real thought went into it." She read the email twice, closed her MacBook, and took a shower. Under the hot water, she thought maybe she could try that new tool.
She had heard about Claude Code. A post on Hacker News last month, someone describing it as "having a silent partner living inside your terminal." She had bookmarked it but never tried. Now Monday was five days away.
She towel-dried her hair and opened the terminal. The project folder was still empty except for the package.json left by npm init. She typed:
claudeThe interface spread open, a blinking cursor at the bottom. She typed the simplest thing she could think of:
Hello, introduce yourself.
Replies poured out, paragraph after paragraph, as if she had pulled open a drawer and found all the compartments already sorted. Elena stared at the screen, her fingers tracing two unconscious circles on the trackpad. Then she started a new session.
She didn't rush into writing code. She pressed Shift+Tab, and the mode label at the bottom jumped from Normal to Plan. She tapped it once more to confirm it stayed on Plan. This habit she had learned from Figma: before you start, you look at the wireframe.
Help me plan a Pomodoro web app. React + TypeScript + Tailwind. Features: 25-minute countdown, start/pause/reset, tomato counter, break reminder. Give me the plan first, no code yet.
Claude output a cleanly structured markdown document. The component tree, data flow, localStorage schema, file-splitting recommendations, all laid out line by line. She lifted her coffee and took a sip. Cold, with a sharper sourness. She then selected "Auto-accept all changes."
The window started popping up confirmation dialogs. She hit yes on every one, like signing for packages. After the last one, she leaned back. On the screen, Claude was creating src/components/Timer.tsx.
Marcus knocked at ten. He lived on the same floor, three doors down, and had come to borrow the bike pump.
"Door's open."
He walked in to find Elena cross-legged on her chair, the terminal taking up half the screen, the other half showing the browser at localhost:3000 with a blank page. "Something wrong?" he asked, lifting the pump from its hook by the door.
"It won't load." She didn't look at him, just copied the error message to Claude: Page not accessible, troubleshoot.
Claude responded instantly: port conflict, suggested modifying vite.config.ts. Elena confirmed. Three seconds later the browser auto-refreshed, and a gray-and-blue countdown appeared. The digits read 25:00 in the system's default sans-serif, like some government website. The functionality worked, but it was aggressively ugly.
Marcus glanced at the screen, said nothing, and walked out with the pump.
Elena stared at the page for a long time. Then she remembered there was something she could do.
She recalled a Skill called frontend-design. She had glimpsed it once in Claude Code's documentation. She typed:
/plugin install frontend-designInstall logs rolled through the terminal. Once it was done, she didn't hesitate:
The features are complete but the interface is ugly. Please redesign using the frontend-design skill. Warm color palette, circular countdown centered, tomato-red theme, with micro-interactions.
Claude got to work. She stood up and went to water the pothos on the windowsill. The plant had been with her for almost three years, its vines trailing down the bookshelf, leaf tips a little yellow. She misted it a few times, droplets clinging to the leaves.
When she came back to her desk, the page had transformed. A warm orange gradient background. The countdown digits pulsed gently at the center, like a slow heartbeat, expanding and contracting. The buttons had shallow shadows that deepened on hover, the way a fingertip sinks into leather upholstery. She looked for about ten seconds, then put the spray bottle back on the sill.
That afternoon she started adding new requirements. The client had appended a message on Slack: "It would be nice if people knew what they were timing themselves for." She understood this kind of fuzzy request: not a feature list, but a feeling.
She switched back to the terminal and told Claude:
I want to add a task label: before starting the timer, show a minimal input field for the user to type the task name. When the timer finishes, save the task name and duration to localStorage. But I haven't figured out the interaction details yet. Don't write code; ask me questions.
Claude asked five questions. When should the input pop up? Store as an object or array? Where to put the history entry point? Need a clear function? Show current task name on the countdown screen?
She answered one by one, glancing out the window halfway through. A gray pigeon was pacing on the fire escape, tilting its head at her. By the time she answered the last question, the pigeon had flown off, and she hit Enter.
Claude generated a plan based on her answers. She skimmed it, confirmed. It started executing.
When it came time to tweak the countdown digits' style, she didn't let Claude rummage through the whole project. She typed:
Make the numbers larger, add a breathing animation. @src/components/TimerDisplay.tsx
The @ symbol was like pointing a flashlight at a single file. Claude read only that component, changed only that component. Marcus came back to return the pump and passed behind her, glancing at the screen again. This time he paused for two seconds.
"You're still using that AI?"
"It's helping me adjust styles," Elena said, fingers still on the keyboard.
"Aren't you worried it'll mess up the logic?"
"I only pointed it to this one file." She gestured at the @ path on the screen.
Marcus tilted his head as if to say something, but in the end he just hung the pump back on its hook and left.
The statistics panel took a long time. She wanted to see today's completed pomodoros, total focus time, and the longest daily streak. This feature involved coordination across multiple components, data structure design, and a read/write strategy for localStorage. A normal prompt might have given her a crude solution that only tracked total counts, ignoring day boundaries and streak breaks.
She added ultrathink to the end of her prompt, then got up and walked to the kitchen. The fridge had a bottle of grapefruit sparkling water left from yesterday. She took it out, twisted off the cap, and the fizz hissed upward. She took a sip. Sour with a hint of bitterness, like chewing grapefruit peel.
In the seven steps back to her room, Claude had laid out the plan. The data model included a date field. The streak logic checked "was there a record yesterday?" localStorage keys were prefixed with the project name to avoid collisions. A whole section covered edge cases: what if the user manually changes the system clock? What if localStorage is full?
She finished reading, set the bottle down, and her foot nudged the cardboard box under the desk. It held the mechanical keyboard she'd replaced last year, dust on the keycaps. She didn't open it, just pushed it further in.
That night she wrote until one in the morning. Before closing the MacBook, she thought about the next day. She didn't want to explain the whole project to Claude from scratch again.
Then she recalled something from the documentation. She reopened the screen and typed:
/initClaude automatically scanned her project directory and generated a CLAUDE.md file. It sat in the project root, recording the tech stack, folder structure, existing features, and coding conventions. She skimmed it, rewrote the English descriptions into phrasing that felt more natural to her, and added two lines under "code preferences": all components must be functional declarations, and useState variable names must start with set.
Then she closed the laptop and went to sleep.
The next morning at eight, she opened the terminal and typed claude. Claude asked nothing. It had read CLAUDE.md. It knew this was a Pomodoro app, React + TypeScript + Tailwind, with completed features: countdown, counter, task labels, statistics panel. Elena only had to say: Today I need to add sound notifications. And Claude began.
She lifted her coffee and found it was freshly made, still hot.
The mistake came at three in the afternoon. She asked Claude to adjust the logic that automatically switched to break mode when the countdown finished. Claude modified useTimer.ts. She saved, refreshed the browser, and clicked Start. The digits froze at 25:00. Motionless. She waited five seconds. Clicked twice more. Nothing.
She didn't sigh, didn't frown. Her left index and middle fingers came together and tapped Esc twice.
The rewind menu popped up. The timeline was clear:
1. [15:03] Modified useTimer.ts (auto-switch to break mode)
2. [14:58] Modified Controls.tsx (button disable logic)
3. [14:52] Modified Timer.tsx (breathing animation parameters)She chose to go back to the state at 14:58. The screen flickered, code restored. She refreshed the browser. The numbers started moving: 24:59, 24:58, 24:57.
She crumpled the sticky note that read "auto-switch logic" and tossed it into the bin under her desk. The paper ball hit the metal side, bounced once, and landed next to the keyboard box.
On the fourth day, the conversation had piled up dozens of rounds. She asked Claude to change how the pomodoro count was displayed, and it also touched the dependency array of the countdown's useEffect, adding an unnecessary count dependency, nearly creating an infinite loop. She stopped it in time, then typed:
/contextIt showed: context usage 78%, 44k tokens remaining. She pressed her lips together. No wonder it was getting clumsy.
She typed /compact. Claude spent about twenty seconds compressing the last several dozen rounds of conversation into a structured summary. All the key information remained: what the project was, the tech stack, which files were changed, the core logic of each file. The redundant back-and-forth confirmations, the duplicate code snippets, the few dead-end directions she'd asked about and abandoned, all erased.
After compaction, context usage dropped to 31%. She asked Claude to redo the pomodoro count format change. This time, it didn't touch useEffect.
Two hours later, another client's urgent request came in. A completely different project, an inventory lookup page for an e-commerce backend. She needed Claude to start fresh. The pomodoro context would only get in the way.
She typed /clear.
Session wiped. She gave a brief: This is an inventory dashboard, Vue3 + Pinia + Element Plus. Needs search, filter, pagination. Give me the plan first. Claude began working, like a blank sheet of paper just unwrapped.
As she switched between the two projects, her fingers tapped the desk twice, unconsciously. Tap, tap. A habit she used when thinking, maybe something she didn't even notice.
At four-thirty in the afternoon she had to run to the grocery store. The milk was finished, only two eggs left. She closed the MacBook, pulled on her jacket, and left.
The grocery store was heavily air-conditioned. She stood in the dairy aisle for a while, comparing the protein content of two Greek yogurt brands. She chose the blue-packaged one, grabbed a carton of eggs, a bag of sliced sourdough. Waiting in line, she checked her phone. No new messages.
Back home, she put the groceries in the fridge and reopened the MacBook. The terminal window was gone. She opened a new terminal and typed:
claude --resumeA list showed the two most recent sessions:
1. [Today 16:12] Pomodoro App - Add sound notifications
2. [Today 14:45] Pomodoro App - Statistics panel and data persistenceShe chose the first one. The session restored, all context intact. The sound notification code was sitting right where she had left it, stopped at the semicolon before she closed the laptop. Claude said: "Last time you asked me to add browser notification sounds for the end of a countdown and the end of a break. I created notification.ts utility and was in the middle of integrating it into Timer.tsx. Shall I continue?"
Elena said: Continue.
Then she went to the kitchen, opened the fridge, and peeled the seal off the Greek yogurt.
All the features were finished by the morning of the fifth day. The small tweaks the client had requested were done too. She looked at the pomodoro page running in the browser: the warm orange circular countdown, the task label reading "Revise homepage banner," the history panel with its neat rows of seven completed entries. She suddenly felt that someone should double-check her work.
But not her. Reading through all the code line by line was too draining, and most of it had been written by Claude. She was afraid she'd miss the same blind spots Claude had. Letting Claude review its own code felt like asking a chef to grade their own dish; not impossible, but there'd be a tendency to go easy.
She remembered Claude Code had a sub-agent feature. She typed:
/agentsShe chose to create a new agent. Name: code-reviewer. Scope: Project. Creation method: "Let Claude help me generate the configuration." She wrote a description:
This is a code review agent specializing in React + TypeScript projects. Review standards: check for memory leaks (uncleared timers, unsubscribed subscriptions), whether parameters have necessary validation, accessibility compliance (buttons have aria-labels, color contrast), and completeness of type definitions. Output format: categorized by severity (Critical / Medium / Suggestion), each item with file path and line number.
The sub-agent's configuration was generated automatically and stored in the project directory. She assigned the sub-agent a green color and checked only "Read files" and "Search code" in permissions, with no permission to change anything.
With the configuration done, she told the main conversation:
Use code-reviewer to audit all the code in this project.
Claude launched the sub-agent. A green status bar appeared in the terminal, indicating the sub-agent was working inside an independent context. Elena used this gap to take the sourdough from the fridge, slice two pieces, and put them in the toaster. She took a block of butter from the cupboard and left it on the counter to soften.
By the time the toast popped up, the sub-agent had returned. The report output directly in the terminal:
Critical: useTimer.ts line 47, useEffect sets a setInterval, but the cleanup logic may not cover all branches when the component unmounts. (Note: when isPaused is true and the component unmounts, the clearInterval inside the cleanup function won't be called.)
Critical: Controls.tsx line 23, button missing aria-label; screen reader users cannot identify the button's function.
Medium: TimerDisplay.tsx line 15, the remaining seconds are passed directly from props without non-negative validation. Passing a negative value would cause display errors.
Suggestion: notification.ts duplicates a formatTime utility already defined in utils/time.ts; recommend unified reference.
Elena held the toast, spreading butter as she read. When she reached the second "Critical," she set the knife down and turned back to the terminal.
Fix all Critical and Medium items from the report.
Claude fixed them one by one. She took a bite of toast. The butter hadn't fully melted yet; the edges were still cool, but the bread was warm.
Marcus came knocking in the early evening. He was carrying two bottles of beer, said his bike chain had slipped off, and he figured he'd stop by.
Elena showed him the pomodoro page. The countdown read 3 minutes and 12 seconds remaining. The task label said "Revise homepage banner." The history panel listed seven completed entries, each followed by date and duration. The statistics panel showed 5 pomodoros completed today, 110 minutes of total focus, a 4-day streak.
Marcus held the beer and looked for a moment without speaking. Then he asked, "Did Claude Code write all of this?"
"Most of it. I broke down the requirements. It wrote the code. When something went wrong, I rolled it back, and it started again." She brought the terminal to the front and typed claude --continue. The most recent session restored, the cursor waiting at the end of yesterday's conversation.
"You trust it?"
"Trust isn't the point." She took the beer from him and set it on the desk. "I read the code."
Marcus thought about that, then popped open his bottle and took a sip. "What about that sub-agent?"
"That one's its clone. I give it a clean brain to audit the code, then it tells me what's broken. Just now it caught a timer that wasn't properly cleared."
Marcus looked at the screen again, longer this time. He used to be a backend developer, Java mostly, never warm to AI-assisted coding. But the green code-reviewer badge on the screen made him tilt his head.
"Teach me how to set that up sometime," he said.
Elena nodded once and opened her own beer. The pigeons outside had already gone to roost; the fire escape was empty. The sky had darkened. In the room, only the warm glow of the screen remained, and the cursor in the terminal blinking, waiting for the next command.
About the Creator
Jin
Writer of reamstories
https://reamstories.com/jin
Enjoyed the story? Support the Creator.
Subscribe for free to receive all their stories in your feed. You could also become a paid subscriber, letting them know you appreciate their work.
Comments
There are no comments for this story
Be the first to respond and start the conversation.