npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

feedgenie

v0.1.0

Published

Pipeline de skills para gerar posts de Instagram (post + carrossel) a partir de prompts.

Readme

FeedGenie

Gere posts e carrosséis de Instagram prontos para publicação a partir de um prompt — sem Canva, sem Photoshop, sem sair do terminal.

FeedGenie é um pipeline de skills + biblioteca Node.js que conecta Claude Code / Codex ao Playwright para transformar prompts em PNGs de 1080×1080 (post) ou 1080×1350 (carrossel). O agente cuida da parte criativa; a lib cuida do determinístico.

"crie um carrossel sobre erros em gráficas rápidas"
            │
            ▼
    FeedGenie (Claude Code skill)
    ├─ WebSearch → tendências e ângulos
    ├─ LLM → copy estruturado (JSON)
    ├─ Handlebars → HTML 1080px
    └─ Playwright → PNG pronto para Instagram

Índice

  1. Pré-requisitos
  2. Instalação rápida
  3. Instalar skills no Claude Code
  4. Usar com Codex CLI
  5. CLI — referência de comandos
  6. Schema do conteúdo
  7. API programática (TypeScript)
  8. Skills disponíveis
  9. Exemplos de prompt
  10. Configuração de tema
  11. Testes
  12. Roadmap

Pré-requisitos

| Requisito | Versão mínima | |---|---| | Node.js | 20+ | | npm | 10+ | | Claude Code CLI | qualquer versão recente | | Chromium (via Playwright) | instalado pelo script |


Instalação rápida

# 1. Clone o repositório
git clone https://github.com/hadagalberto/FeedGenie.git
cd FeedGenie

# 2. Instale dependências
npm install

# 3. Instale o Chromium para Playwright
npx playwright install chromium

# 4. Teste com os fixtures incluídos
npm run example:post        # → output/post.png (1080×1080)
npm run example:carousel    # → output/carousel/slide-01.png … slide-05.png

Instalar skills no Claude Code

As skills permitem que o Claude Code execute o pipeline completo a partir de linguagem natural.

Opção A — Script automático (recomendado)

Linux / macOS:

bash scripts/install-skills.sh

Windows (PowerShell):

.\scripts\install-skills.ps1

O script copia as 6 skills para ~/.claude/skills/feedgenie/ e confirma a instalação.

Opção B — Manual

mkdir -p ~/.claude/skills/feedgenie
cp skills/*.md ~/.claude/skills/feedgenie/

Verificar instalação

Abra uma nova sessão no Claude Code e diga:

"crie um post sobre controle de estoque para donos de salgados"

O agente deve iniciar o pipeline automaticamente.


Usar com Codex CLI

O arquivo AGENTS.md na raiz do repositório é lido automaticamente pelo Codex. Ao rodar o Codex dentro do diretório FeedGenie, ele já conhece todas as instruções do pipeline.

Para usar o FeedGenie em outro repositório via Codex, copie o conteúdo de skills/feedgenie-orchestrate.md para o AGENTS.md desse projeto.


CLI — referência de comandos

# Valida o JSON antes de renderizar (sempre recomendado)
npx feedgenie validate --content ./tmp/content.json

# Renderiza apenas o HTML (para preview no navegador)
npx feedgenie build-html --content ./tmp/content.json --out ./tmp/preview.html

# Renderiza PNG(s) + HTML + JSON no diretório de saída
npx feedgenie render --content ./tmp/content.json --out ./output/meu-post

O comando render detecta type: "post" ou "carousel" automaticamente e gera:

| Tipo | Arquivos gerados | |---|---| | post | post.png, post.html, post.json | | carousel | slide-01.png … slide-NN.png, slide-NN.html, carousel.json |


Schema do conteúdo

O arquivo JSON passado para a CLI segue um schema validado via Zod. Veja src/lib/schemas.ts para a fonte da verdade.

Post único (1080×1080)

{
  "type": "post",
  "theme": {
    "primaryColor": "#0F172A",
    "accentColor": "#F59E0B",
    "fontFamily": "Inter, 'Segoe UI', system-ui, sans-serif",
    "tone": "educativo",
    "niche": "salgados"
  },
  "hook": "Você está perdendo dinheiro sem perceber",
  "body": "Sem controle de estoque, ingredientes vencem e seu lucro some antes do fim do mês.",
  "cta": "Comece a controlar agora",
  "caption": "Caption longa para o Instagram (até 2200 chars).",
  "hashtags": ["#salgados", "#gestao", "#estoque"]
}

Carrossel (1080×1350 por slide)

{
  "type": "carousel",
  "theme": { "primaryColor": "#1E1B4B", "accentColor": "#FACC15", "fontFamily": "Inter, system-ui, sans-serif", "tone": "autoridade", "niche": "graficas" },
  "slides": [
    { "kind": "hook",     "title": "5 erros que custam caro", "body": "E como evitar todos antes do fechamento." },
    { "kind": "problem",  "title": "Sem padrão de orçamentos", "body": "Cada vendedor cota diferente, margem some." },
    { "kind": "explain",  "title": "Estoque no improviso",     "body": "Insumos parados ou faltando travam entregas." },
    { "kind": "solution", "title": "Centralize tudo",          "body": "Um sistema para cotar, comprar e produzir." },
    { "kind": "cta",      "title": "Quer ver na sua gráfica?", "body": "Manda GESTÃO no direct." }
  ],
  "caption": "Caption do carrossel.",
  "hashtags": ["#grafica", "#gestao"]
}

Limites por campo:

| Campo | Limite | |---|---| | hook | 160 chars | | body (post) | 800 chars | | slide.body | 400 chars | | slide.title | 120 chars | | caption | 2200 chars | | hashtags | 30 itens | | slides | 3–10 |

Valores válidos para tone: educativo · venda · storytelling · autoridade

Valores válidos para slide.kind: hook · problem · explain · solution · cta


API programática (TypeScript)

import {
  exportPost,
  exportCarousel,
  PostContentSchema,
  CarouselContentSchema,
} from "feedgenie";

// Post único
const content = PostContentSchema.parse(jsonInput);
const { png, html, json } = await exportPost(content, "./output/meu-post");
console.log(`PNG gerado em: ${png}`);

// Carrossel
const carousel = CarouselContentSchema.parse(jsonInput);
const { slides, json: carouselJson } = await exportCarousel(carousel, "./output/carousel");
console.log(`${slides.length} slides em: ${slides.map(s => s.png).join(", ")}`);

Skills disponíveis

Após a instalação, o Claude Code terá acesso a 6 skills:

| Skill | Função | |---|---| | feedgenie-orchestrate | Entry point — orquestra o pipeline completo | | feedgenie-research-topic | WebSearch + síntese de ângulos editoriais | | feedgenie-generate-copy | Gera o JSON de conteúdo validado | | feedgenie-build-html | Renderiza HTML para preview no navegador | | feedgenie-render-playwright | Converte HTML em PNG via Playwright | | feedgenie-export-images | Confirma arquivos e entrega resumo ao usuário |

Normalmente você só precisa chamar feedgenie-orchestrate — ela orquestra as demais automaticamente.


Exemplos de prompt

# Post simples
"crie um post sobre controle financeiro para quem vende salgados"

# Carrossel com especificações
"crie um carrossel de 5 slides para donos de gráficas sobre erros de gestão, tom profissional"

# Com cores específicas
"post sobre meditação para iniciantes, cores: fundo #064E3B, destaque #A7F3D0"

# Modo venda
"post de venda para o meu curso de confeitaria, tom direto"

Configuração de tema

Se o usuário não especificar cores, a skill usa paletas pré-definidas por nicho:

| Nicho | Primary | Accent | |---|---|---| | Alimentos / food | #7C2D12 | #F59E0B | | Tech / SaaS | #1E1B4B | #FACC15 | | Serviços / B2B | #0F172A | #22D3EE | | Saúde / bem-estar | #064E3B | #A7F3D0 |

Cores personalizadas: passe qualquer hex válido (#RGB ou #RRGGBB) no campo theme.primaryColor e theme.accentColor.


Testes

npm test

Suite Vitest com 20 testes cobrindo:

  • schemas.test.ts — validação Zod (campos inválidos, tipos errados, limites)
  • buildHtml.test.ts — injeção de variáveis no template, escape de HTML, CSS vars
  • renderPng.test.ts — assinatura PNG, dimensões IHDR via Playwright headless
  • e2e.test.ts — pipeline completo post + carrossel a partir dos fixtures

Roadmap

  • V1 (atual) — post + carrossel, 2 templates, theme tokens, CLI + 6 skills
  • V2 — branding (logo upload, CSS custom), templates premium por nicho
  • V3 — Instagram API publish/schedule, analytics básico

Licença

MIT