d67bc77b0e
Build and Deploy Verso / deploy (push) Successful in 7m37s
A project whose root file is a .typ file now compiles straight to PDF with Typst, as a third engine beside Quarto (.qmd) and latexmk (.tex). Dispatch stays purely extension-based. CLSI: - New TypstRunner.js: runs `quarto typst compile <main>.typ output.pdf` (reuses the Typst bundled in Quarto, so no extra binary / Docker change). stderr is merged into output.log. - CompileManager: _isTypstFile + a TypstRunner branch in _getRunner, and TypstRunner added to the isRunning check and stopCompile kill list. - RequestParser: 'typst' added to VALID_COMPILERS. web: - settings.defaults: 'typ' added to validRootDocExtensions and the text extensions (so .typ opens in the editor); 'typst' added to safeCompilers. - output-files: the Quarto/Typst log parser (which already understands Typst `error:`/`warning:` + `┌─ file:line:col` diagnostics) now also handles .typ compiles, so their errors/warnings populate the log tabs. Polish: - New-project menu: "Blank Typst project" + "Example Typst project" in both the main and welcome dropdowns, backed by createBasicProject/createExampleProject flavour 'typst', a new mainbasic.typ template and an example-project-typst presentation (math, an image, a table, lists). - Compiler dropdown gains a "Typst" option (cosmetic; dispatch is by extension). README updated: three compilers side by side, with a Writing-a-Typst-document section. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
174 lines
6.8 KiB
Markdown
174 lines
6.8 KiB
Markdown
# Verso
|
||
|
||
**A collaborative real-time editor for Quarto and LaTeX presentations and documents.**
|
||
|
||
Verso is a fork of [Overleaf](https://github.com/overleaf/overleaf) that adds first-class [Quarto](https://quarto.org) support alongside Overleaf's existing LaTeX toolchain. It keeps Overleaf's real-time collaboration infrastructure and runs **three compilers side by side**, chosen automatically from the root file's extension: `.qmd` builds with Quarto (PDF via Typst, or HTML via RevealJS), `.tex` with `latexmk`/TeX Live, and `.typ` straight through [Typst](https://typst.app). All three coexist on one server.
|
||
|
||
---
|
||
|
||
## Features
|
||
|
||
- **Real-time collaboration** — multiple users editing the same `.qmd` file simultaneously, powered by Overleaf's operational-transformation engine
|
||
- **Three compilers** — `.qmd` builds with Quarto, `.tex` with `latexmk`/TeX Live, and `.typ` with Typst. The runner is chosen by the root file's extension, so Quarto, LaTeX and Typst projects live side by side
|
||
- **Two output formats** — set `format: typst` in the YAML frontmatter for a PDF preview, or `format: revealjs` for an interactive HTML presentation rendered in an iframe
|
||
- **Document outline** — headings (`#`, `##`, `###`) are extracted and shown in the sidebar outline panel
|
||
- **Math, code, tables** — standard Quarto/Pandoc Markdown features all work
|
||
- **Auto-compile** — the preview refreshes automatically 2.5 s after you stop typing
|
||
- **Project history** — full change history inherited from Overleaf
|
||
|
||
## Output formats
|
||
|
||
In the YAML frontmatter of your `.qmd` file:
|
||
|
||
```yaml
|
||
format: typst # → PDF preview via Typst (no LaTeX required)
|
||
format: revealjs # → HTML slideshow preview
|
||
```
|
||
|
||
Typst is bundled with Quarto — no separate installation is needed.
|
||
|
||
## Quick start
|
||
|
||
### With Docker
|
||
|
||
```bash
|
||
docker run -d \
|
||
-p 80:80 \
|
||
-v ~/verso_data:/var/lib/overleaf \
|
||
--name verso \
|
||
registry.alocoq.fr/verso:latest
|
||
```
|
||
|
||
Then open `http://localhost` in your browser. On first run, visit `/launchpad` to create an admin account.
|
||
|
||
### Build from source
|
||
|
||
```bash
|
||
# Build the base image (installs Quarto + TeX Live)
|
||
cd server-ce
|
||
make build-base
|
||
|
||
# Build the application image
|
||
make build-community
|
||
```
|
||
|
||
The two Dockerfiles are:
|
||
|
||
| File | Purpose |
|
||
|------|---------|
|
||
| `server-ce/Dockerfile-base` | Base OS image — installs system deps, Quarto, and a TeX Live (`latexmk`) toolchain |
|
||
| `server-ce/Dockerfile` | Application image — installs Node services, compiles frontend |
|
||
|
||
## Architecture
|
||
|
||
Verso is a microservices monorepo (Yarn workspaces). All services run inside a single container managed by `runit`, with `nginx` as the front router.
|
||
|
||
```
|
||
browser ──→ nginx:80
|
||
├── / ──────────────────→ web:4000 (main app, React UI)
|
||
├── /socket.io ──────────→ real-time:3026 (WebSocket, OT engine)
|
||
└── /project/*/output/* → clsi-nginx:8080 (compiled output files)
|
||
|
||
web → document-updater → Redis pub/sub → real-time → browser
|
||
web → CLSI (quarto render / latexmk / typst) → output files → nginx → browser
|
||
```
|
||
|
||
Key services:
|
||
|
||
| Service | Role |
|
||
|---------|------|
|
||
| `web` | HTTP API, React frontend, auth, project management |
|
||
| `real-time` | WebSocket layer, live cursor and edit sync |
|
||
| `document-updater` | Operational transformation, Redis pub/sub |
|
||
| `clsi` | Compiler — runs `quarto render` (`.qmd`), `latexmk` (`.tex`) or `typst` (`.typ`) and serves output |
|
||
| `docstore` | Document text storage (MongoDB) |
|
||
| `filestore` | Binary file storage (S3 or local) |
|
||
| `project-history` | Change history and version tracking |
|
||
|
||
## Writing a Quarto document
|
||
|
||
Minimal working example (`main.qmd`):
|
||
|
||
```markdown
|
||
---
|
||
title: My Presentation
|
||
author: Your Name
|
||
date: today
|
||
format: revealjs
|
||
---
|
||
|
||
## Slide one
|
||
|
||
Write **Markdown** here.
|
||
|
||
## Mathematics
|
||
|
||
$$\int_0^\infty e^{-x^2}\,dx = \frac{\sqrt{\pi}}{2}$$
|
||
```
|
||
|
||
For PDF output, change `format: revealjs` to `format: typst`.
|
||
|
||
> **Note on display math**: put `$$...$$` on a single line.
|
||
> Multi-line display math blocks can cause YAML parse errors in some Quarto versions.
|
||
|
||
## Writing a LaTeX document
|
||
|
||
LaTeX still works exactly as in Overleaf. A project whose root file is a `.tex`
|
||
file (e.g. `main.tex`) compiles with `latexmk`/TeX Live instead of Quarto — the
|
||
engine is chosen from the root file's extension, no setting required. The
|
||
**Example LaTeX project** in the *New project* menu is a ready-made starting
|
||
point; **Blank LaTeX project** gives you an empty `main.tex`.
|
||
|
||
> The bundled TeX Live is a minimal `scheme-basic` install. Documents needing
|
||
> extra packages may not build out of the box yet — see `server-ce/Dockerfile-base`
|
||
> for how to switch to a fuller TeX Live scheme.
|
||
|
||
## Writing a Typst document
|
||
|
||
A project whose root file is a `.typ` file compiles directly to PDF with
|
||
[Typst](https://typst.app) — fast, modern markup with a real scripting
|
||
language. No extra install is needed: Verso drives the Typst that ships inside
|
||
Quarto (`quarto typst compile`). Use the **Blank Typst project** or **Example
|
||
Typst project** entries in the *New project* menu to get started.
|
||
|
||
## Environment variables
|
||
|
||
Verso inherits all of Overleaf's environment variables (prefixed `OVERLEAF_`).
|
||
The most commonly needed ones:
|
||
|
||
| Variable | Default | Description |
|
||
|----------|---------|-------------|
|
||
| `OVERLEAF_APP_NAME` | `Verso` | Name shown in the UI |
|
||
| `OVERLEAF_MONGO_URL` | `mongodb://mongo/sharelatex` | MongoDB connection string |
|
||
| `OVERLEAF_REDIS_HOST` | `localhost` | Redis host |
|
||
| `OVERLEAF_SITE_URL` | — | Public URL (used in emails) |
|
||
| `OVERLEAF_ADMIN_EMAIL` | — | Email for the first admin account |
|
||
|
||
See the [Overleaf Server documentation](https://github.com/overleaf/overleaf/wiki) for the full list.
|
||
|
||
## Relation to Overleaf
|
||
|
||
Verso is a fork of [Overleaf Community Edition](https://github.com/overleaf/overleaf) with the following changes:
|
||
|
||
- LaTeX/CLSI compiler replaced by Quarto (PDF via Typst, HTML via RevealJS)
|
||
- Default project template changed from `main.tex` to `main.qmd`
|
||
- Document outline parser extended to read Markdown headings
|
||
- Compiler selector in the UI replaced with a single "Quarto" option
|
||
- Brand colours updated to Quarto's palette; name changed from Overleaf to Verso
|
||
- TeX Live removed from the base Docker image; Quarto installed instead
|
||
|
||
All other infrastructure — real-time collaboration, history, auth, file storage, project management — is unchanged from Overleaf.
|
||
|
||
## Contributing
|
||
|
||
Contributions are welcome. Please open an issue or pull request on the [Verso repository](https://git.alocoq.fr/alois/verso).
|
||
|
||
The upstream Overleaf contribution guidelines are in [CONTRIBUTING.md](CONTRIBUTING.md).
|
||
|
||
## License
|
||
|
||
GNU Affero General Public License v3 — see [LICENSE](LICENSE).
|
||
|
||
Copyright © Overleaf, 2014–2025 (original code).
|
||
Verso modifications © Aloïs Coquillard, 2026–present.
|