# urless

Advanced URL shortener and monetized redirect platform built as a single Laravel monolith.

## Stack

- Laravel 13
- Filament 5 admin panel at `/admin`
- Blade + Livewire/Volt-ready structure
- Tailwind CSS
- Laravel Sanctum
- Spatie Permission
- MySQL as the production/default database

## Implemented Slice

- Guest short-link creation from the homepage
- Auth scaffolding with login, registration, password reset, and profile management
- User dashboard with link and click summary metrics
- Link management pages at `/links` and `/links/create`
- Direct redirects at `/u/{code}`
- Token-based interstitial redirects at `/go/{token}`
- Click logging with hashed IP, referrer, UTM, device, browser, OS, bot estimate, GeoIP country/city, and timestamps
- Filament resources for users, links, interstitial ads, click logs, domains, plans, CMS pages, and reports
- Demo seed data for admin, creator, plan, CMS pages, and an interstitial demo link

## Demo Access

- Admin: `admin@urless.test` / `password`
- Creator: `creator@urless.test` / `password`
- Demo link: `/u/demo-offer`

## Local Commands

```bash
composer install
npm install
php artisan migrate:fresh --seed
npm run build
php artisan serve --host=127.0.0.1 --port=8000
```

MySQL setup:

```bash
cp .env.mysql.example .env
php artisan key:generate
# Create a MySQL database named urless, then update DB_USERNAME/DB_PASSWORD if needed.
php artisan migrate:fresh --seed
```

Geo traffic:

```bash
# Default free provider. Use "ip-api" as an alternate provider, or "disabled" to turn lookup off.
GEOIP_PROVIDER=ipapi
GEOIP_TIMEOUT=2
GEOIP_CACHE_DAYS=7
```

Quality checks:

```bash
vendor/bin/pint --test
php artisan test
npm audit
npm run build
```

## Next Phase

- Password-protected redirect unlock flow
- QR code generation and bulk CSV importer
- Custom domain verification workflow
- Billing/subscription gateway integration
- API v1 endpoints with Sanctum tokens
- Abuse reporting review queue and blocked-domain checks
- Installer wizard and Codecanyon documentation package
