Universal platform and framework detection for JavaScript/TypeScript applications
Detect browsers, frameworks, platforms, and capabilities with zero dependencies. Works seamlessly across Web, Node.js, React Native, Electron, and more.
- Zero Dependencies - Lightweight and self-contained
- TypeScript First - Full type safety with excellent IntelliSense
- Universal - Works in browsers, Node.js, workers, React Native, Electron, etc.
- Comprehensive - Detects platforms, frameworks, browsers, OS, and capabilities
- Fast - Cached detection with minimal overhead
- Tree-Shakeable - Import only what you need
npm install @kitiumai/detectoryarn add @kitiumai/detectorpnpm add @kitiumai/detectorimport { detect } from '@kitiumai/detector';
const result = detect();
console.log(result.platform.platform); // 'web' | 'node' | 'react-native' | 'electron' ...
console.log(result.framework.framework); // 'react' | 'vue' | 'angular' | 'svelte' ...
console.log(result.capabilities.webComponents); // true | falseimport { detect } from '@kitiumai/detector';
const result = detect();
// Platform information
console.log(result.platform.platform); // Platform type
console.log(result.platform.runtime); // Runtime environment
console.log(result.platform.os); // OS information
console.log(result.platform.browser); // Browser information
console.log(result.platform.isMobile); // Mobile device check
// Framework information
console.log(result.framework.framework); // Framework type
console.log(result.framework.version); // Framework version
console.log(result.framework.isSSR); // Server-side rendering check
// Capabilities
console.log(result.capabilities.webComponents); // Web Components support
console.log(result.capabilities.localStorage); // localStorage support
console.log(result.capabilities.webgl); // WebGL supportimport { detectPlatform, isBrowser, isNode, isReactNative } from '@kitiumai/detector';
const platform = detectPlatform();
// Quick checks
if (isBrowser()) {
console.log('Running in browser');
}
if (isNode()) {
console.log('Running in Node.js');
}
if (isReactNative()) {
console.log('Running in React Native');
}
// Detailed platform info
console.log(platform.platform); // 'web' | 'node' | 'react-native' | etc.
console.log(platform.runtime); // 'browser' | 'node' | 'mobile-native' | etc.
console.log(platform.isServer); // boolean
console.log(platform.isBrowser); // boolean
console.log(platform.isMobile); // boolean
console.log(platform.isNative); // boolean
// OS detection
if (platform.os) {
console.log(platform.os.name); // 'windows' | 'macos' | 'linux' | 'ios' | 'android'
console.log(platform.os.version); // OS version (if available)
}
// Browser detection
if (platform.browser) {
console.log(platform.browser.name); // 'chrome' | 'firefox' | 'safari' | etc.
console.log(platform.browser.version); // Browser version (if available)
}import {
detectFramework,
isReact,
isVue,
isAngular,
shouldUseWebComponents,
shouldUseReactWrapper
} from '@kitiumai/detector';
const framework = detectFramework();
// Quick checks
if (isReact()) {
console.log('React detected');
}
if (isVue()) {
console.log('Vue.js detected');
}
if (isAngular()) {
console.log('Angular detected');
}
// Framework-specific logic
if (shouldUseReactWrapper()) {
// Use React-specific implementation
}
if (shouldUseWebComponents()) {
// Use Web Components
}
// Detailed framework info
console.log(framework.framework); // 'react' | 'vue' | 'angular' | etc.
console.log(framework.version); // Framework version (if available)
console.log(framework.isSSR); // Server-side rendering check
console.log(framework.supportsWebComponents); // Web Components support
console.log(framework.supportsESM); // ES Modules supportimport { detectCapabilities } from '@kitiumai/detector';
const caps = detectCapabilities();
// Check specific capabilities
if (caps.webComponents) {
console.log('Web Components supported');
}
if (caps.localStorage) {
console.log('localStorage available');
}
if (caps.serviceWorker) {
console.log('Service Worker supported');
}
// All available capabilities
console.log(caps.webComponents); // Web Components
console.log(caps.shadowDOM); // Shadow DOM
console.log(caps.customElements); // Custom Elements
console.log(caps.modules); // ES Modules
console.log(caps.serviceWorker); // Service Worker
console.log(caps.webWorker); // Web Worker
console.log(caps.indexedDB); // IndexedDB
console.log(caps.localStorage); // localStorage
console.log(caps.sessionStorage); // sessionStorage
console.log(caps.websocket); // WebSocket
console.log(caps.webgl); // WebGL
console.log(caps.webgl2); // WebGL2
console.log(caps.canvas); // Canvas
console.log(caps.audio); // Audio
console.log(caps.video); // Video
console.log(caps.geolocation); // Geolocation
console.log(caps.notification); // Notification
console.log(caps.camera); // Camera
console.log(caps.microphone); // Microphoneimport { debug, getSummary } from '@kitiumai/detector';
// Log complete detection to console
debug();
// Get summary as string
const summary = getSummary();
console.log(summary);
// Output:
// Platform: web
// Runtime: browser
// Framework: react v18.2.0
// OS: windows 10
// Browser: chrome 120.0
// Web Components: Yes
// ESM: Yesimport { detect } from '@kitiumai/detector';
const result = detect({
// Enable/disable caching (default: true)
cache: true,
// Enable/disable capability detection (default: true)
capabilities: true,
// Deep framework detection - slower but more accurate (default: false)
deep: false,
// Custom detection functions
custom: {
platform: () => ({
// Override platform detection
}),
framework: () => ({
// Override framework detection
}),
},
});The package supports both default and named imports:
// Named imports (recommended)
import { detect, detectPlatform, detectFramework } from '@kitiumai/detector';
// Default import
import detector from '@kitiumai/detector';
detector.detect();
detector.detectPlatform();
detector.detectFramework();
// Tree-shakeable imports
import { detectPlatform } from '@kitiumai/detector/platform';
import { detectFramework } from '@kitiumai/detector/framework';
import { detectCapabilities } from '@kitiumai/detector/capabilities';web- Web browsernode- Node.jsreact-native- React Nativeelectron- Electroncapacitor- Capacitorcordova- Cordova/PhoneGapnw.js- NW.jswebworker- Web Workerserviceworker- Service Worker
react- Reactnext- Next.jsgatsby- Gatsbyremix- Remixvue- Vue.jsnuxt- Nuxt.jsangular- Angularsvelte- Sveltesolid- Solid.jspreact- Preactlit- Litweb- Vanilla JS
- Chrome
- Firefox
- Safari
- Edge
- Opera
- IE
- Samsung Internet
- Chromium
- Windows
- macOS
- Linux
- ChromeOS
- iOS
- Android
Performs complete detection of platform, framework, and capabilities.
Detects platform information only.
Detects framework information only.
Detects browser and platform capabilities.
Logs detection result to console.
Returns a formatted summary string.
Clears cached detection results.
isBrowser(): boolean- Check if running in browserisNode(): boolean- Check if running in Node.jsisReactNative(): boolean- Check if running in React NativeisElectron(): boolean- Check if running in ElectronisCapacitor(): boolean- Check if running in CapacitorisCordova(): boolean- Check if running in CordovaisMobile(): boolean- Check if on mobile devicedetectBrowser(): BrowserType- Detect browser typedetectMobileOS(): MobileOSType- Detect mobile OSdetectDesktopOS(): DesktopOSType- Detect desktop OS
isReact(): boolean- Check if React is presentisVue(): boolean- Check if Vue is presentisAngular(): boolean- Check if Angular is presentisSvelte(): boolean- Check if Svelte is presentisNextJS(): boolean- Check if Next.js is presentisNuxt(): boolean- Check if Nuxt is presentshouldUseWebComponents(): boolean- Check if Web Components should be usedshouldUseReactWrapper(): boolean- Check if React wrapper should be usedshouldUseReactNative(): boolean- Check if React Native components should be used
hasWebComponents(): boolean- Check Web Components supporthasLocalStorage(): boolean- Check localStorage supporthasServiceWorker(): boolean- Check Service Worker supporthasWebGL(): boolean- Check WebGL support- And many more...
Full TypeScript support with comprehensive type definitions:
import type {
PlatformType,
FrameworkType,
BrowserType,
DetectionResult,
PlatformDetectionResult,
FrameworkDetectionResult,
CapabilityDetectionResult,
} from '@kitiumai/detector';import { detect } from '@kitiumai/detector';
function getComponent() {
const { platform, framework } = detect();
if (platform.platform === 'react-native') {
return ReactNativeComponent;
}
if (framework.supportsWebComponents) {
return WebComponent;
}
if (framework.framework === 'react') {
return ReactComponent;
}
return VanillaComponent;
}import { detectCapabilities } from '@kitiumai/detector';
const caps = detectCapabilities();
if (caps.webgl2) {
loadAdvancedGraphics();
} else if (caps.webgl) {
loadBasicGraphics();
} else {
loadFallback();
}import { detect, getSummary } from '@kitiumai/detector';
const info = detect();
sendAnalytics({
platform: info.platform.platform,
framework: info.framework.framework,
browser: info.platform.browser?.name,
os: info.platform.os?.name,
mobile: info.platform.isMobile,
});import { detectCapabilities } from '@kitiumai/detector';
const caps = detectCapabilities();
const features = {
notifications: caps.notification,
offline: caps.serviceWorker,
localStorage: caps.localStorage,
realtime: caps.websocket,
};
initializeApp(features);- Lightweight: ~5KB gzipped
- Fast: Cached detection with minimal overhead
- Tree-Shakeable: Import only what you need
- Zero Dependencies: No external dependencies
| Feature | @kitiumai/detector | Bowser | ua-parser-js | detect-browser |
|---|---|---|---|---|
| Browser Detection | ✅ 20+ browsers | ✅ Yes | ✅ Yes | ✅ Yes |
| OS Detection | ✅ Comprehensive | ✅ Yes | ✅ Yes | |
| Framework Detection | ✅ 12+ frameworks | ❌ No | ❌ No | ❌ No |
| Runtime Detection | ✅ 9+ runtimes | |||
| Capability Detection | ✅ 20+ capabilities | ❌ No | ❌ No | ❌ No |
| TypeScript Support | ✅ Full Native | ✅ Partial | ||
| Intelligent Caching | ✅ Built-in | ❌ No | ❌ No | ❌ No |
| Bundle Size | 5KB | 8KB | 15KB | 4KB |
| Zero Dependencies | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
| SSR Support | ✅ Full | ✅ Full |
Bowser is a lightweight browser detection library with ~2M monthly downloads.
- Bowser: Focus on browser detection and device info
- @kitiumai/detector: Superset - Includes browser detection + frameworks + capabilities
- Winner: Detector (smaller bundle, more features, better TypeScript)
// Bowser
const parser = Bowser.getParser(window.navigator.userAgent);
const browser = parser.getBrowser(); // { name: 'Chrome', version: '120.0' }
// @kitiumai/detector
const result = detect();
// Get browser info + framework + capabilities + runtime infoua-parser-js is a heavy-duty UA parsing library with ~4M monthly downloads.
- ua-parser-js: Detailed user-agent string parsing (15KB)
- @kitiumai/detector: Modern feature detection + framework awareness (5KB)
- Winner: Detector (3x smaller, better for modern apps)
// ua-parser-js
const parser = new UAParser();
const result = parser.getResult();
// { browser: {...}, os: {...}, device: {...} }
// @kitiumai/detector
const result = detect();
// All of that + framework detection + 20+ capabilitiesdetect-browser is a minimal browser detection library (~4KB).
- detect-browser: Simple, browser-only detection
- @kitiumai/detector: 1KB more, but includes frameworks + capabilities + universal support
- Winner: Detector (tiny size difference, massive feature advantage)
// detect-browser
const browser = detectBrowser();
// 'chrome' | 'firefox' | null
// @kitiumai/detector
const result = detect();
// Complete detection with version, framework, capabilities, etc.Detects which JavaScript framework is running:
import { detectFramework, isReact, isVue } from '@kitiumai/detector';
if (isReact()) {
// Provide React-optimized version
}
if (isVue()) {
// Provide Vue-optimized version
}
const fw = detectFramework();
console.log(fw.framework); // 'react' | 'vue' | 'angular' | etc.
console.log(fw.version); // Framework version (if available)Why? Only detector package offers framework detection without external dependencies.
import { isBrowser, isNode, isElectron, isReactNative } from '@kitiumai/detector';
if (isBrowser()) { /* ... */ }
if (isNode()) { /* ... */ }
if (isElectron()) { /* ... */ }
if (isReactNative()) { /* ... */ }Detects: Browser, Node.js, Electron, React Native, Workers, Cordova, Capacitor, NW.js.
Why? Universal libraries need to detect all runtimes.
import { detectCapabilities } from '@kitiumai/detector';
const caps = detectCapabilities();
// 20+ capabilities
console.log(caps.webComponents); // Web Components support
console.log(caps.webgl2); // WebGL2 support
console.log(caps.serviceWorker); // Service Worker support
console.log(caps.notification); // Notification API
console.log(caps.geolocation); // Geolocation API
// ... and 15+ moreWhy? Perfect for feature detection and polyfill strategies.
import { detect, reset } from '@kitiumai/detector';
// First call: ~50ms
const result1 = detect();
// Subsequent calls: <10ms (cached for 5 minutes)
const result2 = detect();
// Clear cache when needed
reset();Why? Improves performance in production applications.
import type {
DetectionResult,
PlatformType,
FrameworkType,
CapabilityDetectionResult,
} from '@kitiumai/detector';
// Full IntelliSense and type safety
const result: DetectionResult = detect();
const platform: PlatformType = result.platform.platform;Why? Modern TypeScript applications deserve first-class type support.
| Use Case | Bowser | ua-parser-js | detect-browser | @kitiumai/detector |
|---|---|---|---|---|
| Simple browser detection | ✅ Perfect | ✅ Perfect | ✅ Perfect | |
| Full UA parsing | ❌ No | ✅ Perfect | ✅ Good | |
| Framework detection | ❌ No | ❌ No | ❌ No | ✅ Only |
| Capability detection | ❌ No | ❌ No | ❌ No | ✅ Only |
| Universal/Isomorphic apps | ❌ No | ✅ Perfect | ||
| React/Vue projects | ❌ No | ❌ No | ❌ No | ✅ Perfect |
| Electron apps | ❌ No | ✅ Perfect | ||
| React Native apps | ❌ No | ❌ No | ❌ No | ✅ Perfect |
| TypeScript projects | ✅ Perfect |
@kitiumai/detector: 5 KB (gzipped) ████████████ ← Smallest
detect-browser: 4 KB (gzipped) ███████████
Bowser: 8 KB (gzipped) ███████████████
ua-parser-js: 15 KB (gzipped) ██████████████████████████████
Despite being only 1KB larger than the smallest option, @kitiumai/detector provides:
- Framework detection (unique)
- 20+ capability checks (unique)
- Full TypeScript support
- Intelligent caching
- Universal runtime support
| Operation | Bowser | ua-parser-js | detect-browser | @kitiumai/detector |
|---|---|---|---|---|
| Initial detection | ~50ms | ~100ms | ~20ms | ~50ms |
| Cached detection | N/A | N/A | N/A | <10ms |
| Memory footprint | Low | Low | Very Low | Low |
| Dependencies | 0 | 0 | 0 | 0 |
Choose @kitiumai/detector if you need:
- ✅ Framework detection (React, Vue, Angular, etc.)
- ✅ Capability detection (Web Components, WebGL, APIs)
- ✅ Universal JavaScript support (Browser, Node.js, Electron, React Native)
- ✅ Full TypeScript support
- ✅ Minimal bundle size with maximum features
- ✅ High-performance cached detection
Choose an alternative if you only need:
- ❌ Simple browser-only detection with minimal overhead (use
detect-browser) - ❌ Heavy UA string parsing with maximum detail (use
ua-parser-js) - ❌ Established ecosystem with many integrations (use
Bowser)
- Chrome/Edge: All versions
- Firefox: All versions
- Safari: All versions
- IE: 11+ (limited support)
MIT © Kitium.AI LLP - See LICENSE for details.
Contributions are welcome! Please see CONTRIBUTING.md for details.
- @kitium/ui - Universal UI Components Library