Free Markdown Editor

Write Markdown with real-time preview side by side. Formatting toolbar, keyboard shortcuts, word count, and export to HTML or raw Markdown. Supports headings, lists, tables, code blocks, images, and task lists.

MARKDOWN
PREVIEW
0 words 0 chars 0 lines 0 min read

Export


      
    

Need something more powerful?

Let us build it for you. Custom APIs, dashboards, automations — whatever you need.

Start a Project →
Open source

QTool.io on GitHub

269 free tools. No signup. Open source. Built by Christian Bucher.

GitHub Browse 269 Free Tools →

Related Tools

CSS Box Shadow Generator · Emoji Picker & Search · Markdown to HTML Live Preview

Related Tools

Free Markdown to PDF Converter · Free JSON to YAML Converter · Markdown to HTML Converter - Free Tool

\n`; download(html, 'document.html', 'text/html'); } function download(content, filename, type) { const blob = new Blob([content], { type }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); showToast('Downloaded ' + filename); } function copyMd() { navigator.clipboard.writeText(mdInput.value).then(() => showToast('Markdown copied')); } function copyHtml() { navigator.clipboard.writeText(markdownToHtml(mdInput.value)).then(() => showToast('HTML copied')); } function showToast(msg) { const t = document.getElementById('toast'); t.textContent = msg; t.classList.add('show'); setTimeout(() => t.classList.remove('show'), 2000); } /* Keyboard shortcuts */ mdInput.addEventListener('keydown', e => { if ((e.ctrlKey || e.metaKey) && e.key === 'b') { e.preventDefault(); wrap('**', '**'); } if ((e.ctrlKey || e.metaKey) && e.key === 'i') { e.preventDefault(); wrap('*', '*'); } if ((e.ctrlKey || e.metaKey) && e.key === 'k') { e.preventDefault(); insertLink(); } // Tab key inserts spaces if (e.key === 'Tab') { e.preventDefault(); const start = mdInput.selectionStart; mdInput.value = mdInput.value.substring(0, start) + ' ' + mdInput.value.substring(mdInput.selectionEnd); mdInput.selectionStart = mdInput.selectionEnd = start + 2; renderPreview(); } }); /* IntersectionObserver fade-in */ const observer = new IntersectionObserver(entries => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('visible'); observer.unobserve(entry.target); }}); }, { threshold: 0.1 }); document.querySelectorAll('.fade-in').forEach(el => observer.observe(el)); /* Auto-save to localStorage */ const saved = localStorage.getItem('ntool_md_editor'); if (saved) { mdInput.value = saved; renderPreview(); } mdInput.addEventListener('input', () => { try { localStorage.setItem('ntool_md_editor', mdInput.value); } catch(e) {} });