Filtering
From three filtering mechanisms to one contract
Query params, URL search params, and dynamic segments were all doing overlapping jobs. I collapsed them into one clear contract: location lives in the path as canonical, indexable segments, and refinements like type, price, and beds live as well-defined query params. One place decides how a filter maps to a query, so the same input always produces the same result.