Catalog About FAQ Contact Tracked Cart

Refine & Restore Courses

Hands-on, job-ready training in furniture restoration. Master wood repair, finishing, upholstery, and ethical conservation from instructors with decades of workshop experience.

Browse Courses

Practical Skills

From joint repair to French polishing—built for real workshop outcomes.

Modular Learning

Short lessons with clear outcomes and quizzes to validate progress.

Ethical Methods

Respect period authenticity, materials, and reversibility standards.

0

Learners enrolled

0

Courses available

0

Average course rating

Why choose us

Get course updates

Join our list for launch dates, new modules, and restoration tips. No spam—unsubscribe anytime.

.classList.remove('hidden'); return; } introSubmitBtn.disabled = true; introSubmitBtn.classList.add('opacity-70','cursor-not-allowed'); try{ const formData = new URLSearchParams(); formData.set('name', nameEl.value.trim()); formData.set('email', emailEl.value.trim()); const company = (introForm.querySelector('input[name="company"]')||{}).value || ''; const topic = (introForm.querySelector('input[name="topic"]')||{}).value || ''; formData.set('company', company); formData.set('topic', topic); const r = await fetch('./send.php', { method:'POST', headers:{'Content-Type':'application/x-www-form-urlencoded'}, body: formData.toString() }); if(!r.ok) throw new Error('Network'); introOk.classList.remove('hidden'); setTimeout(()=>{ closeModal('modal-intro'); introOk.classList.add('hidden'); introForm.reset(); }, 1200); }catch(err){ introErr.textContent = 'Could not submit right now. Please try again in a moment.'; introErr.classList.remove('hidden'); }finally{ setTimeout(()=>{ introSubmitBtn.disabled = false; introSubmitBtn.classList.remove('opacity-70','cursor-not-allowed'); }, 800); } }); // Countdown timer to next cohort (persist 14 days from first visit) (function(){ const KEY='fg_next_cohort'; let targetTs = parseInt(localStorage.getItem(KEY)||'0',10); const now = Date.now(); if(!targetTs || targetTs < now){ const inDays = 14; targetTs = now + inDays*24*60*60*1000; try{ localStorage.setItem(KEY, String(targetTs)); }catch(e){} } const el = document.getElementById('cohort-countdown'); function fmt(n){ return String(n).padStart(2,'0'); } function tick(){ const diff = targetTs - Date.now(); if(diff <= 0){ el.textContent = 'less than a day'; return; } const d = Math.floor(diff/86400000); const h = Math.floor((diff%86400000)/3600000); const m = Math.floor((diff%3600000)/60000); const s = Math.floor((diff%60000)/1000); el.textContent = (d>0? d+'d ':'')+fmt(h)+':'+fmt(m)+':'+fmt(s); requestAnimationFrame(()=> setTimeout(tick, 1000)); } tick(); })(); // JSON-LD SEO const ld = { "@context":"https://schema.org", "@type":"Organization", "name":"FirstGate Public Speaking", "url":"https://firstgate.top/", "email":"[email protected]", "telephone":"+1-650-417-9821", "sameAs":[] }; const ldSite = { "@context":"https://schema.org", "@type":"WebSite", "name":"FirstGate Public Speaking", "url":"https://firstgate.top/", "potentialAction":{ "@type":"SearchAction", "target":"https://firstgate.top/catalog.html?q={search_term_string}", "query-input":"required name=search_term_string" } }; const s1=document.createElement('script'); s1.type='application/ld+json'; s1.textContent=JSON.stringify(ld); const s2=document.createElement('script'); s2.type='application/ld+json'; s2.textContent=JSON.stringify(ldSite); document.head.appendChild(s1); document.head.appendChild(s2);