# 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` - ๐Ÿงญ **Frontend Panel** โ€” Authenticated users manage listings, profile, videos, favorites, and inbox at `/panel` - ๐Ÿงช **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 ``` ### Default Accounts | Role | Email | Password | |------|-------|----------| | Admin | a@a.com | 236330 | | Member | b@b.com | 36330 | These accounts are seeded by `Modules\User\Database\Seeders\AuthUserSeeder`. In demo mode, demo preparation still auto-logs the visitor into the schema-local admin account. **Admin Panel:** http://localhost:8000/admin **Frontend Panel:** http://localhost:8000/panel --- ## 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 โ”‚ โ”œโ”€โ”€ 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/ โ”‚ โ””โ”€โ”€ User/ # Users, auth, profile, and account flows โ”œโ”€โ”€ App/Http/Controllers/ โ”œโ”€โ”€ App/Models/ โ”œโ”€โ”€ Database/Seeders/ โ””โ”€โ”€ database/migrations/ ``` ### Panels | Panel | URL | Access | |-------|-----|--------| | Admin | `/admin` | Users with `admin` role | | Frontend Panel | `/panel` | All authenticated users | ### Roles (Spatie Permission) | Role | Access | |------|--------| | `admin` | Full admin panel access | --- ## Code Contributors

OpenClassify Logo

OpenClassify is a modular open source classified platform built with Laravel. - Website: [openclassify.com](https://openclassify.com) - Package: [openclassify/openclassify](https://packagist.org/packages/openclassify/openclassify) This project is maintained and improved by its contributors.

OpenClassify Contributors

## 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.