A lightweight, tree-shakable Angular library for detecting and classifying devices. Identify device type, OS, browser, and more based on user agent strings to create responsive, device-specific user experiences.
- Device Detection - Identify mobile, tablet, and desktop devices
- OS & Browser Detection - Detect operating systems and browsers
- Lightweight & Fast - Minimal bundle size with tree-shaking support
- Easy Integration - Simple service-based API
- Standalone Support - Works with Angular 14+ standalone components
- No Dependencies - Pure TypeScript implementation
- SSR Compatible - Works with Angular Universal
Install the library using npm or yarn:
npm install rm-ng-device-detection --saveor
yarn add rm-ng-device-detectionImport the service in your component (works with both standalone and module-based apps):
import { Component, OnInit } from '@angular/core';
import { RmNgDeviceDetectionService, DeviceInfo } from 'rm-ng-device-detection';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
deviceInfo: DeviceInfo | null = null;
constructor(private deviceService: RmNgDeviceDetectionService) {}
ngOnInit(): void {
this.detectDevice();
}
private detectDevice(): void {
// Get complete device information
this.deviceInfo = this.deviceService.getDeviceInfo();
// Use helper methods for specific checks
const isMobile = this.deviceService.isMobile();
const isTablet = this.deviceService.isTablet();
const isDesktop = this.deviceService.isDesktop();
console.log('Device Info:', this.deviceInfo);
console.log('Is Mobile:', isMobile);
console.log('Is Tablet:', isTablet);
console.log('Is Desktop:', isDesktop);
}
}<div *ngIf="deviceInfo">
<h2>Device Information</h2>
<p>Device Type: {{ deviceInfo.device }}</p>
<p>Browser: {{ deviceInfo.browser }}</p>
<p>Operating System: {{ deviceInfo.os }}</p>
<p>OS Version: {{ deviceInfo.os_version }}</p>
</div>
<!-- Conditional rendering based on device type -->
<div *ngIf="deviceService.isMobile()">
<p>Mobile-specific content</p>
</div>
<div *ngIf="deviceService.isDesktop()">
<p>Desktop-specific content</p>
</div>The getDeviceInfo() method returns a DeviceInfo object with the following properties:
interface DeviceInfo {
browser: string; // Browser name (e.g., 'Chrome', 'Firefox', 'Safari')
os: string; // Operating system (e.g., 'Windows', 'macOS', 'Android')
device: string; // Device type (e.g., 'mobile', 'tablet', 'desktop')
userAgent: string; // Full user agent string
os_version: string; // Operating system version
}Returns complete device information including browser, OS, device type, user agent, and OS version.
Example:
const deviceInfo = this.deviceService.getDeviceInfo();
console.log(deviceInfo);
// Output: { browser: 'Chrome', os: 'Windows', device: 'desktop', ... }Returns true if the device is a mobile device (Android, iPhone, Windows Phone, etc.).
Example:
if (this.deviceService.isMobile()) {
// Load mobile-optimized components
}Returns true if the device is a tablet (iPad, Android tablets, etc.).
Example:
if (this.deviceService.isTablet()) {
// Adjust layout for tablets
}Returns true if the device is a desktop/laptop computer.
Example:
if (this.deviceService.isDesktop()) {
// Enable advanced desktop features
}import { Component, OnInit } from '@angular/core';
import { RmNgDeviceDetectionService } from 'rm-ng-device-detection';
@Component({
selector: 'app-responsive',
template: `
<ng-container *ngIf="isMobile">
<app-mobile-header></app-mobile-header>
</ng-container>
<ng-container *ngIf="!isMobile">
<app-desktop-header></app-desktop-header>
</ng-container>
`
})
export class ResponsiveComponent implements OnInit {
isMobile: boolean = false;
constructor(private deviceService: RmNgDeviceDetectionService) {}
ngOnInit(): void {
this.isMobile = this.deviceService.isMobile();
}
}import { Component, OnInit } from '@angular/core';
import { RmNgDeviceDetectionService } from 'rm-ng-device-detection';
@Component({
selector: 'app-analytics'
})
export class AnalyticsComponent implements OnInit {
constructor(
private deviceService: RmNgDeviceDetectionService,
private analyticsService: AnalyticsService
) {}
ngOnInit(): void {
const deviceInfo = this.deviceService.getDeviceInfo();
// Send device info to analytics
this.analyticsService.trackEvent('device_info', {
device: deviceInfo.device,
browser: deviceInfo.browser,
os: deviceInfo.os,
os_version: deviceInfo.os_version
});
}
}import { Component, OnInit } from '@angular/core';
import { RmNgDeviceDetectionService } from 'rm-ng-device-detection';
@Component({
selector: 'app-styled',
template: `
<div [class]="deviceClass">
<h1>Content adapts to your device</h1>
</div>
`,
styles: [`
.mobile { font-size: 14px; padding: 10px; }
.tablet { font-size: 16px; padding: 15px; }
.desktop { font-size: 18px; padding: 20px; }
`]
})
export class StyledComponent implements OnInit {
deviceClass: string = 'desktop';
constructor(private deviceService: RmNgDeviceDetectionService) {}
ngOnInit(): void {
if (this.deviceService.isMobile()) {
this.deviceClass = 'mobile';
} else if (this.deviceService.isTablet()) {
this.deviceClass = 'tablet';
} else {
this.deviceClass = 'desktop';
}
}
}Try the library in action with our interactive demos:
| Platform | Link |
|---|---|
| StackBlitz | |
| npm | |
| GitHub |
| Angular Version | Supported | Standalone | Package Version |
|---|---|---|---|
| 14.x | Full | Yes | 1.x.x - 3.x.x |
| 15.x | Full | Yes | 1.x.x - 3.x.x |
| 16.x | Full | Yes | 1.x.x - 3.x.x |
| 17.x | Full | Yes | 1.x.x - 3.x.x |
| 18.x | Full | Yes | 1.x.x |
| 19.x | Full | Yes | 2.x.x |
| 20.x | Full | Yes | 3.x.x |
| 21.x | Full | Yes | Latest |
| Browser | Minimum Version | Support Status |
|---|---|---|
| Chrome | 80+ | Full |
| Firefox | 75+ | Full |
| Safari | 13+ | Full |
| Edge | 80+ | Full |
| Opera | 67+ | Full |
The library is compatible with Angular Universal. The user agent is automatically detected from the request headers:
// Works automatically with SSR - no special configuration needed
const deviceInfo = this.deviceService.getDeviceInfo();If you need to test with a custom user agent string, you can initialize the service with your own user agent:
// Note: This is typically not needed as the library auto-detects
// This example is for testing purposes only- Analytics: Track device types, browsers, and OS versions
- Responsive Design: Load device-specific components and styles
- Content Adaptation: Serve different content based on device capabilities
- Performance: Lazy load features based on device type
- Feature Detection: Enable/disable features based on device capabilities
- Progressive Web Apps: Optimize PWA experience per device
- A/B Testing: Run device-specific experiments
This library is optimized for modern Angular applications:
- Marked as
sideEffects: falsefor aggressive tree-shaking - Service-based API only imports what you use
- No external runtime dependencies
- Minimal bundle impact (~2KB gzipped)
Want to contribute or run the library locally?
# Clone the repository
git clone https://github.com/malikrajat/rm-ng-device-detection.git
cd rm-ng-device-detection
# Install dependencies
pnpm install
# Start development server
pnpm start # Serves demo app on http://localhost:4200# Build the library
pnpm build
# Run tests
pnpm test
# Run linter
pnpm lintContributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow the Angular Style Guide
- Write unit tests for new features
- Update documentation for API changes
- Keep commits focused and descriptive
Need help or found a bug?
| Type | Link |
|---|---|
| Bug Report | Report a Bug |
| Feature Request | Request a Feature |
| Discussions | Join Discussion |
| mr.rajatmalik@gmail.com |
See CHANGELOG.md for release history.
This project is licensed under the MIT License - see the LICENSE file for details.
Rajat Malik
- Website: rajatmalik.dev
- Email: mr.rajatmalik@gmail.com
- LinkedIn: errajatmalik
- GitHub: @malikrajat
If rm-ng-device-detection has helped you build better Angular applications, please consider:
A star helps other developers discover this library and shows your appreciation!
- Help increase visibility in the Angular community
- Support ongoing development and improvements
- Show appreciation for free, quality tools
- Encourage more open-source contributions
Check out my other Angular libraries that might help your project:
This library was inspired by the need for a lightweight, modern device detection solution for Angular applications. Special thanks to the Angular community for their feedback and contributions.
Made with β€οΈ by Rajat Malik
Star on GitHub β’ View on npm β’ Report Issue
