Overleaf CE+ Hard Fork (https://github.com/yu-i-i/overleaf-cep) -- Current goals: node.js -> golang backbone, typst support
  • JavaScript 32.5%
  • Go 31.8%
  • TypeScript 30.8%
  • SCSS 2%
  • CSS 0.8%
  • Other 2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
David Rotermund 89feda4a72 E2E: federation gate suite (eda51a85 at honest scope, 7/7 green) + instance B infrastructure
- specs/federation-gate.test.e2e.ts 7/7: B OIDC discovery+JWKS live
  (ES256 keystore bootstrap), S2S LOCKED envelope, invite-preview
  anchor-required degradation, RP-callback auth-denied envelope,
  admin peers/keys/audit surface (TOFU window), non-admin Restricted
  pin, export wizard mounted, OIDF-leaf-not-mounted pin, A https-gate 500 pin
- compose: FEDERATION_ENABLED/EXPORT_ENABLED on the overleaf service
- instance B (ol-e2e-overleaf-2 :7421, https siteUrl, own mongo/redis)
  stands up the two-instance surface for the wire legs
- full RP dance/S2S/export-bundle legs documented owner-gated (HTTP-only
  instances vs the https-only OIDF layer); Go live tests SKIP per house
  pattern; ebb76488 annotated with the bundle-reachability context
2026-10-12 08:57:35 +00:00
.github Rename server-ce/ -> build-images/ (owner directive 2026-10-06) 2026-10-05 22:30:19 +00:00
.pi/todos E2E: federation gate suite (eda51a85 at honest scope, 7/7 green) + instance B infrastructure 2026-10-12 08:57:35 +00:00
.yarn repair: restore lezer generate.mjs lost in 2026-10-11 rm-rf (plugin contract + lezer 1.8.0 API); board sync (c00741d2 close + evidence, 090296e3 close, 225c3d7e/43a8cb9a/91e4f8a2 owner-note updates, c8d140c0 green-light); progress log: ag-v56 world rebuild + cycle + toolkit .env canonical rebuild 2026-10-12 01:05:10 +00:00
build-images Rename server-ce/ -> build-images/ (owner directive 2026-10-06) 2026-10-05 22:30:19 +00:00
cmd collab: wire AJ-3 presence registry that was unexported+never-wired (NewPresenceRegistry in go/services/collab/presence.go, PresenceRegistry in cmd/collab/main.go); retarget realtime-bus e2e spec to the ygo/presence plane (socket.io bus is retired per owner) incl. B5 drop-on-unload + B6 idle-TTL paths; c10 close-out: remove 3 dead tsconfig.backend.json paths entries (5 dead lib dirs already gone); vendor browser-fs-access@0.38.0 for the svgedit ext-opensave dynamic import (M5 battery fix, gitignore negation); board sync + progress log 2026-10-12 01:40:52 +00:00
develop Rename server-ce/ -> build-images/ (owner directive 2026-10-06) 2026-10-05 22:30:19 +00:00
dockerfiles/cypress Overleaf 6.3.0 + ext feature port — initial state (squashed from 16a93ea66a..89e00733f4) 2026-09-03 20:36:15 +00:00
docs BRANDING: README footer (UB logo + 'supported by the University of Bremen') + OlliTeX logos doc/ -> docs/ollitex-logo/, retire doc/ 2026-10-11 02:22:20 +00:00
frontend repair: restore lezer generate.mjs lost in 2026-10-11 rm-rf (plugin contract + lezer 1.8.0 API); board sync (c00741d2 close + evidence, 090296e3 close, 225c3d7e/43a8cb9a/91e4f8a2 owner-note updates, c8d140c0 green-light); progress log: ag-v56 world rebuild + cycle + toolkit .env canonical rebuild 2026-10-12 01:05:10 +00:00
go collab: wire AJ-3 presence registry that was unexported+never-wired (NewPresenceRegistry in go/services/collab/presence.go, PresenceRegistry in cmd/collab/main.go); retarget realtime-bus e2e spec to the ygo/presence plane (socket.io bus is retired per owner) incl. B5 drop-on-unload + B6 idle-TTL paths; c10 close-out: remove 3 dead tsconfig.backend.json paths entries (5 dead lib dirs already gone); vendor browser-fs-access@0.38.0 for the svgedit ext-opensave dynamic import (M5 battery fix, gitignore negation); board sync + progress log 2026-10-12 01:40:52 +00:00
hooks No analytics (T5) + test-stack config + repo gate plumbing 2026-09-12 12:11:20 +00:00
images a11y R + P doc-meta/blob + rail/hotkeys/md wave fixes (live-verified ag-v28/v30) 2026-10-10 05:34:53 +00:00
junk legacy-infra stage 3+4 closeout: launchpad WebSockets chip re-homed from the retired socket.io 0.9 bus to a plain WebSocket handshake of the live /collab transport (the old probe ReferenceError'd on fresh installs); both dead socket.io script tags removed from the launchpad templates. Stage 4 audit GREEN: zero live socket.io/socketio/OTDocument code in app JS+Go+image+toolkit. 2026-10-09 00:05:56 +00:00
libraries Rename server-ce/ -> build-images/ (owner directive 2026-10-06) 2026-10-05 22:30:19 +00:00
locales AK queue + AJ queue + AG matrix (build #31) — owner defect waves 2026-10-08 2026-10-08 15:41:09 +00:00
public collab: wire AJ-3 presence registry that was unexported+never-wired (NewPresenceRegistry in go/services/collab/presence.go, PresenceRegistry in cmd/collab/main.go); retarget realtime-bus e2e spec to the ygo/presence plane (socket.io bus is retired per owner) incl. B5 drop-on-unload + B6 idle-TTL paths; c10 close-out: remove 3 dead tsconfig.backend.json paths entries (5 dead lib dirs already gone); vendor browser-fs-access@0.38.0 for the svgedit ext-opensave dynamic import (M5 battery fix, gitignore negation); board sync + progress log 2026-10-12 01:40:52 +00:00
references Rename server-ce/ -> build-images/ (owner directive 2026-10-06) 2026-10-05 22:30:19 +00:00
test-results Retire socket.io 0.9 bus end-to-end (owner directive 2026-10-06) 2026-10-06 13:05:36 +00:00
tests E2E: federation gate suite (eda51a85 at honest scope, 7/7 green) + instance B infrastructure 2026-10-12 08:57:35 +00:00
toolkit backup: point dump/restore pipeline at the LIVE containers (ollitex-mongo / ollitex-redis) 2026-10-10 06:02:30 +00:00
tools TeXLive 2026 as the default compile image + images reorg 2026-10-10 02:33:32 +00:00
.editorconfig Overleaf 6.3.0 + ext feature port — initial state (squashed from 16a93ea66a..89e00733f4) 2026-09-03 20:36:15 +00:00
.gitignore collab: wire AJ-3 presence registry that was unexported+never-wired (NewPresenceRegistry in go/services/collab/presence.go, PresenceRegistry in cmd/collab/main.go); retarget realtime-bus e2e spec to the ygo/presence plane (socket.io bus is retired per owner) incl. B5 drop-on-unload + B6 idle-TTL paths; c10 close-out: remove 3 dead tsconfig.backend.json paths entries (5 dead lib dirs already gone); vendor browser-fs-access@0.38.0 for the svgedit ext-opensave dynamic import (M5 battery fix, gitignore negation); board sync + progress log 2026-10-12 01:40:52 +00:00
.pnp.register.mjs Overleaf 6.3.0 + ext feature port — initial state (squashed from 16a93ea66a..89e00733f4) 2026-09-03 20:36:15 +00:00
.yarnrc.yml test(hub): comprehensive /hub frontend integration suite (38 tests, vitest HubFrontend project) 2026-09-07 04:58:37 +00:00
CONTRIBUTING.md Overleaf 6.3.0 + ext feature port — initial state (squashed from 16a93ea66a..89e00733f4) 2026-09-03 20:36:15 +00:00
CREDITS.md git-bridge: reject PATs of suspended users — port upstream token-validity fix 2026-10-11 04:09:51 +00:00
docker-compose.debug.yml Overleaf 6.3.0 + ext feature port — initial state (squashed from 16a93ea66a..89e00733f4) 2026-09-03 20:36:15 +00:00
docker-compose.yml Rename server-ce/ -> build-images/ (owner directive 2026-10-06) 2026-10-05 22:30:19 +00:00
go.mod AK queue + AJ queue + AG matrix (build #31) — owner defect waves 2026-10-08 2026-10-08 15:41:09 +00:00
go.sum AK queue + AJ queue + AG matrix (build #31) — owner defect waves 2026-10-08 2026-10-08 15:41:09 +00:00
GO_CUTOVER_PLAN.md cutover(Phase D): remove the nine Node services — Go is the canonical implementation 2026-09-13 12:17:57 +00:00
GO_SERVICES_INTEGRATION.md services(go): integrate history-v1.go + document-updater.go modules (audited) 2026-09-25 12:41:12 +00:00
IMPROVEMENTS_2026-09-16.md Docs wave: OlliTeX README refresh (+ 'Why OlliTeX?'), wiki plan, prioritized improvements; untrack build temp working docs (owner 2026-09-16) 2026-09-10 21:25:04 +00:00
LICENSE Overleaf 6.3.0 + ext feature port — initial state (squashed from 16a93ea66a..89e00733f4) 2026-09-03 20:36:15 +00:00
Makefile UI K/M + e2e B wave + dark contrast fix (ag-v40): OlliTeX multi-session close-out 2026-10-11 01:12:44 +00:00
OPEN_QUEUE_PROGRESS.md E2E: federation gate suite (eda51a85 at honest scope, 7/7 green) + instance B infrastructure 2026-10-12 08:57:35 +00:00
package.json Rename server-ce/ -> build-images/ (owner directive 2026-10-06) 2026-10-05 22:30:19 +00:00
README.md Readme logo (Try 3) 2026-10-11 16:30:05 +00:00
remember.md remember.md: i18n audit/landed note (owner item 4) + nightly-arc status for morning review 2026-09-29 00:26:54 +00:00
SETTINGS_SERVICE_PLAN.md web-go P3.3: user pages/settings + sessions family to Go (gate 3/3 green) 2026-09-14 12:27:33 +00:00
tsconfig.backend.json collab: wire AJ-3 presence registry that was unexported+never-wired (NewPresenceRegistry in go/services/collab/presence.go, PresenceRegistry in cmd/collab/main.go); retarget realtime-bus e2e spec to the ygo/presence plane (socket.io bus is retired per owner) incl. B5 drop-on-unload + B6 idle-TTL paths; c10 close-out: remove 3 dead tsconfig.backend.json paths entries (5 dead lib dirs already gone); vendor browser-fs-access@0.38.0 for the svgedit ext-opensave dynamic import (M5 battery fix, gitignore negation); board sync + progress log 2026-10-12 01:40:52 +00:00
WEB_GO_PLAN.md plan(P7.5): reflect P7-post item 1 (SQLite config DB) DONE (4 green slices: store/CLI/env→override//hub admin) + pin the reorg 4-7 blocked/gated state (owner decisions: Oracle PRESERVE|RETIRE; rebuild PAUSE|pre-approve) 2026-09-24 09:43:08 +00:00
WEB_GO_STATE.md state: record audit 035 (Wakapi stack, wire contract, client+gate fixes, live E2E) 2026-10-01 02:01:38 +00:00
yarn.lock WakaTime relay + settings hub reorg + editor UI wave (v16-v26) 2026-10-10 02:33:23 +00:00

OlliTeX — real-time collaborative authoring

Why OlliTeX? • Features • Getting started • Contributing • License

OlliTeX

OlliTeX is a free, self-hostable, real-time collaborative authoring platform for LaTeX — and, since 2026, for Typst too.

It is a fork of Overleaf Community Edition (open source, GNU AGPL v3), extended and maintained as a complete product. Overleaf runs a hosted commercial service at www.overleaf.com; OlliTeX contains no subscription, billing, or paid-plan components, and no advertising of premium services — it is a fork, full stop.

Why OlliTeX?

The name is a small piece of etymological wordplay that sits exactly on the two meanings of latex.

Olli — from the Olmec ("Olmeco") civilization of Mesoamerica, the "rubber culture": the people who, around 1500 BCE, first tapped the Hevea rubber tree, vulcanized the sap by mixing it with the juice of Ipomoea alba, and made the legendary bouncing rubber ball of the Mesoamerican ballgame. In Nahuatl the word for rubber is ātlātl — literally "water of the water" (ātl = water), because the milky white sap that oozes from the cut bark looks like water. The Olmecs were, in short, the first latex engineers.

-TeX — from TeX, Donald Knuth's typesetting system, and — by extension — LaTeX (La + TeX), Leslie Lamport's macro layer on top of it. This is the second meaning of "latex": the typesetting macro package, where a few typed symbols render as a full equation.

So OlliTeX = the Olmecs' rubber, meets TeX's precise ink. A document system that behaves like the Olmec ball itself — resilient, stretchy, and capable of springing back after a hard hit — while delivering the accuracy only a real typesetting engine can: rubber typesetting, with a Mesoamerican accent.

And, as a practical wink to every student who has ever watched a 40-page PDF compile: the OlliTeX compile queue does not bounce — it flows, like sap, like water, like ātlātl.

Features

Everything in Overleaf CE (real-time collaborative editing, track changes and comments, sandboxed compiles with TeX Live image selection, template gallery, import/export, Git & GitHub sync, SAML/LDAP/OIDC authentication, advanced administrator tools) plus the OlliTeX-specific stack:

  • Typst as a first-class format — create, edit, and compile Typst documents alongside LaTeX: a dedicated clsi_typst compile service, Typst project templates (blank, article with bibliography, worked example), syntax highlighting and formatting in the source editor.
  • The integrated control hub at /hub — one pane for everything: the user workspace (projects, tags, templates, library, sessions, settings) and the full admin surface (users, projects, active sessions, instance stats, site settings, LLM administration, templates) in a single Mantine-styled console with hash-addressable leaves.
  • Renovated editor — a modern Mantine design-system layer (/editor/:id, dual-run identical to the classic /Project/:id URL), command palette, rail/toolbar redesign, theme tokens.
  • AI features, admin-gated and BYO — LLM-powered chat, inline completion, and compliance review; bring-your-own provider (OpenAI-compatible endpoints, per-user) with per-feature rate limiting (instance rate, daily token budgets) on a single hub page; grammar checking via LanguageTool and/or LLM; an optional self-hosted LanguageTool service.
  • Extended collaboration tools — Zotero integration, Mendeley, reference search & pick, equation editor, symbol palette, TikZ / SVG / Draw.io diagram files, document import (.docx, .md) and export (.docx, .md, .html), WebDAV/Nextcloud sync, Dropbox, sign-up page.
  • Markdown visual editor — .md project files with a block-based visual editor (headings, lists, tables, links, code blocks) beside the CodeMirror 6 code mode, following the editor theme; new files start empty (no LaTeX boilerplate).
  • WakaTime, self-hosted — per-user editing-time tracking relayed to a local Wakapi instance (browser → OlliTeX → local Wakapi; never wakatime.com), admin master switch + per-user keys (rate-limited, 200/1h default); users enable it under My settings → WakaTime.
  • In-browser Python runner — .py files execute through bundled Pyodide (CPython 3.12 / Pyodide 0.29.3) in a browser worker, offline, with an admin package allow-list — no server-side Python.
  • SSO federation — OIDC provider + relying-party flows for cross-OlliTeX-instance identity and project sharing (PKCE + redirect_uri pinned to registered URIs + consent screens), alongside the classic SAML/OIDC/LDAP login slots and the multi-provider manager.
  • Monitoring — self-hosted Grafana (admin-gated same-origin proxy, anonymous access off) + Prometheus with bundled instance-stats alert rules and a token-gated alert webhook relay; the hub's Instance statistics leaf shows the core time series.
  • Operations toolkit — environment-driven configuration (server-ce/config/env.sh + toolkit seed), a central Makefile entry point, an AGPL-compliant rebrand with provenance kept visible (see the local BRANDING.md handoff notes).

Important

Compiles are always sandboxed. OlliTeX enforces the sandboxed (Docker-based) compile runner: every compile — LaTeX and Typst — runs in an isolated compile container, so users can never read or write the server container's filesystem, network, or environment while compiling. The local (in-container) compile path and the local TeX Live installation have been removed from the server image.

  • Default compile image: olpsint/texlive-full:2026.1 — TeX Live 2026, built from the ayaka-notes texlive-full 2026 recipe (credit kept in CREDITS.md); override with the TEXLIVE_IMAGE environment variable, the site-setting (Compilation → Sandboxed compiles), or toolkit/lib/images.env.
  • The server needs access to a Docker socket (or rootless Docker) so the compile containers can start — the same mechanism that runs the Typst compile containers. Mounting the Docker socket is the standard way to run sandboxed compiles; keep the Docker host itself trusted, and note the bundled seccomp profile (embedded in the Go clsitex binary via //go:embed; the profile source is go/services/clsitex/config/seccomp/clsi-profile.json, 179 syscalls incl. faccessat2 for the 2026 toolchain) restricts the compile containers.

Getting started

Build & run

cd server-ce
make all          # builds sharelatex/sharelatex:ext-6.3.0-port (+ TeX Live base image)

The base image Dockerfile builds the sharelatex/sharelatex-base:* image (dependencies + TeX Live) and the application image Dockerfile builds the application image on top. (All image Dockerfiles live under images/, next to the builder images; make all in server-ce/ drives them.) Configuration lives in server-ce/config/env.sh (plus toolkit seeds under toolkit) — one place for site name, URL, auth providers, LLM admin gates, compile images, and so on.

A ready-to-run local deployment (nginx + overleaf + mongo + redis) lives in develop/docker-compose.yml.

Development

  • Central entry point: make help (targets: build, unit, hub, lint, format, ci, selftest, release, deploy-test, image, hooks-install).
  • The production web build is cd services/web && yarn webpack:production — this is the canonical gate. yarn webpack:dev starts the dev server (since 2026-09 the bare yarn webpack warns and runs the production build; previously it was the misnamed dev server — IMPROVEMENTS P0.4).
  • In-repo unit/integration suites: cd services/web && yarn test:unit (Vitest, all projects) or the root make unit.
  • ext_explain.md documents the extension surface (features, settings, module wiring) of the fork.
  • BRANDING.md documents the OlliTeX rebrand and how to swap the logo set (final art belongs in tools/logo/ and the referenced app paths).

Testing

  • End-to-end suite: tests/e2e — a disposable, self-seeding stack (scripts/stack-up.sh → playwright test → scripts/stack-down.sh) covering smoke, admin site settings, LLM/BYO, grammar, keybindings, notifications, Zotero, Typst compiles, and a legacy↔hub parity harness (every removed legacy page is asserted to redirect and its capability to exist on the hub; see tests/e2e/parity/check.mjs).
  • The suite's structure was inspired by the testing practices of Forgejo.

Documentation

The canonical wiki is docs/wiki/ — user guide (hub, editor, Markdown + diagrams, WakaTime, settings), admin guide (users, projects, site settings → integrations/services/storage/compilation, LLM, WakaTime relay, Python runner, instance stats + Grafana, SSO + federation, operations), and installation (Docker, configuration, upgrade, security & sandbox, TeX Live 2026, toolkit). Every page ends with a Verified against: provenance line, and the credential leak guard (no keys, secrets, or personal data in docs or screenshots, ever) is a hard rule — see docs/wiki/installation/04-security-sandbox.md.

  • Wiki — docs/wiki: user guide, admin guide, and installation docs, with auto-generated screenshots. A data-safety gate (link integrity + secret/private-e-mail-domain scan + PNG metadata scan) fails any run where something it should not be in the wiki is in the wiki; the audit receipt is at docs/wiki/AUDIT.md.
    • Regenerate screenshots (needs the e2e stack running): make wiki-shots.
    • Docs-only gate (CI): make wiki-check.
  • Backlog: IMPROVEMENTS_2026-09-16.md (P0 first: admin API authorization pass, then SMTP unblock).
  • Plans (untracked local docs): BRANDING.md, ext_explain.md, TYPST_INTEGRATION_PLAN.md, docs/WIKI_PLAN.md, and the round plans in the repo root (see .gitignore for the list).

Contributing

OlliTeX is a community fork; contributions are welcome. Please read CONTRIBUTING.md, keep the AGPL notices intact, and run make ci before opening a pull request.

Authors

  • The Overleaf Team — Community Edition
  • yu-i-i — Extended CE features; adapted code listed in CREDITS
  • davrot — the 6.3.0 port, the OlliTeX extension stack, and maintenance of this fork

License

The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the LICENSE file.

Copyright (c) Overleaf, 2014-2026.
Copyright (c) @yu-i-i, 2024-2026, for the Extended CE features.
Copyright (c) @davrot, 2025-2026, for the 6.3.0 port and extensions.

Portions of the code are derived from other open-source projects; see CREDITS.


University of Bremen

This project is supported by the University of Bremen.