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.

Çevrimiçi HTML yazın, canlı önizlemeyle

HTML Editörü kodunuzu ve sayfayı yan yana gösterir. Yazdığınız her şey hemen önizlemede görünür - başlıklar, listeler, tablolar, resimler ve tüm CSS'iniz - ve önizlemedeki herhangi bir şeye tıklamak sizi koddaki yerine götürür. Metni doğrudan önizlemede de düzenleyebilirsiniz. Böylece hiçbir şey kurmadan açılış sayfaları, bültenler, makaleler ve formlar hızla oluşturabilirsiniz.

Her şey tarayıcınızda çalışır. Sayfalar yüklenmez; kayıt ve reklam yoktur.

Editörün yapabilecekleri

Vurgulamalı kod

Kendi renklerinde etiketler, öznitelikler, varlıklar (entity), yorumlar ve sayfa içindeki CSS ile JavaScript, satır numaraları, kendiliğinden kapanan bitiş etiketleri ve tek tıkla düzenli girintileme.

Güvenli canlı önizleme

Betiklerin ve on… özniteliklerinin asla çalışmadığı ve bağlantıların sayfa değiştirmediği bir çerçevede, tarayıcının gösterdiği haliyle sayfa. Tam genişlikte, tablet veya telefon boyutunda kontrol edin.

Önizlemede düzenleyin

Önizlemede bir başlığa veya paragrafa tıklayın ve yazın: değişiklik koda gider; &, < ve > varlık olarak yazılır.

Sorunlara bir bakışta

Kapatılmamış veya yanlış iç içe geçmiş etiketler, bilinmeyen öğeler, alt olmayan resimler, eksik dosyalar ve iki kez kullanılan id'ler - her biri satırıyla.

Resimler, stil sayfaları, yazı tipleri

Dosyaları editöre sürükleyin ve adlarıyla kullanın: <img src="../logo.png">, <link rel="stylesheet" href="../style.css">. Tarayıcınızda sayfayla birlikte saklanırlar.

Dışa aktarma

.html dosyası, her dosyayı içeren tek bir HTML dosyası, dosyalarla birlikte bir ZIP, yazdırma iletişim kutusu üzerinden PDF veya düz metin.

Nasıl çalışır

  1. Başlayın - "Yeni" altından bir şablon seçin, bir .html dosyası veya ZIP açın ya da HTML kodu yapıştırın.
  2. Yazın - koda yazın; önizleme takip eder. Listeler, tablolar, medya ve form alanları için "Ekle"yi kullanın.
  3. Dışa aktarın - .html dosyasını, dosyalarıyla bir ZIP'i veya bir PDF'i kaydedin.

Editörü kendi web sitenizde kullanın

Her https sayfası (ve localhost) editörü bir <iframe> ve ?embed=1 ile yerleştirebilir - kayıt yok, anahtar yok. Yerleştirildiğinde editör bu metni gizler ve bir Kaydet düğmesi gösterir. Belgeyi içeri almanın ve dışarı vermenin iki yolu vardır.

1. Bir bağlantıdan dosya açın, sunucunuza kaydedin

src= bir dosya açar (sunucunuz CORS'a izin vermelidir), webhook= ise "Kaydet"in (Ctrl+S) belgeyi o adrese göndermesini sağlar. Authorization: Bearer … başlığı için &token=…, her değişiklikten sonra kaydetmek için &auto ekleyin.

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

Webhook, JSON içeren bir POST alır: { editor, event: "save", id, name, content, assets, updated }. Bunu saklayan küçük bir PHP betiği:

<?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. Belgeyi sayfanız tutar (postMessage)

Editör htmleditor:ready der, sayfanız htmleditor:load ile yanıt verir, editör htmleditor:loaded, gerçek düzenlemelerde htmleditor:change ve kullanıcı kaydettiğinde htmleditor:save bildirir. Sayfanız htmleditor:get (geçerli durum) veya htmleditor:save (Kaydet'e basma) gönderebilir. Kaydetme böylece kendi oturum açma ve oturum sisteminiz üzerinden yapılır.

<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') {              // editör hazır: belgeyi ona verin
    ed.contentWindow.postMessage({
      type: 'htmleditor:load',
      name: 'Offer',
      content: await (await fetch('/pages/offer.html')).text(),
      assets: { 'logo.png': 'data:image/png;base64,…' }   // isteğe bağlı dosyalar
    }, ORIGIN);
  }
  if (m.type === 'htmleditor:change') document.title = '● not saved';   // gerçek bir düzenleme
  if (m.type === 'htmleditor:save') {               // kullanıcı "Kaydet"e tıkladı
    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';
  }
});

// Kendi sayfanızda bir kaydet düğmesi: yanıt htmleditor:save olarak gelir
function saveNow() { ed.contentWindow.postMessage({ type: 'htmleditor:get' }, ORIGIN); }
</script>

Sayfanızın içinde Yapay Zekâ Asistanı: çerçeve içinde de çalışır. iframe üzerinde allow="clipboard-write" ile "İstemi kopyala" panoyu doğrudan kullanır (aksi halde editör eski kopyalama komutuna geri döner veya istemi elle kopyalamanız için gösterir). Yapay zekânın gönderdiği bir bağlantı başka bir web sitesinin içindeki editöre ulaşamaz; bu yüzden editör, yapay zekâya ve kullanıcıya bunun yerine yapay zekânın yanıtının tamamını editöre yapıştırmasını söyler - veya editörü kendi penceresinde açın.

3. Kendi penceresinde

window.open("https://html.giit.ch/?embed=window", "htmleditor-17") tam editörü kendi penceresinde açar ve aynı mesajları window.opener ile konuşur. Yapay zekâdan gelen bağlantılar ona orada ulaşır. htmleditor:load ayrıca context: { host, title, rules } taşıyabilir - yapay zekâ istemi bu durumda belgenin nereye ait olduğunu söyler ve kurallarınıza uyar - ve hook: { url, token, assets: false }, yalnızca bu belge için olan ve asla saklanmayan bir webhook. Kaydedilmemiş değişikliklerle pencereyi kapatmak htmleditor:closing gönderir.

4. Kendi sunucunuz üzerinden yapay zekâ

Editöre kendi isteminizi, sitenizde bir adresi ve bu editör oturumu için bir anahtarı verin. Yapay zekâ iletişim kutusu bu durumda sitenize "Bağlı" olduğunu, yapay zekâya ne söylediğinizi ve geçerli belgeyi değiştir veya yeni bir belge oluştur seçimini gösterir; İstemi kopyala hepsini bir araya getirir. Yapay zekâ sonucunu anahtarla sunucunuza gönderir ve sayfanız onu editörde açar - yeni bir belge ayrı açılır ve kullanıcının tarayıcısında kalır. Editör oturumu başına bir anahtar: editör açık olduğu sürece geçerli kalır ve editör yalnızca anahtarı yokken htmleditor:key-request ile ister. Editör anahtarı asla kendisi göndermez ve asla saklamaz; adres kendi alan adınızda veya onun bir alt alan adında https olmalıdır.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // editör oturumu başına bir anahtar
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);
// htmleditor:loaded içindeki id'yi hatırlayın ve başka id'li change/save/closing mesajlarını yok sayın
// yalnızca editörün anahtarı yokken:
if (m.type === 'htmleditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'htmleditor:ai', key: k.key }, ORIGIN); }
// editör açıkken sunucunuza her dakika bildirin; editörü veya sayfayı kapatmak anahtarı geçersiz kılar
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// sunucunuzda bir sonuç var (polling, SSE …): target "current" veya "new" olur
ed.contentWindow.postMessage({ type: 'htmleditor:load', name: 'Offer', content: draft, from: 'ai', target }, ORIGIN);
<?php // api/ai-key.php - oturum açmış kullanıcının bu editör oturumuna ait anahtar (sayfanız çağırır)
session_start();                                     // kullanıcının bu belgeyi düzenleyebileceğini kontrol edin
$key = bin2hex(random_bytes(24));
$_SESSION['ai'][hash('sha256', $key)] = ['doc' => (int)$_GET['doc'], 'seen' => time()];  // veya veritabanınızda; ?alive= seen değerini yeniden ayarlar
echo json_encode(['key' => $key]);

<?php // api/ai-result.php - yapay zekâ buraya gönderir (CORS başlıkları yok: yapay zekâlar bunu bir sunucudan çağırır)
$key = preg_replace('/^Bearer\s+/', '', $_SERVER['HTTP_AUTHORIZATION'] ?? '');
$row = find_key(hash('sha256', $key));               // veritabanınız: geçersiz kılınmamış, son 3 dakikada görülmüş
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');   // sayfanız bunu htmleditor:load ile gösterir
echo '{"ok":true}';

Anahtarları en az 128 rastgele bitle oluşturun, yalnızca özetlerini (hash) saklayın, her birini oturum açmış kullanıcıya, belgeye ve bu editör oturumuna bağlayın, oturum başına bir tane oluşturun, yalnızca sayfanız oturumu açık bildirdiği sürece geçerli tutun ve editör veya sayfa kapandığında geçersiz kılın.

Protokolün tamamı llms.txt dosyasındadır - bir yapay zekâya verin, sisteminiz için bağlantıyı o kursun. LaTeX Editörü ve SVG Editörü latexeditor: ve svgeditor: önekleriyle aynı şekilde çalışır - latex.giit.ch, svg.giit.ch.

Sıkça sorulan sorular

Sayfam yükleniyor mu?

Hayır. Editör tamamen tarayıcınızda çalışır. Kendi sunucunuza bir webhook kurmadığınız sürece sayfalarınız ve dosyaları asla bir sunucuya gönderilmez.

Önizlemede JavaScript çalışıyor mu?

Hayır. Önizleme sayfanın HTML ve CSS'ini gösterir, ancak betikler ve on… öznitelikleri asla çalışmaz ve bağlantılar sayfa değiştirmez. Bu, açtığınız her sayfada editörü güvende tutar. Kod betiklerini korur, böylece dışa aktarılan sayfa eskisi gibi çalışır.

Resimleri ve stil sayfalarını nasıl eklerim?

Onları editöre sürükleyin veya yapıştırın ya da sağdaki Dosyalar sekmesinde ekleyin. Tarayıcınızda sayfayla birlikte saklanır ve adlarıyla kullanılırlar, örneğin <img src="../logo.png"> veya <link rel="stylesheet" href="../style.css">.

Nasıl PDF elde ederim?

"Dışa aktar"a tıklayın, PDF'i seçin ve "Yazdır / PDF olarak kaydet"e tıklayın. Yazdırma iletişim kutusunda yazıcı olarak "PDF olarak kaydet"i seçin.

Belgelerim nereye kaydediliyor?

Yalnızca tarayıcınıza. Belgeleri açmak, yeniden adlandırmak, çoğaltmak, indirmek veya silmek için sol üstteki klasör düğmesine (Belgelerim) tıklayın. Tarayıcınızın site verilerini temizlemek onları siler; bu yüzden saklamak istediklerinizi indirin - veya editörün onları kendi sunucunuza göndermesine izin verin ("Sunucuya kaydet").

Bir yapay zekâ HTML Editöründe yazabilir mi?

Evet, her yapay zekâ - ChatGPT, Claude, Gemini, Copilot veya kodlama aracınızdaki yapay zekâ. "Yapay Zekâ Asistanı"na, ardından "İstemi kopyala"ya tıklayın, istemi yapay zekânıza yapıştırın ve ne yazması gerektiğini söyleyin. Yapay zekâ bir bağlantıyla yanıt verir; ona tıklayın, sayfa editörünüzde görünür. "Geri al" her değişikliği geri alır.

Editörü kendi web sitemde kullanabilir miyim?

Evet. Bir iframe ile yerleştirin ve belgeleri postMessage ile alıp verin ya da kaydedilen her sürümü bir webhook ile sunucunuza göndermesine izin verin. Örnekler için Editörü kendi web sitenizde kullanın bölümüne bakın.

HTML Editörü ücretli mi?

Hayır. Editör ücretsizdir; reklam ve kayıt yoktur.