PHPackages                             baligs/user-device-activity - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. baligs/user-device-activity

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

baligs/user-device-activity
===========================

Laravel package for tracking user device activities with multi-device management

v1.0.0(1mo ago)01↓100%MITPHPPHP ^8.0

Since Mar 20Pushed 1mo agoCompare

[ Source](https://github.com/baligs/user-device-activity)[ Packagist](https://packagist.org/packages/baligs/user-device-activity)[ RSS](/packages/baligs-user-device-activity/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (3)Versions (2)Used By (0)

User Device Activity Manager
============================

[](#user-device-activity-manager)

A Laravel 9+ package for tracking user device activities, managing sessions across multiple devices, and providing comprehensive statistics dashboard.

Features
--------

[](#features)

- Track user logins across Web and API guards separately
- Multi-device session management
- Logout specific device, current device, or all devices
- Comprehensive statistics dashboard with Bootstrap 5
- SQLite database support for storing activities
- Configurable data retention period
- IP geolocation tracking
- Device/Browser/OS detection
- Activity logging with metadata
- Auto-cleanup old data

Requirements
------------

[](#requirements)

- PHP 8.0+
- Laravel 9.0, 10.0, or 11.0
- jenssegers/agent package
- SQLite database (recommended)

Installation
------------

[](#installation)

### 1. Install via Composer

[](#1-install-via-composer)

```
composer require baligs/user-device-activity
```

### 2. Publish Configuration

[](#2-publish-configuration)

```
php artisan vendor:publish --provider="Baligs\UserDeviceActivity\Providers\UserDeviceActivityServiceProvider"
php artisan vendor:publish --tag="user-device-activity-config"
```

### 3. Run Migrations

[](#3-run-migrations)

```
php artisan migrate
```

### 4. Configure Environment

[](#4-configure-environment)

Add to your `.env` file:

```
DEVICE_ACTIVITY_DB_CONNECTION=sqlite
DEVICE_ACTIVITY_DB_PATH=database/user_device_activity.sqlite
DEVICE_ACTIVITY_RETENTION_DAYS=365
DEVICE_ACTIVITY_MULTIPLE_SESSIONS=true
DEVICE_ACTIVITY_MAX_SESSIONS=5
```

### 5. Create SQLite Database

[](#5-create-sqlite-database)

```
touch database/user_device_activity.sqlite
```

Configuration
-------------

[](#configuration)

Publish the config file and customize:

```
// config/user-device-activity.php

return [
    'database' => [
        'connection' => env('DEVICE_ACTIVITY_DB_CONNECTION', 'sqlite'),
        'database_path' => env('DEVICE_ACTIVITY_DB_PATH', database_path('user_device_activity.sqlite')),
    ],

    'retention' => [
        'enabled' => env('DEVICE_ACTIVITY_RETENTION_ENABLED', true),
        'days' => env('DEVICE_ACTIVITY_RETENTION_DAYS', 365),
        'cleanup_batch_size' => 1000,
    ],

    'guards' => [
        'web' => [
            'enabled' => true,
            'track_ip' => true,
            'track_user_agent' => true,
            'track_device_type' => true,
            'track_os' => true,
            'track_browser' => true,
            'track_country' => true,
        ],
        'api' => [
            'enabled' => true,
            'track_ip' => true,
            'track_user_agent' => true,
            'track_device_type' => true,
            'track_os' => true,
            'track_browser' => true,
            'track_country' => true,
        ],
    ],

    'features' => [
        'allow_multiple_sessions' => true,
        'max_sessions_per_user' => 5,
        'auto_cleanup' => true,
    ],
];
```

Usage
-----

[](#usage)

### Using the Helper Class

[](#using-the-helper-class)

```
use Baligs\UserDeviceActivity\Helpers\DeviceActivityHelper;

// Create a session (usually called on login)
$session = DeviceActivityHelper::createSession($user, 'web');

// Get current session
$currentSession = DeviceActivityHelper::getCurrentSession('web');

// Get user's all sessions
$sessions = DeviceActivityHelper::getUserSessions($user->id, 'web');

// Logout specific device
DeviceActivityHelper::logoutSession($sessionId);

// Logout current session
DeviceActivityHelper::logoutCurrentSession('web');

// Logout all sessions for a user
$count = DeviceActivityHelper::logoutAllSessions($user->id, 'web');

// Logout all devices across all guards
$count = DeviceActivityHelper::logoutAllDevices($user->id);

// Get last login info
$lastLogin = DeviceActivityHelper::getLastLogin($user->id, 'web');

// Check if user is online
$isOnline = DeviceActivityHelper::isUserOnline($user->id);

// Log custom activity
DeviceActivityHelper::logActivity('custom_action', $user->id, 'web', ['key' => 'value']);
```

### Statistics

[](#statistics)

```
// Get overview stats
$stats = DeviceActivityHelper::getOverviewStats(30);

// Get all stats
$allStats = DeviceActivityHelper::getAllStats(30);

// Get stats by category
$byCountry = DeviceActivityHelper::getLoginsByCountry(30);
$byOS = DeviceActivityHelper::getActiveUsersByOS(30);
$byBrowser = DeviceActivityHelper::getActiveUsersByBrowser(30);
$byDeviceType = DeviceActivityHelper::getActiveUsersByDeviceType(30);
$topUsers = DeviceActivityHelper::getTopActiveUsers(30, 10);
$loginSuccessRate = DeviceActivityHelper::getLoginSuccessRate(30);
```

### Middleware

[](#middleware)

Add middleware to track activity:

```
// In app/Http/Kernel.php
protected $routeMiddleware = [
    'track.device.activity' => \Baligs\UserDeviceActivity\Middleware\TrackDeviceActivity::class,
];

// In routes
Route::middleware(['auth', 'track.device.activity:web'])->group(function () {
    // Your routes
});
```

### Manual Session Tracking in Login Controller

[](#manual-session-tracking-in-login-controller)

```
use Baligs\UserDeviceActivity\Helpers\DeviceActivityHelper;

public function login(Request $request)
{
    // Your existing login logic...

    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();

        // Track device activity
        $session = DeviceActivityHelper::createSession(Auth::user(), 'web');

        return redirect()->intended('/dashboard');
    }

    // Track failed login
    DeviceActivityHelper::logActivity('login_failed', 0, 'web', [
        'email' => $request->email,
    ]);

    return back()->withErrors([
        'email' => 'The provided credentials do not match our records.',
    ]);
}

public function logout(Request $request)
{
    // Track logout before logging out
    DeviceActivityHelper::logoutCurrentSession('web');

    Auth::logout();

    $request->session()->invalidate();
    $request->session()->regenerateToken();

    return redirect('/');
}
```

Dashboard Routes
----------------

[](#dashboard-routes)

Access the dashboard at `/admin/device-activity`:

- Dashboard: `/admin/device-activity`
- All Sessions: `/admin/device-activity/sessions`
- User Devices: `/admin/device-activity/user/{userId}/devices`
- Activities: `/admin/device-activity/activities`

API Endpoints
-------------

[](#api-endpoints)

### Sessions

[](#sessions)

```
GET    /api/device-activity/sessions              - List all sessions
GET    /api/device-activity/sessions/active       - List active sessions
GET    /api/device-activity/sessions/current      - Get current session
GET    /api/device-activity/sessions/{id}         - Get session by ID
DELETE /api/device-activity/sessions/{id}         - Logout session
POST   /api/device-activity/sessions/logout-current
POST   /api/device-activity/sessions/logout-all
POST   /api/device-activity/sessions/logout-all-devices

```

### Stats

[](#stats)

```
GET    /api/device-activity/stats/overview
GET    /api/device-activity/stats/by-country
GET    /api/device-activity/stats/by-device-type
GET    /api/device-activity/stats/by-os
GET    /api/device-activity/stats/by-browser
GET    /api/device-activity/stats/top-users
GET    /api/device-activity/stats/session-stats
GET    /api/device-activity/stats/guard-stats
GET    /api/device-activity/stats/login-success-rate
GET    /api/device-activity/stats/all

```

Dashboard Statistics (20 Types)
-------------------------------

[](#dashboard-statistics-20-types)

1. **Active Sessions** - Total active sessions count
2. **Total Logins** - Number of successful logins
3. **Unique Users** - Distinct users who logged in
4. **Countries** - Number of unique countries
5. **Online Now** - Currently online users
6. **Total Logouts** - Number of logouts
7. **Failed Logins** - Failed login attempts
8. **Devices Logged Out** - Devices manually logged out
9. **By Device Type** - Desktop/Mobile/Tablet breakdown
10. **By Operating System** - Windows/Mac/Linux/Android/iOS stats
11. **By Browser** - Chrome/Firefox/Safari/Edge stats
12. **Login Success Rate** - Percentage of successful logins
13. **Guard Statistics** - Web vs API usage
14. **Session Statistics** - Total/Active/Completed sessions
15. **Activity Breakdown** - All activity types count
16. **Top Countries** - Most active countries
17. **Top Active Users** - Most active users
18. **Recent Logins** - Latest login activities
19. **Hourly Activity** - Activity by hour
20. **Logins by Day** - Daily login trends

Artisan Commands
----------------

[](#artisan-commands)

```
# Cleanup old data
php artisan device-activity:cleanup

# Cleanup with custom days
php artisan device-activity:cleanup --days=30
```

Auto Cleanup
------------

[](#auto-cleanup)

Enable automatic cleanup by adding to `app/Console/Kernel.php`:

```
protected function schedule(Schedule $schedule)
{
    $schedule->command('device-activity:cleanup')->daily();
}
```

License
-------

[](#license)

MIT License - Copyright (c) 2024 baligs

###  Health Score

35

—

LowBetter than 80% of packages

Maintenance90

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity38

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

50d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/c7606e3c9b188a0725f394c41cf3a3250f234df640b0416ba509aa097227fb9a?d=identicon)[baligs](/maintainers/baligs)

---

Top Contributors

[![baligs](https://avatars.githubusercontent.com/u/92466611?v=4)](https://github.com/baligs "baligs (1 commits)")

### Embed Badge

![Health badge](/badges/baligs-user-device-activity/health.svg)

```
[![Health](https://phpackages.com/badges/baligs-user-device-activity/health.svg)](https://phpackages.com/packages/baligs-user-device-activity)
```

###  Alternatives

[wireui/wireui

TallStack components

1.8k1.3M16](/packages/wireui-wireui)[php-soap/wsdl

Deals with WSDLs

173.5M12](/packages/php-soap-wsdl)[ramonrietdijk/livewire-tables

Dynamic tables for models with Laravel Livewire

21147.4k](/packages/ramonrietdijk-livewire-tables)[symfony/ai-bundle

Integration bundle for Symfony AI components

30282.3k6](/packages/symfony-ai-bundle)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

255.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
