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

snapport

v1.0.0

Published

<p align="center"> <a href="./README.md">Read this in English</a> </p>

Readme

Snap-Port 🚀

O Snap-Port é uma biblioteca desenvolvida em TypeScript, sem dependências externas, projetada para automatizar a exibição de projetos do GitHub em sites pessoais ou portfólios.

A proposta central é utilizar o GitHub como fonte única de verdade: ao marcar seus repositórios com a tag escolhida, a biblioteca se encarrega de buscar, tratar, aplicar cache e renderizar os dados, eliminando a manutenção manual no código do seu site.


🛠 Funcionalidades Técnicas

1. Seleção de Projetos e Controle de Stacks

O Snap-Port oferece controle total sobre o que é exibido e como as tecnologias são categorizadas:

  • Tag de Descoberta: Por padrão, a biblioteca busca repositórios com a tag port, mas você pode definir qualquer outra tag no momento da inicialização.
  • Filtros por Stacks (Topics): Para que os filtros automáticos e a barra de busca funcionem corretamente, você deve listar as tecnologias (ex: react, nodejs, css) nos topics do seu repositório no GitHub.
  • Por que não usar a "Language" automática? A lib ignora o campo language do GitHub para permitir que você decida quais ferramentas quer destacar. Isso evita que um projeto de React seja classificado apenas como "HTML" ou "JavaScript" devido ao volume de arquivos gerados por ferramentas de build, garantindo que o filtro reflita a stack real do projeto.

2. Gestão Inteligente de Imagens

Como a API do GitHub não retorna links diretos de imagens de preview, o Snap-Port utiliza uma lógica de geração automática integrada aos componentes de UI.

Para que cada projeto tenha sua própria imagem, siga estas regras:

  • Arquivo de Preview: Você deve criar um arquivo chamado preview.png na raiz do seu repositório.
  • Importante: O nome deve ser exatamente preview.png (letras minúsculas), pois o GitHub diferencia maiúsculas de minúsculas (case-sensitive).

Caso o arquivo não exista ou ocorra algum erro de carregamento (como Rate Limits), a lib executa uma estratégia de fallback em cascata:

  • GitHub Open Graph: Tenta carregar o card dinâmico gerado pelo próprio GitHub.
  • Placeholder de Segurança: Se o GitHub bloquear a requisição, gera um card neutro contendo o nome do projeto via placehold.co.

3. Componentes de UI Integrados

  • Search Bar: Filtro textual em tempo real (nome, descrição e tópicos).
  • Filter Carousel: Carrossel dinâmico baseado nos tópicos definidos nos repositórios.
  • Project Cards (Layout 16:9): Cards responsivos com badges de tecnologia e botões de ação (Código e Deploy).

💡 Dicas para um melhor Resultado

  • Proporção de Imagem: Para que as imagens não fiquem com partes cortadas nos cards, salve seus arquivos preview.png na proporção 16:9 (ex: 1280x720px).
  • Link de Acesso (Deploy): O botão "Acessar" só aparecerá se o campo "Homepage" estiver preenchido nas configurações do seu repositório no GitHub.

📦 Instalação e Integração

Via NPM

npm install snapport

Via CDN (Direto no HTML)

Se você preferir não usar gerenciadores de pacotes, pode importar os arquivos diretamente de um CDN. Recomendamos o uso de type="module" para melhor compatibilidade com o padrão moderno da biblioteca.

<!-- 1. Estilos da Biblioteca -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/snapport/dist/snap-port.css">

<!-- 2. Lógica e Inicialização -->
<script type="module">
  // Importação do módulo oficial ES
  import { initPortfolio } from 'https://cdn.jsdelivr.net/npm/snapport/dist/snap-port.js';

  initPortfolio('seu-usuario', {
    tag: 'port',                      // Opcional: padrão é 'port'
    searchContainer: 'id-search',     // ID do container da busca
    filtersContainer: 'id-filters',   // ID do container dos filtros
    projectsContainer: 'id-projects'  // ID do container do grid
  });
</script>

🎨 Personalização Visual (CSS Variables)

Se você utiliza o layout padrão da biblioteca, pode adaptar as cores e o estilo ao seu tema sem modificar o código interno. O Snap-Port utiliza Variáveis CSS que podem ser facilmente sobrescritas no seu arquivo global:

:root {
  --ghp-accent: #333;           /* Cor de destaque (botões e ícones) */
  --ghp-bg: #ffffff;            /* Fundo dos cards */
  --ghp-text: #333;             /* Título e textos principais */
  --ghp-text-light: #666;       /* Descrições e textos secundários */
  --ghp-border: rgba(226, 226, 228, 0.8); /* Bordas */
  --ghp-shadow: rgba(0, 0, 0, 0.1);       /* Sombras dos cards */
}

⚙️ Customização e Performance

Injeção de Template Customizado

Mantenha a inteligência de busca e cache, mas use seu próprio design:

initPortfolio('seu-usuario', {
  searchContainer: 'id-search',
  filtersContainer: 'id-filters',
  projectsContainer: 'id-projects',
  customCardTemplate: (repo) => `
    <div class="meu-card-personalizado">
      <h4>${repo.name}</h4>
      <p>${repo.description}</p>
      <a href="${repo.htmlUrl}">Ver código</a>
    </div>
  `
});

Cache e Estabilidade

A biblioteca utiliza localStorage para garantir performance:

  • Persistência: Dados armazenados por até 2 horas.
  • Isolamento: Cache separado por usuário do GitHub.

Nota sobre Manutenção:
Este é um projeto de código aberto mantido de forma independente. Sinta-se à vontade para contribuir! Se encontrar um bug ou tiver uma ideia de funcionalidade, abrir uma Issue ou um Pull Request é a melhor forma de ajudar o projeto a crescer.

Para entender como colaborar com o código, consulte o nosso Guia de Contribuição.

Autor: Guilherme Godoy (@guilhermegodoydev)