TeXbrain

Probeer het nu: tex.swimmingbrain.dev

Ik heb dit gebouwd omdat ik klaar was met het betalen voor functies die gratis zouden moeten zijn. Vorig jaar schreef ik mijn scriptie in LaTeX en besteedde ik meer tijd aan het worstelen met de tooling dan aan het daadwerkelijke schrijven. Online oplossingen plaatsen git-synchronisatie vaak achter een betaalmuur, terwijl lokale installaties vaak problemen geven bij het wisselen tussen verschillende machines. Ik wilde iets dat gewoon werkt: een browser openen, LaTeX schrijven en een PDF krijgen.

Wat TeXbrain doet

TeXbrain is een volledige LaTeX-editor die .tex-bestanden direct in de browser compileert naar PDF. Er is geen backend en er vindt geen verwerking op een server plaats. Alles — de editor, de compiler en de git-client — draait aan de client-zijde.

Je kunt een lokale projectmap openen, bestanden bewerken, de PDF-update live volgen, wijzigingen commiten en deze naar GitHub pushen. Dit alles vanuit één tabblad.

Kenmerken

  • LaTeX-compilatie in de browser: Maakt gebruik van een WebAssembly-port van pdfTeX (SwiftLaTeX). Je .tex-bestanden worden gecompileerd tot PDF zonder je machine te verlaten. Packages worden on-demand geladen en lokaal gecached, waardoor de eerste compilatie alleen downloadt wat het document daadwerkelijk gebruikt. Hercompilaties duren 1 tot 5 seconden, afhankelijk van de complexiteit van het project.
  • Toegang tot het grootste deel van CTAN: Veelvoorkomende packages worden meegeleverd met de app. Andere packages (zoals memoir, abntex2, KOMA-Script) worden automatisch opgehaald van een TeX Live-mirror wanneer ein document ze voor het eerst nodig heeft, en vervolgens lokaal gecached voor offline gebruik.
  • Live PDF-voorbeeld: Gerenderd met pdf.js. Ondersteunt meerdere pagina's, zoomen en tekstselectie.
  • Volledige git-integratie: Clone repos, maak branches, stage bestanden, commit, push en pull, en merge. Dit wordt aangedreven door isomorphic-git in de browser, waardoor een CLI niet nodig is.
  • Toegang tot het lokale bestandssysteem: Maakt gebruik van de File System Access API om direct te lezen en te schrijven naar je projectmap op schijf (ondersteund in Chrome/Edge).
  • Projecten met meerdere bestanden: Bevat een bestandsboom, tabbladen en drag-and-drop ondersteuning voor .tex, .bib, .sty, .cls en meer.
  • CodeMirror 6 editor: Syntaxhighlighting, autocomplete voor meer dan 70 LaTeX-commando's, bracket matching, code folding, snippets en een donker/licht thema.
  • Command palette: Snelle toegang tot acties via een toetsenbordcombinatie.
  • Snippet picker: Doorzoekbare en gecategoriseerde snippets voor wiskundige omgevingen, documentstructuren, Griekse letters en veelvoorkomende commando's.
  • Offline functionaliteit: Zodra de app is geladen, werkt deze zonder internetverbinding. Compilatie en bewerkingen zijn lokaal. Alleen packages die nog nooit zijn gebruikt, vereisen eenmalig netwerktoegang.
  • Projecttemplates: Start vanaf nul of kies een template (artikel, thesis, beamer, rapport, CV, brief, minimaal).

Hoe het technisch werkt

Er is geen backend; alles gebeurt in de browser.

Editor

Gebouwd op CodeMirror 6 met een aangepaste LaTeX-grammatica (Lezer parser), autocomplete provider en themesysteem. De editor ondersteunt meerdere open bestanden via tabbladen en synchroniseert de inhoud met zowel het lokale bestandssysteem als de in-memory git working tree.

Compiler

LaTeX-compilatie maakt gebruik van de pdfTeX-engine van SwiftLaTeX, gecompileerd naar WebAssembly. De engine draait in een memory filesystem (MEMFS), waar projectbestanden voor elke compilatie naartoe worden geschreven. Wanneer de engine een bestand nodig heeft dat niet aanwezig is (zoals een class, package of font), lost de service worker dit op via de volgende volgorde:

  1. Reeds gecachte bestanden.
  2. De package-subset die gebundeld is met de app.
  3. Een TeX Live-mirror (een texmf-dist mirror op jsDelivr, met een community SwiftLaTeX-server als fallback).

Elk gevonden bestand wordt opgeslagen in de cache storage van de browser. Na de eerste succesvolle compilatie wordt de gebundelde subset op de achtergrond geprefetched, zodat de kernset aan packages offline werkt.

Git

Alle git-operaties maken gebruik van isomorphic-git, een pure JavaScript-implementatie van git. De repository bevindt zich in een in-memory filesystem (LightningFS) ondersteund door IndexedDB. Projectbestanden worden gesynchroniseerd tussen het lokale bestandssysteem en de git working tree. Remote-operaties (push/pull/clone) verlopen via een CORS-proxy, omdat browsers niet direct het git-protocol kunnen spreken.

PDF-viewer

Gerenderd met pdf.js van Mozilla. Ondersteunt multi-page rendering met een tekstlaag voor selectie en zoeken.

Bestandssysteem

De app gebruikt de File System Access API voor directe lees/schrijfactiviteiten op schijf. Dit vereist een Chromium-gebaseerde browser (Chrome, Edge, Arc, Brave). Voor andere browsers is er een fallback via het Origin Private File System (OPFS).

Frontend

SvelteKit met de static adapter. De volledige app is pre-built naar statische HTML/CSS/JS en wordt gehost op GitHub Pages. Er is geen SSR, geen API-routes en geen server. Tailwind CSS wordt gebruikt voor de styling.

Bekende beperkingen

  • Alleen pdfTeX: Geen XeTeX of LuaTeX; functies zoals fontspec, polyglossia en andere afhankelijkheden hiervan kunnen niet worden gecompileerd.
  • Geen bibtex of biber: De engine bevat deze niet. Documenten die biblatex gebruiken, krijgen een eenvoudige thebibliography gegenereerd vanuit het .bib-bestand, waardoor referenties wel verschijnen maar de citatiestijl wordt genegeerd. Klassieke bibtex-workflows vereisen een .bbl-bestand in het project. Een echte bibtex in WASM staat bovenaan de planning.
  • TeX Live 2020 tijdperk: Packages zijn gepind aan hetzelfde tijdperk als het format-bestand van de engine; nieuwere versies van packages zijn dus niet beschikbaar.
  • Git remotes vereisen een CORS-proxy: Omdat browsers niet direct het git-protocol spreken. De standaardproxy is configureerbaar.
  • Directe maptoegang is alleen voor Chromium: Firefox en Safari vallen terug op een virtueel bestandssysteem.

Beveiliging en privacy

  • Alles draait in je browser. Je bestanden verlaten je machine niet, tenzij je expliciet naar een remote pusht.
  • Geen telemetry, geen analytics, geen tracking.
  • Geen accounts, geen cookies, geen gegevensverzameling.
  • Git-authenticatietokens worden opgeslagen in de localStorage van je browser en komen nooit op een server onder mijn controle terecht.
  • LaTeX-compilatie vindt plaats in een WebAssembly-sandbox. Er worden geen shell-commando's uitgevoerd (geen pdflatex, exec() of spawn()).
  • Git-operaties maken gebruik van een JavaScript-bibliotheek, niet van CLI-commando's; command-injectie is onmogelijk.
  • De CORS-proxy voor git remotes is een bewuste afweging. Standaard wordt cors.isomorphic-git.org gebruikt, maar je kunt dit wijzigen naar je eigen proxy.
  • Packages die niet gebundeld zijn, worden on-demand opgehaald van publieke TeX Live-mirrors. Alleen bestandsnamen worden verzonden, nooit de inhoud van je document.

Technologie-stack

LaagTechnologie
FrameworkSvelte 5 + SvelteKit (static adapter)
EditorCodeMirror 6 + custom LaTeX language support
CompilerpdfTeX via WebAssembly (SwiftLaTeX)
Gitisomorphic-git + LightningFS
PDFpdf.js
StylingTailwind CSS 4
TaalTypeScript
DeploymentGitHub Pages

Lokaal draaien

git clone https://github.com/swimmingbrain/texbrain.git
cd texbrain
pnpm install
pnpm dev

Open http://localhost:5173 in Chrome of Edge.

Browserondersteuning

Voor volledige functionaliteit is de File System Access API vereist, die beschikbaar is in Chromium-gebaseerde browsers (Chrome, Edge, Arc, Brave, Opera). Firefox en Safari kunnen de editor nog steeds gebruiken via de virtual filesystem fallback, maar kunnen niet direct lezen of schrijven naar lokale mappen.

Licentie

MIT