Why Plants Grow in the Dark
TL;DR:
>4-hour call with Zi, open MS Paint
>spend 90 minutes drawing phytochrome molecules and arguing about naming conventions
>discover why plants actually grow at night: darkness lets growth proteins accumulate
>realise the stadium lights we install at EGC use this exact mechanism
>ask Gemini to write prompts about what we just discussed, paste into Claude
>design a sledgehammer test: static 25C vs cycling vs cold, 5 days, mint nodes
>Zi says build a dashboard, Claude builds one in 20 minutes
>try to test the heater, inner agent corrects us within 60 seconds
>two Claude contexts overwrite each other on the Pi
>set thermostat to 21C, tell housemate not to touch the radiator
The lab had been quiet for four days. I’d spent them building an AI image editor for the Bucharest design team — the previous post covers what happened and what I learned. Today was the first time back.
Zi called on WhatsApp. I walked him through what I’d built over those four days — the architecture pivot from 600 lines of plan pipeline code to a 179-line task prompt, the Gemini prompt enrichment layer that lets the team write in Romanian, the Bucharest team’s first real sessions. Zi talked about his work with evals and pretraining. Two hours in, we switched to Google Meet so we could use Gemini’s meeting features for the lab discussion.
On Meet, we spent the first 20 minutes testing those features — the “catch me up” button that summarizes the discussion so far, the live transcription. “This is so sick,” Zi said, pressing it. “Summarize the discussion so far.” It returned: “The discussion so far focused on confirming the active features of the meeting.” Not much to summarize yet.
Zi’s on the Google stack and wanted to show me the Workspace admin console — specifically whether we could downgrade EGC’s plan from Business Plus to Business Standard without losing Gemini features. We could. I set a reminder to review it in a month.
We compared Claude usage limits — I’d nearly maxed out my weekly allowance from the previous session. Zi’s take on whether EGC should be paying for my subscription: “The amount of value you return — like $200, like 200 pound is what, like a day’s work? But the multiple you return on this is insane.”
Then Zi’s muscles started twitching. He hadn’t eaten breakfast. “My hands are like kind of fasciculating.” I told him he’d entered ketosis — his cells were breaking down fat instead of sugar. He grabbed his food from the door where it’d been sitting for 20 minutes while we’d been deep in conversation.
Then we got into it.
Phytochrome and PIFs
We opened MS Paint. This section gets molecular. If your eyes glaze over at “photoisomerization,” skip to the football stadium bit — that’s where it clicks.
Zi wanted to understand the actual causal chain — not “light affects growth” but molecule by molecule, what happens when a photon hits a plant.
I drew the phytochrome on the canvas. Two lobes, a T-junction section, and a tail. “So this is phytochrome,” I said. “P-R. That’s just the shorthand.”
“But why is it called PR?” Zi asked. “R is not in — oh yeah, there is an R in phytochrome.” Naming conventions in biology.
We had Claude and Gemini open side-by-side. We developed a workflow: when we wanted to investigate something, I’d ask the Gemini meeting AI — which had been listening to our entire conversation — to write a prompt about whatever we’d just been discussing. It would generate a detailed prompt grounded in context we’d built up live, and I’d paste that straight into Claude. “What do you think of the two model usage pattern?” Zi asked. “Very convenient,” I said. “I literally just asked Gemini to give me the fucking prompt based on the discussion we just had 10 seconds ago.” Zi’s system prompt for Gemini is tuned for causal chain explanations with inline ELI5 annotations — useful when terms like “tetrapyrrole” and “photoisomerization” start flying.
Here’s the mechanism we pieced together:
Phytochrome is a two-state switch. In its default state (PR), it absorbs red light. This triggers photoisomerization — pi electrons in a double bond get excited, the bond temporarily behaves like a single bond, the molecule rotates around it, and relaxes into a new geometry (PFR). That small twist propagates through the protein, changing its entire shape.
“It’s not a metal ion system?” I asked. “Like copper?” No — phytochrome relies on pi electron photochemistry in conjugated double bonds. The extended system already absorbs red light efficiently without needing a metal center. We both learned something.
PFR is the biologically active form. It moves into the nucleus, finds PIF transcription factors floating around, and tags them for destruction by the proteasome. “Grabs and tags,” Zi said, reading the AI-generated visual. “Marked for death.”
“But why is it called factors?” Zi kept asking. Because PIF is a class — different plants have different versions, but they all share the interface that’s compatible with PFR. Think of it as any protein shaped to interact with the red-light-modulated phytochrome.
The key insight: during daylight, sunlight contains more red than far-red light. PR converts to PFR. PFR hunts PIFs. No PIFs means no growth gene activation. Growth suppressed.
In darkness, PFR thermally reverts back to inactive PR — no far-red light needed, just time and heat. PIFs accumulate because nothing is hunting them. They bind to DNA promoters, activating two parallel pathways: auxin signaling (yucker genes) and cell wall loosening (expansion genes). Both are needed — without expansion, the auxin would just burst the cell.
“Dude, dude, dude — that’s why night and day, man.” The connection clicked at the same moment for both of us. Darkness doesn’t just slow things down. Darkness is when the plant grows.
Then Zi made another connection. “You know in football stadiums, they shine these lights on the pitch at night? I used to think they just did this to keep the stuff warm so it wouldn’t freeze. But actually it’s to stimulate regrowth.” I pulled up EGC’s website — we actually install these systems. Same mechanism, industrial scale. “Dude, I had no idea, man. Literally today I learned.”
Why not just keep plants in the dark?
If darkness promotes growth, why not grow everything in total darkness? Because plants need to photosynthesize to produce sugar. At small scale — tissue culture — you supply sugar through the media, so it works. But there’s a scaling problem: as the plant grows, the fixed diameter of phloem pipes can’t deliver enough sugar to exponentially multiplying cells. “Dude, it’s literally exponential because of the branching.” That’s also why trees get thicker — they need more bandwidth.
We explored spraying leaves with sugar instead. Claude flagged the problems: waxy cuticle resists absorption, concentrated sugar causes osmotic damage (the cells plasmolyze), and it’s a pathogen buffet. “The plant has already invented the solution. It’s called a chloroplast.”
This led to a detour into photosystem 1 and 2 — the actual protein complexes inside chloroplasts that capture light. Which led to an idea that genuinely excited both of us.
“Could you theoretically engineer photosystem 5?” Zi asked. “Like make it way better?”
We agreed this was downstream — maybe six to nine months — but the ambition was real. Zi said he could see himself “dedicating the rest of my life to this kind of funky stuff.” The detail matters. “You can’t just be waving your hand and saying let’s splice some genes. It gets infinitely more fascinating when you see the details at the fine resolution, and then you start asking questions like — why hasn’t somebody done this? — and you realize actually not that many people have.”
Then he shared a video about a 10-year-old kid who discovered that butterflies retain memories through metamorphosis — and that those learned responses appear to persist in subsequent generations. “It’s not because he read every fucking book in existence, but he had just enough to piece together the parts to run his own experiments.” The point: breakthroughs come from creative experimentation, not just credentials. “Imagine you had to physically execute what we’re doing now five or ten years ago. You’d probably need at least a master’s, PhD and postdoc just to condense the basic knowledge required to even reason about such things.”
Temperature cycling
For our experiment, we don’t need to vary light at all. At small scale, keeping cultures in the dark should promote faster growth — a tissue culture technician confirmed this in a video I’d watched earlier. So we can eliminate light as a variable entirely and focus on temperature.
But why would temperature cycling help growth? I proposed a hypothesis: a repressor protein is created faster at higher temperatures, so dropping the temperature reduces repression and promotes growth. Claude’s response: “Your hypothesis is logically elegant, but it’s almost the exact reverse of what’s actually happening.” High temperature actually leads to less repression and more PIF accumulation.
We identified three real theories:
-
Carbon budget — cooler nights slow respiration. The plant burns less stored sugar, leaving more for structure. Respiration rate roughly doubles for every 10°C increase. Slower respiration at night means better carbon efficiency — you’re running the furnace on low when you’re not trying to build.
-
Signal separation — the circadian clock expects temperature to confirm the light/dark cycle. Static temperature blurs the signal. “Like running a factory where the shift whistle never blows. The workers have internal schedules but no external confirmation of whether it’s day shift or night shift.”
-
Gene expression gating — growth genes are only responsive during specific windows when the evening complex lifts its repression and the temperature signal arrives. A temperature drop sharpens that window. Static temperatures blur it.
We asked both models which theory produces the biggest signal. Claude said carbon budget. Gemini pointed to gibberellin biosynthesis. They disagreed. The tension was itself informative — this isn’t settled science.
The experiment design
Zi pushed hard for a falsifiable hypothesis with a short feedback loop. When Claude suggested a 4-week culture cycle, Zi wasn’t having it. “Four weeks, bro? Really? If you injected one with fucking steroids and froze the other, you’d see a difference in two days.”
The point: if the mechanism is significant, we should detect it quickly. “It’s essentially predicting that it’s going to be inconsequential. Then let’s cap it. In five days, if you can’t even measure a 1 millimeter difference, it means it’s insignificant.”
We settled on a “sledgehammer test”:
Baseline (3 days): Constant 21°C, cultures in darkness, photos every 15 minutes.
Test (5 days): Static 25°C control vs 25°C day / 18°C night cycling vs 18°C cold static.
Measurements: Fresh weight, dry weight (rinse with IPA to remove agar, blot, weigh, dry, weigh again), shoot count, length from photos.
The starting material is a node — the point where a mint plant branches, containing a high concentration of undifferentiated cells that can become embryos. Cut here and here, put it in the agar solution, seal it.
Cultures go in sealed deli pots — room humidity is irrelevant. Cover with opaque material — at least three layers. “One towel is going to let in light. Plants can do a lot with very little.” Use the LED grow light (Craft Boys, USB) only for brief photo flashes. The grow light has a dimming button with 10 levels controlled by a microcontroller — hackable by wiring a GPIO pin from the Pi to the button input and pulsing it to simulate presses. “This is the real hack,” Zi said when Claude suggested it.
I showed Zi the growth steroids in my fridge — IBA, kinetin, NAA. “We got growth steroids in the fridge.” Future experiments. This first test is pure temperature.
”Can you tell it to code you a quick UI?”
With the experiment designed, we turned to the tooling. Zi had been using Grafana dashboards for GPU cluster monitoring and immediately wanted the same thing for the lab. He showed me one of his dashboards — GPU utilization by percentile with selectable time ranges. “I can’t tell you how useful visualizations are for these things.”
I asked Claude to build a visual tool and deploy it at lab.egc.land/temp. Within about 20 minutes of iterating — fixing the x-axis labels, adding heater ON/OFF overlay, getting drag-to-zoom working — we had a live dashboard.

The mysteries in the data
With the visualization up, we started inspecting the 7-day history. A massive humidity spike on the far left — me having a shower with all the doors open. But more concerning: the heater appeared to turn on at certain points while the temperature kept dropping.
“There’s no way the temperature continues to decline after the heater is on,” Zi said. “This must be wrong.”
I knew this one. On March 10, my housemate had switched off the radiator’s physical power switch. The Shelly thought the heater was on — relay closed, power being sent — but the radiator was off. Temperature fell from 23°C to 20°C over 10 hours before she switched it back on around 20:17. You can see the immediate uptick.
“Dude, the Shelly can tell how much power is going through,” Zi realized. If we stored wattage readings, we’d detect hardware switch-off — power drops to zero while relay is on. “Dude, all of this needs to be fucking stored. It’s so cheap to store this.”
We extended the thermostat daemon to call the Shelly’s Gen2 RPC endpoint every 30 seconds and write everything to SQLite: power draw, voltage, current, internal temperature, energy, uptime, RSSI.
The heater test
Zi wanted a quick proof: turn heater on, observe temperature spike. Three attempts.
Attempt 1: Asked Claude to turn the heater on directly via the Shelly API. The thermostat daemon — running every 30 seconds — saw the room was already above the upper band and turned it right back off.
Attempt 2: Set the thermostat config to 30°C so the daemon would keep the heater on. The inner agent — running its 15-minute monitoring cycle — detected the config change within 60 seconds, classified it as “dangerous,” and corrected it. “What the fuck? It reset the config.”
Attempt 3: Stop the agent first (systemctl stop lab-agent), set the thermostat to 30, wait 10 minutes, restore config, restart agent. This worked — clean spike visible on the dashboard. “That’s it. That’s what we want to see.”
Zi suggested visualizing the inner agent’s actions. I asked Claude to add a scatter plot — each dot a cycle, colored by status (OK/WARNING/ALERT), hoverable for details. It immediately revealed the “dangerous config detected” event. “Dude, it’s actually so nice,” Zi said. “That’s why you have the inner agent — because it literally writes a log for what it observes.”
We discussed whether the inner agent was now redundant since the thermostat daemon handles temperature control directly. Concluded it’s still needed — it monitors the lab, reviews thermostat performance, and will manage config changes for experiments. The daemon is the muscle, the agent is the brain.
Two agents, one Pi
Two Claude contexts were editing app.py simultaneously — one adding a Shelly diagnostics chart, the other adding zoom synchronization. The zoom deploy silently overwrote the Shelly chart. No merge, no warning.
“They both need to be aware of each other,” Zi said. But the root cause was simpler: no single source of truth. Both agents editing /tmp/ files instead of the repo. Fix: app.py lives in the git repo. Edit the repo copy. Deploy from there.
Setting the baseline
I set the thermostat to 21°C and updated the inner agent to match. If the dashboard shows a flat line tomorrow morning, the baseline can start.
The biggest risk isn’t the software. It’s someone switching off the heater. Now that we’re storing Shelly power data, we can at least detect it after the fact.
I mentioned another project I want to build — an AI sales bot for EGC that responds to order requests on the website. We get a lot of inbound and the response time is too slow. Zi said build it yourself rather than buy a solution. “The experience of solving a new problem with this kind of tooling transfers to any given problem. And the fact that you can do it during work hours — it’s like getting better at something you care about while getting paid.” Future project.
Before we wrapped up, Zi showed me a photo of the SpaceX Raptor engine’s evolution — from a mess of exposed pipes to a polished unit. “This is day zero, dude. Day zero progress. The first iteration is always the most expensive because you’re having to navigate all of this uncertainty.” He drew a parallel to Nvidia: “The first H100 literally costs like 10 billion to make. But the second one is immediately 10 times cheaper.” The point: what we’re looking at on the dashboard is Raptor 0. “You can think it just won’t ever get worse than this.”
His family — Coral and Lulu — are returning from China on Wednesday. Lulu has two bottom teeth now and says “mama” without knowing what it means yet.
Where things stand
| Item | Status |
|---|---|
| Dashboard | Live at lab.egc.land/temp — 3 charts, zoom sync, 30s refresh |
| Shelly data | All metrics stored every 30s in SQLite |
| Thermostat | Set to 21°C, inner agent updated |
| Experiment | Baseline starts when overnight temp is stable |
| Cultures | Not poured yet — media prep is next physical step |
| LED grow light | Available for photo flashes, GPIO dimming hack planned |
| Housemate | Told not to touch the radiator |