{"id":13609090,"url":"https://github.com/openclassify/openclassify","last_synced_at":"2026-03-07T23:01:17.723Z","repository":{"id":34969405,"uuid":"193061961","full_name":"openclassify/openclassify","owner":"openclassify","description":"OpenClassify is modular and most advanced open source classified platform build with Laravel 8.1 \u0026 PHP 8.2 Supported. Included Pyrocms","archived":false,"fork":false,"pushed_at":"2026-03-03T10:38:10.000Z","size":34105,"stargazers_count":298,"open_issues_count":28,"forks_count":97,"subscribers_count":18,"default_branch":"master","last_synced_at":"2026-03-03T10:57:33.418Z","etag":null,"topics":["classified","classified-ads","classified-script","classified-software","classified-web-app","classifieds","laravel","laravel-classified","php","php7","php8","pyrocms"],"latest_commit_sha":null,"homepage":"https://openclassify.com","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openclassify.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":"docs/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"patreon":"openclassify"}},"created_at":"2019-06-21T08:33:41.000Z","updated_at":"2026-03-03T10:38:14.000Z","dependencies_parsed_at":"2023-12-19T12:32:11.998Z","dependency_job_id":"a93c7193-4950-44bb-9a30-d44c8617c2fb","html_url":"https://github.com/openclassify/openclassify","commit_stats":{"total_commits":5604,"total_committers":34,"mean_commits":164.8235294117647,"dds":0.3408279800142755,"last_synced_commit":"7c206dd392d310c81866027ce159d4c1d0da76e2"},"previous_names":[],"tags_count":182,"template":false,"template_full_name":null,"purl":"pkg:github/openclassify/openclassify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclassify%2Fopenclassify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclassify%2Fopenclassify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclassify%2Fopenclassify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclassify%2Fopenclassify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclassify","download_url":"https://codeload.github.com/openclassify/openclassify/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclassify%2Fopenclassify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30236042,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T19:01:10.287Z","status":"ssl_error","status_checked_at":"2026-03-07T18:59:58.103Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["classified","classified-ads","classified-script","classified-software","classified-web-app","classifieds","laravel","laravel-classified","php","php7","php8","pyrocms"],"created_at":"2024-08-01T19:01:32.390Z","updated_at":"2026-03-07T23:01:17.717Z","avatar_url":"https://github.com/openclassify.png","language":"PHP","readme":"# OpenClassify\n\nA modern classified ads platform built with Laravel 12, FilamentPHP v5, and Laravel Modules — similar to Letgo and Sahibinden.\n\n## Features\n\n- 🛍️ **Classified Listings** — Browse, search, and post ads across categories\n- 🗂️ **Categories** — Hierarchical categories with icons\n- 📍 **Locations** — Country and city management\n- 👤 **User Profiles** — Manage your listings and account\n- 🔐 **Admin Panel** — Full control via FilamentPHP v5 at `/admin`\n- 🧭 **Frontend Panel** — Authenticated users manage listings, profile, videos, favorites, and inbox at `/panel`\n- 🧪 **Demo Mode** — Per-visitor PostgreSQL schema provisioning with seeded data and automatic cleanup\n- 🌍 **10 Languages** — English, Turkish, Arabic, German, French, Spanish, Portuguese, Russian, Chinese, Japanese\n- 🐳 **Docker Ready** — One-command production and development setup\n- ☁️ **GitHub Codespaces** — Zero-config cloud development\n\n## AI Custom Instructions\n\nProject-level custom instruction set files are available at:\n\n- `.chatgpt/CUSTOM_INSTRUCTIONS.md` (ChatGPT)\n- `.codex/CUSTOM_INSTRUCTIONS.md` (Codex)\n- `.gemini/CUSTOM_INSTRUCTIONS.md` (Google Gemini / Antigravity)\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Framework | Laravel 12 |\n| Admin UI | FilamentPHP v5 |\n| Modules | nWidart/laravel-modules v11 |\n| Auth/Roles | Spatie Laravel Permission |\n| Frontend | Blade + TailwindCSS + Vite |\n| Database | PostgreSQL (required for demo mode), SQLite for minimal local dev |\n| Cache/Queue | Database or Redis |\n\n## Quick Start (Docker)\n\n```bash\n# Clone the repository\ngit clone https://github.com/openclassify/openclassify.git\ncd openclassify\n\n# Copy environment file\ncp .env.example .env\n\n# Start with Docker Compose (production-like)\ndocker compose up -d\n\n# The application will be available at http://localhost:8000\n```\n\n### Default Accounts\n\n| Role | Email | Password |\n|------|-------|----------|\n| Admin | a@a.com | 236330 |\n| Member | b@b.com | 36330 |\n\nThese 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.\n\n**Admin Panel:** http://localhost:8000/admin\n**Frontend Panel:** http://localhost:8000/panel\n\n---\n\n## Development Setup\n\n### Option 1: GitHub Codespaces (Zero Config)\n\n1. Click **Code → Codespaces → New codespace** on GitHub\n2. Wait for the environment to build (~2 minutes)\n3. The app starts automatically at port 8000\n\n### Option 2: Docker Development\n\n```bash\n# Start development environment with hot reload\ndocker compose -f docker-compose.dev.yml up -d\n\n# View logs\ndocker compose -f docker-compose.dev.yml logs -f app\n```\n\n### Option 3: Local (PHP + Node)\n\n**Requirements:** PHP 8.2+, Composer, Node 18+, PostgreSQL for demo mode\n\n```bash\n# Install dependencies\ncomposer install\nnpm install\n\n# Setup environment\ncp .env.example .env\nphp artisan key:generate\n\n# Database (SQLite for quick start)\ntouch database/database.sqlite\nphp artisan migrate\nphp artisan db:seed\n\n# Start all services (server + queue + vite)\ncomposer run dev\n```\n\n## Demo Mode\n\nDemo mode is designed for isolated visitor sessions. When enabled, each visitor can provision a private temporary marketplace backed by its own PostgreSQL schema.\n\n### Requirements\n\n- `DB_CONNECTION=pgsql`\n- `DEMO=1`\n- database-backed session / cache / queue drivers are supported and will stay on the public schema via `pgsql_public`\n\nIf `DEMO=1` is set while the app is not using PostgreSQL, the application fails fast during boot.\n\n### Runtime Behavior\n\n- On the first guest homepage visit, the primary visible CTA is a single large `Prepare Demo` button.\n- The homepage shows how long the temporary demo will live before automatic deletion.\n- Clicking `Prepare Demo` provisions a visitor-specific schema, runs `migrate` and `db:seed`, and logs the visitor into the seeded admin account.\n- The same browser reuses its active demo instead of creating duplicate schemas.\n- Demo lifetime defaults to `360` minutes from explicit prepare / reopen time.\n- Expired demos are removed by `demo:cleanup`, which is scheduled hourly.\n\n### Environment\n\n```env\nDB_CONNECTION=pgsql\nDEMO=1\nDEMO_TTL_MINUTES=360\nDEMO_SCHEMA_PREFIX=demo_\nDEMO_COOKIE_NAME=oc2_demo\nDEMO_LOGIN_EMAIL=a@a.com\nDEMO_PUBLIC_SCHEMA=public\n```\n\n### Commands\n\n```bash\nphp artisan migrate --force\nphp artisan db:seed --force\nphp artisan demo:prepare\nphp artisan demo:cleanup\n```\n\n### Notes\n\n- `php artisan db:seed` only injects demo-heavy listings, favorites, inbox threads, and demo users when demo mode is enabled.\n- 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.\n\n---\n\n## Architecture\n\n### Module Structure\n\n```\nModules/\n├── Admin/              # FilamentPHP Admin Panel\n│   ├── Filament/\n│   │   └── Resources/  # CRUD resources (User, Category, Listing, Location)\n│   └── Providers/\n│       ├── AdminServiceProvider.php\n│       └── AdminPanelProvider.php\n│\n├── Category/           # Category management\n│   ├── Models/Category.php\n│   ├── Http/Controllers/\n│   ├── database/migrations/\n│   └── database/seeders/\n│\n├── Listing/            # Listing management\n│   ├── Models/Listing.php\n│   ├── Http/Controllers/\n│   ├── database/migrations/\n│   └── database/seeders/\n│\n├── Location/           # Countries \u0026 Cities\n│   ├── Models/{Country,City,District}.php\n│   ├── database/migrations/\n│   └── database/seeders/\n│\n└── User/               # Users, auth, profile, and account flows\n    ├── App/Http/Controllers/\n    ├── App/Models/\n    ├── Database/Seeders/\n    └── database/migrations/\n```\n\n### Panels\n\n| Panel | URL | Access |\n|-------|-----|--------|\n| Admin | `/admin` | Users with `admin` role |\n| Frontend Panel | `/panel` | All authenticated users |\n\n### Roles (Spatie Permission)\n\n| Role | Access |\n|------|--------|\n| `admin` | Full admin panel access |\n\n---\n\n## Code Contributors\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://openclassify.com\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/openclassify/openclassify/master/public/openclassify-logo.png\" width=\"220\" alt=\"OpenClassify Logo\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nOpenClassify is a modular open source classified platform built with Laravel.\n\n- Website: [openclassify.com](https://openclassify.com)\n- Package: [openclassify/openclassify](https://packagist.org/packages/openclassify/openclassify)\n\nThis project is maintained and improved by its contributors.\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/openclassify/openclassify/graphs/contributors\"\u003e\n    \u003cimg src=\"https://contrib.rocks/image?repo=openclassify/openclassify\" alt=\"OpenClassify Contributors\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Creating a New Module\n\n```bash\nphp artisan module:make ModuleName\n```\n\nThen add to `modules_statuses.json`:\n```json\n{\n    \"ModuleName\": true\n}\n```\n\n---\n\n## Adding a Filament Resource to Admin Panel\n\nResources are auto-discovered from `Modules/Admin/Filament/Resources/`.\n\n---\n\n## Language Support\n\nLanguages are in `lang/{locale}/messages.php`. To add a new language:\n\n1. Create `lang/{locale}/messages.php`\n2. Switch language via: `GET /lang/{locale}`\n\nSupported locales: `en`, `tr`, `ar`, `de`, `fr`, `es`, `pt`, `ru`, `zh`, `ja`\n\n---\n\n## Running Tests\n\n```bash\nphp artisan test\n```\n\n---\n\n## Production Deployment\n\n### Environment Variables\n\n```env\nAPP_ENV=production\nAPP_DEBUG=false\nAPP_URL=https://yourdomain.com\n\nDB_CONNECTION=mysql\nDB_HOST=your-db-host\nDB_DATABASE=openclassify\nDB_USERNAME=openclassify\nDB_PASSWORD=your-secure-password\n\nREDIS_HOST=your-redis-host\nCACHE_STORE=redis\nSESSION_DRIVER=redis\nQUEUE_CONNECTION=redis\n```\n\n### Post-Deploy Commands\n\n```bash\nphp artisan migrate --force\nphp artisan db:seed --force    # Only on first deploy\nphp artisan config:cache\nphp artisan route:cache\nphp artisan view:cache\nphp artisan storage:link\n```\n\n---\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/your-feature`\n3. Commit your changes: `git commit -m 'Add your feature'`\n4. Push to the branch: `git push origin feature/your-feature`\n5. Open a Pull Request\n\n---\n\n## License\n\nMIT License. See [LICENSE](LICENSE) for details.\n","funding_links":["https://patreon.com/openclassify"],"categories":["PHP"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclassify%2Fopenclassify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenclassify%2Fopenclassify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclassify%2Fopenclassify/lists"}