70 Commits

Author SHA1 Message Date
claude 15ffaefb87 fix: install pandoc and enable pandoc conversions
Build and Deploy Verso / deploy (push) Failing after 1h2m54s
Pandoc was not installed in the base image, so the export buttons
(docx, markdown, html, typst) were hidden because ENABLE_PANDOC_CONVERSIONS
defaulted to false.

- Dockerfile-base: add pandoc via apt (Ubuntu Noble ships 3.1.3, which
  supports --to typst added in pandoc 3.0)
- env.sh: set ENABLE_PANDOC_CONVERSIONS=true so both the web and CLSI
  services expose and serve the export endpoints

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 08:46:09 +00:00
claude 8b6b76c2fa fix: install inkscape after pip to avoid apt/pip numpy conflict
Build and Deploy Verso / deploy (push) Successful in 1m12s
inkscape's apt dependencies include python3-numpy, which pip can't
uninstall (no RECORD file). Moving inkscape to its own RUN layer after
the pip installs avoids the conflict: pip numpy lands in /usr/local/lib
first, then apt installs its numpy into /usr/lib alongside it, and
Python resolves /usr/local/lib first at import time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 12:49:08 +00:00
claude 4285d8d74c fix: add --ignore-installed so pip can coexist with inkscape's apt numpy
Build and Deploy Verso / deploy (push) Successful in 1m8s
inkscape pulls in python3-numpy 1.26.4 via apt; pip can't uninstall apt
packages (no RECORD file). --ignore-installed makes pip install its own
copy into /usr/local/lib without touching the apt version; /usr/local/lib
takes import precedence so runtime code gets the pip-managed numpy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 11:12:11 +00:00
claude d8ce7f9dc1 feat: support svg package — install Inkscape and enable shell-escape
Build and Deploy Verso / deploy (push) Has been cancelled
The LaTeX svg package converts .svg files to PDF at compile time by
shelling out to Inkscape (requires --shell-escape). Without Inkscape in
the image and the flag enabled, compilation fails with "Did you run the
export with Inkscape?".

- Dockerfile-base: add inkscape to the apt install block
- settings.js: expose OVERLEAF_LATEX_SHELL_ESCAPE env var → clsi.latexShellEscape
- LatexRunner.js: pass -shell-escape to latexmk when the setting is on
- deploy-verso-prod.yml: set OVERLEAF_LATEX_SHELL_ESCAPE=true (trusted-user instance)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 10:57:56 +00:00
claude 5796c0157c Install official Typst binary and use it for .typ compilation
Build and Deploy Verso / deploy (push) Has been cancelled
Quarto bundles a modified Typst fork that lacks --synctex, making
bidirectional sync impossible. Install the official Typst binary
(v0.13.1) from upstream and use it in TypstRunner instead.

This also means .typ projects now use the unmodified Typst compiler,
which is correct since TypstRunner handles plain .typ files (not .qmd).
QuartoRunner continues to use Quarto's bundled Typst internally.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 08:40:48 +00:00
claude 9079b545f7 Switch TeX Live from scheme-basic to scheme-full
Build and Deploy Verso / deploy (push) Successful in 50m16s
Replaces the minimal scheme-basic install (plus explicit latexmk,
texcount, synctex additions) with scheme-full, giving users access
to the complete LaTeX package ecosystem without manual tlmgr installs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 20:55:06 +00:00
claude eb45ececf0 Install synctex binary via tlmgr for SyncTeX support
Build and Deploy Verso / deploy (push) Has been cancelled
The synctex binary was not included in scheme-basic and was not
explicitly installed, causing `spawn synctex ENOENT` on every
sync request. Add it alongside latexmk and texcount.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 20:53:28 +00:00
claude 83b6b323c3 Add cv2/tqdm to base; implement per-project Python venvs (Design B, Phase 1)
Build and Deploy Verso / deploy (push) Successful in 17m0s
Base image: add opencv-python-headless (cv2) and tqdm to the bundled
scientific stack, and python3-venv (needed to build per-project venvs).

Per-project dependencies: a project's requirements.txt is now installed into a
venv cached by its sha256 (python3 -m venv --system-site-packages, so the
bundled stack stays visible and only extra packages are installed); QuartoRunner
points Quarto at it via QUARTO_PYTHON. A per-hash flock serialises concurrent
builds; pip output is merged into output.log; on failure the render falls back
to the base interpreter. Venvs live under PYTHON_VENVS_DIR
(default /var/lib/overleaf/data/python-venvs).

Gating: PythonVenvGate.userCanInstallPython restricts installs to the project
owner + invited collaborators (ignorePublicAccess excludes anonymous/link
users), threaded to CLSI as allowPythonInstall on the editor compile,
presentation export, and publish paths. Behind OVERLEAF_ENABLE_PROJECT_PYTHON_VENV
(enabled in the deployment). Design doc updated; Phase 2 (egress policy) and
Phase 3 (venv eviction) remain.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 13:14:47 +00:00
claude 654cd7db9f Fix Quarto Jupyter engine: install PyYAML
Build and Deploy Verso / deploy (push) Has been cancelled
Quarto's own jupyter wrapper (/opt/quarto/share/jupyter/jupyter.py ->
notebook.py) does 'from yaml import safe_load', so executing a {python} cell
failed with ModuleNotFoundError: No module named 'yaml'. The minimal jupyter
stack didn't pull PyYAML in (psutil/ipython already come via ipykernel), so
add pyyaml explicitly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 11:39:48 +00:00
claude f1d827202f Bundle the scientific-Python stack in the base image
Pre-install numpy, pandas, scipy, matplotlib, seaborn, scikit-learn, sympy,
plotly and tabulate so the common data-science libraries are available to
Quarto's Python code cells out of the box. matplotlib uses the headless Agg
backend automatically in the compile environment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 11:25:18 +00:00
claude 8691907210 Enable Python code execution in Quarto documents (install Jupyter)
Build and Deploy Verso / deploy (push) Successful in 14m1s
Quarto executes ```{python}``` cells via a Jupyter kernel, but the base image
had no Jupyter ('Jupyter: (None)') and the runtime user (www-data) couldn't
create Quarto's log dir or Jupyter's runtime dir ('Permission denied: mkdir
/var/www/.local/...').

Install the headless Jupyter execution stack (jupyter-client, nbclient,
nbformat, ipykernel) for the system python3 Quarto uses, and register a
system-wide python3 kernelspec under /usr/local/share/jupyter. Also make
/var/www/.local writable by www-data so Quarto/Jupyter can write their
runtime/log files (mirrors the existing /var/www/.cache setup).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 11:20:22 +00:00
claude c38e2b8b49 Presentation download menu: standalone HTML + faithful slide PDF (decktape)
Build and Deploy Verso / deploy (push) Failing after 24m2s
In RevealJS mode the download button becomes a 2-choice menu:

- Standalone HTML: a one-off compile with embed-resources (chalkboard and other
  runtime-only plugins are dropped, since they don't survive self-containment),
  yielding a single portable .html.
- Slide PDF: render the deck, then print it with decktape (headless Chromium)
  to a faithful one-slide-per-page PDF.

Implementation:
- Dockerfile-base: install decktape + headless Chromium (open-source; deps via
  playwright install-deps for Ubuntu-Noble correctness). Base-only change.
- QuartoRunner honours options.exportMode ('html-standalone' | 'pdf-slides');
  exportMode is threaded web ClsiManager -> CLSI RequestParser -> CompileManager
  -> runner.
- New GET /project/:id/presentation-export/:format compiles in the matching
  export mode and streams the result as a download (PresentationExportController,
  reusing ClsiManager.getOutputFileStream).
- pdf-hybrid-download-button shows the dropdown when the output is output.html;
  PDF/LaTeX projects keep the single download button.
- i18n: download_as_standalone_html / download_as_pdf_slides (en + fr +
  extracted-translations.json).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 21:00:50 +00:00
claude 5f761c1772 Use minimal scheme-basic TeX Live install (small, fast, reversible)
Build and Deploy Verso / deploy (push) Has been cancelled
Reverts the heavy multi-collection texlive install back toward the
original upstream-Overleaf approach: install-tl with scheme-basic
(~300 MB) plus latexmk and texcount via tlmgr, no docfiles/srcfiles.
This restores the fast, small base image we had before LaTeX support
was added in full.

Tradeoff: documents needing tikz/beamer/siunitx/extra fonts won't
compile out of the box for now — those should stay in Quarto/Typst
until the project is mature enough to justify a full TeX Live.

Made deliberately easy to reverse: a header comment documents that
switching scheme-basic -> scheme-full (one line) restores the complete
toolchain, or individual packages can be appended to the tlmgr list.
Uses TEXDIR=/usr/local/texlive (unversioned) so PATH stays stable
across TeX Live releases.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 08:01:07 +00:00
claude 4800a51957 Use a curated TeX Live set instead of near-full to speed up builds
Build and Deploy Verso / deploy (push) Successful in 14m42s
The previous install expanded texlive-full (minus -doc/-lang-), pulling in
essentially every CTAN package plus inkscape's large GTK GUI tree — ~20 min
and several GB. Replace it with a curated set of meta-packages that covers
the vast majority of documents: latex base/recommended/extra, recommended
fonts, plain-generic, science (math/physics), xetex, luatex, bibtex-extra,
extra-utils (texcount), plus latexmk/biber/chktex/pygments.

Smaller and faster to build. Documents needing an omitted package can have
the relevant texlive-* collection added back. Drops inkscape (only used for
auto SVG->PDF conversion) to avoid its heavy GUI dependency chain.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 21:52:56 +00:00
claude 3bb293f7a7 Fix TeX Live install: texcount is not a standalone package
Build and Deploy Verso / deploy (push) Has been cancelled
The base image build failed with "E: Unable to locate package texcount".
texcount ships inside texlive-extra-utils, not as its own apt package.
Replace the bogus texcount entry with texlive-extra-utils (which provides
both texcount and latexmk). latexmk is kept explicit for clarity.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 19:54:51 +00:00
claude 422ac30e6c Support LaTeX and Quarto compilation in parallel
Build and Deploy Verso / deploy (push) Has been cancelled
Verso now compiles both .tex (latexmk) and .qmd (Quarto) projects,
dispatching by the root file's extension rather than replacing one with
the other. LaTeX and Quarto projects can coexist on the same server.

CompileManager: re-import LatexRunner and add a _getRunner() dispatcher
  that returns a uniform {run, isRunning, kill} interface. .qmd/.md/.Rmd
  → QuartoRunner; everything else (.tex/.ltx/.Rtex/.Rnw) → LatexRunner.
  stopCompile now checks/kills both runners since it has no root path.

compiler-setting.tsx: restore the LaTeX engine choices (pdfLaTeX, LaTeX,
  XeLaTeX, LuaLaTeX) alongside Quarto. The dropdown still controls which
  TeX engine latexmk uses; actual engine dispatch is by file extension.

Dockerfile-base: reinstall TeX Live alongside Quarto (texlive-full minus
  -doc/-lang- packages, plus xetex/luatex/biber/latexmk/texcount/chktex/
  synctex). Restore TEXMFVAR for a writable LuaTeX cache. This brings back
  a large image, which is the accepted cost of full LaTeX+Quarto support.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 19:27:39 +00:00
claude a241e2c201 Pre-install popular Quarto extensions in the Docker image
Build and Deploy Verso / deploy (push) Successful in 11m22s
Dockerfile-base: after Quarto is installed, run 'quarto add --no-prompt'
  for a curated set of extensions into /opt/quarto-extensions/. Quarto
  writes _extensions/<author>/<name>/ in the working dir, giving us a
  clean shared store. Extensions included:
    - igorlima/charged-ieee      — IEEE paper format (Typst)
    - quarto-ext/fontawesome     — Font Awesome icons
    - quarto-ext/attribution     — attribution footer on RevealJS slides
    - quarto-ext/pointer         — laser pointer for presentations
    - quarto-ext/drop            — drop-down overlay for RevealJS
  Adding more: one extra '&& quarto add --no-prompt <author>/<repo>' line.

QuartoRunner: before quarto render, merge /opt/quarto-extensions/_extensions/
  into the compile dir's _extensions/ with 'cp -rn' (no-clobber). This
  makes all pre-installed extensions available to every project without
  any user action. Project-uploaded _extensions/ files take precedence
  since cp -n never overwrites existing files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 16:54:56 +00:00
claude b2b2ed13aa Fix Quarto cache permission: create /var/www/.cache/quarto for www-data
Build and Deploy Verso / deploy (push) Successful in 10m56s
Quarto resolves its cache dir as $HOME/.cache/quarto. The process runs
as www-data (home=/var/www) but that directory is root-owned, so Quarto
crashed immediately with PermissionDenied on mkdir. Pre-create the cache
dir and chown it to www-data at image build time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 13:39:02 +00:00
claude 0323fd4813 Fix Quarto compile pipeline: install, logs, template, draft mode
Build and Deploy Verso / deploy (push) Successful in 10m58s
Dockerfile-base: remove TeX Live (no longer needed), install Quarto
  1.6.39 which bundles Typst for PDF output. This was the root cause
  of all compile failures — the server-ce monolith never had Quarto.

QuartoRunner: run quarto via /bin/sh so stderr is merged into stdout
  with 2>&1; write combined output to output.log (not output.stdout)
  so the PDF-preview log panel picks it up and shows raw output.
  Also write the log on error so failures are always visible.

CompileManager: guard DraftModeManager behind an isLatexFile check —
  injecting LaTeX preamble commands into a .qmd file corrupts it and
  causes a guaranteed compile failure when draft mode is requested.

ProjectCreationHandler + mainbasic.qmd: new projects now create
  main.qmd with a minimal Quarto/Typst frontmatter instead of the
  LaTeX main.tex; _createRootDoc names the file main.qmd accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 12:59:43 +00:00
Miguel Serrano 496f110465 [CE] Update phusion image version to 1.0.3 (#33885)
GitOrigin-RevId: cc707258e145849f3bc1ddb6b44f7eca8c904d74
2026-05-22 08:06:15 +00:00
Jakob Ackermann 44efc9d745 [monorepo] avoid corepack network requests (#33502)
* [monorepo] avoid corepack network requests

- Download yarn via corepack as the first step in all the docker files
- Turn off networking in corepack
- Do not run things in the upstream node image
  Instead, use the monorepo image, or base layer in all the services.
- Always build the base layer when running tests (uses cache)

* [monorepo] install corepack in shared place

* [clsi-lb] remove unrelated changes

* [web] add missing DC_RUN_FLAGS

* [monorepo] only rebuild test images locally

Also remove spurious build config in docker-compose.ci.yml.

* [server-ce] test: make yarn files available to host-admin and e2e

* [monorepo] put the corepack install snippet in a few more places

GitOrigin-RevId: 38005016ae5a708e12295e246269d6c18fece937
2026-05-08 08:08:57 +00:00
Anna Claire Fields 0d64a88a46 Yarn 4 Migration (#32253)
Migrates the Overleaf monorepo package manager from npm (v11) to Yarn 4 (v4.9.1) using node-modules linker mode.

GitOrigin-RevId: 50d32ab01955c15e29679eff9e9e9cfb897fab2d
2026-04-28 08:52:37 +00:00
Miguel Serrano f4dd04e110 [filestore] add pdftocairo conversion option (#31627)
Includes patches for Server Pro/CE 5.x and 6.x

GitOrigin-RevId: 67e387c96421b681339dbc1d89a8af0c34a163ef
2026-02-23 09:04:55 +00:00
Miguel Serrano 74724d04be [CE/SP] Force rebuild of Base Image (#30723)
Forces a rebuild of the CE/SP base image, updating
OS dependencies and installing the latest version of node.

GitOrigin-RevId: a172b7cf1b19e303ea19d4392ee43f7043bb96ad
2026-01-14 10:18:11 +00:00
Miguel Serrano c12fe12b13 [CE/SP] Force rebuild of base image (#30400)
GitOrigin-RevId: 32e8b96e8ed74bf7f51e52058cd71ca7636d8f50
2025-12-17 09:23:48 +00:00
Miguel Serrano bfed1ac2ae [CE/SP] Rebuild base image (#29422)
GitOrigin-RevId: fa9ec39481a766ce3fa0f58c5f7db6267d23659c
2025-10-30 11:35:47 +00:00
Miguel Serrano a0ad073785 Merge pull request #29265 from overleaf/msm-bump-dockerfilebase
[SP] Rebuild `Dockerfile-base`

GitOrigin-RevId: c7f320b3a842a5c72a8c81617e30f1c3deeddb8c
2025-10-23 08:05:34 +00:00
Miguel Serrano dc1203e2bd [CE/SP] Rebuild base image (#28727)
Update epoch ENV to trigger a rebuild

GitOrigin-RevId: 5c46547cc1699e3ad916477107a7c035984ac423
2025-09-29 08:06:32 +00:00
Miguel Serrano ecdd0c54bd [CE/SP] Update base image to noble-1.0.2 and node@22 (#25716)
* [CE/SP] Update base image to node:22

Also triggers a rebuild of the image to ensure all dependencies are up to date

* Bump phusion image to noble-1.0.2

GitOrigin-RevId: 8dce9d3cc6e8df28fce7a15f2727e7bc4aa453fd
2025-05-19 12:27:23 +00:00
Miguel Serrano b44dd4d3c5 Merge pull request #24558 from overleaf/msm-ce-rebuild-dockerfile
[CE] Rebuild Dockerfile-base

GitOrigin-RevId: 7fca7fc64a709f7d5d4eccb4b7f9586a78769803
2025-03-27 14:16:17 +00:00
Miguel Serrano 9470c3a44b Merge pull request #23790 from overleaf/msm-base-image-update
[CE] Trigger CE `Dockerfile-base` build

GitOrigin-RevId: b96b8b2d612b5b0a4079b9fafd6cf3c071c6ab8d
2025-03-13 09:05:35 +00:00
Miguel Serrano 623d88bee0 Merge pull request #21943 from overleaf/msm-ce-sp-noble
[CE/SP] Update phusion image to Noble (24.04)

GitOrigin-RevId: 6ff220210f9b40b5e68379dcaaf4bf97b20dd813
2024-11-21 09:03:28 +00:00
Alf Eaton b617266c6d Merge pull request #21916 from overleaf/ae-spelling-cleanup
Spelling service cleanup

GitOrigin-RevId: 429071c6ad3cf55ae3cc6688cd1216ea7e9108fb
2024-11-19 09:05:00 +00:00
Andrew Rumble 73b17dd694 Merge pull request #21627 from overleaf/ar-node-20
[all] node 20 upgrade v2

GitOrigin-RevId: aed13a800894717a796062e3dd4050e045040258
2024-11-15 09:04:32 +00:00
Andrew Rumble 79d80cc266 Merge pull request #21462 from overleaf/revert-18828-ac-node-20
Revert "Upgrade Node from `18.20.2` to `20.17.0`"

GitOrigin-RevId: cc12c33b4588caa2959817a113547d20d437d6f4
2024-10-30 09:05:07 +00:00
Andrew Rumble a480df8a89 Merge pull request #18828 from overleaf/ac-node-20
Upgrade Node from `18.20.2` to `20.17.0`

GitOrigin-RevId: 0ba9b0921fc246a97d3da0aad7d48635c0e24ae8
2024-10-30 09:04:38 +00:00
Miguel Serrano 8d9f186331 Merge pull request #21073 from overleaf/msm-trigger-ce-base-image-build
[CE/SP] Trigger base image rebuild

GitOrigin-RevId: 747ebd47f8e99abceb6715ed03533a19f50b5970
2024-10-16 08:05:14 +00:00
Jakob Ackermann 399e834e36 Merge pull request #19764 from overleaf/jpa-server-pro-cache
[server-pro] faster local build

GitOrigin-RevId: d71abde37253e4c0398afa6935290af79a1204be
2024-08-07 08:04:24 +00:00
Miguel Serrano adea768485 Merge pull request #19338 from overleaf/msm-ce-update-base-image-node
[CE] Update base image (node 18.20.4 upgrade)

GitOrigin-RevId: bfeaa266632d62471ceb075aecf24e39375744ba
2024-07-15 09:32:46 +00:00
Jakob Ackermann 0b6a8dc093 Merge pull request #19160 from overleaf/jpa-jammy-1-0-4
[server-ce] bump base image to jammy-1.0.4

GitOrigin-RevId: 79cc27e4c628e50fb226a32278be1768001f343b
2024-06-26 11:12:47 +00:00
Jakob Ackermann b6093848af Merge pull request #18341 from overleaf/jpa-upgrade-ce-base
[server-ce] upgrade base image

GitOrigin-RevId: a6fcb422f5bbe15221ea9b16942e290f7772d973
2024-05-15 08:05:07 +00:00
Jakob Ackermann 5b6e229c21 Merge pull request #17798 from overleaf/msm-ce-sp-hotfix-5-0-2
[CE/SP] Hotfix 5.0.2 / 4.2.4

GitOrigin-RevId: 2f9ce416b95a0124edb1a9cf35c2dfa94f6f4a19
2024-04-23 08:04:33 +00:00
Miguel Serrano 1b93f97468 [CE] update base image to phusion/baseimage:jammy-1.0.1 (#17119)
* [CE] update base image to phusion/baseimage:jammy-1.0.2

* Add python-is-python3 to CE base image

* Added unattended-upgrades install

GitOrigin-RevId: 55971caf10d5d519004ba21e38efac4a9c1b7546
2024-02-20 09:06:11 +00:00
Jakob Ackermann 6d98d6a7c0 Merge pull request #16923 from overleaf/jpa-server-pro-fs-rebranding
[server-pro] remove ShareLaTeX branding from filesystem

GitOrigin-RevId: c1d2c63bdc888d81e03bb1721e44b6ed6f64524b
2024-02-12 09:03:39 +00:00
Miguel Serrano dbf8e6c6ef Merge pull request #15574 from overleaf/mj-docker-base-node
[server-ce/server-pro] Update node installation method

GitOrigin-RevId: dca1608f40bcbc6fdb248d5776e45902b3e17364
2023-11-03 09:00:36 +00:00
Brian Gough 337174e2c3 Merge pull request #15068 from overleaf/bg-server-pro-add-xetex
add xetex to the base image for CE/SP

GitOrigin-RevId: 2967872957d0def48071ee66293a029e1b91e60a
2023-10-06 08:04:21 +00:00
Jakob Ackermann be19db03b4 Merge pull request #14281 from overleaf/jpa-server-pro-node-18
[server-ce] upgrade Node.js for Server Pro/CE to version 18

GitOrigin-RevId: 76dc29b36e19ade7e5ccb5ff482900af03400a59
2023-08-14 08:05:40 +00:00
Miguel Serrano 19c625d945 Merge pull request #13106 from overleaf/revert-12642-msm-ce-update-node
Revert "Update CE/SP to Node 18"

GitOrigin-RevId: 37f3713432c8a7ae5b9597970768b0770f9d402b
2023-05-17 08:05:44 +00:00
Miguel Serrano 959e6a73d8 Merge pull request #12953 from overleaf/msm-etoolbox-texlive
[CE] Install `etoolbox` in base image

GitOrigin-RevId: c0beef92e8d1b73938f28ae4ed21c470f27b327e
2023-05-05 08:05:43 +00:00
Miguel Serrano 3f85b8732f Merge pull request #12642 from overleaf/msm-ce-update-node
Update CE/SP to Node 18

GitOrigin-RevId: 748ab26c1544eadf528c7f453391c04b56be4f7f
2023-04-20 08:03:46 +00:00