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

@luhtech/site-visuals

v0.2.0

Published

Canonical visual package for LuhTech venture sites -- responsive hero images, numbered diagram figures, and article bylines, composing with @luhtech/site-template.

Readme

@luhtech/site-visuals

Canonical visual components for LuhTech venture marketing sites -- responsive hero images, numbered diagram figures, and article bylines. Composes with @luhtech/site-template (peer dependency); does not fork or replace any of its components.

Components

  • Hero.astro -- a real, responsive hero image (AVIF/WebP/JPEG at 768/1280/1920 via astro:assets' <Picture>), with the same eyebrow/heading/subheading/CTA treatment every other section already uses (via @luhtech/site-template's SectionHeading/CtaLink). A standalone, directly-composed component -- like SplashHero in site-template, it is not wired into Section.astro's sectionKind dispatch table. A page reaches for it when its hero section has a real heroImage.
  • DiagramFigure.astro -- wraps site-template's own Diagram.astro with an optional number prop, prefixing the caption with "Figure N." Deliberately not named Figure -- site-template's Figure.astro already renders a different schema entity (section.figures[], a cited-stat callout), not section.diagrams[].
  • Byline.astro -- author / date / reading time / series / market-cell label for an article. Prop-driven, not schema-reading (article.schema.json has no author/series/publishedAt fields yet -- that's separate, not-yet-landed scope). Reading time is always computed at render from real body text via readingTimeMinutes(), never accepted as a stored value.

Setup in a consuming site

astro.config.mjs needs the asset-bank CDN host allowlisted for astro:assets' remote-image support:

export default defineConfig({
  image: {
    domains: ["ectropy-production-asset-bank.sfo3.cdn.digitaloceanspaces.com"],
  },
});

Asset resolution

resolveAssetUrl(assetId, bankType, ext) resolves an asset-bank assetId straight to its public CDN URL -- no runtime API call or credential, since the bucket is public-read and CDN-fronted. Registering a new asset (uploading bytes + writing the asset_bank_records row) is a separate, credentialed step (Ectropy-Business/scripts/ingest-asset-bank.py), out of scope for this package, which only renders assets that already exist.