Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions apps/api/src/autogtm-docs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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('');
Expand Down
65 changes: 63 additions & 2 deletions apps/web/app/(marketing)/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export default async function LandingPage() {
<Hero />
<EvidenceSection />
<CapabilitiesSection />
<IdeasSection />
<RefusalSection />
<ClosingCta />
<SiteFooter />
Expand All @@ -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 (
<section className={className}>
<section id={id} className={className}>
<div className="mx-auto w-full max-w-5xl px-5 sm:px-8">{children}</div>
</section>
);
Expand Down Expand Up @@ -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 (
<Band id="ideas" className="bg-surface-raised border-border border-t py-16 sm:py-20">
<h2 className="text-[28px] leading-tight font-semibold tracking-[-0.025em] text-balance sm:text-[34px]">
Not sure what to build? It finds ideas people pay for.
</h2>
<p className="text-ink-muted mt-4 max-w-[42em] text-[17px] leading-relaxed">
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.
</p>

<ul className="mt-8 grid gap-4 sm:grid-cols-3">
{steps.map(([title, detail]) => (
<li key={title} className="border-border bg-surface rounded-2xl border p-5">
<div className="text-[15px] font-semibold">{title}</div>
<p className="text-ink-muted mt-1.5 text-[13.5px] leading-relaxed">{detail}</p>
</li>
))}
</ul>

<Link
href="/ideas"
className="bg-accent mt-7 inline-flex items-center justify-center rounded-xl px-5 py-3 text-sm font-medium text-white"
>
Open the Idea Generator
</Link>
</Band>
);
}

function RefusalSection() {
return (
<Band className="border-border border-t py-16 sm:py-20">
Expand Down
14 changes: 12 additions & 2 deletions apps/web/components/bottom-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 },
Expand All @@ -31,7 +33,6 @@ const OWNED_BY: Record<string, string> = {
'/setup': '/products',
'/outreach': '/products',
'/jobs': '/products',
'/ideas': '/products',
'/today': '/settings',
'/mailboxes': '/settings',
'/more': '/settings',
Expand Down Expand Up @@ -186,6 +187,15 @@ function BoxIcon() {
);
}

function BulbIcon() {
return (
<svg {...ICON_PROPS}>
<path d="M9 18h6M10 22h4" />
<path d="M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V17h6v-.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2z" />
</svg>
);
}

function UploadIcon() {
return (
<svg {...ICON_PROPS}>
Expand Down
Loading