Communitygithub.com

Varnan-Tech/opendirectory

Génère une bande-annonce dynamique (MP4) à partir d'actifs de marque et de messages clés. Montage rythmé, coupes vives, superpositions de texte audacieuses et musique optionnelle.

Qu'est-ce que opendirectory ?

Cette compétence d'agent AI permet de créer automatiquement des vidéos promotionnelles de type « sizzle reel » ou bande-annonce hype, destinées aux réseaux sociaux (Reels, TikTok, YouTube Shorts), aux présentations investisseurs ou aux conférences. Elle transforme des messages clés (3 à 5 phrases) en un montage vidéo structuré en quatre sections : Cold Open (accroche), Build (montée en puissance), Peak (point culminant) et Land (révélation de la marque + CTA). L'utilisateur peut choisir parmi quatre ambiances (énergique, cinématique, émotionnelle, professionnelle), une durée de 30 à 90 secondes, et peut fournir un fichier musical pour synchroniser les coupes sur le rythme (beat-sync). Le système repose sur HyperFrames, une chaîne de production qui assemble des animations GSAP en HTML, les rend via un Chromium sans affichage, et encode le résultat en MP4 avec FFmpeg — sans aucune API vidéo AI payante. La compétence impose des règles strictes pour garantir une qualité professionnelle : les messages sont écrits par l'utilisateur (pas de remplissage AI), le nom de la marque n'apparaît que dans la section finale, et le code HTML est généré localement avec un contrôle total sur les transitions, les superpositions de texte et les effets sonores synthétisés. Elle s'intègre aux outils de développement comme Claude Code, Cursor ou Codex via l'installation de packages npm et des commandes en ligne de commande.

Compatible avec✓Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/Varnan-Tech/opendirectory/tree/main/skills/vid-sizzle-reel

Demander à votre IA préférée

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

Documentation

vid-sizzle-reel

Génère une bande-annonce dynamique ou une vidéo hype à partir d'actifs de marque et de messages clés. Pipeline : Composition HTML HyperFrames (timelines GSAP) → Chromium sans affichage → FFmpeg H.264 MP4. Pas de Runway. Pas de Pika. Pas d'API vidéo AI. Zéro coût d'exécution au-delà de Node.js + FFmpeg.

Différenciation par rapport à vid-product-launch :

  • vid-product-launch raconte une histoire narrative — un seul dévoilement progressif, cinq sections, arc de tension
  • vid-sizzle-reel crée de l'énergie et de l'excitation — coupes rapides, la musique en premier, pas d'histoire unique

Règles critiques (à lire avant chaque génération)

  1. Écrivez vous-même les messages clés — ou demandez à l'utilisateur de les écrire. Ce sont les phrases exactes qui apparaissent à l'écran. "L'IA va trouver" produit du remplissage. 3 à 5 lignes percutantes constituent tout le contenu d'une bande-annonce.

  2. Le nom de la marque apparaît UNIQUEMENT dans la section Land. Le Cold Open et le Build créent de la tension sans nommer la marque. La section Land est la récompense.

  3. Déclarez le motif rythmique dans un commentaire en haut du script avant d'écrire du HTML. Format : // RYTHME : flash-sequence | Cold[0-5s] : stat | Build[5-40s] : msg(1.5s)|flash|... | Peak[40-55s] : ... | Land[55-60s] : logo+CTA. Chaque décision de timing est vérifiée par rapport à cela.

  4. Construisez d'abord la disposition finale en CSS — pas encore de GSAP. Positionnez chaque élément à son moment le plus visible en CSS statique. Ajoutez ensuite les entrées GSAP avec gsap.from() et les sorties avec gsap.to(). Ne positionnez jamais à l'état de départ animé.

  5. class="clip" sur chaque élément temporisé. Requis par HyperFrames. Sans cela, l'élément est invisible pour le lecteur.

  6. data-start, data-duration, data-track-index sur chaque clip. Aucune exception. Les clips sur la même piste ne peuvent pas se chevaucher — utilisez des index de pistes différents.

  7. Pas de Math.random(). HyperFrames nécessite des compositions déterministes. Utilisez un PRNG basé sur une graine (mulberry32) pour toute valeur pseudo-aléatoire.

  8. Toutes les timelines GSAP commencent par { paused: true } et s'enregistrent dans window.__timelines["comp-id"]. Le lecteur HyperFrames contrôle la lecture — n'appelez jamais tl.play().

  9. Jamais position: absolute sur les conteneurs .scene-content. Utilisez width:100%; height:100%; padding:Npx; display:flex. Réservez position:absolute uniquement pour les éléments décoratifs.

  10. Musique : élément <audio> séparé avec data-track-index. La vidéo doit être muted playsinline. Ne mettez jamais d'audio dans un élément <video>.

  11. Lisez references/cut-patterns.md ET references/tone-presets.md avant de générer du HTML.

  12. Ne déversez jamais de HTML dans le chat. Sauvegardez dans un fichier. Affichez uniquement le résumé.


Étape 1 : Réception

Requis :

  • key_messages — 3 à 5 lignes percutantes à afficher à l'écran (l'utilisateur doit les écrire)

Paramètres optionnels et valeurs par défaut :

ParamètreValeur par défautDescription
brand_assetsaucunURL/chemin du logo, couleurs de la marque (hex), captures d'écran clés
toneenergeticenergetic / cinematic / emotional / professional
musicaucunChemin du fichier, ou chaîne BPM/genre (ex. "128bpm electronic")
duration6030 / 60 / 90 secondes
aspect_ratio9:169:16 (1080x1920) / 16:9 (1920x1080)
cut_styleautofast (1-2s) / cinematic (3-5s) — auto dérive de tone
end_cardautoLogo + tagline + URL CTA pour la section Land

cut_style par défaut automatique : energetic → fast ; professional → fast (2s) ; cinematic → cinematic ; emotional → mixed

Si key_messages est manquant, demandez exactement :

"Pour générer la bande-annonce, j'ai besoin de vos messages clés — les phrases exactes qui s'afficheront à l'écran. Donnez-moi 3 à 5 lignes percutantes. C'est la chose la plus importante que vous écrivez pour cette vidéo.

Exemples : 'Utilisé par plus de 500 équipes de croissance' / 'De jours à minutes' / 'Fonctionne avec Claude, Codex, Gemini'

Utile aussi : ambiance (energetic/cinematic/emotional/professional), durée (30/60/90s), couleurs de marque ou URL du logo."

Si key_messages sont présents → passez à l'Étape 2 immédiatement.


Étape 2 : Installer HyperFrames

Installez les compétences HyperFrames (première fois seulement — ignorez si déjà installé) :

npx skills add heygen-com/hyperframes

Vérifiez l'environnement :

node --version   # doit être >= 22
ffmpeg -version  # doit être présent

Scaffoldez le projet :

npx hyperframes init sizzle-[slug] --example kinetic-type --non-interactive
cd sizzle-[slug]

Slug : kebab-case à partir du nom de marque de end_card ou du premier key_message, max 25 caractères.


Étape 3 : Architecture interne (jamais montrée à l'utilisateur)

1. Dérivez le timing des coupes à partir de duration + cut_style :

Section30s60s90s
Cold Open0-5s0-5s0-8s
Build5-25s5-40s8-65s
Peak25-28s40-55s65-80s
Land28-30s55-60s80-90s

Convertissez chaque limite en millisecondes. Calculez la durée par scène à partir de cut_style :

  • fast : 1.2s-1.8s par message (utilisez 1.5s par défaut)
  • cinematic : 3.5s-5.0s par message (utilisez 4.0s par défaut)
  • mixed : 2.0s-4.0s variable selon l'énergie de la section

2. Mappez les key_messages aux scènes :

  • Cold Open (1 scène) : une statistique ou une question impactante — PAS de nom de marque, suscite l'intrigue
  • Build : une scène par key_message
  • Peak : répétez le message le plus fort à double échelle, ou combinez 2 messages en flash rapide
  • Land : nom de la marque + tagline + URL CTA

3. Détectez la synchronisation sur le rythme si musique fournie :

npx hyperframes tts --analyze-beats [music-file]

Si indisponible, calculez à partir du BPM : beat_ms = 60000 / BPM. Alignez les coupes sur chaque 2ème temps.

4. Sélectionnez le préréglage d'ambiance — lisez references/tone-presets.md pour les jetons CSS.

5. Déclarez le motif rythmique — écrivez un commentaire en haut du script :

// RYTHME : flash-sequence
// Cold Open [0-5000ms] : stat
// Build [5000-40000ms] : msg-1(1500ms)|flash|msg-2(1500ms)|flash|msg-3(1500ms)|flash|msg-4(1500ms)|flash|build-accum(10000ms)
// Peak [40000-55000ms] : msg-fort(1200ms)|flash|msg-2e(1200ms)|flash|HOLD(5600ms)
// Land [55000-60000ms] : logo+tagline+cta

6. Déterminez les dimensions en pixels :

  • 9:16 → L=1080, H=1920 (par défaut — Instagram Reels, TikTok, YouTube Shorts)
  • 16:9 → L=1920, H=1080

Étape 4 : Composition HTML HyperFrames

Lisez references/cut-patterns.md et la compétence HyperFrames (/hyperframes) avant d'écrire du code.

Squelette HTML requis :

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
[lien CDN de police depuis le préréglage d'ambiance]
<style>
:root {
  [tous les jetons CSS du préréglage d'ambiance]
}

*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
</style>
</head>
<body>
<div
  data-composition-id="sizzle-[slug]"
  data-width="[L]"
  data-height="[H]"
  style="position:relative;width:[L]px;height:[H]px;overflow:hidden;background:var(--bg)"
>

  [si cut-flash: true]
  <div id="cut-flash"
    style="position:absolute;inset:0;background:var(--cut-flash-bg);opacity:0;pointer-events:none;z-index:200"></div>
  [fin si]

  [si film-grain: true]
  <canvas id="grain-overlay"
    width="240" height="135"
    style="position:absolute;inset:0;width:[L]px;height:[H]px;pointer-events:none;opacity:0.022;mix-blend-mode:overlay;z-index:50"></canvas>
  [fin si]

  [si vignette: true]
  <div id="vignette-overlay"
    style="position:absolute;inset:0;background:radial-gradient(ellipse at center,transparent 35%,rgba(0,0,0,0.65) 100%);pointer-events:none;z-index:51"></div>
  [fin si]

  <!-- Scènes — un div par scène -->
  <div id="scene-cold"
    class="clip"
    data-start="0"
    data-duration="5"
    data-track-index="0"
    style="position:absolute;inset:0;opacity:0"
  >
    <div class="scene-content" style="width:100%;height:100%;padding:120px;display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box">
      [contenu du cold open — une statistique ou une phrase impactante, pas de nom de marque]
    </div>
  </div>

  [un div par scène Build, data-start incrémenté de la durée de coupe]
  [scène(s) Peak]
  [scène Land — nom de marque + tagline + CTA]

  [si musique fournie]
  <audio id="music"
    class="clip"
    data-start="0"
    data-duration="[durée_totale]"
    data-track-index="10"
    data-volume="0.85"
    src="[chemin_musique]"
  ></audio>
  [fin si]

  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
  <script>
  // ── DÉCLARATION DU RYTHME ──────────────────────────────────────────────────────
  // RYTHME : [flash-sequence | cinematic-hold | beat-sync | mixed]
  // Cold Open [0-Nms] : ...
  // Build [N-Nms] : ...
  // Peak [N-Nms] : ...
  // Land [N-Nms] : ...

  // ── PRNG BASÉ SUR GRAINE (pour grain uniquement — pas d'autres valeurs aléatoires) ───────────────────
  function mulberry32(seed) {
    return function() {
      seed |= 0; seed = seed + 0x6D2B79F5 | 0;
      let t = Math.imul(seed ^ seed >>> 15, 1 | seed);
      t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
      return ((t ^ t >>> 14) >>> 0) / 4294967296;
    };
  }

  [si film-grain: true]
  // ── GRANULATION DE FILM (cinématique/émotionnelle uniquement) ───────────────────────────────────
  const grainCanvas = document.getElementById('grain-overlay');
  const grainCtx = grainCanvas ? grainCanvas.getContext('2d') : null;
  // Grain mis à jour par le ticker GSAP (pas de capture par trame — HyperFrames gère cela)
  [fin si]

  // ── TIMELINE GSAP ───────────────────────────────────────────────────────────
  const tl = gsap.timeline({ paused: true });

  // ── COLD OPEN ───────────────────────────────────────────────────────────────
  [tweens d'entrée et de sortie du cold open — voir cut-patterns.md pour le motif exact]

  // ── SECTION BUILD ───────────────────────────────────────────────────────────
  [tweens par message — flash-sequence ou cinematic-hold depuis cut-patterns.md]

  // ── SECTION PEAK ─────────────────────────────────────────────────────────────
  [tweens du peak — même motif que build mais timing plus serré]

  // ── SECTION LAND ─────────────────────────────────────────────────────────────
  [entrées du land — logo, tagline, CTA. Pas de sortie — tient jusqu'à la fin]

  // ── ENREGISTREMENT DE LA TIMELINE ────────────────────────────────────────────────────
  window.__timelines = window.__timelines || {};
  window.__timelines["sizzle-[slug]"] = tl;
  </script>
</div>
</body>
</html>

Règles de qualité de conception :

  • Statistique du cold open : taille de police ≥160px pour 16:9, ≥100px pour 9:16
  • Messages clés : taille de police ≥80px — lisibles en un coup d'œil
  • Section Land, nom de marque : ≥120px pour 16:9
  • Toutes les couleurs proviennent des variables de jetons prédéfinies — pas de hex libre sauf var(--accent) hex littéral à l'intérieur de canvas fillStyle
  • scene-content utilise toujours padding + flex — jamais position:absolute sur le conteneur de contenu
  • class="clip" sur chaque élément avec data-start

Étape 5 : Auto-QA (corrigez chaque échec avant l'Étape 6)

Contenu :

  • key_messages — chaque phrase apparaît exactement une fois, pas de doublons
  • Le nom de la marque apparaît UNIQUEMENT dans la section Land (pas dans cold open, build ou peak)
  • Le cold open ne contient NI nom de marque NI nom de produit — seulement une statistique ou phrase impactante
  • La section Land contient : nom de marque + tagline + URL CTA (trois éléments minimum)
  • L'URL CTA de end_card est présente sur l'image finale

Contrat HyperFrames :

  • class="clip" sur chaque élément avec data-start
  • data-start, data-duration, data-track-index sur chaque clip
  • data-composition-id sur le div de composition racine
  • window.__timelines["sizzle-[slug]"] = tl enregistré
  • Toutes les timelines commencent par { paused: true }
  • Pas de Math.random() — PRNG basé sur graine uniquement
  • Pas d'appels tl.play() ou tl.resume()

GSAP / Disposition :

  • gsap.from() pour toutes les entrées (DE hors écran VERS position CSS)
  • gsap.to() pour toutes les sorties (DE position CSS VERS hors écran)
  • Pas de position:absolute sur les conteneurs .scene-content
  • Motif rythmique déclaré en commentaire en haut du script

Timing des coupes :

  • Ambiance fast : durée moyenne de coupe ≤ 2.0s
  • Ambiance cinematic : durée moyenne de coupe ≥ 3.0s
  • Le flash de coupe se déclenche à chaque limite de coupe pour l'ambiance energetic (60ms, opacité 0→1→0)
  • Les clips sur la même piste ne se chevauchent PAS (vérifiez tous les regroupements data-track-index)

Effets sonores :

  • window.__sfxTimeline présent et placé avant l'enregistrement de la timeline
  • word-hit par message clé
  • whoosh à la transition Build → Peak
  • cta-chime au début du Land
  • Aucun effet sonore ne se déclenche avant 500ms

Étape 6 : Linting, Rendu, Sortie

npx hyperframes lint
npx hyperframes inspect --json

Corrigez toutes les erreurs de lint. Corrigez toutes les erreurs d'inspection (débordement de texte, clips s'échappant des conteneurs). Ensuite, effectuez le rendu :

npx hyperframes render --output sizzle/[slug]/sizzle-reel.mp4

Sortie :

## Bande-annonce : [nom de marque depuis end_card]
Ambiance : [tone] | Durée : [N]s | Style de coupe : [cut_style] | Format : [ratio]
Rythme : [motif déclaré]

Sections
  Cold Open [0-Ns] :  [statistique ou phrase impactante]
  Build     [N-Ns] :  [N messages clés listés]
  Peak      [N-Ns] :  [message le plus fort à l'échelle maximale]
  Land      [N-Ns] :  [nom de marque] + "[tagline]" + [URL CTA]

Fichiers
  Source : sizzle/[slug]/index.html
  Sortie : sizzle/[slug]/sizzle-reel.mp4

Timeline d'effets sonores (à intégrer dans chaque composition)

Le même système d'effets sonores synthétisés par FFmpeg que vid-product-launch. Placez window.__sfxTimeline immédiatement avant l'enregistrement de la timeline GSAP.

Référence des types d'effets sonores pour la bande-annonce :

TypeSonDuréePlacement
word-hitCoup de poing grave (50Hz) + clic transitoire (2.2kHz) + bruit180msUn par début de scène key_message
whooshBalayage de bruit à deux bandes (1.1kHz corps + 4-8kHz air)700msÀ la limite Build → Peak
cta-chimeAccord majeur A (440+554+659+880Hz) + scintillement de cloche aecho1.2sExactement au début du Land
window.__sfxTimeline = [
  // un word-hit par key_message (calculé à partir des temps de début de scène)
  { ms: MSG_1_DEBUT_MS,           sfx: 'word-hit',   vol: 0.50 },
  { ms: MSG_2_DEBUT_MS,           sfx: 'word-hit',   vol: 0.50 },
  { ms: MSG_3_DEBUT_MS,           sfx: 'word-hit',   vol: 0.50 },
  // ... répétez pour chaque message
  { ms: PEAK_DEBUT_MS - 700,      sfx: 'whoosh',     vol: 0.55 },
  { ms: LAND_DEBUT_MS,            sfx: 'cta-chime',  vol: 0.65 },
];

Calculez toutes les valeurs ms à partir des limites de section déclarées dans le motif rythmique.


Références

Consultez references/cut-patterns.md pour les motifs de coupe par style de coupe et section. Consultez references/tone-presets.md pour les jetons CSS complets (couleurs, polices, tailles, dégradés) par préréglage d'ambiance.


Documentation générée par la compétence vid-sizzle-reel.

Individual skills in this repo

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

Varnan-Tech/opendirectory

Use when the user asks to generate a blog cover image, thumbnail, or article header. Automatically uses modern typography, brand logos, and Google Search grounding to create beautiful 16:9 images with Gemini 3.1 Flash Image Preview.

Varnan-Tech/opendirectory

World-class brand strategist and naming expert. Uses an interrogation-led discovery phase to extract your brand's DNA, then applies scientific naming frameworks (Phonosemantics) and automated multi-TLD domain checking.

Varnan-Tech/opendirectory

Use when the user asks to generate or update a project's CLAUDE or AGENTS context file from a codebase scan. Writes a focused file under 100 lines containing only the non-obvious build commands, conventions, and gotchas Claude Code needs.

Varnan-Tech/opendirectory

Use when the user wants to verify cold emails, enrich a lead list, or autonomously guess email addresses from a CSV using ValidEmail.co or the open-source Reacher engine.

Varnan-Tech/opendirectory

Competitive intelligence orchestrator tracking companies across 8+ platforms (GitHub, Twitter, Reddit, HN, PH, YC Jobs) with heat scores and AI briefings.

Varnan-Tech/opendirectory

Give it your product URL or description. It finds your top 5 competitors, runs three-track PR research across all of them (editorial, podcasts, communities), identifies which channels appear most frequently, looks up the journalist or host for each, and returns a tiered outreach list with story angles and ready-to-send cold pitch drafts tailored to your product. Use when asked to find PR opportunities, discover where competitors got featured, build a media outreach list, find which journalists cover my space, or get pitch templates for press coverage.

Varnan-Tech/opendirectory

Generate high-converting, deep-dive growth case studies in MDX format. Use this skill when asked to write a case study or blog post about a company's growth, tech stack, or product-led strategy. It handles the full pipeline (researching the company via Tavily, generating a 16:9 cover image, quality checking the draft, uploading assets to cloud storage, and pushing directly to the target repository).

Varnan-Tech/opendirectory

Scans your project for outdated npm, pip, Cargo, Go, or Ruby packages. Runs a CVE security audit. Fetches changelogs, summarizes breaking changes with Gemini, and opens one PR per risk group (patch, minor, major). Includes Diagnosis Mode for install conflicts. Use when asked to update dependencies, check for outdated packages, open dependency PRs, scan for package updates, audit for CVEs, or flag breaking changes in upgrades. Trigger when a user says "check for outdated packages", "update my dependencies", "open PRs for dependency updates", "scan for CVEs", or "which packages need upgrading".

Varnan-Tech/opendirectory

Generates and updates README.md and API reference docs by reading your codebase's functions, routes, types, schemas, and architecture. Uses graphify to build a knowledge graph first, then writes accurate docs from it. Use when asked to write docs, generate a README, document an API, update stale docs, create an API reference from code, add an architecture section, or document a project in any language. Trigger when a user says their docs are missing, outdated, or wants to document their codebase without writing it manually.

Varnan-Tech/opendirectory

Evaluates expired domain candidates against a target niche, scores them by topical relevance, historical activity level, and history cleanliness, then outputs a ranked shortlist with explainable reasoning and risk flags.

Varnan-Tech/opendirectory

Brutally honest developer-experience audit for a GitHub repo. Scores 10 DX dimensions (time-to-first-success, README clarity, visual proof, install, quick-start, docs, examples, community, trust, marketing), writes a shareable roast in the requested tone (brutal/honest/kind), produces a prioritized action plan ranked by impact × effort, and sketches an ideal README. Trigger when user says "roast my repo", "audit my README", "dx audit", "developer experience review", "score my GitHub project", "before launch checklist", or "make my repo shareable".

Varnan-Tech/opendirectory

Drafts and designs a complete HTML email newsletter from a topic or content brief. Outputs paste-ready HTML for Loops, Mailchimp, Beehiiv, Resend, or any standard email platform. Includes subject line options and plain-text fallback. Trigger when a user says "write a newsletter", "draft an email newsletter", "create an HTML email", "design an email for my subscribers", or "write a newsletter about [topic]".

Varnan-Tech/opendirectory

Takes a GitHub PR URL or the current branch and writes a plain-English explanation of what it does and why, then posts it as a PR comment. Use when asked to explain a PR, summarize a pull request, write a plain-English description of a PR, add a summary comment to a PR, or understand what a PR changes. Trigger when a user says "explain this PR", "summarize this pull request", "what does this PR do", "add a comment explaining the PR", or shares a GitHub PR URL and asks what it does.

Varnan-Tech/opendirectory

Audit how often LLMs recommend your brand vs competitors and generate a GEO action plan.

Varnan-Tech/opendirectory

Takes a competitor's public GitHub repo URL, fetches their open issues via the GitHub REST API, filters noise locally, clusters issues into 6 demand categories, computes a demand score per issue and per cluster, and outputs a ranked demand gap report with a GTM messaging brief. Use when asked to scan a competitor's GitHub issues, find what their users are begging for, turn GitHub complaints into product positioning, identify competitor feature gaps, or generate messaging from real user demand. Trigger when a user says "scan competitor issues", "what are users asking for on X repo", "find demand gaps in Y", "turn GitHub issues into messaging", or "what should I build based on competitor complaints".

Varnan-Tech/opendirectory

Find recurring confusion in your repo's GitHub Discussions, rank it by urgency, and draft the actual docs fixes and content angles — with verbatim community quotes and source links as evidence.

Varnan-Tech/opendirectory

SEO keyword research workflow for blog generation using Google Trends data. Use when writing blog posts, planning content calendars, or optimizing articles for search engines. Finds breakout keywords, builds content structure, and generates SEO-optimized blog outlines targeting tech and developer audiences.

Varnan-Tech/opendirectory

Generates a professionally designed case study PDF for B2B SaaS sales and marketing. Supports 7 page layouts, 9 style presets, 1-4 page output. Trigger when user says "create a case study", "write a customer story", "make a case study PDF", "design a success story", "turn this customer win into a PDF".

Varnan-Tech/opendirectory

Generates data visualization charts (bar, line, area, pie, doughnut, scatter, radar, treemap) as PNG using Apache ECharts v6. 1080×1080px default, 5 style presets, highlight annotations. Trigger when user says "create a chart", "visualize data", "make a bar chart", "line graph", "pie chart", "data visualization", "chart this data", "plot", "graph", or "visualize these numbers".

Varnan-Tech/opendirectory

Fetches low-star App Store and Google Play reviews, clusters them into broken-promise patterns, and generates a ranked copy brief with positioning opportunities.

Skills associés