| .ai/mcp | ||
| .chatgpt | ||
| .codex | ||
| .devcontainer | ||
| .gemini | ||
| app | ||
| bootstrap | ||
| config | ||
| database | ||
| docker | ||
| lang | ||
| Modules | ||
| public | ||
| resources | ||
| routes | ||
| storage | ||
| stubs/nwidart-stubs | ||
| .editorconfig | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| .styleci.yml | ||
| AGENTS.md | ||
| artisan | ||
| boost.json | ||
| composer.json | ||
| docker-compose.dev.yml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| Dockerfile.dev | ||
| modules_statuses.json | ||
| package.json | ||
| postcss.config.js | ||
| README.md | ||
| tailwind.config.js | ||
| vite-module-loader.js | ||
| vite.config.js | ||
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)
# 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 | 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)
- Click Code → Codespaces → New codespace on GitHub
- Wait for the environment to build (~2 minutes)
- The app starts automatically at port 8000
Option 2: Docker Development
# 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
# 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=pgsqlDEMO=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 Demobutton. - The homepage shows how long the temporary demo will live before automatic deletion.
- Clicking
Prepare Demoprovisions a visitor-specific schema, runsmigrateanddb: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
360minutes from explicit prepare / reopen time. - Expired demos are removed by
demo:cleanup, which is scheduled hourly.
Environment
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
php artisan migrate --force
php artisan db:seed --force
php artisan demo:prepare
php artisan demo:cleanup
Notes
php artisan db:seedonly 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/
│
└── Profile/ # User profile pages
├── Models/Profile.php
├── Http/Controllers/
└── 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 |
partner |
Partner panel only (manages own listings) |
Creating a New Module
php artisan module:make ModuleName
Then add to modules_statuses.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:
- Create
lang/{locale}/messages.php - Switch language via:
GET /lang/{locale}
Supported locales: en, tr, ar, de, fr, es, pt, ru, zh, ja
Running Tests
php artisan test
Production Deployment
Environment Variables
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
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
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature - Commit your changes:
git commit -m 'Add your feature' - Push to the branch:
git push origin feature/your-feature - Open a Pull Request
License
MIT License. See LICENSE for details.