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

@neko-os/support

v0.1.0

Published

Drop-in support module for React Native (Expo) apps built with `@neko-os/ui`. Provides contact form, review/rating drawer, smart review prompting, and App Store review requests — with i18n support for 26 languages.

Readme

neko-support

Drop-in support module for React Native (Expo) apps built with @neko-os/ui. Provides contact form, review/rating drawer, smart review prompting, and App Store review requests — with i18n support for 26 languages.

Peer Dependencies

  • @neko-os/ui
  • expo-store-review
  • i18next

Configuration

Environment variables (or defaults):

| Variable | Default | Description | |----------|---------|-------------| | EXPO_PUBLIC_SUPPORT_API | http://localhost:4000 | Support API base URL | | EXPO_PUBLIC_SUPPORT_SUBDOMAIN | kora | App identifier sent as subdomain header |

Setup

1. Register locales

Call once at app boot, after i18n is initialized:

import { registerSupportLocales } from 'neko-support'

registerSupportLocales(i18n)

2. Register modal routes

Both drawers use @neko-os/ui modal navigation:

import { EditContactDrawer, EditReviewDrawer } from 'neko-support'

// Inside your ModalRoutes
<Modal.Screen name="contacts/edit" component={EditContactDrawer} />
<Modal.Screen name="reviews/edit" component={EditReviewDrawer} />

3. Add support section (optional)

Pre-built settings section with review + contact links:

import { SupportSection } from 'neko-support'

<SupportSection />

Exports

Components

| Export | Description | |--------|-------------| | SupportSection | Settings section with review and contact links. | | ContactSectionItemLink | Standalone "Contact us" link that opens the contact drawer. | | ReviewSectionItemLink | Standalone "Leave a review" link that opens the review drawer. | | EditContactDrawer | Contact form drawer (type, name, email, message). Submits to support API. | | EditReviewDrawer | Review drawer (star rating + optional comment). Submits to support API. Triggers App Store review for ratings >= 4. |

Hooks

| Export | Description | |--------|-------------| | useOpenContactDrawer() | Returns a function that opens the contact drawer. | | useOpenReviewDrawer() | Returns a function that opens the review drawer. | | useReviewPrompt(options) | Returns a trigger function for smart review prompting. Call it on meaningful actions — opens the review drawer at configured intervals. |

Functions

| Export | Description | |--------|-------------| | registerSupportLocales(i18n) | Registers the support namespace into an existing i18next instance for all 26 supported languages. |

useReviewPrompt

Smart prompting — ask for reviews at the right moments without spamming users.

const triggerReview = useReviewPrompt({
  at: [5, 20, 50],  // show review drawer on 5th, 20th, 50th trigger
  max: 3,           // stop prompting after 3 reviews given
})

// Call on meaningful user actions
function onGoalCompleted() {
  triggerReview()
}

| Option | Type | Description | |--------|------|-------------| | at | number[] | Trigger counts at which to show the review drawer. | | max | number | Max number of reviews before prompting stops. |

State persisted via @neko-os/ui Storage under keys reviews:count, reviews:givenCount, reviews:storeRequested.

Review Flow

  1. User triggers review (via useReviewPrompt or ReviewSectionItemLink)
  2. EditReviewDrawer opens — star rating + optional comment
  3. Review submitted to POST /rest/reviews with subdomain header
  4. If rating >= 4, native App Store review dialog requested (once per app lifetime via expo-store-review)

Contact Form

Fields: type (bug/feedback/question/other), name, email, message.

Submits to POST /rest/contacts with subdomain header. Success shows toast notification.

API Endpoints

Both endpoints expect JSON body and a subdomain header:

| Method | Path | Body | |--------|------|------| | POST | /rest/reviews | { value: number, comment?: string } | | POST | /rest/contacts | { type: string, name: string, email: string, content: string } |

i18n

Namespace: support

26 languages: cs, da, de, el, en, es, fi, fr, hi, hu, id, it, ja, ko, nl, no, pl, pt, ro, ru, sv, th, tr, uk, vi, zh.

Translation keys organized under reviews and contacts groups. See locales/en.js for full key reference.