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

@forjacms/analytics

v1.6.1

Published

Privacy-first analytics tracker for Forja CMS. No cookies, no PII.

Readme

@forjacms/analytics

Privacy-first pageview tracker for Forja CMS. No cookies, no IP storage, no PII — GDPR-compliant by design.

Installation

npm install @forjacms/analytics

Quick Start

import { init, trackPageview } from '@forjacms/analytics';

init({
  siteId: 'your-site-uuid',
  apiKey: 'your-read-api-key',
  endpoint: 'https://your-api.com/api/v1',
});

trackPageview();            // tracks current page
trackPageview('/custom');   // tracks a specific path

API

init(config)

Initialize the tracker. Must be called before trackPageview or autoTrack.

| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | siteId | string | Yes | Your Forja site UUID | | apiKey | string | Yes | API key with at least Read permission | | endpoint | string | Yes | Forja API base URL (e.g., https://your-api.com/api/v1) | | debug | boolean | No | Enable console debug logging (default: false) |

trackPageview(path?)

Track a single pageview. Uses window.location.pathname if no path is provided.

  • Sends a POST to /sites/{siteId}/analytics/pageview
  • Uses fetch with keepalive: true for reliability during page unload
  • Automatically skips bots (navigator.webdriver) and non-browser environments
  • Silently ignores fetch errors — analytics never break the page

autoTrack()

Auto-track pageviews on client-side route changes (for SPAs). Returns a cleanup function.

// Start tracking
const cleanup = autoTrack();

// Later, stop tracking
cleanup();

Listens for:

  • popstate events (browser back/forward)
  • history.pushState calls
  • history.replaceState calls

Fires an initial pageview on setup. The cleanup function removes all listeners and restores the original history methods.

Framework Integration

Astro (with @forjacms/sections)

<!-- In your layout -->
<script>
  import { init, autoTrack } from '@forjacms/analytics';

  init({
    siteId: import.meta.env.PUBLIC_FORJA_SITE_ID,
    apiKey: import.meta.env.PUBLIC_FORJA_API_KEY,
    endpoint: import.meta.env.PUBLIC_FORJA_ENDPOINT,
  });

  autoTrack();
</script>

React / Next.js

import { useEffect } from 'react';
import { init, autoTrack } from '@forjacms/analytics';

function App() {
  useEffect(() => {
    init({ siteId: '...', apiKey: '...', endpoint: '...' });
    return autoTrack();
  }, []);

  return <>{/* your app */}</>;
}

Privacy

  • No cookies — nothing is stored in the browser
  • No PII — no IP addresses, user agents, or fingerprints are collected
  • Referrer only — only document.referrer is sent (and only if non-empty)
  • Bot filtering — automated browsers (navigator.webdriver) are excluded
  • Fire-and-forget — errors are silently swallowed so analytics never degrade UX

License

AGPL-3.0-or-later