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

@makefully/notefully

v0.1.57

Published

In-app feedback widget for web apps.

Downloads

8,432

Readme

Notefully

In-app feedback for web apps: screenshot + numbered stickers, dictation, and optional short video.

Install

npm install @makefully/notefully

Embed

import Notefully from '@makefully/notefully';
import '@makefully/notefully/notefully.css';
import pkg from './package.json' with { type: 'json' };

Notefully.init({
  endpoint: 'https://make.makefullystudios.com/notefully', // or your self-hosted relay
  projectKey: 'nfk_…', // from Showfully → Notefully → Settings
  version: pkg.version,
  name: pkg.name, // optional report prefix; falls back to project default slug
  theme: 'maker', // maker | all-business | brighter-day | quiet-night
  video: false,   // default; set true to enable screen recording
  consoleLogLimit: 10, // most recent console lines attached to each report (0–80)
  // kinds default to bug / idea / other. Pass kinds to replace the full list:
  // kinds: ['bug', 'idea', { id: 'polish', label: 'Polish' }, 'other'],
  hideLauncher: true, // optional; drive open/submit from your own UI
  // After a successful submit, keep "Submitted!" + View Report link until dismiss:
  // displayLink: true, // default false; requires relay to return trackerUrl
  // Optional canvas-game hooks for the automatic (DOM) capture path:
  // onBeforeCapture: async () => { engine.render(); },
  // capture: async () => engine.screenshotCanvas(), // data URL | Blob | HTMLCanvasElement
});

// Update settings later without remounting (theme, hideLauncher, video, …):
Notefully.configure({ theme: 'quiet-night' });
Notefully.setTheme('all-business');
Notefully.setVisible(false); // hides launcher and closes an open dialog

Notefully.identify({
  userId: 'user_123',
  email: '[email protected]',
  displayName: 'Ada' // sets reporter; hides the Author field
});

Or via the IIFE build:

<link rel="stylesheet" href="node_modules/@makefully/notefully/dist/notefully.css">
<script src="node_modules/@makefully/notefully/dist/notefully.iife.js"></script>
<script>
  Notefully.init({
    endpoint: 'https://make.makefullystudios.com/notefully',
    projectKey: 'nfk_…',
    version: '1.4.2',
    name: 'my-app',
    hideLauncher: false
  });
</script>

Bundlers should prefer the package export import '@makefully/notefully/notefully.css' (see Embed above). The dist/ path is for static / IIFE hosts. With hideLauncher: true, call Notefully.open() / Notefully.submit() from your own UI.

Screenshots

On open, Notefully captures the page automatically: optional onBeforeCapture / capture hooks first, then a canvas-aware DOM rasterize sized to the viewport (so absolutely positioned apps still capture). Empty results are treated as no screenshot—markup tools stay hidden and the camera Recapture control sits beside the mic. With a shot, Discard and Recapture sit on the far right of the edit tools. Recapture hides the dialog and tries the browser share picker (getDisplayMedia); if that fails or is cancelled, it falls back to the automatic path.

Above Submit, kind tags and a short disclosure share a wrapping row when space allows. The disclosure explains that logs and/or diagnostic information will be sent; the list icon opens a review panel (diagnostics as whole fields/objects, plus console lines snapshotted at open). Redact toggles omit items from the report; the disclosure sentence updates when a whole section is redacted or when there are no logs. Section redact preferences and the last selected kind are remembered in localStorage for later reports.

Hosted relay

Makefully hosts a relay at https://make.makefullystudios.com/notefully. Pass that as endpoint (no trailing slash required). You still need a project key from your Showfully Notefully settings.

Project key vs name

  • projectKey (nfk_…) chooses the Showfully inbox and delivery settings.
  • name (optional on init, same idea as package.json name) is only a report folder prefix after sanitizing: {slug}-{version}-{nf_id}/. Values like @scope/pkg become scope-pkg. If omitted, the relay uses the project’s default slug from Showfully → Notefully → Settings.

Related apps can share one inbox/key and pass different name values. The Notefully inbox shows an app filter when more than one sanitized name/slug appears.

Identify

Call Notefully.identify() whenever the signed-in user is known (and again if they switch accounts):

| Field | Type | Notes | |-------|------|--------| | userId | string | Stable app user id. Alias: id. | | email | string | Contact email when available. | | displayName | string | Human-readable name. Aliases: username, name. |

Unknown keys are ignored and warned in the console. Identity is attached to each report’s context payload; it is not a substitute for projectKey. Prefer displayName (not name) on identify() so it does not collide with init({ name }) mentally — both still work.

When any identify field is set, the widget hides the Author input and uses that identity as the reporter (displayName, else email, else userId). Without identify(), the Author field stays visible (prefilled from localStorage) so guests can name themselves.

Report kinds

By default the dialog offers Bug, Idea, and Other. Pass kinds to replace that list entirely:

Notefully.init({
  // …
  kinds: ['bug', 'idea', { id: 'ux', label: 'UX' }, 'other']
});

Kind ids are lowercased slugs (polish, ux). Labels default to title case; use { id, label } for custom labels. The relay stores whatever kind the widget submits.

Secrets never go in the widget — only the public project key and relay URL.