Typst Editor online

Code

Export

The PDF comes straight from the Typst compiler: the same pages as in the preview, with real text that can be selected and searched, links and the document's title.

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://typst.giit.ch):

{ "editor": "typst", "event": "save", "id": "…", "name": "Report",
  "content": "#set page(paper: \"a4\") …",
  "assets": { "logo.png": "data:image/png;base64,…" },
  "updated": "2026-01-15T09:30:00.000Z" }
Embed the editor in your website
<iframe src="https://typst.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://typst.giit.ch' || e.source !== frame.contentWindow) return;
  if (e.data.type === 'typsteditor:ready')
    frame.contentWindow.postMessage({ type: 'typsteditor:load', name: 'Report',
      content: '= Report\\n…', assets: {} }, 'https://typst.giit.ch');
  if (e.data.type === 'typsteditor:save') saveOnYourServer(e.data.content, e.data.assets);
});
</script>

Also possible: ?src=<URL of a .typ 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 (typsteditor:ai, typsteditor:key-request) - see "Use the editor on your own website" below the editor. Details are in llms.txt.

Help

How it works

  1. Write Typst on the left - or start with New and one of the templates. The real Typst compiler runs in your browser and shows the pages as you type.
  2. Click text on the page to edit it right there: a field opens with the cursor where you clicked, and the code's cursor goes to the same place. Enter or a click elsewhere writes the change into the code (one step for Undo), Escape cancels. A click on math, a picture or text made by code jumps to its place in the code instead. The place where the code cursor is gets a frame on the page.
  3. Document on the right sets paper, font, margins and numbering (it edits the #set rules); Insert has ready-made pieces (lists, tables, math, symbols); Pictures holds the pictures and data files of the document; Outline lists the headings.
  4. The compiler's errors and warnings are listed above the code with line, column and hint - 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 a PDF (from the Typst compiler, with real text) and pictures of the pages (PNG, JPG, WebP, SVG). Download .typ saves the code.

Packages from Typst Universe (#import "@preview/…") are not downloaded - nothing is loaded from other servers. Fonts: Libertinus Serif, New Computer Modern, DejaVu Sans Mono and the fonts you add to a document.

Keyboard shortcuts

Ctrl + B / I / U
Bold / italic / underline the selected text
Ctrl + M
Math: $…$ around the selection
Ctrl + /
Comment lines in or out (//)
Ctrl + Enter
Show the cursor's place on the pages
Tab / Shift + Tab
Indent / outdent
Ctrl + Z / Y
Undo / redo
Ctrl + S / E
Save (download .typ, or to your server) / export
Ctrl + O
My documents
Ctrl + P
Print the pages
Ctrl + mouse wheel, Ctrl + + -
Zoom the preview
Page Up / Page Down
Previous / next page (in the preview)

Enter in a list continues it (-, +, 1.); Enter on an empty item ends it. Brackets, $, * and _ go around a selection.

Écrire du Typst en ligne, avec le vrai compilateur

L’éditeur Typst affiche votre code et les pages compilées côte à côte. Il fait tourner le vrai compilateur Typst dans votre navigateur en WebAssembly, si bien que les pages ressemblent exactement à celles du PDF - titres, listes, tableaux, formules, figures, notes de bas de page, renvois et vos propres règles #set et #show. Un clic sur n’importe quel texte de la page vous mène à sa place dans le code, et vous pouvez modifier le texte directement sur la page.

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

Ce que l’éditeur sait faire

Code avec coloration

Balisage, code, formules, chaînes et commentaires dans leurs propres couleurs, numéros de ligne, listes qui se poursuivent avec Entrée, et les erreurs du compilateur avec ligne, colonne et indication.

Le vrai compilateur Typst

Typst 0.14 compilé en WebAssembly tourne dans un worker à côté de l’éditeur et compile un instant après chaque modification - la saisie reste fluide.

Modifier sur la page

Cliquez sur un texte de la page pour le modifier sur place ; la modification va dans le code. Un clic sur une formule ou une image mène à sa place dans le code.

Réglages du document

Papier, marges, colonnes, police, taille, langue, texte justifié, titres numérotés et numéros de page - les réglages modifient les règles #set de votre code.

Images et fichiers de données

Ajoutez des images, du CSV, du JSON, du YAML, des bibliographies, des polices et d’autres fichiers .typ à un document et utilisez-les avec image, csv, json ou #import.

Export

Un PDF du compilateur avec du vrai texte sélectionnable, chaque page en PNG, JPG, WebP ou SVG, ou la source .typ avec ses fichiers en ZIP.

Comment ça marche

  1. Commencer - choisissez un modèle sous « Nouveau », ouvrez un fichier .typ ou collez du code Typst.
  2. Écrire - tapez dans le code ; les pages à droite suivent. Utilisez « Insérer » pour les tableaux, les listes et les formules.
  3. Exporter - enregistrez un PDF, des images des pages ou le fichier .typ.

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://typst.giit.ch/?embed=1&src=https://your-site.com/docs/flyer.typ&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://typst.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__ . "/docs/$name.typ", $d['content']);
echo '{"ok":true}';

2. Votre page détient le document (postMessage)

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

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

addEventListener('message', async e => {
  if (e.source !== ed.contentWindow || e.origin !== ORIGIN) return;
  const m = e.data;
  if (m.type === 'typsteditor:ready') {             // l’éditeur est prêt : on lui transmet le document
    ed.contentWindow.postMessage({
      type: 'typsteditor:load',
      name: 'Flyer',
      content: await (await fetch('/docs/flyer.typ')).text(),
      assets: { 'logo.png': 'data:image/png;base64,…' }   // images et fichiers de données facultatifs
    }, ORIGIN);
  }
  if (m.type === 'typsteditor:change') document.title = '● not saved';   // une vraie modification
  if (m.type === 'typsteditor: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 typsteditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'typsteditor: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://typst.giit.ch/?embed=window", "typsteditor-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. typsteditor: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 typsteditor:closing. typsteditor:pdf demande le PDF du document de la page et le reçoit sous forme de data URI, produit par le compilateur Typst avec du vrai texte sélectionnable.

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 typsteditor: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: 'typsteditor:load', name: 'Flyer', 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 typsteditor:loaded et ignorez change/save/closing portant un autre id
// seulement tant que l’éditeur n’a pas de clé :
if (m.type === 'typsteditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'typsteditor: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: 'typsteditor:load', name: 'Flyer', 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 typsteditor: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 fonctionne de la même façon avec le préfixe latexeditor: - latex.giit.ch.

Questions fréquentes

Mon document est-il envoyé sur un serveur ?

Non. L’éditeur et le compilateur Typst fonctionnent entièrement dans votre navigateur. Vos documents, images et fichiers ne sont jamais envoyés à un serveur, sauf si vous configurez vous-même un webhook vers votre propre serveur.

Est-ce le vrai compilateur Typst ?

Oui. L’éditeur fait tourner Typst 0.14 compilé en WebAssembly (typst.ts) : les pages et le PDF sont les mêmes qu’avec la ligne de commande Typst. Il est chargé une fois (environ 11 Mo) puis conservé par votre navigateur.

Comment obtenir un PDF ?

Cliquez sur « Exporter », choisissez PDF et cliquez sur « Télécharger ». Le PDF vient directement du compilateur Typst, avec du vrai texte que l’on peut sélectionner et rechercher.

Puis-je utiliser des paquets de Typst Universe ?

Pas directement : l’éditeur ne charge rien depuis d’autres serveurs, donc #import "@preview/…" signale un problème qui nomme le paquet. Vous pouvez ajouter les fichiers .typ d’un paquet au document dans l’onglet Images et les importer par leur nom de fichier.

Quelles polices sont disponibles ?

Les polices livrées avec Typst : Libertinus Serif (par défaut), New Computer Modern et sa police mathématique, et DejaVu Sans Mono pour le code. Ajoutez vos propres fichiers .otf ou .ttf à un document et utilisez-les avec #set text(font: "Name").

Comment ajouter des images ?

Glissez ou collez une image dans l’éditeur, ou ajoutez-la dans l’onglet Images à droite. Elle est enregistrée avec le document dans votre navigateur et utilisée par #image("name.png"). Les fichiers CSV, JSON, YAML et .bib fonctionnent de la même façon.

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

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 le document 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 Typst est-il payant ?

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