Privacy Policy

Effective date: • This page is designed for scanning: switch between Summary and Detailed.

Data we collect

Account data — email address, name (optional), password hash (never stored in plain text) and basic account settings.

Transaction data — purchase history and billing status (we do not store full payment card numbers; payment processing is handled by our payment provider).

Support data — messages you send to our support team and metadata required to respond.

Technical/usage data — minimal logs (IP address, timestamps, device/browser hints, error events) used to keep the service reliable and secure.

Cookies & local storage — essential preferences such as cookie consent and theme selection.

Why we collect it

Service delivery — to create and maintain your account, grant access to purchased courses, and provide core functionality.

Customer support — to respond to questions and troubleshoot issues.

Security — to detect abusive behavior, reduce fraud, and protect accounts.

Reliability & improvement — to diagnose errors and measure basic performance, using minimal analytics aligned with your preferences.

Legal obligations — where we must retain or disclose data to comply with law.

Retention

We retain personal data only for as long as necessary to provide the service and for legitimate business needs, such as security, dispute resolution, and compliance.

Typical retention windows

  • Account data: while your account is active; deleted or anonymized after account deletion where feasible.
  • Transaction records: retained as required by accounting/tax obligations.
  • Security logs: retained for a limited period to investigate incidents and prevent abuse.
  • Consent preferences: stored until you change them or clear your browser storage.
Your rights

Depending on your location, you may have rights to:

  • Request access to your personal data.
  • Request correction of inaccurate data.
  • Request deletion of data (subject to legal/contractual limits).
  • Request export (portability) of certain data.
  • Object to or restrict certain processing.
  • Withdraw consent for optional processing where consent is the legal basis.

Contact

Email: [email protected]

Phone: +1 (415) 555-0192

Cookies

We use cookies and similar storage to make the site work and to remember preferences.

Categories

  • Strictly necessary: required for core functionality (e.g., consent storage, security).
  • Preferences: theme selection (light/dark) and UI settings.
  • Analytics (optional): lightweight measurement to understand reliability and improve content. You control this via the cookie banner.
Sharing & disclosures

We do not sell your personal data. We may share limited information with:

  • Service providers (e.g., hosting, email delivery, payment processing) under contractual safeguards.
  • Legal authorities if required to comply with law or protect rights, safety, and security.
  • Business transfers in a merger/acquisition context, with appropriate protections.
Security

We implement measures to protect your data, such as access controls, encryption in transit, and monitoring for abuse. Despite these efforts, no method of transmission or storage is fully secure.

If you believe your account has been compromised, contact us immediately at [email protected].

Changes to this policy

We may update this Privacy Policy from time to time. When we do, we will update the effective date above and, if the changes are material, provide additional notice where appropriate.

rapidtrail.top keyword anchor

Sign in

Theme

This site defaults to a high-contrast light theme. You can switch any time.

Cookie preferences

You can change these settings at any time on this device. Essential storage is always on.

Essential

Required for core functionality (consent + security).

Always on

Analytics

Helps us understand reliability and improve content.

`); setText('#yr', String(new Date().getFullYear())); }); } function initEffectiveDate(){ const d=new Date(); const iso=d.toISOString().slice(0,10); setText('#effDate', iso); } function setView(mode){ const btn=$('#toggleView'); const details=$$('#policy details'); if(mode==='summary'){ details.forEach(d=>{ d.open=false; const key=d.getAttribute('data-key')||''; const sum=d.getAttribute('data-summary')||''; let p=d.querySelector('[data-summary-line]'); if(!p){ p=document.createElement('p'); p.setAttribute('data-summary-line',''); p.className='mt-3 text-gray-800 dark:text-gray-200'; d.appendChild(p); } p.textContent=sum; const blocks=Array.from(d.children).filter(ch=>ch.tagName && ch.tagName.toLowerCase()!=='summary' && !ch.hasAttribute('data-summary-line')); blocks.forEach(b=>b.classList.add('hidden')); }); if(btn) btn.textContent='Switch to Detailed'; localStorage.setItem(LS_VIEW,'summary'); } else { details.forEach(d=>{ d.open=true; const p=d.querySelector('[data-summary-line]'); if(p) p.remove(); const blocks=Array.from(d.children).filter(ch=>ch.tagName && ch.tagName.toLowerCase()!=='summary'); blocks.forEach(b=>b.classList.remove('hidden')); }); if(btn) btn.textContent='Switch to Summary'; localStorage.setItem(LS_VIEW,'detailed'); } } function initViewToggle(){ const btn=$('#toggleView'); const saved=localStorage.getItem(LS_VIEW) || 'detailed'; setView(saved); btn?.addEventListener('click', ()=>{ const cur=localStorage.getItem(LS_VIEW) || 'detailed'; setView(cur==='detailed'?'summary':'detailed'); }); $('#policy')?.addEventListener('toggle', (e)=>{ const cur=localStorage.getItem(LS_VIEW) || 'detailed'; if(cur==='summary'){ if(e.target && e.target.tagName && e.target.tagName.toLowerCase()==='details'){ e.target.open=false; } } }, true); } function getConsent(){ const raw=localStorage.getItem(LS_COOKIE); const val=safeJsonParse(raw); if(!val || typeof val!=='object') return null; return val; } function setConsent(obj){ localStorage.setItem(LS_COOKIE, JSON.stringify(obj)); } function ensureConsent(){ const consent=getConsent(); const banner=$('#cookieBanner'); if(!consent){ if(banner) banner.classList.remove('hidden'); } else { if(banner) banner.classList.add('hidden'); if(typeof consent[KEY_ANALYTICS] === 'boolean'){ window.__occAnalyticsAllowed = consent[KEY_ANALYTICS]; } } } function initCookieUI(){ const banner=$('#cookieBanner'); const modal=$('#cookieModal'); const analyticsToggle=$('#analyticsToggle'); function syncToggle(){ const consent=getConsent(); analyticsToggle.checked = consent ? !!consent[KEY_ANALYTICS] : false; } $('#closeCookieBanner')?.addEventListener('click', ()=>{ if(banner) banner.classList.add('hidden'); const existing=getConsent(); if(!existing){ setConsent({v:1, t:Date.now(), analytics:false}); } ensureConsent(); }); $('#cookieReject')?.addEventListener('click', ()=>{ setConsent({v:1, t:Date.now(), analytics:false}); if(banner) banner.classList.add('hidden'); ensureConsent(); }); $('#cookieAccept')?.addEventListener('click', ()=>{ setConsent({v:1, t:Date.now(), analytics:true}); if(banner) banner.classList.add('hidden'); ensureConsent(); }); $('#cookieManage')?.addEventListener('click', ()=>{ syncToggle(); openDialog(modal); }); $('#cookiePrefs')?.addEventListener('click', ()=>{ syncToggle(); openDialog(modal); }); $('#saveCookiePrefs')?.addEventListener('click', ()=>{ const next={v:1, t:Date.now(), analytics: !!analyticsToggle.checked}; setConsent(next); closeDialog(modal); if(banner) banner.classList.add('hidden'); ensureConsent(); }); syncToggle(); } function initDialogs(){ $$('[data-close]').forEach(btn=>{ btn.addEventListener('click', ()=>{ const sel=btn.getAttribute('data-close'); closeDialog($(sel)); }); }); document.addEventListener('keydown', (e)=>{ if(e.key==='Escape'){ ['#authModal','#themeModal','#cookieModal'].forEach(sel=>{ const d=$(sel); if(d && d.open) closeDialog(d); }); } }); ['#authModal','#themeModal','#cookieModal'].forEach(sel=>{ const d=$(sel); if(!d) return; d.addEventListener('click', (e)=>{ const rect=d.getBoundingClientRect(); const inDialog = e.clientX >= rect.left && e.clientX <= rect.right && e.clientY >= rect.top && e.clientY <= rect.bottom; if(!inDialog) closeDialog(d); }); }); } function initThemeUI(){ const saved=localStorage.getItem(LS_THEME) || 'light'; applyTheme(saved); $('#openTheme')?.addEventListener('click', ()=>openDialog($('#themeModal'))); $('#lightTheme')?.addEventListener('click', ()=>{ localStorage.setItem(LS_THEME,'light'); applyTheme('light'); closeDialog($('#themeModal')); }); $('#darkTheme')?.addEventListener('click', ()=>{ localStorage.setItem(LS_THEME,'dark'); applyTheme('dark'); closeDialog($('#themeModal')); }); } function initAuthUI(){ const modal=$('#authModal'); const openBtn=$('#openAuth'); const form=$('#authForm'); const title=$('#authTitle'); const mode=$('#authMode'); const switchBtn=$('#switchAuthMode'); const email=$('#authEmail'); const pass=$('#authPassword'); const emailErr=$('#authEmailErr'); const passErr=$('#authPassErr'); const toast=$('#authToast'); function setErr(el, msg){ el.textContent=msg; el.classList.remove('hidden'); } function clearErr(el){ el.textContent=''; el.classList.add('hidden'); } function setMode(m){ mode.value=m; if(m==='signup'){ title.textContent='Create account'; switchBtn.textContent='I already have an account'; pass.setAttribute('autocomplete','new-password'); } else { title.textContent='Sign in'; switchBtn.textContent='Create an account'; pass.setAttribute('autocomplete','current-password'); } clearErr(emailErr); clearErr(passErr); toast.classList.add('hidden'); toast.textContent=''; } function validate(){ let ok=true; clearErr(emailErr); clearErr(passErr); const ev=(email.value||'').trim(); const pv=(pass.value||''); const emailOk=/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(ev); if(!emailOk){ setErr(emailErr,'Enter a valid email address.'); ok=false; } if(pv.length<8){ setErr(passErr,'Password must be at least 8 characters.'); ok=false; } if(ok){ email.value=ev; } return ok; } openBtn?.addEventListener('click', ()=>{ setMode('login'); openDialog(modal); setTimeout(()=>email?.focus(), 30); }); switchBtn?.addEventListener('click', ()=>{ const next = mode.value==='login' ? 'signup' : 'login'; setMode(next); }); email?.addEventListener('input', ()=>clearErr(emailErr)); pass?.addEventListener('input', ()=>clearErr(passErr)); form?.addEventListener('submit', (e)=>{ if(!validate()){ e.preventDefault(); return; } const m=mode.value; toast.classList.remove('hidden'); toast.textContent = m==='signup' ? 'Submitting signup…' : 'Submitting login…'; }); setMode('login'); } initHeaderFooter(); initEffectiveDate(); initViewToggle(); initDialogs(); initThemeUI(); initAuthUI(); initCookieUI(); ensureConsent(); })();