Communitygithub.com

Varnan-Tech/opendirectory

Gera um sizzle reel ou hype video de alta energia (MP4) a partir de ativos de marca e mensagens-chave. Formato de montagem acelerada com cortes dinâmicos, sobreposições de texto em negrito e música opcional. Estrutura de 4 seções: Abertura Fria, Construção, Pico, Aterrissagem. 4 predefinições de tom. Cortes sincronizados com a batida quando a música é fornecida. Construído no HyperFrames (GSAP + Chromium headless + FFmpeg).

O que é opendirectory?

Esta skill gera vídeos de hype (sizzle reels) de alta energia no formato MP4, ideais para lançamentos de produtos, apresentações para investidores, aberturas de conferências e montagens de marca. O processo é totalmente baseado em tecnologia de código aberto (HyperFrames, GSAP, Chromium headless e FFmpeg), sem depender de APIs de IA de vídeo como Runway ou Pika, o que elimina custos de runtime. A estrutura do vídeo é dividida em quatro seções: Abertura Fria (cria tensão sem citar a marca), Construção (exibe as mensagens-chave em cortes rápidos), Pico (repete a mensagem mais forte em destaque) e Aterrissagem (apresenta o nome da marca, slogan e CTA). A skill oferece quatro predefinições de tom (energético, cinematográfico, emocional, profissional) e suporta sincronização com a batida da música fornecida. Plataformas suportadas: Claude Code, Cursor, Codex e outros agentes com acesso a Node.js e FFmpeg. O usuário deve fornecer de 3 a 5 frases de impacto (mensagens-chave) para exibição na tela; a skill as organiza e anima automaticamente seguindo 11 regras críticas de composição, incluindo a proibição de usar Math.random() (exige PRNG determinístico) e a obrigatoriedade de declarar o padrão rítmico no código.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

sizzle-reel-de-video

Gera um sizzle reel ou hype video de alta energia a partir de ativos de marca e mensagens-chave. Pipeline: Composição HTML HyperFrames (linhas do tempo GSAP) → Chromium headless → FFmpeg H.264 MP4. Sem Runway. Sem Pika. Sem APIs de vídeo com IA. Custo de runtime zero além do Node.js + FFmpeg.

Diferenciação do vid-product-launch:

  • vid-product-launch conta uma história narrativa — uma revelação merecida, cinco seções, arco de tensão
  • vid-sizzle-reel cria energia e empolgação — cortes rápidos, música em primeiro lugar, sem um único momento de história

Regras Críticas (leia antes de cada geração)

  1. Escreva as mensagens-chave você mesmo — ou peça para o usuário escrevê-las. Estas são as frases exatas que aparecem na tela. "A IA vai descobrir" produz conteúdo genérico. 3-5 linhas afiadas são todo o conteúdo de um sizzle reel.

  2. O nome da marca aparece APENAS na seção Aterrissagem. A Abertura Fria e a Construção criam tensão sem nomear a marca. A seção Aterrissagem é a recompensa.

  3. Declare o padrão rítmico em um comentário no topo do script antes de escrever qualquer HTML. Formato: // RITMO: sequencia-flash | Fria[0-5s]: stat | Construcao[5-40s]: msg(1.5s)|flash|... | Pico[40-55s]: ... | Aterrissagem[55-60s]: logo+CTA. Cada decisão de tempo é verificada em relação a este padrão.

  4. Construa o layout de estado final em CSS primeiro — ainda sem GSAP. Posicione cada elemento em seu momento mais visível em CSS estático. Em seguida, adicione entradas GSAP com gsap.from() e saídas com gsap.to(). Nunca posicione no estado inicial animado.

  5. class="clip" em cada elemento temporizado. Obrigatório pelo HyperFrames. Sem isso, o elemento fica invisível para o player.

  6. data-start, data-duration, data-track-index em cada clip. Sem exceções. Clips no mesmo track não podem se sobrepor — use índices de track diferentes.

  7. Sem Math.random(). O HyperFrames exige composições determinísticas. Use PRNG com semente (mulberry32) para quaisquer valores pseudo-aleatórios.

  8. Todas as linhas do tempo GSAP começam { paused: true } e são registradas em window.__timelines["comp-id"]. O player HyperFrames controla a reprodução — nunca chame tl.play().

  9. Nunca use position: absolute em contêineres .scene-content. Use width:100%; height:100%; padding:Npx; display:flex. Reserve position:absolute apenas para elementos decorativos.

  10. Música: elemento <audio> separado com data-track-index. O vídeo deve ter muted playsinline. Nunca coloque áudio em um elemento <video>.

  11. Leia references/cut-patterns.md E references/tone-presets.md antes de gerar qualquer HTML.

  12. Nunca despeje HTML no chat. Salve em arquivo. Mostre apenas o resumo.


Passo 1: Coleta de Informações

Obrigatório:

  • mensagens_chave — 3-5 linhas impactantes para exibir na tela (o usuário deve escrevê-las)

Parâmetros opcionais e valores padrão:

ParâmetroPadrãoDescrição
ativos_marcanenhumURL/caminho do logotipo, cores da marca (hex), capturas de tela principais
tomenergéticoenergético / cinematográfico / emocional / profissional
musicanenhumCaminho do arquivo ou string BPM/gênero (ex.: "128bpm eletronica")
duracao6030 / 60 / 90 segundos
proporcao_tela9:169:16 (1080x1920) / 16:9 (1920x1080)
estilo_corteautorápido (1-2s) / cinematográfico (3-5s) — auto deriva do tom
cartao_finalautoLogotipo + slogan + URL CTA para a seção Aterrissagem

estilo_corte auto-padrão: energético → rápido; profissional → rápido (2s); cinematográfico → cinematográfico; emocional → misto

Se mensagens_chave estiver faltando, pergunte exatamente:

"Para gerar o sizzle reel, preciso das suas mensagens-chave — as frases exatas que aparecerão na tela. Me dê 3-5 linhas impactantes. Estas são a coisa mais importante que você está escrevendo para este vídeo.

Exemplos: 'Usado por mais de 500 equipes de crescimento' / 'De dias para minutos' / 'Funciona com Claude, Codex, Gemini'

Também é útil: tom (energético/cinematográfico/emocional/profissional), duração (30/60/90s), quaisquer cores da marca ou URL do logotipo."

Se as mensagens_chave estiverem presentes → vá para o Passo 2 imediatamente.


Passo 2: Instalar HyperFrames

Instale as skills HyperFrames (apenas na primeira vez — pule se já instalado):

npx skills add heygen-com/hyperframes

Verifique o ambiente:

node --version   # deve ser >= 22
ffmpeg -version  # deve estar presente

Inicialize o projeto:

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

Slug: kebab-case a partir do nome da marca do cartão_final ou da primeira mensagem_chave, máximo de 25 caracteres.


Passo 3: Arquitetura Interna (nunca mostrada ao usuário)

1. Derive o tempo dos cortes a partir da duracao + estilo_corte:

Seção30s60s90s
Abertura Fria0-5s0-5s0-8s
Construção5-25s5-40s8-65s
Pico25-28s40-55s65-80s
Aterrissagem28-30s55-60s80-90s

Converta cada limite para milissegundos. Calcule a duração por cena a partir do estilo_corte:

  • rápido: 1.2s-1.8s por mensagem (use 1.5s padrão)
  • cinematográfico: 3.5s-5.0s por mensagem (use 4.0s padrão)
  • misto: 2.0s-4.0s variando por energia da seção

2. Mapeie mensagens_chave para as cenas:

  • Abertura Fria (1 cena): uma estatística ou pergunta de impacto — NENHUM nome de marca, constrói intriga
  • Construção: uma cena por mensagem_chave
  • Pico: repita a mensagem mais forte em escala dupla, ou combine 2 mensagens em flash rápido
  • Aterrissagem: nome da marca + slogan + URL CTA

3. Detecte sincronização com a batida se a música for fornecida:

npx hyperframes tts --analyze-beats [arquivo-musica]

Se indisponível, calcule a partir do BPM: batida_ms = 60000 / BPM. Alinhe os cortes a cada 2ª batida.

4. Selecione a predefinição de tom — leia references/tone-presets.md para tokens CSS.

5. Declare o padrão rítmico — escreva comentário no topo do script:

// RITMO: sequencia-flash
// Abertura Fria [0-5000ms]: stat
// Construcao [5000-40000ms]: msg-1(1500ms)|flash|msg-2(1500ms)|flash|msg-3(1500ms)|flash|msg-4(1500ms)|flash|constr-acum(10000ms)
// Pico [40000-55000ms]: msg-mais-forte(1200ms)|flash|msg-2nd(1200ms)|flash|SEGURA(5600ms)
// Aterrissagem [55000-60000ms]: logo+slogan+cta

6. Determine as dimensões em pixels:

  • 9:16 → L=1080, A=1920 (padrão — Instagram Reels, TikTok, YouTube Shorts)
  • 16:9 → L=1920, A=1080

Passo 4: Composição HTML HyperFrames

Leia references/cut-patterns.md e a skill HyperFrames (/hyperframes) antes de escrever qualquer código.

Estrutura HTML obrigatória:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
[link CDN de fonte da predefinição de tom]
<style>
:root {
  [todos os tokens CSS da predefinição de tom]
}

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

  [se corte-flash: verdadeiro]
  <div id="corte-flash"
    style="position:absolute;inset:0;background:var(--corte-flash-bg);opacity:0;pointer-events:none;z-index:200"></div>
  [fim se]

  [se granulado-filme: verdadeiro]
  <canvas id="sobreposicao-granulado"
    width="240" height="135"
    style="position:absolute;inset:0;width:[L]px;height:[A]px;pointer-events:none;opacity:0.022;mix-blend-mode:overlay;z-index:50"></canvas>
  [fim se]

  [se vinheta: verdadeiro]
  <div id="sobreposicao-vinheta"
    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>
  [fim se]

  <!-- Cenas — uma div por cena -->
  <div id="cena-fria"
    class="clip"
    data-start="0"
    data-duration="5"
    data-track-index="0"
    style="position:absolute;inset:0;opacity:0"
  >
    <div class="conteudo-cena" style="width:100%;height:100%;padding:120px;display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box">
      [conteúdo da abertura fria — uma estatística ou frase de impacto, sem nome de marca]
    </div>
  </div>

  [uma div por cena da Construção, data-start incrementa pela duração do corte]
  [cena(s) do Pico]
  [cena da Aterrissagem — nome da marca + slogan + CTA]

  [se música fornecida]
  <audio id="musica"
    class="clip"
    data-start="0"
    data-duration="[duracao_total]"
    data-track-index="10"
    data-volume="0.85"
    src="[caminho_musica]"
  ></audio>
  [fim se]

  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
  <script>
  // ── DECLARAÇÃO DE RITMO ──────────────────────────────────────────────────────
  // RITMO: [sequencia-flash | segurada-cinematografica | sincronia-batida | mista]
  // Abertura Fria [0-Nms]: ...
  // Construcao [N-Nms]: ...
  // Pico [N-Nms]: ...
  // Aterrissagem [N-Nms]: ...

  // ── PRNG COM SEMENTE (apenas para granulado — nenhum outro valor aleatório) ───
  function mulberry32(semente) {
    return function() {
      semente |= 0; semente = semente + 0x6D2B79F5 | 0;
      let t = Math.imul(semente ^ semente >>> 15, 1 | semente);
      t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
      return ((t ^ t >>> 14) >>> 0) / 4294967296;
    };
  }

  [se granulado-filme: verdadeiro]
  // ── GRANULADO DE FILME (apenas cinematográfico/emocional) ─────────────────────
  const canvasGranulado = document.getElementById('sobreposicao-granulado');
  const ctxGranulado = canvasGranulado ? canvasGranulado.getContext('2d') : null;
  // Granulado atualizado pelo ticker GSAP (não por captura por quadro — HyperFrames lida com isso)
  [fim se]

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

  // ── ABERTURA FRIA ───────────────────────────────────────────────────────────────
  [animações de entrada e saída da abertura fria — veja cut-patterns.md para o padrão exato]

  // ── SEÇÃO DE CONSTRUÇÃO ─────────────────────────────────────────────────────────
  [animações por mensagem — sequencia-flash ou segurada-cinematográfica de cut-patterns.md]

  // ── SEÇÃO DE PICO ───────────────────────────────────────────────────────────────
  [animações do pico — mesmo padrão da construção, mas com tempo mais apertado]

  // ── SEÇÃO DE ATERRISSAGEM ───────────────────────────────────────────────────────
  [entradas da aterrissagem — logotipo, slogan, CTA. Sem saída — segura até o fim]

  // ── REGISTRO DA LINHA DO TEMPO ──────────────────────────────────────────────────
  window.__timelines = window.__timelines || {};
  window.__timelines["sizzle-[slug]"] = tl;
  </script>
</div>
</body>
</html>

Regras de qualidade de design:

  • Estatística da abertura fria: tamanho de fonte ≥160px para 16:9, ≥100px para 9:16
  • Mensagens-chave: tamanho de fonte ≥80px — legível rapidamente
  • Nome da marca na seção Aterrissagem: ≥120px para 16:9
  • Todas as cores das variáveis de token da predefinição — nenhum hex livre, exceto var(--accent) literal hex dentro do canvas fillStyle
  • conteudo-cena sempre usa padding + flex — nunca position:absolute no contêiner de conteúdo
  • class="clip" em cada elemento com data-start

Passo 5: Auto-QA (corrija todas as falhas antes do Passo 6)

Conteúdo:

  • mensagens_chave — cada frase aparece exatamente uma vez, sem duplicatas
  • Nome da marca aparece APENAS na seção Aterrissagem (não na abertura fria, nem na construção, nem no pico)
  • Abertura fria não contém NENHUM nome de marca e NENHUM nome de produto — apenas estatística ou frase de impacto
  • Seção Aterrissagem tem: nome da marca + slogan + URL CTA (três elementos no mínimo)
  • URL CTA do cartão_final presente no quadro final

Contrato HyperFrames:

  • class="clip" em cada elemento com data-start
  • data-start, data-duration, data-track-index em cada clip
  • data-composition-id na div raiz da composição
  • window.__timelines["sizzle-[slug]"] = tl registrado
  • Todas as linhas do tempo começam { paused: true }
  • Sem Math.random() — apenas PRNG com semente
  • Nenhuma chamada tl.play() ou tl.resume()

GSAP / Layout:

  • gsap.from() para todas as entradas (FROM fora da tela TO posição CSS)
  • gsap.to() para todas as saídas (FROM posição CSS TO fora da tela)
  • Sem position:absolute em contêineres .scene-content
  • Padrão rítmico declarado em comentário no topo do script

Tempo dos cortes:

  • Tom rápido: duração média do corte ≤ 2.0s
  • Tom cinematográfico: duração média do corte ≥ 3.0s
  • Flash de corte dispara em cada limite de corte para tom energético (60ms, opacidade 0→1→0)
  • Clips no mesmo track NÃO se sobrepõem (verifique todos os agrupamentos de data-track-index)

Efeitos Sonoros:

  • window.__sfxTimeline presente e colocado antes do registro da linha do tempo
  • word-hit por mensagem-chave
  • whoosh na transição Construção → Pico
  • cta-chime no início da Aterrissagem
  • Nenhum efeito sonoro dispara antes de 500ms

Passo 6: Lint, Renderizar, Saída

npx hyperframes lint
npx hyperframes inspect --json

Corrija todos os erros de lint. Corrija todos os erros de inspeção (estouro de texto, clips escapando de contêineres). Em seguida, renderize:

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

Saída:

## Sizzle Reel: [nome da marca do cartão_final]
Tom: [tom] | Duração: [N]s | Estilo de corte: [estilo_corte] | Proporção: [proporcao]
Ritmo: [padrão declarado]

Seções
  Abertura Fria [0-Ns]:  [estatística ou frase de impacto]
  Construção     [N-Ns]:  [N mensagens-chave listadas]
  Pico      [N-Ns]:  [mensagem mais forte em escala máxima]
  Aterrissagem      [N-Ns]:  [nome da marca] + "[slogan]" + [URL CTA]

Arquivos
  Fonte: sizzle/[slug]/index.html
  Saída: sizzle/[slug]/sizzle-reel.mp4

Linha do Tempo de Efeitos Sonoros (embutida em cada composição)

O mesmo sistema de efeitos sonoros sintetizados por FFmpeg do vid-product-launch. Coloque window.__sfxTimeline imediatamente antes do registro da linha do tempo GSAP.

Referência de tipo de efeito sonoro para sizzle reel:

TipoSomDuraçãoPosicionamento
word-hitSoco sub (50Hz) + clique transitório (2.2kHz) + ruído burst180msUm por início de cena de mensagem_chave
whooshVarredura de ruído de duas bandas (corpo 1.1kHz + ar 4-8kHz)700msNo limite Construção → Pico
cta-chimeAcorde A maior (440+554+659+880Hz) + brilho de sino aecho1.2sExatamente no início da Aterrissagem
window.__sfxTimeline = [
  // um word-hit por mensagem_chave (calculado a partir dos tempos de início da cena)
  { ms: MSG_1_INICIO_MS,           sfx: 'word-hit',   vol: 0.50 },
  { ms: MSG_2_INICIO_MS,           sfx: 'word-hit',   vol: 0.50 },
  { ms: MSG_3_INICIO_MS,           sfx: 'word-hit',   vol: 0.50 },
  // ... repita para cada mensagem
  { ms: PICO_INICIO_MS - 700,      sfx: 'whoosh',     vol: 0.55 },
  { ms: ATERRISSAGEM_INICIO_MS,            sfx: 'cta-chime',  vol: 0.65 },
];

Calcule todos os valores de ms a partir das seções declaradas...

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.

Habilidades Relacionadas