An open API service indexing awesome lists of open source software.

https://github.com/edycutjong/launchcopilot

๐Ÿš€ Paste your app's store link โ†’ a graded ASO report (28 deterministic rules) + a validated AI launch kit, in ~1 min. Built for HackOnVibe.
https://github.com/edycutjong/launchcopilot

app-store-optimization aso claude hackathon indie-dev launch launch-marketing nextjs typescript

Last synced: 8 days ago
JSON representation

๐Ÿš€ Paste your app's store link โ†’ a graded ASO report (28 deterministic rules) + a validated AI launch kit, in ~1 min. Built for HackOnVibe.

Awesome Lists containing this project

README

          

LaunchCopilot Icon

LaunchCopilot ๐Ÿš€

Paste your appโ€™s store listing โ†’ a graded, validated launch kit โ€” in about a minute.

LaunchCopilot โ€” paste your store listing, get a graded, validated launch kit (ASO 27 โ†’ 93)


[![Live Demo](https://img.shields.io/badge/๐Ÿš€_Live-Demo-06b6d4?style=for-the-badge)](https://launchcopilot.edycu.dev)
[![Pitch Deck](https://img.shields.io/badge/๐Ÿ“Š_Pitch-Deck-f59e0b?style=for-the-badge)](https://launchcopilot.edycu.dev/pitch)
[![Demo Video](https://img.shields.io/badge/๐ŸŽฌ_Demo-Video-ef4444?style=for-the-badge)](https://youtu.be/2if0sEFKe8c)
[![Built for HackOnVibe](https://img.shields.io/badge/HackOnVibe-Promote_a_New_App-8b5cf6?style=for-the-badge)](https://hackonvibe.com)


![Next.js](https://img.shields.io/badge/Next.js_16-black?style=flat&logo=next.js)
![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=flat&logo=typescript&logoColor=white)
![Claude](https://img.shields.io/badge/AI-Claude_Opus_4.8-8b5cf6?style=flat&logo=anthropic&logoColor=white)
![ASO Engine](https://img.shields.io/badge/ASO_Engine-28_rules-ff2d95?style=flat)
![Tests](https://img.shields.io/badge/tests-150_passing-00d4ff?style=flat)
[![License](https://img.shields.io/badge/License-MIT-yellow)](https://opensource.org/licenses/MIT)
[![CI](https://github.com/edycutjong/launchcopilot/actions/workflows/ci.yml/badge.svg)](https://github.com/edycutjong/launchcopilot/actions/workflows/ci.yml)

---

## ๐Ÿ HackOnVibe Submission โ€” Demo Video & Questionnaire

**๐ŸŽฌ Demo video โ€” customer journey (~2 min):** **https://youtu.be/2if0sEFKe8c**
*What the user clicks โ†’ what they get: paste a store link โ†’ auto-fill โ†’ a deterministic 27/100 grade โ†’ generate a launch kit that re-grades itself to โ‰ฅ 90.*

**Questionnaire**

1. **What does the service do?** โ€” LaunchCopilot grades a mobile app's store listing against **28 deterministic App Store Optimization rules** (0โ€“100, per-field findings + exact fixes, no AI), then generates a **validated launch kit** โ€” A/B store rewrites, a Product Hunt draft, a 7-day social calendar, community posts, and press โ€” where every rewrite is **re-graded by the same engine and regenerated until it scores โ‰ฅ 90.**
2. **Target audience** โ€” Solo & indie mobile-app developers and small studios launching a new app, who can't afford a $2โ€“5k ASO/marketing agency.
3. **Expected buyer countries** โ€” Global, English-first (v1). Primary markets: **United States, United Kingdom, Canada, Australia**, plus large indie-dev hubs (**India, Germany/EU, Southeast Asia**).
4. **Competitors** โ€” ASO analytics suites (AppTweak, Sensor Tower, AppFollow, MobileAction) that *report* but don't rewrite; app-launch agencies (costly, slow); and generic AI copywriters (ChatGPT/Jasper) with no store rules and no validation.
5. **Our advantage** โ€” One **deterministic 28-rule engine grades both the human and the AI**: the AI's rewrite must clear the same โ‰ฅ 90 bar or it regenerates, so the output is provably store-legal, not "AI slop." It's **end-to-end** (grade โ†’ full launch kit, not just analytics), **free with no API key to grade**, and **100% reproducible** in the browser.

---

## ๐Ÿ“ธ See it in Action

![LaunchCopilot walkthrough โ€” paste a store link, auto-fill, a deterministic 27/100 grade, then a launch kit whose rewrites self-validate to 91](docs/demo.gif)

~15s, no audio โ€” paste a store link โ†’ auto-fill โ†’ the deterministic 27/100 grade โ†’ a generated launch kit that re-grades itself to โ‰ฅ 90.

| 1 ยท Paste a link โ†’ auto-fill | 2 ยท Grade (28 rules) | 3 ยท Landing โ†’ live tool |
|---|---|---|
| ![Auto-fill from a store link](docs/shot-autofill.png) | ![ASO scorecard with per-field scores](docs/shot-grade.png) | ![Landing page](docs/shot-landing.png) |
| Paste an App Store / Google Play URL โ†’ the real icon, rating, screenshots, and every field fill in. | Deterministic score with per-field bars + exact fixes (light/dark). | A pitch that flows straight into the working grader. |

> โ–ถ **Try it yourself, no signup, no key:** [launchcopilot.edycu.dev](https://launchcopilot.edycu.dev) โ€” paste **your** app's link and watch it grade.

## โœ… Deterministic, not vibes

**The grader is deterministic โ€” no AI. 28 encoded App Store / Google Play rules, 150 passing tests, sub-millisecond p95.**

Reproduce with `npm run aso-lint` (or `npm test`) โ€” it scores any listing **0โ€“100** with per-field findings and exact fixes, and the *same* engine re-grades the AI's rewrite and forces **โ‰ฅ90 or regenerates**, so the machine is judged by the same deterministic grader as the human.

**Don't trust us โ€” verify it in your browser:** paste **your own** app's App Store / Google Play link on the [live site](https://launchcopilot.edycu.dev) (no signup, no key) and watch it grade, then generate a validated launch kit.

*Honest status: the ASO lint + repair loop is fully deterministic and load-bearing; the generative kit uses Claude (`claude-opus-4-8`) with a Haiku critic pass and runs in `DEMO_MODE=1` with no API key, so judges can reproduce everything locally.*

## ๐Ÿ’ก The Problem & Solution

Solo developers ship good apps and get **six downloads โ€” four of them friends.** Not because the app is bad, but because its store listing quietly breaks App Store Optimization rules they've never heard of, and launch marketing (ASO, Product Hunt mechanics, per-community etiquette) is a specialist skill they can't buy at $2โ€“5k an agency.

**LaunchCopilot performs the launch, not advice about it.** Paste your listing โ†’ it grades your ASO against 28 deterministic rules, then generates a validated launch kit that's **provably store-legal โ€” because the same engine that grades you also grades the AI.**

**Key Features**
- ๐Ÿ”— **Paste-a-link auto-fill** โ€” drop an App Store / Google Play URL and the whole listing (title, subtitle, description, screenshots, rating) is pulled in for you. *(No AI โ€” official iTunes API + Play scrape.)*
- ๐Ÿ“Š **28-rule ASO engine** โ€” deterministic, sub-millisecond, scores 0โ€“100 with per-field findings and exact fixes. Pure encoded store rules, no model.
- โ™ป๏ธ **Validator-in-the-loop** โ€” the AI's rewritten listing is re-linted and **auto-repaired until it scores โ‰ฅ 90**; the model is held to the same bar as the human.
- ๐ŸŽญ **Persona-panel QA** โ€” a focus group synthesized from your own listing critiques every artifact in-character; weak ones regenerate before you see them.
- ๐Ÿ†“ **Free API + CLI, no key to grade** โ€” `POST /api/analyze` ยท `npm run aso-lint` ยท runs fully in `DEMO_MODE`.

## ๐Ÿ—๏ธ Architecture & Tech Stack

**Next.js 16 + React 19 + Tailwind v4** (one codebase, app + API) ยท **Claude** (`claude-opus-4-8` writers + `claude-haiku-4-5` persona panel) ยท **Zod** schema-constrained generation ยท **Vitest / Playwright / semantic-release** for the harness.

```mermaid
flowchart LR
A["๐Ÿ”— Paste store link"] --> B["Extract listing
iTunes API ยท Play scrape"]
B --> C["28-rule ASO lint
deterministic ยท sub-ms ยท no AI"]
C --> D["Score 0โ€“100
+ per-field fixes"]
D --> E["Claude Opus
5 parallel writers"]
E --> F{"Re-lint the rewrite
score โ‰ฅ 90?"}
F -- "no ยท inject findings" --> E
F -- "yes" --> G["Claude Haiku
persona-panel QA"]
G --> H["๐Ÿš€ Launch kit
store ยท PH ยท social ยท community ยท press"]
```

**Where the interesting code lives** (for judges skimming the source):

| Capability | File |
|---|---|
| 28-rule ASO engine (the deterministic judge) | [`src/lib/aso-lint/rules.ts`](src/lib/aso-lint/rules.ts) |
| Paste-a-link extraction + `/api/extract` | [`src/lib/extract/index.ts`](src/lib/extract/index.ts) ยท [`src/app/api/extract/route.ts`](src/app/api/extract/route.ts) |
| Validator-in-the-loop kit pipeline | [`src/lib/pipeline/`](src/lib/pipeline/) |
| Free grading API (no key) | [`src/app/api/analyze/route.ts`](src/app/api/analyze/route.ts) |
| Self-contained pitch deck (served at `/pitch`) | [`public/pitch/index.html`](public/pitch/index.html) |

## ๐ŸŽฏ HackOnVibe theme fit

The theme is **effective promotion of a newly launched mobile app** โ€” LaunchCopilot is that, end to end: it grades the listing (promotion surface #1), rewrites it to pass, and produces the Product Hunt / social / community / press assets that *are* the launch. And it **recurs** โ€” every app update is a re-launch, so Re-grade + Content-Refill regenerate next week's kit in a click.

## ๐Ÿš€ Run it Locally (For Judges)

```bash
npm install
npm test # 150 unit tests
npm run aso-lint -- data/fixtures/pocketplants.json # CLI: 27/100 (F) + fixes
npm run dev # app at http://localhost:3000
```

> **Note for judges โ€” you can skip the API key.** Grading, the CLI, and the E2E suite all run with **no credentials** (`DEMO_MODE`). A key (`ANTHROPIC_API_KEY` in `.env.local`) is only needed to generate the AI launch kit; the deterministic grader never needs one.

**Grade any listing over HTTP โ€” no key required:**
```bash
curl -X POST http://localhost:3000/api/analyze \
-H 'content-type: application/json' -d @data/fixtures/pocketplants.json
```

## ๐Ÿงช Testing & engineering harness

A **6-stage CI/CD pipeline** runs on every push (Quality โ†’ Security โ†’ Build โ†’ E2E โ†’ Performance โ†’ Deploy gate). When it goes green on `main`, a separate **Release** workflow runs [semantic-release](https://semantic-release.gitbook.io): it reads the conventional commits, computes the next version, updates the changelog, and publishes a tagged GitHub Release automatically.

```bash
npm run ci # lint + typecheck + tests with coverage (the quality gate)
npm run e2e # Playwright E2E (demo mode โ€” no API key)
npm run release:dry # preview the next semantic version locally
```

| Layer | Tooling | Status |
|---|---|---|
| Code quality | ESLint + TypeScript strict | โœ… |
| Unit tests | Vitest โ€” **150 tests, 100% coverage** of the deterministic core | โœ… |
| E2E tests | Playwright โ€” 3 suites (smoke ยท API ยท responsive), desktop + mobile | โœ… |
| Security (SAST) | CodeQL | โœ… |
| Security (SCA) | Dependabot + `npm audit` | โœ… |
| Secret scanning | TruffleHog (verified) | โœ… |
| Performance | Lighthouse CI | โœ… |
| Releases | semantic-release (conventional commits โ†’ semver, auto GitHub Release) | โœ… |
| Community profile | CoC ยท Contributing ยท Security ยท issue/PR templates | โœ… 100% |

**Benchmark** (`npm run bench`, 5,000 runs over 3 fixtures): the lint engine runs at **p50 0.39 ms ยท p95 0.86 ms ยท ~2,180 listings/sec** โ€” fast enough to be the AI's inline validator on every repair attempt.

## ๐Ÿ› Build notes โ€” a few bugs worth remembering

- **The SVG logo was pinned to (0,0).** In the animated README hero, a CSS `transform` (the bob animation) silently *overrode* the element's `transform="translate()"` attribute โ€” so the icon ignored every position I set. Fix: split positioning (outer group, attribute) from animation (inner group, CSS).
- **A stopword leak flipped a rule.** The "what does your app do" text was matched against the description without filtering stopwords, so "the/for/your" counted as real content โ€” caught only because a test expected a finding that didn't fire.
- **Google Play embeds rival apps' copy.** The paste-a-link extractor first grabbed the *longest* description on the page โ€” which was a competitor's. Fixed by matching the description to the target app via distinctive name/tagline tokens.
- **The social-proof regex missed real phrasing.** "Rated 4.8 by 3,200 users" didn't match the first pattern; a fixture pinned the expected score and surfaced it.

## โš ๏ธ Honest limitations

No auth yet ยท IP-based rate limits reset on redeploy ยท rules encode public ASO best practices, not Apple's private ranking algorithm ยท English-only v1 ยท paste-a-link extraction is best-effort โ€” the App Store subtitle is anchored to the app's own listing object (never a neighbouring app's), and anything it can't confidently read is flagged, never guessed.

## ๐Ÿ“„ License

Released under the [MIT License](LICENSE). ยฉ 2026 Edy Cu.

Thank you for reviewing LaunchCopilot. โ€” Edy