Skip to content
Development

Seed tray: the ideas that vanished for a week

By Victor Da Luz
rusttaurisveltedev-loggreenhouse

Greenhouse is my creative-project manager, built around a deliberate seven-day incubation period for fresh ideas. Capture something, let it sit, come back to it once it’s had time to prove itself. That’s the whole point of the maturity timer.

Except until this week, “let it sit” meant “disappear entirely.” Capture an idea and it vanished from the app - no zone, no list, no command even returned it - until the seventh day, when it reappeared in the “Ripe today” zone asking for a Vault-or-Work decision. For a full week, the app behaved as if the idea didn’t exist.

This came out of the same full-app review that surfaced the invisible release shelf, and it was the single largest gap between what the PRD describes and what the app actually does. The engine already supported everything needed - you could vault a fresh idea from day one if you knew the item id - the UI just never gave you a way to see it or do it.

The fix, and the constraint that shaped it

The build itself was small once I saw the shape of it. The dashboard’s daily-state query already fetches every fresh idea and filters to the mature ones for “Ripe today.” Filtering the other direction - immature ideas - needed zero new database queries, just the inverse of a boolean check that already existed.

The interesting constraint was what NOT to build. It would have been easy to add a “start working on it early” button - after all, the engine has no maturity gate on promotion, nothing stops you from doing it via a raw command. But that defeats the entire premise. The incubation period isn’t a technical lock, it’s a discipline the app is supposed to help you keep. So the Seed tray zone shows the idea, shows a countdown (“Ripens in 4d”), lets you vault it if you’ve changed your mind, lets you browse its files - and offers nothing else. No shortcut. The absence of a button is the enforcement mechanism, not a disabled one.

For the countdown itself, I mirrored a pattern the app already had twice over - “Dormant Nd” for vaulted items, “Released Nd ago” for shipped ones - both computed on the frontend from a raw timestamp the backend hands over. Same idea here, just pointed the other direction: instead of “how long ago did this happen,” it’s “how long until this happens.” One new field on the wire (matures_at, the timestamp an idea ripens), one existing formatting function, same math, opposite sign.

A correction I made to my own plan

The original issue description claimed the countdown-formatting helper was dead code sitting around waiting for this exact feature. It wasn’t - two earlier features had already put it to work. Small thing, but worth checking before building on an assumption the issue itself made: read the code, don’t trust the ticket’s memory of the code.

Verifying it for real

Unit tests confirm the filtering logic and the timestamp math. But the thing I actually wanted to see was the countdown rendering in a real running window, not a mocked test. So I built the app with its WebDriver automation feature on, launched it against a throwaway vault, and drove the actual Capture flow: typed a name, submitted, watched the Seed tray zone pick it up immediately with “Ripens in 7d,” confirmed there was no Work-on-it button anywhere on the page, then clicked Vault and watched it disappear. Real click, real IPC call, real database row.

Result

Every idea you capture is visible from the moment it exists, all the way through incubation, without ever being one click away from skipping the wait. For a tool whose entire pitch is “trust the process instead of your impatience,” that gap being closed feels like the app finally living up to its own premise.

Related reading