cleaniquecoders / shrinkr
Shrinkr is a Laravel package for shortening URLs, with custom slugs, analytics, branded domains, and seamless API integration.
Fund package maintenance!
Cleanique Coders
Installs: 1 529
Dependents: 0
Suggesters: 0
Security: 0
Stars: 13
Watchers: 0
Forks: 0
Open Issues: 1
pkg:composer/cleaniquecoders/shrinkr
Requires
- php: ^8.2 | ^8.3 | ^8.4
- cleaniquecoders/traitify: ^1.0
- illuminate/contracts: ^10.0 | ^11.0 | ^12.0
- jenssegers/agent: ^2.6
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- larastan/larastan: ^2.9
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^9.5
- pestphp/pest: ^2.34
- pestphp/pest-plugin-arch: ^2.7
- pestphp/pest-plugin-laravel: ^2.3
- phpstan/extension-installer: ^1.3
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
README
Shrinkr
Shrinkr is a powerful Laravel package for shortening URLs with custom slugs, comprehensive analytics, health monitoring, and seamless integration.
Transform long URLs into short, shareable links with features like custom slugs, click tracking, branded domains, expiry management, and health monitoring.
Features
✅ URL Shortening - Create short URLs with auto-generated or custom slugs ✅ Analytics Tracking - Track clicks, referrers, IP addresses, browsers, and devices ✅ Branded Domains - Use custom domains for your shortened URLs ✅ Expiry Management - Set expiration times for temporary links ✅ Health Monitoring - Automatically check if original URLs are still reachable ✅ Event System - React to URL access and expiry events ✅ Flexible Logging - Log to files or database ✅ Rate Limiting - Built-in middleware to prevent abuse ✅ Artisan Commands - Automate maintenance tasks
Quick Start
Installation
composer require cleaniquecoders/shrinkr php artisan vendor:publish --tag="shrinkr-migrations" php artisan migrate php artisan vendor:publish --tag="shrinkr-config"
Basic Usage
use CleaniqueCoders\Shrinkr\Facades\Shrinkr; // Shorten a URL $shortUrl = Shrinkr::shorten('https://example.com/long-url', auth()->id()); // Result: https://yourdomain.com/s/abc123 // With custom slug $shortUrl = Shrinkr::shorten('https://example.com', auth()->id(), [ 'custom_slug' => 'my-link', ]); // Result: https://yourdomain.com/s/my-link // With expiry (60 minutes) $shortUrl = Shrinkr::shorten('https://example.com', auth()->id(), [ 'expiry_duration' => 60, ]); // Resolve short URL to original $originalUrl = Shrinkr::resolve('abc123');
Documentation
For comprehensive documentation, see the docs directory:
- Getting Started - Installation, configuration, and quick start
- Configuration - Complete configuration reference
- Usage - Shortening, resolving, updating, and deleting URLs
- Features - Analytics, expiry, events, health monitoring
- API Reference - Complete API documentation
- Development - Testing and contributing
Key Documentation Pages
- Installation Guide
- Quick Start Guide
- Configuration Reference
- Shortening URLs
- Analytics Tracking
- URL Expiry
- Health Monitoring
Usage
Here’s a basic usage example using the Shrinkr facade, actions, and events.
1. Shorten a URL
You can shorten a URL with or without a custom slug and expiry duration.
use CleaniqueCoders\Shrinkr\Facades\Shrinkr; // Shorten a URL with default random slug $shortUrl = Shrinkr::shorten('https://example.com/long-url', auth()->id()); echo $shortUrl; // Outputs: https://yourdomain.com/abc123 // Shorten a URL with a custom slug and expiry duration (e.g., 60 minutes) $shortUrlWithCustomSlug = Shrinkr::shorten('https://example.com/long-url', auth()->id(), [ 'custom_slug' => 'my-slug', 'expiry_duration' => 60, // Expires in 60 minutes ]); echo $shortUrlWithCustomSlug; // Outputs: https://yourdomain.com/my-slug
2. Retrieve the Original URL
Use the resolve() method to retrieve the original URL from a shortened one.
$originalUrl = Shrinkr::resolve('abc123'); echo $originalUrl; // Outputs: https://example.com/long-url
When the URL is accessed, the UrlAccessed event will be dispatched automatically to track the visit.
3. Update an Existing Short URL
You can update an existing short URL with a new custom slug or expiry duration.
use CleaniqueCoders\Shrinkr\Models\Url; use CleaniqueCoders\Shrinkr\Facades\Shrinkr; $url = Url::find(1); // Update the short URL with a new slug and expiry duration $updatedUrl = Shrinkr::update($url, [ 'custom_slug' => 'updated-slug', 'expiry_duration' => 120, // 2 hours from now ]); echo $updatedUrl->shortened_url; // Outputs: https://yourdomain.com/updated-slug
4. Event Handling
UrlAccessed Event
The UrlAccessed event is dispatched whenever a shortened URL is accessed. You can listen for this event to log analytics or trigger notifications.
Example: Log URL Access in a Listener
namespace CleaniqueCoders\Shrinkr\Listeners; use CleaniqueCoders\Shrinkr\Events\UrlAccessed; use Illuminate\Support\Facades\Log; class LogUrlAccess { public function handle(UrlAccessed $event) { $url = $event->url; Log::info('URL accessed', [ 'url_id' => $url->id, 'shortened_url' => $url->shortened_url, 'accessed_at' => now(), ]); } }
UrlExpired Event
The UrlExpired event is dispatched when a URL has expired, either through a scheduled check or upon access. You can listen to this event to notify the user or perform other actions.
Example: Notify on URL Expiry in a Listener
namespace CleaniqueCoders\Shrinkr\Listeners; use CleaniqueCoders\Shrinkr\Events\UrlExpired; use Illuminate\Support\Facades\Log; class NotifyUrlExpired { public function handle(UrlExpired $event) { $url = $event->url; Log::warning('URL expired', [ 'url_id' => $url->id, 'shortened_url' => $url->shortened_url, 'expired_at' => now(), ]); // Optionally, notify the user about the expired URL. } }
5. Automatically Expire URLs
If you’ve set an expiry duration, the URL will be marked as expired once that time has passed. You can also run the expiry command manually or schedule it.
Run the Expiry Command Manually:
php artisan shrinkr:check-expiry
Schedule the Expiry Command:
In your app/Console/Kernel.php:
$schedule->command('shrinkr:check-expiry')->hourly();
6. Monitor URL Health
The Link Health Monitoring feature allows you to check if URLs are reachable and mark them as active or expired.
Check Health Action
Use the CheckUrlHealthAction to manually check the health of a specific URL.
use CleaniqueCoders\Shrinkr\Actions\CheckUrlHealthAction; use CleaniqueCoders\Shrinkr\Models\Url; $url = Url::find(1); // Retrieve URL instance $action = new CheckUrlHealthAction(); $isHealthy = $action->execute($url); if ($isHealthy) { echo "URL is active."; } else { echo "URL is expired."; }
Check Health Command
Use the Artisan command to check the health of all URLs in bulk.
php artisan shrinkr:check-health
This command will:
- Check the status of all URLs.
- Mark expired URLs and dispatch the
UrlExpiredevent. - Provide real-time output on the status of each URL.
Example output:
URL abc123 is now marked as active.
URL xyz456 is now marked as expired.
URL health check completed.
Schedule the Health Check Command
You can automatically run the health check at regular intervals using Laravel’s scheduler.
In your app/Console/Kernel.php:
protected function schedule(Schedule $schedule) { $schedule->command('shrinkr:check-health')->hourly(); }
This will ensure that all URLs are continuously monitored and marked as expired when necessary.
7. Redirect Tracking
The redirect feature tracks detailed information such as:
- IP address of the visitor
- Browser and OS (via User-Agent parsing)
- Referrer (where the link was clicked)
- Headers and query parameters
- Optionally store logs in a database or log file
Example database log entry:
| url_id | ip | browser | platform | referrer | created_at |
|---|---|---|---|---|---|
| 1 | 192.168.1.1 | Chrome | Windows | google.com | 2024-10-18 12:34:56 |
8. Routing
You can configure custom domain for the URL by configuring:
'domain' => 'bite.ly',
You may also change the middleware or add new one by configuring:
'middleware' => ['auth', 'verified', 'throttle:600,1']
Testing
Run the tests using:
composer test
Changelog
Refer to the CHANGELOG for the latest updates and changes.
Contributing
We welcome contributions! Please see CONTRIBUTING for guidelines.
Security Vulnerabilities
Report security vulnerabilities by reviewing our security policy.
Credits
License
Shrinkr is open-sourced software licensed under the MIT license.