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.

Écrire du HTML en ligne, avec un aperçu en direct

L’éditeur HTML affiche votre code et la page côte à côte. Tout ce que vous tapez apparaît aussitôt dans l’aperçu - titres, listes, tableaux, images et tout votre CSS - et un clic sur n’importe quel élément de l’aperçu vous mène à sa place dans le code. Vous pouvez aussi modifier le texte directement dans l’aperçu. Créer des pages d’accueil, des newsletters, des articles et des formulaires devient ainsi rapide, sans rien installer.

Tout fonctionne dans votre navigateur. Les pages ne sont pas envoyées, il n’y a ni inscription ni publicité.

Ce que l’éditeur sait faire

Code avec coloration

Balises, attributs, entités, commentaires ainsi que le CSS et le JavaScript de la page dans leurs propres couleurs, numéros de ligne, balises de fermeture automatiques et indentation propre en un clic.

Un aperçu en direct sûr

La page telle que le navigateur l’affiche, dans un cadre où les scripts et les attributs on… ne s’exécutent jamais et où les liens ne naviguent pas. Vérifiez-la en pleine largeur, en taille tablette ou téléphone.

Modifier dans l’aperçu

Cliquez sur un titre ou un paragraphe de l’aperçu et tapez : la modification va dans le code, avec &, < et > écrits en entités.

Les problèmes d’un coup d’œil

Balises non fermées ou mal imbriquées, éléments inconnus, images sans alt, fichiers manquants et id utilisés deux fois - chacun avec sa ligne.

Images, feuilles de style, polices

Glissez des fichiers dans l’éditeur et utilisez-les par leur nom : <img src="../logo.png">, <link rel="stylesheet" href="../style.css">. Ils sont conservés avec la page dans votre navigateur.

Export

Le fichier .html, un fichier HTML avec tous les fichiers inclus, un ZIP avec les fichiers, un PDF via la boîte de dialogue d’impression, ou le texte brut.

Comment ça marche

  1. Commencer - choisissez un modèle sous « Nouveau », ouvrez un fichier .html ou un ZIP, ou collez du code HTML.
  2. Écrire - tapez dans le code ; l’aperçu suit. Utilisez « Insérer » pour les listes, les tableaux, les médias et les champs de formulaire.
  3. Exporter - enregistrez le .html, un ZIP avec ses fichiers, ou un PDF.

Utiliser l’éditeur sur votre propre site web

Toute page https (et localhost) peut intégrer l’éditeur avec une <iframe> et ?embed=1 - sans inscription, sans clé. Intégré, l’éditeur masque ce texte et affiche un bouton Enregistrer. Il y a deux façons de faire entrer et sortir le document.

1. Ouvrir un fichier depuis un lien, enregistrer sur votre serveur

src= ouvre un fichier (votre serveur doit autoriser CORS), webhook= fait envoyer le document à cette adresse par « Enregistrer » (Ctrl+S). Ajoutez &token=… pour un en-tête Authorization: Bearer … et &auto pour enregistrer après chaque modification.

<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>

Le webhook reçoit un POST avec du JSON { editor, event: "save", id, name, content, assets, updated }. Un petit script PHP qui l’enregistre :

<?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. Votre page détient le document (postMessage)

L’éditeur annonce htmleditor:ready, votre page répond par htmleditor:load, l’éditeur signale htmleditor:loaded, htmleditor:change lors de vraies modifications et htmleditor:save quand l’utilisateur enregistre. Votre page peut envoyer htmleditor:get (l’état actuel) ou htmleditor:save (appuyer sur Enregistrer). L’enregistrement passe alors par votre propre connexion et votre propre session.

<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') {              // l’éditeur est prêt : on lui transmet le document
    ed.contentWindow.postMessage({
      type: 'htmleditor:load',
      name: 'Offer',
      content: await (await fetch('/pages/offer.html')).text(),
      assets: { 'logo.png': 'data:image/png;base64,…' }   // fichiers facultatifs
    }, ORIGIN);
  }
  if (m.type === 'htmleditor:change') document.title = '● not saved';   // une vraie modification
  if (m.type === 'htmleditor:save') {               // l’utilisateur a cliqué sur "Save"
    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';
  }
});

// Un bouton d’enregistrement sur votre propre page : la réponse arrive sous forme de htmleditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'htmleditor:get' }, ORIGIN); }
</script>

L’assistant IA dans votre page : il fonctionne aussi dans le cadre. Avec allow="clipboard-write" sur l’iframe, « Copier le prompt » utilise directement le presse-papiers (sinon l’éditeur se rabat sur l’ancienne commande de copie, ou affiche le prompt à copier à la main). Un lien envoyé par l’IA ne peut pas atteindre un éditeur intégré dans un autre site web : l’éditeur demande donc à l’IA et à l’utilisateur de coller toute la réponse de l’IA dans l’éditeur - ou d’ouvrir l’éditeur dans sa propre fenêtre.

3. Dans sa propre fenêtre

window.open("https://html.giit.ch/?embed=window", "htmleditor-17") ouvre l’éditeur complet dans sa propre fenêtre et échange les mêmes messages avec window.opener. Les liens d’une IA l’y atteignent. htmleditor:load peut aussi transporter context: { host, title, rules } - le prompt de l’IA indique alors où se trouve le document et suit vos règles - et hook: { url, token, assets: false }, un webhook pour ce seul document, jamais stocké. Fermer la fenêtre avec des modifications non enregistrées envoie htmleditor:closing.

4. L’IA via votre propre serveur

Transmettez à l’éditeur votre propre prompt, une adresse sur votre site et une clé pour cette session de l’éditeur. La boîte de dialogue de l’IA affiche alors « Connecté à » votre site, ce que vous indiquez à l’IA, et le choix modifier le document actuel ou en créer un nouveau ; Copier le prompt assemble le tout. L’IA envoie son résultat avec la clé à votre serveur, et votre page l’ouvre dans l’éditeur - un nouveau document s’ouvre séparément et reste dans le navigateur de l’utilisateur. Une clé par session de l’éditeur : elle reste valable tant que l’éditeur est ouvert, et l’éditeur ne la demande avec htmleditor:key-request que tant qu’il n’en a pas. L’éditeur n’envoie jamais la clé lui-même et ne la stocke jamais ; l’adresse doit être en https sur votre propre hôte ou sur un de ses sous-domaines.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // une clé par session de l’éditeur
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);
// retenez l’id de htmleditor:loaded et ignorez change/save/closing portant un autre id
// seulement tant que l’éditeur n’a pas de clé :
if (m.type === 'htmleditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'htmleditor:ai', key: k.key }, ORIGIN); }
// tant que l’éditeur est ouvert, prévenez votre serveur chaque minute ; fermer l’éditeur ou la page annule la clé
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// votre serveur a un résultat (polling, SSE …) : target vaut "current" ou "new"
ed.contentWindow.postMessage({ type: 'htmleditor:load', name: 'Offer', content: draft, from: 'ai', target }, ORIGIN);
<?php // api/ai-key.php - la clé de cette session de l’éditeur pour l’utilisateur connecté (appelée par votre page)
session_start();                                     // vérifiez que l’utilisateur a le droit de modifier ce document
$key = bin2hex(random_bytes(24));
$_SESSION['ai'][hash('sha256', $key)] = ['doc' => (int)$_GET['doc'], 'seen' => time()];  // ou dans votre base de données ; ?alive= remet seen à jour
echo json_encode(['key' => $key]);

<?php // api/ai-result.php - l’IA envoie ici (sans en-têtes CORS : les IA l’appellent depuis un serveur)
$key = preg_replace('/^Bearer\s+/', '', $_SERVER['HTTP_AUTHORIZATION'] ?? '');
$row = find_key(hash('sha256', $key));               // votre base de données : non annulée, vue dans les 3 dernières minutes
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');   // votre page l’affiche avec htmleditor:load
echo '{"ok":true}';

Créez des clés d’au moins 128 bits aléatoires, ne stockez que leur hash, liez chacune à l’utilisateur connecté, au document et à cette session de l’éditeur, créez-en une par session, ne la gardez valable que tant que votre page signale la session comme ouverte, et annulez-la quand l’éditeur ou la page se ferme.

Le protocole complet se trouve dans llms.txt - donnez-le à une IA et elle construit la connexion pour votre système. L’éditeur LaTeX et l’éditeur SVG fonctionnent de la même façon avec les préfixes latexeditor: et svgeditor: - latex.giit.ch, svg.giit.ch.

Questions fréquentes

Ma page est-elle envoyée sur un serveur ?

Non. L’éditeur fonctionne entièrement dans votre navigateur. Vos pages et leurs fichiers ne sont jamais envoyés à un serveur, sauf si vous configurez vous-même un webhook vers votre propre serveur.

Le JavaScript s’exécute-t-il dans l’aperçu ?

Non. L’aperçu affiche le HTML et le CSS de la page, mais les scripts et les attributs on… ne s’exécutent jamais, et les liens ne naviguent pas. L’éditeur reste ainsi sûr avec n’importe quelle page ouverte. Le code garde ses scripts, la page exportée fonctionne donc comme avant.

Comment ajouter des images et des feuilles de style ?

Glissez-les ou collez-les dans l’éditeur, ou ajoutez-les dans l’onglet Fichiers à droite. Ils sont enregistrés avec la page dans votre navigateur et utilisés par leur nom, par exemple <img src="../logo.png"> ou <link rel="stylesheet" href="../style.css">.

Comment obtenir un PDF ?

Cliquez sur « Exporter », choisissez PDF et cliquez sur « Imprimer / Enregistrer en PDF ». Dans la boîte de dialogue d’impression, choisissez « Enregistrer au format PDF » comme imprimante.

Où mes documents sont-ils enregistrés ?

Uniquement dans votre navigateur. Cliquez sur le bouton dossier en haut à gauche (Mes documents) pour les ouvrir, renommer, dupliquer, télécharger ou supprimer. Effacer les données de site de votre navigateur les supprime : téléchargez ceux que vous voulez garder - ou laissez l’éditeur les envoyer à votre propre serveur (« Enregistrer sur un serveur »).

Une IA peut-elle écrire dans l’éditeur HTML ?

Oui, n’importe quelle IA - ChatGPT, Claude, Gemini, Copilot ou l’IA de votre outil de développement. Cliquez sur « Assistant IA », puis sur « Copier le prompt », collez-le dans votre IA et dites-lui ce qu’elle doit écrire. L’IA répond par un lien ; cliquez dessus et la page apparaît dans votre éditeur. « Annuler » revient sur chaque modification.

Puis-je utiliser l’éditeur sur mon propre site web ?

Oui. Intégrez-le avec une iframe et échangez les documents par postMessage, ou laissez-le envoyer chaque version enregistrée à votre serveur avec un webhook. Voir Utiliser l’éditeur sur votre propre site web pour des exemples.

L’éditeur HTML est-il payant ?

Non. L’éditeur est gratuit, sans publicité et sans inscription.