From 327d62e38361e526b5787e27716977ad026feaec Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Tue, 6 Oct 2026 15:51:27 +0000 Subject: [PATCH] Make the Idea Generator findable: an Ideas tab, a landing section, llms.txt /ideas was only a link inside Products and appeared nowhere public. - bottom nav: Ideas tab after Products (lightbulb icon) - landing page: "Not sure what to build?" section with the three sources (asks, proof of payment, Show HN rivals) and a link to /ideas, #ideas anchor - llms.txt: Idea Generator endpoints Co-Authored-By: Claude Opus 5.5 --- apps/api/src/autogtm-docs.ts | 20 +++++++++ apps/web/app/(marketing)/page.tsx | 65 +++++++++++++++++++++++++++++- apps/web/components/bottom-nav.tsx | 14 ++++++- 3 files changed, 95 insertions(+), 4 deletions(-) diff --git a/apps/api/src/autogtm-docs.ts b/apps/api/src/autogtm-docs.ts index 399a001..6c81cbe 100644 --- a/apps/api/src/autogtm-docs.ts +++ b/apps/api/src/autogtm-docs.ts @@ -917,6 +917,26 @@ export function llmsText(baseUrl: string): string { if (op.description) lines.push(` ${op.description}`); } + lines.push(''); + lines.push('## Idea Generator'); + lines.push(''); + lines.push( + '> What to build, before who to sell it to. Scans Reddit asks, Ask HN and founder case studies, scores each idea on demand, proof of payment and Show HN competition, and hands the best to chovy.com to build. Same key.', + ); + lines.push(''); + lines.push( + '- `GET /ideas` — ideas, most worth building first, each with `worth`, `verdict` (`build`, `validate`, `watch`, `crowded`), `paid`, `revenue`, `rivals`.', + ); + lines.push('- `GET /ideas/{id}` — one idea and every post that asked for it, with links.'); + lines.push( + '- `POST /ideas/scan` `{ "subs"?, "feeds"? }` — scan now instead of waiting for the six-hourly run.', + ); + lines.push( + '- `GET|PUT /ideas/settings` — subreddits and RSS Amplifier feeds (`{ slug, role: asks | signals | built }`).', + ); + lines.push( + '- `POST /ideas/{id}/build` — returns a chovy.com link that opens its build intake with the idea filled in.', + ); lines.push(''); lines.push('## Rules the engine will not bend'); lines.push(''); diff --git a/apps/web/app/(marketing)/page.tsx b/apps/web/app/(marketing)/page.tsx index c533a64..68e46cd 100644 --- a/apps/web/app/(marketing)/page.tsx +++ b/apps/web/app/(marketing)/page.tsx @@ -35,6 +35,7 @@ export default async function LandingPage() { + @@ -43,9 +44,17 @@ export default async function LandingPage() { } /** Content sits on one measure; bands paint full width around it. */ -function Band({ children, className = '' }: { children: React.ReactNode; className?: string }) { +function Band({ + children, + className = '', + id, +}: { + children: React.ReactNode; + className?: string; + id?: string; +}) { return ( -
+
{children}
); @@ -264,6 +273,58 @@ function CapabilitiesSection() { ); } +/** + * The Idea Generator: what to build before who to sell it to. + * + * Same rule as the capabilities above: every line is something a scan does + * today. The sources named are the defaults it reads. + */ +function IdeasSection() { + const steps = [ + [ + 'People asking for a tool', + 'r/SomebodyMakeThis, r/AppIdeas, r/webapps, Ask HN and r/bootstrapping. "Is there an app that does X" is demand, in the asker’s own words.', + ], + [ + 'Proof that people pay', + 'Founder case studies from Starter Story, Indieniche, Micro SaaS Idea and Startup Acquisition Stories. "$25K/month Stagetimer app" says a stage timer is a business.', + ], + [ + 'Who already shipped it', + 'Recent Show HN launches that match an idea count against it. One is a market, four is crowded.', + ], + ]; + + return ( + +

+ Not sure what to build? It finds ideas people pay for. +

+

+ The Idea Generator reads where people ask for tools and where founders show what sells, then + scores each idea on demand, proof of payment and competition. Build it hands the winner to + chovy.com with the requirements filled in. +

+ +
    + {steps.map(([title, detail]) => ( +
  • +
    {title}
    +

    {detail}

    +
  • + ))} +
+ + + Open the Idea Generator + +
+ ); +} + function RefusalSection() { return ( diff --git a/apps/web/components/bottom-nav.tsx b/apps/web/components/bottom-nav.tsx index c4541c3..c430c28 100644 --- a/apps/web/components/bottom-nav.tsx +++ b/apps/web/components/bottom-nav.tsx @@ -15,12 +15,14 @@ import { useEffect, useState } from 'react'; * page opened most, behind "More". * * Everything that lost its tab is still a route, and Settings lists it. - * Import got its tab back: behind More, nobody could find it. + * Import got its tab back: behind More, nobody could find it. Ideas got one + * for the same reason: as a link inside Products it was invisible. */ const TABS = [ { href: '/inbox', label: 'Inbox', icon: InboxIcon, badge: true }, { href: '/approvals', label: 'Approve', icon: CheckIcon }, { href: '/products', label: 'Products', icon: BoxIcon }, + { href: '/ideas', label: 'Ideas', icon: BulbIcon }, { href: '/funnel', label: 'Results', icon: FunnelIcon }, { href: '/import', label: 'Import', icon: UploadIcon }, { href: '/settings', label: 'Settings', icon: GearIcon }, @@ -31,7 +33,6 @@ const OWNED_BY: Record = { '/setup': '/products', '/outreach': '/products', '/jobs': '/products', - '/ideas': '/products', '/today': '/settings', '/mailboxes': '/settings', '/more': '/settings', @@ -186,6 +187,15 @@ function BoxIcon() { ); } +function BulbIcon() { + return ( + + + + + ); +} + function UploadIcon() { return (