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

inapp-spy

v5.0.8

Published

detect in-app browsers

Downloads

46,351

Readme

InAppSpy 🔎

npm version Changelog npm downloads last commit changesets maintenance license GitHub Repo stars

inapp-spy detects in-app browsers when a website is opened inside an app (e.g. Instagram, Facebook, TikTok, Telegram).

It’s a maintained and refactored alternative to detect-inapp, with TypeScript support and regular updates – and it powers inappdebugger.com, a live testing tool for in-app browser detection.

Installation

npm install inapp-spy

Or via CDN

<script src="https://cdn.jsdelivr.net/npm/inapp-spy@latest/dist/index.global.min.js"></script>

Code Examples

Basic

import InAppSpy from "inapp-spy";

const { isInApp, appKey, appName } = InAppSpy();

API Reference

Return Properties

isInApp

True if in-app browser has been detected

appKey

Machine-friendly key

All except telegram use UA detection strategies - server or client friendly. telegram can only be detected client-side

  • facebook
  • gsa
  • instagram
  • line
  • linkedin
  • snapchat
  • telegram
  • threads
  • tiktok
  • twitter
  • wechat
  • whatsapp
  • messenger

Can be undefined if isInApp is true.

appName

Human-readable name (e.g. "TikTok")

ua

Resolved or provided user agent string.

skipped

True if detection was bypassed via skip.

Optional Parameters

InAppSpy({
  // Provide a UA string (server-side detection). Leave blank on client for better accuracy.
  ua?: string;
  // Exclude certain apps or platforms from detection.
  skip?: {
    appKey: AppKey;
    platform?: "apple" | "android";
  }[];
})

SFSafariViewController Detection (Experimental)

Detect when a page is opened inside SFSafariViewController (helps with issues like awkward download UX).

⚠️ SFSVCExperimental may return false positives (e.g. Safari itself) and could change with future iOS updates. Always test on real devices.

💡 Tip: If you use escape links, add a query string — if present, skip detection to avoid false positives.

Usage

JavaScript

import InAppSpy, { SFSVCExperimental } from "inapp-spy";

const { isInApp } = InAppSpy(); // normal detection

// Detects in Safari 17+ - requires async
SFSVCExperimental().then((isSFSVC) => {
  /* ... */
});

React

import InAppSpy, { SFSVCExperimental } from "inapp-spy";

export const App = () => {
  const [{ isInApp }] = useState(() => InAppSpy());
  const [isSFSVC, setIsSFSVC] = useState(false);

  useEffect(() => {
    // Detects in Safari 17+ - requires async
    SFSVCExperimental().then(setIsSFSVC);
  }, []);

  ...
};

Debugging Options

If detection fails on your app (but not on InAppDebugger), try adjusting options:

SFSVCExperimental({
  debug?: boolean; // log details (default: false)
  maxTime?: number; // ms before assuming Safari (default: 300)
  maxVersion?: string; // e.g. "21.5.1" (default: none)
});

License

MIT

Changelog

See CHANGELOG.md for the full release history.

Related

  • InAppDebugger - Debug in-app browsers. Uses both bowser and inapp-spy libraries.
  • Bowser - Browser + OS detection