Communitygithub.com

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Installe un chatbot IA flottant dans un projet Next.js existant (App Router ou Pages Router), avec support du streaming, rendu Markdown et capture automatique de leads dans KV.

Qu'est-ce que MKT.LANDINGPAGE.SKILLS ?

Cette compétence (`lexuanthanhhy/MKT.LANDINGPAGE.SKILLS`) permet d'installer un widget chatbot IA flottant, positionné en bas à droite, dans un projet Next.js existant (App Router ou Pages Router). Le chatbot est entièrement responsive (mobile, tablette, desktop) et utilise OpenRouter pour appeler un LLM (par défaut `google/gemini-3-flash-preview`, modifiable pour `anthropic/claude-sonnet-4.6`). Elle est particulièrement utile pour les solopreneurs et créateurs de cours qui souhaitent mettre en place un assistant client 24/7 avec une base de connaissances (FAQ + documentation produit), sans complexité de backend. Le widget est capable de rendre du Markdown dans les bulles de réponse (gras, listes, liens, code inline) grâce à `react-markdown` et `remark-gfm`, et d'extraire automatiquement les leads (nom, téléphone, email) lorsque l'utilisateur les fournit en chat, pour les sauvegarder dans Upstash Redis ou Vercel KV. La capture est dédupliquée par téléphone, avec une TTL de 90 jours, et s'exécute en fire-and-forget pour ne pas bloquer le streaming des réponses. Le skill détecte automatiquement la configuration du projet (TypeScript/JavaScript, App Router/Pages Router, Tailwind/CSS modules, présence de KV/Upstash), installe les dépendances nécessaires (`react-markdown`, `remark-gfm`), et crée les fichiers (`components/Chatbot.tsx`, `app/api/chat/route.ts`, `lib/chatbot-knowledge.ts`, etc.). Il ne demande à l'utilisateur que les informations essentielles : le projet cible, la FAQ, la documentation produit, et le ton/la marque.

Compatible avec✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/lexuanthanhhy/MKT.LANDINGPAGE.SKILLS/tree/main/.claude/skills/biz-nextjs-chatbot-openrouter

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Biz Next.js Chatbot OpenRouter — Installe un chatbot IA flottant sur un site en un clin d'œil

Cette compétence ajoute un widget chatbot IA flottant à un projet Next.js existant. Le widget se trouve dans le coin inférieur droit, est entièrement responsive sur les 3 écrans, utilise un LLM via OpenRouter avec une base de connaissances provenant de la FAQ + de la documentation du cours/produit, affiche le Markdown dans les bulles de l'assistant (gras pour les nombres/prix, listes à puces, liens cliquables, code inline) grâce à react-markdown + remark-gfm, et extrait et sauvegarde automatiquement les leads (nom + téléphone + email) dans KV (Upstash Redis / Vercel KV) lorsque l'utilisateur fournit les informations complètes dans le chat — consultable par l'admin via le tableau de bord /admin. Objectif : solopreneur / créateur de cours avec bot de support automatique 24/7 + capture passive de leads directement sur la page de vente du cours, sans perdre aucun client qui pose une question via le chat.

Esprit : Détecter automatiquement tout ce qui peut l'être (version Next.js, App/Pages Router, TS/JS, Tailwind/CSS), ne demander à l'utilisateur que 4 choses vraiment nécessaires : (1) le projet s'il y en a plusieurs, (2) la FAQ, (3) la documentation produit, (4) le ton/le nom de la marque. Le reste est du code → opérationnel en quelques minutes.

Quand l'utiliser

L'utilisateur souhaite :

  • Ajouter un chatbot IA d'assistance client sur une page de vente de cours / service
  • Réduire la charge de réponse aux questions répétitives (prix, programme, remboursement, public cible...)
  • Disposer d'un widget de chat compact en bas à droite, sans masquer le contenu
  • Avoir un chatbot qui comprend précisément le contenu de son cours / produit (piloté par FAQ)
  • Posséder déjà un projet Next.js (venant de terminer /biz-sales-page-layout, ou un projet existant)

Quand NE PAS l'utiliser

  • Le projet n'est pas Next.js (React pur Vite, Vue, Svelte, HTML simple) → cette compétence est spécialisée Next.js. Une adaptation est possible mais non optimale.
  • Il faut un chatbot RAG (retrieval-augmented) avec une base de connaissances de milliers de pages → nécessite une base vectorielle (Pinecone/Supabase pgvector). Cette compétence utilise un prompt système simple adapté à ≤ 20K tokens de connaissances.
  • Il faut un chatbot vocal / multimodal (envoi d'images) → cette compétence est limitée au texte.
  • Il faut un chatbot qui sauvegarde l'historique des conversations par utilisateur dans une base de données → cette compétence est sans état, session éphémère, possibilité d'extension ultérieure.
  • Le backend n'est pas compatible Vercel (nécessite un long polling, WebSocket persistant) → le streaming OpenRouter fonctionne bien sur Vercel Edge, mais si un WS dédié est nécessaire, c'est différent.

Ce que l'utilisateur recevra

Une fois la compétence exécutée :

  1. Nouveaux fichiers dans le projet Next.js de l'utilisateur :

    • components/Chatbot.tsx (ou .jsx) — interface du widget (affiche le Markdown via react-markdown + remark-gfm)
    • app/api/chat/route.ts (App Router) OU pages/api/chat.ts (Pages Router) — proxy API appelant OpenRouter + extraction de leads après le stream
    • lib/chatbot-knowledge.ts (ou .js) — base de connaissances + prompt système (comprend un bloc FORMAT DE RÉPONSE + un bloc COLLECTE ACTIVE DE LEADS)
    • lib/chat-lead.ts — CRÉÉ UNIQUEMENT si le projet a KV/Upstash — extracteur + sauvegarde, dédoublonnage par téléphone, TTL 90 jours, espace de noms chat-lead:{phone}
    • Styles Markdown .chatbot-md ajoutés à app/globals.css (à partir de templates/chatbot-markdown-styles.css)
    • .env.local créé/amendé avec OPENROUTER_API_KEY= (placeholder)
    • .env.example (s'il n'existe pas) pour documenter les variables d'environnement
    • Montage de <Chatbot /> dans app/layout.tsx ou pages/_app.tsx
  2. Paquets installés (via le gestionnaire de paquets détecté à partir du fichier de verrouillage) :

    • react-markdown — affichage sécurisé du Markdown (sans dangerouslySetInnerHTML)
    • remark-gfm — GitHub Flavored Markdown (tableaux, autolink, barré)
  3. Instructions claires en fin de session :

    • 3 étapes que l'utilisateur doit effectuer lui-même : (a) obtenir une clé API OpenRouter, (b) la coller dans .env.local, (c) npm run dev pour tester
    • Comment changer de modèle entre Gemini et Sonnet
    • Comment mettre à jour la base de connaissances ultérieurement

Workflow

Étape 1 — Détecter le projet Next.js

Rechercher les candidats projets Next.js. Exécuter :

# Chercher package.json contenant "next" dans les dépendances, profondeur max 4
find /Users/tonyhoang/Documents/GitHub -maxdepth 4 -name "package.json" -not -path "*/node_modules/*" 2>/dev/null | xargs grep -l '"next"' 2>/dev/null | head -20

(Si l'utilisateur se trouve dans un répertoire de travail spécifique, privilégier la recherche à partir du cwd en premier, sinon chercher dans ~/Documents/GitHub si rien n'est trouvé.)

Branchement :

  • 0 projet : En informer l'utilisateur et s'arrêter. Suggestion : "Avez-vous un projet Next.js ? Sinon, voulez-vous que j'en crée un nouveau avec /biz-sales-page-layout puis revenir ?"
  • 1 projet : Confirmer le chemin avec l'utilisateur avant de continuer : "Je vais installer le chatbot dans [chemin]. Cela vous convient-il ?"
  • ≥ 2 projets : Lister les chemins + noms (name du package.json) dans une liste numérotée, demander à l'utilisateur de choisir : "J'ai trouvé N projets Next.js. Dans lequel souhaitez-vous installer le chatbot ?"

Étape 2 — Analyser le contexte du projet

Après que l'utilisateur a confirmé le projet, lire :

  1. package.json → vérifier :

    • TypeScript (typescript dans les dépendances ?)
    • Tailwind (tailwindcss dans les devDeps ?)
    • Gestionnaire de paquets (fichier de verrouillage : pnpm-lock.yaml → pnpm, yarn.lock → yarn, par défaut npm)
    • Version de Next.js
  2. Structure des répertoires → vérifier :

    • Le répertoire app/ existe → App Router
    • Le répertoire pages/ existe (et app/ n'existe pas) → Pages Router
    • Les deux existent → privilégier App Router pour les nouveaux fichiers (Next.js migre vers celui-ci)
    • Wrapper src/ → ajuster le chemin (ex. src/app/, src/components/)
  3. tsconfig.json → vérifier les alias de chemin (@/* → ./src/* ou ./*)

  4. .env.local, .env.example → vérifier s'ils existent déjà

  5. Disponibilité KV/Upstash (pour la capture automatique de leads) :

    • package.json contient @upstash/redis OU @vercel/kv → KV présent → GÉNÉRER chat-lead.ts + l'intégrer à la route
    • Le fichier src/lib/kv.ts (ou lib/kv.ts) exporte kv → utiliser l'assistant existant (motif camp)
    • KV absent → NE PAS GÉNÉRER chat-lead.ts, informer l'utilisateur : "Le projet n'a pas de KV — la capture automatique de leads n'est pas activée. Je peux exécuter /biz-setup-sepay-payment pour installer KV d'abord, puis revenir activer la capture, ou passer outre."

Enregistrer ces observations dans un petit tableau pour les utiliser aux étapes suivantes.

Étape 3 — Collecter la base de connaissances auprès de l'utilisateur

Poser 4 questions à l'utilisateur (regroupées dans un seul message pour qu'il réponde en une fois, éviter les allers-retours) :

Pour que le chatbot réponde avec précision, j'ai besoin de 4 choses :

1. **FAQ** — liste des questions fréquentes + réponses (prix, programme, remboursement, public cible, durée, support après le cours...).
   Collez directement ici, OU indiquez le chemin du fichier (.md / .txt / .docx).

2. **Documentation produit / cours** — description détaillée du cours : nom, contenu de chaque module, résultats attendus, formateur, bonus, paliers de prix s'il y en a plusieurs.
   Collez également ou indiquez le chemin du fichier.

3. **Nom de la marque + ton** — Nom de la marque/du cours pour que le chatbot se présente (ex. "assistant de AI Mastery"). Ton utilisé : amical (par défaut) / formel / décontracté.

4. **Modèle** — par défaut `google/gemini-3-flash-preview` (rapide, peu coûteux, suffisant pour le support). Si vous voulez utiliser `anthropic/claude-sonnet-4.6` (meilleure qualité, ~10x plus cher) parce que la qualité des réponses précoces est insuffisante, dites-le moi.

Pouvez-vous répondre en une seule fois ?

Quand l'utilisateur répond :

  • S'il indique un chemin de fichier → lire ce fichier avec l'outil de lecture.
  • S'il colle le contenu directement → utiliser le contenu collé.
  • Si l'utilisateur dit "génère un placeholder pour moi" → créer un placeholder FAQ générique et le marquer // TODO : à remplir par l'utilisateur pour qu'il sache qu'il doit le mettre à jour.
  • Pas de nom de marque → par défaut "Assistant IA" avec le ton "vous".

Étape 4 — Générer les fichiers dans le projet

Lire les templates dans templates/ de cette compétence et les adapter au projet. Les templates :

  • templates/chatbot-knowledge.ts — Module exportant la base de connaissances + systemPrompt. Injecter FAQ, informations produit, nom de marque, ton. Contient déjà le bloc FORMAT DE RÉPONSE (règles Markdown) + bloc COLLECTE ACTIVE DE LEADS (apprend au LLM à demander nom/téléphone/email lors d'un signal d'achat, à remercier + confirmer quand l'utilisateur fournit, NE PAS dire "sauvegardé en base de données").
  • templates/Chatbot.tsx — Composant widget, priorité Tailwind. Importe déjà react-markdown + remark-gfm, affiche le message de l'assistant avec <ReactMarkdown remarkPlugins={[remarkGfm]}> (assistant uniquement — les messages utilisateur restent en whitespace-pre-wrap). Si le projet N'A PAS Tailwind → fallback templates/Chatbot-noTailwind.tsx + templates/chatbot.module.css.
  • templates/chat-route-app.ts — Route API pour App Router (app/api/chat/route.ts). Contient déjà le hook persistLeadIfReady exécuté en fire-and-forget après la fermeture du stream — ne bloque pas la réponse.
  • templates/chat-route-pages.ts — Route API pour Pages Router (pages/api/chat.ts).
  • templates/chat-lead.ts — GÉNÉRÉ UNIQUEMENT si le projet a KV/Upstash — extraction par regex du téléphone VN + email + heuristique de nom (modèles d'introduction "nom X" / "je suis X" / "nom: X"), saveChatLead dédoublonné par téléphone, TTL 90 jours, espace de noms de clé chat-lead:{phone}.
  • templates/chatbot-markdown-styles.css — Extrait CSS pour la classe .chatbot-md. DOIT être ajouté à la fin de app/globals.css (ou src/app/globals.css / styles/globals.css). Modifier la couleur d'accent (#fde68a / #f59e0b) selon la palette de marque du projet avant d'ajouter.
  • templates/env-instructions.md — Extrait d'instructions pour obtenir la clé OpenRouter, utilisé à la dernière étape.

Règles d'adaptation des templates :

  1. TS vs JS : si le projet a seulement du JS, changer l'extension .ts/.tsx → .js/.jsx et supprimer les annotations de type (ne pas seulement renommer le fichier). Lire le fichier modèle, analyser, supprimer les types, écrire.

  2. Alias de chemin : si tsconfig mappe @/* → ./src/*, les imports dans le template doivent utiliser @/lib/chatbot-knowledge et le fichier être placé dans src/lib/. S'il n'y a pas d'alias, utiliser un chemin relatif.

  3. Modèle : remplacer le placeholder __MODEL_ID__ par le modèle choisi par l'utilisateur (google/gemini-3-flash-preview ou anthropic/claude-sonnet-4.6).

  4. Marque : remplacer __BRAND_NAME__, __BRAND_TONE__.

  5. Connaissances : construire systemPrompt à partir de la FAQ + des informations produit sous forme structurée claire (voir le template). Conserver le bloc FORMAT DE RÉPONSE dans systemPrompt — c'est ce qui apprend au LLM à produire un Markdown adapté à une petite bulle de chat (gras plutôt que titres, puces courtes sur une ligne).

  6. Installer les paquets de rendu Markdown (OBLIGATOIRE — si ignoré, le chatbot affichera du **gras** brut au lieu du texte en gras dans les bulles) :

    # détecter le fichier de verrouillage → choisir le bon gestionnaire de paquets
    npm install react-markdown remark-gfm
    # ou : pnpm add react-markdown remark-gfm
    # ou : yarn add react-markdown remark-gfm
    
  7. Ajouter les styles Markdown : lire templates/chatbot-markdown-styles.css, échanger la couleur d'accent selon la palette de marque du projet (vérifier globals.css pour --color-primary ou équivalent), puis ajouter à la fin de app/globals.css (ou src/app/globals.css / styles/globals.css).

  8. Monter le widget :

    • App Router : éditer app/layout.tsx (ou src/app/layout.tsx), ajouter import Chatbot from '@/components/Chatbot' et <Chatbot /> juste avant </body>. Lire le layout.tsx actuel avant de l'éditer pour conserver les métadonnées, polices, fournisseurs.
    • Pages Router : éditer pages/_app.tsx, envelopper le retour : <><Component {...pageProps} /><Chatbot /></>. Lire _app avant, conserver les fournisseurs existants.
  9. Intégration de la capture de leads automatique (uniquement si KV a été détecté à l'étape 2) :

    • Copier templates/chat-lead.ts dans lib/chat-lead.ts (ou src/lib/chat-lead.ts).
    • Si le projet N'A PAS encore lib/kv.ts → créer : import { Redis } from "@upstash/redis"; export const kv = Redis.fromEnv();
    • Le gestionnaire de route importe : import { extractLeadFromMessages, saveChatLead } from "@/lib/chat-lead".
    • Dans la boucle de stream : suivre assistantText (accumuler les deltas), à la fermeture du stream → appeler persistLeadIfReady(history, assistantText) (fire-and-forget, NE PAS attendre dans le chemin de réponse).
    • Prompt système : s'assurer que le bloc COLLECTE ACTIVE DE LEADS est présent dans chatbot-knowledge.ts (le template le contient déjà).
    • Confirmer avec l'utilisateur : "J'ai activé la capture automatique de leads — lorsque le client colle nom/téléphone/email dans le chat, le système sauvegarde automatiquement dans l'espace de noms KV chat-lead:{SĐT}. Consultez les leads via /admin (si /biz-admin-leads-dashboard est installé)."

Étape 5 — Configurer .env.local + .gitignore

  1. Vérifier si .env.local existe déjà :

    • Non : créer avec :
      # Clé API OpenRouter — Obtenez-la sur https://openrouter.ai/keys
      OPENROUTER_API_KEY=
      
      # Facultatif : URL du site pour le tracking du referrer OpenRouter (améliore le rate limiting)
      NEXT_PUBLIC_SITE_URL=http://localhost:3000
      
    • Oui : ajouter les 2 variables ci-dessus si elles n'existent pas, ne pas écraser les variables existantes.
  2. Mettre à jour .env.example (créer s'il n'existe pas) :

    OPENROUTER_API_KEY=sk-or-v1-xxxxx
    NEXT_PUBLIC_SITE_URL=https://your-domain.com
    
  3. Vérifier si .gitignore contient déjà .env.local ? Si non → ajouter .env.local et .env*.local.

Étape 6 — Rapport à l'utilisateur

Afficher 1 message récapitulatif clair avec 4 parties :

✅ Chatbot installé avec succès dans [nom du projet]

📁 Fichiers créés :
  - components/Chatbot.tsx (affiche le Markdown via react-markdown + remark-gfm)
  - app/api/chat/route.ts
  - lib/chatbot-knowledge.ts
  - app/globals.css (styles Markdown .chatbot-md ajoutés)
  - .env.local (placeholder)

📦 Paquets installés : react-markdown, remark-gfm

🔑 3 étapes à effectuer vous-même pour faire fonctionner le chatbot :

1. Obtenir une clé API OpenRouter :
   - Allez sur https://openrouter.ai → Inscrivez-vous (possible avec Google)
   - Allez sur https://openrouter.ai/keys → Créez une clé
   - Ajoutez du crédit (https://openrouter.ai/credits) — Gemini 3 Flash est peu coûteux, 5$ suffisent pour des milliers de conversations
   - Copiez la clé au format `sk-or-v1-xxxxx`

2. Collez-la dans le fichier `.env.local` :
   OPENROUTER_API_KEY=sk-or-v1-xxxxx-collez-ici

3. Testez :
   [npm/pnpm/yarn] run dev
   Ouvrez http://localhost:3000 → cliquez sur la bulle en bas à droite

🔄 Changer de modèle entre Gemini ↔ Sonnet :
  Ouvrez `app/api/chat/route.ts`, modifiez la variable `model:` en début de fichier.
  - `google/gemini-3-flash-preview` (par défaut, 0,075$/1M entrée, rapide)
  - `anthropic/claude-sonnet-4.6` (haut de gamme, ~3$/1M entrée, meilleure qualité)

📚 Mettre à jour la base de connaissances ultérieurement :
  Éditez `lib/chatbot-knowledge.ts` — ajoutez/modifiez FAQ et productInfo, sauvegardez, rechargement à chaud.

Design responsive mobile-first

Le widget doit respecter 3 points de rupture :

Point de ruptureComportement
≤ 640px (mobile)Cliquer sur la bulle → ouvre une superposition plein écran (z-index 9999), l'en-tête a un bouton X pour fermer. L'input est ancré en bas avec safe-area-inset pour ne pas être masqué par le clavier.
641–1023px (tablette)Panneau 380px × 70vh, ancré en bas à droite avec une marge de 16px.
≥ 1024px (desktop)Panneau 400px × 600px, ancré en bas à droite avec une marge de 24px. Bulle ronde de 60px.

**

…

[suite tronquée pour la traduction]

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Best practices for Remotion - Video creation in React

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Scaffold trang `/admin` CRM-style trực quan vào Next.js project (Supabase backend) — KHÔNG còn variant Vercel KV. Layout 1CRM-inspired: sidebar 3 tab (Tổng quan / Khách hàng / Email marketing) + popup nhập mã đăng nhập. **Tab Tổng quan**: 4 KPI cards (Tổng leads / Đã thanh toán / Tỷ lệ chuyển đổi / Doanh thu) có delta arrow vs kỳ trước, line chart leads+paid+revenue theo ngày dùng `recharts`, donut trạng thái paid/pending/expired, period selector pill 7d/30d/90d, list 5 thanh toán gần nhất. **Tab Khách hàng**: bảng leads + search + filter trạng thái + filter ngày + CSV export. **Tab Email marketing**: form soạn chiến dịch (tên + tiêu đề + body chọn định dạng **văn bản thường HOẶC HTML** + placeholder `{{name}}` + audience 4 loại all/paid/pending/last_days + tên người gửi) — có nút **Xem trước** mở modal iframe render đúng email thật (text → auto convert + wrap khung; HTML fragment → wrap khung, HTML đầy đủ giữ nguyên) → gửi bulk qua SMTP (reuse `nodemailer` của `biz-email-setup` — KHÔN

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Deploy landing page / website (React, Next.js, Vite, static HTML) lên Vercel — tự kiểm tra Vercel CLI hoặc Vercel MCP đã cài chưa, nếu chưa thì cài qua npm/pnpm và hướng dẫn user authenticate (vercel login), tự detect framework (Next.js / Vite / CRA / static), auto-generate vercel.json khi cần, chạy `vercel --prod`, trả về live URL + inspect URL + hướng dẫn custom domain. USE WHEN user says 'deploy lên vercel', 'đẩy landing page lên vercel', 'publish website', 'go live', 'deploy nextjs', 'deploy react', 'deploy vite', 'tạo URL live', 'đưa lên production', 'biz-deploy-vercel', 'host landing page', 'vercel deploy', 'ship lên vercel', 'đẩy code lên vercel'. Skill này áp dụng cho cả case dùng Vercel CLI lẫn Vercel MCP server.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Setup SMTP-based email auto-responder cho landing page bán hàng — tự động gửi email sau khi user điền form (tên/SĐT/email), KHÔNG cố định vào provider nào. Skill này (1) hỏi user chọn SMTP provider (Gmail/Google Workspace, Resend SMTP, SendGrid, Mailgun, Brevo, Zoho, hoặc SMTP custom của hosting VN) và detect Next.js stack đang dùng, (2) đọc context từ `offer.json` + `conversion-copy.md` (từ `/biz-offer-alex-hormozi`) HOẶC đọc trực tiếp Next.js project đã build qua `ui-ux-pro-max` (file `app/page.tsx`) HOẶC đọc HTML landing page đã deploy để hiểu offer, dream outcome, mechanism, bonus. Lưu ý: skill `biz-sales-page-layout` đã DEPRECATED 2026-05-14 — pipeline mới skip layout/copy.json, (3) **draft 2 email**: email A — auto-responder gửi cho lead (warm welcome + deliver lead magnet/booking confirm/payment link tuỳ offer type), email B — notification gửi cho owner (lead alert + thông tin liên hệ), (4) **show draft cho user duyệt và chỉnh sửa** trước khi wire vào code, (5) cài `nodemailer`

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Đóng gói offer **không thể chối từ** (grand slam offer) theo phương pháp Alex Hormozi ($100M Offers) — nhận input pains/gains/customer jobs theo Value Proposition Design (Osterwalder 2014) + sản phẩm/dịch vụ, rồi sinh ra: (1) markdown report tiếng Việt đầy đủ Value Equation scoring + Core Offer + 3-4 Bonus stack + Guarantee + Urgency + Pricing, (2) offer.json structured cho pipeline downstream (`ui-ux-pro-max` build sales page production-ready), (3) conversion copy block (headline + subheadline + CTA) sẵn sàng paste landing page. 2 input mode: (B) user paste sẵn pains + gains + product, (C) user chỉ có sản phẩm — skill phỏng vấn theo VPD framework để surface pain/gain trước. Bonus stack mode hybrid: skill brainstorm 5-7 candidate có justification value rồi user pick/chỉnh 3-4 cái. Tiếng Việt thuần (xưng anh/chị), giá VND charm pricing (X99K), 3-tier decoy structure. USE WHEN user says 'đóng gói offer', 'tạo offer', 'thiết kế offer Hormozi', 'grand slam offer', 'value stack', 'offer sta

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Nâng cấp copy sales page tiếng Việt — biến copy có sẵn (từ `offer.json` + `conversion-copy.md` của `/biz-offer-alex-hormozi`, HOẶC từ Next.js project đã build qua `ui-ux-pro-max`, HOẶC user paste block copy bất kỳ) thành **copy chất lượng cao chốt đơn**: headline punchy hơn, pain agitation đau hơn, mechanism rõ hơn, benefit cụ thể hơn, FAQ xử lý đúng objection của thị trường VN, CTA mạnh hơn. Skill này có 3 INTENSITY LEVEL: (1) **Polish** — light edit + power word + sửa nhịp; (2) **Conversion-optimized** — rewrite 5 block critical + tạo A/B variants cho hero/CTA; (3) **Sales-letter** — long-form story-driven full rewrite kèm P.S.. Mỗi section áp dụng đúng formula thuyết phục (PAR cho pain, BAB cho solution, FEP cho benefit, PVEN cho final CTA, Star-Chain-Hook cho testimonial). Output gồm 4 file: `copy-upgraded.md`, `copy-variants.md` (A/B test bank — 3 hero + 3 CTA + 3 final-CTA), `copy-changes.md` (diff Trước/Sau + lý do), `copy.json` (structured downstream). Giọng văn tiếng Việt thuầ

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

⚠️ DEPRECATED (2026-05-14) — Skill này KHÔNG còn trong pipeline chuẩn. Quy trình mới đã bỏ bước wireframe markdown trung gian: sau `/biz-offer-alex-hormozi` đi THẲNG sang `ui-ux-pro-max` để build Next.js sales page production-ready (có design language nhất quán: style + palette + font pairing, không phải Tailwind defaults). Lý do deprecate: wireframe markdown làm thêm 1 bước trung gian không tạo giá trị — `ui-ux-pro-max` đọc trực tiếp `offer.json` đã đầy đủ anchor + core + bonus + guarantee + urgency + pricing rồi ra HTML production luôn. Chỉ dùng skill này KHI user EXPLICITLY yêu cầu wireframe markdown để review/in/share trước khi build code (rare case). KHÔNG trigger trên các keyword 'tạo sales page', 'tạo landing page bán hàng' nữa — những keyword đó giờ trigger `ui-ux-pro-max`.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

End-to-end Sepay VietQR payment infrastructure cho landing page Next.js — guide user setup Sepay account + bank linking + scaffold đầy đủ payment flow trong project. Skill này xử lý 7 phase: (0) detect Next.js stack + **HỎI user chọn lead store backend** (Vercel KV hoặc Supabase Free Postgres — default recommend Supabase do free tier rộng hơn ~50× + có SQL + admin UI), (1) GUIDE user đăng ký Sepay account tại my.sepay.vn + link bank account VN (Vietcombank/Techcombank/MB/ACB/VPBank/BIDV/...) + lấy API key + setup webhook URL trên Sepay dashboard, (2A nếu chọn KV) setup Vercel KV (install `@vercel/kv` + KV namespace + 4 env vars KV_*), (2B nếu chọn Supabase) setup Supabase project (tạo project tại Singapore region + chạy migration SQL tạo 4 bảng leads/phone_index/order_counter/webhook_dedup với pg_cron TTL cleanup + RLS deny-all + lấy SUPABASE_URL + SUPABASE_SERVICE_ROLE_KEY + Vercel Cron ping `/api/health` mỗi 6 ngày chống auto-pause), (3) scaffold `lib/leads-store.ts` (thin re-export

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Setup Telegram bot notification cho thanh toán thành công từ Sepay webhook trong Next.js project. Skill này: (1) hướng dẫn user 3 bước tạo Telegram bot riêng qua @BotFather + lấy bot token + chat_id (qua @userinfobot cho chat 1-1, hoặc /getUpdates API cho group), (2) tạo helper function `sendTelegramNotification()` reusable trong `lib/telegram.ts`, (3) detect existing Sepay webhook route trong project (thường là `/api/sepay-webhook`, `/api/payment-success`, hoặc tương đương) và wire Telegram call CÙNG CHỖ với email auto-responder (Resend) — gửi parallel qua `Promise.allSettled` để Telegram fail KHÔNG block 200 response trả Sepay (Sepay sẽ retry webhook nếu nhận non-200, gây duplicate notification), (4) draft message format mặc định tiếng Việt: emoji + tên khách + SĐT + email + amount (charm pricing VND định dạng `499.000đ`) + tên sản phẩm + timestamp giờ VN dd/mm/yyyy HH:mm, (5) update `.env.local` với `TELEGRAM_BOT_TOKEN` + `TELEGRAM_CHAT_ID`, add vào `.gitignore`, nhắc user paste vào

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Convert a single MP3 voiceover file into a single HeyGen avatar lip-sync MP4 video. Single-purpose — no planning, no SRT, no chunking, no Remotion compositing. Hybrid path — REST upload (helper script) + HeyGen MCP for video creation, because the post-2026 MCP no longer exposes an asset-upload tool. Reads avatar look pool (`HEYGEN_AVATAR_LOOKS`) from `.env` and HeyGen API key (`HEYGEN_API_KEY`) for the upload step. USE WHEN user says "tạo video heygen từ mp3", "mp3 to heygen", "heygen mp4 từ audio", "convert mp3 sang heygen video", "tạo avatar video từ file mp3", "lip sync mp3 heygen", "biến mp3 thành video heygen", or any time the user has exactly one MP3 file and wants exactly one HeyGen avatar MP4 out.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Demand-side market research cho digital product / service ở Việt Nam — đo cầu thật + WTP + channel-market fit + defensibility qua keyword volume, marketplace sales (Shopee/Unica/Edumall/Gitiho/KyNa), community signal (FB groups, TikTok hashtag, Zalo OA), competitor pricing, unit economics — không phải macro PESTEL. Output: keyword portfolio + Niche Score 100 điểm 7-dimension có evidence + go/no-go decision + falsification protocol. Force triangulate ≥3 sources cho mỗi claim quan trọng. USE WHEN user says 'nghiên cứu thị trường', 'market research', 'validate niche', 'keyword research', 'demand validation', 'niche có nên làm không', 'có ai làm chưa', 'thị trường đủ lớn không', 'có lời không', 'chọn ngách', 'kiểm tra cầu'. Cũng trigger khi user mô tả 1 ý tưởng kinh doanh cụ thể và muốn check feasibility. Skill này KHÔNG fit: high-ticket transactional sale (BĐS, ô tô), B2B enterprise (sales cycle 6+ tháng), hyper-local geo micro-market (1 toà nhà, 1 phường). KHÔNG làm: macro PESTEL/Porter

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Transcribe an MP3 voiceover into an SRT subtitle file and a word-level segments JSON using local OpenAI Whisper. Input is a single MP3 path; output is `<stem>.srt` + `<stem>_segments.json` written next to the MP3 (or to a custom output dir). USE WHEN the user says 'extract srt from mp3', 'trích srt từ mp3', 'transcribe voiceover', 'tạo file srt và segments', 'whisper transcribe', 'bóc transcript có timestamp', 'extract voiceover segments', 'tách SRT từ audio', or any time a downstream skill (plan-short-video-edit, heygen-remotion-short-video-editor) needs an SRT + word-level segments JSON from a voiceover MP3 and one does not already exist.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Convert Vietnamese/English script text to MP3 voiceover using ElevenLabs TTS API. Calls POST /v1/text-to-speech/{voice_id}, streams audio bytes, writes MP3 directly. Locked to Hoang's brand voice ID by default. USE WHEN user says 'tạo mp3 elevenlabs', 'elevenlabs tts', 'eleven labs voice', 'text to speech elevenlabs', 'tạo voiceover elevenlabs', 'đọc text bằng elevenlabs', 'tts elevenlabs to mp3', 'eleven labs script to mp3', 'voiceover bằng elevenlabs', 'giọng elevenlabs'.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

End-to-end orchestrator: **script → final MP4 16:9 (1920×1080) podcast-keynote**.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

End-to-end short-video pipeline — từ kịch bản (Việt/Anh) ra MP4 TikTok/Reels 9:16 hoàn chỉnh. Orchestrator 3 phase ghép skill có sẵn — (1) TTS provider chọn được giữa `mkt-elevenlabs-tts-to-mp3` (default, voice của Hoàng) hoặc `mkt-video-script-to-mp3` (MiniMax speech-2.8-hd), (2) checkpoint user duyệt MP3, (3) `heygen-mp3-to-mp4` lip-sync avatar HeyGen, (4) delegate Phase 3 packaging cho sub-agent `mkt-full-video-phase3-packager` (transcribe + scene outline + checkpoint + fan-out N scene writers parallel + scaffold + preview Studio). API key + voice ID cho cả 2 provider lưu ở `.env`. USE WHEN user nói "tạo full video từ script", "script to tiktok video", "pipeline full video heygen + hyperframe", "tạo video từ kịch bản đến mp4", "elevenlabs heygen hyperframe full pipeline", "minimax heygen pipeline", "kịch bản ra video tiktok", hoặc có sẵn 1 script + (optional) ảnh b-roll và muốn ra MP4 9:16 đóng gói có captions, SFX, b-roll.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Build a TikTok/Reels/YouTube **landscape 16:9 (1920×1080)** short video from a pre-recorded talking-head MP4 using HyperFrames — transcribe Vietnamese audio, scaffold a complete preview-ready 1920×1080 project with a slide pane (1200px) on the left and a floating avatar frame on the right, GSAP timeline có SPLIT↔PIP transitions (slide full-screen + avatar PIP corner thumbnail), breathing yoyo zoom + beat-driven punch-in trên avatar, 5 scene compositions kiểu "tier-row" pattern (post-stack hook / chats-stack problem / hero-orb solution / counter-row recap / terminal-row CTA), optional cream-paper editorial infographic image slots với `<img onerror>` fallback, 6 SFX wired tại scene boundaries, **NO captions** (giọng avatar là spine). USE WHEN user nói "edit video 16:9 từ HeyGen MP4", "scaffold project landscape", "podcast keynote editor", "talking head + slide editor", "build hyperframes 1920×1080", "tạo project 16:9 từ avatar mp4", "scaffold 16:9 hyperframes", "hyperframe landscape vide

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Pipeline đóng gói: từ MP4 quay sẵn (talking head 9:16) tới HyperFrames preview project hoàn chỉnh có captions, SFX, zoom hooks, b-roll toàn cảnh có hiệu ứng rich, và CTA finale.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Audit bài Facebook / Reels / YouTube để phát hiện 4 downward drivers (over-branding, over-production, stock imagery, standardized aesthetic) + frequency-over-quality. Mỗi anti-pattern bị drop ~75% performance nếu hiện diện. USE WHEN user says 'audit content', 'check anti pattern', 'content có lỗi gì không', 'kiểm tra over branding', 'vì sao video bị chết', 'vì sao post không ai xem', 'content audit', 'kiểm tra chất lượng content'.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Tìm viral pattern ở ngành khác (bác sĩ, luật sư, tài chính, bất động sản, thủ công) có thể apply cho niche AI/automation của Hoang. Ngách AI educator VN còn ít format được khai thác — cross-industry adaptation là blue ocean. USE WHEN user says 'tìm format ngành khác', 'cross industry research', 'học format từ ngành khác', 'blue ocean format', 'tìm format chưa ai làm', 'adapt format từ niche khác', 'cross industry viral'.

lexuanthanhhy/MKT.LANDINGPAGE.SKILLS

Rewrite CTA kiểu autocratic (Mua ngay! Follow ngay! Đăng ký liền!) sang 3 variants Democratic / Benevolent / Laissez-faire — reach 85% dân số thay vì chỉ 5% (action-based). Áp dụng cho landing page, caption FB, CTA video, email. USE WHEN user says 'rewrite cta', 'sửa cta', 'cta không autocratic', 'viết lại kêu gọi hành động', 'cta cho landing page', 'cta nhẹ nhàng hơn', 'inclusive cta', 'cta democratic benevolent'.

Skills associés