# OpenClassify A modern classified ads platform built with Laravel 12, FilamentPHP v5, and Laravel Modules โ€” similar to Letgo and Sahibinden. ## Features - ๐Ÿ›๏ธ **Classified Listings** โ€” Browse, search, and post ads across categories - ๐Ÿ—‚๏ธ **Categories** โ€” Hierarchical categories with icons - ๐Ÿ“ **Locations** โ€” Country and city management - ๐Ÿ‘ค **User Profiles** โ€” Manage your listings and account - ๐Ÿ” **Admin Panel** โ€” Full control via FilamentPHP v5 at `/admin` - ๐Ÿค **Partner Panel** โ€” Users manage their own listings at `/partner/{id}` (tenant isolation) - ๐Ÿงช **Demo Mode** โ€” Per-visitor PostgreSQL schema provisioning with seeded data and automatic cleanup - ๐ŸŒ **10 Languages** โ€” English, Turkish, Arabic, German, French, Spanish, Portuguese, Russian, Chinese, Japanese - ๐Ÿณ **Docker Ready** โ€” One-command production and development setup - โ˜๏ธ **GitHub Codespaces** โ€” Zero-config cloud development ## AI Custom Instructions Project-level custom instruction set files are available at: - `.chatgpt/CUSTOM_INSTRUCTIONS.md` (ChatGPT) - `.codex/CUSTOM_INSTRUCTIONS.md` (Codex) - `.gemini/CUSTOM_INSTRUCTIONS.md` (Google Gemini / Antigravity) ## Tech Stack | Layer | Technology | |-------|-----------| | Framework | Laravel 12 | | Admin UI | FilamentPHP v5 | | Modules | nWidart/laravel-modules v11 | | Auth/Roles | Spatie Laravel Permission | | Frontend | Blade + TailwindCSS + Vite | | Database | PostgreSQL (required for demo mode), SQLite for minimal local dev | | Cache/Queue | Database or Redis | ## Quick Start (Docker) ```bash # Clone the repository git clone https://github.com/openclassify/openclassify.git cd openclassify # Copy environment file cp .env.example .env # Start with Docker Compose (production-like) docker compose up -d # The application will be available at http://localhost:8000 ``` ### Demo Credentials (`DEMO=1` only) | Role | Email | Password | |------|-------|----------| | Admin | a@a.com | 236330 | | Partner | b@b.com | 36330 | Demo preparation auto-logs the visitor into the schema-local admin account, so manual login is usually not required. **Admin Panel:** http://localhost:8000/admin **Partner Panel:** http://localhost:8000/partner --- ## Development Setup ### Option 1: GitHub Codespaces (Zero Config) 1. Click **Code โ†’ Codespaces โ†’ New codespace** on GitHub 2. Wait for the environment to build (~2 minutes) 3. The app starts automatically at port 8000 ### Option 2: Docker Development ```bash # Start development environment with hot reload docker compose -f docker-compose.dev.yml up -d # View logs docker compose -f docker-compose.dev.yml logs -f app ``` ### Option 3: Local (PHP + Node) **Requirements:** PHP 8.2+, Composer, Node 18+, PostgreSQL for demo mode ```bash # Install dependencies composer install npm install # Setup environment cp .env.example .env php artisan key:generate # Database (SQLite for quick start) touch database/database.sqlite php artisan migrate php artisan db:seed # Start all services (server + queue + vite) composer run dev ``` ## Demo Mode Demo mode is designed for isolated visitor sessions. When enabled, each visitor can provision a private temporary marketplace backed by its own PostgreSQL schema. ### Requirements - `DB_CONNECTION=pgsql` - `DEMO=1` - database-backed session / cache / queue drivers are supported and will stay on the public schema via `pgsql_public` If `DEMO=1` is set while the app is not using PostgreSQL, the application fails fast during boot. ### Runtime Behavior - On the first guest homepage visit, the primary visible CTA is a single large `Prepare Demo` button. - The homepage shows how long the temporary demo will live before automatic deletion. - Clicking `Prepare Demo` provisions a visitor-specific schema, runs `migrate` and `db:seed`, and logs the visitor into the seeded admin account. - The same browser reuses its active demo instead of creating duplicate schemas. - Demo lifetime defaults to `360` minutes from explicit prepare / reopen time. - Expired demos are removed by `demo:cleanup`, which is scheduled hourly. ### Environment ```env DB_CONNECTION=pgsql DEMO=1 DEMO_TTL_MINUTES=360 DEMO_SCHEMA_PREFIX=demo_ DEMO_COOKIE_NAME=oc2_demo DEMO_LOGIN_EMAIL=a@a.com DEMO_PUBLIC_SCHEMA=public ``` ### Commands ```bash php artisan migrate --force php artisan db:seed --force php artisan demo:prepare php artisan demo:cleanup ``` ### Notes - `php artisan db:seed` only injects demo-heavy listings, favorites, inbox threads, and demo users when demo mode is enabled. - Public infrastructure tables such as sessions, cache, jobs, and failed jobs remain on the public schema even while visitor requests are switched into demo schemas. --- ## Architecture ### Module Structure ``` Modules/ โ”œโ”€โ”€ Admin/ # FilamentPHP Admin Panel โ”‚ โ”œโ”€โ”€ Filament/ โ”‚ โ”‚ โ””โ”€โ”€ Resources/ # CRUD resources (User, Category, Listing, Location) โ”‚ โ””โ”€โ”€ Providers/ โ”‚ โ”œโ”€โ”€ AdminServiceProvider.php โ”‚ โ””โ”€โ”€ AdminPanelProvider.php โ”‚ โ”œโ”€โ”€ Partner/ # FilamentPHP Tenant Panel โ”‚ โ”œโ”€โ”€ Filament/ โ”‚ โ”‚ โ””โ”€โ”€ Resources/ # Tenant-scoped Listing resource โ”‚ โ””โ”€โ”€ Providers/ โ”‚ โ”œโ”€โ”€ PartnerServiceProvider.php โ”‚ โ””โ”€โ”€ PartnerPanelProvider.php โ”‚ โ”œโ”€โ”€ Category/ # Category management โ”‚ โ”œโ”€โ”€ Models/Category.php โ”‚ โ”œโ”€โ”€ Http/Controllers/ โ”‚ โ”œโ”€โ”€ database/migrations/ โ”‚ โ””โ”€โ”€ database/seeders/ โ”‚ โ”œโ”€โ”€ Listing/ # Listing management โ”‚ โ”œโ”€โ”€ Models/Listing.php โ”‚ โ”œโ”€โ”€ Http/Controllers/ โ”‚ โ”œโ”€โ”€ database/migrations/ โ”‚ โ””โ”€โ”€ database/seeders/ โ”‚ โ”œโ”€โ”€ Location/ # Countries & Cities โ”‚ โ”œโ”€โ”€ Models/{Country,City,District}.php โ”‚ โ”œโ”€โ”€ database/migrations/ โ”‚ โ””โ”€โ”€ database/seeders/ โ”‚ โ””โ”€โ”€ Profile/ # User profile pages โ”œโ”€โ”€ Models/Profile.php โ”œโ”€โ”€ Http/Controllers/ โ””โ”€โ”€ database/migrations/ ``` ### Panels | Panel | URL | Access | |-------|-----|--------| | Admin | `/admin` | Users with `admin` role | | Partner | `/partner/{id}` | All authenticated users (tenant-scoped) | ### Roles (Spatie Permission) | Role | Access | |------|--------| | `admin` | Full admin panel access | | `partner` | Partner panel only (manages own listings) | --- ## Creating a New Module ```bash php artisan module:make ModuleName ``` Then add to `modules_statuses.json`: ```json { "ModuleName": true } ``` --- ## Adding a Filament Resource to Admin Panel Resources are auto-discovered from `Modules/Admin/Filament/Resources/`. --- ## Language Support Languages are in `lang/{locale}/messages.php`. To add a new language: 1. Create `lang/{locale}/messages.php` 2. Switch language via: `GET /lang/{locale}` Supported locales: `en`, `tr`, `ar`, `de`, `fr`, `es`, `pt`, `ru`, `zh`, `ja` --- ## Running Tests ```bash php artisan test ``` --- ## Production Deployment ### Environment Variables ```env APP_ENV=production APP_DEBUG=false APP_URL=https://yourdomain.com DB_CONNECTION=mysql DB_HOST=your-db-host DB_DATABASE=openclassify DB_USERNAME=openclassify DB_PASSWORD=your-secure-password REDIS_HOST=your-redis-host CACHE_STORE=redis SESSION_DRIVER=redis QUEUE_CONNECTION=redis ``` ### Post-Deploy Commands ```bash php artisan migrate --force php artisan db:seed --force # Only on first deploy php artisan config:cache php artisan route:cache php artisan view:cache php artisan storage:link ``` --- ## Contributing 1. Fork the repository 2. Create a feature branch: `git checkout -b feature/your-feature` 3. Commit your changes: `git commit -m 'Add your feature'` 4. Push to the branch: `git push origin feature/your-feature` 5. Open a Pull Request --- ## License MIT License. See [LICENSE](LICENSE) for details.