{"id":51699094,"url":"https://github.com/edycutjong/launchcopilot","last_synced_at":"2026-07-16T08:33:46.222Z","repository":{"id":370879487,"uuid":"1297577529","full_name":"edycutjong/launchcopilot","owner":"edycutjong","description":"🚀 Paste your app's store link → a graded ASO report (28 deterministic rules) + a validated AI launch kit, in ~1 min. Built for HackOnVibe.","archived":false,"fork":false,"pushed_at":"2026-07-12T12:49:50.000Z","size":25188,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-16T08:33:43.427Z","etag":null,"topics":["app-store-optimization","aso","claude","hackathon","indie-dev","launch","launch-marketing","nextjs","typescript"],"latest_commit_sha":null,"homepage":"https://launchcopilot.edycu.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/edycutjong.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-07-11T15:51:48.000Z","updated_at":"2026-07-12T12:50:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/edycutjong/launchcopilot","commit_stats":null,"previous_names":["edycutjong/launchcopilot"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/edycutjong/launchcopilot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flaunchcopilot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flaunchcopilot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flaunchcopilot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flaunchcopilot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/edycutjong","download_url":"https://codeload.github.com/edycutjong/launchcopilot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/edycutjong%2Flaunchcopilot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35537751,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-16T02:00:06.687Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["app-store-optimization","aso","claude","hackathon","indie-dev","launch","launch-marketing","nextjs","typescript"],"created_at":"2026-07-16T08:33:44.336Z","updated_at":"2026-07-16T08:33:46.214Z","avatar_url":"https://github.com/edycutjong.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n  \u003cimg src=\"docs/icon-animated.svg\" alt=\"LaunchCopilot Icon\" width=\"144\"\u003e\n\n  \u003ch1\u003eLaunchCopilot 🚀\u003c/h1\u003e\n\n  \u003cp\u003e\u003cem\u003ePaste your app\u0026rsquo;s store listing → a graded, validated launch kit — in about a minute.\u003c/em\u003e\u003c/p\u003e\n\n  \u003cimg src=\"docs/readme-hero-animated.svg\" alt=\"LaunchCopilot — paste your store listing, get a graded, validated launch kit (ASO 27 → 93)\" width=\"100%\"\u003e\n\n  \u003cbr/\u003e\n\n[![Live Demo](https://img.shields.io/badge/🚀_Live-Demo-06b6d4?style=for-the-badge)](https://launchcopilot.edycu.dev)\n[![Pitch Deck](https://img.shields.io/badge/📊_Pitch-Deck-f59e0b?style=for-the-badge)](https://launchcopilot.edycu.dev/pitch)\n[![Demo Video](https://img.shields.io/badge/🎬_Demo-Video-ef4444?style=for-the-badge)](https://youtu.be/2if0sEFKe8c)\n[![Built for HackOnVibe](https://img.shields.io/badge/HackOnVibe-Promote_a_New_App-8b5cf6?style=for-the-badge)](https://hackonvibe.com)\n\n  \u003cbr/\u003e\n\n![Next.js](https://img.shields.io/badge/Next.js_16-black?style=flat\u0026logo=next.js)\n![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=flat\u0026logo=typescript\u0026logoColor=white)\n![Claude](https://img.shields.io/badge/AI-Claude_Opus_4.8-8b5cf6?style=flat\u0026logo=anthropic\u0026logoColor=white)\n![ASO Engine](https://img.shields.io/badge/ASO_Engine-28_rules-ff2d95?style=flat)\n![Tests](https://img.shields.io/badge/tests-150_passing-00d4ff?style=flat)\n[![License](https://img.shields.io/badge/License-MIT-yellow)](https://opensource.org/licenses/MIT)\n[![CI](https://github.com/edycutjong/launchcopilot/actions/workflows/ci.yml/badge.svg)](https://github.com/edycutjong/launchcopilot/actions/workflows/ci.yml)\n\n\u003c/div\u003e\n\n---\n\n## 🏁 HackOnVibe Submission — Demo Video \u0026 Questionnaire\n\n**🎬 Demo video — customer journey (~2 min):** **https://youtu.be/2if0sEFKe8c**\n*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.*\n\n**Questionnaire**\n\n1. **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.**\n2. **Target audience** — Solo \u0026 indie mobile-app developers and small studios launching a new app, who can't afford a $2–5k ASO/marketing agency.\n3. **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**).\n4. **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.\n5. **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.\n\n---\n\n## 📸 See it in Action\n\n\u003cdiv align=\"center\"\u003e\n\n![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)\n\n\u003csub\u003e\u003cem\u003e~15s, no audio — paste a store link → auto-fill → the deterministic 27/100 grade → a generated launch kit that re-grades itself to ≥ 90.\u003c/em\u003e\u003c/sub\u003e\n\n\u003c/div\u003e\n\n| 1 · Paste a link → auto-fill | 2 · Grade (28 rules) | 3 · Landing → live tool |\n|---|---|---|\n| ![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) |\n| 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. |\n\n\u003e ▶ **Try it yourself, no signup, no key:** [launchcopilot.edycu.dev](https://launchcopilot.edycu.dev) — paste **your** app's link and watch it grade.\n\n## ✅ Deterministic, not vibes\n\n**The grader is deterministic — no AI. 28 encoded App Store / Google Play rules, 150 passing tests, sub-millisecond p95.**\n\nReproduce 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.\n\n**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.\n\n*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.*\n\n## 💡 The Problem \u0026 Solution\n\nSolo 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.\n\n**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.**\n\n**Key Features**\n- 🔗 **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.)*\n- 📊 **28-rule ASO engine** — deterministic, sub-millisecond, scores 0–100 with per-field findings and exact fixes. Pure encoded store rules, no model.\n- ♻️ **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.\n- 🎭 **Persona-panel QA** — a focus group synthesized from your own listing critiques every artifact in-character; weak ones regenerate before you see them.\n- 🆓 **Free API + CLI, no key to grade** — `POST /api/analyze` · `npm run aso-lint` · runs fully in `DEMO_MODE`.\n\n## 🏗️ Architecture \u0026 Tech Stack\n\n**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.\n\n```mermaid\nflowchart LR\n  A[\"🔗 Paste store link\"] --\u003e B[\"Extract listing\u003cbr/\u003eiTunes API · Play scrape\"]\n  B --\u003e C[\"28-rule ASO lint\u003cbr/\u003e\u003ci\u003edeterministic · sub-ms · no AI\u003c/i\u003e\"]\n  C --\u003e D[\"Score 0–100\u003cbr/\u003e+ per-field fixes\"]\n  D --\u003e E[\"Claude Opus\u003cbr/\u003e5 parallel writers\"]\n  E --\u003e F{\"Re-lint the rewrite\u003cbr/\u003escore ≥ 90?\"}\n  F -- \"no · inject findings\" --\u003e E\n  F -- \"yes\" --\u003e G[\"Claude Haiku\u003cbr/\u003epersona-panel QA\"]\n  G --\u003e H[\"🚀 Launch kit\u003cbr/\u003estore · PH · social · community · press\"]\n```\n\n**Where the interesting code lives** (for judges skimming the source):\n\n| Capability | File |\n|---|---|\n| 28-rule ASO engine (the deterministic judge) | [`src/lib/aso-lint/rules.ts`](src/lib/aso-lint/rules.ts) |\n| 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) |\n| Validator-in-the-loop kit pipeline | [`src/lib/pipeline/`](src/lib/pipeline/) |\n| Free grading API (no key) | [`src/app/api/analyze/route.ts`](src/app/api/analyze/route.ts) |\n| Self-contained pitch deck (served at `/pitch`) | [`public/pitch/index.html`](public/pitch/index.html) |\n\n## 🎯 HackOnVibe theme fit\n\nThe 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.\n\n## 🚀 Run it Locally (For Judges)\n\n```bash\nnpm install\nnpm test                                              # 150 unit tests\nnpm run aso-lint -- data/fixtures/pocketplants.json   # CLI: 27/100 (F) + fixes\nnpm run dev                                           # app at http://localhost:3000\n```\n\n\u003e **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.\n\n**Grade any listing over HTTP — no key required:**\n```bash\ncurl -X POST http://localhost:3000/api/analyze \\\n  -H 'content-type: application/json' -d @data/fixtures/pocketplants.json\n```\n\n## 🧪 Testing \u0026 engineering harness\n\nA **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.\n\n```bash\nnpm run ci          # lint + typecheck + tests with coverage (the quality gate)\nnpm run e2e         # Playwright E2E (demo mode — no API key)\nnpm run release:dry # preview the next semantic version locally\n```\n\n| Layer | Tooling | Status |\n|---|---|---|\n| Code quality | ESLint + TypeScript strict | ✅ |\n| Unit tests | Vitest — **150 tests, 100% coverage** of the deterministic core | ✅ |\n| E2E tests | Playwright — 3 suites (smoke · API · responsive), desktop + mobile | ✅ |\n| Security (SAST) | CodeQL | ✅ |\n| Security (SCA) | Dependabot + `npm audit` | ✅ |\n| Secret scanning | TruffleHog (verified) | ✅ |\n| Performance | Lighthouse CI | ✅ |\n| Releases | semantic-release (conventional commits → semver, auto GitHub Release) | ✅ |\n| Community profile | CoC · Contributing · Security · issue/PR templates | ✅ 100% |\n\n**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.\n\n## 🐛 Build notes — a few bugs worth remembering\n\n- **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).\n- **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.\n- **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.\n- **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.\n\n## ⚠️ Honest limitations\n\nNo 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.\n\n## 📄 License\n\nReleased under the [MIT License](LICENSE). © 2026 Edy Cu.\n\n\u003csub\u003eThank you for reviewing LaunchCopilot. — Edy\u003c/sub\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedycutjong%2Flaunchcopilot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedycutjong%2Flaunchcopilot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedycutjong%2Flaunchcopilot/lists"}