HTML Editor online

Code

Export

The print dialog opens with the page as it is in the preview (without scripts). Choose Save as PDF (or "Microsoft Print to PDF") as the printer. In Chrome and Edge, untick "Headers and footers" and tick "Background graphics" if the page has colors. The text in the PDF can be selected.

My documents

Click a document to open it. They are stored only in this browser - nothing is uploaded. Clearing the browser's site data removes them, so download the ones you want to keep.

AI Assistant

Any AI can write with you - ChatGPT, Claude, Gemini, Copilot.

  1. Click Copy prompt.
  2. Paste it into your AI and say what it should write.
The AI should

The document travels in the link after the “#”, which no server sees. What you paste into your AI is handled by its provider.

Save to your server

The editor can send each saved version to your own server (a webhook), so your work is kept where you want it. Nothing is sent until you enter an address here.

What your server receives

A POST request with JSON (your server must allow CORS from https://html.giit.ch):

{ "editor": "html", "event": "save", "id": "…", "name": "Home page",
  "content": "<!DOCTYPE html> …",
  "assets": { "logo.png": "data:image/png;base64,…", "style.css": "data:text/css;base64,…" },
  "updated": "2026-01-15T09:30:00.000Z" }
Embed the editor in your website
<iframe src="https://html.giit.ch/?embed=1" style="width:100%;height:80vh;border:0"></iframe>
<script>
const frame = document.querySelector('iframe');
addEventListener('message', e => {
  if (e.origin !== 'https://html.giit.ch' || e.source !== frame.contentWindow) return;
  if (e.data.type === 'htmleditor:ready')
    frame.contentWindow.postMessage({ type: 'htmleditor:load', name: 'Home page',
      content: '<!DOCTYPE html>…', assets: {} }, 'https://html.giit.ch');
  if (e.data.type === 'htmleditor:save') saveOnYourServer(e.data.content, e.data.assets);
});
</script>

Also possible: ?src=<URL of an .html file> opens a file, &webhook=<URL> saves this document there. The editor can also open in a window of its own (?embed=window), and your page can hand it its own AI prompt and a session key so the AI sends its result to your server (htmleditor:ai, htmleditor:key-request) - see "Use the editor on your own website" below the editor. Details are in llms.txt.

Help

How it works

  1. Write HTML on the left - or start with New and one of the templates. The preview shows the page as you type.
  2. Click text in the preview to edit it right there: Enter or a click elsewhere writes the change into the code (one step for Undo), Escape cancels. A click on a picture or any other element jumps to its place in the code. The element at the code cursor gets a frame in the preview.
  3. Document on the right sets title, language and description of the page; Insert has ready-made pieces (headings, lists, tables, media, form fields, meta tags); Files holds the pictures, stylesheets and fonts of the page; Outline lists the headings.
  4. Problems in the code (an unclosed <div>, a picture without alt, a missing file) are listed above the code - click one to go there.
  5. My documents (the folder button at the top left) lists every document kept in this browser.
  6. Export makes an HTML file, one HTML file with the files inside, a ZIP, a PDF (via the print dialog) or plain text. Download .html saves the code.

The preview shows HTML and CSS as the browser does, but scripts and on… attributes never run and links do not navigate - so any page is safe to open.

Keyboard shortcuts

Ctrl + B / I / U
Bold / italic / underline the selected text
Ctrl + /
Comment lines in or out (<!-- -->)
Ctrl + Enter
Show the cursor's place in the preview
Tab / Shift + Tab
Indent / outdent
Ctrl + Z / Y
Undo / redo
Ctrl + S / E
Save (download .html, or to your server) / export
Ctrl + O
My documents
Ctrl + P
Print / save as PDF

Typing > at the end of a start tag adds its end tag, and Enter between the two indents the new line. Typing </ closes the element that is open.

HTML online schrijven, met live voorbeeld

De HTML-editor toont je code en de pagina naast elkaar. Wat je typt, verschijnt meteen in het voorbeeld - koppen, lijsten, tabellen, afbeeldingen en al je CSS - en een klik op iets in het voorbeeld brengt je naar de plek in de code. Je kunt de tekst ook direct in het voorbeeld bewerken. Zo bouw je snel landingspagina's, nieuwsbrieven, artikelen en formulieren zonder iets te installeren.

Alles draait in je browser. Pagina's worden niet geüpload, er is geen registratie en geen reclame.

Wat de editor kan

Code met kleuring

Tags, attributen, entiteiten, commentaar en de CSS en JavaScript in de pagina in eigen kleuren, regelnummers, eindtags die vanzelf sluiten, en nette inspringing met één klik.

Een veilig live voorbeeld

De pagina zoals de browser haar toont, in een frame waar scripts en on…-attributen nooit worden uitgevoerd en links niet navigeren. Bekijk haar op volle breedte, tablet- of telefoonformaat.

Bewerken in het voorbeeld

Klik op een kop of een alinea in het voorbeeld en typ: de wijziging gaat in de code, met &, < en > geschreven als entiteiten.

Problemen in één oogopslag

Niet gesloten of verkeerd geneste tags, onbekende elementen, afbeeldingen zonder alt, ontbrekende bestanden en dubbel gebruikte id's - elk met de regel.

Afbeeldingen, stylesheets, lettertypen

Sleep bestanden in de editor en gebruik ze met hun naam: <img src="../logo.png">, <link rel="stylesheet" href="../style.css">. Ze worden met de pagina in je browser bewaard.

Exporteren

Het .html-bestand, één HTML-bestand met alle bestanden erin, een ZIP met de bestanden, een PDF via het afdrukvenster, of de platte tekst.

Hoe het werkt

  1. Beginnen - kies een sjabloon onder "Nieuw", open een .html-bestand of een ZIP, of plak HTML-code.
  2. Schrijven - typ in de code; het voorbeeld volgt. Gebruik "Invoegen" voor lijsten, tabellen, media en formuliervelden.
  3. Exporteren - sla de .html, een ZIP met de bestanden, of een PDF op.

De editor op je eigen website gebruiken

Elke https-pagina (en localhost) kan de editor insluiten met een <iframe> en ?embed=1 - geen registratie, geen sleutel. Ingesloten verbergt de editor deze tekst en toont hij een knop Opslaan. Er zijn twee manieren om het document erin en eruit te krijgen.

1. Een bestand openen via een link, opslaan op je server

src= opent een bestand (je server moet CORS toestaan), webhook= zorgt dat "Opslaan" (Ctrl+S) het document naar dat adres stuurt. Voeg &token=… toe voor een header Authorization: Bearer … en &auto om na elke wijziging op te slaan.

<iframe src="https://html.giit.ch/?embed=1&src=https://your-site.com/pages/offer.html&webhook=https://your-site.com/save.php"
        allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>

De webhook krijgt een POST met JSON { editor, event: "save", id, name, content, assets, updated }. Een klein PHP-script dat het opslaat:

<?php
header('Access-Control-Allow-Origin: https://html.giit.ch');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Allow-Methods: POST, OPTIONS');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') exit;
if (($_SERVER['HTTP_AUTHORIZATION'] ?? '') !== 'Bearer SECRET') { http_response_code(403); exit; }
$d = json_decode(file_get_contents('php://input'), true);
$name = preg_replace('/[^\w\- ]/u', '_', $d['name']);
file_put_contents(__DIR__ . "/pages/$name.html", $d['content']);
echo '{"ok":true}';

2. Je pagina beheert het document (postMessage)

De editor zegt htmleditor:ready, je pagina antwoordt met htmleditor:load, de editor meldt htmleditor:loaded, htmleditor:change bij echte bewerkingen en htmleditor:save wanneer de gebruiker opslaat. Je pagina mag htmleditor:get (de huidige toestand) of htmleditor:save (op Opslaan drukken) sturen. Opslaan loopt dan via je eigen login en sessie.

<iframe id="ed" src="https://html.giit.ch/?embed=1" allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>
<script>
const ed = document.getElementById('ed');
const ORIGIN = 'https://html.giit.ch';

addEventListener('message', async e => {
  if (e.source !== ed.contentWindow || e.origin !== ORIGIN) return;
  const m = e.data;
  if (m.type === 'htmleditor:ready') {              // de editor is klaar: geef hem het document
    ed.contentWindow.postMessage({
      type: 'htmleditor:load',
      name: 'Offer',
      content: await (await fetch('/pages/offer.html')).text(),
      assets: { 'logo.png': 'data:image/png;base64,…' }   // bestanden, optioneel
    }, ORIGIN);
  }
  if (m.type === 'htmleditor:change') document.title = '● not saved';   // een echte bewerking
  if (m.type === 'htmleditor:save') {               // de gebruiker klikte op "Opslaan"
    await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: m.name, content: m.content, assets: m.assets }) });
    document.title = 'Saved';
  }
});

// Een opslaanknop op je eigen pagina: het antwoord komt als htmleditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'htmleditor:get' }, ORIGIN); }
</script>

AI-assistent binnen je pagina: die werkt ook in het frame. Met allow="clipboard-write" op het iframe gebruikt "Prompt kopiëren" direct het klembord (anders valt de editor terug op het oude kopieercommando, of toont hij de prompt om met de hand te kopiëren). Een link die de AI stuurt, kan een editor binnen een andere website niet bereiken, dus vraagt de editor de AI en de gebruiker om in plaats daarvan het hele antwoord van de AI in de editor te plakken - of de editor in een eigen venster te openen.

3. In een eigen venster

window.open("https://html.giit.ch/?embed=window", "htmleditor-17") opent de volledige editor in een eigen venster en spreekt dezelfde berichten met window.opener. Links van een AI bereiken hem daar. htmleditor:load kan ook context: { host, title, rules } meegeven - de AI-prompt zegt dan waar het document thuishoort en volgt je regels - en hook: { url, token, assets: false }, een webhook alleen voor dit document die nooit wordt opgeslagen. Als het venster met niet-opgeslagen wijzigingen wordt gesloten, stuurt het htmleditor:closing.

4. AI via je eigen server

Geef de editor je eigen prompt, een adres op je site en een sleutel voor deze editorsessie. Het AI-venster toont dan "Verbonden met" je site, wat je de AI vertelt, en de keuze het huidige document wijzigen of een nieuw maken; Prompt kopiëren zet alles bij elkaar. De AI post het resultaat met de sleutel naar je server, en je pagina opent het in de editor - een nieuw document opent apart en blijft in de browser van de gebruiker. Eén sleutel per editorsessie: hij blijft geldig zolang de editor open is, en alleen zolang de editor er geen heeft, vraagt hij erom met htmleditor:key-request. De editor verstuurt de sleutel nooit zelf en slaat hem nooit op; het adres moet https zijn op je eigen host of een subdomein ervan.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // één sleutel per editorsessie
const k = await key();
ed.contentWindow.postMessage({ type: 'htmleditor:load', name: 'Offer', content, ai: {
  label: 'My Site', prompt: 'Keep the [[placeholders]]. Write in German.',
  endpoint: 'https://your-site.com/api/ai-result.php', key: k.key } }, ORIGIN);
// onthoud de id uit htmleditor:loaded en negeer change/save/closing met een andere id
// alleen zolang de editor geen sleutel heeft:
if (m.type === 'htmleditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'htmleditor:ai', key: k.key }, ORIGIN); }
// zolang de editor open is, meld het elke minuut aan je server; het sluiten van de editor of de pagina maakt de sleutel ongeldig
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// je server heeft een resultaat (polling, SSE …): target is "current" of "new"
ed.contentWindow.postMessage({ type: 'htmleditor:load', name: 'Offer', content: draft, from: 'ai', target }, ORIGIN);
<?php // api/ai-key.php - de sleutel van deze editorsessie van de ingelogde gebruiker (je pagina roept het aan)
session_start();                                     // controleer of de gebruiker dit document mag bewerken
$key = bin2hex(random_bytes(24));
$_SESSION['ai'][hash('sha256', $key)] = ['doc' => (int)$_GET['doc'], 'seen' => time()];  // of in je database; ?alive= zet seen opnieuw
echo json_encode(['key' => $key]);

<?php // api/ai-result.php - de AI post hierheen (geen CORS-headers: AI's roepen het aan vanaf een server)
$key = preg_replace('/^Bearer\s+/', '', $_SERVER['HTTP_AUTHORIZATION'] ?? '');
$row = find_key(hash('sha256', $key));               // je database: niet ongeldig gemaakt, gezien in de laatste 3 minuten
if (!$row) { http_response_code(401); exit('{"ok":false,"error":"key not valid"}'); }
$d = json_decode(file_get_contents('php://input', false, null, 0, 2000000), true);
save_draft($row['doc'], $d['content'], $d['target'] === 'new' ? 'new' : 'current');   // je pagina toont het met htmleditor:load
echo '{"ok":true}';

Maak sleutels met minstens 128 willekeurige bits, sla alleen hun hash op, koppel elke sleutel aan de ingelogde gebruiker, het document en deze editorsessie, maak er één per sessie, houd hem alleen geldig zolang je pagina de sessie als open meldt, en maak hem ongeldig wanneer de editor of de pagina sluit.

Het hele protocol staat in llms.txt - geef het aan een AI en die bouwt de koppeling voor je systeem. De LaTeX-editor en de SVG-editor werken op dezelfde manier met de voorvoegsels latexeditor: en svgeditor: - latex.giit.ch, svg.giit.ch.

Veelgestelde vragen

Wordt mijn pagina geüpload?

Nee. De editor draait volledig in je browser. Je pagina's en hun bestanden worden nooit naar een server gestuurd, tenzij je zelf een webhook naar je eigen server instelt.

Wordt JavaScript in het voorbeeld uitgevoerd?

Nee. Het voorbeeld toont de HTML en CSS van de pagina, maar scripts en on…-attributen worden nooit uitgevoerd, en links navigeren niet. Zo blijft de editor veilig met elke pagina die je opent. De code behoudt haar scripts, dus de geëxporteerde pagina werkt zoals voorheen.

Hoe voeg ik afbeeldingen en stylesheets toe?

Sleep of plak ze in de editor, of voeg ze toe in het tabblad Bestanden rechts. Ze worden met de pagina in je browser bewaard en met hun naam gebruikt, bijvoorbeeld <img src="../logo.png"> of <link rel="stylesheet" href="../style.css">.

Hoe krijg ik een PDF?

Klik op "Exporteren", kies PDF en klik op "Afdrukken / Opslaan als PDF". Kies in het afdrukvenster "Opslaan als PDF" als printer.

Waar worden mijn documenten opgeslagen?

Alleen in je browser. Klik op de mapknop linksboven (Mijn documenten) om ze te openen, te hernoemen, te dupliceren, te downloaden of te verwijderen. Als je de sitegegevens van je browser wist, verdwijnen ze, dus download de documenten die je wilt bewaren - of laat de editor ze naar je eigen server sturen ("Opslaan op server").

Kan een AI in de HTML-editor schrijven?

Ja, elke AI - ChatGPT, Claude, Gemini, Copilot of de AI in je programmeertool. Klik op "AI-assistent", dan op "Prompt kopiëren", plak hem in je AI en zeg wat die moet schrijven. De AI antwoordt met een link; klik erop en de pagina verschijnt in je editor. "Ongedaan maken" draait elke wijziging terug.

Kan ik de editor op mijn eigen website gebruiken?

Ja. Sluit hem in met een iframe en wissel documenten uit met postMessage, of laat hem elke opgeslagen versie met een webhook naar je server sturen. Zie De editor op je eigen website gebruiken voor voorbeelden.

Kost de HTML-editor iets?

Nee. De editor is gratis, zonder reclame en zonder registratie.