Ridgeway
Find the address that fits.
Ridgeway is a UK property marketplace I designed and built. Buyers search a split map and list view with a dense filter rail, sellers publish listings through a guided wizard, agents work leads in a pipeline, and admins moderate every listing before it goes live. It shows how I approach filter-heavy search, media pipelines and role-scoped dashboards.
- React.js
- Laravel
- PHP
- MySQL
- REST API
Overview
- Business problem
- Property portals tend to bury the home under filters, slow map reloads and unmoderated listings. Sellers struggle with long forms and lost photo uploads, and agents chase enquiries across inboxes with no clear next step.
- Product objective
- Build one marketplace where buyers get fast, filter-heavy search, sellers publish confidently, agents see every lead in a single pipeline, and every listing is checked before it reaches the public.
- Target users
- Home buyers and renters, private sellers and landlords, estate agents handling a local patch, and an internal moderation team.
- Solution
- A React front end over a Laravel API. Search runs through a dedicated filter service backed by MySQL indexes, listings move through an explicit approval state machine, uploaded images are processed asynchronously, and each role gets a dashboard scoped to what it is allowed to see and do.
Project classification
- Project type
- Marketplace · Web application
- Industry
- Real estate
- Frontend
- React single-page app with a split map and list search view
- Backend
- Laravel modular monolith exposing a REST API
- Database
- MySQL with composite and spatial indexes for search
- Architecture
- Modular monolith with a search service and a moderation state machine
User roles
- Buyer
- Seller
- Agent
- Admin
My role
- Designed the product, information architecture and the visual system as a solo portfolio piece.
- Modelled the MySQL schema for properties, locations, listings, enquiries, viewings and approvals.
- Designed the REST API and the Laravel service layer, including the search and filter service.
- Implemented role-based access control for buyer, seller, agent and admin scopes with Laravel policies.
- Built the React front end: search, property detail, comparison and the dashboards.
- Designed the listing approval workflow and the image upload pipeline.
- Integrated mail notifications and a viewing scheduler through queued jobs.
Key features
Search results. Interface designed and built by Vikrant. Search with a split map and list
Buyers search by area and refine with price, property type, bedrooms, bathrooms, minimum area and amenities. The result list and the map pins stay in step, and moving the map can re-run the search for the visible bounds. Any combination of filters can be saved as an alert.
Property detail. Interface designed and built by Vikrant. Property detail built around the images
A large gallery leads, followed by the facts a buyer scans first: bedrooms, bathrooms, parking and floor area. A viewing panel shows real slots, an agent card keeps the next step obvious, and an illustrative monthly payment is clearly labelled as an estimate.
Compare homes. Interface designed and built by Vikrant. Side-by-side comparison
Buyers pick up to four saved homes and compare price, price per square foot, tenure, parking, EPC and council tax band. The best value in each row is highlighted so trade-offs are visible at a glance, and viewings can be requested for the whole shortlist.
Seller dashboard. Interface designed and built by Vikrant. Seller dashboard
Sellers and landlords see views, saves, enquiries and viewing requests per property in one place. Status pills show whether a home is live, under offer, let agreed, pending approval or still a draft, and viewing requests can be confirmed without leaving the page.
Add-listing wizard. Interface designed and built by Vikrant. Add-listing wizard
Six short steps replace one long form, with a live preview of the listing card and a checklist that shows what is still missing. Photos upload in the background and show their processing state, so a slow connection never blocks the rest of the form.
Agent lead pipeline. Interface designed and built by Vikrant. Agent lead pipeline
Enquiries arrive in a board running from new enquiry through contacted, viewing booked and offer made to closed. Leads are assigned by postcode area and current workload, each card shows its next action, and overdue replies are called out.
Admin approvals. Interface designed and built by Vikrant. Admin approvals and reports
Moderators work an approval queue with automated checks for photos, identity, EPC certificate and duplicate images. They approve, request changes or reject with a reason, and the same view shows weekly listing volume and decision outcomes.
Also in the product
- Buy and rent search with map and list views
- Filters for price, type, beds, baths, area and amenities
- Saved homes, comparison and saved-search alerts
- Viewing requests and inquiry history
- Seller add-listing wizard with image pipeline
- Agent lead pipeline with automatic assignment
- Admin approval queue and reports
User flow
- A buyer searches Manchester, applies price, bedroom and amenity filters, and moves the map.
- They save two homes, add a third from another city to compare, and turn the search into an alert.
- From the detail page they request a Saturday viewing and the agent is notified.
- The agent confirms the slot, the buyer receives a calendar invite and a reminder.
- Meanwhile a seller completes the wizard, uploads photos and submits the listing.
- A moderator reviews the automated checks and approves it.
- The listing goes live and matching saved searches send their alerts.
Technical architecture
- React single-page app (search, detail, dashboards)
- REST API (Laravel) with role-based access control
- Search and filter service
- Listing moderation workflow (state machine)
- MySQL with composite and spatial indexes
- Image storage and CDN
- Queue workers: mail, image processing, saved-search alerts
- Viewing scheduler
Database and backend
Search and filter indexing
- A single search endpoint accepts location, bounds, price, type, bedrooms, bathrooms, area and amenity parameters, all validated by a form request.
- Composite indexes lead with the most selective equality columns (listing type, status, location) followed by range columns such as price.
- Map search uses a spatial point column with a bounding-box query first and distance sorting applied only to the narrowed result set.
- Amenities live in a pivot table; common amenity filters are denormalised into flag columns on the listing so they stay indexable.
- Sorting is deterministic with a tie-breaker on the listing id, and results use keyset pagination so deep pages stay fast.
- Map pins come from a lean projection endpoint that returns only id, price and coordinates.
Listing approval workflow
- Statuses: Draft, Pending approval, Live, Under offer, Sold and Let agreed.
- Allowed transitions are defined in one place, and every change writes an approval record with actor, reason and timestamp.
- Submitting a listing runs automated checks (photo count, identity, EPC document, duplicate image hashes) before it reaches the queue.
- Request changes returns the listing to Draft with moderator notes; only approved listings are visible to search.
- Edits to price or photos on a live listing trigger a lightweight re-review rather than unpublishing it.
Media pipeline
- Photos upload straight to object storage through short-lived signed URLs, so large files never pass through the API.
- A queued job validates type and size, strips location metadata, generates responsive sizes in modern formats and stores a content hash.
- The content hash feeds duplicate detection during moderation.
- The wizard polls each image's processing state and shows Ready or Optimising per photo.
- Originals are kept private; only derived sizes are served through the CDN.
Leads, viewings and alerts
- Enquiries create a lead assigned to an agent by postcode area, then by current open workload.
- Viewing requests check the agent's calendar and existing bookings before offering slots.
- Reminders and confirmations go through queued mail jobs with retry and failure logging.
- Saved searches are re-evaluated when a listing goes live and batched into a single alert per buyer.
Access control
- Laravel policies scope every query by role: buyers see their own saves and enquiries, sellers see their own properties, agents see assigned leads, admins see moderation data.
- API tokens are issued per session and every mutation is authorised server-side.
Challenges and solutions
Filter-heavy search stays fast as combinations grow.
Indexes were designed against the real query shapes: equality columns first, one range column last. Amenity filters use indexed flag columns, deep pagination uses keyset cursors, and query plans were checked with EXPLAIN before adding any index.
Listing approval must be safe, auditable and not annoying for sellers.
A single transition table defines what is allowed, each change writes an approval record, and automated checks pre-filter the queue. Minor edits to live listings trigger targeted re-review instead of hiding the property.
Large photo uploads fail on slow connections and block the form.
Direct signed uploads, background processing jobs and per-photo state mean the wizard never waits on the server. A failed file can be retried on its own without losing the draft.
Leads need to reach the right agent without manual triage.
Assignment first matches the agent covering the property's postcode area, then breaks ties by open lead count. Managers can reassign, and every assignment is recorded.
Four roles need different dashboards without duplicated code.
Policies and query scopes enforce access on the server, while the React app composes shared dashboard components from a role-aware navigation config instead of separate apps.
Saved-search alerts can spam buyers when many listings go live at once.
Matching runs in a queued job after approval and results are batched into one alert per buyer per window, with the matched filters shown so the alert is easy to understand.
Results
- Search, comparison and listing flows covered end to end for all four roles.
- A moderation workflow where every status change is explicit and traceable.
- An upload experience that keeps the wizard responsive on slow networks.
- A schema and index design that makes the filter combinations buyers use predictable to query.
- A visual system that stays image-led without relying on stock photography.
Qualitative outcomes only; no usage or revenue figures.
Visual identity
- Primary #0F2A43
- Secondary #5F6B73
- Accent #B8893B
- Background #F7F5F0
Outfit for headings, Inter for interface text. Ridge-line mark over a wordmark. Image-led listing cards, a persistent filter rail and a split map and list view.
Related projects
- Portfolio ProjectHealthcare
CareBridge
Clinic portal with appointments, records and role-based access for five user types.
- React.js
- Laravel
- PHP
- MySQL
- REST API
- Sanctum
- RBAC
- Portfolio ProjectProfessional services (multi-vertical)
Slotwise
Scheduling SaaS for any business that sells time: calendars, availability rules and automated reminders.
- React.js
- Laravel
- PHP
- MySQL
- REST API