Getting started
Product overview
Sharkhex Classifieds is a classifieds marketplace: people post listings with photos, buyers search, filter, save searches and write to sellers, and the operator moderates. Each brand runs its own install with its own domain, database, settings and look.
Who uses it
| Role | What they do |
|---|---|
| Visitor | Browses and searches listings, category and place pages, seller pages. |
| Private seller | Posts and manages listings (within the free limits per category), answers messages and offers, reviews. |
| Business seller | Same as a private seller, with a company name and VAT ID on the seller page and no free-listing limits. |
Admin (ROLE_ADMIN) | Moderates listings, reports and users, edits categories, attributes, locations, pages and settings. |
What it does
- Listings: title, description, price with a price type (fixed, negotiable, free, exchange), condition, photos in several sizes, attributes that depend on the category (number, choice, yes/no), location, expiry and renewal, reserved listings.
- Search: text, category tree, region, locality and distance, price, attributes, sorting; search suggestions, recent and popular searches; landing pages per category and place (
/road-bikes/cluj/cluj-napoca) with their own titles and a sitemap. - Buyers: favourites, saved searches with instant or daily alerts, recently viewed listings and recommendations, messages, price offers with counter-offers.
- Sellers: dashboard with listings, statistics per listing (views, phone reveals, favourites, messages), seller page with reviews, phone verification by text message.
- Notifications: in the site (bell), by email and by push to the mobile app, chosen per type by each user.
- Moderation: reports with automatic hiding after a threshold, banned words, copied-photo detection, a pending-review queue, bans, an audit log.
- Privacy: cookie consent, data export, account deletion, retention periods for personal data.
- Admin dashboard: figures for the last 7, 30 or 90 days with the period before, charts, exports to Excel or CSV.
- Business accounts: company details, a team of colleagues who work for the company from their own logins, and stock imported from CSV or XML feeds.
- Jobs: categories can take applications with a CV that only the employer sees.
- Professionals (when turned on): profiles with skills and rates, requests for work, quotes, mutual reviews, and a search by skill, rate and rating.
- API for the mobile app (
/api/v1) with OpenAPI documentation at/api/doc.
How it is built
| Part | Technology |
|---|---|
| Backend | Symfony 8, PHP 8.4, Doctrine ORM |
| Database | MySQL 8 |
| Web server | FrankenPHP (Caddy) in the Docker image; any PHP server works |
| Background work | Symfony Messenger worker: email, push, saved-search alerts and the scheduled daily jobs |
| Files | Local disk or any S3-compatible storage, with an optional CDN |
| Front end | Twig, Bootstrap 5, Stimulus and Turbo, built with Webpack Encore |
| Admin | EasyAdmin |
| Mobile app | Expo (React Native), talking to /api/v1 |
White-label
Everything that makes an install a brand lives outside the code: settings in the admin (name, logo, colours, texts, legal details, currency, country, language), the category tree and attributes, content pages, and an optional theme folder for layout changes (Platform Configuration). Updates replace the code without touching any of that.
Found a mistake? Tell us.