Lawyer Directory

A full-stack lawyer directory with rich filtering by practice area, language, location, and verification status. Built with Laravel, React, and Inertia.js with a Filament admin panel for managing listings, verification, and featured placement.

The brief

A client needed a public-facing lawyer directory where potential clients could search for and connect with lawyers across multiple practice areas and jurisdictions. Existing options were either generic business directories with no legal-specific filtering, or expensive subscription platforms that charged lawyers per lead. The goal was a purpose-built platform where lawyers could be listed with full professional profiles, and visitors could filter by practice area, location, languages, consultation fee, and experience level.

The brief had two firm requirements: meaningful search that reflects how people actually look for legal help (by specialism and language, not just name), and a verification layer so visitors could distinguish credentialled, bar-registered lawyers from unverified listings. This meant building a data model rich enough to store bar admission details, jurisdictions, education, and work history alongside the searchable fields.

Project details

Industry Legal Services
Timeline Project-based
Type Full Stack
Stack
FilamentPHP Laravel MySQL React TailwindCSS

Need something similar?

Let's discuss your project

What was built

The platform serves two user types — public visitors searching for lawyers, and administrators managing the directory — each with a distinct set of views and actions.
Lawyer search
  • Full-text search across name, tagline, city, and firm name
  • Practice area filter covering primary and additional specialisms
  • Consultation fee cap filter with free consultation toggle
  • Language filter with multi-language support (30+ languages)
  • Experience range filter (e.g. 0–5 years, 10+ years)
  • Verified-only filter for bar-admitted lawyers
  • Paginated results (12 per page) sorted by featured then verified status
Lawyer profiles
  • Full profile page with bio, tagline, and contact details
  • Primary and additional practice areas displayed
  • Bar admission details: bar number, association, and admission year
  • Jurisdictions list with country, bar association, and status
  • Education history: institution, degree, field, and years
  • Work experience timeline with firm, role, city, and dates
  • Certifications and awards sections
  • Languages spoken with proficiency levels
  • Free consultation badge and consultation fee display
  • Firm name, firm size, and cases handled indicators
Admin panel
  • Lawyer record creation, editing, and soft deletion
  • Full form covering all profile fields with structured repeater inputs
  • Practice area management — create, edit, and view
  • Featured and active status toggles per listing
  • Verified status management with timestamp tracking
  • Infolist view for reviewing a lawyer's complete profile at a glance
  • Filterable and sortable lawyer table with key stats
Directory data model
  • Lawyers with slugged URLs generated automatically from first and last name
  • Practice areas as a standalone relational table with lawyer counts
  • JSON columns for arrays: languages, jurisdictions, education, experience, certifications, awards, and additional practice areas
  • Soft deletes on lawyer records to preserve data integrity
  • verified_at timestamp distinguishing verified from unverified listings

Screenshots

Screenshots of the live application.

Lawyer directory search page showing 22 results in a three-column card grid, with sidebar filters for practice area, consultation fee, free consultation toggle, spoken language, experience range, and verified status
Directory search filterable lawyer listings with practice area, language, fee, and verified status filters
Lawyer profile page for Sophie Beaumont showing a featured badge, practice area tags, key stats (18 years experience, 340+ cases, 1 jurisdiction, 3 languages), bio, education history, professional experience timeline, certifications, awards, languages spoken, and a sidebar with consultation fee, contact details, bar admission, and jurisdiction details
Lawyer profile page, full professional profile with education, experience timeline, bar admission details, and consultation booking sidebar
Filament admin panel showing the lawyers list table with columns for lawyer name and tagline, primary practice area, location, firm name, active status, featured status, verified date, and view and edit actions
Admin panel; lawyer management table with active, featured, and verified status columns

Technical notes

Rich filtering without a search engine
All filters are implemented in Eloquent using conditional query scopes. Practice area filtering checks both the primary_practice_area_id column and a JSON array column (additional_practice_areas) using whereJsonContains, so a lawyer who practises employment law as a secondary specialism still appears in that filter. Language filtering works the same way against a nested JSON structure — no external search engine required.
Slug generation
Lawyer profile URLs are generated automatically from first and last name using spatie/laravel-sluggable. Slugs are deduplicated on collision, so two lawyers named John Smith get distinct URLs without any manual intervention.
Featured and verified ordering
Search results always surface featured lawyers first, then verified lawyers, then the rest. This is a single orderByDesc('featured')->orderByDesc('verified_at') chain applied before pagination, keeping the ordering logic in the query layer rather than the frontend.
Admin panel architecture
The Filament resources are split into focused classes: a dedicated LawyerForm schema for the create/edit form, a LawyerInfolist schema for the read-only view, and a LawyersTable class for the list view. This keeps each concern independently editable without a monolithic resource file.

Have a similar project?

Get in touch with a brief description of what you need and I'll come back to you within 24 hours.