\n \n \n \n Explore\n \n \n \n \n \n \n \n \n \n Favourites\n \n {towns.map((town) => (\n \n ))}\n \n \n \n \n About us\n \n \n Whereshome was founded in 2021 and helps people find the home of\n their dreams in the locations of their dreams. Once we help you\n find a place that feels like home via our seamless search tool,\n we’ll connect you with local services to take care of the next\n steps, or help you ourselves with our dedicated concierge service.\n \n \n \n \n \n This website uses cookies to enhance the user experience.\n \n
\n )\n}\n\nfunction FooterListItem({ path, text }) {\n const classes = useStyles()\n const history = useHistory()\n\n return (\n \n history.push(path)} className={classes.link}>\n {text}\n \n \n )\n}\n","export default __webpack_public_path__ + \"static/media/homebanner-2.ba422198.jpg\";","export const COUNTIES = [\n \"Aberdeenshire\",\n \"Anglesey\",\n \"Angus\",\n \"Argyllshire\",\n \"Ayrshire\",\n \"Banffshire\",\n \"Bedfordshire\",\n \"Berkshire\",\n \"Berwickshire\",\n \"Brecknockshire\",\n \"Buckinghamshire\",\n \"Buteshire\",\n \"Caernarfonshire\",\n \"Caithness\",\n \"Cambridgeshire\",\n \"Cardiganshire\",\n \"Carmarthenshire\",\n \"Cheshire\",\n \"Clackmannanshire\",\n \"Cornwall\",\n \"County Antrim\",\n \"County Armagh\",\n \"County Down\",\n \"County Durham\",\n \"County Fermanagh\",\n \"County Londonderry\",\n \"County Tyrone\",\n \"Cumberland\",\n \"Denbighshire\",\n \"Derbyshire\",\n \"Devon\",\n \"Dorset\",\n \"Dumfriesshire\",\n \"Dunbartonshire\",\n \"East Lothian\",\n \"Essex\",\n \"Fife\",\n \"Flintshire\",\n \"Glamorgan\",\n \"Gloucestershire\",\n \"Greater London\",\n \"Gwynedd\",\n \"Hampshire\",\n \"Herefordshire\",\n \"Hertfordshire\",\n \"Huntingdonshire\",\n \"Inverness-shire\",\n \"Isle of Islay\",\n \"Isle of Lewis\",\n \"Isle of Skye\",\n \"Isle of Wight\",\n \"Isles of Scilly\",\n \"Kent\",\n \"Kincardineshire\",\n \"Kinross-Shire\",\n \"Kirkcudbrightshire\",\n \"Lanarkshire\",\n \"Lancashire\",\n \"Leicestershire\",\n \"Lincolnshire\",\n \"Liverpool\",\n \"London\",\n \"Manchester\",\n \"Merioneth\",\n \"Middlesex\",\n \"Midlothian\",\n \"Monmouthshire\",\n \"Montgomeryshire\",\n \"Morayshire\",\n \"Nairnshire\",\n \"Norfolk\",\n \"Northamptonshire\",\n \"Northumberland\",\n \"Nottinghamshire\",\n \"Orkney\",\n \"Oxfordshire\",\n \"Peeblesshire\",\n \"Pembrokeshire\",\n \"Perthshire\",\n \"Radnorshire\",\n \"Renfrewshire\",\n \"Ross-shire\",\n \"Roxburghshire\",\n \"Rutland\",\n \"Selkirkshire\",\n \"Shetland\",\n \"Shropshire\",\n \"Somerset\",\n \"Staffordshire\",\n \"Stirlingshire\",\n \"Suffolk\",\n \"Surrey\",\n \"Sussex\",\n \"Sutherland\",\n \"Warwickshire\",\n \"West Lothian\",\n \"Westmorland\",\n \"Wigtownshire\",\n \"Wiltshire\",\n \"Worcestershire\",\n \"Yorkshire \"\n]\n\nexport const REGIONS = [\n \"East Midlands\",\n \"East of England\",\n \"Greater London\",\n \"London\",\n \"North East\",\n \"North West\",\n \"Northern Ireland\",\n \"Scotland\",\n \"South East\",\n \"South West\",\n \"Wales\",\n \"West Midlands\",\n \"Yorkshire and the Humber\"\n]\n\nexport const SCHOOL_RATINGS = {\n 1: \"Poor schools\",\n 2: \"Average schools\",\n 3: \"Good schools\",\n 4: \"Very good schools\"\n}\n\nexport const CRIME_RATINGS = {\n 1: \"Very low crime\",\n 2: \"Low crime\",\n 3: \"Average crime\",\n 4: \"High crime\",\n 5: \"Very high crime\"\n}\n\nexport const BLOG_CATEGORIES = {\n 1: \"Area Guides\",\n 2: \"For Expats\",\n 3: \"UK Relocators\",\n 4: \"Resources\"\n}\n","import React from \"react\"\nimport { AsyncAutoComplete } from \"Components/Generic\"\nimport queryString from \"query-string\"\n// Router\nimport { useHistory } from \"react-router-dom\"\n// Material UI\nimport {\n Box,\n Typography,\n Grid,\n TextField,\n MenuItem,\n Button,\n ButtonGroup,\n Hidden,\n} from \"@material-ui/core\"\nimport { makeStyles } from \"@material-ui/core/styles\"\nimport SearchIcon from \"@material-ui/icons/Search\"\nimport Autocomplete from \"@material-ui/lab/Autocomplete\"\n// Images\nimport homebanner from \"../../homebanner-2.jpg\"\nimport { REGIONS, COUNTIES } from \"../../constants\"\n\n// styles\nconst useStyles = makeStyles((theme) => ({\n banner: {\n background: `linear-gradient( rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2) ), url(${homebanner})`,\n backgroundPosition: \"center\",\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n [theme.breakpoints.up(\"xs\")]: {\n padding: theme.spacing(2),\n },\n [theme.breakpoints.up(\"md\")]: {\n padding: theme.spacing(5),\n },\n [theme.breakpoints.down(\"sm\")]: {\n backgroundPositionY: \"-180px\",\n backgroundPositionX: \"right\",\n },\n },\n title: {\n fontSize: \"3rem\",\n color: \"#fff\",\n textShadow: \"0px 1px 4px rgba(0,0,0,0.7)\",\n [theme.breakpoints.up(\"xs\")]: {\n marginTop: \"250px\",\n },\n [theme.breakpoints.up(\"md\")]: {\n marginTop: \"310px\",\n },\n },\n formWrapper: {\n maxWidth: \"1000px\",\n width: \"100%\",\n background: \"#fff\",\n boxShadow: \"rgb(17 51 83 / 10%) 0px 4px 12px 0px\",\n },\n button: {\n borderRadius: \"0px\",\n [theme.breakpoints.down(\"sm\")]: {\n marginLeft: \"auto\",\n },\n },\n typeButton: {\n borderRadius: \"0px\",\n \"&.Mui-disabled\": {\n backgroundColor: \"#fff\",\n background: \"#fff\",\n color: \"rgba(0, 0, 0, 0.87)\",\n },\n },\n}))\n\nexport default function HomeSearch() {\n const history = useHistory()\n const classes = useStyles()\n\n const [searchBy, setSearchBy] = React.useState(\"county\")\n const [searchType, setSearchType] = React.useState(\"buy\")\n const [maxPrice, setMaxPrice] = React.useState()\n const [bedrooms, setBedrooms] = React.useState()\n const [county, setCounty] = React.useState(null)\n const [region, setRegion] = React.useState(null)\n const [location, setLocation] = React.useState()\n const [radius, setRadius] = React.useState()\n\n function generateQueryString() {\n const params = {\n searchType,\n maxPrice,\n bedrooms,\n searchBy,\n }\n if (searchBy == \"county\") params[\"county\"] = county\n if (searchBy == \"region\") params[\"region\"] = region\n if (searchBy == \"location\") {\n params[\"location\"] = location.id\n params[\"locationName\"] = location.name\n params[\"radius\"] = radius\n }\n return queryString.stringify(params)\n }\n\n const handleChange = (event) => {\n setSearchBy(event.target.value)\n }\n\n return (\n \n \n \n \n Find your dream location, the key to your dream home\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {searchBy === \"county\" ? (\n \n setCounty(value)}\n options={COUNTIES}\n getOptionLabel={(county) => county}\n renderInput={(params) => (\n \n )}\n />\n \n ) : null}\n {searchBy === \"region\" ? (\n \n setRegion(value)}\n options={REGIONS}\n getOptionLabel={(region) => region}\n renderInput={(params) => (\n \n )}\n />\n \n ) : null}\n {searchBy === \"location\" ? (\n <>\n \n {\n setLocation(value)\n }}\n />\n \n \n setRadius(event.target.value)}\n >\n \n \n \n \n \n \n \n \n >\n ) : null}\n \n {searchType == \"buy\" ? (\n setMaxPrice(event.target.value)}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ) : (\n setMaxPrice(event.target.value)}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n \n \n setBedrooms(event.target.value)}\n >\n \n \n \n \n \n \n \n \n \n \n \n }\n size=\"large\"\n onClick={() =>\n history.push(\"/search/?\" + generateQueryString())\n }\n >\n Search\n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n","export default __webpack_public_path__ + \"static/media/requirements.4b9da991.svg\";","export default __webpack_public_path__ + \"static/media/browse.b7ee3ca2.svg\";","export default __webpack_public_path__ + \"static/media/relax.f28d9d45.svg\";","// Material UI\nimport { Grid, Box, Container, Typography } from \"@material-ui/core\"\nimport { makeStyles } from \"@material-ui/core/styles\"\n// Images\nimport requirements from \"../../requirements.svg\"\nimport browse from \"../../browse.svg\"\nimport relax from \"../../relax.svg\"\n\n// styles\nconst useStyles = makeStyles((theme) => ({\n image: {\n [theme.breakpoints.up(\"xs\")]: {\n maxWidth: \"200px\",\n },\n [theme.breakpoints.up(\"md\")]: {\n maxWidth: \"175px\",\n },\n },\n}))\n\nexport default function HowItWorks() {\n const classes = useStyles()\n\n return (\n \n \n \n \n \n Your dream location in 3 easy steps\n \n \n \n \n Not sure exactly what you want? No bother! Answer a few simple\n questions and let us show you the places that will really feel\n like home.\n \n \n \n \n \n \n \n \n \n Your Requirements\n \n \n \n \n Start with our search tool, or talk to one of our relocation\n experts and let us build an image of the life you’re dreaming\n of back in the UK.\n \n \n \n \n \n \n \n \n \n Browse\n \n \n \n \n We’ll send you your bespoke relocation pack, with\n recommendations on everything you requested\n \n \n \n \n \n \n \n \n \n …and Relax\n \n \n \n \n Let us handle the stress. Sit back, safe in the knowledge that\n WheresHome has taken the headache out of arranging your move\n to the UK\n \n \n \n \n \n \n \n )\n}\n","import { useState, useEffect } from \"react\"\nimport axios from \"axios\"\n// Router\nimport { useHistory } from \"react-router-dom\"\n// Material UI\nimport { Grid, Box, Container, Typography, Paper } from \"@material-ui/core\"\nimport Skeleton from \"@material-ui/lab/Skeleton\"\nimport { makeStyles } from \"@material-ui/core/styles\"\n\n// styles\nconst useStyles = makeStyles((theme) => ({\n wrapper: {\n position: \"relative\",\n height: \"200px\",\n cursor: \"pointer\",\n transition: \"all .2s ease-in-out\",\n \"&:hover\": {\n transform: \"scale(1.02)\"\n }\n },\n img: {\n objectFit: \"cover\",\n width: \"100%\",\n height: \"200px\",\n filter: \"brightness(90%)\"\n },\n titleBox: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n background: \"linear-gradient(0deg, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0) 100%)\",\n width: \"calc(100% - 16px)\",\n padding: \"8px\",\n minHeight: \"50px\",\n display: \"flex\",\n alignItems: \"flex-end\"\n },\n titleText: {\n color: \"#FFF\"\n }\n}))\n\nexport default function Favourites() {\n const [towns, setTowns] = useState([])\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n axios\n .get(\"/locations/towns/?favorite=true&pageSize=1000\")\n .then((response) => {\n setTowns(response.data.results)\n setLoading(false)\n })\n }, [])\n\n return (\n \n \n \n \n \n Whereshome favourites\n \n \n \n \n Stop worrying about what you should be looking for and where\n you should be moving to and take a look at the most desirable\n places to live in the UK right now.\n \n \n \n \n {loading ? (\n <>\n \n \n \n \n \n \n >\n ) : (\n towns.map((town) => {\n return \n })\n )}\n \n \n \n )\n}\n\nfunction SingleLocation({ town }) {\n const history = useHistory()\n const classes = useStyles()\n\n return (\n \n
\n ))}\n \n \n \n >\n )\n}\n","export default __webpack_public_path__ + \"static/media/about.ede932b3.jpg\";","export default __webpack_public_path__ + \"static/media/about3.1419d668.jpg\";","// Router\nimport { useHistory } from \"react-router-dom\"\n// Material UI\nimport { Grid, Box, Button, Typography } from \"@material-ui/core\"\nimport { makeStyles } from \"@material-ui/core/styles\"\n// Images\nimport about from \"../../about.jpg\"\nimport about3 from \"../../about3.jpg\"\n\n// styles\nconst useStyles = makeStyles((theme) => ({\n img: {\n objectFit: \"cover\",\n width: \"100%\",\n height: \"350px\",\n },\n order: {\n [theme.breakpoints.down(\"sm\")]: {\n order: \"2\",\n },\n },\n}))\n\nexport default function About() {\n const history = useHistory()\n const classes = useStyles()\n\n return (\n \n \n \n \n About Us\n \n \n \n \n Moving house let alone country is definitely up there with one\n of most stressful events in one’s life. That’s why Whereshome\n has been created as a reliable, straightforward, effortless, and\n genuinely helpful platform. Our aim is to streamline the entire\n home hunting and relocation process.\n \n \n \n \n \n \n \n \n \n \n \n Meet Stephan and Nadine Sowah, the founders of Whereshome.co.uk\n \n \n “We created this platform out of necessity when we were in the\n process of moving back to the UK after years abroad. We would spend\n days on end banging our heads against the wall trying to navigate\n and squeeze some useful, tangible, and personal information out of\n countless area guides and stats pages.\n \n\n \n As two thirtysomething parents to three gorgeous toddlers living in\n the UAE, this was our daily burden for months when planning the\n inevitable return to the UK, our previous home. With so much having\n changed for us as a family and for the place we once called home,\n the search to find our new happy place was far more complicated than\n we thought possible.\n \n\n \n These stressful few months were the inspiration behind Whereshome.\n We wanted to create a super simple, jargon-free, relatable, and\n supportive resource that was an absolute breeze to use for busy\n professionals and parents just like us, and we think we’ve hit the\n nail on the head!”\n \n \n \n \n \n \n \n Simplifying the home location hunt and moving process\n \n \n As you can see, WheresHome was created out of necessity. The aim\n from the very beginning has been to avoid stress for our clients\n wherever possible and we’ve been achieving this with our own\n knowledge, care and attention to detail. But where we feel we need\n an expert eye, we have a ready and waiting network of tried and\n tested partners to help. We can offer expert advice on any area of\n your move and our partners include;\n \n \n
\n
\n A wide range of estate agents across the UK, so that we have the\n earliest access to properties as they come to the market\n
\n\n
\n Mortgages: for the best rates and advice on Expat and Domestic\n mortgages\n
\n\n
\n Car Hire: For exclusive rates and perks for WheresHome clients\n
\n\n
\n International Shipping: for the best deals and expert support\n for shipping your personal belongings\n
\n\n
\n Interior designers, to help you with your build, renovation or\n dressing your rental property over in the UK\n
\n \n \n \n \n \n What We Offer\n \n \n \n \n Once we help you find a place that feels like home via our\n seamless search tool, we’ll connect you with local services to\n take care of the next steps, or help you ourselves with our\n dedicated concierge service.\n \n \n \n \n \n \n \n \n \n \n \n Simplified search\n \n \n With a wealth of experience and knowledge across the real estate,\n education and leisure industry, WheresHome knows all there is to\n know to help you discover the perfect location for you and your\n family. From there, we can be as involved as you like. We will\n either simply connect you to all the local services you need or\n take care of it all with our dedicated VIP concierge service.\n \n \n \n \n \n \n \n \n Concierge Services\n \n \n \n \n \n \n \n \n Essentials Concierge Service\n \n \n \n \n Prices on Request\n \n \n If the stress of the impending home search or home move has\n you feeling a bit overwhelmed, having access to an astute\n Whereshome team member to orchestrate the entire process\n should brighten your spirits. Our goal is to put you\n completely at ease so you can carry on with life as normal\n while we take care of the not so fun aspects of your home\n move.\n \n \n
\n Our Essentials concierge service will:\n
\n
\n
\n Understand and validate your requirements to help you\n find the perfect location/property\n
\n
\n Arrange viewings for shortlisted properties on your\n behalf\n
\n
\n Pair you with an independent buyer or executive\n assistant dedicated to supporting you with your property\n purchase or rental.\n
\n
\n Moreover, you’ll be seamlessly connected with a trusted\n and vetted specialist at every stage to assist with the\n move, including mortgage brokers, surveyors, and\n solicitors.\n
\n
\n When it comes to coordinating the relocation of all your\n precious belongings, we’ve got that covered too.\n
\n
\n \n \n \n \n \n \n \n \n \n Family Concierge Service\n \n \n \n \n Prices on Request\n \n \n We understand the enormity of embarking on this journey with\n a family and the added stress of having to arrange,\n organise, and think for your children or wider family. Our\n family concierge package has been carefully created with\n these considerations in mind with expert knowledge on how to\n flawlessly relocate a family and avoid any potential bumps\n in the road.\n \n \n
\n Our Family concierge Service includes the essentials\n service plus:\n
\n
\n
\n Carefully selecting a school based on your children and\n their needs\n
\n
\n Ensuring you meet the schools catchment area (If State\n school)\n
\n
\n Shortlisting and arranging tours for your preferred\n schools.\n
\n
Handling the arduous admissions process.
\n
\n \n \n \n \n \n \n \n \n \n VIP Concierge Service\n \n \n \n \n Prices on Request\n \n \n If you don’t want to leave anything up to chance and would\n much rather sit back and relax while the entire relocation\n process and more is handled by our experienced team of\n experts then our bespoke VIP concierge service is for\n you.\n \n \n Contact us for more details.\n \n \n \n \n \n \n \n \n \n \n Got more of an idea but still have questions?\n \n \n \n \n We hope you’ve got more of an idea of what’s involved in\n relocating, but fear not if you’re still unsure - Our FREE 30\n minute consultation call will help you get the clarity you’re\n looking for on all aspects of your move, giving you confidence\n on all aspects of the journey ahead!\n \n \n \n \n \n \n \n \n \n \n \n Our Partners\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n )\n}\n","import { useEffect } from \"react\"\n\n// Router\nimport { useHistory } from \"react-router-dom\"\n// Material UI\nimport { Grid, Box, Typography } from \"@material-ui/core\"\n// Components\nimport { ContactForm } from \"Components/User\"\n\nexport default function Contact() {\n const history = useHistory()\n\n useEffect(() => {\n window.scrollTo(0, 0)\n }, [])\n\n return (\n \n \n \n \n Contact Us\n \n \n \n \n Contact us via the form below and one of our expert relocation\n consultants will get in touch with you within 24 hours.\n \n \n \n \n \n \n \n )\n}\n","import { BLOG_CATEGORIES } from \"../../constants\"\nimport { useState, useEffect } from \"react\"\nimport axios from \"axios\"\n// Router\nimport { useHistory } from \"react-router-dom\"\n// Material UI\nimport { Grid, Box, Typography, Chip, Button, Paper } from \"@material-ui/core\"\nimport Skeleton from \"@material-ui/lab/Skeleton\"\nimport { makeStyles } from \"@material-ui/core/styles\"\n// Components\nimport { SinglePost } from \"Components/User\"\n\n// styles\nconst useStyles = makeStyles((theme) => ({\n chip: {\n marginRight: theme.spacing(1),\n marginBottom: theme.spacing(1)\n }\n}))\n\nexport default function Blog() {\n const classes = useStyles()\n const [posts, setPosts] = useState([])\n const [loading, setLoading] = useState(true)\n const [nextPage, setNextPage] = useState(\"\")\n const [noMore, setNoMore] = useState(false)\n const [category, setCategory] = useState()\n\n useEffect(() => {\n setLoading(true)\n const params = category ? { category } : {}\n axios.get(\"/blog/posts\", { params }).then((response) => {\n setPosts(response.data.results)\n setLoading(false)\n setNextPage(response.data.next)\n setNoMore(!Boolean(response.data.next))\n })\n }, [category])\n\n function loadMoreResults() {\n setLoading(true)\n const params = category ? { category } : {}\n axios.get(nextPage, { params }).then((response) => {\n setPosts([...posts, ...response.data.results])\n setNextPage(response.data.next)\n setNoMore(!Boolean(response.data.next))\n setLoading(false)\n })\n }\n\n return (\n \n \n \n \n Blog\n \n \n \n \n Have a read of our insightful blogs from industry experts and\n our in-the-know team who cover the ins and outs of the\n relocation process as well as the ever-evolving UK property\n landscape.\n \n \n \n \n {Object.entries(BLOG_CATEGORIES).map(([key, value]) => (\n setCategory(category == key ? null : key)}\n />\n ))}\n \n \n \n \n {posts.map((post) => (\n \n ))}\n {loading && (\n <>\n \n \n \n \n >\n )}\n \n {!noMore && (\n \n \n \n )}\n \n )\n}\n\nfunction LoadingCard() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n","import { BLOG_CATEGORIES } from \"../../constants\"\nimport { useState, useEffect } from \"react\"\nimport MetaTags from \"react-meta-tags\"\nimport { format } from \"date-fns\"\nimport axios from \"axios\"\n// Router\nimport { useParams } from \"react-router-dom\"\n// Material UI\nimport { Box, Typography, Breadcrumbs } from \"@material-ui/core\"\nimport parse from \"html-react-parser\"\n\nexport default function Post() {\n const { id } = useParams()\n const [loading, setLoading] = useState(true)\n const [post, setPost] = useState({})\n\n useEffect(() => {\n const request = isNaN(parseInt(id))\n ? axios\n .get(`/blog/posts/?url=${id}`)\n .then((response) => response.data.results[0])\n : axios.get(`/blog/posts/${id}/`).then((response) => response.data)\n\n request.then((data) => {\n setPost(data)\n setLoading(false)\n })\n }, [id])\n\n if (loading) return \"loading...\"\n\n return (\n \n \n {post.title}\n \n \n \n \n {format(new Date(post.date), \"dd MMM yyyy\")}\n \n \n {BLOG_CATEGORIES[post.category]}\n \n \n \n
{parse(post.content)}
\n \n {post.seoTitle}\n \n \n \n )\n}\n","import React, { useState, useEffect } from \"react\"\nimport { v4 as uuid } from \"uuid\"\nimport { format } from \"date-fns\"\nimport axios from \"axios\"\n// Router\nimport { useHistory } from \"react-router-dom\"\n// Material UI\nimport { Paper, Box, Typography, TextField } from \"@material-ui/core\"\nimport { DataGrid } from \"@material-ui/data-grid\"\nimport { useDebouncedState, useTrigger } from \"utilities\"\n\nexport default function Locations() {\n const [searchTerm, setSearchTerm, debouncedSearchTerm] = useDebouncedState(\n \"\",\n 300\n )\n\n return (\n <>\n \n Locations\n \n \n \n \n setSearchTerm(event.target.value)}\n />\n \n