From idea to engineering-ready plan in 30 seconds.
Answer 3 plain-English questions. Get a complete PRD, user stories, sprint plan, and prioritised engineering tasks β powered by GPT-4o.
- Project Overview
- System Architecture
- Tech Stack
- Frontend Implementation
- Backend Logic Layer
- Database Schema
- Admin Dashboard
- Running Locally
- Environment Variables
- Git Commit Progression
LaunchReady is a full-stack AI-powered Product Requirements Document (PRD) generator built for non-technical founders. Instead of writing lengthy specs, founders answer three questions:
- What problem does your feature solve?
- Who is this feature for?
- What does success look like?
LaunchReady passes these to GPT-4o via OpenRouter, then processes the raw AI output through a deterministic logic pipeline to produce:
- A structured PRD with title and summary
- Goals and success metrics
- User stories (US-1, US-2 β¦) in standard agile format with acceptance criteria
- Engineering tasks per story with effort badges (S / M / L / XL), priority labels (P1 / P2 / P3), and sprint groupings (Sprint 1 / Sprint 2 / Sprint 3)
- Per-task status tracking (todo β in-progress β done)
- A shareable read-only link for each PRD
- A version changelog when a PRD is regenerated
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Browser Client β
β React + Vite (artifacts/launchready) β
β β
β ββββββββββββ βββββββββββββ βββββββββββββββββββββ β
β β Home β β PRD View β β Admin Dashboard β β
β β / β β /prd/:id β β /admin β β
β ββββββββββββ βββββββββββββ βββββββββββββββββββββ β
β β β β β
β ββββββββββββββββΌβββββββββββββββββ β
β β @workspace/api-client-reactβ
ββββββββββββββββββββββββββΌββββββββββββββββββββββββββββ-β
β HTTP (REST JSON)
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Express API Server β
β (artifacts/api-server) β
β β
β POST /api/prds/generate β
β GET /api/prds/:id β
β POST /api/prds/:id/regenerate β
β PATCH /api/prds/:id/tasks/:taskId/status β
β GET /api/prds/share/:token β
β GET /api/prds/:id/versions β
β GET /api/admin/stats β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Logic Layer β β
β β openrouter.ts β GPT-4o prompt & parse β β
β β prdProcessor.ts β orchestrates pipeline β β
β β effortEstimator.ts β keyword β S/M/L/XL β β
β β priorityEngine.ts β P1/P2/P3 scoring β β
β β dependencyDetector.ts β task deps graph β β
β β sprintAllocator.ts β sprint 1/2/3 grouping β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β @workspace/db (Drizzle ORM) β
ββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PostgreSQL Database β
β β
β prds task_status prd_versions β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β²
β OPENROUTER_API_KEY
βΌ
βββββββββββββββ
β OpenRouter β
β (GPT-4o) β
βββββββββββββββ
Monorepo packages (pnpm workspaces):
| Package | Role |
|---|---|
artifacts/launchready |
React + Vite frontend |
artifacts/api-server |
Express REST API |
lib/db |
Drizzle ORM schema + client |
lib/api-spec |
OpenAPI spec (YAML) |
lib/api-zod |
Generated Zod validators from spec |
lib/api-client-react |
Generated React Query hooks from spec |
| Layer | Library / Tool |
|---|---|
| Framework | React 19 + Vite 6 |
| Routing | Wouter |
| Data fetching | TanStack React Query v5 |
| Forms | React Hook Form + Zod |
| UI components | shadcn/ui (Radix primitives) |
| Styling | Tailwind CSS v4 |
| Charts | Recharts |
| Icons | Lucide React |
| Typography | Inter Variable (self-hosted) |
| Layer | Library / Tool |
|---|---|
| Runtime | Node.js (ESM) |
| Framework | Express 5 |
| ORM | Drizzle ORM |
| Validation | Zod (generated from OpenAPI) |
| Logging | Pino + pino-http |
| AI | OpenRouter β GPT-4o |
| ID generation | uuid v4 |
| Layer | Tool |
|---|---|
| Database | PostgreSQL (Replit managed) |
| Package manager | pnpm workspaces |
| API contract | OpenAPI 3.1 β codegen (Zod + React Query) |
| Type checking | TypeScript (project references) |
- Background base:
#08090a - Accent (indigo):
#5e6ad2 - Accent bright:
#7170ff - Max font weight: 590 (Inter Variable)
- Inspired by Linear's dark UI
artifacts/launchready/src/
βββ pages/
β βββ home.tsx # 3-question form β triggers generation
β βββ prd-view.tsx # Full PRD output, task status updates, share/export/regen
β βββ admin-dashboard.tsx # Stats cards, charts, PRD table
β βββ shared-prd.tsx # Read-only public view via share token
β βββ not-found.tsx # 404 page
βββ components/
β βββ layout.tsx # Navbar + page shell
β βββ prd-content-display.tsx # Goals, user stories, sprint cards, tasks
β βββ ui/ # shadcn/ui primitives (button, badge, card β¦)
βββ main.tsx # Router, QueryClient provider
Generation flow (home.tsx)
- User fills out 3 text areas + optional product name
- Form submits via
useGeneratePrdmutation hook - Button swaps to spinner + "Generatingβ¦" while disabled; fields are disabled
- Cycling status messages animate below the button (e.g. "Reading your idea...", "Designing user stories...")
- On success β
navigate(/prd/:id)
PRD view (prd-view.tsx + prd-content-display.tsx)
- Tabs: Plan (default) and Changelog
- Plan tab renders: Summary β Goals/Metrics β User Stories (collapsible) β Sprint Plan
- Task status cycles
todo β in-progress β doneon click with optimistic local state and a PATCH call to persist - Share Link copies the
/share/:tokenURL to clipboard - Export
.mddownloads a Markdown file - Regenerate re-calls the AI and snapshots the previous version
Sprint cards
- Grouped by sprint number; each card header shows task count + total effort points
- Effort badge colours: S (green) / M (blue) / L (amber) / XL (red)
- Priority badge colours: P1 (red) / P2 (amber) / P3 (green)
The Express API receives raw user input, calls GPT-4o, and then runs the AI output through a deterministic five-stage pipeline before saving anything to the database.
callOpenRouter() Sends a structured prompt to GPT-4o via OpenRouter.
β Returns a typed RawPrdContent object.
βΌ
prdProcessor.processPrd()
β
ββ effortEstimator.ts
β Keyword-match each task title/description against four buckets:
β S β copy, label, color, icon, tooltip, rename β¦
β M β form, button, page, component, modal, filter β¦
β L β api, database, auth, algorithm, endpoint, hook β¦
β XL β payment, real-time, websocket, oauth, encryption β¦
β Maps bucket β numeric score (S=1, M=2, L=3, XL=4).
β
ββ priorityEngine.ts
β Scores each user story P1/P2/P3:
β P1 if title contains login/auth/onboard keywords, or any XL task.
β P3 if all tasks are S effort.
β P2 otherwise.
β
ββ dependencyDetector.ts
β Scans task titles for cross-references and marks isBlocked / blockedBy.
β
ββ sprintAllocator.ts
Assigns sprint 1/2/3 per task:
P1 unblocked tasks β Sprint 1
P1 blocked + P2 unblocked β Sprint 2
Everything else β Sprint 3
| Method | Path | Description |
|---|---|---|
POST |
/api/prds/generate |
Generate new PRD from 3 answers |
GET |
/api/prds/:id |
Fetch PRD with live task statuses merged in |
POST |
/api/prds/:id/regenerate |
Re-run AI, snapshot previous version |
PATCH |
/api/prds/:id/tasks/:taskId/status |
Update a single task status |
GET |
/api/prds/share/:token |
Public read-only PRD by share token |
GET |
/api/prds/:id/versions |
List all version snapshots |
GET |
/api/admin/stats |
Aggregate stats + per-PRD rows for dashboard |
Three tables, all managed by Drizzle ORM with PostgreSQL.
| Column | Type | Notes |
|---|---|---|
id |
text PK |
UUID v4 |
title |
text NOT NULL |
AI-generated title |
problem |
text |
User's problem statement |
audience |
text |
User's target audience |
success_criteria |
text |
User's success definition |
product_name |
text |
Optional product name |
raw_output |
text NOT NULL |
Full JSON blob of processed PRD content |
share_token |
text UNIQUE NOT NULL |
UUID v4 for public share link |
created_at |
timestamptz |
Auto-set on insert |
Stores per-task status overrides so the raw PRD JSON stays immutable.
| Column | Type | Notes |
|---|---|---|
id |
text PK |
UUID v4 |
prd_id |
text FK β prds.id |
|
task_id |
text |
Matches task id inside raw_output |
status |
text |
todo / in-progress / done |
updated_at |
timestamptz |
Auto-updated on change |
Immutable snapshot log for the changelog tab.
| Column | Type | Notes |
|---|---|---|
id |
integer PK |
Auto-increment identity |
prd_id |
text FK β prds.id |
|
version_number |
integer |
Increments per regeneration |
snapshot |
text |
Full JSON of PRD content at that point in time |
created_at |
timestamptz |
Auto-set on insert |
Accessible at /admin. Provides a live operational view over all generated PRDs.
| Card | Value |
|---|---|
| Total PRDs | Count of all rows in prds |
| Total Tasks | Sum of all tasks across all PRDs |
| Avg Effort Score | Mean effortScore (1β4) across all tasks |
| PRDs This Week | Count of PRDs created in the last 7 days |
- PRDs per day (last 7 days) β bar chart showing daily generation volume
- Priority Breakdown β pie chart of P1 / P2 / P3 task distribution across all PRDs
- Effort Distribution β horizontal bar chart of S / M / L / XL task counts
Lists every PRD with title, creation date, task count, effort breakdown, priority mix badges, and quick-access icons (share link, view PRD).
Empty state: if no PRDs have been generated yet, the dashboard shows a prompt with a direct link to the generation form.
- Node.js 20+
- pnpm 9+
- PostgreSQL database (or use the Replit-managed one)
# 1. Clone the repo
git clone <your-repo-url>
cd launchready
# 2. Install all dependencies
pnpm install
# 3. Set up environment variables (see next section)
cp .env.example .env
# Fill in DATABASE_URL and OPENROUTER_API_KEY
# 4. Push the database schema
pnpm --filter @workspace/db run db:push
# 5. Start the API server
pnpm --filter @workspace/api-server run dev
# 6. In a second terminal, start the frontend
pnpm --filter @workspace/launchready run devThe frontend will be at http://localhost:5173 and the API at http://localhost:3001.
pnpm run typecheckpnpm run codegen| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | PostgreSQL connection string, e.g. postgresql://user:pass@localhost:5432/launchready |
OPENROUTER_API_KEY |
Yes | API key from openrouter.ai β used to call GPT-4o |
PORT |
No | Port the API server listens on (default: 3001) |
Note: Never commit these values to version control. Use a
.envfile locally and your hosting platform's secrets manager in production.
| Commit | Description |
|---|---|
8337c4b |
Initial commit β blank pnpm monorepo scaffold |
7323546 |
Transitioned from planning to build mode |
881b41a β d655636 β 22b1800 |
Full-stack build β React+Vite frontend, Express API, PostgreSQL+Drizzle schema, OpenRouter integration, Zod codegen, all 4 pages (Home, PRD View, Admin, Shared), AI prompt + logic pipeline, shareable links |
4e4bc73 |
Minor fixes and stabilisation post-build |
a7ddf40 |
Hero section β headline, subheadline, feature pills, and radial indigo glow behind the heading on the home page |
799b235 |
User Stories section β collapsible US cards added between Goals/Metrics and Sprint Plan on the PRD view |
43a40a5 |
Task status toggle β click-to-cycle todo β in-progress β done with optimistic local state, hollow/filled/checkmark icons |
47ad825 |
Visual + UX polish β navbar logo purple glow, sprint effort point totals in sprint headers, admin empty state, generate button inline loading state (spinner + cycling status messages, fields disabled) |