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.
npm install inapp-spyOr via CDN
<script src="https://cdn.jsdelivr.net/npm/inapp-spy@latest/dist/index.global.min.js"></script>import InAppSpy from "inapp-spy";
const { isInApp, appKey, appName } = InAppSpy();True if in-app browser has been detected
Machine-friendly key
All except telegram use UA detection strategies - server or client friendly. telegram can only be detected client-side
facebookgsainstagramlinelinkedinsnapchattelegramthreadstiktoktwitterwechatwhatsappmessenger
Can be undefined if isInApp is true.
Human-readable name (e.g. "TikTok")
Resolved or provided user agent string.
True if detection was bypassed via skip.
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";
}[];
})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. Make sure to be on the latest inapp-spy to avoid issues and always test on real devices.
💡 Tip: If you use escape links, add a query string — if present, skip detection to avoid false positives.
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);
}, []);
...
};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)
});See CHANGELOG.md for the full release history.
- InAppDebugger - Debug in-app browsers. Uses both
bowserandinapp-spylibraries. - Bowser - Browser + OS detection