Free Legal Document Generator

Generate professional, regulation-compliant legal documents for your website, app, or business. No signup. No hidden fees. No lawyers needed.

These templates are for informational purposes only and do not constitute legal advice. Consult a qualified attorney for compliance.

Privacy Policy

Comprehensive privacy policy covering data collection, usage, third-party sharing, and user rights. Supports GDPR, CCPA, and COPPA.

Most Popular

Terms of Service

Legally sound terms of service covering acceptable use, liability limitations, dispute resolution, and intellectual property.

Essential

Cookie Policy

GDPR-compliant cookie policy detailing what cookies you use, why, and how users can manage their preferences.

GDPR Required

Disclaimer

Protect your business with disclaimers for affiliate content, professional advice, accuracy of information, and external links.

Recommended

Refund Policy

Clear refund and return policy covering eligibility, timeframes, process, and exceptions for products or services.

E-Commerce

EULA

End User License Agreement for software and apps covering license grants, restrictions, termination, and warranties.

Software / Apps

Step-by-Step Wizard

Guided questionnaire tailored to each document type

Live Preview

See your document update in real-time as you fill in details

Compliance Ready

GDPR, CCPA, COPPA, CalOPPA badges and provisions

Export Anywhere

Download as HTML, Markdown, plain text, or PDF

Privacy Policy

Preview

Start filling in the form to see a live preview of your document.

downloadFile(htmlContent, filename + '.html', 'text/html'); toast('HTML downloaded'); } else if (format === 'markdown') { downloadFile(getMarkdown(), filename + '.md', 'text/markdown'); toast('Markdown downloaded'); } else if (format === 'text') { downloadFile(getPlainText(), filename + '.txt', 'text/plain'); toast('Text file downloaded'); } } function downloadFile(content, filename, type) { const blob = new Blob([content], { type: type + ';charset=utf-8' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(a.href); } function copyDocument() { const text = getPlainText(); navigator.clipboard.writeText(text).then(() => toast('Copied to clipboard')).catch(() => { const ta = document.createElement('textarea'); ta.value = text; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); toast('Copied to clipboard'); }); } // ============================================================ // SAVE / LOAD // ============================================================ function getSavedDocs() { try { return JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]'); } catch { return []; } } function saveCurrentDocument() { if (!currentDocType) return toast('No document to save'); const docs = getSavedDocs(); const docName = DOC_TYPES[currentDocType].name; const bizName = formData.businessName || 'Untitled'; const existing = docs.findIndex(d => d.type === currentDocType && d.formData.businessName === formData.businessName); const entry = { id: existing > -1 ? docs[existing].id : Date.now().toString(36), type: currentDocType, name: docName, businessName: bizName, formData: { ...formData }, savedAt: new Date().toISOString() }; if (existing > -1) docs[existing] = entry; else docs.unshift(entry); localStorage.setItem(STORAGE_KEY, JSON.stringify(docs)); toast('Draft saved'); } function loadDocument(id) { const docs = getSavedDocs(); const doc = docs.find(d => d.id === id); if (!doc) return toast('Document not found'); currentDocType = doc.type; currentStep = 0; formData = { ...doc.formData }; document.getElementById('editorTitle').textContent = DOC_TYPES[currentDocType].name; buildWizard(); // Restore field values DOC_TYPES[currentDocType].steps.forEach(step => { step.fields.forEach(f => { if (f.type === 'text' || f.type === 'email' || f.type === 'url' || f.type === 'number') { const el = document.getElementById(f.id); if (el) el.value = formData[f.id] || ''; } else if (f.type === 'select') { const el = document.getElementById(f.id); if (el) el.value = formData[f.id] || f.options[0]; } }); }); showPage('editor'); updatePreview(); } function deleteDocument(id) { let docs = getSavedDocs(); docs = docs.filter(d => d.id !== id); localStorage.setItem(STORAGE_KEY, JSON.stringify(docs)); renderSavedDocs(); toast('Draft deleted'); } function renderSavedDocs() { const docs = getSavedDocs(); const section = document.getElementById('savedSection'); const list = document.getElementById('savedList'); if (docs.length === 0) { section.style.display = 'none'; return; } section.style.display = 'block'; list.innerHTML = docs.map(doc => { const date = new Date(doc.savedAt); const dateStr = date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }); return `

${esc(doc.businessName)} - ${esc(doc.name)}

Saved ${dateStr}

`; }).join(''); } // ============================================================ // TOAST // ============================================================ let toastTimer; function toast(msg) { const el = document.getElementById('toast'); el.textContent = msg; el.classList.add('show'); clearTimeout(toastTimer); toastTimer = setTimeout(() => el.classList.remove('show'), 2500); } // --- Init --- renderSavedDocs();