25722 Commits
Author SHA1 Message Date
ThomasandClaude Opus 4.8 42b29f0107 Support separate header logo images for light and dark themes (#36362)
Server Pro/CE admins can set a custom header logo via OVERLEAF_HEADER_IMAGE_URL,
but the same image is used for both the light and dark navbar themes. A logo
with good contrast on one background can be hard to see on the other (e.g. a
dark logo on the dark dashboard navbar).

Add two optional env vars, OVERLEAF_HEADER_IMAGE_URL_LIGHT and
OVERLEAF_HEADER_IMAGE_URL_DARK, each falling back to OVERLEAF_HEADER_IMAGE_URL
when unset, so existing configurations are unaffected. The light/dark fallback is
resolved server-side and exposed to the frontend as customLogo (light-effective)
and customLogoDark (dark-effective); the two theme-aware navbars (project
dashboard and library) pick between them using the existing overall-theme hook,
so the logo tracks both the user's theme setting and live OS theme changes.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
GitOrigin-RevId: 587a5679c650717cba6251e6d612146f434e8730
2026-09-17 12:05:54 +00:00
ilkin-overleaf b4b12caf48 Merge pull request #36833 from overleaf/ii-workspaces-collection
[web] Create workspaces collection indexes

GitOrigin-RevId: a84d404e660e6c19eb288712bcf020e1ba4a90d0
2026-09-17 12:05:51 +00:00
Antoine Clausse 09c564fbc4 [web] Cleanup plans-2026-phase-1 - phase 5: unused files in pricing pages (#36688)
* Remove unused Pug files related to Pricing

* `make cleanup_unused_locales`

* Remove unused `descriptionMobile`

* `make cleanup_unused_locales`

* Remove dead CSS

* Remove non-EN dead keys

* Remove "ai-assist" dead CSS

* Remove "ai-assist" listeners

* Remove `plans-new-tabs` and related

* Remove dead SCSS variables

* Remove more dead CSS (mobile)

GitOrigin-RevId: 08c452f66fe5b4d5bca4bb8cf2171254f960bc71
2026-09-17 12:05:47 +00:00
Jessica Lawshe 24802e485b Merge pull request #35956 from overleaf/jel-domain-grace-period-notification
[web] Combine grace period and failed verification notififcations on group domains table

GitOrigin-RevId: 0178421af235ee59a9b8c3a521ac1a8e87c744a6
2026-09-17 12:05:34 +00:00
Jessica Lawshe 69b585caf7 Merge pull request #36752 from overleaf/jel-group-sso-email-check
[web] Stop enforcing requested email for group SSO matches linked account

GitOrigin-RevId: 4988ecf76069d531e3aea892d07a134252c30323
2026-09-17 12:05:30 +00:00
roo hutton e6ceb4fec4 Merge pull request #36864 from overleaf/rh-36644-cancel-spinner-fallback
Fix cancellation flow if downgrade upsell plan is not available

GitOrigin-RevId: c34f7f37057d5e0c08cbdd5f8524a7c5f00ae8b4
2026-09-17 12:05:27 +00:00
Eric Mc Sween b19f7fb6ad Merge pull request #36873 from overleaf/em-remove-duplicate-citation-key-helper
Remove inaccurate citation key helper text

GitOrigin-RevId: 91cff6c47f27980910e059084b14809586f5dae4
2026-09-17 12:05:23 +00:00
David 5e615cd261 Merge pull request #36620 from overleaf/copilot/fix-default-trash-view
Default Trash nav item to the current location

GitOrigin-RevId: 939284aecc4a002394430e9e2850125825d599de
2026-09-17 12:05:20 +00:00
John Lees-Miller df5c9fd8ea Merge pull request #36881 from overleaf/jlm-recurly-stripe-payment-heal-review
Heal migrated payment methods before renewal

GitOrigin-RevId: 72e33e73b3ca0b771ff0124e8a59e12118922573
2026-09-17 12:05:09 +00:00
Jessica Lawshe 5523f0a6e9 Merge pull request #36700 from overleaf/tm-institutions-api-timeout-abort-handling
Handle client-side v1 timeouts gracefully in InstitutionsAPI, bump reconfirmation-lapsed timeout to 60s

GitOrigin-RevId: ecb2b61e257fdd41cadb353da3af98fec0cdf617
2026-09-17 12:04:40 +00:00
Jessica Lawshe 700bc74f22 Merge pull request #35969 from overleaf/jel-domains-table-internal-admin
[web] Group domains table for internal admins

GitOrigin-RevId: 8c16a22502e333d9c604b322ba66703f9c17d100
2026-09-17 12:04:34 +00:00
Jessica Lawshe 09cd43eb17 Merge pull request #36011 from overleaf/jel-domain-capture-sales-email
[web] Weekly domain capture digest email

GitOrigin-RevId: 6682d1d7fcbb179615dbc009d2da8266113a3b4b
2026-09-17 12:04:28 +00:00
Andrew Rumble 52f25234cd Merge pull request #36462 from overleaf/lg-security-mongoose
[Security upgrade] bump mongoose to 8.24.1 in web

GitOrigin-RevId: 89373303435aec06c2e1efde1dd54f1d70c4dfe1
2026-09-17 12:04:17 +00:00
David 90be47c5e1 Merge pull request #36649 from overleaf/dp-cleanup-library-feature-flag
Remove the overleaf-library feature flag

GitOrigin-RevId: ebeabd43c9e44dbc2344b4e8e7e5b9095fcc86e0
2026-09-17 12:04:13 +00:00
Domagoj Kriskovic 6c802c03a6 Fix dark-mode white flash when navigating between dashboard and library (#36785)
* Fix dark-mode white flash when navigating between dashboard and library

* Use userSettings object in layout-base.pug

* Move initial theme styles in a new file

* Sanitize data-initial-theme with a generic getInitialTheme helper

* Add getInitialTheme stub

GitOrigin-RevId: 80812093bbf75dc2a6f6f24710324a31a1930265
2026-09-17 12:04:10 +00:00
Malik Glossop 2a489d6517 Merge pull request #35985 from overleaf/mg-history-ot-comments-preserve
HistoryOT - Preserve comments on cut/paste/undo

GitOrigin-RevId: 3c53da9abe599ab80ccc20960a46c6380d597831
2026-09-17 12:03:53 +00:00
Malik Glossop 183c054991 Merge pull request #36411 from overleaf/mg-writefull-countdown
Use shared ceiling time value for writefull paywall countdowns

GitOrigin-RevId: de77dd274028db58d23044e8aaea9cf0ad570037
2026-09-17 12:03:49 +00:00
Malik Glossop 863e33af78 Merge pull request #35982 from overleaf/mg-history-ot-comments
HistoryOT - Fix comments being dropped and crashing on detached ranges

GitOrigin-RevId: 0906a55a51a6fda9ac828efcbe72989573161261
2026-09-17 12:03:46 +00:00
Anna Claire Fields 19d97a75c6 [web] log the failing tag colour in the validation rollout (#36858)
GitOrigin-RevId: 9fa5a7bc380edf85a1b266e10c5add495744619b
2026-09-17 12:03:42 +00:00
Brian Gough 7aa941794e Merge pull request #36860 from overleaf/bg-allow-integer-in-sync-requests
Allow integer values for h and v parameters in proxySyncPdf

GitOrigin-RevId: 66f303a5940f6976dcfe27ebf90da8a9ec24e98a
2026-09-17 12:03:37 +00:00
Jakob Ackermann 9b44fd075b [monorepo] downgrade ranges ids back to strings for now (#36857)
GitOrigin-RevId: 6c85715bc85adc2f641bfd0e9f3bb6a8f2c839c2
2026-09-17 12:03:33 +00:00
Jakob AckermannandThomas Mees e276104da8 Relax split test import schema to allow staging export fields (#36832)
* Relax split test import schema to allow staging export fields

The staging split test export includes fields (variant.active, version.__v,
splitTest.customerIoEnabled) that aren't otherwise written by the app but
are present in Mongo exports. The strict zod schema was rejecting the
import; mark these as optional so a staging export can be imported into a
local dev environment.

* [web] allow split-test import in dev-env and CI

* [web] ensure that the zod schema for split-tests covers all fields

---------

Co-authored-by: Thomas Mees <thomas.mees@overleaf.com>
GitOrigin-RevId: eab633e8498e351a64dc9a9dad85759e80744da0
2026-09-17 12:03:21 +00:00
Thomas 0e7eff712c [web] [b2b] mark selected schemas as non-strict (#36780)
Two of the B2B request schemas flagged in #36577 reject bodies we don't
want to reject:

- POST /manage/groups/:id/settings/sso: the group settings frontend
  spreads the SSO config document it fetched from the GET route back into
  the POST body, so the request carries `_id`, `__v`, `validated`,
  `enabled` and `useSettingsUKAMF` that the handler recomputes or ignores.
- POST /manage/groups/:id/invites: an internal script sends an unsupported
  `expiresAt` alongside the email; the handler only reads `email`.

Swap z.strictObject() for z.object() on both, with a comment on each
explaining why it's deliberately non-strict.

GitOrigin-RevId: 5ff94ded579bdda07efc59d9ceb1d495964a912d
2026-09-17 12:03:15 +00:00
Jimmy Domagala-Tang 8ab6005580 feat: updating userId to nullish and explaining why for reject changes (#36803)
GitOrigin-RevId: 6f7a46893b9ab32d8f726ad6ba928eb4e0175813
2026-09-17 12:03:12 +00:00
Brian Gough 538d04ddb8 Merge pull request #36664 from overleaf/lg-wordcount-sync-resources
[clsi] sync project resources for word count

GitOrigin-RevId: fe96c936e7aba22ab94416a102dcb7e4835e1256
2026-09-17 12:03:09 +00:00
Eric Mc Sween 6590b33321 Merge pull request #36792 from overleaf/em-zod-validation-cleanup
Stop rejecting unrecognized request fields in the Dropbox, GitHub-sync, git-bridge and reference-manager APIs

GitOrigin-RevId: 5efdee90830b2a48172f839da8e59ef938746f65
2026-09-17 12:03:02 +00:00
f671c3dc59 [web] read a linked project file's source from history (#36817)
* [web] read a linked project file's source from history

Behind the `linked-file-from-history` flag, a linked `project_file` import reads
the source out of the source project's latest history snapshot rather than out of
its file tree in mongo, where docs and files are two kinds of thing.

- `ProjectFileAgent` gains `_importFromHistory` alongside the existing
  `_importFromProject`, and the flag picks between them. The snapshot only holds
  what has reached history, so the source project is flushed through
  document-updater and project-history first. A file that is editable is loaded
  eagerly, which applies the edit operations sitting on top of its blob; one that
  is not keeps its hash and is streamed. The file is promisified on the way.
- `History/HistoryOTContentManager.mjs` reads the latest chunk and rolls its
  changes into a snapshot, retrying the read. `History/HistoryBlobStore.mjs` is
  the blob store overleaf-editor-core asks for while loading a file.
- `LinkedFilesController` resolves the flag, including from the referer: the
  import endpoints have no query string of their own. Every agent takes the
  assignment so that the ones that do not read it still pass it along.
- `linked-file-from-history.spec.ts` drives the flag from the editor url, over
  three imports from another project: a file uploaded to the source project and
  then refreshed from it, an edit the source project has only made in its editor,
  and a binary file. Both sources produce the same file, so which one was read is
  asserted in the acceptance tests rather than here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* [saas-e2e] add test coverage for tracked-delete in linked file source

* Apply suggestions from code review

Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>
GitOrigin-RevId: 3907d6d399e4b5315e68bf833663c06bc72f4011
2026-09-17 12:02:47 +00:00
34d57a87f9 Add contextual pointers to the AI assistant in the editor gutter (#36643)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: jessdomanska <87976015+jessdomanska@users.noreply.github.com>
GitOrigin-RevId: 0df858dae9673868f02ca32cea024fe89794b544
2026-09-17 12:02:41 +00:00
Olzhas Askar bb7dfcd588 Merge pull request #36767 from overleaf/oa-express-types
[web] Express req/res/next types

GitOrigin-RevId: 30b4822e2ee55976331d049f8109f7098914973c
2026-09-17 12:02:38 +00:00
Olzhas Askar e9206d2b95 Merge pull request #36312 from overleaf/oa-unhardcode-homepage
[web] Unhardcode homepage

GitOrigin-RevId: 7ae0b66b5db57998ad1bd1988766d45e096620f7
2026-09-17 12:02:34 +00:00
Jimmy Domagala-Tang 1c0bc6c50a [web] Gate labs experiments behind premium compiles (#36339)
* feat: gating labs experiments behind premium compile feature

* feat: move filtering to the labs module, and only propogate experiments that user can opt into on the FE

GitOrigin-RevId: 984aa0339c7dc8d61f0f6830780a599508306d5e
2026-09-17 12:02:23 +00:00
Jessica Lawshe 2c8e2781c7 Merge pull request #35038 from overleaf/th-add-v1-blocked-domain
Add 'passmail' to the list of domains blocked in v1

GitOrigin-RevId: 6c12800d03af0ad838f60a13fcf7d77d321b03c6
2026-09-17 12:02:17 +00:00
Jessica Lawshe 49a00ef0e2 Merge pull request #36310 from overleaf/jel-confirm-existing-email
[web] Check if domain captured by group when showing confirm email UI

GitOrigin-RevId: bb6add82e083497c8036739d877610a47e35ecfd
2026-09-17 12:02:03 +00:00
Jakob Ackermann f62b8525f2 [web] gracefully handle empty relativePath in uppy uploads (#36773)
GitOrigin-RevId: 640094f69cf53ba9f33a5bdc3b6d532547431d01
2026-09-17 12:01:55 +00:00
Olzhas Askar c2cd5d686c Merge pull request #36711 from overleaf/oa-prices
[web] Prices, their versions and helper functions

GitOrigin-RevId: b42f16fe3b083a4872230f2e348b247650d08df8
2026-09-17 12:01:51 +00:00
Domagoj Kriskovic a301363ece Move Library BibTeX export to a server-side endpoint (#36604)
* Move bulk bibtex download to a server-side streaming endpoint

* Wrap download fetch errors in FetchError and parse the error body

* Refactor library references download to use GET request and stream response

* Remove MAX_DOWNLOAD_IDS limit from downloadIdsSchema and related test

* fix merge conflict

GitOrigin-RevId: dee2bae8bfb982cd1b79bbd21c9f1b90e8cff1a4
2026-09-17 12:01:40 +00:00
Tom Wells f0cd4b737f Merge pull request #36725 from overleaf/tw-add-library-docs-button
Add info button with link to docs on the Library page

GitOrigin-RevId: 7e7bc10272e0b5bcb7b1f98c07f493643f2ea92d
2026-09-17 12:01:32 +00:00
Jakob Ackermann 58e2396d91 [web] remove legacy body field for rootDoc_id (#36608)
The migration finished in 2014, there are no more clients using it.

REF: 175dfae085
GitOrigin-RevId: 6fc21e93c5ef34622e9cf6259e7105f3202d66ae
2026-09-17 12:01:26 +00:00
Jakob Ackermann 640a2e1c60 [web] remove unused link=false flag from /user/oauth-unlink (#36566)
GitOrigin-RevId: 5a8af17bf339df62a6cf54d6c372bff4cbe88eb3
2026-09-17 12:01:23 +00:00
Jakob Ackermann 4e80d65efc [ranges-tracker] add legacy orderedRejections field in tracked-changes (#36565)
* [docstore] use more realistic test stubs for ranges

* [monorepo] define ranges schemas in @overleaf/ranges-tracker

* [ranges-tracker] add legacy orderedRejections field in tracked-changes

* [monorepo] resolve @overleaf/ranges-tracker subpath imports in typescript

* [real-time] validate comment thread ids and tracked change id seeds

* [ranges-tracker] require ObjectId ids and tracked change metadata in ranges

* [monorepo] require ObjectId tracked change ids on the accept routes

* [web] use ObjectId comment thread ids in the DocumentController tests

GitOrigin-RevId: 58b20dec311d85b917ef63f9efbe745a265a2de6
2026-09-17 12:01:19 +00:00
ilkin-overleaf 7cfdd0f75a Merge pull request #36230 from overleaf/ii-workspaces-projects-page
Empty states for the project list views

GitOrigin-RevId: 3ce8e327bb675f3c63763e7599396020a4252025
2026-09-17 12:00:54 +00:00
Jimmy Domagala-TangandTim Gibbon baa9cf78d9 Adding 2025 and 2026 incremental compiles options (#35850)
* feat: adding 2025 and 2026 incremental compiles options

* feat: remove dmtcp from compiler list and autoselect checkpointing version with labs inclusion

* feat: updating seccomp profile for checkpointing

* feat: disable non-premium dmtcp compiles, and align checkpoint version detection between clsi and web

* feat: adding in reminder of checkpoint experiment, and using session based split test retrieval

* Increase Packer build.sh timeout from 1h15m to 1h30m as build takes approx 1h

* fix: moving checkpointing check from tag name based to hasCheckpointing flag set as part of allowed_images, and removing uneeded seccomp rule

* feat: move variant/ image selection to CLSI, and have web control only what options to set for a compile. removing uneeded extra variants from webs list of allowed images

* feat: adding compile timer as a query string as well

---------

Co-authored-by: Tim Gibbon <tim.gibbon@overleaf.com>
GitOrigin-RevId: cdbdf76a62dcd5a585925f18d64b6cb9cd6ed373
2026-09-17 12:00:46 +00:00
John Lees-Miller 35271cb33c Merge pull request #36639 from overleaf/jlm-github-sync-distinguish-404s
Distinguish GitHub's repo-lookup 404 from its commit-comparison 404

GitOrigin-RevId: 67cd1d3af1fde553fc200371f5d2ec020c7245fa
2026-09-17 12:00:40 +00:00
David 28fd2f6605 Merge pull request #36675 from overleaf/dp-dark-library-modals
Theme the bibtex import and entry edit modals for dark mode

GitOrigin-RevId: 7aaf69f418844435de3421aa9b48e797b2ba93ef
2026-09-17 12:00:37 +00:00
Antoine ClausseandClaude Opus 5 e2e05b69f1 [web] Add pro-value-framing split test copy (#36628)
* feat(web): add pro-value-framing split test copy

Serve quantified, benefit-led plan differentiators on the plans and
interstitial pages to the `enabled` variant of the `pro-value-framing`
split test, in place of the vague "increased/max AI allowance" and
"10/unlimited collaborators" framing.

The variant changes the bullet set and order as well as the strings, so
it swaps in its own short feature list rather than remapping keys: Pro
leads with "Everything in Standard, plus:", Free gains Error Assist and
"Compile simple projects". The plans page comparison table mirrors the
card wording in its AI allowance row.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test(web): assert plan copy numbers against plan features

Check the quantified claims in the plan copy against the SaaS plan
features: the collaborator limits, and the "24x" compile timeout claims
as the ratio of the paid to the free compileTimeout. The "2x more AI
usage" claim is checked against the allowance tooltips, since the
allowances themselves come from AI_*_QUOTA_GRANT and are not available
in the unit test environment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Remove overly contrasted color in card

* Remove redundant `makeUISettings2026`

* Simplify valueFramingOverrides

* Fix types

* Revert changes to the table, replace `2x_more_ai_usage` to `2x_the_ai_allowance`

* Remove oververbose PlansValueFraming.test.mjs

* Revert "Remove overly contrasted color in card"

This reverts commit 8e83a0c523c4ebfe8a40a04023f1801080d0e412.

* Apply suggestions from code review

GitOrigin-RevId: 25b0736af47a3a32f4e1dd108ab0eb14c1bc13e3
2026-09-17 12:00:26 +00:00
Antoine ClausseandClaude Fable 5 0e510226fa [web] Format paused reactivation date in UTC via shared helper (#36600)
The paused branch of getFormattedRenewalDate formatted the reactivation
date in the viewer's local timezone with a hand-rolled format literal,
while the surrounding dates are UTC. Compute the reactivation date in
UTC and format it with formatPaymentDate.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
GitOrigin-RevId: 1f1679c1988c696c16c78bd11152d6a39a20c4e1
2026-09-17 12:00:22 +00:00
Eric Mc Sween 82539b5842 Merge pull request #36684 from overleaf/em-user-settings-zotero-groups
Stop carrying an _id on reference manager groups in user settings

GitOrigin-RevId: 1ac74d201a3b81b2069215e05b9c84189c42aad6
2026-09-17 12:00:19 +00:00
Lucie GermainandClaude Sonnet 5 57e536de79 [Security Upgrade]: cypress in root workspace (drops unpatched extract-zip) (#36689)
* [security] bump cypress 15.12.0 -> 15.20.1 to drop unpatched extract-zip

extract-zip <=2.0.1 has no patched release (GHSA-jmr9-qjv8-65gv). It was a
transitive dependency of cypress, used only to unpack Cypress's own binary.
Cypress 15.20.1 replaces extract-zip with yauzl directly, so upgrading the
parent removes the vulnerable package entirely.

Also bumps the pinned cypress/included Docker base image used by
test_frontend_ct / server-ce e2e / saas-e2e.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* [security] fix cy.get<T> alias typing broken by cypress 15.20.1

Cypress 15.20.1 adds a dedicated Chainable.get overload for alias strings
(get<S>(alias: `@${string}`): Chainable<S>), which now takes priority over
the generic selector overload. cy.get<HTMLInputElement>('@input') therefore
resolved to Chainable<HTMLInputElement> instead of
Chainable<JQuery<HTMLInputElement>>, so .then(element => element.get(0))
no longer type-checked. Pass the JQuery-wrapped type explicitly to match
the new overload.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
GitOrigin-RevId: f4a56a2d5948b5aaf00a07ecb384fc75abf6de53
2026-09-17 11:59:44 +00:00
Mathias Jakobsen 0dd792b146 Merge pull request #36677 from overleaf/mj-fix-tag-hsl
[web] Allow derived HSL values for tags

GitOrigin-RevId: c9617a8b289e361f3dd438c7d81d8b3c1d5cb645
2026-09-17 11:59:32 +00:00
Rebeka Dekany b5c161eeca [web] Cache Stripe prices and products in StripeClient (#36236)
* Cache Stripe prices and products in StripeClient

* Note the Stripe price cache in the price scripts and dev manual

* Add tests for the Stripe price and product cache

* Simplify the not-found guard in getProductsByIds

GitOrigin-RevId: eb2a270a3abe0e9bf53ca2ebee1f0ad02b1a4cc4
2026-09-17 11:59:29 +00:00