Don't prompt the AI. Let us interview you first.
Don't struggle with prompts. We interview you, clarify your logic, and generate an executable plan for Codex/Cursor.
You will get
- • Clear positioning and user personas
- • Core flows and page structure
- • Data model and API draft
- • UX states and edge cases
Best for
Founders, PMs, designers, and indie builders who want to turn a fuzzy idea into a real product.
View historyDesigned for one-shot success with
Describe the idea
Start with a single sentence about your product.
Adaptive Q&A
AI follows up to surface the important details.
Generate the spec
Get a complete engineering document ready for development.
See the output before you start
Every idea becomes a full engineering spec covering goals, flows, data model, and key screens. Share it with developers or execute it yourself.
The sample document below is generated from this sentence.
- • Structured output ready for development
- • AI fills missing details automatically
- • Friendly for non-technical founders
Example document
LinguaFlow – AI-Powered Bilingual Deep Reading Platform
1. Product Overview
- One-line description: User enters an English webpage URL (or pastes text manually); the system extracts the main content and provides hover/click bilingual translation; supports silent vocabulary saving, in-reading highlight review, vocabulary deck card review, and export.
- Core scenario: Standalone web app, multi-device; English shown by default, Chinese shown on hover/click.
- MVP scope (aligned with full requirements)
- URL-based content extraction only; on failure, provide manual text paste entry
- Paragraph-level bilingual translation; Chinese shown on hover/click
- One-tap silent save (word / phrase / full sentence); AI picks a single contextual definition
- “My Library” auto-archives extracted articles
- In-reading highlight of saved vocabulary
- Vocabulary page: card view (flip to see definition), mastery-level tagging
- Export: Anki / PDF / Excel (fields include example sentence, part of speech, synonyms, article source link)
- Login: Email / GitHub / WeChat (sync across devices)
- Subscription / quota: platform translation service, user pays
- Bilingual UI (Chinese & English)
2. Tech Stack
| Layer | Technology | Version/Package | Purpose |
|---|---|---|---|
| Frontend | Next.js | next@14 (App Router) | Full-stack framework |
| UI | Tailwind CSS + Shadcn UI | lucide-react | Responsive UI and icons |
| Database | PostgreSQL | Supabase hosted | Data storage |
| ORM | Prisma | prisma | DB access |
| Auth | NextAuth.js | next-auth | Email / GitHub / WeChat |
| AI | OpenAI SDK (Claude swappable) | openai | Translation, definitions, content extraction |
| Scraping | Cheerio | cheerio | HTML content parsing |
| State | TanStack Query | @tanstack/react-query | Async data sync |
| Export | SheetJS / PDFKit | xlsx, pdfkit | Excel / PDF export |
3. Project Structure
src/
├── app/
│ ├── (auth)/ # Login / signup (multi-device sync)
│ ├── (dashboard)/
│ │ ├── library/ # My Library (article list)
│ │ ├── vocabulary/ # Vocabulary (card view)
│ │ └── reader/[id]/ # Interactive reader
│ ├── api/
│ │ ├── extract/ # URL/text extraction and translation
│ │ ├── translate/ # Paragraph translation (retry, per-paragraph)
│ │ ├── words/ # Vocabulary CRUD / export / highlight
│ │ ├── articles/ # Article list and detail
│ │ └── billing/ # Subscription / quota
│ └── layout.tsx # Global layout (language toggle)
├── components/
│ ├── reader/ # Reader components
│ ├── vocab/ # Vocabulary card components
│ ├── library/ # Library card components
│ └── ui/ # Shared UI
├── lib/
│ ├── ai.ts # AI prompts and client wrapper
│ ├── extractor.ts # Content extraction and cleaning
│ ├── scheduler.ts # Spaced repetition scheduling
│ ├── i18n.ts # Bilingual strings
│ └── billing.ts # Quota / subscription logic
├── prisma/
│ └── schema.prisma # Data model
└── types/
├── api.ts # API type definitions
└── domain.ts # Domain model types
4. Data Model
// prisma/schema.prisma
enum MasteryLevel {
FORGOTTEN
FUZZY
KNOWN
MASTERED
}
enum AuthProvider {
EMAIL
GITHUB
WECHAT
}
model User {
id String @id @default(cuid())
email String @unique
name String?
image String?
provider AuthProvider
credits Int @default(0) // remaining character quota
isSubscribed Boolean @default(false)
locale String @default("zh-CN") // UI language
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
articles Article[]
vocabularies Vocabulary[]
sessions Session[]
}
model Article {
id String @id @default(cuid())
userId String
title String
sourceUrl String?
rawText String @db.Text
content Json // Array<{en: string, zh: string, idx: number}>
wordCount Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id])
vocabularies Vocabulary[]
@@index([userId, createdAt])
}
model Vocabulary {
id String @id @default(cuid())
userId String
sourceArticleId String?
entryType String // "word" | "phrase" | "sentence"
entryText String // word / phrase / sentence
definition String // single contextual definition from AI
partOfSpeech String? // part of speech (AI)
synonyms String? // synonyms (AI, comma-separated)
contextEn String @db.Text
contextZh String @db.Text
masteryLevel MasteryLevel @default(FUZZY)
nextReviewAt DateTime @default(now())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id])
article Article? @relation(fields: [sourceArticleId], references: [id])
@@index([userId, nextReviewAt])
@@unique([userId, entryText, contextEn]) // dedupe same-word same-sentence
}
model Session {
id String @id @default(cuid())
userId String
token String @unique
expiresAt DateTime
user User @relation(fields: [userId], references: [id])
}
5. API Design
Unified response shape:
type ApiResponse<T> = { data: T; error?: { code: string; message: string } };
5.1 POST /api/extract
Purpose: Input URL or manual text; extract content and translate.
Auth: Required.
type ExtractRequest = {
url?: string; // mutually exclusive with manualText
manualText?: string; // fallback paste
};
type ExtractResponse = {
articleId: string;
title: string;
paragraphs: Array<{ idx: number; en: string; zh: string }>;
wordCount: number;
};
Logic
- Validate: at least one of
urlormanualText. - Fetch or use text → clean content → split into paragraphs.
- Compute
wordCount, deductcredits(or skip if subscribed). - Call AI to translate paragraphs → zh.
- Save Article, return
articleId.
Error codes
INVALID_INPUT: both url and manualText emptyFETCH_FAILED: URL unreachable or blockedINSUFFICIENT_CREDITS: not enough creditsAI_TIMEOUT: AI timeoutAI_ERROR: AI failure
5.2 POST /api/translate
Purpose: Single-paragraph translation (retry or deferred).
type TranslateRequest = { text: string };
type TranslateResponse = { zh: string };
Error codes: AI_TIMEOUT, AI_ERROR, INVALID_INPUT
5.3 POST /api/words/collect
Purpose: Silent save on click (word / phrase / sentence).
type CollectRequest = {
entryType: "word" | "phrase" | "sentence";
entryText: string;
contextEn: string;
contextZh: string;
articleId?: string;
};
type CollectResponse = {
vocabId: string;
masteryLevel: "FORGOTTEN" | "FUZZY" | "KNOWN" | "MASTERED";
};
Logic
- Dedupe (same sentence + same entry = no duplicate).
- AI generates single definition + part of speech + synonyms from context.
- Save Vocabulary and return.
Error codes: DUPLICATE_ENTRY, AI_ERROR, INVALID_INPUT
5.4 GET /api/words/highlight
Purpose: List of vocabulary to highlight (not yet mastered).
type HighlightResponse = { entries: string[] }; // entryText list
Error codes: UNAUTHORIZED
5.5 POST /api/words/mastery
Purpose: Set mastery level and update next review time.
type MasteryRequest = {
vocabId: string;
masteryLevel: "FORGOTTEN" | "FUZZY" | "KNOWN" | "MASTERED";
};
type MasteryResponse = { nextReviewAt: string };
Error codes: NOT_FOUND, INVALID_INPUT
5.6 GET /api/words/export
Purpose: Export vocabulary.
type ExportRequest = { format: "anki" | "pdf" | "excel" };
type ExportResponse = { downloadUrl: string };
Error codes: INVALID_INPUT, EXPORT_FAILED
5.7 GET /api/articles
Purpose: My Library list.
type ArticlesResponse = {
list: Array<{ id: string; title: string; sourceUrl?: string; createdAt: string }>;
};
5.8 GET /api/articles/:id
Purpose: Article detail.
type ArticleDetailResponse = {
id: string;
title: string;
paragraphs: Array<{ idx: number; en: string; zh: string }>;
};
5.9 POST /api/billing/subscribe
Purpose: Create subscription or purchase credits.
type BillingRequest = { planId: string };
type BillingResponse = { checkoutUrl: string };
6. Pages and Components
6.1 Login /login
Components and props
LoginForm- props:
onSubmit(provider: "EMAIL" | "GITHUB" | "WECHAT") - state:
loading: boolean,error: string | null
- props:
Interaction matrix
| User action | Component | API | On success | On failure |
|---|---|---|---|---|
| Click GitHub login | LoginForm | NextAuth | Redirect home | Toast error |
6.2 Library /library
Components
ArticleCard: props{ id, title, sourceUrl, createdAt }LibraryEmpty: empty stateLibrarySkeleton: loading skeleton
State
loading,error,articles[]
Interaction matrix
| User action | Component | API | On success | On failure |
|---|---|---|---|---|
| Enter page | LibraryPage | GET /api/articles | Render list | Empty + retry btn |
6.3 Reader /reader/[id]
Components and props
ReaderHeader- props:
{ title, progress, onExport }
- props:
ParagraphItem- props:
{ idx, en, zh, isActive, onHover } - state:
showZh
- props:
WordWrapper- props:
{ entryText, contextEn, contextZh, onCollect }
- props:
FloatingDict- props:
{ entryText, definition, partOfSpeech, synonyms }
- props:
Page state
activeParagraphIndex,isTranslating,highlightWords[],loading
Interaction matrix
| User action | Component | API | On success | On failure |
|---|---|---|---|---|
| Hover paragraph | ParagraphItem | Local | Show Chinese | - |
| Click word | WordWrapper | POST /api/words/collect | Word highlighted (silent) | Toast |
| Click export | ReaderHeader | GET /api/words/export | Download file | Toast |
| Enter page | ReaderPage | GET /api/articles/:id, GET /api/words/highlight | Render content | Empty / retry |
Loading and empty
loading: skeleton- Empty content: message “Could not extract content; try pasting manually”
6.4 Vocabulary /vocabulary
Components
Flashcard- props:
{ entryText, definition, contextEn, contextZh, partOfSpeech, synonyms } - state:
flipped
- props:
MasterySelector- props:
{ value, onChange }
- props:
VocabEmpty/VocabSkeleton
Interaction matrix
| User action | Component | API | On success | On failure |
|---|---|---|---|---|
| Flip card | Flashcard | Local | Show definition | - |
| Set mastery | MasterySelector | POST /api/words/mastery | Update label/time | Toast |
7. Core User Flows
7.1 Happy path: read and save
- User enters URL on home →
POST /api/extract - Server parses content, translates paragraphs, saves article → returns
articleId - Reader loads article and highlight list
- Click on word triggers silent save → word is highlighted immediately, no modal
- In vocabulary page: flip cards, set mastery level
7.2 Error paths and edge handling
- URL fetch fails: Prompt to use manual paste
- Insufficient credits: Open subscription / purchase modal
- AI timeout: Allow retry for single-paragraph translation
- Unauthorized: Redirect to login when accessing protected pages
- Duplicate save: Show “Already saved”, do not create new entry
7.3 Spaced repetition (pseudo-code)
// Stage days: 1, 2, 4, 7, 15
const stages = [1, 2, 4, 7, 15];
function nextReviewDate(currentLevel: MasteryLevel, now: Date): Date {
if (currentLevel === "FORGOTTEN") return addDays(now, stages[0]);
if (currentLevel === "FUZZY") return addDays(now, stages[1]);
if (currentLevel === "KNOWN") return addDays(now, stages[2]);
if (currentLevel === "MASTERED") return addDays(now, stages[4]);
return addDays(now, stages[0]);
}
8. Environment Variables and Config
| Variable | Purpose | How to obtain | Example |
|---|---|---|---|
DATABASE_URL | PostgreSQL connection | Supabase project → connection string | postgres://user:pass@host:5432/db |
OPENAI_API_KEY | AI translation & definitions | OpenAI console → create API key | sk-xxxx |
NEXTAUTH_SECRET | Auth encryption | Generate random string locally | random-secret |
GITHUB_ID | GitHub login | GitHub Developer Settings → OAuth App | ov23... |
GITHUB_SECRET | GitHub OAuth secret | Same OAuth App | xxxx |
WECHAT_APP_ID | WeChat login | WeChat Open Platform → create app | wx123... |
WECHAT_APP_SECRET | WeChat app secret | Same app details | xxxx |
STRIPE_SECRET_KEY | Subscription / payment | Stripe dashboard → create key | sk_test_... |
Why teams choose IdeaForge
Focus on the details that actually ship a product, with less back-and-forth.
Less back-and-forth
Turn complex requirements into easy-to-answer prompts.
Structured deliverables
Output maps directly to PRD, ERD, and engineering specs.
Automatic gap-filling
AI highlights missing details before you hand off to dev.
AI PRD generator that turns ideas into plans
IdeaForge is an AI documentation tool for founders, PMs, and builders. It covers PRD, user flows, data modeling, and key screens.
Use adaptive Q&A to clarify requirements and generate a build-ready spec in minutes.
Great for
- • MVP requirement planning
- • Structuring fuzzy ideas fast
- • Team alignment and reviews
Pricing
Choose the plan that fits your workflow.
Single
One idea, one complete spec.
- • Complete PRD with tech architecture
- • AI dual-review for quality
- • Delivered in minutes
Pro
subscriptionFor active builders and small teams.
≈ $2.90 per doc
- • 10 docs per month
- • Everything in Single
- • Email support
- • Cancel anytime
Team
subscriptionFor teams shipping fast.
≈ $1.58 per doc
- • 50 docs per month
- • Everything in Pro
- • Priority support
- • Cancel anytime
FAQ
What does the generated document include?
Each document covers product positioning, user personas, core flows, page structure, data model, API draft, and edge case analysis. Everything is AI dual-reviewed and ready for development.
What happens if I cancel my subscription?
After cancellation, your benefits remain active until the end of the current billing period. You won't be charged again, and all generated documents stay accessible.
What if I run out of monthly quota?
You can purchase additional documents at $9.90 each, or upgrade to a higher plan for more quota.
What's the difference between Pro and Team?
The main difference is monthly quota: Pro includes 10 docs/month, Team includes 50 docs/month. Team also comes with priority support. Both can be canceled anytime.
Do you offer refunds?
Single documents are digital goods delivered instantly and are non-refundable. Subscriptions are not prorated upon cancellation, but benefits remain until the period ends. Contact [email protected] for technical issues.