Home

.dirnote{margin-top:14px;font-size:13px;color:var(–muted);letter-spacing:.01em}.soon{position:relative} .soon::after{content:attr(data-tip);position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);background:var(–ink);color:var(–paper);font-family:var(–mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;padding:6px 10px;border-radius:6px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s} .soon:hover::after,.soon:focus-visible::after,.soon.show::after{opacity:1} .pcbox{display:flex;gap:8px;margin-top:12px;padding-top:12px;border-top:1px dashed var(–hair)} .pcbox[hidden]{display:none} .pcbox input{flex:1;min-width:0;height:46px;border:1px solid var(–hair);border-radius:999px;padding:0 18px;font-family:var(–sans);font-size:15px;background:var(–card);color:var(–ink)} .pcbox input:focus{outline:2px solid var(–accent);outline-offset:2px} .soonbadge{display:inline-block;margin-left:12px;padding:4px 10px;border-radius:999px;background:var(–accent);color:var(–ink);letter-spacing:.12em;vertical-align:1px} details p a{text-decoration:underline;text-underline-offset:3px} .chip{min-height:40px}/* Stage 5: “Prefer to find someone yourself?” */ .findself{border-top:1px solid var(–hair)} .find-grid{display:grid;grid-template-columns:1fr 1fr;gap:56px;align-items:start} @media (max-width:900px){.find-grid{grid-template-columns:1fr;gap:44px}} .find-intro{font-size:19px;line-height:1.65;color:var(–ink-2);font-weight:300;max-width:560px} .findself .pfacts{display:flex;flex-wrap:wrap;gap:10px 24px;margin-top:22px} .findself .pfacts span::before{content:””;display:inline-block;width:6px;height:6px;border-radius:50%;background:var(–accent);margin-right:9px;vertical-align:2px} .dsearch{display:grid;grid-template-columns:1.25fr 1fr auto;gap:12px;align-items:end;margin-top:30px;background:var(–card);border:1px solid var(–hair);border-radius:20px;padding:18px} @media (max-width:640px){.dsearch{grid-template-columns:1fr}} .dfield{display:flex;flex-direction:column;gap:8px;min-width:0} .dfield .mono{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(–muted)} .dfield select,.dfield input{width:100%;min-width:0;height:48px;border:1px solid var(–hair);border-radius:12px;background:var(–paper);padding:0 14px;font-family:var(–sans);font-size:15.5px;color:var(–ink)} .dfield select:focus,.dfield input:focus{outline:2px solid var(–accent);outline-offset:2px} .dsearch .btn{height:48px;justify-content:center} .browse{display:inline-block;margin-top:18px;padding:6px 0;font-weight:500;text-decoration:underline;text-decoration-color:var(–accent);text-underline-offset:4px} .find-r h3{font-family:var(–serif);font-weight:400;font-size:clamp(26px,2.4vw,32px);line-height:1.15;color:var(–ink)} .find-sub{color:var(–muted);margin-top:8px;font-weight:300} .needs{list-style:none;margin-top:18px;border-top:1px solid var(–ink)} .needs li{border-bottom:1px solid var(–hair)} .needs a{display:grid;grid-template-columns:170px 1fr;gap:16px;padding:14px 0;align-items:baseline} @media (max-width:640px){.needs a{grid-template-columns:1fr;gap:4px}} .needs b{font-weight:500;color:var(–ink)} .needs span{color:var(–muted);font-weight:300;font-size:15px} .needs a:hover b{text-decoration:underline;text-decoration-color:var(–accent);text-underline-offset:4px} .find-r h4{margin-top:28px;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(–muted);font-weight:400} .svcs{list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:0 24px;margin-top:8px} .svcs a{display:inline-block;padding:6px 0;color:var(–ink-2);font-size:15px} .svcs a:hover{color:var(–ink);text-decoration:underline;text-decoration-color:var(–accent);text-underline-offset:3px}/* 28 Sep 2026: Speak and + work. Tooltips: + on hover; Speak only to say what went wrong. */ .tipper{position:relative} .tipper[data-tip]::after{content:attr(data-tip);position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);background:var(–ink);color:var(–paper);font-family:var(–mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;padding:6px 10px;border-radius:6px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s} .tipper.tipshow::after{opacity:1} @media (hover:hover){.tipper.hovertip:hover::after,.tipper.hovertip:focus-visible::after{opacity:1}} .tool[hidden]{display:none} .tool.listening{background:var(–accent-soft);border-color:var(–ink)} .tool.listening svg{animation:mscpulse 1.2s ease-in-out infinite} @keyframes mscpulse{50%{opacity:.3}} @media (prefers-reduced-motion:reduce){.tool.listening svg{animation:none}}/* ================= Homepage v3 (Brydee, 28 Sep 2026): trimmed, “How it works” in the green band ================= */ /* The scrolling strip’s star is now a gold dot, matching the logo */ .marquee .track span::after{content:”” !important;width:10px;height:10px;border-radius:50%;background:var(–accent);display:inline-block;font-size:0} /* Gold dots in the small labels */ .std .mono b,.shead .mono b{color:var(–accent)} /* How it works, on the dark green band (in place of the dashboard) */ .how-dark{padding:110px 0} .how-dark h2{color:var(–paper)} .how-dark .step{border-top-color:#1E5646} .how-dark .step:last-child{border-bottom-color:#1E5646} .how-dark .step h3{color:var(–paper)} .how-dark .step p{color:#CFDDD6} .how-dark .step .n{color:var(–accent)} .how-dark .chat{color:var(–ink);box-shadow:14px 14px 0 rgba(201,162,39,.55)} .how-dark .chat .mono{color:var(–muted)} .how-dark .chat .mono.hot{color:var(–gold-text)} .how-dark + section{padding-top:110px !important} @media (max-width:640px){.how-dark{padding:80px 0}.how-dark + section{padding-top:80px !important}} .final{padding-top:10px} /* The sticky “Check my business” button on phones */ .stickycta{display:none} @media (max-width:640px){ .stickycta{display:inline-flex;position:fixed;left:16px;right:16px;bottom:14px;z-index:70;justify-content:center;box-shadow:0 14px 30px -12px rgba(0,0,0,.45)} body{padding-bottom:76px} } /* Hidden while the ask box itself is on screen (it’s the same starting point) */ .stickycta{transition:opacity .2s,transform .2s} .stickycta.is-hidden{opacity:0;pointer-events:none;transform:translateY(16px)} @media (prefers-reduced-motion:reduce){.stickycta{transition:none}}/* ================= Homepage v4 (31 Oct 2026): search beside a smaller drawing; services, how listings work, guides, one line for consultants ================= */ .h4{padding:64px 0 120px} .h4 .hero-grid{grid-template-columns:1.12fr .88fr;gap:56px} .h4 .lede{margin-top:22px} .h4 .hero-art svg{width:100%;margin-right:0;max-height:380px} @media (max-width:980px){.h4 .hero-grid{grid-template-columns:1fr;gap:36px}.h4 .hero-art{max-width:420px;margin:0 auto}} @media (max-width:640px){.h4{padding-top:24px}.h4 .hero-art{display:none}} @media (max-width:1180px){.fsearch{grid-template-columns:1fr 1fr}.fsearch .btn{grid-column:1/-1;padding:14px}} .fsearch{margin-top:34px;display:grid;grid-template-columns:1.25fr 1fr auto;gap:6px;background:#fff;border:1.5px solid var(–ink);border-radius:20px;padding:8px;box-shadow:8px 8px 0 var(–accent-soft)} .fsearch:focus-within{box-shadow:0 0 0 4px rgba(201,162,39,.3),8px 8px 0 var(–accent-soft)} .fsearch label{display:flex;flex-direction:column;gap:3px;padding:8px 14px;min-width:0;cursor:text} .fsearch label+label{border-left:1px solid var(–hair)} .hero .fsearch .mono{margin:0;display:block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(–gold-text)} .fsearch input{border:0;outline:0;background:transparent;font-family:var(–sans);font-size:17px;color:var(–ink);padding:2px 0;min-width:0;width:100%} .fsearch input::placeholder{color:var(–muted)} .fsearch .btn{justify-content:center;border-radius:14px;padding:0 26px} @media (max-width:700px){.fsearch{grid-template-columns:1fr}.fsearch label+label{border-left:0;border-top:1px solid var(–hair)}.fsearch .btn{padding:14px}} .svc4{padding:40px 0 150px} .tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:22px} @media (max-width:860px){.tiles{grid-template-columns:1fr 1fr}} @media (max-width:540px){.tiles{grid-template-columns:1fr}} .tiles a{display:flex;justify-content:space-between;align-items:center;gap:18px;padding:32px 30px;background:var(–card);border:1px solid var(–hair);border-radius:16px;font-size:17px;font-weight:500;color:var(–ink);transition:border-color .2s,transform .2s} .tiles a:hover{border-color:var(–ink);transform:translateY(-2px)} .tiles a small{display:block;margin-top:4px;font-size:13px;font-weight:400;color:var(–muted)} .tiles a em{display:block;margin-bottom:8px;font-style:normal;font-family:var(–mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(–gold-text)} .tiles.g4 a{align-items:flex-end;font-family:var(–serif);font-size:28px;font-weight:400;line-height:1.15;min-height:220px} .tiles .arr{flex:0 0 auto;display:grid;place-items:center;width:38px;height:38px;border:1px solid var(–ink);border-radius:50%} .guides4{padding:24px 0 150px} .guides4 .more{margin-top:28px} .guides4 .more a{font-weight:500;text-decoration:underline;text-decoration-color:var(–accent);text-underline-offset:4px} .claim4{display:flex;justify-content:space-between;align-items:center;gap:24px;flex-wrap:wrap;margin-bottom:140px;padding:44px 48px;background:var(–ink);color:var(–paper);border-radius:22px} .claim4 p{font-size:18px;font-weight:300;color:#CFDDD6;max-width:640px} .claim4 p b{color:var(–paper);font-weight:500} .claim4 .btn{background:var(–paper);border-color:var(–paper);color:var(–ink)} .claim4 .btn:hover{background:var(–accent);border-color:var(–accent)} .std-link{margin-top:36px;font-size:15px} @media (max-width:700px){.h4{padding:28px 0 80px}.svc4{padding:20px 0 96px}.guides4{padding:96px 0}.claim4{padding:30px 26px;margin-bottom:96px}.tiles a{padding:24px 22px}} .std-link a{font-weight:500;text-decoration:underline;text-decoration-color:var(–accent);text-underline-offset:4px}/* Guides on the homepage: the same illustrated cards as /resources/ (31 Oct 2026) */ .g4c{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:34px} @media (max-width:980px){.g4c{grid-template-columns:1fr 1fr}} @media (max-width:600px){.g4c{grid-template-columns:1fr}} .g4c .anim *{transform-box:fill-box}.g4c .anim{overflow:visible} .g4c .card{background:var(–card);border:1px solid var(–hair);border-radius:20px;overflow:hidden;display:flex;flex-direction:column;transition:transform .25s,box-shadow .25s,border-color .25s;color:var(–ink)} .g4c .card:hover,.g4c .card:focus-visible{transform:translateY(-4px);box-shadow:0 26px 50px -30px rgba(8,58,45,.45);border-color:var(–ink);outline:none} .g4c .thumb{background:var(–paper-2);aspect-ratio:16/10;display:grid;place-items:center;border-bottom:1px solid var(–hair);color:var(–ink);transition:background .25s} .g4c .card:hover .thumb{background:var(–accent-soft)} .g4c .thumb svg{width:74%;height:auto;overflow:visible} .g4c .cbody{padding:22px 24px 24px;display:flex;flex-direction:column;gap:12px;flex:1} .g4c .cbody .cat{font-family:var(–mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(–gold-text);font-weight:500} .g4c .cbody h3{font-family:var(–serif);font-weight:400;font-size:25px;line-height:1.15;letter-spacing:.01em;margin:0} .g4c .cbody .meta{margin-top:auto;display:flex;justify-content:space-between;align-items:center;padding-top:14px;border-top:1px dashed var(–hair);font-family:var(–mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(–muted)} .g4c .cbody .arr{width:32px;height:32px;border-radius:50%;border:1px solid var(–ink);display:grid;place-items:center;transition:background .2s,color .2s;color:var(–ink)} .g4c .card:hover .arr{background:var(–ink);color:var(–paper)} .g4c .thumb .anim *{animation-play-state:paused} .g4c .card:hover .thumb .anim *,.g4c .card:focus-visible .thumb .anim *{animation-play-state:running} .g4c .swing{transform-origin:50% 0;animation:g4swing 3.4s ease-in-out infinite} .g4c .tip{transform-origin:center;animation:g4tip 3.4s ease-in-out infinite} .g4c .drop{animation:g4drop 2.4s ease-in-out infinite} @keyframes g4swing{0%,100%{transform:rotate(-7deg)}50%{transform:rotate(7deg)}} @keyframes g4tip{0%,100%{transform:rotate(0)}30%{transform:rotate(-6deg)}70%{transform:rotate(6deg)}} @keyframes g4drop{0%,100%{transform:translateY(0)}40%{transform:translateY(-14px)}60%{transform:translateY(0)}70%{transform:translateY(-3px)}} @media (prefers-reduced-motion:reduce){.g4c .anim *{animation:none!important}} .svc4 .shead,.guides4 .shead{display:block} .svc4 .shead h2,.guides4 .shead h2{margin:0} /* Hero: more room (31 Oct 2026) */ @media (min-width:981px){ .h4{padding:104px 0 150px} .h4 .hero-grid{gap:88px} .h4 .lede{margin-top:30px;max-width:520px} .h4 .fsearch{margin-top:40px} }
● Fire · Legionella · Asbestos · H&S

Find a safety
consultant.

Search 5,000+ UK fire, health and safety, asbestos and legionella companies. Compare and contact them directly.

● How listings work

What we check, and what we don’t.

● Public information

Built from public sources

Listings come from public information, not from who paid us.

● Register checks

Green chips are checked

A green chip means we looked the company up on that public register on the date shown.

● Your call

Check before you appoint

Ask for qualifications and a current insurance certificate before you appoint anyone.

Safety consultant? Claim your free profile, or go Featured for £99 a year: top of local searches, every service you offer and UK-wide coverage.

Claim your profile →
/* Speak (28 Sep 2026): the browser’s own speech-to-text (Chrome, Edge and Safari; no service, no key). Tap to start, tap again to stop; the words go into the box as you talk, after anything already typed. Browsers without it (Firefox) never see the button. Chrome sends the audio to Google to turn it into text. */ window.mscSpeak = function (btn, field, onStart) { var SR = window.SpeechRecognition || window.webkitSpeechRecognition; if (!btn || !field) return; if (!SR) { btn.hidden = true; return; } var rec = null, base = ”, label = btn.querySelector(‘.lbl’), idle = label ? label.textContent : ”; function state(on) { btn.classList.toggle(‘listening’, on); btn.setAttribute(‘aria-pressed’, on ? ‘true’ : ‘false’); if (label) label.textContent = on ? ‘Listening… tap to stop’ : idle; } function tip(msg) { btn.setAttribute(‘data-tip’, msg); btn.classList.add(‘tipshow’); clearTimeout(btn._t); btn._t = setTimeout(function () { btn.classList.remove(‘tipshow’); }, 3000); } btn.addEventListener(‘click’, function (ev) { ev.preventDefault(); if (rec) { try { rec.stop(); } catch (e) {} return; } if (onStart) onStart(); rec = new SR(); rec.lang = ‘en-GB’; rec.interimResults = true; rec.continuous = true; base = field.value.replace(/\s+$/, ”); var heard = false; rec.onresult = function (e) { var said = ”; for (var i = 0; i < e.results.length; i++) said += e.results[i][0].transcript; said = said.replace(/\s+/g, ' ').trim(); if (!said) return; heard = true; if (!base) said = said.charAt(0).toUpperCase() + said.slice(1); field.value = (base ? base + ' ' : '') + said; field.dispatchEvent(new Event('input', { bubbles: true })); }; rec.onerror = function (e) { if (e.error === 'not-allowed' || e.error === 'service-not-allowed') tip('Microphone blocked: type instead'); else if (e.error === 'no-speech') tip('Didn’t catch that: try again'); else if (e.error === 'network') tip('No connection: type instead'); }; rec.onend = function () { rec = null; state(false); if (heard) { field.dispatchEvent(new Event('change', { bubbles: true })); field.focus(); } }; try { rec.start(); state(true); } catch (e) { rec = null; state(false); tip('Couldn’t start: type instead'); } }); };/* ---------- Illustration kit: ink lines + offset gold blocks, gently animated ---------- */ const GD='var(--accent)', GS='var(--accent-soft)', PAPER='var(--paper)'; const L='fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"';const art = { cafe:` `,park:` `,landlord:` `,shop:` `,office:` `,hotel:` `,care:` `,community:` `,health:` `,factory:` `,build:` `,warehouse:` ` };/* Hero scene */ const bird=(x,y,dur)=>``; const L2 = L.replace(‘stroke-width=”1.6″‘,’stroke-width=”2.2″‘); const hero = ` ${bird(392,30,.7)} ${bird(448,16,.55)} `;const lamp = ``;/* Business cards */ const biz = [ [‘landlord’,’Residential property’,’Landlords, HMOs and blocks of flats.’,’Fire · Fire doors · Legionella’], [‘cafe’,’Hospitality & leisure’,’Pubs, cafés, hotels, gyms and venues.’,’Fire · Legionella · H&S’], [‘care’,’Care’,’Care homes and supported living.’,’Fire · Evacuation · Legionella’], [‘health’,’Healthcare’,’GP, dental and private clinics.’,’Fire · H&S · CQC’], [‘shop’,’Retail’,’Shops, showrooms and small chains.’,’Fire · H&S · COSHH’], [‘warehouse’,’Transport & warehousing’,’Warehouses, depots and hauliers.’,’Racking · LOLER · PUWER’], [‘factory’,’Manufacturing’,’Factories, workshops and food production.’,’H&S · COSHH · Fire’], [‘community’,’Education, childcare & community’,’Nurseries, schools, halls and churches.’,’Fire · Asbestos · H&S’], [‘build’,’Construction’,’Builders, trades and contractors.’,’CDM · H&S retainer’] ]; const arr = ‘‘; document.getElementById(‘heroArt’).innerHTML = hero; /* v4: the two search fields become one search (“fire risk assessment in Bristol”), which the directory already understands. */ (function(){var f=document.getElementById(‘fsearch’);if(!f)return;f.addEventListener(‘submit’,function(){var s=document.getElementById(‘fsSvc’).value.trim(),l=document.getElementById(‘fsLoc’).value.trim();document.getElementById(‘fsQ’).value=(s&&l)?s+’ in ‘+l:(s||l);var dm=location.search.match(/msc_draft=([a-f0-9]+)/);if(dm&&!f.querySelector(‘[name=msc_draft]’)){var h=document.createElement(‘input’);h.type=’hidden’;h.name=’msc_draft’;h.value=dm[1];f.appendChild(h);}});})();