Events Tracker is a Laravel-based CMS for music and arts communities to track events, venues, artists, series, and related entities. It provides public event listings, user registration, entity management, event templating for recurring series, tagging, calendar views, threaded forums, and photo galleries.
- Repository: geoff-maddock/events-tracker
- Default Branch: main
- License: MIT
- Maintainer: Geoff Maddock (geoff.maddock@gmail.com)
- Version: v2025.01.01 (Stable Release)
- PHP: 8.1+
- Framework: Laravel 10
- Database: MySQL 8 (database agnostic)
- Key Dependencies:
- Laravel Socialite (social authentication)
- Laravel Sanctum (API authentication)
- Spatie Laravel Sitemap
- Intervention Image (image processing)
- eluceo/ical (calendar exports)
- League Flysystem (S3 file storage)
- Sentry (error tracking)
- Laravel Shield (API basic auth)
- CSS Framework: Bootstrap 5
- JavaScript: Vue.js 3, jQuery
- Build Tools: Laravel Mix, Webpack
- UI Libraries:
- FullCalendar 6.1.11
- Select2 4.1
- Lightbox2
- SweetAlert2
- Dropzone 6
- Moment.js
- Static Analysis: PHPStan (Larastan)
- Testing: PHPUnit, Laravel Dusk
- Debugging: Laravel Debugbar, Laravel IDE Helper
- CI/CD: GitHub Actions, Jenkins
/var/www/dev-events/
├── app/
│ ├── Broadcasting/ # Broadcasting channels
│ ├── Console/ # Artisan commands
│ ├── Events/ # Event classes
│ ├── Exceptions/ # Exception handlers
│ ├── Filters/ # Query filters
│ ├── Handlers/ # Event handlers
│ ├── Http/
│ │ ├── Controllers/ # Request controllers
│ │ ├── helpers.php # Helper functions
│ │ └── Flash.php # Flash message handler
│ ├── Listeners/ # Event listeners
│ ├── Mail/ # Mail classes
│ ├── Models/ # Eloquent models (see below)
│ ├── Notifications/ # Notification classes
│ ├── Policies/ # Authorization policies
│ ├── Providers/ # Service providers
│ ├── Services/ # Business logic services
│ └── Traits/ # Reusable traits
├── bootstrap/ # App initialization
├── config/ # Configuration files
├── database/
│ ├── factories/ # Model factories
│ ├── initialize/ # Initialization scripts
│ ├── migrations/ # Database migrations
│ ├── queries/ # SQL queries
│ ├── schema/ # Database schema
│ └── seeders/ # Database seeders
├── docs/ # Documentation
├── public/ # Web root (assets, entry point)
├── resources/ # Views, raw assets
├── routes/ # Route definitions
│ ├── api.php # API routes
│ ├── channels.php # Broadcasting channels
│ ├── console.php # Console routes
│ └── web.php # Web routes
├── storage/ # Logs, cache, uploaded files
├── tests/ # Test suite
└── vendor/ # Composer dependencies
The application manages several interconnected entities:
Core Event Models:
Event- Individual events with dates, venues, entitiesSeries- Recurring event templates (weekly/monthly)EventType- Categories (concert, festival, etc.)EventStatus- Event statesEventResponse- User RSVPsEventReview- User event ratings/reviews
Entity Models:
Entity- Flexible model for venues, artists, promoters, DJs, producersEntityType- Entity categoriesEntityStatus- Entity states
Location Models:
Location- Geographic locationsLocationType- Location categories
Social/Community Models:
User- Registered usersFollow- User follows for events/entitiesLike- User likesComment- Comments on events/entitiesThread- Forum discussionsPost- Forum postsThreadCategory- Forum categories
Content Models:
Photo- Event/entity photosLink- External linksTag- Categorization tagsTagType- Tag categoriesBlog- Blog posts
System Models:
Role- User rolesPermission- Access permissionsGroup- User groupsVisibility- Content visibility settings
EventsController- Event CRUD operationsSeriesController- Series managementEntitiesController- Entity managementVenuesController- Venue-specific operationsThreadsController- Forum functionalityPhotosController- Photo managementUsersController- User administrationCalendarController- Calendar views- API controllers in
app/Http/Controllers/Api/
# Clone repository
git clone git@github.com:geoff-maddock/events-tracker.git
cd events-tracker
# Install PHP dependencies
composer install
# Install Node dependencies
npm install
# Configure environment
cp .env.example .env
# Edit .env with database credentials, app settings
# Generate application key
php artisan key:generate
# Run migrations
php artisan migrate:fresh
# Seed database (choose one):
php artisan db:seed --class=ProdBasicDatabaseSeeder # Minimal data
php artisan db:seed --class=ProdExtraDatabaseSeeder # More complete data
php artisan db:seed --class=ProdPittsburghDatabaseSeeder # Pittsburgh-specific data
# Build frontend assets
npm run dev # Development
npm run prod # Production- MySQL 8.0+ (or compatible database)
- Required PHP extensions:
pdo_mysql,zip - Create database and user with full privileges
CREATE DATABASE events_tracker CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'events_user'@'%' IDENTIFIED BY 'password';
GRANT ALL ON events_tracker.* TO 'events_user'@'%';
FLUSH PRIVILEGES;Key .env variables:
APP_*- Application settings (name, environment, debug)DB_*- Database connectionMAIL_*- Email settingsAWS_*- S3 storage for images (optional)FACEBOOK_*,TWITTER_*- Social integration (optional)SENTRY_*- Error tracking (optional)- Laravel Shield credentials for API basic auth
# Development server
php artisan serve
# Watch and rebuild assets
npm run watch
# Run tests
php artisan test
./vendor/bin/phpunit
# Static analysis
./vendor/bin/phpstan analyseThe API supports two authentication methods:
- Basic Auth: Include
Authorization: Basic base64(username:password)header - Token Auth: Include
Authorization: Bearer {token}header- Acquire token via
POST /api/auth/tokenwith basic auth andtoken_namein body
- Acquire token via
- Visit
/api/docsfor Swagger-generated documentation - Documentation generated from
public/postman/folder
Query parameters for list endpoints:
filters[field]=value- Filter by fieldfilters[tag]=music,art- Filter by any tagfilters[tag_all]=music,art- Filter by all tagssort=field&direction=asc- Sort results
Example: GET /api/events?filters[name]=Concert&filters[tag]=music&sort=start_at&direction=desc
- Create, edit, delete events
- Event templates for recurring series
- Multiple event types and statuses
- Tag-based categorization
- Venue and entity associations
- Photo uploads with S3 support
- RSVPs and event reviews
- iCal export for calendar integration
- Flexible entity model for venues, artists, promoters, DJs, producers
- Entity relationships to events
- Entity following
- Entity-specific pages and profiles
- User registration and authentication
- Social login (Facebook, optional)
- User profiles with custom event views
- Event following
- Commenting system
- Threaded forum discussions
- Like functionality
- Rich text event descriptions
- Photo galleries with Lightbox
- Embedded audio from Bandcamp/SoundCloud
- Calendar view (FullCalendar)
- Responsive design (dark/light themes)
- SEO-optimized headers
- Sitemap generation
- PHPUnit for unit and feature tests
- Laravel Dusk for browser tests
- Run:
php artisan testor./vendor/bin/phpunit tests
- PHPStan/Larastan for code quality
- Configuration:
phpstan.neon,phpstan.neon.dist - Baseline:
phpstan-baseline.neon - Run:
composer phpstan
- Ubuntu LEMP stack recommended
- 2+ vCPUs, 4GB+ RAM
- PHP 8.1+ with required extensions
- MySQL 8.0+
- Node.js 14.15+
- SSL certificate for production
- Provision server and database
- Clone repository
- Configure
.envfile - Run
composer install --no-dev --optimize-autoloader - Run
npm install && npm run prod - Run migrations and seeders
- Configure web server (Nginx/Apache)
- Set up SSL
- Configure DNS
- Set proper file permissions for
storage/andbootstrap/cache/
See docs/deployment_notes.md for detailed instructions.
- Bug Reports: Check existing issues first, then open new issue with details
- Feature Requests: Contact maintainer before opening issue
- Pull Requests: Discuss with maintainer first, ensure PR describes problem/solution
- Questions: Email geoff.maddock@gmail.com
- Follow Laravel conventions
- Pass PHPStan analysis
- Write tests for new features
- Update documentation for significant changes
- Model Relationships: Events, Entities, and Series have complex many-to-many relationships. Check existing relationships before adding new ones.
- Authorization: Uses Laravel policies. Check
app/Policies/before modifying access control. - Query Filters: Uses custom
QueryFilterclass inapp/Filters/. Apply filters consistently. - File Storage: Images can be stored locally or in S3. Check
config/filesystems.php. - Seeding: Multiple seeders for different deployment scenarios. Don't modify production seeders without understanding implications.
- API Routes: Separate from web routes. API uses Sanctum tokens or basic auth.
- Frontend: Uses Laravel Mix for asset compilation. Changes to JS/CSS require rebuild.
- Migrations: Always create new migration files, never edit existing ones.
- Event Queries: Use scopes like
Event::future(),Event::past(),Event::visible($user) - Tags: Many models use polymorphic
tagsrelationship - Photos: Polymorphic relationship for multiple model types
- Visibility: All content has visibility settings (public, private, etc.)
- Soft Deletes: Many models use soft deletion
- User Tracking:
created_by,updated_byfields track user actions
- Current branch
series-playlist-fixsuggests work on series functionality - Check GitHub issues for active bugs and features
- CI/CD via GitHub Actions - ensure tests pass
docs/deployment_notes.md- Detailed deployment guidedocs/api_notes.md- API usage examplesdocs/feature_notes.md- Feature release notesdocs/OembedExtractor*.md- oEmbed functionality documentationCHANGELOG.md- Version historyCONTRIBUTING.md- Contribution guidelinesSECURITY.md- Security policies
- Maintainer: Geoff Maddock
- Email: geoff.maddock@gmail.com
- Issues: https://github.com/geoff-maddock/events-tracker/issues
- Repository: https://github.com/geoff-maddock/events-tracker