TeXlyre BusyTeX

Run LaTeX compilation directly in your browser

Interactive Demo

Try out LaTeX compilation below. Select an engine, configure options, and compile your LaTeX code.

Fonts must be referenced by filename rather than by font name, e.g. \setmainfont{FiraSans-Regular.otf} instead of \setmainfont{Fira Sans}.

Features requiring external tools such as SVG inclusion, bibliography processing with biber, or shell escape (e.g. minted) are not supported in WebAssembly.

TeX Live Collections
Preloads TeX Live files into /tmp/texlive_remote for offline compilation. The ZIP is produced by the "Download Remote Package ZIP" button after a previous compilation.
On-demand TeX Live server fetched at compile time for packages beyond the selected collections. Leave blank to disable. Ensure that "Use Web Worker" is checked to enable this feature.

Input

PDF Preview

Compilation Log

Features

Installation

npm install texlyre-busytex
npx texlyre-busytex download-assets

Usage

import { BusyTexRunner, XeLatex, PdfLatex, LuaLatex } from 'texlyre-busytex';

// Combined mode (single WASM with all engines, default)
const runner = new BusyTexRunner({
  busytexBasePath: '/core/busytex'
});
await runner.initialize();

const xelatex = new XeLatex(runner);
const result = await xelatex.compile({
  input: '\\documentclass{article}\\begin{document}Hello\\end{document}',
  bibtex: true,
  makeindex: true,
  rerun: true,
});

if (result.success && result.pdf) {
  const blob = new Blob([result.pdf], { type: 'application/pdf' });
  window.open(URL.createObjectURL(blob));
}

// Split mode (per-engine WASM, smaller downloads)
const pdftexRunner = new BusyTexRunner({
  busytexBasePath: '/core/busytex',
  engineMode: 'pdftex'
});
await pdftexRunner.initialize();

const pdflatex = new PdfLatex(pdftexRunner);
const pdfResult = await pdflatex.compile({
  input: '\\documentclass{article}\\begin{document}Hello\\end{document}'
});

// Switch engines with split builds
const xetexRunner = new BusyTexRunner({
  busytexBasePath: '/core/busytex',
  engineMode: 'xetex'
});
await xetexRunner.initialize();

const xelatexSplit = new XeLatex(xetexRunner);
const xeResult = await xelatexSplit.compile({
  input: '\\documentclass{article}\\begin{document}Hello\\end{document}'
});