Need to see what changed?

SchemaLens compares two database schemas and generates migration scripts instantly.

Compare Schemas Free

Ready to generate docs

Paste your SQL above and click "Generate Docs" to see your schema documentation.

\n`; const blob = new Blob([html], { type: 'text/html' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'schema-docs.html'; a.click(); URL.revokeObjectURL(url); } generateBtn.addEventListener('click', renderDocs); sampleBtn.addEventListener('click', () => { sqlInput.value = `CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE, role VARCHAR(50) DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE posts ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id), title VARCHAR(255) NOT NULL, slug VARCHAR(255) UNIQUE, body TEXT, published BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP ); CREATE INDEX idx_posts_user ON posts(user_id); CREATE UNIQUE INDEX idx_posts_slug ON posts(slug);`; renderDocs(); }); clearBtn.addEventListener('click', () => { sqlInput.value = ''; results.classList.remove('active'); emptyState.classList.remove('hidden'); lastSchema = null; }); document.getElementById('exportMarkdown').addEventListener('click', generateMarkdown); document.getElementById('exportHTML').addEventListener('click', generateHTML); document.addEventListener('keydown', (e) => { if (e.ctrlKey && e.key === 'Enter') { e.preventDefault(); renderDocs(); } });