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

@blawness/admin-kit

v0.7.3

Published

Reusable CMS core for Next.js 16 admin panels — auth, media, users, editor, shell

Readme

@blawness/admin-kit

Reusable CMS core (auth, media, users, editor, admin shell, shared components) extracted from the LIPAN RI site. Consumed as a private Git dependency.

Consumer setup

  1. pnpm add github:Blawness/admin-kit#vX.Y.Z
  2. Add to next.config: transpilePackages: ["@blawness/admin-kit"]
  3. Ensure Tailwind scans the package and defines the navy/brand/gold tokens.

Public cached reads (@blawness/admin-kit/public)

Render published articles on your public site with caching wired to the admin mutations out of the box:

import {
  getPublishedArticles,
  getPublishedArticleBySlug,
  getPublishedArticleSlugs,
} from "@blawness/admin-kit/public";

// app/berita/page.tsx
const posts = await getPublishedArticles({ limit: 12 });

// app/berita/[slug]/page.tsx
export async function generateStaticParams() {
  return (await getPublishedArticleSlugs()).map((slug) => ({ slug }));
}
const post = await getPublishedArticleBySlug(slug); // null if not found/unpublished

These helpers use the Next.js 16 use cache directive, so the consumer must enable it:

// next.config.ts
const nextConfig = { cacheComponents: true };

Every read is tagged ARTICLES_TAG ("articles"); the admin actions call revalidateTag("articles") on every create/update/publish/reject/delete, so the public pages refresh automatically. This entry point is isolated — importing the rest of the package does not require cacheComponents.

SEO & feeds

Articles carry excerpt, metaTitle, metaDescription, and ogImage (edit them in the article form's SEO section). Generate a sitemap and RSS feed from the same cached/tagged layer:

// app/sitemap.ts
import { getSitemapEntries } from "@blawness/admin-kit/public";
export default async function sitemap() {
  return getSitemapEntries({ siteUrl: "https://example.com", articleBasePath: "/berita" });
}

// app/rss.xml/route.ts
import { generateRssXml } from "@blawness/admin-kit/public";
export async function GET() {
  const xml = await generateRssXml({
    siteUrl: "https://example.com",
    title: "Berita Example",
    description: "Artikel terbaru",
  });
  return new Response(xml, { headers: { "Content-Type": "application/rss+xml" } });
}

Apply the migration in drizzle/0001_*.sql (pnpm db:migrate) before using the new fields.

Admin list pagination & search

The articles screen now supports ?q= (title/slug search) and ?page= pagination; the media gallery supports ?page=. The data helpers (listArticles, countArticles, listMedia, countMedia) accept limit/offset so large datasets no longer load every row.

Phase 1 result

  • Directive preservation: CONFIRMED ("use client" intact in dist after tsc build).
  • Consumed by a Next.js 16.2.7 throwaway app via transpilePackages + Git-tag dependency: build PASSED, page rendered (HTTP 200).
  • Gotchas: pnpm v10 blocks the git dep's prepare script by default (ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED) — the consumer must add @blawness/admin-kit to pnpm.onlyBuiltDependencies in package.json (or pnpm-workspace.yaml) so tsc runs and dist/ builds. The noop server action can be typed () => Promise<void> even though ConfirmDelete's action prop is (formData: FormData) => Promise<void> — Next/TS accepts the narrower no-arg signature.