Two build-speed changes to the Gitea Actions deploy workflow. (#1) Build the base image only when it changes. The base layers' only repo input is server-ce/Dockerfile-base, so the prepare step hashes that file and the base is tagged verso-base:base-<hash>; the app builds FROM that exact tag. If a base with the current hash already exists in the registry, the heavy base build (apt ~111s, TeX Live ~51s, Quarto, plus its ~49s export/push) is skipped entirely — which is every commit that doesn't touch Dockerfile-base. (#2) Import/export a registry-backed layer cache (verso-cache:base and verso-cache:app, mode=max) on both builds. Unchanged layers are reused instead of rebuilt: yarn install is skipped when package.json is unchanged, and only the web compile re-runs on a frontend source change. No new cluster resources — the cache lives as extra tags in the same in-cluster registry. First run after this is still a full build (populates the caches and the hash-tagged base); subsequent commits should be substantially faster. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Verso
A collaborative real-time editor for Quarto presentations and documents.
Verso is a fork of Overleaf adapted to compile Quarto documents instead of LaTeX. It keeps Overleaf's real-time collaboration infrastructure while replacing the LaTeX/CLSI compiler with Quarto, enabling collaborative editing of .qmd files with instant PDF (via Typst) or HTML (RevealJS) preview.
Features
- Real-time collaboration — multiple users editing the same
.qmdfile simultaneously, powered by Overleaf's operational-transformation engine - Quarto compilation — documents are compiled with Quarto on every save
- Two output formats — set
format: typstin the YAML frontmatter for a PDF preview, orformat: revealjsfor 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:
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
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
# Build the base image (installs Quarto)
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 and Quarto |
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) → 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 |
Quarto compiler — runs quarto render 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):
---
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.
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 for the full list.
Relation to Overleaf
Verso is a fork of Overleaf Community Edition with the following changes:
- LaTeX/CLSI compiler replaced by Quarto (PDF via Typst, HTML via RevealJS)
- Default project template changed from
main.textomain.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.
The upstream Overleaf contribution guidelines are in CONTRIBUTING.md.
License
GNU Affero General Public License v3 — see LICENSE.
Copyright © Overleaf, 2014–2025 (original code).
Verso modifications © Aloïs Coquillard, 2026–present.