Branch:
- New "Branch" text field (default: main) stored in gitSyncBranch on
the project. Used for git fetch, symbolic-ref, and push target.
Validated server-side: alphanumeric + / _ . - only, no ..
First-push confirmation:
- When pushFiles is enabled and the user hasn't confirmed for the
current subPath, clicking "Push now" shows an inline warning:
"The <subPath> directory will be completely replaced …"
with "Yes, push and replace" / "Cancel" buttons.
- Confirmation is stored in localStorage keyed by projectId+subPath,
so it's shown again if the subPath is changed.
- Auto-push bypasses the dialog (user already opted in explicitly).
PDF-only replace:
- Already correct with the fetch-first approach: only the specific
file at pdfPath is written; other files in the same directory
(e.g. output/old.pdf) are preserved from the fetched remote state.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two new boolean fields on the project (gitSyncPushFiles, gitSyncPushPdf,
both default true) let users control what gets pushed independently:
- "Push project files" switch — skip all docs/binary files when off
- "Push compiled PDF" switch — grayed out when no pdfPath is set
The push button and auto-push are disabled when both switches would
result in nothing being pushed. Config is stored in MongoDB so settings
persist per-project.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Icon: change rail tab from integration_instructions to merge
- Auto-push on compile: toggle stored in localStorage, watches compile
context; when compiling goes true→false with no error, triggers a push
automatically (including the latest build's PDF if configured)
- PDF destination path: new gitSyncPdfPath field; backend fetches the
compiled PDF from CLSI (buildId + clsiServerId passed from frontend)
and writes it at the configured path in the repo; silently skipped if
no recent compile or field is blank
- Push now always sends current buildId/clsiServerId so PDF is included
without needing a separate save step
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Project files can now be pushed into a subfolder of the target repo
rather than always going to the root. The path is sanitised on the
backend (strips leading/trailing slashes, rejects traversal with ..).
An empty value (default) keeps the existing root behaviour.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a "Git Sync" section in the Integrations rail panel that lets
project owners configure an HTTPS remote URL (with embedded auth token)
and force-push all project files as a single commit.
Backend:
- GitSyncHandler: assembles project docs + binary files into a temp dir,
runs git init/commit/push --force, then cleans up
- GitSyncController: GET/POST /project/:id/git-sync (configure),
POST /project/:id/git-sync/push (trigger)
- Project model: gitRemote field
- Dockerfile: ensures git is present at runtime
- Env flag: OVERLEAF_ENABLE_GIT_SYNC=true (set in k8s manifest)
Frontend:
- GitSyncWidget: URL input + Save + Push Now buttons, success/error feedback
- Integrations panel: shows widget when gitSyncEnabled
- Rail: shows Integrations tab when gitSyncEnabled (was only gitBridgeEnabled)
- i18n: en + fr translations
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Revert "Revert "Adding More Ai Quota Tiers (#32128)" (#32431)"
This reverts commit f0ea19b418da6096c84b42024aea643807347649.
* fix: dont block workbench from users who have access via WF
* fix: simplify workbench access rules and ensure wf premium users can use workbench
GitOrigin-RevId: 7927248eadd906d7f802d55fa5c6bc7df162b141
* feat: adding tiers for free and standard
* feat: updating feature calculation to account for more quota tiers
* feat: rename freeTrialQuota to freeQuota
* feat: add hasAiFreeTier and hasUnlimitedAi to editor, block free tier from using workbench
* fix: updating tests
* fix: updating ordering precedence for quota tiers
* feat: bump unlimited ai fair usage to 300 uses
* fix: update workbench quota usage for unlimited plans
* feat: bump features version for ai quota split
* feat: popover should only show for relevant users on workbench, and adding upgrade notification to ineligible users
GitOrigin-RevId: e3ef38797f267677cad51d7273272623027ca330
* feat: migrate from aiErrorAssist naming for disabling AI features to aiFeatures.enabled to avoid confusion
feat: keep aiErrorAssistant as setting on user object until migration is run
* feat: migrate writefull.enabled unset to instead use promotionSet false
* feat: updating to use quota based system for AI usage
* feat: hide relevant sections of quota system behind split test
* feat: ship onAiFreeTrial instead of free quota amount to project meta
* fix: renaming splitTestEnabledForUser to featureFlagEnabledForUser
* fix: v1_personal should have free trial amount of ai quota
* fix: onAiFreeTrial in projectController should account for anonymous users with no features
* feat: fixing marketing exports for ai quotas
* feat: update features epoch
* feat: move to quota tiers, and map tier to numeric allowance within rateLimiters
GitOrigin-RevId: 17763447965aae5777053b783d2601517bfe6b12
* feat: allow for monthly tl builds experiment
* feat: show correct image when user doesnt have access to current image in compiler settings (#28282)
* adding packer space for extra rolling image
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
GitOrigin-RevId: db909e1a85f36f1567236a2c4d5790b565dda76d
* Rename `suppressGoogleAnalytics` to `suppressAnalytics`
* Add Propensity script
* Add LinkedIn Insight Tag script
* Version the cookie to prevent adding unconsented tracking
* Move tracking loaders to Typescript, insert them in foot_scripts.pug
* Show the cookie-banner when tracking other than GA is set
* Revert `oa` cookie versioning
* Remove `async` from propensity script
* Use shared tracking loader for Hotjar, LinkedIn, and Propensity
* Reusable `insertScript`
* Remove tracking-linkedin
* Test the scripts by adding fake ids
* Revert "Test the scripts by adding fake ids"
This reverts commit 50759bb6b40fd2684d1b967d83dd71e8517c3de9.
GitOrigin-RevId: 2a7b36bfc70ac1fc983f837dd4693a19a385cbc6
* [web] stopOnFirstError=true does not conflict with =false locally
Allow stopOnFirstError to be enabled in the compile from cache and
disabled locally.
Compiles that passed with stopOnFirstError=true will also pass with
stopOnFirstError=false. The inverse does not hold, and we need to
recompile.
* [web] record event when using compile from cache
* [web] record event when falling back to clsi-cache
* [web] make clsi-cache a premium feature
* [k8s] clsi-cache: increase disk size for beta rollout
NOTE: As this is a premium feature and paid servers run in zones c+d, we
do not need to scale up clsi-cache in zone b for now.
* [web] enable full sampling of compile-result-backend events
* [web] fix frontend tests
* [web] be more verbose when determining access to clsi-cache feature
GitOrigin-RevId: 6fd663e16085187876eb225f7f33eeeaf69d2b2a
* Add overleaf assist paywall modal component in storybook
* update img alt
* remove data-action
* rename assistant -> assist
* use css var for blue color
* Open Overleaf assist paywall if in "overleaf-assist-bundle" split-test
* dont use optional planCode
GitOrigin-RevId: 9315ee2350cb7bc804afa720047849c220781686